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