[PATCH 1 of 3] changeset_printer and changeset_templater updated to work with contexts

Alexander Solovyov piranha at piranha.org.ua
Fri Oct 17 15:50:01 CDT 2008


# HG changeset patch
# User Alexander Solovyov <piranha at piranha.org.ua>
# Date 1224276297 -10800
# Node ID 009316f403122ec8608c9b72c87ea93d946b8344
# Parent  9514cbb6e4f6f54ac8437e7a4eb160a39986a7eb
changeset_printer and changeset_templater updated to work with contexts

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -593,100 +593,91 @@
             return 1
         return 0
 
-    def show(self, rev=0, changenode=None, copies=(), **props):
+    def show(self, rev=0, changenode=None, copies=(), ctx=None, **props):
+        assert (ctx is not None) or (changenode is not None) or (rev is not None)
+        if ctx is None:
+            ctx = self.repo[changenode or rev]
         if self.buffered:
             self.ui.pushbuffer()
-            self._show(rev, changenode, copies, props)
-            self.hunk[rev] = self.ui.popbuffer()
+            self._show(ctx, copies, props)
+            self.hunk[ctx.rev()] = self.ui.popbuffer()
         else:
-            self._show(rev, changenode, copies, props)
+            self._show(ctx, copies, props)
 
-    def _show(self, rev, changenode, copies, props):
+    def _show(self, ctx, copies, props):
         '''show a single changeset or file revision'''
-        log = self.repo.changelog
-        if changenode is None:
-            changenode = log.node(rev)
-        elif not rev:
-            rev = log.rev(changenode)
-
         if self.ui.quiet:
-            self.ui.write("%d:%s\n" % (rev, short(changenode)))
+            self.ui.write("%d:%s\n" % (ctx.rev(), short(ctx.node())))
             return
 
-        changes = log.read(changenode)
-        date = util.datestr(changes[2])
-        extra = changes[5]
-        branch = extra.get("branch")
-
+        date = util.datestr(ctx.date())
         hexfunc = self.ui.debugflag and hex or short
-
-        parents = [(p, hexfunc(log.node(p)))
-                   for p in self._meaningful_parentrevs(log, rev)]
-
-        self.ui.write(_("changeset:   %d:%s\n") % (rev, hexfunc(changenode)))
+        self.ui.write(_("changeset:   %d:%s\n") % (ctx.rev(),
+                                                   hexfunc(ctx.node())))
 
         # don't show the default branch name
-        if branch != 'default':
-            branch = util.tolocal(branch)
+        if ctx.branch() != 'default':
+            branch = util.tolocal(ctx.branch())
             self.ui.write(_("branch:      %s\n") % branch)
-        for tag in self.repo.nodetags(changenode):
+        for tag in ctx.tags():
             self.ui.write(_("tag:         %s\n") % tag)
-        for parent in parents:
-            self.ui.write(_("parent:      %d:%s\n") % parent)
+        for parent in self._meaningful_parentrevs(ctx):
+            self.ui.write(_("parent:      %d:%s\n") % (
+                    parent, hexfunc(self.repo.changelog.node(parent))))
 
         if self.ui.debugflag:
+            mnode = ctx.changeset()[0]
             self.ui.write(_("manifest:    %d:%s\n") %
-                          (self.repo.manifest.rev(changes[0]), hex(changes[0])))
-        self.ui.write(_("user:        %s\n") % changes[1])
+                          (self.repo.manifest.rev(mnode), hex(mnode)))
+        self.ui.write(_("user:        %s\n") % ctx.user())
         self.ui.write(_("date:        %s\n") % date)
 
         if self.ui.debugflag:
-            files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
+            files = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
             for key, value in zip([_("files:"), _("files+:"), _("files-:")],
                                   files):
                 if value:
                     self.ui.write("%-12s %s\n" % (key, " ".join(value)))
-        elif changes[3] and self.ui.verbose:
-            self.ui.write(_("files:       %s\n") % " ".join(changes[3]))
+        elif ctx.files() and self.ui.verbose:
+            self.ui.write(_("files:       %s\n") % " ".join(ctx.files()))
         if copies and self.ui.verbose:
             copies = ['%s (%s)' % c for c in copies]
             self.ui.write(_("copies:      %s\n") % ' '.join(copies))
 
-        if extra and self.ui.debugflag:
-            for key, value in util.sort(extra.items()):
+        if ctx.extra() and self.ui.debugflag:
+            for key, value in util.sort(ctx.extra().items()):
                 self.ui.write(_("extra:       %s=%s\n")
                               % (key, value.encode('string_escape')))
 
-        description = changes[4].strip()
-        if description:
+        if ctx.description():
             if self.ui.verbose:
                 self.ui.write(_("description:\n"))
-                self.ui.write(description)
+                self.ui.write(ctx.description())
                 self.ui.write("\n\n")
             else:
                 self.ui.write(_("summary:     %s\n") %
-                              description.splitlines()[0])
+                              ctx.description().splitlines()[0])
         self.ui.write("\n")
 
