[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