hgext3rd/evolve/obshistory.py
changeset 4814 48b30ff742cb
parent 4801 16c1398b0063
child 4827 4c6dd20e8cc2
--- a/hgext3rd/evolve/obshistory.py	Tue Aug 06 15:06:27 2019 +0200
+++ b/hgext3rd/evolve/obshistory.py	Tue Aug 06 15:06:38 2019 +0200
@@ -31,13 +31,13 @@
 eh = exthelper.exthelper()
 
 # Config
-efd = {'default': True} # pass a default value unless the config is registered
+efd = {b'default': True} # pass a default value unless the config is registered
 
 @eh.extsetup
 def enableeffectflags(ui):
     item = (getattr(ui, '_knownconfig', {})
-            .get('experimental', {})
-            .get('evolution.effect-flags'))
+            .get(b'experimental', {})
+            .get(b'evolution.effect-flags'))
     if item is not None:
         item.default = True
         efd.clear()
@@ -79,10 +79,10 @@
 
     Returns 0 on success.
     """
-    ui.pager('obslog')
+    ui.pager(b'obslog')
     revs = list(revs) + opts['rev']
     if not revs:
-        revs = ['.']
+        revs = [b'.']
     revs = scmutil.revrange(repo, revs)
 
     if opts['graph']:
@@ -131,7 +131,7 @@
 
     values = []
     for sset in fullsuccessorsets:
-        values.append({'successors': sset, 'markers': sset.markers})
+        values.append({b'successors': sset, b'markers': sset.markers})
 
     return values
 
@@ -154,10 +154,10 @@
 
         # Compat 4.6
         if not util.safehasattr(self, "_includediff"):
-            self._includediff = diffopts and diffopts.get('patch')
+            self._includediff = diffopts and diffopts.get(b'patch')
 
-        self.template = diffopts and diffopts.get('template')
-        self.filter = diffopts and diffopts.get('filternonlocal')
+        self.template = diffopts and diffopts.get(b'template')
+        self.filter = diffopts and diffopts.get(b'filternonlocal')
 
     def show(self, ctx, copies=None, matchfn=None, **props):
         if self.buffered:
@@ -165,12 +165,12 @@
 
             changenode = ctx.node()
 
-            _props = {"template": self.template}
-            fm = self.ui.formatter('debugobshistory', _props)
+            _props = {b"template": self.template}
+            fm = self.ui.formatter(b'debugobshistory', _props)
 
             _debugobshistorydisplaynode(fm, self.repo, changenode)
 
-            markerfm = fm.nested("markers")
+            markerfm = fm.nested(b"markers")
 
             # Succs markers
             if self.filter is False:
@@ -186,21 +186,21 @@
                 r = _successorsandmarkers(self.repo, ctx)
 
                 for succset in sorted(r):
-                    markers = succset["markers"]
+                    markers = succset[b"markers"]
                     if not markers:
                         continue
-                    successors = succset["successors"]
+                    successors = succset[b"successors"]
                     _debugobshistorydisplaysuccsandmarkers(markerfm, successors, markers, ctx.node(), self.repo, self._includediff)
 
             markerfm.end()
 
-            markerfm.plain('\n')
+            markerfm.plain(b'\n')
             fm.end()
 
             self.hunk[ctx.node()] = self.ui.popbuffer()
         else:
             ### graph output is buffered only
-            msg = 'cannot be used outside of the graphlog (yet)'
+            msg = b'cannot be used outside of the graphlog (yet)'
             raise error.ProgrammingError(msg)
 
     def flush(self, ctx):
@@ -211,43 +211,43 @@
 
 def patchavailable(node, repo, successors):
     if node not in repo:
-        return False, "context is not local"
+        return False, b"context is not local"
 
     if len(successors) == 0:
-        return False, "no successors"
+        return False, b"no successors"
     elif len(successors) > 1:
-        return False, "too many successors (%d)" % len(successors)
+        return False, b"too many successors (%d)" % len(successors)
 
     succ = successors[0]
 
     if succ not in repo:
-        return False, "successor is unknown locally"
+        return False, b"successor is unknown locally"
 
     # Check that both node and succ have the same parents
     nodep1, nodep2 = repo[node].p1(), repo[node].p2()
     succp1, succp2 = repo[succ].p1(), repo[succ].p2()
 
     if nodep1 != succp1 or nodep2 != succp2:
-        return False, "changesets rebased"
+        return False, b"changesets rebased"
 
     return True, succ
 
 def getmarkerdescriptionpatch(repo, basedesc, succdesc):
     # description are stored without final new line,
     # add one to avoid ugly diff
-    basedesc += '\n'
-    succdesc += '\n'
+    basedesc += b'\n'
+    succdesc += b'\n'
 
     # fake file name
-    basename = "changeset-description"
-    succname = "changeset-description"
+    basename = b"changeset-description"
+    succname = b"changeset-description"
 
     d = compat.strdiff(basedesc, succdesc, basename, succname)
     uheaders, hunks = d
 
     # Copied from patch.diff
-    text = ''.join(sum((list(hlines) for hrange, hlines in hunks), []))
-    patch = "\n".join(uheaders + [text])
+    text = b''.join(sum((list(hlines) for hrange, hlines in hunks), []))
+    patch = b"\n".join(uheaders + [text])
 
     return patch
 
@@ -333,7 +333,7 @@
             # Then choose a random node from the cycle
             breaknode = sorted(cycle)[0]
             # And display it by force
-            repo.ui.debug('obs-cycle detected, forcing display of %s\n'
+            repo.ui.debug(b'obs-cycle detected, forcing display of %s\n'
                           % nodemod.short(breaknode))
             validcandidates = [breaknode]
 
@@ -435,7 +435,7 @@
 def _debugobshistoryrevs(ui, repo, revs, opts):
     """ Display the obsolescence history for revset
     """
-    fm = ui.formatter('debugobshistory', pycompat.byteskwargs(opts))
+    fm = ui.formatter(b'debugobshistory', pycompat.byteskwargs(opts))
     precursors = repo.obsstore.predecessors
     successors = repo.obsstore.successors
     nodec = repo.changelog.node
@@ -451,7 +451,7 @@
 
         succs = successors.get(ctxnode, ())
 
-        markerfm = fm.nested("markers")
+        markerfm = fm.nested(b"markers")
         for successor in sorted(succs):
             includediff = opts and opts.get("patch")
             _debugobshistorydisplaymarker(markerfm, successor, ctxnode, unfi, includediff)
@@ -477,24 +477,24 @@
         shortdescription = shortdescription.splitlines()[0]
 
     fm.startitem()
-    fm.write('node', '%s', bytes(ctx),
-             label="evolve.node")
-    fm.plain(' ')
+    fm.write(b'node', b'%s', bytes(ctx),
+             label=b"evolve.node")
+    fm.plain(b' ')
 
-    fm.write('rev', '(%d)', ctx.rev(),
-             label="evolve.rev")
-    fm.plain(' ')
+    fm.write(b'rev', b'(%d)', ctx.rev(),
+             label=b"evolve.rev")
+    fm.plain(b' ')
 
-    fm.write('shortdescription', '%s', shortdescription,
-             label="evolve.short_description")
-    fm.plain('\n')
+    fm.write(b'shortdescription', b'%s', shortdescription,
+             label=b"evolve.short_description")
+    fm.plain(b'\n')
 
 def _debugobshistorydisplaymissingctx(fm, nodewithoutctx):
     hexnode = nodemod.short(nodewithoutctx)
     fm.startitem()
-    fm.write('node', '%s', hexnode,
-             label="evolve.node evolve.missing_change_ctx")
-    fm.plain('\n')
+    fm.write(b'node', b'%s', hexnode,
+             label=b"evolve.node evolve.missing_change_ctx")
+    fm.plain(b'\n')
 
 def _debugobshistorydisplaymarker(fm, marker, node, repo, includediff=False):
     succnodes = marker[1]
@@ -502,18 +502,18 @@
     metadata = dict(marker[3])
 
     fm.startitem()
-    fm.plain('  ')
+    fm.plain(b'  ')
 
     # Detect pruned revisions
     if len(succnodes) == 0:
-        verb = 'pruned'
+        verb = b'pruned'
     else:
-        verb = 'rewritten'
+        verb = b'rewritten'
 
-    fm.write('verb', '%s', verb,
-             label="evolve.verb")
+    fm.write(b'verb', b'%s', verb,
+             label=b"evolve.verb")
 
-    effectflag = metadata.get('ef1')
+    effectflag = metadata.get(b'ef1')
     if effectflag is not None:
         try:
             effectflag = int(effectflag)
@@ -524,50 +524,50 @@
 
         # XXX should be a dict
         if effectflag & DESCCHANGED:
-            effect.append('description')
+            effect.append(b'description')
         if effectflag & METACHANGED:
-            effect.append('meta')
+            effect.append(b'meta')
         if effectflag & USERCHANGED:
-            effect.append('user')
+            effect.append(b'user')
         if effectflag & DATECHANGED:
-            effect.append('date')
+            effect.append(b'date')
         if effectflag & BRANCHCHANGED:
-            effect.append('branch')
+            effect.append(b'branch')
         if effectflag & PARENTCHANGED:
-            effect.append('parent')
+            effect.append(b'parent')
         if effectflag & DIFFCHANGED:
-            effect.append('content')
+            effect.append(b'content')
 
         if effect:
-            fmteffect = fm.formatlist(effect, 'effect', sep=', ')
-            fm.write('effect', '(%s)', fmteffect)
+            fmteffect = fm.formatlist(effect, b'effect', sep=b', ')
+            fm.write(b'effect', b'(%s)', fmteffect)
 
     if len(succnodes) > 0:
-        fm.plain(' as ')
+        fm.plain(b' as ')
 
         shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes))
-        nodes = fm.formatlist(shortsnodes, 'succnodes', sep=', ')
-        fm.write('succnodes', '%s', nodes,
-                 label="evolve.node")
+        nodes = fm.formatlist(shortsnodes, b'succnodes', sep=b', ')
+        fm.write(b'succnodes', b'%s', nodes,
+                 label=b"evolve.node")
 
-    operation = metadata.get('operation')
+    operation = metadata.get(b'operation')
     if operation:
-        fm.plain(' using ')
-        fm.write('operation', '%s', operation, label="evolve.operation")
+        fm.plain(b' using ')
+        fm.write(b'operation', b'%s', operation, label=b"evolve.operation")
 
-    fm.plain(' by ')
+    fm.plain(b' by ')
 
-    fm.write('user', '%s', metadata['user'],
-             label="evolve.user")
-    fm.plain(' ')
+    fm.write(b'user', b'%s', metadata[b'user'],
+             label=b"evolve.user")
+    fm.plain(b' ')
 
-    fm.write('date', '(%s)', fm.formatdate(date),
-             label="evolve.date")
+    fm.write(b'date', b'(%s)', fm.formatdate(date),
+             label=b"evolve.date")
 
     # initial support for showing note
-    if metadata.get('note'):
-        fm.plain('\n    note: ')
-        fm.write('note', "%s", metadata['note'], label="evolve.note")
+    if metadata.get(b'note'):
+        fm.plain(b'\n    note: ')
+        fm.write(b'note', b"%s", metadata[b'note'], label=b"evolve.note")
 
     # Patch display
     if includediff is True:
@@ -585,20 +585,20 @@
 
             if descriptionpatch:
                 # add the diffheader
-                diffheader = "diff -r %s -r %s changeset-description\n" % \
+                diffheader = b"diff -r %s -r %s changeset-description\n" %\
                              (basectx, succctx)
                 descriptionpatch = diffheader + descriptionpatch
 
                 def tolist(text):
                     return [text]
 
-                fm.plain("\n")
+                fm.plain(b"\n")
 
                 for chunk, label in patch.difflabel(tolist, descriptionpatch):
-                    chunk = chunk.strip('\t')
-                    if chunk and chunk != '\n':
-                        fm.plain('    ')
-                    fm.write('desc-diff', '%s', chunk, label=label)
+                    chunk = chunk.strip(b'\t')
+                    if chunk and chunk != b'\n':
+                        fm.plain(b'    ')
+                    fm.write(b'desc-diff', b'%s', chunk, label=label)
 
             # Content patch
             diffopts = patch.diffallopts(repo.ui, {})
@@ -607,18 +607,18 @@
             for chunk, label in patch.diffui(repo, node, succ, matchfn,
                                              opts=diffopts):
                 if firstline:
-                    fm.plain('\n')
+                    fm.plain(b'\n')
                     firstline = False
-                if chunk and chunk != '\n':
-                    fm.plain('    ')
-                fm.write('patch', '%s', chunk, label=label)
+                if chunk and chunk != b'\n':
+                    fm.plain(b'    ')
+                fm.write(b'patch', b'%s', chunk, label=label)
         else:
-            nopatch = "    (No patch available, %s)" % _patchavailable[1]
-            fm.plain("\n")
+            nopatch = b"    (No patch available, %s)" % _patchavailable[1]
+            fm.plain(b"\n")
             # TODO: should be in json too
             fm.plain(nopatch)
 
-    fm.plain("\n")
+    fm.plain(b"\n")
 
 def _debugobshistorydisplaysuccsandmarkers(fm, succnodes, markers, node, repo, includediff=False):
     """
