[PATCH 2 of 2] Show copies in hg log

Brendan Cully brendan at kublai.com
Fri Sep 22 23:55:59 UTC 2006


# HG changeset patch
# User Brendan Cully <brendan at kublai.com>
# Date 1158969086 25200
# Node ID 814d1b378b5590dc89ab4ad8e28f395986156cbb
# Parent  994d2702b2b4bb2ba6a36e9bf7740e5f0d2f26e5
Show copies in hg log.

The format is:
copies: destination (source)...

diff -r 994d2702b2b4 -r 814d1b378b55 mercurial/commands.py
--- a/mercurial/commands.py	Fri Sep 22 16:48:48 2006 -0700
+++ b/mercurial/commands.py	Fri Sep 22 16:51:26 2006 -0700
@@ -10,7 +10,7 @@ from i18n import gettext as _
 from i18n import gettext as _
 demandload(globals(), "os re sys signal shutil imp urllib pdb shlex")
 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo")
-demandload(globals(), "fnmatch difflib patch random signal tempfile time")
+demandload(globals(), "fnmatch difflib mdiff patch random signal tempfile time")
 demandload(globals(), "traceback errno socket version struct atexit sets bz2")
 demandload(globals(), "archival cStringIO changegroup")
 demandload(globals(), "cmdutil hgweb.server sshserver")
@@ -312,7 +312,7 @@ class changeset_printer(object):
         self.ui = ui
         self.repo = repo
 
-    def show(self, rev=0, changenode=None, brinfo=None):
+    def show(self, rev=0, changenode=None, brinfo=None, copies=None):
         '''show a single changeset or file revision'''
         log = self.repo.changelog
         if changenode is None:
@@ -359,6 +359,9 @@ class changeset_printer(object):
                     self.ui.note("%-12s %s\n" % (key, " ".join(value)))
         else:
             self.ui.note(_("files:       %s\n") % " ".join(changes[3]))
+        if copies:
+            copies = ['%s (%s)' % c for c in copies]
+            self.ui.note(_("copies:      %s\n") % ' '.join(copies))
 
         description = changes[4].strip()
         if description:
@@ -1757,6 +1760,8 @@ def log(ui, repo, *pats, **opts):
         limit = sys.maxint
     count = 0
 
+    getfile = util.cachefunc(lambda x: repo.file(x))
+
     displayer = show_changeset(ui, repo, opts)
     for st, rev, fns in changeiter:
         if st == 'window':
@@ -1788,7 +1793,15 @@ def log(ui, repo, *pats, **opts):
             if opts['branches']:
                 br = repo.branchlookup([repo.changelog.node(rev)])
 
-            displayer.show(rev, brinfo=br)
+            copies = []
+            if opts.get('copies'):
+                # this is about twice as fast as repo.manifest.find
+                mf = getchange(rev)[0]
+                for fn, n in repo.manifest.readdelta(mf).iteritems():
+                    rename = getfile(fn).renamed(n)
+                    if rename:
+                        copies.append((fn, rename[0]))
+            displayer.show(rev, brinfo=br, copies=copies)
             if opts['patch']:
                 prev = (parents and parents[0]) or nullid
                 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
@@ -2864,6 +2877,7 @@ table = {
            _('follow changeset history, or file history across copies and renames')),
           ('', 'follow-first', None,
            _('only follow the first parent of merge changesets')),
+          ('C', 'copies', None, _('show copied files')),
           ('k', 'keyword', [], _('search for a keyword')),
           ('l', 'limit', '', _('limit number of changes displayed')),
           ('r', 'rev', [], _('show the specified revision or range')),
diff -r 994d2702b2b4 -r 814d1b378b55 mercurial/templater.py
--- a/mercurial/templater.py	Fri Sep 22 16:48:48 2006 -0700
+++ b/mercurial/templater.py	Fri Sep 22 16:51:26 2006 -0700
@@ -355,7 +355,7 @@ class changeset_templater(object):
         self.write(thing, header=True)
 
     def show(self, rev=0, changenode=None, brinfo=None, changes=None,
-             **props):
+             copies=None, **props):
         '''show a single changeset or file revision'''
         log = self.repo.changelog
         if changenode is None:
@@ -472,6 +472,13 @@ class changeset_templater(object):
             showadds = ''
             showdels = ''
 
+        copies = [{'name': x[0], 'source': x[1]}
+                  for x in copies]
+        def showcopies(**args):
+            for x in showlist('file_copy', copies, plural='file_copies',
+                              **args):
+                yield x
+
         defprops = {
             'author': changes[1],
             'branches': showbranches,
@@ -480,6 +487,7 @@ class changeset_templater(object):
             'file_adds': showadds,
             'file_dels': showdels,
             'files': showfiles,
+            'file_copies': showcopies,
             'manifest': showmanifest,
             'node': hex(changenode),
             'parents': showparents,
diff -r 994d2702b2b4 -r 814d1b378b55 templates/map-cmdline.default
--- a/templates/map-cmdline.default	Fri Sep 22 16:48:48 2006 -0700
+++ b/templates/map-cmdline.default	Fri Sep 22 16:51:26 2006 -0700
@@ -1,12 +1,15 @@ changeset = 'changeset:   {rev}:{node|sh
 changeset = 'changeset:   {rev}:{node|short}\n{tags}{short_parents}user:        {author}\ndate:        {date|date}\nsummary:     {desc|firstline}\n\n'
 changeset_quiet = '{rev}:{node|short}\n'
-changeset_verbose = 'changeset:   {rev}:{node}\n{tags}{parents}{manifest}user:        {author}\ndate:        {date|date}\nfiles:       {files}\n{file_adds}{file_dels}description:\n{desc|strip}\n\n\n'
+changeset_verbose = 'changeset:   {rev}:{node}\n{tags}{parents}{manifest}user:        {author}\ndate:        {date|date}\nfiles:       {files}\n{file_adds}{file_dels}{file_copies}description:\n{desc|strip}\n\n\n'
 start_file_adds = 'files+:     '
 file_add = ' {file_add}'
 end_file_adds = '\n'
 start_file_dels = 'files-:     '
 file_del = ' {file_del}'
 end_file_dels = '\n'
+start_file_copies = 'copies:     '
+file_copy = ' {name} ({source})'
+end_file_copies = '\n'
 short_parent = 'parent:      {rev}:{node|short}\n'
 parent = 'parent:      {rev}:{node}\n'
 manifest = 'manifest:    {rev}:{node}\n'
diff -r 994d2702b2b4 -r 814d1b378b55 templates/template-vars.txt
--- a/templates/template-vars.txt	Fri Sep 22 16:48:48 2006 -0700
+++ b/templates/template-vars.txt	Fri Sep 22 16:51:26 2006 -0700
@@ -25,6 +25,7 @@ footer        the global page footer
 footer        the global page footer
 
 files         a list of file links
+file_copies   a list of pairs of name, source filenames
 dirs          a set of directory links
 diff          a diff of one or more files
 annotate      an annotated file
@@ -36,4 +37,4 @@ Templates and commands:
     filenodelink - jump to file diff
     fileellipses - printed after maxfiles
     changelogentry - an entry in the log
-  manifest - browse a manifest as a directory tree
\ No newline at end of file
+  manifest - browse a manifest as a directory tree



More information about the Mercurial mailing list