comparison contrib/hgit @ 349:b2293093b89e

Merged with mercurial-identify (which includes upstream's current tip) -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Merged with mercurial-identify (which includes upstream's current tip) manifest hash: b135d201757b84bbe7f14a446d2b001fd0cc1aa2 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFCr9mNW7P1GVgWeRoRAmTjAJ919wnvZXbKI27N0cDJCrumR3z4rQCcD6PO yZTmrT6p+gt6GBO+j5FVBn0= =HWn8 -----END PGP SIGNATURE-----
author Thomas Arendsen Hein <thomas@intevation.de>
date Wed, 15 Jun 2005 08:32:29 +0100
parents a69c3b2957d1 290574209284
children b4e0e20646bb
comparison
equal deleted inserted replaced
348:442eb02cf870 349:b2293093b89e
10 import time, sys, signal 10 import time, sys, signal
11 from mercurial import hg, mdiff, fancyopts, commands, ui 11 from mercurial import hg, mdiff, fancyopts, commands, ui
12 12
13 def difftree(args, repo): 13 def difftree(args, repo):
14 def __difftree(repo, files = None, node1 = None, node2 = None): 14 def __difftree(repo, files = None, node1 = None, node2 = None):
15 def date(c): 15 def date(c):
16 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) 16 return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
17 17
18 if node2: 18 if node2:
19 change = repo.changelog.read(node2) 19 change = repo.changelog.read(node2)
20 mmap2 = repo.manifest.read(change[0]) 20 mmap2 = repo.manifest.read(change[0])
21 (c, a, d) = repo.diffrevs(node1, node2) 21 (c, a, d) = repo.diffrevs(node1, node2)
22 def read(f): return repo.file(f).read(mmap2[f]) 22 def read(f): return repo.file(f).read(mmap2[f])
23 date2 = date(change) 23 date2 = date(change)
24 else: 24 else:
25 date2 = time.asctime() 25 date2 = time.asctime()
26 (c, a, d, u) = repo.diffdir(repo.root, node1) 26 (c, a, d, u) = repo.diffdir(repo.root, node1)
27 if not node1: 27 if not node1:
28 node1 = repo.dirstate.parents()[0] 28 node1 = repo.dirstate.parents()[0]
29 def read(f): return file(os.path.join(repo.root, f)).read() 29 def read(f): return file(os.path.join(repo.root, f)).read()
30 30
31 change = repo.changelog.read(node1) 31 change = repo.changelog.read(node1)
32 mmap = repo.manifest.read(change[0]) 32 mmap = repo.manifest.read(change[0])
33 date1 = date(change) 33 date1 = date(change)
34 empty = "0" * 40; 34 empty = "0" * 40;
35 35
36 if files: 36 if files:
37 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) 37 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
38 38
39 for f in c: 39 for f in c:
40 # TODO get file permissions 40 # TODO get file permissions
41 print ":100664 100664 %s %s %s %s" % (hg.hex(mmap[f]), 41 print ":100664 100664 %s %s %s %s" % (hg.hex(mmap[f]),
42 hg.hex(mmap2[f]), f, f) 42 hg.hex(mmap2[f]), f, f)
43 for f in a: 43 for f in a:
44 print ":000000 100664 %s %s %s %s" % (empty, hg.hex(mmap2[f]), f, f) 44 print ":000000 100664 %s %s %s %s" % (empty, hg.hex(mmap2[f]), f, f)
45 for f in d: 45 for f in d:
46 print ":100664 000000 %s %s %s %s" % (hg.hex(mmap[f]), empty, f, f) 46 print ":100664 000000 %s %s %s %s" % (hg.hex(mmap[f]), empty, f, f)
47 ## 47 ##
48 48
49 revs = [] 49 revs = []
50 if args: 50 if args:
51 doptions = {} 51 doptions = {}
52 opts = [('p', 'patch', None, 'patch'), 52 opts = [('p', 'patch', None, 'patch'),
53 ('r', 'recursive', None, 'recursive')] 53 ('r', 'recursive', None, 'recursive')]
54 args = fancyopts.fancyopts(args, opts, doptions, 54 args = fancyopts.fancyopts(args, opts, doptions,
55 'hg diff-tree [options] sha1 sha1') 55 'hg diff-tree [options] sha1 sha1')
56 56
57 if len(args) < 2: 57 if len(args) < 2:
58 help() 58 help()
59 sys.exit(1) 59 sys.exit(1)
60 revs.append(repo.lookup(args[0])) 60 revs.append(repo.lookup(args[0]))
61 revs.append(repo.lookup(args[1])) 61 revs.append(repo.lookup(args[1]))
62 args = args[2:] 62 args = args[2:]
63 if doptions['patch']: 63 if doptions['patch']:
64 commands.dodiff(repo, args, *revs) 64 commands.dodiff(repo, args, *revs)
65 else: 65 else:
66 __difftree(repo, args, *revs) 66 __difftree(repo, args, *revs)
67 67
68 def catcommit(repo, n, prefix): 68 def catcommit(repo, n, prefix):
69 nlprefix = '\n' + prefix; 69 nlprefix = '\n' + prefix;
70 changes = repo.changelog.read(n) 70 changes = repo.changelog.read(n)
71 (p1, p2) = repo.changelog.parents(n) 71 (p1, p2) = repo.changelog.parents(n)
78 date = int(float(date_ar[0])) 78 date = int(float(date_ar[0]))
79 print "%sauthor <%s> %s %s" % (prefix, changes[1], date, date_ar[1]) 79 print "%sauthor <%s> %s %s" % (prefix, changes[1], date, date_ar[1])
80 print "%scommitter <%s> %s %s" % (prefix, changes[1], date, date_ar[1]) 80 print "%scommitter <%s> %s %s" % (prefix, changes[1], date, date_ar[1])
81 print prefix 81 print prefix
82 if prefix != "": 82 if prefix != "":
83 print "%s%s" % (prefix, changes[4].replace('\n', nlprefix).strip()) 83 print "%s%s" % (prefix, changes[4].replace('\n', nlprefix).strip())
84 else: 84 else:
85 print changes[4] 85 print changes[4]
86 86
87 def catfile(args, ui, repo): 87 def catfile(args, ui, repo):
88 doptions = {} 88 doptions = {}
89 opts = [('s', 'stdin', None, 'stdin')] 89 opts = [('s', 'stdin', None, 'stdin')]
90 args = fancyopts.fancyopts(args, opts, doptions, 90 args = fancyopts.fancyopts(args, opts, doptions,
91 'hg cat-file type sha1') 91 'hg cat-file type sha1')
92 92
93 # in stdin mode, every line except the commit is prefixed with two 93 # in stdin mode, every line except the commit is prefixed with two
94 # spaces. This way the our caller can find the commit without magic 94 # spaces. This way the our caller can find the commit without magic
95 # strings 95 # strings
96 # 96 #
97 prefix = "" 97 prefix = ""
98 if doptions['stdin']: 98 if doptions['stdin']:
99 try: 99 try:
100 (type, r) = raw_input().split(' '); 100 (type, r) = raw_input().split(' ');
101 prefix = " " 101 prefix = " "
102 except EOFError: 102 except EOFError:
103 return 103 return
104 104
105 else: 105 else:
106 if len(args) < 2: 106 if len(args) < 2:
107 help() 107 help()
108 sys.exit(1) 108 sys.exit(1)
109 type = args[0] 109 type = args[0]
110 r = args[1] 110 r = args[1]
111 111
112 while r: 112 while r:
113 if type != "commit": 113 if type != "commit":
114 sys.stderr.write("aborting hg cat-file only understands commits\n") 114 sys.stderr.write("aborting hg cat-file only understands commits\n")
115 sys.exit(1); 115 sys.exit(1);
116 n = repo.changelog.lookup(r) 116 n = repo.changelog.lookup(r)
117 catcommit(repo, n, prefix) 117 catcommit(repo, n, prefix)
118 if doptions['stdin']: 118 if doptions['stdin']:
119 try: 119 try:
120 (type, r) = raw_input().split(' '); 120 (type, r) = raw_input().split(' ');
121 except EOFError: 121 except EOFError:
122 break 122 break
123 else: 123 else:
124 break 124 break
125 125
126 # git rev-tree is a confusing thing. You can supply a number of 126 # git rev-tree is a confusing thing. You can supply a number of
127 # commit sha1s on the command line, and it walks the commit history 127 # commit sha1s on the command line, and it walks the commit history
128 # telling you which commits are reachable from the supplied ones via 128 # telling you which commits are reachable from the supplied ones via
129 # a bitmask based on arg position. 129 # a bitmask based on arg position.
130 # you can specify a commit to stop at by starting the sha1 with ^ 130 # you can specify a commit to stop at by starting the sha1 with ^
131 def revtree(args, repo): 131 def revtree(args, repo):
132 # calculate and return the reachability bitmask for sha 132 # calculate and return the reachability bitmask for sha
133 def is_reachable(ar, reachable, sha): 133 def is_reachable(ar, reachable, sha):
134 if len(ar) == 0: 134 if len(ar) == 0:
135 return 1 135 return 1
136 mask = 0 136 mask = 0
137 for i in range(len(ar)): 137 for i in range(len(ar)):
138 if sha in reachable[i]: 138 if sha in reachable[i]:
139 mask |= 1 << i 139 mask |= 1 << i
140 140
141 return mask 141 return mask
142 142
143 reachable = [] 143 reachable = []
144 stop_sha1 = [] 144 stop_sha1 = []
145 want_sha1 = [] 145 want_sha1 = []
146 146
147 # figure out which commits they are asking for and which ones they 147 # figure out which commits they are asking for and which ones they
148 # want us to stop on 148 # want us to stop on
149 for i in range(len(args)): 149 for i in range(len(args)):
150 if args[i].count('^'): 150 if args[i].count('^'):
151 s = args[i].split('^')[1] 151 s = args[i].split('^')[1]
152 stop_sha1.append(repo.changelog.lookup(s)) 152 stop_sha1.append(repo.changelog.lookup(s))
153 want_sha1.append(s) 153 want_sha1.append(s)
154 elif args[i] != 'HEAD': 154 elif args[i] != 'HEAD':
155 want_sha1.append(args[i]) 155 want_sha1.append(args[i])
156 # calculate the graph for the supplied commits 156 # calculate the graph for the supplied commits
157 for i in range(len(want_sha1)): 157 for i in range(len(want_sha1)):
158 reachable.append({}); 158 reachable.append({});
159 n = repo.changelog.lookup(want_sha1[i]); 159 n = repo.changelog.lookup(want_sha1[i]);
160 visit = [n]; 160 visit = [n];
161 reachable[i][n] = 1 161 reachable[i][n] = 1
162 while visit: 162 while visit:
163 n = visit.pop(0) 163 n = visit.pop(0)
164 if n in stop_sha1: 164 if n in stop_sha1:
165 break 165 break
166 for p in repo.changelog.parents(n): 166 for p in repo.changelog.parents(n):
167 if p not in reachable[i]: 167 if p not in reachable[i]:
168 reachable[i][p] = 1 168 reachable[i][p] = 1
169 visit.append(p) 169 visit.append(p)
170 if p in stop_sha1: 170 if p in stop_sha1:
171 break 171 break
172 # walk the repository looking for commits that are in our 172 # walk the repository looking for commits that are in our
173 # reachability graph 173 # reachability graph
174 for i in range(repo.changelog.count()): 174 for i in range(repo.changelog.count()):
175 n = repo.changelog.node(i) 175 n = repo.changelog.node(i)
176 mask = is_reachable(want_sha1, reachable, n) 176 mask = is_reachable(want_sha1, reachable, n)
177 if mask: 177 if mask:
178 changes = repo.changelog.read(n) 178 changes = repo.changelog.read(n)
179 (p1, p2) = repo.changelog.parents(n) 179 (p1, p2) = repo.changelog.parents(n)
180 (h, h1, h2) = map(hg.hex, (n, p1, p2)) 180 (h, h1, h2) = map(hg.hex, (n, p1, p2))
181 (i1, i2) = map(repo.changelog.rev, (p1, p2)) 181 (i1, i2) = map(repo.changelog.rev, (p1, p2))
182 182
183 date = changes[2].split(' ')[0] 183 date = changes[2].split(' ')[0]
184 print "%s %s:%s" % (date, h, mask), 184 print "%s %s:%s" % (date, h, mask),
185 mask = is_reachable(want_sha1, reachable, p1) 185 mask = is_reachable(want_sha1, reachable, p1)
186 if i1 != -1 and mask > 0: 186 if i1 != -1 and mask > 0:
187 print "%s:%s " % (h1, mask), 187 print "%s:%s " % (h1, mask),
188 mask = is_reachable(want_sha1, reachable, p2) 188 mask = is_reachable(want_sha1, reachable, p2)
189 if i2 != -1 and mask > 0: 189 if i2 != -1 and mask > 0:
190 print "%s:%s " % (h2, mask), 190 print "%s:%s " % (h2, mask),
191 print "" 191 print ""
192 192
193 # git rev-list tries to order things by date, and has the ability to stop 193 # git rev-list tries to order things by date, and has the ability to stop
194 # at a given commit without walking the whole repo. TODO add the stop 194 # at a given commit without walking the whole repo. TODO add the stop
195 # parameter 195 # parameter
196 def revlist(args, repo): 196 def revlist(args, repo):
197 doptions = {} 197 doptions = {}
198 opts = [('c', 'commit', None, 'commit')] 198 opts = [('c', 'commit', None, 'commit')]
199 args = fancyopts.fancyopts(args, opts, doptions, 199 args = fancyopts.fancyopts(args, opts, doptions,
200 'hg rev-list') 200 'hg rev-list')
201 for i in range(repo.changelog.count()): 201 for i in range(repo.changelog.count()):
202 n = repo.changelog.node(i) 202 n = repo.changelog.node(i)
203 print hg.hex(n) 203 print hg.hex(n)
204 if doptions['commit']: 204 if doptions['commit']:
205 catcommit(repo, n, ' ') 205 catcommit(repo, n, ' ')
206 206
207 def catchterm(*args): 207 def catchterm(*args):
208 raise SignalInterrupt 208 raise SignalInterrupt
209 209
210 def help(): 210 def help():