Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/commands.py @ 3190:e18c3d08528d
Show copies in hg log.
The format is:
copies: destination (source)...
author | Brendan Cully <brendan@kublai.com> |
---|---|
date | Fri, 29 Sep 2006 13:01:19 -0700 |
parents | 182bdd589cbe |
children | a32f65549b9e |
comparison
equal
deleted
inserted
replaced
3189:f3b939444c72 | 3190:e18c3d08528d |
---|---|
310 | 310 |
311 def __init__(self, ui, repo): | 311 def __init__(self, ui, repo): |
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: |
319 changenode = log.node(rev) | 319 changenode = log.node(rev) |
320 elif not rev: | 320 elif not rev: |
357 files): | 357 files): |
358 if value: | 358 if value: |
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: |
365 if self.ui.verbose: | 368 if self.ui.verbose: |
366 self.ui.status(_("description:\n")) | 369 self.ui.status(_("description:\n")) |
1772 if limit <= 0: raise util.Abort(_('limit must be positive')) | 1775 if limit <= 0: raise util.Abort(_('limit must be positive')) |
1773 else: | 1776 else: |
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': |
1780 du = dui(ui) | 1817 du = dui(ui) |
1781 displayer.ui = du | 1818 displayer.ui = du |
1803 | 1840 |
1804 br = None | 1841 br = None |
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) |
1812 du.write("\n\n") | 1856 du.write("\n\n") |
1813 elif st == 'iter': | 1857 elif st == 'iter': |
2887 [('b', 'branches', None, _('show branches')), | 2931 [('b', 'branches', None, _('show branches')), |
2888 ('f', 'follow', None, | 2932 ('f', 'follow', None, |
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')), |
2895 ('M', 'no-merges', None, _('do not show merges')), | 2940 ('M', 'no-merges', None, _('do not show merges')), |
2896 ('', 'style', '', _('display using template map file')), | 2941 ('', 'style', '', _('display using template map file')), |