59 to = repo.file(f).read(mmap[f]) |
59 to = repo.file(f).read(mmap[f]) |
60 tn = None |
60 tn = None |
61 fp.write("diff --git a/%s /dev/null\n" % (f)) |
61 fp.write("diff --git a/%s /dev/null\n" % (f)) |
62 fp.write(mdiff.unidiff(to, date1, tn, date2, f, None, opts=opts)) |
62 fp.write(mdiff.unidiff(to, date1, tn, date2, f, None, opts=opts)) |
63 |
63 |
64 def difftree(ui, repo, node1=None, node2=None, **opts): |
64 def difftree(ui, repo, node1=None, node2=None, *files, **opts): |
65 """diff trees from two commits""" |
65 """diff trees from two commits""" |
66 def __difftree(repo, node1, node2): |
66 def __difftree(repo, node1, node2, files=[]): |
67 def date(c): |
67 def date(c): |
68 return time.asctime(time.gmtime(c[2][0])) |
68 return time.asctime(time.gmtime(c[2][0])) |
69 |
69 |
70 if node2: |
70 if node2: |
71 change = repo.changelog.read(node2) |
71 change = repo.changelog.read(node2) |
72 mmap2 = repo.manifest.read(change[0]) |
72 mmap2 = repo.manifest.read(change[0]) |
73 modified, added, removed, deleted, unknown = repo.status(node1, node2)[:5] |
73 status = repo.status(node1, node2, files=files)[:5] |
|
74 modified, added, removed, deleted, unknown = status |
74 def read(f): return repo.file(f).read(mmap2[f]) |
75 def read(f): return repo.file(f).read(mmap2[f]) |
75 date2 = date(change) |
76 date2 = date(change) |
76 else: |
77 else: |
77 date2 = time.asctime() |
78 date2 = time.asctime() |
78 modified, added, removed, deleted, unknown = repo.status(node1)[:5] |
79 status = repo.status(node1, files=files)[:5] |
|
80 modified, added, removed, deleted, unknown = status |
79 if not node1: |
81 if not node1: |
80 node1 = repo.dirstate.parents()[0] |
82 node1 = repo.dirstate.parents()[0] |
81 def read(f): return file(os.path.join(repo.root, f)).read() |
83 def read(f): return file(os.path.join(repo.root, f)).read() |
82 |
84 |
83 change = repo.changelog.read(node1) |
85 change = repo.changelog.read(node1) |
118 node2 = node1 |
120 node2 = node1 |
119 node1 = repo.changelog.parents(node1)[0] |
121 node1 = repo.changelog.parents(node1)[0] |
120 if opts['patch']: |
122 if opts['patch']: |
121 if opts['pretty']: |
123 if opts['pretty']: |
122 catcommit(repo, node2, "") |
124 catcommit(repo, node2, "") |
123 dodiff(sys.stdout, ui, repo, node1, node2) |
125 dodiff(sys.stdout, ui, repo, node1, node2, files=files) |
124 else: |
126 else: |
125 __difftree(repo, node1, node2) |
127 __difftree(repo, node1, node2, files=files) |
126 if not opts['stdin']: |
128 if not opts['stdin']: |
127 break |
129 break |
128 |
130 |
129 def catcommit(repo, n, prefix, changes=None): |
131 def catcommit(repo, n, prefix, changes=None): |
130 nlprefix = '\n' + prefix; |
132 nlprefix = '\n' + prefix; |
330 ('r', 'recursive', None, 'recursive'), |
332 ('r', 'recursive', None, 'recursive'), |
331 ('P', 'pretty', None, 'pretty'), |
333 ('P', 'pretty', None, 'pretty'), |
332 ('s', 'stdin', None, 'stdin'), |
334 ('s', 'stdin', None, 'stdin'), |
333 ('C', 'copy', None, 'detect copies'), |
335 ('C', 'copy', None, 'detect copies'), |
334 ('S', 'search', "", 'search')], |
336 ('S', 'search', "", 'search')], |
335 "hg git-diff-tree [options] node1 node2"), |
337 "hg git-diff-tree [options] node1 node2 [files...]"), |
336 "debug-cat-file": (catfile, [('s', 'stdin', None, 'stdin')], |
338 "debug-cat-file": (catfile, [('s', 'stdin', None, 'stdin')], |
337 "hg debug-cat-file [options] type file"), |
339 "hg debug-cat-file [options] type file"), |
338 "debug-merge-base": (base, [], "hg debug-merge-base node node"), |
340 "debug-merge-base": (base, [], "hg debug-merge-base node node"), |
339 "debug-rev-list": (revlist, [('H', 'header', None, 'header'), |
341 "debug-rev-list": (revlist, [('H', 'header', None, 'header'), |
340 ('t', 'topo-order', None, 'topo-order'), |
342 ('t', 'topo-order', None, 'topo-order'), |