comparison mercurial/commands.py @ 396:8f8bb77d560e

Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli. Changes from the original patch: - - Use 'diff -r ...' instead of 'hg diff -r ...' to support filetype detection by at least file(1) and vim. - - Adjusted tests for this change. - - Some cleanups. manifest hash: 5f37d1ef75ea7f4e48b53f02371053ba54fb70f8 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFCsyZzW7P1GVgWeRoRAqczAJ479lR9Z289sP+VH5L+N7pQRU14SACfUueq 88ABloIR3VyRIa4qbujnZio= =Vva9 -----END PGP SIGNATURE-----
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 17 Jun 2005 20:37:23 +0100
parents fbe8834923c5
children af4848f83e68 25afb21d97ba
comparison
equal deleted inserted replaced
395:fbe8834923c5 396:8f8bb77d560e
30 if os.getcwd() != repo.root: 30 if os.getcwd() != repo.root:
31 p = os.getcwd()[len(repo.root) + 1: ] 31 p = os.getcwd()[len(repo.root) + 1: ]
32 return [ os.path.normpath(os.path.join(p, x)) for x in args ] 32 return [ os.path.normpath(os.path.join(p, x)) for x in args ]
33 return args 33 return args
34 34
35 def dodiff(repo, path, files = None, node1 = None, node2 = None): 35 def dodiff(ui, repo, path, files = None, node1 = None, node2 = None):
36 def date(c): 36 def date(c):
37 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) 37 return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
38 38
39 if node2: 39 if node2:
40 change = repo.changelog.read(node2) 40 change = repo.changelog.read(node2)
47 (c, a, d, u) = repo.diffdir(path, node1) 47 (c, a, d, u) = repo.diffdir(path, node1)
48 if not node1: 48 if not node1:
49 node1 = repo.dirstate.parents()[0] 49 node1 = repo.dirstate.parents()[0]
50 def read(f): return file(os.path.join(repo.root, f)).read() 50 def read(f): return file(os.path.join(repo.root, f)).read()
51 51
52 if ui.quiet:
53 r = None
54 else:
55 hexfunc = ui.verbose and hg.hex or hg.short
56 r = [hexfunc(node) for node in [node1, node2] if node]
57
52 change = repo.changelog.read(node1) 58 change = repo.changelog.read(node1)
53 mmap = repo.manifest.read(change[0]) 59 mmap = repo.manifest.read(change[0])
54 date1 = date(change) 60 date1 = date(change)
55 61
56 if files: 62 if files:
59 for f in c: 65 for f in c:
60 to = None 66 to = None
61 if f in mmap: 67 if f in mmap:
62 to = repo.file(f).read(mmap[f]) 68 to = repo.file(f).read(mmap[f])
63 tn = read(f) 69 tn = read(f)
64 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) 70 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r))
65 for f in a: 71 for f in a:
66 to = None 72 to = None
67 tn = read(f) 73 tn = read(f)
68 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) 74 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r))
69 for f in d: 75 for f in d:
70 to = repo.file(f).read(mmap[f]) 76 to = repo.file(f).read(mmap[f])
71 tn = None 77 tn = None
72 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) 78 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r))
73 79
74 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None): 80 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None):
75 """show a single changeset or file revision""" 81 """show a single changeset or file revision"""
76 changelog = repo.changelog 82 changelog = repo.changelog
77 if filelog: 83 if filelog:
288 def diff(ui, repo, *files, **opts): 294 def diff(ui, repo, *files, **opts):
289 """diff working directory (or selected files)""" 295 """diff working directory (or selected files)"""
290 revs = [] 296 revs = []
291 if opts['rev']: 297 if opts['rev']:
292 revs = map(lambda x: repo.lookup(x), opts['rev']) 298 revs = map(lambda x: repo.lookup(x), opts['rev'])
293 299
294 if len(revs) > 2: 300 if len(revs) > 2:
295 self.ui.warn("too many revisions to diff\n") 301 self.ui.warn("too many revisions to diff\n")
296 sys.exit(1) 302 sys.exit(1)
297 303
298 if files: 304 if files:
299 files = relpath(repo, files) 305 files = relpath(repo, files)
300 else: 306 else:
301 files = relpath(repo, [""]) 307 files = relpath(repo, [""])
302 308
303 dodiff(repo, os.getcwd(), files, *revs) 309 dodiff(ui, repo, os.getcwd(), files, *revs)
304 310
305 def export(ui, repo, changeset): 311 def export(ui, repo, changeset):
306 """dump the changeset header and diffs for a revision""" 312 """dump the changeset header and diffs for a revision"""
307 node = repo.lookup(changeset) 313 node = repo.lookup(changeset)
308 prev, other = repo.changelog.parents(node) 314 prev, other = repo.changelog.parents(node)
314 print 320 print
315 if other != hg.nullid: 321 if other != hg.nullid:
316 print "# Parent %s" % hg.hex(other) 322 print "# Parent %s" % hg.hex(other)
317 print change[4].rstrip() 323 print change[4].rstrip()
318 print 324 print
319 325
320 dodiff(repo, "", None, prev, node) 326 dodiff(ui, repo, "", None, prev, node)
321 327
322 def forget(ui, repo, file, *files): 328 def forget(ui, repo, file, *files):
323 """don't add the specified files on the next commit""" 329 """don't add the specified files on the next commit"""
324 repo.forget(relpath(repo, (file,) + files)) 330 repo.forget(relpath(repo, (file,) + files))
325 331