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