summaryrefslogtreecommitdiffstats
path: root/Lib/packaging
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2011-07-29 00:31:39 (GMT)
committerÉric Araujo <merwok@netwok.org>2011-07-29 00:31:39 (GMT)
commit943006bf68825ea007a1941f8afb09d202868988 (patch)
treef7d101eead53c8d2b69f10210fdafe798d4fc6d1 /Lib/packaging
parent73c175f5a0a7e749357e74f518c89b716b7e34b2 (diff)
downloadcpython-943006bf68825ea007a1941f8afb09d202868988.zip
cpython-943006bf68825ea007a1941f8afb09d202868988.tar.gz
cpython-943006bf68825ea007a1941f8afb09d202868988.tar.bz2
Let all pysetup actions return a meaningful 0 or 1 exit code (#12222).
This will help scripts calling pysetup know if a command failed. Printing/logging was also made more consistent, and a few things were cleaned up. In particular, the error/Ctrl-C handling was moved from the _run function up to the main function. The run action is not fixed yet; it returns the dist.Distribution instance, which is needed by test_uninstall and not trivial to fix.
Diffstat (limited to 'Lib/packaging')
-rw-r--r--Lib/packaging/run.py66
1 files changed, 34 insertions, 32 deletions
diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py
index bcc3c21..8e117ed 100644
--- a/Lib/packaging/run.py
+++ b/Lib/packaging/run.py
@@ -214,7 +214,7 @@ def _create(distpatcher, args, **kw):
@action_help(generate_usage)
def _generate(distpatcher, args, **kw):
generate_setup_py()
- print('The setup.py was generated')
+ logger.info('The setup.py was generated')
@action_help(graph_usage)
@@ -222,7 +222,8 @@ def _graph(dispatcher, args, **kw):
name = args[1]
dist = get_distribution(name, use_egg_info=True)
if dist is None:
- print('Distribution not found.')
+ logger.warning('Distribution not found.')
+ return 1
else:
dists = get_distributions(use_egg_info=True)
graph = generate_graph(dists)
@@ -234,8 +235,7 @@ def _install(dispatcher, args, **kw):
# first check if we are in a source directory
if len(args) < 2:
# are we inside a project dir?
- listing = os.listdir(os.getcwd())
- if 'setup.py' in listing or 'setup.cfg' in listing:
+ if os.path.isfile('setup.cfg') or os.path.isfile('setup.py'):
args.insert(1, os.getcwd())
else:
logger.warning('No project to install.')
@@ -244,16 +244,10 @@ def _install(dispatcher, args, **kw):
target = args[1]
# installing from a source dir or archive file?
if os.path.isdir(target) or _is_archive_file(target):
- if install_local_project(target):
- return 0
- else:
- return 1
+ return not install_local_project(target)
else:
# download from PyPI
- if install(target):
- return 0
- else:
- return 1
+ return not install(target)
@action_help(metadata_usage)
@@ -263,12 +257,15 @@ def _metadata(dispatcher, args, **kw):
name = opts['args'][0]
dist = get_distribution(name, use_egg_info=True)
if dist is None:
- logger.warning('%s not installed', name)
- return
- else:
+ logger.warning('%r not installed', name)
+ return 1
+ elif os.path.isfile('setup.cfg'):
logger.info('searching local dir for metadata')
- dist = Distribution()
+ dist = Distribution() # XXX use config module
dist.parse_config_files()
+ else:
+ logger.warning('no argument given and no local setup.cfg found')
+ return 1
metadata = dist.metadata
@@ -299,11 +296,15 @@ def _remove(distpatcher, args, **kw):
else:
auto_confirm = False
+ retcode = 0
for dist in set(opts['args']):
try:
remove(dist, auto_confirm=auto_confirm)
except PackagingError:
- logger.warning('%s not installed', dist)
+ logger.warning('%r not installed', dist)
+ retcode = 1
+
+ return retcode
@action_help(run_usage)
@@ -339,14 +340,8 @@ def _run(dispatcher, args, **kw):
# XXX still need to be extracted from Distribution
dist.parse_config_files()
- try:
- for cmd in dispatcher.commands:
- dist.run_command(cmd, dispatcher.command_options[cmd])
-
- except KeyboardInterrupt:
- raise SystemExit("interrupted")
- except (IOError, os.error, PackagingError, CCompilerError) as msg:
- raise SystemExit("error: " + str(msg))
+ for cmd in dispatcher.commands:
+ dist.run_command(cmd, dispatcher.command_options[cmd])
# XXX this is crappy
return dist
@@ -360,23 +355,22 @@ def _list(dispatcher, args, **kw):
results = dists
listall = True
else:
- results = [d for d in dists if d.name.lower() in opts['args']]
+ results = (d for d in dists if d.name.lower() in opts['args'])
listall = False
number = 0
for dist in results:
- print('%s %s at %s' % (dist.name, dist.metadata['version'], dist.path))
+ print('%r %s (from %r)' % (dist.name, dist.version, dist.path))
number += 1
- print()
if number == 0:
if listall:
- print('Nothing seems to be installed.')
+ logger.info('Nothing seems to be installed.')
else:
- print('No matching distribution found.')
+ logger.warning('No matching distribution found.')
return 1
else:
- print('Found %d projects installed.' % number)
+ logger.info('Found %d projects installed.', number)
@action_help(search_usage)
@@ -388,7 +382,8 @@ def _search(dispatcher, args, **kw):
"""
#opts = _parse_args(args[1:], '', ['simple', 'xmlrpc'])
# 1. what kind of index is requested ? (xmlrpc / simple)
- raise NotImplementedError
+ logger.error('not implemented')
+ return 1
actions = [
@@ -668,6 +663,7 @@ class Dispatcher:
def __call__(self):
if self.action is None:
return
+
for action, desc, func in actions:
if action == self.action:
return func(self, self.args)
@@ -682,6 +678,12 @@ def main(args=None):
if dispatcher.action is None:
return
return dispatcher()
+ except KeyboardInterrupt:
+ logger.info('interrupted')
+ return 1
+ except (IOError, os.error, PackagingError, CCompilerError) as exc:
+ logger.exception(exc)
+ return 1
finally:
logger.setLevel(old_level)
logger.handlers[:] = old_handlers