@@ -626,17 +626,17 @@
     to accept multiple markers as input.
     """
     fm.startitem()
-    fm.plain('  ')
+    fm.plain(b'  ')
 
     # Detect pruned revisions
-    verb = _successorsetverb(succnodes, markers)["verb"]
+    verb = _successorsetverb(succnodes, markers)[b"verb"]
 
-    fm.write('verb', '%s', verb,
-             label="evolve.verb")
+    fm.write(b'verb', b'%s', verb,
+             label=b"evolve.verb")
 
     # Effect flag
     metadata = [dict(marker[3]) for marker in markers]
-    ef1 = [data.get('ef1') for data in metadata]
+    ef1 = [data.get(b'ef1') for data in metadata]
 
     effectflag = 0
     for ef in ef1:
@@ -648,45 +648,45 @@
 
         # XXX should be a dict
         if effectflag & DESCCHANGED:
-            effect.append('description')
+            effect.append(b'description')
         if effectflag & METACHANGED:
-            effect.append('meta')
+            effect.append(b'meta')
         if effectflag & USERCHANGED:
-            effect.append('user')
+            effect.append(b'user')
         if effectflag & DATECHANGED:
-            effect.append('date')
+            effect.append(b'date')
         if effectflag & BRANCHCHANGED:
-            effect.append('branch')
+            effect.append(b'branch')
         if effectflag & PARENTCHANGED:
-            effect.append('parent')
+            effect.append(b'parent')
         if effectflag & DIFFCHANGED:
-            effect.append('content')
+            effect.append(b'content')
 
         if effect:
-            fmteffect = fm.formatlist(effect, 'effect', sep=', ')
-            fm.write('effect', '(%s)', fmteffect)
+            fmteffect = fm.formatlist(effect, b'effect', sep=b', ')
+            fm.write(b'effect', b'(%s)', fmteffect)
 
     if len(succnodes) > 0:
-        fm.plain(' as ')
+        fm.plain(b' as ')
 
         shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes))
-        nodes = fm.formatlist(shortsnodes, 'succnodes', sep=', ')
-        fm.write('succnodes', '%s', nodes,
-                 label="evolve.node")
+        nodes = fm.formatlist(shortsnodes, b'succnodes', sep=b', ')
+        fm.write(b'succnodes', b'%s', nodes,
+                 label=b"evolve.node")
 
     # Operations
     operations = compat.markersoperations(markers)
     if operations:
-        fm.plain(' using ')
-        fm.write('operation', '%s', ", ".join(operations), label="evolve.operation")
+        fm.plain(b' using ')
+        fm.write(b'operation', b'%s', b", ".join(operations), label=b"evolve.operation")
 
-    fm.plain(' by ')
+    fm.plain(b' by ')
 
     # Users
     users = compat.markersusers(markers)
-    fm.write('user', '%s', ", ".join(users),
-             label="evolve.user")
-    fm.plain(' ')
+    fm.write(b'user', b'%s', b", ".join(users),
+             label=b"evolve.user")
+    fm.plain(b' ')
 
     # Dates
     dates = compat.markersdates(markers)
@@ -695,10 +695,10 @@
         max_date = max(dates)
 
         if min_date == max_date:
-            fm.write("date", "(at %s)", fm.formatdate(min_date), label="evolve.date")
+            fm.write(b"date", b"(at %s)", fm.formatdate(min_date), label=b"evolve.date")
         else:
-            fm.write("date", "(between %s and %s)", fm.formatdate(min_date),
-                     fm.formatdate(max_date), label="evolve.date")
+            fm.write(b"date", b"(between %s and %s)", fm.formatdate(min_date),
+                     fm.formatdate(max_date), label=b"evolve.date")
 
     # initial support for showing note
     # if metadata.get('note'):
@@ -721,20 +721,20 @@
 
             if descriptionpatch:
                 # add the diffheader
-                diffheader = "diff -r %s -r %s changeset-description\n" % \
+                diffheader = b"diff -r %s -r %s changeset-description\n" %\
                              (basectx, succctx)
                 descriptionpatch = diffheader + descriptionpatch
 
                 def tolist(text):
                     return [text]
 
-                fm.plain("\n")
+                fm.plain(b"\n")
 
                 for chunk, label in patch.difflabel(tolist, descriptionpatch):
-                    chunk = chunk.strip('\t')
-                    if chunk and chunk != '\n':
-                        fm.plain('    ')
-                    fm.write('desc-diff', '%s', chunk, label=label)
+                    chunk = chunk.strip(b'\t')
+                    if chunk and chunk != b'\n':
+                        fm.plain(b'    ')
+                    fm.write(b'desc-diff', b'%s', chunk, label=label)
 
             # Content patch
             diffopts = patch.diffallopts(repo.ui, {})
@@ -743,18 +743,18 @@
             for chunk, label in patch.diffui(repo, node, succ, matchfn,
                                              opts=diffopts):
                 if firstline:
-                    fm.plain('\n')
+                    fm.plain(b'\n')
                     firstline = False
-                if chunk and chunk != '\n':
-                    fm.plain('    ')
-                fm.write('patch', '%s', chunk, label=label)
+                if chunk and chunk != b'\n':
+                    fm.plain(b'    ')
+                fm.write(b'patch', b'%s', chunk, label=label)
         else:
-            nopatch = "    (No patch available, %s)" % _patchavailable[1]
-            fm.plain("\n")
+            nopatch = b"    (No patch available, %s)" % _patchavailable[1]
+            fm.plain(b"\n")
             # TODO: should be in json too
             fm.plain(nopatch)
 
-    fm.plain("\n")
+    fm.plain(b"\n")
 
 # logic around storing and using effect flags
 DESCCHANGED = 1 << 0 # action changed the description
@@ -814,17 +814,17 @@
 
     if len(successorssets) == 0:
         # The commit has been pruned
-        return 'pruned'
+        return b'pruned'
     elif len(successorssets) > 1:
-        return 'diverged'
+        return b'diverged'
     else:
         # No divergence, only one set of successors
         successors = successorssets[0]
 
         if len(successors) == 1:
-            return 'superseed'
+            return b'superseed'
         else:
-            return 'superseed_split'
+            return b'superseed_split'
 
 def _getobsfateandsuccs(repo, revnode, successorssets=None):
     """ Return a tuple containing:
