mercurial/subrepoutil.py
changeset 43076 2372284d9457
parent 42588 f6540aba8e3e
child 43077 687b865b95ad
--- a/mercurial/subrepoutil.py	Sat Oct 05 10:29:34 2019 -0400
+++ b/mercurial/subrepoutil.py	Sun Oct 06 09:45:02 2019 -0400
@@ -21,12 +21,11 @@
     phases,
     util,
 )
-from .utils import (
-    stringutil,
-)
+from .utils import stringutil
 
 nullstate = ('', '', 'empty')
 
+
 def state(ctx, ui):
     """return a state dict, mapping subrepo paths configured in .hgsub
     to tuple: (source from .hgsub, revision from .hgsubstate, kind
@@ -34,6 +33,7 @@
     """
     p = config.config()
     repo = ctx.repo()
+
     def read(f, sections=None, remap=None):
         if f in ctx:
             try:
@@ -42,13 +42,17 @@
                 if err.errno != errno.ENOENT:
                     raise
                 # handle missing subrepo spec files as removed
-                ui.warn(_("warning: subrepo spec file \'%s\' not found\n") %
-                        repo.pathto(f))
+                ui.warn(
+                    _("warning: subrepo spec file \'%s\' not found\n")
+                    % repo.pathto(f)
+                )
                 return
             p.parse(f, data, sections, remap, read)
         else:
-            raise error.Abort(_("subrepo spec file \'%s\' not found") %
-                             repo.pathto(f))
+            raise error.Abort(
+                _("subrepo spec file \'%s\' not found") % repo.pathto(f)
+            )
+
     if '.hgsub' in ctx:
         read('.hgsub')
 
@@ -65,9 +69,13 @@
                 try:
                     revision, path = l.split(" ", 1)
                 except ValueError:
-                    raise error.Abort(_("invalid subrepository revision "
-                                       "specifier in \'%s\' line %d")
-                                     % (repo.pathto('.hgsubstate'), (i + 1)))
+                    raise error.Abort(
+                        _(
+                            "invalid subrepository revision "
+                            "specifier in \'%s\' line %d"
+                        )
+                        % (repo.pathto('.hgsubstate'), (i + 1))
+                    )
                 rev[path] = revision
         except IOError as err:
             if err.errno != errno.ENOENT:
@@ -85,9 +93,13 @@
             try:
                 src = re.sub(pattern, repl, src, 1)
             except re.error as e:
-                raise error.Abort(_("bad subrepository pattern in %s: %s")
-                                 % (p.source('subpaths', pattern),
-                                    stringutil.forcebytestr(e)))
+                raise error.Abort(
+                    _("bad subrepository pattern in %s: %s")
+                    % (
+                        p.source('subpaths', pattern),
+                        stringutil.forcebytestr(e),
+                    )
+                )
         return src
 
     state = {}
@@ -98,7 +110,7 @@
                 raise error.Abort(_('missing ] in subrepository source'))
             kind, src = src.split(']', 1)
             kind = kind[1:]
-            src = src.lstrip() # strip any extra whitespace after ']'
+            src = src.lstrip()  # strip any extra whitespace after ']'
 
         if not util.url(src).isabs():
             parent = _abssource(repo, abort=False)
@@ -120,16 +132,21 @@
 
     return state
 
+
 def writestate(repo, state):
     """rewrite .hgsubstate in (outer) repo with these subrepo states"""
-    lines = ['%s %s\n' % (state[s][1], s) for s in sorted(state)
-                                                if state[s][1] != nullstate[1]]
+    lines = [
+        '%s %s\n' % (state[s][1], s)
+        for s in sorted(state)
+        if state[s][1] != nullstate[1]
+    ]
     repo.wwrite('.hgsubstate', ''.join(lines), '')
 
+
 def submerge(repo, wctx, mctx, actx, overwrite, labels=None):
     """delegated from merge.applyupdates: merging of .hgsubstate file
     in working context, merging context and ancestor context"""
-    if mctx == actx: # backwards?
+    if mctx == actx:  # backwards?
         actx = wctx.p1()
     s1 = wctx.substate
     s2 = mctx.substate
@@ -146,36 +163,41 @@
     promptssrc = filemerge.partextras(labels)
     for s, l in sorted(s1.iteritems()):
         a = sa.get(s, nullstate)
-        ld = l # local state with possible dirty flag for compares
+        ld = l  # local state with possible dirty flag for compares
         if wctx.sub(s).dirty():
             ld = (l[0], l[1] + "+")
-        if wctx == actx: # overwrite
+        if wctx == actx:  # overwrite
             a = ld
 
         prompts = promptssrc.copy()
         prompts['s'] = s
         if s in s2:
             r = s2[s]
