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