Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/commands.py @ 333:d60a3060f9e2
hg rawcommit: fix files arg conflict
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
hg rawcommit: fix files arg conflict
I try to sync with tip again. I found out the raw commit is broken for me
because the keyword "files" is list as named argument as well so it will
not show up in the rc dictionary. Here is my quick fix to make it work
with my script again.
Chris
manifest hash: 10f85636e02cb4b19b319b7ebbfd2ec5096c3a6d
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCr1HSywK+sNU5EO8RArWMAJoD67SPN4QJcVaHBVh9FiNXWy80FQCePpA/
BZ63h+bqXESeMMLb7Kh5ytA=
=69X0
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Tue, 14 Jun 2005 13:53:22 -0800 |
parents | 27d08c0c2a7e |
children | 74b9332faece |
rev | line source |
---|---|
249 | 1 # commands.py - command processing for mercurial |
2 # | |
3 # Copyright 2005 Matt Mackall <mpm@selenic.com> | |
4 # | |
5 # This software may be used and distributed according to the terms | |
6 # of the GNU General Public License, incorporated herein by reference. | |
7 | |
262 | 8 import os, re, sys, signal |
9 import fancyopts, ui, hg | |
10 from demandload import * | |
319 | 11 demandload(globals(), "mdiff time hgweb traceback random signal") |
209 | 12 |
13 class UnknownCommand(Exception): pass | |
14 | |
245 | 15 def filterfiles(filters, files): |
16 l = [ x for x in files if x in filters ] | |
213 | 17 |
245 | 18 for t in filters: |
19 if t and t[-1] != os.sep: t += os.sep | |
20 l += [ x for x in files if x.startswith(t) ] | |
213 | 21 return l |
22 | |
245 | 23 def relfilter(repo, files): |
213 | 24 if os.getcwd() != repo.root: |
25 p = os.getcwd()[len(repo.root) + 1: ] | |
281 | 26 return filterfiles([p], files) |
245 | 27 return files |
213 | 28 |
209 | 29 def relpath(repo, args): |
30 if os.getcwd() != repo.root: | |
31 p = os.getcwd()[len(repo.root) + 1: ] | |
245 | 32 return [ os.path.normpath(os.path.join(p, x)) for x in args ] |
209 | 33 return args |
245 | 34 |
312 | 35 def dodiff(repo, path, files = None, node1 = None, node2 = None): |
245 | 36 def date(c): |
37 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) | |
38 | |
39 if node2: | |
40 change = repo.changelog.read(node2) | |
41 mmap2 = repo.manifest.read(change[0]) | |
42 (c, a, d) = repo.diffrevs(node1, node2) | |
43 def read(f): return repo.file(f).read(mmap2[f]) | |
44 date2 = date(change) | |
45 else: | |
46 date2 = time.asctime() | |
312 | 47 (c, a, d, u) = repo.diffdir(path, node1) |
245 | 48 if not node1: |
49 node1 = repo.dirstate.parents()[0] | |
50 def read(f): return file(os.path.join(repo.root, f)).read() | |
51 | |
52 change = repo.changelog.read(node1) | |
53 mmap = repo.manifest.read(change[0]) | |
54 date1 = date(change) | |
55 | |
56 if files: | |
57 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) | |
58 | |
59 for f in c: | |
275 | 60 to = None |
61 if f in mmap: | |
62 to = repo.file(f).read(mmap[f]) | |
245 | 63 tn = read(f) |
64 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) | |
65 for f in a: | |
264
4c1d7072d5cd
Attempt to make diff deal with null sources properly
mpm@selenic.com
parents:
262
diff
changeset
|
66 to = None |
245 | 67 tn = read(f) |
68 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) | |
69 for f in d: | |
70 to = repo.file(f).read(mmap[f]) | |
264
4c1d7072d5cd
Attempt to make diff deal with null sources properly
mpm@selenic.com
parents:
262
diff
changeset
|
71 tn = None |
245 | 72 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
73 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
74 def show_changeset(ui, repo, rev=0, changenode=None, filelog=None): |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
75 """show a single changeset or file revision""" |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
76 changelog = repo.changelog |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
77 if filelog: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
78 log = filelog |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
79 filerev = rev |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
80 node = filenode = filelog.node(filerev) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
81 changerev = filelog.linkrev(filenode) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
82 changenode = changenode or changelog.node(changerev) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
83 else: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
84 changerev = rev |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
85 log = changelog |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
86 if changenode is None: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
87 changenode = changelog.node(changerev) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
88 elif not changerev: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
89 rev = changerev = changelog.rev(changenode) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
90 node = changenode |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
91 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
92 if ui.quiet: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
93 ui.write("%d:%s\n" % (rev, hg.hex(node))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
94 return |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
95 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
96 changes = changelog.read(changenode) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
97 description = changes[4].strip().splitlines() |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
98 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
99 parents = [(log.rev(parent), hg.hex(parent)) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
100 for parent in log.parents(node) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
101 if ui.debugflag or parent != hg.nullid] |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
102 if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
103 parents = [] |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
104 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
105 if filelog: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
106 ui.write("revision: %d:%s\n" % (filerev, hg.hex(filenode))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
107 for parent in parents: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
108 ui.write("parent: %d:%s\n" % parent) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
109 ui.status("changeset: %d:%s\n" % (changerev, hg.hex(changenode))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
110 else: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
111 ui.write("changeset: %d:%s\n" % (changerev, hg.hex(changenode))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
112 for parent in parents: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
113 ui.write("parent: %d:%s\n" % parent) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
114 ui.note("manifest: %d:%s\n" % (repo.manifest.rev(changes[0]), |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
115 hg.hex(changes[0]))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
116 ui.status("user: %s\n" % changes[1]) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
117 ui.status("date: %s\n" % time.asctime( |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
118 time.localtime(float(changes[2].split(' ')[0])))) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
119 ui.note("files: %s\n" % " ".join(changes[3])) |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
120 if description: |
330 | 121 if ui.verbose: |
122 ui.status("description:\n") | |
123 ui.status(changes[4].strip()) | |
124 ui.status("\n") | |
125 else: | |
126 ui.status("summary: %s\n" % description[0]) | |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
127 ui.status("\n") |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
128 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
129 def help(ui, cmd=None): |
255 | 130 '''show help for a given command or all commands''' |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
131 if cmd: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
132 try: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
133 i = find(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
134 ui.write("%s\n\n" % i[2]) |
293 | 135 |
136 if i[1]: | |
137 for s, l, d, c in i[1]: | |
138 opt=' ' | |
139 if s: opt = opt + '-' + s + ' ' | |
140 if l: opt = opt + '--' + l + ' ' | |
141 if d: opt = opt + '(' + str(d) + ')' | |
142 ui.write(opt, "\n") | |
143 if c: ui.write(' %s\n' % c) | |
144 ui.write("\n") | |
145 | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
146 ui.write(i[0].__doc__, "\n") |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
147 except UnknownCommand: |
268 | 148 ui.warn("hg: unknown command %s\n" % cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
149 sys.exit(0) |
255 | 150 else: |
151 ui.status('hg commands:\n\n') | |
209 | 152 |
255 | 153 h = {} |
154 for e in table.values(): | |
155 f = e[0] | |
156 if f.__name__.startswith("debug"): continue | |
157 d = "" | |
158 if f.__doc__: | |
159 d = f.__doc__.splitlines(0)[0].rstrip() | |
160 h[f.__name__] = d | |
161 | |
162 fns = h.keys() | |
163 fns.sort() | |
164 m = max(map(len, fns)) | |
165 for f in fns: | |
166 ui.status(' %-*s %s\n' % (m, f, h[f])) | |
167 | |
168 # Commands start here, listed alphabetically | |
209 | 169 |
245 | 170 def add(ui, repo, file, *files): |
171 '''add the specified files on the next commit''' | |
172 repo.add(relpath(repo, (file,) + files)) | |
213 | 173 |
245 | 174 def addremove(ui, repo): |
255 | 175 """add all new files, delete all missing files""" |
230 | 176 (c, a, d, u) = repo.diffdir(repo.root) |
259 | 177 repo.add(u) |
245 | 178 repo.remove(d) |
219
8ff4532376a4
hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents:
214
diff
changeset
|
179 |
245 | 180 def annotate(u, repo, file, *files, **ops): |
255 | 181 """show changeset information per file line""" |
209 | 182 def getnode(rev): |
183 return hg.short(repo.changelog.node(rev)) | |
184 | |
185 def getname(rev): | |
186 try: | |
187 return bcache[rev] | |
188 except KeyError: | |
189 cl = repo.changelog.read(repo.changelog.node(rev)) | |
190 name = cl[1] | |
191 f = name.find('@') | |
192 if f >= 0: | |
193 name = name[:f] | |
194 bcache[rev] = name | |
195 return name | |
196 | |
197 bcache = {} | |
198 opmap = [['user', getname], ['number', str], ['changeset', getnode]] | |
199 if not ops['user'] and not ops['changeset']: | |
200 ops['number'] = 1 | |
201 | |
227 | 202 node = repo.dirstate.parents()[0] |
209 | 203 if ops['revision']: |
204 node = repo.changelog.lookup(ops['revision']) | |
205 change = repo.changelog.read(node) | |
206 mmap = repo.manifest.read(change[0]) | |
207 maxuserlen = 0 | |
208 maxchangelen = 0 | |
245 | 209 for f in relpath(repo, (file,) + files): |
209 | 210 lines = repo.file(f).annotate(mmap[f]) |
211 pieces = [] | |
212 | |
213 for o, f in opmap: | |
214 if ops[o]: | |
215 l = [ f(n) for n,t in lines ] | |
216 m = max(map(len, l)) | |
217 pieces.append([ "%*s" % (m, x) for x in l]) | |
218 | |
219 for p,l in zip(zip(*pieces), lines): | |
220 u.write(" ".join(p) + ": " + l[1]) | |
221 | |
248 | 222 def cat(ui, repo, file, rev = []): |
255 | 223 """output the latest or given revision of a file""" |
281 | 224 r = repo.file(relpath(repo, [file])[0]) |
248 | 225 n = r.tip() |
226 if rev: n = r.lookup(rev) | |
227 sys.stdout.write(r.read(n)) | |
228 | |
289 | 229 def commit(ui, repo, *files, **opts): |
245 | 230 """commit the specified files or all outstanding changes""" |
289 | 231 text = opts['text'] |
232 if not text and opts['logfile']: | |
233 try: text = open(opts['logfile']).read() | |
234 except IOError: pass | |
235 | |
317 | 236 repo.commit(relpath(repo, files), text, opts['user'], opts['date']) |
245 | 237 |
248 | 238 def debugaddchangegroup(ui, repo): |
239 data = sys.stdin.read() | |
240 repo.addchangegroup(data) | |
241 | |
242 def debugchangegroup(ui, repo, roots): | |
243 newer = repo.newer(map(repo.lookup, roots)) | |
244 for chunk in repo.changegroup(newer): | |
245 sys.stdout.write(chunk) | |
246 | |
247 def debugindex(ui, file): | |
248 r = hg.revlog(open, file, "") | |
249 print " rev offset length base linkrev"+\ | |
250 " p1 p2 nodeid" | |
251 for i in range(r.count()): | |
252 e = r.index[i] | |
253 print "% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s.." % ( | |
254 i, e[0], e[1], e[2], e[3], | |
255 hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5])) | |
256 | |
257 def debugindexdot(ui, file): | |
258 r = hg.revlog(open, file, "") | |
259 print "digraph G {" | |
260 for i in range(r.count()): | |
261 e = r.index[i] | |
262 print "\t%d -> %d" % (r.rev(e[4]), i) | |
263 if e[5] != hg.nullid: | |
264 print "\t%d -> %d" % (r.rev(e[5]), i) | |
265 print "}" | |
266 | |
245 | 267 def diff(ui, repo, *files, **opts): |
255 | 268 """diff working directory (or selected files)""" |
245 | 269 revs = [] |
270 if opts['rev']: | |
271 revs = map(lambda x: repo.lookup(x), opts['rev']) | |
272 | |
273 if len(revs) > 2: | |
274 self.ui.warn("too many revisions to diff\n") | |
275 sys.exit(1) | |
276 | |
277 if files: | |
278 files = relpath(repo, files) | |
279 else: | |
280 files = relpath(repo, [""]) | |
281 | |
312 | 282 dodiff(repo, os.getcwd(), files, *revs) |
245 | 283 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
284 def export(ui, repo, changeset): |
255 | 285 """dump the changeset header and diffs for a revision""" |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
286 node = repo.lookup(changeset) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
287 prev, other = repo.changelog.parents(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
288 change = repo.changelog.read(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
289 print "# HG changeset patch" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
290 print "# User %s" % change[1] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
291 print "# Node ID %s" % hg.hex(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
292 print "# Parent %s" % hg.hex(prev) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
293 print |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
294 if other != hg.nullid: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
295 print "# Parent %s" % hg.hex(other) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
296 print change[4].rstrip() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
297 print |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
298 |
312 | 299 dodiff(repo, "", None, prev, node) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
300 |
245 | 301 def forget(ui, repo, file, *files): |
302 """don't add the specified files on the next commit""" | |
303 repo.forget(relpath(repo, (file,) + files)) | |
304 | |
221 | 305 def heads(ui, repo): |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
306 """show current repository heads""" |
221 | 307 for n in repo.changelog.heads(): |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
308 show_changeset(ui, repo, changenode=n) |
221 | 309 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
310 def history(ui, repo): |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
311 """show the changelog history""" |
270
5a80ed2158c8
Reverse order of hg log and hg history lists
mpm@selenic.com
parents:
268
diff
changeset
|
312 for i in range(repo.changelog.count() - 1, -1, -1): |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
313 show_changeset(ui, repo, rev=i) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
314 |
290 | 315 def init(ui, source=None): |
316 """create a new repository or copy an existing one""" | |
317 | |
318 if source: | |
319 paths = {} | |
320 for name, path in ui.configitems("paths"): | |
321 paths[name] = path | |
322 | |
323 if source in paths: source = paths[source] | |
255 | 324 |
290 | 325 link = 0 |
326 if not source.startswith("http://"): | |
327 d1 = os.stat(os.getcwd()).st_dev | |
328 d2 = os.stat(source).st_dev | |
329 if d1 == d2: link = 1 | |
330 | |
331 if link: | |
332 ui.debug("copying by hardlink\n") | |
333 os.system("cp -al %s/.hg .hg" % source) | |
300 | 334 try: |
335 os.remove(".hg/dirstate") | |
336 except: pass | |
290 | 337 else: |
338 repo = hg.repository(ui, ".", create=1) | |
339 other = hg.repository(ui, source) | |
340 cg = repo.getchangegroup(other) | |
341 repo.addchangegroup(cg) | |
342 else: | |
343 hg.repository(ui, ".", create=1) | |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
344 |
255 | 345 def log(ui, repo, f): |
346 """show the revision history of a single file""" | |
347 f = relpath(repo, [f])[0] | |
348 | |
349 r = repo.file(f) | |
270
5a80ed2158c8
Reverse order of hg log and hg history lists
mpm@selenic.com
parents:
268
diff
changeset
|
350 for i in range(r.count() - 1, -1, -1): |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
351 show_changeset(ui, repo, filelog=r, rev=i) |
255 | 352 |
353 def manifest(ui, repo, rev = []): | |
354 """output the latest or given revision of the project manifest""" | |
355 n = repo.manifest.tip() | |
356 if rev: | |
357 n = repo.manifest.lookup(rev) | |
358 m = repo.manifest.read(n) | |
276 | 359 mf = repo.manifest.readflags(n) |
255 | 360 files = m.keys() |
361 files.sort() | |
362 | |
363 for f in files: | |
276 | 364 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f)) |
255 | 365 |
366 def parents(ui, repo, node = None): | |
367 '''show the parents of the current working dir''' | |
368 if node: | |
369 p = repo.changelog.parents(repo.lookup(hg.bin(node))) | |
370 else: | |
371 p = repo.dirstate.parents() | |
372 | |
373 for n in p: | |
374 if n != hg.nullid: | |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
375 show_changeset(ui, repo, changenode=n) |
255 | 376 |
294
f8d56da6ac8f
hg patch: fix to actually take a list of patches
mpm@selenic.com
parents:
293
diff
changeset
|
377 def patch(ui, repo, patch1, *patches, **opts): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
378 """import an ordered set of patches""" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
379 try: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
380 import psyco |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
381 psyco.full() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
382 except: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
383 pass |
294
f8d56da6ac8f
hg patch: fix to actually take a list of patches
mpm@selenic.com
parents:
293
diff
changeset
|
384 |
295 | 385 patches = (patch1,) + patches |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
386 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
387 d = opts["base"] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
388 strip = opts["strip"] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
389 quiet = opts["quiet"] and "> /dev/null" or "" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
390 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
391 for patch in patches: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
392 ui.status("applying %s\n" % patch) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
393 pf = os.path.join(d, patch) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
394 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
395 text = "" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
396 for l in file(pf): |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
397 if l[:4] == "--- ": break |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
398 text += l |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
399 |
310 | 400 # make sure text isn't empty |
401 if not text: text = "imported patch %s\n" % patch | |
402 | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
403 f = os.popen("lsdiff --strip %d %s" % (strip, pf)) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
404 files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines())) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
405 f.close() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
406 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
407 if files: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
408 if os.system("patch -p%d < %s %s" % (strip, pf, quiet)): |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
409 raise "patch failed!" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
410 repo.commit(files, text) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
411 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
412 def pull(ui, repo, source): |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
413 """pull changes from the specified source""" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
414 paths = {} |
286 | 415 for name, path in ui.configitems("paths"): |
290 | 416 paths[name] = path |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
417 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
418 if source in paths: source = paths[source] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
419 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
420 other = hg.repository(ui, source) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
421 cg = repo.getchangegroup(other) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
422 repo.addchangegroup(cg) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
423 |
319 | 424 def push(ui, repo, dest): |
425 """push changes to the specified destination""" | |
426 paths = {} | |
427 for name, path in ui.configitems("paths"): | |
428 paths[name] = path | |
429 | |
430 if dest in paths: dest = paths[dest] | |
431 | |
432 if not dest.startswith("ssh://"): | |
433 ui.warn("abort: can only push to ssh:// destinations currently\n") | |
434 return 1 | |
435 | |
436 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) | |
437 if not m: | |
438 ui.warn("abort: couldn't parse destination %s\n" % dest) | |
439 return 1 | |
440 | |
441 user, host, port, path = map(m.group, (2, 3, 5, 7)) | |
442 host = user and ("%s@%s" % (user, host)) or host | |
443 port = port and (" -p %s") % port or "" | |
444 path = path or "" | |
445 | |
446 sport = random.randrange(30000, 60000) | |
447 cmd = "ssh %s%s -R %d:localhost:%d 'cd %s; hg pull http://localhost:%d/'" | |
448 cmd = cmd % (host, port, sport+1, sport, path, sport+1) | |
449 | |
450 child = os.fork() | |
451 if not child: | |
452 sys.stdout = file("/dev/null", "w") | |
453 sys.stderr = sys.stdout | |
454 hgweb.server(repo.root, "pull", "", "localhost", sport) | |
455 else: | |
456 r = os.system(cmd) | |
457 os.kill(child, signal.SIGTERM) | |
320 | 458 return r |
319 | 459 |
333 | 460 def rawcommit(ui, repo, flist, **rc): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
461 "raw commit interface" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
462 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
463 text = rc['text'] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
464 if not text and rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
465 try: text = open(rc['logfile']).read() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
466 except IOError: pass |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
467 if not text and not rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
468 print "missing commit text" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
469 return 1 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
470 |
333 | 471 files = relpath(repo, flist) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
472 if rc['files']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
473 files += open(rc['files']).read().splitlines() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
474 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
475 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
476 |
245 | 477 def recover(ui, repo): |
255 | 478 """roll back an interrupted transaction""" |
245 | 479 repo.recover() |
480 | |
481 def remove(ui, repo, file, *files): | |
482 """remove the specified files on the next commit""" | |
483 repo.remove(relpath(repo, (file,) + files)) | |
484 | |
485 def serve(ui, repo, **opts): | |
255 | 486 """export the repository via HTTP""" |
245 | 487 hgweb.server(repo.root, opts["name"], opts["templates"], |
488 opts["address"], opts["port"]) | |
489 | |
213 | 490 def status(ui, repo): |
491 '''show changed files in the working directory | |
492 | |
245 | 493 C = changed |
494 A = added | |
495 R = removed | |
496 ? = not tracked''' | |
312 | 497 |
498 (c, a, d, u) = repo.diffdir(os.getcwd()) | |
220 | 499 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
213 | 500 |
501 for f in c: print "C", f | |
220 | 502 for f in a: print "A", f |
213 | 503 for f in d: print "R", f |
220 | 504 for f in u: print "?", f |
213 | 505 |
248 | 506 def tags(ui, repo): |
255 | 507 """list repository tags""" |
248 | 508 repo.lookup(0) # prime the cache |
509 i = repo.tags.items() | |
257 | 510 n = [] |
511 for e in i: | |
512 try: | |
513 l = repo.changelog.rev(e[1]) | |
514 except KeyError: | |
515 l = -2 | |
516 n.append((l, e)) | |
517 | |
518 n.sort() | |
519 n.reverse() | |
520 i = [ e[1] for e in n ] | |
248 | 521 for k, n in i: |
522 try: | |
523 r = repo.changelog.rev(n) | |
524 except KeyError: | |
525 r = "?" | |
526 print "%-30s %5d:%s" % (k, repo.changelog.rev(n), hg.hex(n)) | |
527 | |
245 | 528 def tip(ui, repo): |
255 | 529 """show the tip revision""" |
245 | 530 n = repo.changelog.tip() |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
531 show_changeset(ui, repo, changenode=n) |
245 | 532 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
533 def undo(ui, repo): |
255 | 534 """undo the last transaction""" |
210 | 535 repo.undo() |
536 | |
275 | 537 def update(ui, repo, node=None, merge=False, clean=False): |
254 | 538 '''update or merge working directory |
539 | |
540 If there are no outstanding changes in the working directory and | |
541 there is a linear relationship between the current version and the | |
542 requested version, the result is the requested version. | |
543 | |
544 Otherwise the result is a merge between the contents of the | |
545 current working directory and the requested version. Files that | |
546 changed between either parent are marked as changed for the next | |
547 commit and a commit must be performed before any further updates | |
548 are allowed. | |
549 ''' | |
550 node = node and repo.lookup(node) or repo.changelog.tip() | |
275 | 551 return repo.update(node, allow=merge, force=clean) |
254 | 552 |
247 | 553 def verify(ui, repo): |
554 """verify the integrity of the repository""" | |
555 return repo.verify() | |
556 | |
255 | 557 # Command options and aliases are listed here, alphabetically |
558 | |
209 | 559 table = { |
245 | 560 "add": (add, [], "hg add [files]"), |
561 "addremove": (addremove, [], "hg addremove"), | |
209 | 562 "ann|annotate": (annotate, |
563 [('r', 'revision', '', 'revision'), | |
564 ('u', 'user', None, 'show user'), | |
565 ('n', 'number', None, 'show revision number'), | |
566 ('c', 'changeset', None, 'show changeset')], | |
567 'hg annotate [-u] [-c] [-n] [-r id] [files]'), | |
248 | 568 "cat|dump": (cat, [], 'hg cat <file> [rev]'), |
289 | 569 "commit|ci": (commit, |
570 [('t', 'text', "", 'commit text'), | |
317 | 571 ('l', 'logfile', "", 'commit text file'), |
572 ('d', 'date', "", 'data'), | |
573 ('u', 'user', "", 'user')], | |
289 | 574 'hg commit [files]'), |
248 | 575 "debugaddchangegroup": (debugaddchangegroup, [], 'debugaddchangegroup'), |
576 "debugchangegroup": (debugchangegroup, [], 'debugchangegroup [roots]'), | |
577 "debugindex": (debugindex, [], 'debugindex <file>'), | |
578 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'), | |
245 | 579 "diff": (diff, [('r', 'rev', [], 'revision')], |
580 'hg diff [-r A] [-r B] [files]'), | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
581 "export": (export, [], "hg export <changeset>"), |
245 | 582 "forget": (forget, [], "hg forget [files]"), |
583 "heads": (heads, [], 'hg heads'), | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
584 "history": (history, [], 'hg history'), |
245 | 585 "help": (help, [], 'hg help [command]'), |
290 | 586 "init": (init, [], 'hg init [url]'), |
245 | 587 "log": (log, [], 'hg log <file>'), |
248 | 588 "manifest|dumpmanifest": (manifest, [], 'hg manifest [rev]'), |
227 | 589 "parents": (parents, [], 'hg parents [node]'), |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
590 "patch|import": (patch, |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
591 [('p', 'strip', 1, 'path strip'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
592 ('b', 'base', "", 'base path'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
593 ('q', 'quiet', "", 'silence diff')], |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
594 "hg import [options] patches"), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
595 "pull|merge": (pull, [], 'hg pull [source]'), |
319 | 596 "push": (push, [], 'hg push <destination>'), |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
597 "rawcommit": (rawcommit, |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
598 [('p', 'parent', [], 'parent'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
599 ('d', 'date', "", 'data'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
600 ('u', 'user', "", 'user'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
601 ('F', 'files', "", 'file list'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
602 ('t', 'text', "", 'commit text'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
603 ('l', 'logfile', "", 'commit text file')], |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
604 'hg rawcommit [options] [files]'), |
245 | 605 "recover": (recover, [], "hg recover"), |
606 "remove": (remove, [], "hg remove [files]"), | |
607 "serve": (serve, [('p', 'port', 8000, 'listen port'), | |
608 ('a', 'address', '', 'interface address'), | |
609 ('n', 'name', os.getcwd(), 'repository name'), | |
610 ('t', 'templates', "", 'template map')], | |
611 "hg serve [options]"), | |
213 | 612 "status": (status, [], 'hg status'), |
248 | 613 "tags": (tags, [], 'hg tags'), |
245 | 614 "tip": (tip, [], 'hg tip'), |
210 | 615 "undo": (undo, [], 'hg undo'), |
275 | 616 "update|up|checkout|co|resolve": (update, |
617 [('m', 'merge', None, | |
618 'allow merging of conflicts'), | |
619 ('C', 'clean', None, | |
620 'overwrite locally modified files')], | |
621 'hg update [options] [node]'), | |
247 | 622 "verify": (verify, [], 'hg verify'), |
209 | 623 } |
624 | |
248 | 625 norepo = "init branch help debugindex debugindexdot" |
209 | 626 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
627 def find(cmd): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
628 i = None |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
629 for e in table.keys(): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
630 if re.match(e + "$", cmd): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
631 return table[e] |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
632 |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
633 raise UnknownCommand(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
634 |
214 | 635 class SignalInterrupt(Exception): pass |
636 | |
637 def catchterm(*args): | |
638 raise SignalInterrupt | |
639 | |
249 | 640 def run(): |
641 sys.exit(dispatch(sys.argv[1:])) | |
642 | |
209 | 643 def dispatch(args): |
644 options = {} | |
645 opts = [('v', 'verbose', None, 'verbose'), | |
646 ('d', 'debug', None, 'debug'), | |
647 ('q', 'quiet', None, 'quiet'), | |
309 | 648 ('p', 'profile', None, 'profile'), |
209 | 649 ('y', 'noninteractive', None, 'run non-interactively'), |
650 ] | |
651 | |
652 args = fancyopts.fancyopts(args, opts, options, | |
653 'hg [options] <command> [options] [files]') | |
654 | |
655 if not args: | |
656 cmd = "help" | |
657 else: | |
658 cmd, args = args[0], args[1:] | |
659 | |
660 u = ui.ui(options["verbose"], options["debug"], options["quiet"], | |
661 not options["noninteractive"]) | |
662 | |
252 | 663 try: |
664 i = find(cmd) | |
665 except UnknownCommand: | |
268 | 666 u.warn("hg: unknown command '%s'\n" % cmd) |
252 | 667 help(u) |
668 sys.exit(1) | |
209 | 669 |
214 | 670 signal.signal(signal.SIGTERM, catchterm) |
671 | |
209 | 672 cmdoptions = {} |
293 | 673 try: |
674 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) | |
675 except fancyopts.getopt.GetoptError, inst: | |
676 u.warn("hg %s: %s\n" % (cmd, inst)) | |
677 help(u, cmd) | |
678 sys.exit(-1) | |
209 | 679 |
680 if cmd not in norepo.split(): | |
681 repo = hg.repository(ui = u) | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
682 d = lambda: i[0](u, repo, *args, **cmdoptions) |
209 | 683 else: |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
684 d = lambda: i[0](u, *args, **cmdoptions) |
209 | 685 |
686 try: | |
309 | 687 if options['profile']: |
688 import hotshot, hotshot.stats | |
689 prof = hotshot.Profile("hg.prof") | |
690 r = prof.runcall(d) | |
691 prof.close() | |
692 stats = hotshot.stats.load("hg.prof") | |
693 stats.strip_dirs() | |
694 stats.sort_stats('time', 'calls') | |
695 stats.print_stats(40) | |
696 return r | |
697 else: | |
698 return d() | |
214 | 699 except SignalInterrupt: |
700 u.warn("killed!\n") | |
209 | 701 except KeyboardInterrupt: |
702 u.warn("interrupted!\n") | |
250 | 703 except IOError, inst: |
704 if inst.errno == 32: | |
705 u.warn("broken pipe\n") | |
706 else: | |
707 raise | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
708 except TypeError, inst: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
709 # was this an argument error? |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
710 tb = traceback.extract_tb(sys.exc_info()[2]) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
711 if len(tb) > 2: # no |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
712 raise |
293 | 713 u.debug(inst, "\n") |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
714 u.warn("%s: invalid arguments\n" % i[0].__name__) |
293 | 715 help(u, cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
716 sys.exit(-1) |
293 | 717 |