# HG changeset patch # User Patrick Mezard # Date 1336133995 -7200 # Node ID 95ca6c8b38da95c065d6454dad775c7ba24e91db # Parent 2de6ac4ac17cc917a629e4fa6e4aad9f5e5b4abf subrepo: do not traceback on .hgsubstate parsing errors Note that aborting in subrepo.state() prevents "repairing" commands like revert to be issued. The user will have to edit the .hgsubstate manually (but he probably had already otherwise this would not be failing). The same behaviour already happens with invalid .hgsub entries. diff -r 2de6ac4ac17c -r 95ca6c8b38da mercurial/subrepo.py --- a/mercurial/subrepo.py Fri May 04 14:19:52 2012 +0200 +++ b/mercurial/subrepo.py Fri May 04 14:19:55 2012 +0200 @@ -43,11 +43,16 @@ rev = {} if '.hgsubstate' in ctx: try: - for l in ctx['.hgsubstate'].data().splitlines(): + for i, l in enumerate(ctx['.hgsubstate'].data().splitlines()): l = l.lstrip() if not l: continue - revision, path = l.split(" ", 1) + try: + revision, path = l.split(" ", 1) + except ValueError: + raise util.Abort(_("invalid subrepository revision " + "specifier in .hgsubstate line %d") + % (i + 1)) rev[path] = revision except IOError, err: if err.errno != errno.ENOENT: diff -r 2de6ac4ac17c -r 95ca6c8b38da tests/test-subrepo-missing.t --- a/tests/test-subrepo-missing.t Fri May 04 14:19:52 2012 +0200 +++ b/tests/test-subrepo-missing.t Fri May 04 14:19:55 2012 +0200 @@ -19,6 +19,15 @@ M .hgsubstate $ hg revert -qC .hgsubstate +abort more gracefully on .hgsubstate parsing error + + $ cp .hgsubstate .hgsubstate.old + >>> file('.hgsubstate', 'wb').write('\ninvalid') + $ hg st --subrepos + abort: invalid subrepository revision specifier in .hgsubstate line 2 + [255] + $ mv .hgsubstate.old .hgsubstate + delete .hgsub and revert it $ rm .hgsub