diff -r 1c3f1491965f -r b99903534e06 mercurial/scmutil.py --- a/mercurial/scmutil.py Thu Sep 27 13:54:37 2018 -0700 +++ b/mercurial/scmutil.py Thu Sep 27 13:57:50 2018 -0700 @@ -875,39 +875,52 @@ # translate mapping's other forms if not util.safehasattr(replacements, 'items'): - replacements = {n: () for n in replacements} + replacements = {(n,): () for n in replacements} + else: + # upgrading non tuple "source" to tuple ones for BC + repls = {} + for key, value in replacements.items(): + if not isinstance(key, tuple): + key = (key,) + repls[key] = value + replacements = repls # Calculate bookmark movements if moves is None: moves = {} # Unfiltered repo is needed since nodes in replacements might be hidden. unfi = repo.unfiltered() - for oldnode, newnodes in replacements.items(): - if oldnode in moves: - continue - if len(newnodes) > 1: - # usually a split, take the one with biggest rev number - newnode = next(unfi.set('max(%ln)', newnodes)).node() - elif len(newnodes) == 0: - # move bookmark backwards - roots = list(unfi.set('max((::%n) - %ln)', oldnode, - list(replacements))) - if roots: - newnode = roots[0].node() + for oldnodes, newnodes in replacements.items(): + for oldnode in oldnodes: + if oldnode in moves: + continue + if len(newnodes) > 1: + # usually a split, take the one with biggest rev number + newnode = next(unfi.set('max(%ln)', newnodes)).node() + elif len(newnodes) == 0: + # move bookmark backwards + allreplaced = [] + for rep in replacements: + allreplaced.extend(rep) + roots = list(unfi.set('max((::%n) - %ln)', oldnode, + allreplaced)) + if roots: + newnode = roots[0].node() + else: + newnode = nullid else: - newnode = nullid - else: - newnode = newnodes[0] - moves[oldnode] = newnode + newnode = newnodes[0] + moves[oldnode] = newnode allnewnodes = [n for ns in replacements.values() for n in ns] toretract = {} toadvance = {} if fixphase: precursors = {} - for oldnode, newnodes in replacements.items(): - for newnode in newnodes: - precursors.setdefault(newnode, []).append(oldnode) + for oldnodes, newnodes in replacements.items(): + for oldnode in oldnodes: + for newnode in newnodes: + precursors.setdefault(newnode, []).append(oldnode) allnewnodes.sort(key=lambda n: unfi[n].rev()) newphases = {} @@ -967,18 +980,19 @@ # NOTE: the filtering and sorting might belong to createmarkers. isobs = unfi.obsstore.successors.__contains__ torev = unfi.changelog.rev - sortfunc = lambda ns: torev(ns[0]) + sortfunc = lambda ns: torev(ns[0][0]) rels = [] - for n, s in sorted(replacements.items(), key=sortfunc): - if s or not isobs(n): - rel = (unfi[n], tuple(unfi[m] for m in s)) - rels.append(rel) + for ns, s in sorted(replacements.items(), key=sortfunc): + for n in ns: + if s or not isobs(n): + rel = (unfi[n], tuple(unfi[m] for m in s)) + rels.append(rel) if rels: obsolete.createmarkers(repo, rels, operation=operation, metadata=metadata) else: from . import repair # avoid import cycle - tostrip = list(replacements) + tostrip = list(n for ns in replacements for n in ns) if tostrip: repair.delayedstrip(repo.ui, repo, tostrip, operation, backup=backup)