-            if ld == r or r == a: # no change or local is newer
+            if ld == r or r == a:  # no change or local is newer
                 sm[s] = l
                 continue
-            elif ld == a: # other side changed
+            elif ld == a:  # other side changed
                 debug(s, "other changed, get", r)
                 wctx.sub(s).get(r, overwrite)
                 sm[s] = r
-            elif ld[0] != r[0]: # sources differ
+            elif ld[0] != r[0]:  # sources differ
                 prompts['lo'] = l[0]
                 prompts['ro'] = r[0]
                 if repo.ui.promptchoice(
-                    _(' subrepository sources for %(s)s differ\n'
-                      'you can use (l)ocal%(l)s source (%(lo)s)'
-                      ' or (r)emote%(o)s source (%(ro)s).\n'
-                      'what do you want to do?'
-                      '$$ &Local $$ &Remote') % prompts, 0):
+                    _(
+                        ' subrepository sources for %(s)s differ\n'
+                        'you can use (l)ocal%(l)s source (%(lo)s)'
+                        ' or (r)emote%(o)s source (%(ro)s).\n'
+                        'what do you want to do?'
+                        '$$ &Local $$ &Remote'
+                    )
+                    % prompts,
+                    0,
+                ):
                     debug(s, "prompt changed, get", r)
                     wctx.sub(s).get(r, overwrite)
                     sm[s] = r
-            elif ld[1] == a[1]: # local side is unchanged
+            elif ld[1] == a[1]:  # local side is unchanged
                 debug(s, "other side changed, get", r)
                 wctx.sub(s).get(r, overwrite)
                 sm[s] = r
@@ -185,13 +207,17 @@
                 prompts['sl'] = srepo.shortid(l[1])
                 prompts['sr'] = srepo.shortid(r[1])
                 option = repo.ui.promptchoice(
-                    _(' subrepository %(s)s diverged (local revision: %(sl)s, '
-                      'remote revision: %(sr)s)\n'
-                      'you can (m)erge, keep (l)ocal%(l)s or keep '
-                      '(r)emote%(o)s.\n'
-                      'what do you want to do?'
-                      '$$ &Merge $$ &Local $$ &Remote')
-                    % prompts, 0)
+                    _(
+                        ' subrepository %(s)s diverged (local revision: %(sl)s, '
+                        'remote revision: %(sr)s)\n'
+                        'you can (m)erge, keep (l)ocal%(l)s or keep '
+                        '(r)emote%(o)s.\n'
+                        'what do you want to do?'
+                        '$$ &Merge $$ &Local $$ &Remote'
+                    )
+                    % prompts,
+                    0,
+                )
                 if option == 0:
                     wctx.sub(s).merge(r)
                     sm[s] = l
@@ -203,19 +229,24 @@
                     wctx.sub(s).get(r, overwrite)
                     sm[s] = r
                     debug(s, "get remote subrepo revision", r)
-        elif ld == a: # remote removed, local unchanged
+        elif ld == a:  # remote removed, local unchanged
             debug(s, "remote removed, remove")
             wctx.sub(s).remove()
-        elif a == nullstate: # not present in remote or ancestor
+        elif a == nullstate:  # not present in remote or ancestor
             debug(s, "local added, keep")
             sm[s] = l
             continue
         else:
             if repo.ui.promptchoice(
-                _(' local%(l)s changed subrepository %(s)s'
-                  ' which remote%(o)s removed\n'
-                  'use (c)hanged version or (d)elete?'
-                  '$$ &Changed $$ &Delete') % prompts, 0):
+                _(
+                    ' local%(l)s changed subrepository %(s)s'
+                    ' which remote%(o)s removed\n'
+                    'use (c)hanged version or (d)elete?'
+                    '$$ &Changed $$ &Delete'
+                )
+                % prompts,
+                0,
+            ):
                 debug(s, "prompt remove")
                 wctx.sub(s).remove()
 
@@ -229,11 +260,19 @@
         elif r != sa[s]:
             prompts = promptssrc.copy()
             prompts['s'] = s
-            if repo.ui.promptchoice(
-                _(' remote%(o)s changed subrepository %(s)s'
-                  ' which local%(l)s removed\n'
-                  'use (c)hanged version or (d)elete?'
-                  '$$ &Changed $$ &Delete') % prompts, 0) == 0:
+            if (
+                repo.ui.promptchoice(
+                    _(
+                        ' remote%(o)s changed subrepository %(s)s'
+                        ' which local%(l)s removed\n'
+                        'use (c)hanged version or (d)elete?'
+                        '$$ &Changed $$ &Delete'
+                    )
+                    % prompts,
+                    0,
+                )
+                == 0
+            ):
                 debug(s, "prompt recreate", r)
                 mctx.sub(s).get(r)
                 sm[s] = r