@@ -857,8 +857,8 @@
     dates = [m[4] for m in markers]
 
     return {
-        'min_date': min(dates),
-        'max_date': max(dates)
+        b'min_date': min(dates),
+        b'max_date': max(dates)
     }
 
 def _successorsetusers(successorset, markers):
@@ -869,18 +869,18 @@
 
     # Check that user is present in meta
     markersmeta = [dict(m[3]) for m in markers]
-    users = set(meta.get('user') for meta in markersmeta if meta.get('user'))
+    users = set(meta.get(b'user') for meta in markersmeta if meta.get(b'user'))
 
-    return {'users': sorted(users)}
+    return {b'users': sorted(users)}
 
 VERBMAPPING = {
-    DESCCHANGED: "reworded",
-    METACHANGED: "meta-changed",
-    USERCHANGED: "reauthored",
-    DATECHANGED: "date-changed",
-    BRANCHCHANGED: "branch-changed",
-    PARENTCHANGED: "rebased",
-    DIFFCHANGED: "amended"
+    DESCCHANGED: b"reworded",
+    METACHANGED: b"meta-changed",
+    USERCHANGED: b"reauthored",
+    DATECHANGED: b"date-changed",
+    BRANCHCHANGED: b"branch-changed",
+    PARENTCHANGED: b"rebased",
+    DIFFCHANGED: b"amended"
 }
 
 def _successorsetverb(successorset, markers):
