3 # Copyright 2009-2010 Matt Mackall <mpm@selenic.com> |
3 # Copyright 2009-2010 Matt Mackall <mpm@selenic.com> |
4 # |
4 # |
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
7 |
7 |
8 import errno, os, re, xml.dom.minidom, shutil, posixpath |
8 import errno, os, re, xml.dom.minidom, shutil, posixpath, sys |
9 import stat, subprocess, tarfile |
9 import stat, subprocess, tarfile |
10 from i18n import _ |
10 from i18n import _ |
11 import config, scmutil, util, node, error, cmdutil, bookmarks, match as matchmod |
11 import config, scmutil, util, node, error, cmdutil, bookmarks, match as matchmod |
12 hg = None |
12 hg = None |
13 propertycache = util.propertycache |
13 propertycache = util.propertycache |
39 class SubrepoAbort(error.Abort): |
39 class SubrepoAbort(error.Abort): |
40 """Exception class used to avoid handling a subrepo error more than once""" |
40 """Exception class used to avoid handling a subrepo error more than once""" |
41 def __init__(self, *args, **kw): |
41 def __init__(self, *args, **kw): |
42 error.Abort.__init__(self, *args, **kw) |
42 error.Abort.__init__(self, *args, **kw) |
43 self.subrepo = kw.get('subrepo') |
43 self.subrepo = kw.get('subrepo') |
|
44 self.cause = kw.get('cause') |
44 |
45 |
45 def annotatesubrepoerror(func): |
46 def annotatesubrepoerror(func): |
46 def decoratedmethod(self, *args, **kargs): |
47 def decoratedmethod(self, *args, **kargs): |
47 try: |
48 try: |
48 res = func(self, *args, **kargs) |
49 res = func(self, *args, **kargs) |
51 raise ex |
52 raise ex |
52 except error.Abort, ex: |
53 except error.Abort, ex: |
53 subrepo = subrelpath(self) |
54 subrepo = subrelpath(self) |
54 errormsg = str(ex) + ' ' + _('(in subrepo %s)') % subrepo |
55 errormsg = str(ex) + ' ' + _('(in subrepo %s)') % subrepo |
55 # avoid handling this exception by raising a SubrepoAbort exception |
56 # avoid handling this exception by raising a SubrepoAbort exception |
56 raise SubrepoAbort(errormsg, hint=ex.hint, subrepo=subrepo) |
57 raise SubrepoAbort(errormsg, hint=ex.hint, subrepo=subrepo, |
|
58 cause=sys.exc_info()) |
57 return res |
59 return res |
58 return decoratedmethod |
60 return decoratedmethod |
59 |
61 |
60 def state(ctx, ui): |
62 def state(ctx, ui): |
61 """return a state dict, mapping subrepo paths configured in .hgsub |
63 """return a state dict, mapping subrepo paths configured in .hgsub |