@@ -242,6 +281,7 @@
     writestate(repo, sm)
     return sm
 
+
 def precommit(ui, wctx, status, match, force=False):
     """Calculate .hgsubstate changes that should be applied before committing
 
@@ -274,12 +314,15 @@
                     continue
                 if not force:
                     raise error.Abort(
-                        _("commit with new subrepo %s excluded") % s)
+                        _("commit with new subrepo %s excluded") % s
+                    )
             dirtyreason = wctx.sub(s).dirtyreason(True)
             if dirtyreason:
                 if not ui.configbool('ui', 'commitsubrepos'):
-                    raise error.Abort(dirtyreason,
-                        hint=_("use --subrepos for recursive commit"))
+                    raise error.Abort(
+                        dirtyreason,
+                        hint=_("use --subrepos for recursive commit"),
+                    )
                 subs.append(s)
                 commitsubs.add(s)
             else:
@@ -293,31 +336,35 @@
             r = [s for s in p.substate if s not in newstate]
             subs += [s for s in r if match(s)]
         if subs:
-            if (not match('.hgsub') and
-                '.hgsub' in (wctx.modified() + wctx.added())):
+            if not match('.hgsub') and '.hgsub' in (
+                wctx.modified() + wctx.added()
+            ):
                 raise error.Abort(_("can't commit subrepos without .hgsub"))
             status.modified.insert(0, '.hgsubstate')
 
     elif '.hgsub' in status.removed:
         # clean up .hgsubstate when .hgsub is removed
-        if ('.hgsubstate' in wctx and
-            '.hgsubstate' not in (status.modified + status.added +
-                                  status.removed)):
+        if '.hgsubstate' in wctx and '.hgsubstate' not in (
+            status.modified + status.added + status.removed
+        ):
             status.removed.insert(0, '.hgsubstate')
 
     return subs, commitsubs, newstate
 
+
 def reporelpath(repo):
     """return path to this (sub)repo as seen from outermost repo"""
     parent = repo
     while util.safehasattr(parent, '_subparent'):
         parent = parent._subparent
-    return repo.root[len(pathutil.normasprefix(parent.root)):]
+    return repo.root[len(pathutil.normasprefix(parent.root)) :]
+
 
 def subrelpath(sub):
     """return path to this subrepo as seen from outermost repo"""
     return sub._relpath
 
+
 def _abssource(repo, push=False, abort=True):
     """return pull/push path of repo - either based on parent repo .hgsub info
     or on the top repo config. Abort or return None if no source found."""
@@ -332,7 +379,7 @@
             parent.path = posixpath.join(parent.path or '', source.path)
             parent.path = posixpath.normpath(parent.path)
             return bytes(parent)
-    else: # recursion reached top repo
+    else:  # recursion reached top repo
         path = None
         if util.safehasattr(repo, '_subtoppath'):
             path = repo._subtoppath
@@ -365,6 +412,7 @@
     if abort:
         raise error.Abort(_("default path for subrepository not found"))
 
+
 def newcommitphase(ui, ctx):
     commitphase = phases.newcommitphase(ui)
     substate = getattr(ctx, "substate", None)
@@ -372,8 +420,9 @@
         return commitphase
     check = ui.config('phases', 'checksubrepos')
     if check not in ('ignore', 'follow', 'abort'):
-        raise error.Abort(_('invalid phases.checksubrepos configuration: %s')
-                         % (check))
+        raise error.Abort(
+            _('invalid phases.checksubrepos configuration: %s') % check
+        )
     if check == 'ignore':
         return commitphase
     maxphase = phases.public
@@ -386,12 +435,23 @@
             maxsub = s
     if commitphase < maxphase:
         if check == 'abort':
-            raise error.Abort(_("can't commit in %s phase"
-                               " conflicting %s from subrepository %s") %
-                             (phases.phasenames[commitphase],
-                              phases.phasenames[maxphase], maxsub))
-        ui.warn(_("warning: changes are committed in"
-                  " %s phase from subrepository %s\n") %
-                (phases.phasenames[maxphase], maxsub))
+            raise error.Abort(
+                _(
+                    "can't commit in %s phase"
+                    " conflicting %s from subrepository %s"
+                )
+                % (
+                    phases.phasenames[commitphase],
+                    phases.phasenames[maxphase],
+                    maxsub,
+                )
+            )
+        ui.warn(
+            _(
+                "warning: changes are committed in"
+                " %s phase from subrepository %s\n"
+            )
+            % (phases.phasenames[maxphase], maxsub)
+        )
         return maxphase
     return commitphase