More verbose errors for NoManifestExceptions.

The old "manifest required for this command -- please run
init" is replaced by a more helpful message that lists the
command repo was trying to execute (with arguments) as well
as the str() of the NoManifestException. For example:

> error: in `sync`: [Errno 2] No such file or directory:
> 	'path/to/.repo/manifests/.git/HEAD'
> error: manifest missing or unreadable -- please run init

Other failure points in basic command parsing and dispatch
are more clearly explained in the same fashion.

Change-Id: I6212e5c648bc5d57e27145d55a5391ca565e4149
This commit is contained in:
Dan Sandler 2014-03-09 13:20:02 -04:00 committed by David Pursehouse
parent 093fdb6587
commit 53e902a19b
3 changed files with 25 additions and 13 deletions

View File

@ -24,6 +24,13 @@ class ManifestInvalidRevisionError(Exception):
class NoManifestException(Exception): class NoManifestException(Exception):
"""The required manifest does not exist. """The required manifest does not exist.
""" """
def __init__(self, path, reason):
super(NoManifestException, self).__init__()
self.path = path
self.reason = reason
def __str__(self):
return self.reason
class EditorError(Exception): class EditorError(Exception):
"""Unspecified error from the user's text editor. """Unspecified error from the user's text editor.

27
main.py
View File

@ -129,8 +129,15 @@ class _Repo(object):
file=sys.stderr) file=sys.stderr)
return 1 return 1
copts, cargs = cmd.OptionParser.parse_args(argv) try:
copts = cmd.ReadEnvironmentOptions(copts) copts, cargs = cmd.OptionParser.parse_args(argv)
copts = cmd.ReadEnvironmentOptions(copts)
except NoManifestException as e:
print('error: in `%s`: %s' % (' '.join([name] + argv), str(e)),
file=sys.stderr)
print('error: manifest missing or unreadable -- please run init',
file=sys.stderr)
return 1
if not gopts.no_pager and not isinstance(cmd, InteractiveCommand): if not gopts.no_pager and not isinstance(cmd, InteractiveCommand):
config = cmd.manifest.globalConfig config = cmd.manifest.globalConfig
@ -146,15 +153,13 @@ class _Repo(object):
start = time.time() start = time.time()
try: try:
result = cmd.Execute(copts, cargs) result = cmd.Execute(copts, cargs)
except DownloadError as e: except (DownloadError, ManifestInvalidRevisionError,
print('error: %s' % str(e), file=sys.stderr) NoManifestException) as e:
result = 1 print('error: in `%s`: %s' % (' '.join([name] + argv), str(e)),
except ManifestInvalidRevisionError as e: file=sys.stderr)
print('error: %s' % str(e), file=sys.stderr) if isinstance(e, NoManifestException):
result = 1 print('error: manifest missing or unreadable -- please run init',
except NoManifestException as e: file=sys.stderr)
print('error: manifest required for this command -- please run init',
file=sys.stderr)
result = 1 result = 1
except NoSuchProjectError as e: except NoSuchProjectError as e:
if e.name: if e.name:

View File

@ -2327,8 +2327,8 @@ class Project(object):
path = os.path.join(self._project.worktree, '.git', HEAD) path = os.path.join(self._project.worktree, '.git', HEAD)
try: try:
fd = open(path, 'rb') fd = open(path, 'rb')
except IOError: except IOError as e:
raise NoManifestException(path) raise NoManifestException(path, str(e))
try: try:
line = fd.read() line = fd.read()
finally: finally: