Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/commands.py @ 460:6409d9a0df43
add dirstate debugging commands
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
add dirstate debugging commands
As I've played with various different merges and more recently
rawcommit, I've found the following patch to be very very helpful in
figuring out whether the dirstate is being left in a consistent or
inconsistent state with respect to the current manifest.
I attempted to deduce the invariants that were assumed by the current
code, and then check it in this code.
I may or may not have captured the design intent in this check; if not,
I'd be very happy to hear more clearly what was intended, so that I can
write tests to that expectation.
Anyway, here's the patch. Not sure if it's a good idea to commit it to
the mainline, or just leave it as a debugging aid. I attempted to
package it so that it doesn't interfere with normal usage.
Michael Fetterman
(tweaked by mpm: remove -d magic)
manifest hash: 869f5b5f954dc0f46ba27322359e811d5e21d71c
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCvP77ywK+sNU5EO8RArmtAKCCVuI2slANzWZ26P5edtH/ixdwNwCfZLWl
5P+V+C92II3usO4YW2MULKY=
=/Pv4
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Fri, 24 Jun 2005 22:51:39 -0800 |
parents | a1e91c24dab5 |
children | 9ae0034f2772 |
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 |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
417
diff
changeset
|
9 import fancyopts, ui, hg, util |
262 | 10 from demandload import * |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
11 demandload(globals(), "mdiff time hgweb traceback random signal errno version") |
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: |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
417
diff
changeset
|
19 if t and t[-1] != "/": t += "/" |
245 | 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: ] | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
417
diff
changeset
|
26 return filterfiles([util.pconvert(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: ] | |
419
28511fc21073
[PATCH] file seperator handling for the other 'OS'
mpm@selenic.com
parents:
417
diff
changeset
|
32 return [ util.pconvert(os.path.normpath(os.path.join(p, x))) for x in args ] |
209 | 33 return args |
245 | 34 |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
35 def dodiff(ui, 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] | |
417 | 50 def read(f): return repo.wfile(f).read() |
245 | 51 |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
52 if ui.quiet: |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
53 r = None |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
54 else: |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
55 hexfunc = ui.verbose and hg.hex or hg.short |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
56 r = [hexfunc(node) for node in [node1, node2] if node] |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
57 |
245 | 58 change = repo.changelog.read(node1) |
59 mmap = repo.manifest.read(change[0]) | |
60 date1 = date(change) | |
61 | |
62 if files: | |
63 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) | |
64 | |
65 for f in c: | |
275 | 66 to = None |
67 if f in mmap: | |
68 to = repo.file(f).read(mmap[f]) | |
245 | 69 tn = read(f) |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
70 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
245 | 71 for f in a: |
264
4c1d7072d5cd
Attempt to make diff deal with null sources properly
mpm@selenic.com
parents:
262
diff
changeset
|
72 to = None |
245 | 73 tn = read(f) |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
74 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
245 | 75 for f in d: |
76 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
|
77 tn = None |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
78 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
79 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
80 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
|
81 """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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 else: |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
90 log = changelog |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
91 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
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
98 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
|
99 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
|
100 return |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
101 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
102 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
|
103 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
104 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
|
105 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
|
106 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
|
107 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
|
108 parents = [] |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
109 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
110 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
|
111 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
|
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.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
|
115 else: |
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.write("changeset: %d:%s\n" % (changerev, hg.hex(changenode))) |
387
c07c6fb2f0a8
Show tags in hg history etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
386
diff
changeset
|
117 for tag in repo.nodetags(changenode): |
c07c6fb2f0a8
Show tags in hg history etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
386
diff
changeset
|
118 ui.status("tag: %s\n" % tag) |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
119 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
|
120 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
|
121 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
|
122 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
|
123 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
|
124 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
|
125 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
|
126 ui.note("files: %s\n" % " ".join(changes[3])) |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
127 description = changes[4].strip() |
329
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
128 if description: |
330 | 129 if ui.verbose: |
130 ui.status("description:\n") | |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
131 ui.status(description) |
365
f94d3632a323
One too many newlines in verbose output showed up in regression
mpm@selenic.com
parents:
363
diff
changeset
|
132 ui.status("\n") |
330 | 133 else: |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
134 ui.status("summary: %s\n" % description.splitlines()[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
|
135 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
|
136 |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
137 def show_version(ui): |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
138 """output version and copyright information""" |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
139 ui.write("Mercurial version %s\n" % version.get_version()) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
140 ui.status( |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
141 "\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n" |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
142 "This is free software; see the source for copying conditions. " |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
143 "There is NO\nwarranty; " |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
144 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
145 ) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
146 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
147 def help(ui, cmd=None): |
255 | 148 '''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
|
149 if cmd: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
150 try: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
151 i = find(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
152 ui.write("%s\n\n" % i[2]) |
293 | 153 |
154 if i[1]: | |
155 for s, l, d, c in i[1]: | |
156 opt=' ' | |
157 if s: opt = opt + '-' + s + ' ' | |
158 if l: opt = opt + '--' + l + ' ' | |
159 if d: opt = opt + '(' + str(d) + ')' | |
160 ui.write(opt, "\n") | |
161 if c: ui.write(' %s\n' % c) | |
162 ui.write("\n") | |
163 | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
164 ui.write(i[0].__doc__, "\n") |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
165 except UnknownCommand: |
268 | 166 ui.warn("hg: unknown command %s\n" % cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
167 sys.exit(0) |
255 | 168 else: |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
169 if not ui.quiet: |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
170 show_version(ui) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
171 ui.write('\n') |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
172 ui.write('hg commands:\n\n') |
209 | 173 |
255 | 174 h = {} |
175 for e in table.values(): | |
176 f = e[0] | |
177 if f.__name__.startswith("debug"): continue | |
178 d = "" | |
179 if f.__doc__: | |
180 d = f.__doc__.splitlines(0)[0].rstrip() | |
437 | 181 h[f.__name__.rstrip("_")] = d |
255 | 182 |
183 fns = h.keys() | |
184 fns.sort() | |
185 m = max(map(len, fns)) | |
186 for f in fns: | |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
187 ui.write(' %-*s %s\n' % (m, f, h[f])) |
255 | 188 |
189 # Commands start here, listed alphabetically | |
209 | 190 |
245 | 191 def add(ui, repo, file, *files): |
192 '''add the specified files on the next commit''' | |
193 repo.add(relpath(repo, (file,) + files)) | |
213 | 194 |
353 | 195 def addremove(ui, repo, *files): |
255 | 196 """add all new files, delete all missing files""" |
353 | 197 if files: |
198 files = relpath(repo, files) | |
199 d = [] | |
200 u = [] | |
201 for f in files: | |
202 p = repo.wjoin(f) | |
203 s = repo.dirstate.state(f) | |
204 isfile = os.path.isfile(p) | |
205 if s != 'r' and not isfile: | |
206 d.append(f) | |
207 elif s not in 'nmai' and isfile: | |
208 u.append(f) | |
209 else: | |
210 (c, a, d, u) = repo.diffdir(repo.root) | |
259 | 211 repo.add(u) |
245 | 212 repo.remove(d) |
219
8ff4532376a4
hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents:
214
diff
changeset
|
213 |
245 | 214 def annotate(u, repo, file, *files, **ops): |
255 | 215 """show changeset information per file line""" |
209 | 216 def getnode(rev): |
217 return hg.short(repo.changelog.node(rev)) | |
218 | |
219 def getname(rev): | |
220 try: | |
221 return bcache[rev] | |
222 except KeyError: | |
223 cl = repo.changelog.read(repo.changelog.node(rev)) | |
224 name = cl[1] | |
225 f = name.find('@') | |
226 if f >= 0: | |
227 name = name[:f] | |
228 bcache[rev] = name | |
229 return name | |
230 | |
231 bcache = {} | |
232 opmap = [['user', getname], ['number', str], ['changeset', getnode]] | |
233 if not ops['user'] and not ops['changeset']: | |
234 ops['number'] = 1 | |
235 | |
227 | 236 node = repo.dirstate.parents()[0] |
209 | 237 if ops['revision']: |
238 node = repo.changelog.lookup(ops['revision']) | |
239 change = repo.changelog.read(node) | |
240 mmap = repo.manifest.read(change[0]) | |
241 maxuserlen = 0 | |
242 maxchangelen = 0 | |
245 | 243 for f in relpath(repo, (file,) + files): |
209 | 244 lines = repo.file(f).annotate(mmap[f]) |
245 pieces = [] | |
246 | |
247 for o, f in opmap: | |
248 if ops[o]: | |
249 l = [ f(n) for n,t in lines ] | |
250 m = max(map(len, l)) | |
251 pieces.append([ "%*s" % (m, x) for x in l]) | |
252 | |
253 for p,l in zip(zip(*pieces), lines): | |
254 u.write(" ".join(p) + ": " + l[1]) | |
255 | |
248 | 256 def cat(ui, repo, file, rev = []): |
255 | 257 """output the latest or given revision of a file""" |
281 | 258 r = repo.file(relpath(repo, [file])[0]) |
248 | 259 n = r.tip() |
260 if rev: n = r.lookup(rev) | |
261 sys.stdout.write(r.read(n)) | |
262 | |
289 | 263 def commit(ui, repo, *files, **opts): |
245 | 264 """commit the specified files or all outstanding changes""" |
289 | 265 text = opts['text'] |
266 if not text and opts['logfile']: | |
267 try: text = open(opts['logfile']).read() | |
268 except IOError: pass | |
269 | |
354 | 270 if opts['addremove']: |
271 addremove(ui, repo, *files) | |
317 | 272 repo.commit(relpath(repo, files), text, opts['user'], opts['date']) |
245 | 273 |
363 | 274 def copy(ui, repo, source, dest): |
275 """mark a file as copied or renamed for the next commit""" | |
276 return repo.copy(*relpath(repo, (source, dest))) | |
277 | |
460 | 278 def debugcheckdirstate(ui, repo): |
279 parent1, parent2 = repo.dirstate.parents() | |
280 dc = repo.dirstate.dup() | |
281 keys = dc.keys() | |
282 keys.sort() | |
283 m1n = repo.changelog.read(parent1)[0] | |
284 m2n = repo.changelog.read(parent2)[0] | |
285 m1 = repo.manifest.read(m1n) | |
286 m2 = repo.manifest.read(m2n) | |
287 errors = 0 | |
288 for f in dc: | |
289 state = repo.dirstate.state(f) | |
290 if state in "nr" and f not in m1: | |
291 print "%s in state %s, but not listed in manifest1" % (f, state) | |
292 errors += 1 | |
293 if state in "a" and f in m1: | |
294 print "%s in state %s, but also listed in manifest1" % (f, state) | |
295 errors += 1 | |
296 if state in "m" and f not in m1 and f not in m2: | |
297 print "%s in state %s, but not listed in either manifest" % (f, state) | |
298 errors += 1 | |
299 for f in m1: | |
300 state = repo.dirstate.state(f) | |
301 if state not in "nrm": | |
302 print "%s in manifest1, but listed as state %s" % (f, state) | |
303 errors += 1 | |
304 if errors: | |
305 print ".hg/dirstate inconsistent with current parent's manifest, aborting" | |
306 sys.exit(1) | |
307 | |
308 def debugdumpdirstate(ui, repo): | |
309 dc = repo.dirstate.dup() | |
310 keys = dc.keys() | |
311 keys.sort() | |
312 for file in keys: | |
313 print "%s => %c" % (file, dc[file][0]) | |
314 | |
248 | 315 def debugindex(ui, file): |
417 | 316 r = hg.revlog(hg.opener(""), file, "") |
248 | 317 print " rev offset length base linkrev"+\ |
318 " p1 p2 nodeid" | |
319 for i in range(r.count()): | |
320 e = r.index[i] | |
321 print "% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s.." % ( | |
322 i, e[0], e[1], e[2], e[3], | |
323 hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5])) | |
324 | |
325 def debugindexdot(ui, file): | |
417 | 326 r = hg.revlog(hg.opener(""), file, "") |
248 | 327 print "digraph G {" |
328 for i in range(r.count()): | |
329 e = r.index[i] | |
330 print "\t%d -> %d" % (r.rev(e[4]), i) | |
331 if e[5] != hg.nullid: | |
332 print "\t%d -> %d" % (r.rev(e[5]), i) | |
333 print "}" | |
334 | |
245 | 335 def diff(ui, repo, *files, **opts): |
255 | 336 """diff working directory (or selected files)""" |
245 | 337 revs = [] |
338 if opts['rev']: | |
339 revs = map(lambda x: repo.lookup(x), opts['rev']) | |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
340 |
245 | 341 if len(revs) > 2: |
342 self.ui.warn("too many revisions to diff\n") | |
343 sys.exit(1) | |
344 | |
345 if files: | |
346 files = relpath(repo, files) | |
347 else: | |
348 files = relpath(repo, [""]) | |
349 | |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
350 dodiff(ui, repo, os.getcwd(), files, *revs) |
245 | 351 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
352 def export(ui, repo, changeset): |
255 | 353 """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
|
354 node = repo.lookup(changeset) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
355 prev, other = repo.changelog.parents(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
356 change = repo.changelog.read(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
357 print "# HG changeset patch" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
358 print "# User %s" % change[1] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
359 print "# Node ID %s" % hg.hex(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
360 print "# Parent %s" % hg.hex(prev) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
361 print |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
362 if other != hg.nullid: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
363 print "# Parent %s" % hg.hex(other) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
364 print change[4].rstrip() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
365 print |
396
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
366 |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
367 dodiff(ui, repo, "", None, prev, node) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
368 |
245 | 369 def forget(ui, repo, file, *files): |
370 """don't add the specified files on the next commit""" | |
371 repo.forget(relpath(repo, (file,) + files)) | |
372 | |
221 | 373 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
|
374 """show current repository heads""" |
221 | 375 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
|
376 show_changeset(ui, repo, changenode=n) |
221 | 377 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
378 def history(ui, repo): |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
379 """show the changelog history""" |
270
5a80ed2158c8
Reverse order of hg log and hg history lists
mpm@selenic.com
parents:
268
diff
changeset
|
380 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
|
381 show_changeset(ui, repo, rev=i) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
382 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
383 def identify(ui, repo): |
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
384 """print information about the working copy""" |
343 | 385 parents = [p for p in repo.dirstate.parents() if p != hg.nullid] |
340
97a897d32dfc
Handle the case where the current working copy is not based on a checkout.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
339
diff
changeset
|
386 if not parents: |
343 | 387 ui.write("unknown\n") |
340
97a897d32dfc
Handle the case where the current working copy is not based on a checkout.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
339
diff
changeset
|
388 return |
97a897d32dfc
Handle the case where the current working copy is not based on a checkout.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
339
diff
changeset
|
389 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
390 hexfunc = ui.verbose and hg.hex or hg.short |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
391 (c, a, d, u) = repo.diffdir(repo.root) |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
392 output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]), |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
393 (c or a or d) and "+" or "")] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
394 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
395 if not ui.quiet: |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
396 # multiple tags for a single parent separated by '/' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
397 parenttags = ['/'.join(tags) |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
398 for tags in map(repo.nodetags, parents) if tags] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
399 # tags for multiple parents separated by ' + ' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
400 output.append(' + '.join(parenttags)) |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
401 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
402 ui.write("%s\n" % ' '.join(output)) |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
403 |
437 | 404 def import_(ui, repo, patch1, *patches, **opts): |
405 """import an ordered set of patches""" | |
406 try: | |
407 import psyco | |
408 psyco.full() | |
409 except: | |
410 pass | |
411 | |
412 patches = (patch1,) + patches | |
413 | |
414 d = opts["base"] | |
415 strip = opts["strip"] | |
416 quiet = ui.quiet and "> /dev/null" or "" | |
417 | |
418 for patch in patches: | |
419 ui.status("applying %s\n" % patch) | |
420 pf = os.path.join(d, patch) | |
421 | |
422 text = "" | |
423 for l in file(pf): | |
424 if l[:4] == "--- ": break | |
425 text += l | |
426 | |
427 # make sure text isn't empty | |
428 if not text: text = "imported patch %s\n" % patch | |
429 | |
430 f = os.popen("patch -p%d < %s" % (strip, pf)) | |
431 files = [] | |
432 for l in f.read().splitlines(): | |
433 l.rstrip('\r\n'); | |
434 if not quiet: | |
435 print l | |
436 if l[:14] == 'patching file ': | |
443 | 437 pf = l[14:] |
438 if pf not in files: | |
439 files.append(pf) | |
440 patcherr = f.close() | |
441 if patcherr: | |
442 sys.stderr.write("patch failed") | |
443 sys.exit(1) | |
437 | 444 |
445 if len(files) > 0: | |
446 addremove(ui, repo, *files) | |
447 repo.commit(files, text) | |
448 | |
393 | 449 def init(ui, source=None, **opts): |
290 | 450 """create a new repository or copy an existing one""" |
451 | |
452 if source: | |
453 paths = {} | |
454 for name, path in ui.configitems("paths"): | |
455 paths[name] = path | |
456 | |
457 if source in paths: source = paths[source] | |
255 | 458 |
290 | 459 link = 0 |
460 if not source.startswith("http://"): | |
461 d1 = os.stat(os.getcwd()).st_dev | |
462 d2 = os.stat(source).st_dev | |
463 if d1 == d2: link = 1 | |
464 | |
465 if link: | |
466 ui.debug("copying by hardlink\n") | |
467 os.system("cp -al %s/.hg .hg" % source) | |
300 | 468 try: |
469 os.remove(".hg/dirstate") | |
470 except: pass | |
338 | 471 |
472 repo = hg.repository(ui, ".") | |
473 | |
290 | 474 else: |
475 repo = hg.repository(ui, ".", create=1) | |
476 other = hg.repository(ui, source) | |
477 cg = repo.getchangegroup(other) | |
478 repo.addchangegroup(cg) | |
390
50aea13227a2
create .hg/hgrc with [paths] default entry only if source was given on hg init.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
387
diff
changeset
|
479 |
50aea13227a2
create .hg/hgrc with [paths] default entry only if source was given on hg init.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
387
diff
changeset
|
480 f = repo.opener("hgrc", "w") |
50aea13227a2
create .hg/hgrc with [paths] default entry only if source was given on hg init.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
387
diff
changeset
|
481 f.write("[paths]\n") |
50aea13227a2
create .hg/hgrc with [paths] default entry only if source was given on hg init.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
387
diff
changeset
|
482 f.write("default = %s\n" % source) |
393 | 483 |
484 if opts['update']: | |
485 update(ui, repo) | |
290 | 486 else: |
338 | 487 repo = hg.repository(ui, ".", create=1) |
488 | |
255 | 489 def log(ui, repo, f): |
490 """show the revision history of a single file""" | |
491 f = relpath(repo, [f])[0] | |
492 | |
493 r = repo.file(f) | |
270
5a80ed2158c8
Reverse order of hg log and hg history lists
mpm@selenic.com
parents:
268
diff
changeset
|
494 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
|
495 show_changeset(ui, repo, filelog=r, rev=i) |
255 | 496 |
497 def manifest(ui, repo, rev = []): | |
498 """output the latest or given revision of the project manifest""" | |
499 n = repo.manifest.tip() | |
500 if rev: | |
501 n = repo.manifest.lookup(rev) | |
502 m = repo.manifest.read(n) | |
276 | 503 mf = repo.manifest.readflags(n) |
255 | 504 files = m.keys() |
505 files.sort() | |
506 | |
507 for f in files: | |
276 | 508 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f)) |
255 | 509 |
510 def parents(ui, repo, node = None): | |
511 '''show the parents of the current working dir''' | |
512 if node: | |
513 p = repo.changelog.parents(repo.lookup(hg.bin(node))) | |
514 else: | |
515 p = repo.dirstate.parents() | |
516 | |
517 for n in p: | |
518 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
|
519 show_changeset(ui, repo, changenode=n) |
255 | 520 |
404 | 521 def pull(ui, repo, source="default", **opts): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
522 """pull changes from the specified source""" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
523 paths = {} |
286 | 524 for name, path in ui.configitems("paths"): |
290 | 525 paths[name] = path |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
526 |
404 | 527 if source in paths: |
528 source = paths[source] | |
529 | |
530 ui.status('pulling from %s\n' % (source)) | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
531 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
532 other = hg.repository(ui, source) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
533 cg = repo.getchangegroup(other) |
404 | 534 r = repo.addchangegroup(cg) |
535 if cg and not r: | |
536 if opts['update']: | |
537 return update(ui, repo) | |
538 else: | |
539 ui.status("(run 'hg update' to get a working copy)\n") | |
540 | |
541 return r | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
542 |
371
6e3436082697
hg push: "default-push" default target path
mpm@selenic.com
parents:
367
diff
changeset
|
543 def push(ui, repo, dest="default-push"): |
319 | 544 """push changes to the specified destination""" |
545 paths = {} | |
546 for name, path in ui.configitems("paths"): | |
547 paths[name] = path | |
548 | |
549 if dest in paths: dest = paths[dest] | |
550 | |
551 if not dest.startswith("ssh://"): | |
552 ui.warn("abort: can only push to ssh:// destinations currently\n") | |
553 return 1 | |
554 | |
555 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) | |
556 if not m: | |
557 ui.warn("abort: couldn't parse destination %s\n" % dest) | |
558 return 1 | |
559 | |
560 user, host, port, path = map(m.group, (2, 3, 5, 7)) | |
561 host = user and ("%s@%s" % (user, host)) or host | |
562 port = port and (" -p %s") % port or "" | |
563 path = path or "" | |
564 | |
565 sport = random.randrange(30000, 60000) | |
566 cmd = "ssh %s%s -R %d:localhost:%d 'cd %s; hg pull http://localhost:%d/'" | |
567 cmd = cmd % (host, port, sport+1, sport, path, sport+1) | |
568 | |
569 child = os.fork() | |
570 if not child: | |
571 sys.stdout = file("/dev/null", "w") | |
572 sys.stderr = sys.stdout | |
573 hgweb.server(repo.root, "pull", "", "localhost", sport) | |
574 else: | |
575 r = os.system(cmd) | |
576 os.kill(child, signal.SIGTERM) | |
320 | 577 return r |
319 | 578 |
403 | 579 def rawcommit(ui, repo, *flist, **rc): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
580 "raw commit interface" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
581 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
582 text = rc['text'] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
583 if not text and rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
584 try: text = open(rc['logfile']).read() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
585 except IOError: pass |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
586 if not text and not rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
587 print "missing commit text" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
588 return 1 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
589 |
403 | 590 files = relpath(repo, list(flist)) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
591 if rc['files']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
592 files += open(rc['files']).read().splitlines() |
452
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
593 |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
594 rc['parent'] = map(repo.lookup, rc['parent']) |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
595 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
596 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
|
597 |
245 | 598 def recover(ui, repo): |
255 | 599 """roll back an interrupted transaction""" |
245 | 600 repo.recover() |
601 | |
602 def remove(ui, repo, file, *files): | |
603 """remove the specified files on the next commit""" | |
604 repo.remove(relpath(repo, (file,) + files)) | |
605 | |
606 def serve(ui, repo, **opts): | |
255 | 607 """export the repository via HTTP""" |
245 | 608 hgweb.server(repo.root, opts["name"], opts["templates"], |
609 opts["address"], opts["port"]) | |
610 | |
213 | 611 def status(ui, repo): |
612 '''show changed files in the working directory | |
613 | |
245 | 614 C = changed |
615 A = added | |
616 R = removed | |
617 ? = not tracked''' | |
312 | 618 |
619 (c, a, d, u) = repo.diffdir(os.getcwd()) | |
220 | 620 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
213 | 621 |
622 for f in c: print "C", f | |
220 | 623 for f in a: print "A", f |
213 | 624 for f in d: print "R", f |
220 | 625 for f in u: print "?", f |
213 | 626 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
627 def tag(ui, repo, name, rev = None, **opts): |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
628 """add a tag for the current tip or a given revision""" |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
629 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
630 if name == "tip": |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
631 ui.warn("abort: 'tip' is a reserved name!\n") |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
632 return -1 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
633 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
634 (c, a, d, u) = repo.diffdir(repo.root) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
635 for x in (c, a, d, u): |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
636 if ".hgtags" in x: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
637 ui.warn("abort: working copy of .hgtags is changed!\n") |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
638 ui.status("(please commit .hgtags manually)\n") |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
639 return -1 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
640 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
641 if rev: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
642 r = hg.hex(repo.lookup(rev)) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
643 else: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
644 r = hg.hex(repo.changelog.tip()) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
645 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
646 add = 0 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
647 if not os.path.exists(repo.wjoin(".hgtags")): add = 1 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
648 repo.wfile(".hgtags", "a").write("%s %s\n" % (r, name)) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
649 if add: repo.add([".hgtags"]) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
650 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
651 if not opts['text']: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
652 opts['text'] = "Added tag %s for changeset %s" % (name, r) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
653 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
654 repo.commit([".hgtags"], opts['text'], opts['user'], opts['date']) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
655 |
248 | 656 def tags(ui, repo): |
255 | 657 """list repository tags""" |
343 | 658 |
659 l = repo.tagslist() | |
660 l.reverse() | |
661 for t,n in l: | |
248 | 662 try: |
663 r = repo.changelog.rev(n) | |
664 except KeyError: | |
665 r = "?" | |
343 | 666 print "%-30s %5d:%s" % (t, repo.changelog.rev(n), hg.hex(n)) |
248 | 667 |
245 | 668 def tip(ui, repo): |
255 | 669 """show the tip revision""" |
245 | 670 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
|
671 show_changeset(ui, repo, changenode=n) |
245 | 672 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
673 def undo(ui, repo): |
255 | 674 """undo the last transaction""" |
210 | 675 repo.undo() |
676 | |
275 | 677 def update(ui, repo, node=None, merge=False, clean=False): |
254 | 678 '''update or merge working directory |
679 | |
680 If there are no outstanding changes in the working directory and | |
681 there is a linear relationship between the current version and the | |
682 requested version, the result is the requested version. | |
683 | |
684 Otherwise the result is a merge between the contents of the | |
685 current working directory and the requested version. Files that | |
686 changed between either parent are marked as changed for the next | |
687 commit and a commit must be performed before any further updates | |
688 are allowed. | |
689 ''' | |
690 node = node and repo.lookup(node) or repo.changelog.tip() | |
275 | 691 return repo.update(node, allow=merge, force=clean) |
254 | 692 |
247 | 693 def verify(ui, repo): |
694 """verify the integrity of the repository""" | |
695 return repo.verify() | |
696 | |
255 | 697 # Command options and aliases are listed here, alphabetically |
698 | |
209 | 699 table = { |
245 | 700 "add": (add, [], "hg add [files]"), |
353 | 701 "addremove": (addremove, [], "hg addremove [files]"), |
437 | 702 "annotate": (annotate, |
209 | 703 [('r', 'revision', '', 'revision'), |
704 ('u', 'user', None, 'show user'), | |
705 ('n', 'number', None, 'show revision number'), | |
706 ('c', 'changeset', None, 'show changeset')], | |
707 'hg annotate [-u] [-c] [-n] [-r id] [files]'), | |
437 | 708 "cat": (cat, [], 'hg cat <file> [rev]'), |
289 | 709 "commit|ci": (commit, |
710 [('t', 'text', "", 'commit text'), | |
354 | 711 ('A', 'addremove', None, 'run add/remove during commit'), |
317 | 712 ('l', 'logfile', "", 'commit text file'), |
713 ('d', 'date', "", 'data'), | |
714 ('u', 'user', "", 'user')], | |
289 | 715 'hg commit [files]'), |
363 | 716 "copy": (copy, [], 'hg copy <source> <dest>'), |
460 | 717 "debugcheckdirstate": (debugcheckdirstate, [], 'debugcheckdirstate'), |
718 "debugdumpdirstate": (debugdumpdirstate, [], 'debugdumpdirstate'), | |
248 | 719 "debugindex": (debugindex, [], 'debugindex <file>'), |
720 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'), | |
245 | 721 "diff": (diff, [('r', 'rev', [], 'revision')], |
722 'hg diff [-r A] [-r B] [files]'), | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
723 "export": (export, [], "hg export <changeset>"), |
245 | 724 "forget": (forget, [], "hg forget [files]"), |
725 "heads": (heads, [], 'hg heads'), | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
726 "history": (history, [], 'hg history'), |
245 | 727 "help": (help, [], 'hg help [command]'), |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
728 "identify|id": (identify, [], 'hg identify'), |
437 | 729 "import|patch": (import_, |
730 [('p', 'strip', 1, 'path strip'), | |
731 ('b', 'base', "", 'base path')], | |
732 "hg import [options] <patches>"), | |
393 | 733 "init": (init, [('u', 'update', None, 'update after init')], |
734 'hg init [options] [url]'), | |
245 | 735 "log": (log, [], 'hg log <file>'), |
437 | 736 "manifest": (manifest, [], 'hg manifest [rev]'), |
227 | 737 "parents": (parents, [], 'hg parents [node]'), |
437 | 738 "pull": (pull, |
404 | 739 [('u', 'update', None, 'update working directory')], |
740 'hg pull [options] [source]'), | |
319 | 741 "push": (push, [], 'hg push <destination>'), |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
742 "rawcommit": (rawcommit, |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
743 [('p', 'parent', [], 'parent'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
744 ('d', 'date', "", 'data'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
745 ('u', 'user', "", 'user'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
746 ('F', 'files', "", 'file list'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
747 ('t', 'text', "", 'commit text'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
748 ('l', 'logfile', "", 'commit text file')], |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
749 'hg rawcommit [options] [files]'), |
245 | 750 "recover": (recover, [], "hg recover"), |
437 | 751 "remove|rm": (remove, [], "hg remove [files]"), |
245 | 752 "serve": (serve, [('p', 'port', 8000, 'listen port'), |
753 ('a', 'address', '', 'interface address'), | |
754 ('n', 'name', os.getcwd(), 'repository name'), | |
755 ('t', 'templates', "", 'template map')], | |
756 "hg serve [options]"), | |
213 | 757 "status": (status, [], 'hg status'), |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
758 "tag": (tag, [('t', 'text', "", 'commit text'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
759 ('d', 'date', "", 'date'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
760 ('u', 'user', "", 'user')], |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
761 'hg tag [options] <name> [rev]'), |
248 | 762 "tags": (tags, [], 'hg tags'), |
245 | 763 "tip": (tip, [], 'hg tip'), |
210 | 764 "undo": (undo, [], 'hg undo'), |
437 | 765 "update|up|checkout|co": |
766 (update, | |
767 [('m', 'merge', None, 'allow merging of conflicts'), | |
768 ('C', 'clean', None, 'overwrite locally modified files')], | |
769 'hg update [options] [node]'), | |
247 | 770 "verify": (verify, [], 'hg verify'), |
209 | 771 } |
772 | |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
773 norepo = "init version help debugindex debugindexdot" |
209 | 774 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
775 def find(cmd): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
776 i = None |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
777 for e in table.keys(): |
335 | 778 if re.match("(%s)$" % e, cmd): |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
779 return table[e] |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
780 |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
781 raise UnknownCommand(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
782 |
214 | 783 class SignalInterrupt(Exception): pass |
784 | |
785 def catchterm(*args): | |
786 raise SignalInterrupt | |
787 | |
249 | 788 def run(): |
789 sys.exit(dispatch(sys.argv[1:])) | |
790 | |
209 | 791 def dispatch(args): |
792 options = {} | |
793 opts = [('v', 'verbose', None, 'verbose'), | |
794 ('d', 'debug', None, 'debug'), | |
795 ('q', 'quiet', None, 'quiet'), | |
309 | 796 ('p', 'profile', None, 'profile'), |
209 | 797 ('y', 'noninteractive', None, 'run non-interactively'), |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
798 ('', 'version', None, 'output version information and exit'), |
209 | 799 ] |
800 | |
801 args = fancyopts.fancyopts(args, opts, options, | |
802 'hg [options] <command> [options] [files]') | |
803 | |
804 if not args: | |
805 cmd = "help" | |
806 else: | |
807 cmd, args = args[0], args[1:] | |
808 | |
809 u = ui.ui(options["verbose"], options["debug"], options["quiet"], | |
810 not options["noninteractive"]) | |
811 | |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
812 if options["version"]: |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
813 show_version(u) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
814 sys.exit(0) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
815 |
252 | 816 try: |
817 i = find(cmd) | |
818 except UnknownCommand: | |
268 | 819 u.warn("hg: unknown command '%s'\n" % cmd) |
252 | 820 help(u) |
821 sys.exit(1) | |
209 | 822 |
214 | 823 signal.signal(signal.SIGTERM, catchterm) |
824 | |
209 | 825 cmdoptions = {} |
293 | 826 try: |
827 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) | |
828 except fancyopts.getopt.GetoptError, inst: | |
829 u.warn("hg %s: %s\n" % (cmd, inst)) | |
830 help(u, cmd) | |
831 sys.exit(-1) | |
209 | 832 |
833 if cmd not in norepo.split(): | |
834 repo = hg.repository(ui = u) | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
835 d = lambda: i[0](u, repo, *args, **cmdoptions) |
209 | 836 else: |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
837 d = lambda: i[0](u, *args, **cmdoptions) |
209 | 838 |
839 try: | |
309 | 840 if options['profile']: |
841 import hotshot, hotshot.stats | |
842 prof = hotshot.Profile("hg.prof") | |
843 r = prof.runcall(d) | |
844 prof.close() | |
845 stats = hotshot.stats.load("hg.prof") | |
846 stats.strip_dirs() | |
847 stats.sort_stats('time', 'calls') | |
848 stats.print_stats(40) | |
849 return r | |
850 else: | |
851 return d() | |
214 | 852 except SignalInterrupt: |
853 u.warn("killed!\n") | |
209 | 854 except KeyboardInterrupt: |
855 u.warn("interrupted!\n") | |
250 | 856 except IOError, inst: |
395 | 857 if hasattr(inst, "code"): |
858 u.warn("abort: %s\n" % inst) | |
859 elif hasattr(inst, "reason"): | |
860 u.warn("abort: error %d: %s\n" % (inst.reason[0], inst.reason[1])) | |
861 elif hasattr(inst, "args") and inst[0] == errno.EPIPE: | |
250 | 862 u.warn("broken pipe\n") |
863 else: | |
864 raise | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
865 except TypeError, inst: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
866 # was this an argument error? |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
867 tb = traceback.extract_tb(sys.exc_info()[2]) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
868 if len(tb) > 2: # no |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
869 raise |
293 | 870 u.debug(inst, "\n") |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
871 u.warn("%s: invalid arguments\n" % i[0].__name__) |
293 | 872 help(u, cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
873 sys.exit(-1) |
293 | 874 |