@@ -888,12 +888,12 @@
     """
     verb = None
     if not successorset:
-        verb = 'pruned'
+        verb = b'pruned'
     elif len(successorset) == 1:
         # Check for effect flag
 
         metadata = [dict(marker[3]) for marker in markers]
-        ef1 = [data.get('ef1') for data in metadata]
+        ef1 = [data.get(b'ef1') for data in metadata]
 
         if all(ef1):
             combined = 0
@@ -905,17 +905,17 @@
                 verb = VERBMAPPING[combined]
 
         if verb is None:
-            verb = 'rewritten'
+            verb = b'rewritten'
     else:
-        verb = 'split'
-    return {'verb': verb}
+        verb = b'split'
+    return {b'verb': verb}
 
 # Use a more advanced version of obsfateverb that uses effect-flag
 if util.safehasattr(obsutil, 'obsfateverb'):
 
     @eh.wrapfunction(obsutil, 'obsfateverb')
     def obsfateverb(orig, *args, **kwargs):
-        return _successorsetverb(*args, **kwargs)['verb']
+        return _successorsetverb(*args, **kwargs)[b'verb']
 
 # Hijack callers of successorsetverb
 elif util.safehasattr(obsutil, 'obsfateprinter'):
@@ -924,7 +924,7 @@
     def obsfateprinter(orig, successors, markers, ui):
 
         def closure(successors):
-            return _successorsetverb(successors, markers)['verb']
+            return _successorsetverb(successors, markers)[b'verb']
 
         if not util.safehasattr(obsutil, 'successorsetverb'):
             return orig(successors, markers, ui)
@@ -1000,8 +1000,8 @@
 
     # Format basic data
     data = {
-        "successors": sorted(successorset),
-        "markers": sorted(markers)
+        b"successors": sorted(successorset),
+        b"markers": sorted(markers)
     }
 
     # Call an extensible list of functions to override or add new data