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