Mercurial > public > mercurial-scm > hg
annotate mercurial/commands.py @ 535:fba26990604a
Deal with failed clone/transaction interaction
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Deal with failed clone/transaction interaction
> What is happening is that something in the transaction machinery is
> causing the directory to be completely recreated.
The transaction gets rolled back by its destructor. This is critical
so it happens whenever an exception occurs that unwinds the stack.
Unfortunately, what's happening with clone is we're trying to delete
the directory during exception propagation. And a reference to the
transaction is held in the exception backtrace stack frames so it
still exists until the exception is completely resolved.
So there's no way to do the directory delete inside the exception
handling cleanly.
But we can handle it similarly to the transaction itself: use an
object with a destructor.
manifest hash: fc38550a20d64d08333f256bbedc312493c1390b
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCxDT2ywK+sNU5EO8RAjikAJ0Tej56rAutxQDfYzVbFGtT1sEC5ACgmVds
/fwdQyHn+FwshugqXLemUaM=
=3f78
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Thu, 30 Jun 2005 10:07:50 -0800 |
parents | ab0d1bfeee7c |
children | c15b4bc0a11c eda4c32c167a |
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])))) |
493
30752b14f759
Make show_changeset show added/deleted files only in debug mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
490
diff
changeset
|
126 if ui.debugflag: |
490
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
127 files = repo.diffrevs(changelog.parents(changenode)[0], changenode) |
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
128 for key, value in zip(["files:", "files+:", "files-:"], files): |
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
129 if value: |
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
130 ui.note("%-12s %s\n" % (key, " ".join(value))) |
493
30752b14f759
Make show_changeset show added/deleted files only in debug mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
490
diff
changeset
|
131 else: |
30752b14f759
Make show_changeset show added/deleted files only in debug mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
490
diff
changeset
|
132 ui.note("files: %s\n" % " ".join(changes[3])) |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
133 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
|
134 if description: |
330 | 135 if ui.verbose: |
136 ui.status("description:\n") | |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
137 ui.status(description) |
365
f94d3632a323
One too many newlines in verbose output showed up in regression
mpm@selenic.com
parents:
363
diff
changeset
|
138 ui.status("\n") |
330 | 139 else: |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
140 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
|
141 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
|
142 |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
143 def show_version(ui): |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
144 """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
|
145 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
|
146 ui.status( |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
147 "\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
|
148 "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
|
149 "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
|
150 "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
|
151 ) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
152 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
153 def help(ui, cmd=None): |
255 | 154 '''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
|
155 if cmd: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
156 try: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
157 i = find(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
158 ui.write("%s\n\n" % i[2]) |
293 | 159 |
160 if i[1]: | |
161 for s, l, d, c in i[1]: | |
162 opt=' ' | |
163 if s: opt = opt + '-' + s + ' ' | |
164 if l: opt = opt + '--' + l + ' ' | |
165 if d: opt = opt + '(' + str(d) + ')' | |
166 ui.write(opt, "\n") | |
167 if c: ui.write(' %s\n' % c) | |
168 ui.write("\n") | |
169 | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
170 ui.write(i[0].__doc__, "\n") |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
171 except UnknownCommand: |
268 | 172 ui.warn("hg: unknown command %s\n" % cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
173 sys.exit(0) |
255 | 174 else: |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
175 if not ui.quiet: |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
176 show_version(ui) |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
177 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
|
178 ui.write('hg commands:\n\n') |
209 | 179 |
255 | 180 h = {} |
479
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
181 for c, e in table.items(): |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
182 f = c.split("|")[0] |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
183 if f.startswith("debug"): |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
184 continue |
255 | 185 d = "" |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
186 if e[0].__doc__: |
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
187 d = e[0].__doc__.splitlines(0)[0].rstrip() |
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
188 h[f] = d |
255 | 189 |
190 fns = h.keys() | |
191 fns.sort() | |
192 m = max(map(len, fns)) | |
193 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
|
194 ui.write(' %-*s %s\n' % (m, f, h[f])) |
255 | 195 |
196 # Commands start here, listed alphabetically | |
209 | 197 |
245 | 198 def add(ui, repo, file, *files): |
199 '''add the specified files on the next commit''' | |
200 repo.add(relpath(repo, (file,) + files)) | |
213 | 201 |
353 | 202 def addremove(ui, repo, *files): |
255 | 203 """add all new files, delete all missing files""" |
353 | 204 if files: |
205 files = relpath(repo, files) | |
206 d = [] | |
207 u = [] | |
208 for f in files: | |
209 p = repo.wjoin(f) | |
210 s = repo.dirstate.state(f) | |
211 isfile = os.path.isfile(p) | |
212 if s != 'r' and not isfile: | |
213 d.append(f) | |
214 elif s not in 'nmai' and isfile: | |
215 u.append(f) | |
216 else: | |
217 (c, a, d, u) = repo.diffdir(repo.root) | |
259 | 218 repo.add(u) |
245 | 219 repo.remove(d) |
219
8ff4532376a4
hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents:
214
diff
changeset
|
220 |
245 | 221 def annotate(u, repo, file, *files, **ops): |
255 | 222 """show changeset information per file line""" |
209 | 223 def getnode(rev): |
224 return hg.short(repo.changelog.node(rev)) | |
225 | |
226 def getname(rev): | |
227 try: | |
228 return bcache[rev] | |
229 except KeyError: | |
230 cl = repo.changelog.read(repo.changelog.node(rev)) | |
231 name = cl[1] | |
232 f = name.find('@') | |
233 if f >= 0: | |
234 name = name[:f] | |
534
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
235 f = name.find('<') |
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
236 if f >= 0: |
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
237 name = name[f+1:] |
209 | 238 bcache[rev] = name |
239 return name | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
240 |
209 | 241 bcache = {} |
242 opmap = [['user', getname], ['number', str], ['changeset', getnode]] | |
243 if not ops['user'] and not ops['changeset']: | |
244 ops['number'] = 1 | |
245 | |
227 | 246 node = repo.dirstate.parents()[0] |
209 | 247 if ops['revision']: |
248 node = repo.changelog.lookup(ops['revision']) | |
249 change = repo.changelog.read(node) | |
250 mmap = repo.manifest.read(change[0]) | |
245 | 251 for f in relpath(repo, (file,) + files): |
209 | 252 lines = repo.file(f).annotate(mmap[f]) |
253 pieces = [] | |
254 | |
255 for o, f in opmap: | |
256 if ops[o]: | |
257 l = [ f(n) for n,t in lines ] | |
258 m = max(map(len, l)) | |
259 pieces.append([ "%*s" % (m, x) for x in l]) | |
260 | |
261 for p,l in zip(zip(*pieces), lines): | |
262 u.write(" ".join(p) + ": " + l[1]) | |
263 | |
248 | 264 def cat(ui, repo, file, rev = []): |
255 | 265 """output the latest or given revision of a file""" |
281 | 266 r = repo.file(relpath(repo, [file])[0]) |
248 | 267 n = r.tip() |
268 if rev: n = r.lookup(rev) | |
269 sys.stdout.write(r.read(n)) | |
270 | |
485 | 271 def clone(ui, source, dest = None, **opts): |
272 """make a copy of an existing repository""" | |
506 | 273 source = ui.expandpath(source) |
485 | 274 |
275 if dest is None: | |
528 | 276 dest = os.path.basename(os.path.normpath(source)) |
532
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
277 |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
278 if os.path.exists(dest): |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
279 ui.warn("abort: destination '%s' already exists\n" % dest) |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
280 return 1 |
523
003df62ae39f
[PATCH] Force "hg clone" to always create a new directory
mpm@selenic.com
parents:
522
diff
changeset
|
281 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
282 class dircleanup: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
283 def __init__(self, dir): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
284 self.dir = dir |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
285 os.mkdir(dir) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
286 def close(self): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
287 self.dir = None |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
288 def __del__(self): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
289 if self.dir: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
290 import shutil |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
291 shutil.rmtree(self.dir, True) |
485 | 292 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
293 d = dircleanup(dest) |
485 | 294 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
295 link = 0 |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
296 if not source.startswith("http://"): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
297 d1 = os.stat(dest).st_dev |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
298 d2 = os.stat(source).st_dev |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
299 if d1 == d2: link = 1 |
485 | 300 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
301 if link: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
302 ui.note("copying by hardlink\n") |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
303 util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
304 try: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
305 os.remove(os.path.join(dest, ".hg", "dirstate")) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
306 except: pass |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
307 |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
308 repo = hg.repository(ui, dest) |
485 | 309 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
310 else: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
311 repo = hg.repository(ui, dest, create=1) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
312 other = hg.repository(ui, source) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
313 fetch = repo.findincoming(other) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
314 if fetch: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
315 cg = other.changegroup(fetch) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
316 repo.addchangegroup(cg) |
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
500
diff
changeset
|
317 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
318 f = repo.opener("hgrc", "w") |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
319 f.write("[paths]\n") |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
320 f.write("default = %s\n" % source) |
515 | 321 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
322 if not opts['noupdate']: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
323 update(ui, repo) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
324 |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
325 d.close() |
515 | 326 |
289 | 327 def commit(ui, repo, *files, **opts): |
245 | 328 """commit the specified files or all outstanding changes""" |
289 | 329 text = opts['text'] |
330 if not text and opts['logfile']: | |
331 try: text = open(opts['logfile']).read() | |
332 except IOError: pass | |
333 | |
354 | 334 if opts['addremove']: |
335 addremove(ui, repo, *files) | |
317 | 336 repo.commit(relpath(repo, files), text, opts['user'], opts['date']) |
245 | 337 |
363 | 338 def copy(ui, repo, source, dest): |
339 """mark a file as copied or renamed for the next commit""" | |
340 return repo.copy(*relpath(repo, (source, dest))) | |
341 | |
460 | 342 def debugcheckdirstate(ui, repo): |
343 parent1, parent2 = repo.dirstate.parents() | |
344 dc = repo.dirstate.dup() | |
345 keys = dc.keys() | |
346 keys.sort() | |
347 m1n = repo.changelog.read(parent1)[0] | |
348 m2n = repo.changelog.read(parent2)[0] | |
349 m1 = repo.manifest.read(m1n) | |
350 m2 = repo.manifest.read(m2n) | |
351 errors = 0 | |
352 for f in dc: | |
353 state = repo.dirstate.state(f) | |
354 if state in "nr" and f not in m1: | |
355 print "%s in state %s, but not listed in manifest1" % (f, state) | |
356 errors += 1 | |
357 if state in "a" and f in m1: | |
358 print "%s in state %s, but also listed in manifest1" % (f, state) | |
359 errors += 1 | |
360 if state in "m" and f not in m1 and f not in m2: | |
361 print "%s in state %s, but not listed in either manifest" % (f, state) | |
362 errors += 1 | |
363 for f in m1: | |
364 state = repo.dirstate.state(f) | |
365 if state not in "nrm": | |
366 print "%s in manifest1, but listed as state %s" % (f, state) | |
367 errors += 1 | |
368 if errors: | |
369 print ".hg/dirstate inconsistent with current parent's manifest, aborting" | |
370 sys.exit(1) | |
371 | |
372 def debugdumpdirstate(ui, repo): | |
373 dc = repo.dirstate.dup() | |
374 keys = dc.keys() | |
375 keys.sort() | |
376 for file in keys: | |
377 print "%s => %c" % (file, dc[file][0]) | |
378 | |
248 | 379 def debugindex(ui, file): |
417 | 380 r = hg.revlog(hg.opener(""), file, "") |
248 | 381 print " rev offset length base linkrev"+\ |
382 " p1 p2 nodeid" | |
383 for i in range(r.count()): | |
384 e = r.index[i] | |
385 print "% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s.." % ( | |
386 i, e[0], e[1], e[2], e[3], | |
387 hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5])) | |
388 | |
389 def debugindexdot(ui, file): | |
417 | 390 r = hg.revlog(hg.opener(""), file, "") |
248 | 391 print "digraph G {" |
392 for i in range(r.count()): | |
393 e = r.index[i] | |
394 print "\t%d -> %d" % (r.rev(e[4]), i) | |
395 if e[5] != hg.nullid: | |
396 print "\t%d -> %d" % (r.rev(e[5]), i) | |
397 print "}" | |
398 | |
245 | 399 def diff(ui, repo, *files, **opts): |
255 | 400 """diff working directory (or selected files)""" |
245 | 401 revs = [] |
402 if opts['rev']: | |
403 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
|
404 |
245 | 405 if len(revs) > 2: |
480
430a10669928
Fixed call to ui.warn()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
479
diff
changeset
|
406 ui.warn("too many revisions to diff\n") |
245 | 407 sys.exit(1) |
408 | |
409 if files: | |
410 files = relpath(repo, files) | |
411 else: | |
412 files = relpath(repo, [""]) | |
413 | |
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
|
414 dodiff(ui, repo, os.getcwd(), files, *revs) |
245 | 415 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
416 def export(ui, repo, changeset): |
255 | 417 """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
|
418 node = repo.lookup(changeset) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
419 prev, other = repo.changelog.parents(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
420 change = repo.changelog.read(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
421 print "# HG changeset patch" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
422 print "# User %s" % change[1] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
423 print "# Node ID %s" % hg.hex(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
424 print "# Parent %s" % hg.hex(prev) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
425 print |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
426 if other != hg.nullid: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
427 print "# Parent %s" % hg.hex(other) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
428 print change[4].rstrip() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
429 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
|
430 |
8f8bb77d560e
Show revisions in diffs like CVS, based on a patch from Goffredo Baroncelli.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
395
diff
changeset
|
431 dodiff(ui, repo, "", None, prev, node) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
432 |
245 | 433 def forget(ui, repo, file, *files): |
434 """don't add the specified files on the next commit""" | |
435 repo.forget(relpath(repo, (file,) + files)) | |
436 | |
221 | 437 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
|
438 """show current repository heads""" |
221 | 439 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
|
440 show_changeset(ui, repo, changenode=n) |
221 | 441 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
442 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
|
443 """print information about the working copy""" |
343 | 444 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
|
445 if not parents: |
343 | 446 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
|
447 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
|
448 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
449 hexfunc = ui.verbose and hg.hex or hg.short |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
450 (c, a, d, u) = repo.diffdir(repo.root) |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
451 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
|
452 (c or a or d) and "+" or "")] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
453 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
454 if not ui.quiet: |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
455 # multiple tags for a single parent separated by '/' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
456 parenttags = ['/'.join(tags) |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
457 for tags in map(repo.nodetags, parents) if tags] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
458 # tags for multiple parents separated by ' + ' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
459 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
|
460 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
461 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
|
462 |
437 | 463 def import_(ui, repo, patch1, *patches, **opts): |
464 """import an ordered set of patches""" | |
465 try: | |
466 import psyco | |
467 psyco.full() | |
468 except: | |
469 pass | |
470 | |
471 patches = (patch1,) + patches | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
472 |
437 | 473 d = opts["base"] |
474 strip = opts["strip"] | |
475 | |
476 for patch in patches: | |
477 ui.status("applying %s\n" % patch) | |
478 pf = os.path.join(d, patch) | |
479 | |
480 text = "" | |
481 for l in file(pf): | |
482 if l[:4] == "--- ": break | |
483 text += l | |
484 | |
485 # make sure text isn't empty | |
486 if not text: text = "imported patch %s\n" % patch | |
487 | |
488 f = os.popen("patch -p%d < %s" % (strip, pf)) | |
489 files = [] | |
490 for l in f.read().splitlines(): | |
491 l.rstrip('\r\n'); | |
481
2705d20f77c9
hg import checking for quiet mode didn't work. Fixed using the ui module.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
480
diff
changeset
|
492 ui.status("%s\n" % l) |
437 | 493 if l[:14] == 'patching file ': |
443 | 494 pf = l[14:] |
495 if pf not in files: | |
496 files.append(pf) | |
497 patcherr = f.close() | |
498 if patcherr: | |
499 sys.stderr.write("patch failed") | |
500 sys.exit(1) | |
437 | 501 |
502 if len(files) > 0: | |
503 addremove(ui, repo, *files) | |
504 repo.commit(files, text) | |
505 | |
496 | 506 def init(ui, source=None): |
507 """create a new repository in the current directory""" | |
290 | 508 |
509 if source: | |
496 | 510 ui.warn("no longer supported: use \"hg clone\" instead\n") |
511 sys.exit(1) | |
512 repo = hg.repository(ui, ".", create=1) | |
338 | 513 |
509 | 514 def log(ui, repo, f = None): |
515 """show the revision history of the repository or a single file""" | |
516 if f: | |
517 f = relpath(repo, [f])[0] | |
518 r = repo.file(f) | |
519 for i in range(r.count() - 1, -1, -1): | |
520 show_changeset(ui, repo, filelog=r, rev=i) | |
521 else: | |
522 for i in range(repo.changelog.count() - 1, -1, -1): | |
523 show_changeset(ui, repo, rev=i) | |
255 | 524 |
525 def manifest(ui, repo, rev = []): | |
526 """output the latest or given revision of the project manifest""" | |
527 n = repo.manifest.tip() | |
528 if rev: | |
529 n = repo.manifest.lookup(rev) | |
530 m = repo.manifest.read(n) | |
276 | 531 mf = repo.manifest.readflags(n) |
255 | 532 files = m.keys() |
533 files.sort() | |
534 | |
535 for f in files: | |
276 | 536 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f)) |
255 | 537 |
538 def parents(ui, repo, node = None): | |
539 '''show the parents of the current working dir''' | |
540 if node: | |
541 p = repo.changelog.parents(repo.lookup(hg.bin(node))) | |
542 else: | |
543 p = repo.dirstate.parents() | |
544 | |
545 for n in p: | |
546 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
|
547 show_changeset(ui, repo, changenode=n) |
255 | 548 |
404 | 549 def pull(ui, repo, source="default", **opts): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
550 """pull changes from the specified source""" |
506 | 551 source = ui.expandpath(source) |
404 | 552 |
553 ui.status('pulling from %s\n' % (source)) | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
554 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
555 other = hg.repository(ui, source) |
516 | 556 fetch = repo.findincoming(other) |
522
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
557 if not fetch: |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
558 ui.status("no changes found\n") |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
559 return |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
560 |
516 | 561 cg = other.changegroup(fetch) |
404 | 562 r = repo.addchangegroup(cg) |
563 if cg and not r: | |
564 if opts['update']: | |
565 return update(ui, repo) | |
566 else: | |
567 ui.status("(run 'hg update' to get a working copy)\n") | |
568 | |
569 return r | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
570 |
371
6e3436082697
hg push: "default-push" default target path
mpm@selenic.com
parents:
367
diff
changeset
|
571 def push(ui, repo, dest="default-push"): |
319 | 572 """push changes to the specified destination""" |
506 | 573 dest = ui.expandpath(dest) |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
574 |
319 | 575 if not dest.startswith("ssh://"): |
576 ui.warn("abort: can only push to ssh:// destinations currently\n") | |
577 return 1 | |
578 | |
579 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) | |
580 if not m: | |
581 ui.warn("abort: couldn't parse destination %s\n" % dest) | |
582 return 1 | |
583 | |
584 user, host, port, path = map(m.group, (2, 3, 5, 7)) | |
526 | 585 uhost = user and ("%s@%s" % (user, host)) or host |
319 | 586 port = port and (" -p %s") % port or "" |
587 path = path or "" | |
588 | |
589 sport = random.randrange(30000, 60000) | |
590 cmd = "ssh %s%s -R %d:localhost:%d 'cd %s; hg pull http://localhost:%d/'" | |
526 | 591 cmd = cmd % (uhost, port, sport+1, sport, path, sport+1) |
319 | 592 |
593 child = os.fork() | |
594 if not child: | |
595 sys.stdout = file("/dev/null", "w") | |
596 sys.stderr = sys.stdout | |
597 hgweb.server(repo.root, "pull", "", "localhost", sport) | |
598 else: | |
526 | 599 ui.status("connecting to %s\n" % host) |
319 | 600 r = os.system(cmd) |
601 os.kill(child, signal.SIGTERM) | |
320 | 602 return r |
319 | 603 |
403 | 604 def rawcommit(ui, repo, *flist, **rc): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
605 "raw commit interface" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
606 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
607 text = rc['text'] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
608 if not text and rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
609 try: text = open(rc['logfile']).read() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
610 except IOError: pass |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
611 if not text and not rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
612 print "missing commit text" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
613 return 1 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
614 |
403 | 615 files = relpath(repo, list(flist)) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
616 if rc['files']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
617 files += open(rc['files']).read().splitlines() |
452
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
618 |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
619 rc['parent'] = map(repo.lookup, rc['parent']) |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
620 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
621 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
622 |
245 | 623 def recover(ui, repo): |
255 | 624 """roll back an interrupted transaction""" |
245 | 625 repo.recover() |
626 | |
627 def remove(ui, repo, file, *files): | |
628 """remove the specified files on the next commit""" | |
629 repo.remove(relpath(repo, (file,) + files)) | |
630 | |
468 | 631 def root(ui, repo): |
632 """print the root (top) of the current working dir""" | |
633 ui.write(repo.root + "\n") | |
634 | |
245 | 635 def serve(ui, repo, **opts): |
255 | 636 """export the repository via HTTP""" |
245 | 637 hgweb.server(repo.root, opts["name"], opts["templates"], |
638 opts["address"], opts["port"]) | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
639 |
213 | 640 def status(ui, repo): |
641 '''show changed files in the working directory | |
642 | |
245 | 643 C = changed |
644 A = added | |
645 R = removed | |
646 ? = not tracked''' | |
312 | 647 |
648 (c, a, d, u) = repo.diffdir(os.getcwd()) | |
220 | 649 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
213 | 650 |
651 for f in c: print "C", f | |
220 | 652 for f in a: print "A", f |
213 | 653 for f in d: print "R", f |
220 | 654 for f in u: print "?", f |
213 | 655 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
656 def tag(ui, repo, name, rev = None, **opts): |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
657 """add a tag for the current tip or a given revision""" |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
658 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
659 if name == "tip": |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
660 ui.warn("abort: 'tip' is a reserved name!\n") |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
661 return -1 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
662 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
663 (c, a, d, u) = repo.diffdir(repo.root) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
664 for x in (c, a, d, u): |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
665 if ".hgtags" in x: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
666 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
|
667 ui.status("(please commit .hgtags manually)\n") |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
668 return -1 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
669 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
670 if rev: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
671 r = hg.hex(repo.lookup(rev)) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
672 else: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
673 r = hg.hex(repo.changelog.tip()) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
674 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
675 add = 0 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
676 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
|
677 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
|
678 if add: repo.add([".hgtags"]) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
679 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
680 if not opts['text']: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
681 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
|
682 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
683 repo.commit([".hgtags"], opts['text'], opts['user'], opts['date']) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
684 |
248 | 685 def tags(ui, repo): |
255 | 686 """list repository tags""" |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
687 |
343 | 688 l = repo.tagslist() |
689 l.reverse() | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
690 for t, n in l: |
248 | 691 try: |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
692 r = "%5d:%s" % (repo.changelog.rev(n), hg.hex(n)) |
248 | 693 except KeyError: |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
694 r = " ?:?" |
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
695 ui.write("%-30s %s\n" % (t, r)) |
248 | 696 |
245 | 697 def tip(ui, repo): |
255 | 698 """show the tip revision""" |
245 | 699 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
|
700 show_changeset(ui, repo, changenode=n) |
245 | 701 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
702 def undo(ui, repo): |
255 | 703 """undo the last transaction""" |
210 | 704 repo.undo() |
705 | |
275 | 706 def update(ui, repo, node=None, merge=False, clean=False): |
254 | 707 '''update or merge working directory |
708 | |
709 If there are no outstanding changes in the working directory and | |
710 there is a linear relationship between the current version and the | |
711 requested version, the result is the requested version. | |
712 | |
713 Otherwise the result is a merge between the contents of the | |
714 current working directory and the requested version. Files that | |
715 changed between either parent are marked as changed for the next | |
716 commit and a commit must be performed before any further updates | |
717 are allowed. | |
718 ''' | |
719 node = node and repo.lookup(node) or repo.changelog.tip() | |
275 | 720 return repo.update(node, allow=merge, force=clean) |
254 | 721 |
247 | 722 def verify(ui, repo): |
723 """verify the integrity of the repository""" | |
724 return repo.verify() | |
725 | |
255 | 726 # Command options and aliases are listed here, alphabetically |
727 | |
209 | 728 table = { |
245 | 729 "add": (add, [], "hg add [files]"), |
353 | 730 "addremove": (addremove, [], "hg addremove [files]"), |
437 | 731 "annotate": (annotate, |
209 | 732 [('r', 'revision', '', 'revision'), |
733 ('u', 'user', None, 'show user'), | |
734 ('n', 'number', None, 'show revision number'), | |
735 ('c', 'changeset', None, 'show changeset')], | |
736 'hg annotate [-u] [-c] [-n] [-r id] [files]'), | |
437 | 737 "cat": (cat, [], 'hg cat <file> [rev]'), |
505 | 738 "clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')], |
485 | 739 'hg clone [options] <source> [dest]'), |
289 | 740 "commit|ci": (commit, |
741 [('t', 'text', "", 'commit text'), | |
354 | 742 ('A', 'addremove', None, 'run add/remove during commit'), |
317 | 743 ('l', 'logfile', "", 'commit text file'), |
744 ('d', 'date', "", 'data'), | |
745 ('u', 'user', "", 'user')], | |
289 | 746 'hg commit [files]'), |
363 | 747 "copy": (copy, [], 'hg copy <source> <dest>'), |
460 | 748 "debugcheckdirstate": (debugcheckdirstate, [], 'debugcheckdirstate'), |
749 "debugdumpdirstate": (debugdumpdirstate, [], 'debugdumpdirstate'), | |
248 | 750 "debugindex": (debugindex, [], 'debugindex <file>'), |
751 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'), | |
245 | 752 "diff": (diff, [('r', 'rev', [], 'revision')], |
753 'hg diff [-r A] [-r B] [files]'), | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
754 "export": (export, [], "hg export <changeset>"), |
245 | 755 "forget": (forget, [], "hg forget [files]"), |
756 "heads": (heads, [], 'hg heads'), | |
757 "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
|
758 "identify|id": (identify, [], 'hg identify'), |
437 | 759 "import|patch": (import_, |
760 [('p', 'strip', 1, 'path strip'), | |
761 ('b', 'base', "", 'base path')], | |
762 "hg import [options] <patches>"), | |
496 | 763 "init": (init, [], 'hg init'), |
509 | 764 "log|history": (log, [], 'hg log [file]'), |
437 | 765 "manifest": (manifest, [], 'hg manifest [rev]'), |
227 | 766 "parents": (parents, [], 'hg parents [node]'), |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
767 "pull": (pull, |
404 | 768 [('u', 'update', None, 'update working directory')], |
769 'hg pull [options] [source]'), | |
319 | 770 "push": (push, [], 'hg push <destination>'), |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
771 "rawcommit": (rawcommit, |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
772 [('p', 'parent', [], 'parent'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
773 ('d', 'date', "", 'data'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
774 ('u', 'user', "", 'user'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
775 ('F', 'files', "", 'file list'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
776 ('t', 'text', "", 'commit text'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
777 ('l', 'logfile', "", 'commit text file')], |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
778 'hg rawcommit [options] [files]'), |
245 | 779 "recover": (recover, [], "hg recover"), |
437 | 780 "remove|rm": (remove, [], "hg remove [files]"), |
468 | 781 "root": (root, [], "hg root"), |
245 | 782 "serve": (serve, [('p', 'port', 8000, 'listen port'), |
783 ('a', 'address', '', 'interface address'), | |
784 ('n', 'name', os.getcwd(), 'repository name'), | |
785 ('t', 'templates', "", 'template map')], | |
786 "hg serve [options]"), | |
213 | 787 "status": (status, [], 'hg status'), |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
788 "tag": (tag, [('t', 'text', "", 'commit text'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
789 ('d', 'date', "", 'date'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
790 ('u', 'user', "", 'user')], |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
791 'hg tag [options] <name> [rev]'), |
248 | 792 "tags": (tags, [], 'hg tags'), |
245 | 793 "tip": (tip, [], 'hg tip'), |
210 | 794 "undo": (undo, [], 'hg undo'), |
437 | 795 "update|up|checkout|co": |
796 (update, | |
797 [('m', 'merge', None, 'allow merging of conflicts'), | |
798 ('C', 'clean', None, 'overwrite locally modified files')], | |
799 'hg update [options] [node]'), | |
247 | 800 "verify": (verify, [], 'hg verify'), |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
801 "version": (show_version, [], 'hg version'), |
209 | 802 } |
803 | |
485 | 804 norepo = "clone init version help debugindex debugindexdot" |
209 | 805 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
806 def find(cmd): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
807 for e in table.keys(): |
335 | 808 if re.match("(%s)$" % e, cmd): |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
809 return table[e] |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
810 |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
811 raise UnknownCommand(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
812 |
214 | 813 class SignalInterrupt(Exception): pass |
814 | |
815 def catchterm(*args): | |
816 raise SignalInterrupt | |
817 | |
249 | 818 def run(): |
819 sys.exit(dispatch(sys.argv[1:])) | |
820 | |
209 | 821 def dispatch(args): |
822 options = {} | |
823 opts = [('v', 'verbose', None, 'verbose'), | |
824 ('d', 'debug', None, 'debug'), | |
825 ('q', 'quiet', None, 'quiet'), | |
309 | 826 ('p', 'profile', None, 'profile'), |
517 | 827 ('R', 'repository', "", 'repository root directory'), |
527 | 828 ('', 'traceback', None, 'print traceback on exception'), |
209 | 829 ('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
|
830 ('', 'version', None, 'output version information and exit'), |
209 | 831 ] |
832 | |
833 args = fancyopts.fancyopts(args, opts, options, | |
834 'hg [options] <command> [options] [files]') | |
835 | |
836 if not args: | |
837 cmd = "help" | |
838 else: | |
839 cmd, args = args[0], args[1:] | |
840 | |
841 u = ui.ui(options["verbose"], options["debug"], options["quiet"], | |
842 not options["noninteractive"]) | |
843 | |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
844 if options["version"]: |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
845 show_version(u) |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
846 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
|
847 |
252 | 848 try: |
849 i = find(cmd) | |
850 except UnknownCommand: | |
268 | 851 u.warn("hg: unknown command '%s'\n" % cmd) |
252 | 852 help(u) |
853 sys.exit(1) | |
209 | 854 |
214 | 855 signal.signal(signal.SIGTERM, catchterm) |
856 | |
209 | 857 cmdoptions = {} |
293 | 858 try: |
859 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) | |
860 except fancyopts.getopt.GetoptError, inst: | |
861 u.warn("hg %s: %s\n" % (cmd, inst)) | |
862 help(u, cmd) | |
863 sys.exit(-1) | |
209 | 864 |
499 | 865 try: |
527 | 866 try: |
867 if cmd not in norepo.split(): | |
868 path = options["repository"] or "" | |
869 repo = hg.repository(ui=u, path=path) | |
870 d = lambda: i[0](u, repo, *args, **cmdoptions) | |
871 else: | |
872 d = lambda: i[0](u, *args, **cmdoptions) | |
209 | 873 |
527 | 874 if options['profile']: |
875 import hotshot, hotshot.stats | |
876 prof = hotshot.Profile("hg.prof") | |
877 r = prof.runcall(d) | |
878 prof.close() | |
879 stats = hotshot.stats.load("hg.prof") | |
880 stats.strip_dirs() | |
881 stats.sort_stats('time', 'calls') | |
882 stats.print_stats(40) | |
883 return r | |
884 else: | |
885 return d() | |
886 except: | |
887 if options['traceback']: | |
888 traceback.print_exc() | |
889 raise | |
508 | 890 except util.CommandError, inst: |
891 u.warn("abort: %s\n" % inst.args) | |
499 | 892 except hg.RepoError, inst: |
893 u.warn("abort: ", inst, "!\n") | |
214 | 894 except SignalInterrupt: |
895 u.warn("killed!\n") | |
209 | 896 except KeyboardInterrupt: |
897 u.warn("interrupted!\n") | |
250 | 898 except IOError, inst: |
395 | 899 if hasattr(inst, "code"): |
900 u.warn("abort: %s\n" % inst) | |
901 elif hasattr(inst, "reason"): | |
902 u.warn("abort: error %d: %s\n" % (inst.reason[0], inst.reason[1])) | |
903 elif hasattr(inst, "args") and inst[0] == errno.EPIPE: | |
250 | 904 u.warn("broken pipe\n") |
905 else: | |
906 raise | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
907 except TypeError, inst: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
908 # was this an argument error? |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
909 tb = traceback.extract_tb(sys.exc_info()[2]) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
910 if len(tb) > 2: # no |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
911 raise |
293 | 912 u.debug(inst, "\n") |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
913 u.warn("%s: invalid arguments\n" % i[0].__name__) |
293 | 914 help(u, cmd) |
915 | |
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
500
diff
changeset
|
916 sys.exit(-1) |
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
500
diff
changeset
|
917 |