Mercurial > hg > mercurial-crew-with-dirclash
annotate mercurial/commands.py @ 585:51626d888526
[PATCH] Changelogentry template cleanup
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[PATCH] Changelogentry template cleanup
From: Edouard Gomez <edouard.gomez@gmail.com>
Changelogentry template cleanup
Removed unuseful outside div (was probably used to carry the
parity class, it's no use, multiple css classes can be assigned
to the inner table instead)
Removed all hardwired styles in html tags. The style has been
externalized to equivalent CSS classes.
The inner table is now assigned the parity CSS class.
Changed all relevant table cells from td to th.
Added classes to all cells in order to give some semantic rationale
to these table cells.
manifest hash: 2835217df09be445961b865be166c2470173ba58
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCx1g5ywK+sNU5EO8RAhKGAKCWAHrx+lLMAXjd4/vgvG7vmfSkAACfTZ+m
/EyUsDVaYeVcGzFsp8liReI=
=vt2N
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Sat, 02 Jul 2005 19:15:05 -0800 |
parents | df8a5a0098d4 |
children | 0c3bae18403b |
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: ] | |
554 | 32 return [ util.pconvert(os.path.normpath(os.path.join(p, x))) |
33 for x in args ] | |
209 | 34 return args |
245 | 35 |
580 | 36 revrangesep = ':' |
37 | |
38 def revrange(ui, repo, revs = [], revlog = None): | |
39 if revlog is None: | |
40 revlog = repo.changelog | |
41 revcount = revlog.count() | |
42 def fix(val, defval): | |
43 if not val: return defval | |
44 try: | |
45 num = int(val) | |
46 if str(num) != val: raise ValueError | |
47 if num < 0: num += revcount | |
48 if not (0 <= num < revcount): | |
49 raise ValueError | |
50 except ValueError: | |
51 try: | |
52 num = repo.changelog.rev(repo.lookup(val)) | |
53 except KeyError: | |
54 try: | |
55 num = revlog.rev(revlog.lookup(val)) | |
56 except KeyError: | |
57 ui.warn('abort: invalid revision identifier %s\n' % val) | |
58 sys.exit(1) | |
59 return num | |
60 for spec in revs: | |
61 if spec.find(revrangesep) >= 0: | |
62 start, end = spec.split(revrangesep, 1) | |
63 start = fix(start, 0) | |
64 end = fix(end, revcount - 1) | |
65 if end > start: | |
66 end += 1 | |
67 step = 1 | |
68 else: | |
69 end -= 1 | |
70 step = -1 | |
71 for rev in xrange(start, end, step): | |
72 yield str(rev) | |
73 else: | |
74 yield spec | |
75 | |
76 def dodiff(fp, ui, repo, files = None, node1 = None, node2 = None): | |
245 | 77 def date(c): |
78 return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) | |
79 | |
561 | 80 (c, a, d, u) = repo.changes(node1, node2, files) |
537 | 81 if files: |
82 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) | |
83 | |
84 if not c and not a and not d: | |
85 return | |
86 | |
245 | 87 if node2: |
88 change = repo.changelog.read(node2) | |
89 mmap2 = repo.manifest.read(change[0]) | |
90 def read(f): return repo.file(f).read(mmap2[f]) | |
91 date2 = date(change) | |
92 else: | |
93 date2 = time.asctime() | |
94 if not node1: | |
95 node1 = repo.dirstate.parents()[0] | |
417 | 96 def read(f): return repo.wfile(f).read() |
245 | 97 |
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
|
98 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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 |
245 | 104 change = repo.changelog.read(node1) |
105 mmap = repo.manifest.read(change[0]) | |
106 date1 = date(change) | |
107 | |
108 for f in c: | |
275 | 109 to = None |
110 if f in mmap: | |
111 to = repo.file(f).read(mmap[f]) | |
245 | 112 tn = read(f) |
580 | 113 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
245 | 114 for f in a: |
264
4c1d7072d5cd
Attempt to make diff deal with null sources properly
mpm@selenic.com
parents:
262
diff
changeset
|
115 to = None |
245 | 116 tn = read(f) |
580 | 117 fp.write(mdiff.unidiff(to, date1, tn, date2, f, r)) |
245 | 118 for f in d: |
119 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
|
120 tn = None |
580 | 121 fp.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
|
122 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
123 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
|
124 """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
|
125 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
|
126 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
|
127 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
|
128 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
|
129 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
|
130 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
|
131 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
|
132 else: |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
133 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
|
134 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
|
135 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
|
136 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
|
137 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
|
138 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
|
139 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
|
140 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
141 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
|
142 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
|
143 return |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
144 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
145 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
|
146 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
147 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
|
148 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
|
149 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
|
150 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
|
151 parents = [] |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
152 |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
153 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
|
154 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
|
155 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
|
156 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
|
157 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
|
158 else: |
67c19ad374a9
Use common output function show_changeset() for hg heads|history|log|tip.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
320
diff
changeset
|
159 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
|
160 for tag in repo.nodetags(changenode): |
c07c6fb2f0a8
Show tags in hg history etc.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
386
diff
changeset
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 if ui.debugflag: |
536 | 170 files = repo.changes(changelog.parents(changenode)[0], changenode) |
490
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
171 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
|
172 if value: |
df9b77f67998
Make show_changeset show added and deleted files in verbose mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
485
diff
changeset
|
173 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
|
174 else: |
30752b14f759
Make show_changeset show added/deleted files only in debug mode.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
490
diff
changeset
|
175 ui.note("files: %s\n" % " ".join(changes[3])) |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
176 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
|
177 if description: |
330 | 178 if ui.verbose: |
179 ui.status("description:\n") | |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
180 ui.status(description) |
546
c8ae964109c1
Add an empty line after description in verbose mode of show_changeset.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
542
diff
changeset
|
181 ui.status("\n\n") |
330 | 182 else: |
347
a0b2758edee7
Cleaned up show_changeset()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
330
diff
changeset
|
183 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
|
184 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
|
185 |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
186 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
|
187 """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
|
188 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
|
189 ui.status( |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
190 "\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
|
191 "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
|
192 "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
|
193 "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
|
194 ) |
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
195 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
196 def help(ui, cmd=None): |
255 | 197 '''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
|
198 if cmd: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
199 try: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
200 i = find(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
201 ui.write("%s\n\n" % i[2]) |
293 | 202 |
203 if i[1]: | |
204 for s, l, d, c in i[1]: | |
205 opt=' ' | |
206 if s: opt = opt + '-' + s + ' ' | |
207 if l: opt = opt + '--' + l + ' ' | |
208 if d: opt = opt + '(' + str(d) + ')' | |
209 ui.write(opt, "\n") | |
210 if c: ui.write(' %s\n' % c) | |
211 ui.write("\n") | |
212 | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
213 ui.write(i[0].__doc__, "\n") |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
214 except UnknownCommand: |
268 | 215 ui.warn("hg: unknown command %s\n" % cmd) |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
216 sys.exit(0) |
255 | 217 else: |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
218 if not ui.quiet: |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
219 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
|
220 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
|
221 ui.write('hg commands:\n\n') |
209 | 222 |
255 | 223 h = {} |
479
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
224 for c, e in table.items(): |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
225 f = c.split("|")[0] |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
226 if f.startswith("debug"): |
7293cb91bf2a
Cleaned up command alias handling in help.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
477
diff
changeset
|
227 continue |
255 | 228 d = "" |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
229 if e[0].__doc__: |
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
230 d = e[0].__doc__.splitlines(0)[0].rstrip() |
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
231 h[f] = d |
255 | 232 |
233 fns = h.keys() | |
234 fns.sort() | |
235 m = max(map(len, fns)) | |
236 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
|
237 ui.write(' %-*s %s\n' % (m, f, h[f])) |
255 | 238 |
239 # Commands start here, listed alphabetically | |
209 | 240 |
245 | 241 def add(ui, repo, file, *files): |
242 '''add the specified files on the next commit''' | |
243 repo.add(relpath(repo, (file,) + files)) | |
213 | 244 |
353 | 245 def addremove(ui, repo, *files): |
255 | 246 """add all new files, delete all missing files""" |
353 | 247 if files: |
248 files = relpath(repo, files) | |
249 d = [] | |
250 u = [] | |
251 for f in files: | |
252 p = repo.wjoin(f) | |
253 s = repo.dirstate.state(f) | |
254 isfile = os.path.isfile(p) | |
255 if s != 'r' and not isfile: | |
256 d.append(f) | |
257 elif s not in 'nmai' and isfile: | |
258 u.append(f) | |
259 else: | |
536 | 260 (c, a, d, u) = repo.changes(None, None) |
259 | 261 repo.add(u) |
245 | 262 repo.remove(d) |
219
8ff4532376a4
hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents:
214
diff
changeset
|
263 |
245 | 264 def annotate(u, repo, file, *files, **ops): |
255 | 265 """show changeset information per file line""" |
209 | 266 def getnode(rev): |
267 return hg.short(repo.changelog.node(rev)) | |
268 | |
269 def getname(rev): | |
270 try: | |
271 return bcache[rev] | |
272 except KeyError: | |
273 cl = repo.changelog.read(repo.changelog.node(rev)) | |
274 name = cl[1] | |
275 f = name.find('@') | |
276 if f >= 0: | |
277 name = name[:f] | |
534
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
278 f = name.find('<') |
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
279 if f >= 0: |
ab0d1bfeee7c
[PATCH] Handle 'name firstname <email@server>' correctly in annotate
mpm@selenic.com
parents:
532
diff
changeset
|
280 name = name[f+1:] |
209 | 281 bcache[rev] = name |
282 return name | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
283 |
209 | 284 bcache = {} |
285 opmap = [['user', getname], ['number', str], ['changeset', getnode]] | |
286 if not ops['user'] and not ops['changeset']: | |
287 ops['number'] = 1 | |
288 | |
227 | 289 node = repo.dirstate.parents()[0] |
209 | 290 if ops['revision']: |
291 node = repo.changelog.lookup(ops['revision']) | |
292 change = repo.changelog.read(node) | |
293 mmap = repo.manifest.read(change[0]) | |
245 | 294 for f in relpath(repo, (file,) + files): |
209 | 295 lines = repo.file(f).annotate(mmap[f]) |
296 pieces = [] | |
297 | |
298 for o, f in opmap: | |
299 if ops[o]: | |
300 l = [ f(n) for n,t in lines ] | |
301 m = max(map(len, l)) | |
302 pieces.append([ "%*s" % (m, x) for x in l]) | |
303 | |
304 for p,l in zip(zip(*pieces), lines): | |
305 u.write(" ".join(p) + ": " + l[1]) | |
306 | |
248 | 307 def cat(ui, repo, file, rev = []): |
255 | 308 """output the latest or given revision of a file""" |
281 | 309 r = repo.file(relpath(repo, [file])[0]) |
248 | 310 n = r.tip() |
311 if rev: n = r.lookup(rev) | |
312 sys.stdout.write(r.read(n)) | |
313 | |
485 | 314 def clone(ui, source, dest = None, **opts): |
315 """make a copy of an existing repository""" | |
506 | 316 source = ui.expandpath(source) |
485 | 317 |
318 if dest is None: | |
528 | 319 dest = os.path.basename(os.path.normpath(source)) |
532
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
320 |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
321 if os.path.exists(dest): |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
322 ui.warn("abort: destination '%s' already exists\n" % dest) |
2e9698a5c92c
clone: abort on pre-existing destination directory
mpm@selenic.com
parents:
528
diff
changeset
|
323 return 1 |
523
003df62ae39f
[PATCH] Force "hg clone" to always create a new directory
mpm@selenic.com
parents:
522
diff
changeset
|
324 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
325 class dircleanup: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
326 def __init__(self, dir): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
327 self.dir = dir |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
328 os.mkdir(dir) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
329 def close(self): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
330 self.dir = None |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
331 def __del__(self): |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
332 if self.dir: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
333 import shutil |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
334 shutil.rmtree(self.dir, True) |
485 | 335 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
336 d = dircleanup(dest) |
485 | 337 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
338 link = 0 |
562
be6233a2bfdd
hg clone: only use the absolute path for .hg/hgrc
mpm@selenic.com
parents:
561
diff
changeset
|
339 abspath = source |
542 | 340 if not (source.startswith("http://") or |
341 source.startswith("hg://") or | |
342 source.startswith("old-http://")): | |
562
be6233a2bfdd
hg clone: only use the absolute path for .hg/hgrc
mpm@selenic.com
parents:
561
diff
changeset
|
343 abspath = os.path.abspath(source) |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
344 d1 = os.stat(dest).st_dev |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
345 d2 = os.stat(source).st_dev |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
346 if d1 == d2: link = 1 |
485 | 347 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
348 if link: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
349 ui.note("copying by hardlink\n") |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
350 util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
351 try: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
352 os.remove(os.path.join(dest, ".hg", "dirstate")) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
353 except: pass |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
354 |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
355 repo = hg.repository(ui, dest) |
485 | 356 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
357 else: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
358 repo = hg.repository(ui, dest, create=1) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
359 other = hg.repository(ui, source) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
360 fetch = repo.findincoming(other) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
361 if fetch: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
362 cg = other.changegroup(fetch) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
363 repo.addchangegroup(cg) |
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
500
diff
changeset
|
364 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
365 f = repo.opener("hgrc", "w") |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
366 f.write("[paths]\n") |
562
be6233a2bfdd
hg clone: only use the absolute path for .hg/hgrc
mpm@selenic.com
parents:
561
diff
changeset
|
367 f.write("default = %s\n" % abspath) |
515 | 368 |
535
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
369 if not opts['noupdate']: |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
370 update(ui, repo) |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
371 |
fba26990604a
Deal with failed clone/transaction interaction
mpm@selenic.com
parents:
534
diff
changeset
|
372 d.close() |
515 | 373 |
289 | 374 def commit(ui, repo, *files, **opts): |
245 | 375 """commit the specified files or all outstanding changes""" |
289 | 376 text = opts['text'] |
377 if not text and opts['logfile']: | |
378 try: text = open(opts['logfile']).read() | |
379 except IOError: pass | |
380 | |
354 | 381 if opts['addremove']: |
382 addremove(ui, repo, *files) | |
317 | 383 repo.commit(relpath(repo, files), text, opts['user'], opts['date']) |
245 | 384 |
363 | 385 def copy(ui, repo, source, dest): |
386 """mark a file as copied or renamed for the next commit""" | |
387 return repo.copy(*relpath(repo, (source, dest))) | |
388 | |
460 | 389 def debugcheckdirstate(ui, repo): |
390 parent1, parent2 = repo.dirstate.parents() | |
555 | 391 repo.dirstate.read() |
392 dc = repo.dirstate.map | |
460 | 393 keys = dc.keys() |
394 keys.sort() | |
395 m1n = repo.changelog.read(parent1)[0] | |
396 m2n = repo.changelog.read(parent2)[0] | |
397 m1 = repo.manifest.read(m1n) | |
398 m2 = repo.manifest.read(m2n) | |
399 errors = 0 | |
400 for f in dc: | |
401 state = repo.dirstate.state(f) | |
402 if state in "nr" and f not in m1: | |
582 | 403 ui.warn("%s in state %s, but not in manifest1\n" % (f, state)) |
460 | 404 errors += 1 |
405 if state in "a" and f in m1: | |
582 | 406 ui.warn("%s in state %s, but also in manifest1\n" % (f, state)) |
460 | 407 errors += 1 |
408 if state in "m" and f not in m1 and f not in m2: | |
582 | 409 ui.warn("%s in state %s, but not in either manifest\n" % |
410 (f, state)) | |
460 | 411 errors += 1 |
412 for f in m1: | |
413 state = repo.dirstate.state(f) | |
414 if state not in "nrm": | |
582 | 415 ui.warn("%s in manifest1, but listed as state %s" % (f, state)) |
460 | 416 errors += 1 |
417 if errors: | |
582 | 418 ui.warn(".hg/dirstate inconsistent with current parent's manifest\n") |
460 | 419 sys.exit(1) |
420 | |
421 def debugdumpdirstate(ui, repo): | |
555 | 422 repo.dirstate.read() |
423 dc = repo.dirstate.map | |
460 | 424 keys = dc.keys() |
425 keys.sort() | |
426 for file in keys: | |
582 | 427 ui.write("%c %s\n" % (dc[file][0], file)) |
460 | 428 |
248 | 429 def debugindex(ui, file): |
417 | 430 r = hg.revlog(hg.opener(""), file, "") |
582 | 431 ui.write(" rev offset length base linkrev" + |
432 " p1 p2 nodeid\n") | |
248 | 433 for i in range(r.count()): |
434 e = r.index[i] | |
582 | 435 ui.write("% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s..\n" % ( |
436 i, e[0], e[1], e[2], e[3], | |
437 hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5]))) | |
248 | 438 |
439 def debugindexdot(ui, file): | |
417 | 440 r = hg.revlog(hg.opener(""), file, "") |
582 | 441 ui.write("digraph G {\n") |
248 | 442 for i in range(r.count()): |
443 e = r.index[i] | |
582 | 444 ui.write("\t%d -> %d\n" % (r.rev(e[4]), i)) |
248 | 445 if e[5] != hg.nullid: |
582 | 446 ui.write("\t%d -> %d\n" % (r.rev(e[5]), i)) |
447 ui.write("}\n") | |
248 | 448 |
245 | 449 def diff(ui, repo, *files, **opts): |
255 | 450 """diff working directory (or selected files)""" |
245 | 451 revs = [] |
452 if opts['rev']: | |
453 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
|
454 |
245 | 455 if len(revs) > 2: |
480
430a10669928
Fixed call to ui.warn()
Thomas Arendsen Hein <thomas@intevation.de>
parents:
479
diff
changeset
|
456 ui.warn("too many revisions to diff\n") |
245 | 457 sys.exit(1) |
458 | |
459 if files: | |
460 files = relpath(repo, files) | |
461 else: | |
462 files = relpath(repo, [""]) | |
463 | |
580 | 464 dodiff(sys.stdout, ui, repo, files, *revs) |
245 | 465 |
580 | 466 def doexport(ui, repo, changeset, seqno, total, revwidth, opts): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
467 node = repo.lookup(changeset) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
468 prev, other = repo.changelog.parents(node) |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
469 change = repo.changelog.read(node) |
580 | 470 |
471 def expand(name): | |
472 expansions = { | |
473 '%': lambda: '%', | |
474 'H': lambda: hg.hex(node), | |
475 'N': lambda: str(total), | |
476 'R': lambda: str(repo.changelog.rev(node)), | |
477 'b': lambda: os.path.basename(repo.root), | |
478 'h': lambda: hg.short(node), | |
479 'n': lambda: str(seqno).zfill(len(str(total))), | |
480 'r': lambda: str(repo.changelog.rev(node)).zfill(revwidth), | |
481 } | |
482 newname = [] | |
483 namelen = len(name) | |
484 i = 0 | |
485 while i < namelen: | |
486 c = name[i] | |
487 if c == '%': | |
488 i += 1 | |
489 c = name[i] | |
490 c = expansions[c]() | |
491 newname.append(c) | |
492 i += 1 | |
493 return ''.join(newname) | |
494 | |
495 if opts['output'] and opts['output'] != '-': | |
496 try: | |
497 fp = open(expand(opts['output']), 'w') | |
498 except KeyError, inst: | |
499 ui.warn("error: invalid format spec '%%%s' in output file name\n" % | |
500 inst.args[0]) | |
501 sys.exit(1) | |
502 else: | |
503 fp = sys.stdout | |
504 | |
582 | 505 fp.write("# HG changeset patch\n") |
506 fp.write("# User %s\n" % change[1]) | |
507 fp.write("# Node ID %s\n" % hg.hex(node)) | |
508 fp.write("# Parent %s\n" % hg.hex(prev)) | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
509 if other != hg.nullid: |
582 | 510 fp.write("# Parent %s\n" % hg.hex(other)) |
511 fp.write(change[4].rstrip()) | |
512 fp.write("\n\n") | |
580 | 513 |
514 dodiff(fp, ui, repo, None, prev, node) | |
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
|
515 |
580 | 516 def export(ui, repo, *changesets, **opts): |
517 """dump the header and diffs for one or more changesets""" | |
518 seqno = 0 | |
519 revs = list(revrange(ui, repo, changesets)) | |
520 total = len(revs) | |
521 revwidth = max(len(revs[0]), len(revs[-1])) | |
522 for cset in revs: | |
523 seqno += 1 | |
524 doexport(ui, repo, cset, seqno, total, revwidth, opts) | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
525 |
245 | 526 def forget(ui, repo, file, *files): |
527 """don't add the specified files on the next commit""" | |
528 repo.forget(relpath(repo, (file,) + files)) | |
529 | |
221 | 530 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
|
531 """show current repository heads""" |
221 | 532 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
|
533 show_changeset(ui, repo, changenode=n) |
221 | 534 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
535 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
|
536 """print information about the working copy""" |
343 | 537 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
|
538 if not parents: |
343 | 539 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
|
540 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
|
541 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
542 hexfunc = ui.verbose and hg.hex or hg.short |
536 | 543 (c, a, d, u) = repo.changes(None, None) |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
544 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
|
545 (c or a or d) and "+" or "")] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
546 |
339
a76fc9c4b67b
added hg identify|id (based on a patch from Andrew Thompson)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
338
diff
changeset
|
547 if not ui.quiet: |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
548 # multiple tags for a single parent separated by '/' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
549 parenttags = ['/'.join(tags) |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
550 for tags in map(repo.nodetags, parents) if tags] |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
551 # tags for multiple parents separated by ' + ' |
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
552 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
|
553 |
386
494c8e3f47f3
Improvements for hg identify:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
371
diff
changeset
|
554 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
|
555 |
437 | 556 def import_(ui, repo, patch1, *patches, **opts): |
557 """import an ordered set of patches""" | |
558 try: | |
559 import psyco | |
560 psyco.full() | |
561 except: | |
562 pass | |
563 | |
564 patches = (patch1,) + patches | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
565 |
437 | 566 d = opts["base"] |
567 strip = opts["strip"] | |
568 | |
569 for patch in patches: | |
570 ui.status("applying %s\n" % patch) | |
571 pf = os.path.join(d, patch) | |
572 | |
573 text = "" | |
574 for l in file(pf): | |
575 if l[:4] == "--- ": break | |
576 text += l | |
577 | |
578 # make sure text isn't empty | |
579 if not text: text = "imported patch %s\n" % patch | |
580 | |
581 f = os.popen("patch -p%d < %s" % (strip, pf)) | |
582 files = [] | |
583 for l in f.read().splitlines(): | |
584 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
|
585 ui.status("%s\n" % l) |
437 | 586 if l[:14] == 'patching file ': |
443 | 587 pf = l[14:] |
588 if pf not in files: | |
589 files.append(pf) | |
590 patcherr = f.close() | |
591 if patcherr: | |
592 sys.stderr.write("patch failed") | |
593 sys.exit(1) | |
437 | 594 |
595 if len(files) > 0: | |
596 addremove(ui, repo, *files) | |
597 repo.commit(files, text) | |
598 | |
496 | 599 def init(ui, source=None): |
600 """create a new repository in the current directory""" | |
290 | 601 |
602 if source: | |
496 | 603 ui.warn("no longer supported: use \"hg clone\" instead\n") |
604 sys.exit(1) | |
605 repo = hg.repository(ui, ".", create=1) | |
338 | 606 |
552
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
607 def log(ui, repo, f=None, **opts): |
509 | 608 """show the revision history of the repository or a single file""" |
609 if f: | |
552
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
610 filelog = repo.file(relpath(repo, [f])[0]) |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
611 log = filelog |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
612 lookup = filelog.lookup |
509 | 613 else: |
552
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
614 filelog = None |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
615 log = repo.changelog |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
616 lookup = repo.lookup |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
617 revlist = [] |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
618 revs = [log.rev(lookup(rev)) for rev in opts['rev']] |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
619 while revs: |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
620 if len(revs) == 1: |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
621 revlist.append(revs.pop(0)) |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
622 else: |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
623 a = revs.pop(0) |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
624 b = revs.pop(0) |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
625 off = a > b and -1 or 1 |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
626 revlist.extend(range(a, b + off, off)) |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
627 for i in revlist or range(log.count() - 1, -1, -1): |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
628 show_changeset(ui, repo, filelog=filelog, rev=i) |
255 | 629 |
630 def manifest(ui, repo, rev = []): | |
631 """output the latest or given revision of the project manifest""" | |
632 n = repo.manifest.tip() | |
633 if rev: | |
634 n = repo.manifest.lookup(rev) | |
635 m = repo.manifest.read(n) | |
276 | 636 mf = repo.manifest.readflags(n) |
255 | 637 files = m.keys() |
638 files.sort() | |
639 | |
640 for f in files: | |
276 | 641 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f)) |
255 | 642 |
643 def parents(ui, repo, node = None): | |
644 '''show the parents of the current working dir''' | |
645 if node: | |
646 p = repo.changelog.parents(repo.lookup(hg.bin(node))) | |
647 else: | |
648 p = repo.dirstate.parents() | |
649 | |
650 for n in p: | |
651 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
|
652 show_changeset(ui, repo, changenode=n) |
255 | 653 |
404 | 654 def pull(ui, repo, source="default", **opts): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
655 """pull changes from the specified source""" |
506 | 656 source = ui.expandpath(source) |
404 | 657 |
658 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
|
659 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
660 other = hg.repository(ui, source) |
516 | 661 fetch = repo.findincoming(other) |
522
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
662 if not fetch: |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
663 ui.status("no changes found\n") |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
664 return |
2f1de824798a
Fix empty pull bug that appeared this morning
mpm@selenic.com
parents:
518
diff
changeset
|
665 |
516 | 666 cg = other.changegroup(fetch) |
404 | 667 r = repo.addchangegroup(cg) |
668 if cg and not r: | |
669 if opts['update']: | |
670 return update(ui, repo) | |
580 | 671 else: |
404 | 672 ui.status("(run 'hg update' to get a working copy)\n") |
673 | |
674 return r | |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
675 |
371
6e3436082697
hg push: "default-push" default target path
mpm@selenic.com
parents:
367
diff
changeset
|
676 def push(ui, repo, dest="default-push"): |
319 | 677 """push changes to the specified destination""" |
506 | 678 dest = ui.expandpath(dest) |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
679 |
319 | 680 if not dest.startswith("ssh://"): |
681 ui.warn("abort: can only push to ssh:// destinations currently\n") | |
682 return 1 | |
683 | |
684 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) | |
685 if not m: | |
686 ui.warn("abort: couldn't parse destination %s\n" % dest) | |
687 return 1 | |
688 | |
689 user, host, port, path = map(m.group, (2, 3, 5, 7)) | |
526 | 690 uhost = user and ("%s@%s" % (user, host)) or host |
319 | 691 port = port and (" -p %s") % port or "" |
692 path = path or "" | |
693 | |
694 sport = random.randrange(30000, 60000) | |
695 cmd = "ssh %s%s -R %d:localhost:%d 'cd %s; hg pull http://localhost:%d/'" | |
526 | 696 cmd = cmd % (uhost, port, sport+1, sport, path, sport+1) |
319 | 697 |
698 child = os.fork() | |
699 if not child: | |
700 sys.stdout = file("/dev/null", "w") | |
701 sys.stderr = sys.stdout | |
702 hgweb.server(repo.root, "pull", "", "localhost", sport) | |
703 else: | |
526 | 704 ui.status("connecting to %s\n" % host) |
319 | 705 r = os.system(cmd) |
706 os.kill(child, signal.SIGTERM) | |
320 | 707 return r |
319 | 708 |
403 | 709 def rawcommit(ui, repo, *flist, **rc): |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
710 "raw commit interface" |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
711 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
712 text = rc['text'] |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
713 if not text and rc['logfile']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
714 try: text = open(rc['logfile']).read() |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
715 except IOError: pass |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
716 if not text and not rc['logfile']: |
582 | 717 ui.warn("abort: missing commit text\n") |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
718 return 1 |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
719 |
403 | 720 files = relpath(repo, list(flist)) |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
721 if rc['files']: |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
722 files += open(rc['files']).read().splitlines() |
452
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
723 |
a1e91c24dab5
rawcommit: do lookup of parents at the appropriate layer
mpm@selenic.com
parents:
443
diff
changeset
|
724 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
|
725 |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
726 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
|
727 |
245 | 728 def recover(ui, repo): |
255 | 729 """roll back an interrupted transaction""" |
245 | 730 repo.recover() |
731 | |
732 def remove(ui, repo, file, *files): | |
733 """remove the specified files on the next commit""" | |
734 repo.remove(relpath(repo, (file,) + files)) | |
735 | |
468 | 736 def root(ui, repo): |
737 """print the root (top) of the current working dir""" | |
738 ui.write(repo.root + "\n") | |
739 | |
245 | 740 def serve(ui, repo, **opts): |
255 | 741 """export the repository via HTTP""" |
245 | 742 hgweb.server(repo.root, opts["name"], opts["templates"], |
743 opts["address"], opts["port"]) | |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
744 |
213 | 745 def status(ui, repo): |
746 '''show changed files in the working directory | |
747 | |
245 | 748 C = changed |
749 A = added | |
750 R = removed | |
751 ? = not tracked''' | |
312 | 752 |
537 | 753 (c, a, d, u) = repo.changes(None, None) |
220 | 754 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) |
213 | 755 |
582 | 756 for f in c: ui.write("C ", f, "\n") |
757 for f in a: ui.write("A ", f, "\n") | |
758 for f in d: ui.write("R ", f, "\n") | |
759 for f in u: ui.write("? ", f, "\n") | |
213 | 760 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
761 def tag(ui, repo, name, rev = None, **opts): |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
762 """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
|
763 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
764 if name == "tip": |
580 | 765 ui.warn("abort: 'tip' is a reserved name!\n") |
766 return -1 | |
767 if name.find(revrangesep) >= 0: | |
768 ui.warn("abort: '%s' cannot be used in a tag name\n" % revrangesep) | |
769 return -1 | |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
770 |
536 | 771 (c, a, d, u) = repo.changes(None, None) |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
772 for x in (c, a, d, u): |
580 | 773 if ".hgtags" in x: |
774 ui.warn("abort: working copy of .hgtags is changed!\n") | |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
775 ui.status("(please commit .hgtags manually)\n") |
580 | 776 return -1 |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
777 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
778 if rev: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
779 r = hg.hex(repo.lookup(rev)) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
780 else: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
781 r = hg.hex(repo.changelog.tip()) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
782 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
783 add = 0 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
784 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
|
785 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
|
786 if add: repo.add([".hgtags"]) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
787 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
788 if not opts['text']: |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
789 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
|
790 |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
791 repo.commit([".hgtags"], opts['text'], opts['user'], opts['date']) |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
792 |
248 | 793 def tags(ui, repo): |
255 | 794 """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
|
795 |
343 | 796 l = repo.tagslist() |
797 l.reverse() | |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
798 for t, n in l: |
248 | 799 try: |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
800 r = "%5d:%s" % (repo.changelog.rev(n), hg.hex(n)) |
248 | 801 except KeyError: |
477
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
802 r = " ?:?" |
520540fd6b64
Handle errors in .hgtags or hgrc [tags] section more gracefully.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
470
diff
changeset
|
803 ui.write("%-30s %s\n" % (t, r)) |
248 | 804 |
245 | 805 def tip(ui, repo): |
255 | 806 """show the tip revision""" |
245 | 807 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
|
808 show_changeset(ui, repo, changenode=n) |
245 | 809 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
810 def undo(ui, repo): |
255 | 811 """undo the last transaction""" |
210 | 812 repo.undo() |
813 | |
275 | 814 def update(ui, repo, node=None, merge=False, clean=False): |
254 | 815 '''update or merge working directory |
816 | |
817 If there are no outstanding changes in the working directory and | |
818 there is a linear relationship between the current version and the | |
819 requested version, the result is the requested version. | |
820 | |
821 Otherwise the result is a merge between the contents of the | |
822 current working directory and the requested version. Files that | |
823 changed between either parent are marked as changed for the next | |
824 commit and a commit must be performed before any further updates | |
825 are allowed. | |
826 ''' | |
827 node = node and repo.lookup(node) or repo.changelog.tip() | |
275 | 828 return repo.update(node, allow=merge, force=clean) |
254 | 829 |
247 | 830 def verify(ui, repo): |
831 """verify the integrity of the repository""" | |
832 return repo.verify() | |
833 | |
255 | 834 # Command options and aliases are listed here, alphabetically |
835 | |
209 | 836 table = { |
245 | 837 "add": (add, [], "hg add [files]"), |
353 | 838 "addremove": (addremove, [], "hg addremove [files]"), |
437 | 839 "annotate": (annotate, |
209 | 840 [('r', 'revision', '', 'revision'), |
841 ('u', 'user', None, 'show user'), | |
842 ('n', 'number', None, 'show revision number'), | |
843 ('c', 'changeset', None, 'show changeset')], | |
844 'hg annotate [-u] [-c] [-n] [-r id] [files]'), | |
437 | 845 "cat": (cat, [], 'hg cat <file> [rev]'), |
505 | 846 "clone": (clone, [('U', 'noupdate', None, 'skip update after cloning')], |
485 | 847 'hg clone [options] <source> [dest]'), |
289 | 848 "commit|ci": (commit, |
849 [('t', 'text', "", 'commit text'), | |
354 | 850 ('A', 'addremove', None, 'run add/remove during commit'), |
317 | 851 ('l', 'logfile', "", 'commit text file'), |
852 ('d', 'date', "", 'data'), | |
853 ('u', 'user', "", 'user')], | |
289 | 854 'hg commit [files]'), |
363 | 855 "copy": (copy, [], 'hg copy <source> <dest>'), |
460 | 856 "debugcheckdirstate": (debugcheckdirstate, [], 'debugcheckdirstate'), |
857 "debugdumpdirstate": (debugdumpdirstate, [], 'debugdumpdirstate'), | |
248 | 858 "debugindex": (debugindex, [], 'debugindex <file>'), |
859 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'), | |
245 | 860 "diff": (diff, [('r', 'rev', [], 'revision')], |
861 'hg diff [-r A] [-r B] [files]'), | |
580 | 862 "export": (export, [('o', 'output', "", 'output to file')], |
863 "hg export [-o file] <changeset> ..."), | |
245 | 864 "forget": (forget, [], "hg forget [files]"), |
865 "heads": (heads, [], 'hg heads'), | |
866 "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
|
867 "identify|id": (identify, [], 'hg identify'), |
437 | 868 "import|patch": (import_, |
869 [('p', 'strip', 1, 'path strip'), | |
870 ('b', 'base', "", 'base path')], | |
871 "hg import [options] <patches>"), | |
496 | 872 "init": (init, [], 'hg init'), |
552
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
873 "log|history": (log, |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
874 [('r', 'rev', [], 'revision')], |
2204311609a0
Allow specifying revisions in 'hg log' like with 'hg diff'.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
875 'hg log [-r A] [-r B] [file]'), |
437 | 876 "manifest": (manifest, [], 'hg manifest [rev]'), |
227 | 877 "parents": (parents, [], 'hg parents [node]'), |
500
ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
mpm@selenic.com
parents:
499
diff
changeset
|
878 "pull": (pull, |
404 | 879 [('u', 'update', None, 'update working directory')], |
580 | 880 'hg pull [options] [source]'), |
319 | 881 "push": (push, [], 'hg push <destination>'), |
246
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
882 "rawcommit": (rawcommit, |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
883 [('p', 'parent', [], 'parent'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
884 ('d', 'date', "", 'data'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
885 ('u', 'user', "", 'user'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
886 ('F', 'files', "", 'file list'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
887 ('t', 'text', "", 'commit text'), |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
888 ('l', 'logfile', "", 'commit text file')], |
96cde50a746f
Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents:
245
diff
changeset
|
889 'hg rawcommit [options] [files]'), |
245 | 890 "recover": (recover, [], "hg recover"), |
437 | 891 "remove|rm": (remove, [], "hg remove [files]"), |
468 | 892 "root": (root, [], "hg root"), |
245 | 893 "serve": (serve, [('p', 'port', 8000, 'listen port'), |
894 ('a', 'address', '', 'interface address'), | |
895 ('n', 'name', os.getcwd(), 'repository name'), | |
896 ('t', 'templates', "", 'template map')], | |
897 "hg serve [options]"), | |
213 | 898 "status": (status, [], 'hg status'), |
401
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
899 "tag": (tag, [('t', 'text', "", 'commit text'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
900 ('d', 'date', "", 'date'), |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
901 ('u', 'user', "", 'user')], |
af4848f83e68
From: Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl>
mpm@selenic.com
parents:
396
diff
changeset
|
902 'hg tag [options] <name> [rev]'), |
248 | 903 "tags": (tags, [], 'hg tags'), |
245 | 904 "tip": (tip, [], 'hg tip'), |
210 | 905 "undo": (undo, [], 'hg undo'), |
437 | 906 "update|up|checkout|co": |
907 (update, | |
908 [('m', 'merge', None, 'allow merging of conflicts'), | |
909 ('C', 'clean', None, 'overwrite locally modified files')], | |
910 'hg update [options] [node]'), | |
247 | 911 "verify": (verify, [], 'hg verify'), |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
912 "version": (show_version, [], 'hg version'), |
209 | 913 } |
914 | |
485 | 915 norepo = "clone init version help debugindex debugindexdot" |
209 | 916 |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
917 def find(cmd): |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
918 for e in table.keys(): |
335 | 919 if re.match("(%s)$" % e, cmd): |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
920 return table[e] |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
921 |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
922 raise UnknownCommand(cmd) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
923 |
214 | 924 class SignalInterrupt(Exception): pass |
925 | |
926 def catchterm(*args): | |
927 raise SignalInterrupt | |
928 | |
249 | 929 def run(): |
930 sys.exit(dispatch(sys.argv[1:])) | |
931 | |
209 | 932 def dispatch(args): |
933 options = {} | |
934 opts = [('v', 'verbose', None, 'verbose'), | |
935 ('d', 'debug', None, 'debug'), | |
936 ('q', 'quiet', None, 'quiet'), | |
577
5291a16324c0
Remove -p global switch in preparation for combining namespaces
mpm@selenic.com
parents:
562
diff
changeset
|
937 ('', 'profile', None, 'profile'), |
517 | 938 ('R', 'repository', "", 'repository root directory'), |
527 | 939 ('', 'traceback', None, 'print traceback on exception'), |
209 | 940 ('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
|
941 ('', 'version', None, 'output version information and exit'), |
209 | 942 ] |
943 | |
944 args = fancyopts.fancyopts(args, opts, options, | |
945 'hg [options] <command> [options] [files]') | |
946 | |
947 if not args: | |
948 cmd = "help" | |
949 else: | |
950 cmd, args = args[0], args[1:] | |
951 | |
952 u = ui.ui(options["verbose"], options["debug"], options["quiet"], | |
953 not options["noninteractive"]) | |
954 | |
423
25afb21d97ba
Support for 'hg --version'. setup.py stores version from hg repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
396
diff
changeset
|
955 if options["version"]: |
470
0ab093b473c5
Fix up version module name and command conflict
mpm@selenic.com
parents:
468
diff
changeset
|
956 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
|
957 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
|
958 |
252 | 959 try: |
960 i = find(cmd) | |
961 except UnknownCommand: | |
268 | 962 u.warn("hg: unknown command '%s'\n" % cmd) |
252 | 963 help(u) |
964 sys.exit(1) | |
209 | 965 |
214 | 966 signal.signal(signal.SIGTERM, catchterm) |
967 | |
209 | 968 cmdoptions = {} |
293 | 969 try: |
970 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2]) | |
971 except fancyopts.getopt.GetoptError, inst: | |
972 u.warn("hg %s: %s\n" % (cmd, inst)) | |
973 help(u, cmd) | |
974 sys.exit(-1) | |
209 | 975 |
499 | 976 try: |
527 | 977 try: |
978 if cmd not in norepo.split(): | |
979 path = options["repository"] or "" | |
980 repo = hg.repository(ui=u, path=path) | |
981 d = lambda: i[0](u, repo, *args, **cmdoptions) | |
982 else: | |
983 d = lambda: i[0](u, *args, **cmdoptions) | |
209 | 984 |
527 | 985 if options['profile']: |
986 import hotshot, hotshot.stats | |
987 prof = hotshot.Profile("hg.prof") | |
988 r = prof.runcall(d) | |
989 prof.close() | |
990 stats = hotshot.stats.load("hg.prof") | |
991 stats.strip_dirs() | |
992 stats.sort_stats('time', 'calls') | |
993 stats.print_stats(40) | |
994 return r | |
995 else: | |
996 return d() | |
997 except: | |
998 if options['traceback']: | |
999 traceback.print_exc() | |
1000 raise | |
508 | 1001 except util.CommandError, inst: |
1002 u.warn("abort: %s\n" % inst.args) | |
499 | 1003 except hg.RepoError, inst: |
1004 u.warn("abort: ", inst, "!\n") | |
214 | 1005 except SignalInterrupt: |
1006 u.warn("killed!\n") | |
209 | 1007 except KeyboardInterrupt: |
1008 u.warn("interrupted!\n") | |
250 | 1009 except IOError, inst: |
395 | 1010 if hasattr(inst, "code"): |
1011 u.warn("abort: %s\n" % inst) | |
1012 elif hasattr(inst, "reason"): | |
1013 u.warn("abort: error %d: %s\n" % (inst.reason[0], inst.reason[1])) | |
1014 elif hasattr(inst, "args") and inst[0] == errno.EPIPE: | |
250 | 1015 u.warn("broken pipe\n") |
1016 else: | |
1017 raise | |
549 | 1018 except OSError, inst: |
1019 if hasattr(inst, "filename"): | |
1020 u.warn("abort: %s: %s\n" % (inst.strerror, inst.filename)) | |
1021 else: | |
1022 u.warn("abort: %s\n" % inst.strerror) | |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1023 except TypeError, inst: |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1024 # was this an argument error? |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1025 tb = traceback.extract_tb(sys.exc_info()[2]) |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1026 if len(tb) > 2: # no |
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1027 raise |
293 | 1028 u.debug(inst, "\n") |
212
48398a5353e3
commands: better argument processing, per-command help
mpm@selenic.com
parents:
211
diff
changeset
|
1029 u.warn("%s: invalid arguments\n" % i[0].__name__) |
293 | 1030 help(u, cmd) |
1031 | |
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
500
diff
changeset
|
1032 sys.exit(-1) |