##// END OF EJS Templates
Show copies in hg log....
Brendan Cully -
r3197:e18c3d08 default
parent child Browse files
Show More
@@ -312,7 +312,7 b' class changeset_printer(object):'
312 self.ui = ui
312 self.ui = ui
313 self.repo = repo
313 self.repo = repo
314
314
315 def show(self, rev=0, changenode=None, brinfo=None):
315 def show(self, rev=0, changenode=None, brinfo=None, copies=None):
316 '''show a single changeset or file revision'''
316 '''show a single changeset or file revision'''
317 log = self.repo.changelog
317 log = self.repo.changelog
318 if changenode is None:
318 if changenode is None:
@@ -359,6 +359,9 b' class changeset_printer(object):'
359 self.ui.note("%-12s %s\n" % (key, " ".join(value)))
359 self.ui.note("%-12s %s\n" % (key, " ".join(value)))
360 else:
360 else:
361 self.ui.note(_("files: %s\n") % " ".join(changes[3]))
361 self.ui.note(_("files: %s\n") % " ".join(changes[3]))
362 if copies:
363 copies = ['%s (%s)' % c for c in copies]
364 self.ui.note(_("copies: %s\n") % ' '.join(copies))
362
365
363 description = changes[4].strip()
366 description = changes[4].strip()
364 if description:
367 if description:
@@ -1774,6 +1777,40 b' def log(ui, repo, *pats, **opts):'
1774 limit = sys.maxint
1777 limit = sys.maxint
1775 count = 0
1778 count = 0
1776
1779
1780 if opts['copies'] and opts['rev']:
1781 endrev = max([int(i)
1782 for i in cmdutil.revrange(ui, repo, opts['rev'])]) + 1
1783 else:
1784 endrev = repo.changelog.count()
1785 rcache = {}
1786 ncache = {}
1787 dcache = []
1788 def getrenamed(fn, rev, man):
1789 '''looks up all renames for a file (up to endrev) the first
1790 time the file is given. It indexes on the changerev and only
1791 parses the manifest if linkrev != changerev.
1792 Returns rename info for fn at changerev rev.'''
1793 if fn not in rcache:
1794 rcache[fn] = {}
1795 ncache[fn] = {}
1796 fl = repo.file(fn)
1797 for i in xrange(fl.count()):
1798 node = fl.node(i)
1799 lr = fl.linkrev(node)
1800 renamed = fl.renamed(node)
1801 rcache[fn][lr] = renamed
1802 if renamed:
1803 ncache[fn][node] = renamed
1804 if lr >= endrev:
1805 break
1806 if rev in rcache[fn]:
1807 return rcache[fn][rev]
1808 if not dcache or dcache[0] != man:
1809 dcache[:] = [man, repo.manifest.readdelta(man)]
1810 if fn in dcache[1]:
1811 return ncache[fn].get(dcache[1][fn])
1812 return None
1813
1777 displayer = show_changeset(ui, repo, opts)
1814 displayer = show_changeset(ui, repo, opts)
1778 for st, rev, fns in changeiter:
1815 for st, rev, fns in changeiter:
1779 if st == 'window':
1816 if st == 'window':
@@ -1805,7 +1842,14 b' def log(ui, repo, *pats, **opts):'
1805 if opts['branches']:
1842 if opts['branches']:
1806 br = repo.branchlookup([repo.changelog.node(rev)])
1843 br = repo.branchlookup([repo.changelog.node(rev)])
1807
1844
1808 displayer.show(rev, brinfo=br)
1845 copies = []
1846 if opts.get('copies') and rev:
1847 mf = getchange(rev)[0]
1848 for fn in getchange(rev)[3]:
1849 rename = getrenamed(fn, rev, mf)
1850 if rename:
1851 copies.append((fn, rename[0]))
1852 displayer.show(rev, brinfo=br, copies=copies)
1809 if opts['patch']:
1853 if opts['patch']:
1810 prev = (parents and parents[0]) or nullid
1854 prev = (parents and parents[0]) or nullid
1811 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
1855 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
@@ -2889,6 +2933,7 b' table = {'
2889 _('follow changeset history, or file history across copies and renames')),
2933 _('follow changeset history, or file history across copies and renames')),
2890 ('', 'follow-first', None,
2934 ('', 'follow-first', None,
2891 _('only follow the first parent of merge changesets')),
2935 _('only follow the first parent of merge changesets')),
2936 ('C', 'copies', None, _('show copied files')),
2892 ('k', 'keyword', [], _('search for a keyword')),
2937 ('k', 'keyword', [], _('search for a keyword')),
2893 ('l', 'limit', '', _('limit number of changes displayed')),
2938 ('l', 'limit', '', _('limit number of changes displayed')),
2894 ('r', 'rev', [], _('show the specified revision or range')),
2939 ('r', 'rev', [], _('show the specified revision or range')),
@@ -330,7 +330,8 b' class changeset_templater(object):'
330 def __init__(self, ui, repo, mapfile, dest=None):
330 def __init__(self, ui, repo, mapfile, dest=None):
331 self.t = templater(mapfile, common_filters,
331 self.t = templater(mapfile, common_filters,
332 cache={'parent': '{rev}:{node|short} ',
332 cache={'parent': '{rev}:{node|short} ',
333 'manifest': '{rev}:{node|short}'})
333 'manifest': '{rev}:{node|short}',
334 'filecopy': '{name} ({source})'})
334 self.ui = ui
335 self.ui = ui
335 self.dest = dest
336 self.dest = dest
336 self.repo = repo
337 self.repo = repo
@@ -355,7 +356,7 b' class changeset_templater(object):'
355 self.write(thing, header=True)
356 self.write(thing, header=True)
356
357
357 def show(self, rev=0, changenode=None, brinfo=None, changes=None,
358 def show(self, rev=0, changenode=None, brinfo=None, changes=None,
358 **props):
359 copies=None, **props):
359 '''show a single changeset or file revision'''
360 '''show a single changeset or file revision'''
360 log = self.repo.changelog
361 log = self.repo.changelog
361 if changenode is None:
362 if changenode is None:
@@ -472,6 +473,13 b' class changeset_templater(object):'
472 showadds = ''
473 showadds = ''
473 showdels = ''
474 showdels = ''
474
475
476 copies = [{'name': x[0], 'source': x[1]}
477 for x in copies]
478 def showcopies(**args):
479 for x in showlist('file_copy', copies, plural='file_copies',
480 **args):
481 yield x
482
475 defprops = {
483 defprops = {
476 'author': changes[1],
484 'author': changes[1],
477 'branches': showbranches,
485 'branches': showbranches,
@@ -480,6 +488,7 b' class changeset_templater(object):'
480 'file_adds': showadds,
488 'file_adds': showadds,
481 'file_dels': showdels,
489 'file_dels': showdels,
482 'files': showfiles,
490 'files': showfiles,
491 'file_copies': showcopies,
483 'manifest': showmanifest,
492 'manifest': showmanifest,
484 'node': hex(changenode),
493 'node': hex(changenode),
485 'parents': showparents,
494 'parents': showparents,
@@ -1,12 +1,15 b''
1 changeset = 'changeset: {rev}:{node|short}\n{tags}{short_parents}user: {author}\ndate: {date|date}\nsummary: {desc|firstline}\n\n'
1 changeset = 'changeset: {rev}:{node|short}\n{tags}{short_parents}user: {author}\ndate: {date|date}\nsummary: {desc|firstline}\n\n'
2 changeset_quiet = '{rev}:{node|short}\n'
2 changeset_quiet = '{rev}:{node|short}\n'
3 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'
3 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'
4 start_file_adds = 'files+: '
4 start_file_adds = 'files+: '
5 file_add = ' {file_add}'
5 file_add = ' {file_add}'
6 end_file_adds = '\n'
6 end_file_adds = '\n'
7 start_file_dels = 'files-: '
7 start_file_dels = 'files-: '
8 file_del = ' {file_del}'
8 file_del = ' {file_del}'
9 end_file_dels = '\n'
9 end_file_dels = '\n'
10 start_file_copies = 'copies: '
11 file_copy = ' {name} ({source})'
12 end_file_copies = '\n'
10 short_parent = 'parent: {rev}:{node|short}\n'
13 short_parent = 'parent: {rev}:{node|short}\n'
11 parent = 'parent: {rev}:{node}\n'
14 parent = 'parent: {rev}:{node}\n'
12 manifest = 'manifest: {rev}:{node}\n'
15 manifest = 'manifest: {rev}:{node}\n'
@@ -25,6 +25,7 b' header the global page header'
25 footer the global page footer
25 footer the global page footer
26
26
27 files a list of file links
27 files a list of file links
28 file_copies a list of pairs of name, source filenames
28 dirs a set of directory links
29 dirs a set of directory links
29 diff a diff of one or more files
30 diff a diff of one or more files
30 annotate an annotated file
31 annotate an annotated file
@@ -36,4 +37,4 b' Templates and commands:'
36 filenodelink - jump to file diff
37 filenodelink - jump to file diff
37 fileellipses - printed after maxfiles
38 fileellipses - printed after maxfiles
38 changelogentry - an entry in the log
39 changelogentry - an entry in the log
39 manifest - browse a manifest as a directory tree No newline at end of file
40 manifest - browse a manifest as a directory tree
@@ -29,6 +29,9 b' hg log -vf a'
29 echo % many renames
29 echo % many renames
30 hg log -vf e
30 hg log -vf e
31
31
32 echo % log copies
33 hg log -vC --template '{rev} {file_copies%filecopy}\n'
34
32 # log --follow tests
35 # log --follow tests
33 hg init ../follow
36 hg init ../follow
34 cd ../follow
37 cd ../follow
@@ -76,6 +76,12 b' description:'
76 a
76 a
77
77
78
78
79 % log copies
80 4 e (dir/b)
81 3 b (a)
82 2 dir/b (b)
83 1 b (a)
84 0
79 adding base
85 adding base
80 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
81 adding b1
87 adding b1
General Comments 0
You need to be logged in to leave comments. Login now