-        self.showpatch(changenode)
+        self.showpatch(ctx)
 
-    def showpatch(self, node):
+    def showpatch(self, ctx):
         if self.patch:
-            prev = self.repo.changelog.parents(node)[0]
-            patch.diff(self.repo, prev, node, match=self.patch, fp=self.ui,
+            prev = ctx.parents()[0]
+            patch.diff(self.repo, prev.node(), ctx.node(), match=self.patch, fp=self.ui,
                        opts=patch.diffopts(self.ui))
             self.ui.write("\n")
 
-    def _meaningful_parentrevs(self, log, rev):
+    def _meaningful_parentrevs(self, ctx):
         """Return list of meaningful (or all if debug) parentrevs for rev.
 
         For merges (two non-nullrev revisions) both parents are meaningful.
         Otherwise the first parent revision is considered meaningful if it
         is not the preceding revision.
         """
-        parents = log.parentrevs(rev)
+        parents = self.repo.changelog.parentrevs(ctx.rev())
         if not self.ui.debugflag and parents[1] == nullrev:
-            if parents[0] >= rev - 1:
+            if parents[0] >= ctx.rev() - 1:
                 parents = []
             else:
                 parents = [parents[0]]
@@ -711,15 +702,8 @@
         '''set template string to use'''
         self.t.cache['changeset'] = t
 
-    def _show(self, rev, changenode, copies, props):
+    def _show(self, ctx, copies, props):
         '''show a single changeset or file revision'''
-        log = self.repo.changelog
-        if changenode is None:
-            changenode = log.node(rev)
-        elif not rev:
-            rev = log.rev(changenode)
-
-        changes = log.read(changenode)
 
         def showlist(name, values, plural=None, **args):
             '''expand set of values.
@@ -783,21 +767,21 @@
                 yield self.t(endname, **args)
 
         def showbranches(**args):
-            branch = changes[5].get("branch")
+            branch = ctx.branch()
             if branch != 'default':
                 branch = util.tolocal(branch)
                 return showlist('branch', [branch], plural='branches', **args)
 
         def showparents(**args):
-            parents = [[('rev', p), ('node', hex(log.node(p)))]
-                       for p in self._meaningful_parentrevs(log, rev)]
+            parents = [[('rev', p), ('node', hexfunc(self.repo.changelog.node(p)))]
+                       for p in self._meaningful_parentrevs(ctx)]
             return showlist('parent', parents, **args)
 
         def showtags(**args):
-            return showlist('tag', self.repo.nodetags(changenode), **args)
+            return showlist('tag', ctx.tags(), **args)
 
         def showextras(**args):
-            for key, value in util.sort(changes[5].items()):
+            for key, value in util.sort(ctx.extra().items()):
                 args = args.copy()
                 args.update(dict(key=key, value=value))
                 yield self.t('extra', **args)
@@ -810,10 +794,10 @@
         def getfiles():
             if not files:
                 files[:] = self.repo.status(
-                    log.parents(changenode)[0], changenode)[:3]
+                    ctx.parents()[0].node(), ctx.node())[:3]
             return files
         def showfiles(**args):
-            return showlist('file', changes[3], **args)
+            return showlist('file', ctx.files(), **args)
         def showmods(**args):
             return showlist('file_mod', getfiles()[0], **args)
         def showadds(**args):
@@ -822,24 +806,24 @@
             return showlist('file_del', getfiles()[2], **args)
         def showmanifest(**args):
             args = args.copy()
-            args.update(dict(rev=self.repo.manifest.rev(changes[0]),
-                             node=hex(changes[0])))
+            args.update(dict(rev=self.repo.manifest.rev(ctx.changeset()[0]),
+                             node=hex(ctx.changeset()[0])))
             return self.t('manifest', **args)
 
         defprops = {
-            'author': changes[1],
+            'author': ctx.user(),
             'branches': showbranches,
-            'date': changes[2],
-            'desc': changes[4].strip(),
+            'date': ctx.date(),
+            'desc': ctx.description().strip(),
             'file_adds': showadds,
             'file_dels': showdels,
             'file_mods': showmods,
             'files': showfiles,
             'file_copies': showcopies,
             'manifest': showmanifest,
-            'node': hex(changenode),
+            'node': ctx.hex(),
             'parents': showparents,
-            'rev': rev,
+            'rev': ctx.rev(),
             'tags': showtags,
             'extras': showextras,
             }
@@ -860,7 +844,7 @@
             if key:
                 h = templater.stringify(self.t(key, **props))
                 if self.buffered:
-                    self.header[rev] = h
+                    self.header[ctx.rev()] = h
                 else:
                     self.ui.write(h)
             if self.ui.debugflag and 'changeset_debug' in self.t:
@@ -872,7 +856,7 @@
             else:
                 key = 'changeset'
             self.ui.write(templater.stringify(self.t(key, **props)))
-            self.showpatch(changenode)
+            self.showpatch(ctx)
         except KeyError, inst:
             raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile,
                                                            inst.args[0]))


More information about the Mercurial-devel mailing list