diff -r 57875cf423c9 -r 2372284d9457 mercurial/subrepoutil.py --- 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