annotate mercurial/commands.py @ 293:11d64332a1cb

hg help improvements -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hg help improvements Handle showing option help in commands.py rather than fancyopts Show getopt exception string if argument parsing fails and call help Show help for invalid arguments Show exception string for invalid arguments with -d manifest hash: 9bd3e908cc080c21bb5e85822f675c35a8396fef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCp8GNywK+sNU5EO8RAoJfAJ4pB0I4xH4CTuGmAwArfBzIsT9plACeImkm 4ml9x78fmPgKpDYIr/qhfVY= =YeZv -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 08 Jun 2005 20:11:57 -0800
parents 07c6cb9fd1c5
children f8d56da6ac8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
1 # commands.py - command processing for mercurial
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
2 #
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
4 #
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
5 # This software may be used and distributed according to the terms
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
7
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
8 import os, re, sys, signal
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
9 import fancyopts, ui, hg
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
10 from demandload import *
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 259
diff changeset
11 demandload(globals(), "mdiff time hgweb traceback")
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
12
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
13 class UnknownCommand(Exception): pass
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
14
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
15 def filterfiles(filters, files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
16 l = [ x for x in files if x in filters ]
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
17
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
18 for t in filters:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
19 if t and t[-1] != os.sep: t += os.sep
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
20 l += [ x for x in files if x.startswith(t) ]
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
21 return l
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
22
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
23 def relfilter(repo, files):
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
24 if os.getcwd() != repo.root:
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
25 p = os.getcwd()[len(repo.root) + 1: ]
281
574420507d8c hg cat: relative file support
mpm@selenic.com
parents: 276
diff changeset
26 return filterfiles([p], files)
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
27 return files
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
28
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
29 def relpath(repo, args):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
30 if os.getcwd() != repo.root:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
31 p = os.getcwd()[len(repo.root) + 1: ]
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
32 return [ os.path.normpath(os.path.join(p, x)) for x in args ]
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
33 return args
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
34
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
35 def dodiff(repo, files = None, node1 = None, node2 = None):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
36 def date(c):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
37 return time.asctime(time.gmtime(float(c[2].split(' ')[0])))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
38
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
39 if node2:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
40 change = repo.changelog.read(node2)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
41 mmap2 = repo.manifest.read(change[0])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
42 (c, a, d) = repo.diffrevs(node1, node2)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
43 def read(f): return repo.file(f).read(mmap2[f])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
44 date2 = date(change)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
45 else:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
46 date2 = time.asctime()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
47 (c, a, d, u) = repo.diffdir(repo.root, node1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
48 if not node1:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
49 node1 = repo.dirstate.parents()[0]
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
50 def read(f): return file(os.path.join(repo.root, f)).read()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
51
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
52 change = repo.changelog.read(node1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
53 mmap = repo.manifest.read(change[0])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
54 date1 = date(change)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
55
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
56 if files:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
57 c, a, d = map(lambda x: filterfiles(files, x), (c, a, d))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
58
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
59 for f in c:
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
60 to = None
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
61 if f in mmap:
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
62 to = repo.file(f).read(mmap[f])
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
63 tn = read(f)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
64 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
65 for f in a:
264
4c1d7072d5cd Attempt to make diff deal with null sources properly
mpm@selenic.com
parents: 262
diff changeset
66 to = None
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
67 tn = read(f)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
68 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
69 for f in d:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
70 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
71 tn = None
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
72 sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f))
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
73
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
74 def help(ui, cmd=None):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
75 '''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
76 if cmd:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
77 try:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
78 i = find(cmd)
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
79 ui.write("%s\n\n" % i[2])
293
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
80
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
81 if i[1]:
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
82 for s, l, d, c in i[1]:
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
83 opt=' '
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
84 if s: opt = opt + '-' + s + ' '
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
85 if l: opt = opt + '--' + l + ' '
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
86 if d: opt = opt + '(' + str(d) + ')'
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
87 ui.write(opt, "\n")
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
88 if c: ui.write(' %s\n' % c)
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
89 ui.write("\n")
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
90
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
91 ui.write(i[0].__doc__, "\n")
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
92 except UnknownCommand:
268
1634a7ea6748 unknown command fixups
mpm@selenic.com
parents: 266
diff changeset
93 ui.warn("hg: unknown command %s\n" % cmd)
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
94 sys.exit(0)
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
95 else:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
96 ui.status('hg commands:\n\n')
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
97
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
98 h = {}
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
99 for e in table.values():
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
100 f = e[0]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
101 if f.__name__.startswith("debug"): continue
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
102 d = ""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
103 if f.__doc__:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
104 d = f.__doc__.splitlines(0)[0].rstrip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
105 h[f.__name__] = d
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
106
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
107 fns = h.keys()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
108 fns.sort()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
109 m = max(map(len, fns))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
110 for f in fns:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
111 ui.status(' %-*s %s\n' % (m, f, h[f]))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
112
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
113 # Commands start here, listed alphabetically
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
114
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
115 def add(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
116 '''add the specified files on the next commit'''
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
117 repo.add(relpath(repo, (file,) + files))
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
118
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
119 def addremove(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
120 """add all new files, delete all missing files"""
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
121 (c, a, d, u) = repo.diffdir(repo.root)
259
45c293b71341 fix addremove
mpm@selenic.com
parents: 257
diff changeset
122 repo.add(u)
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
123 repo.remove(d)
219
8ff4532376a4 hg checkout: refuse to checkout if there are outstanding changes
mpm@selenic.com
parents: 214
diff changeset
124
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
125 def annotate(u, repo, file, *files, **ops):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
126 """show changeset information per file line"""
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
127 def getnode(rev):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
128 return hg.short(repo.changelog.node(rev))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
129
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
130 def getname(rev):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
131 try:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
132 return bcache[rev]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
133 except KeyError:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
134 cl = repo.changelog.read(repo.changelog.node(rev))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
135 name = cl[1]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
136 f = name.find('@')
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
137 if f >= 0:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
138 name = name[:f]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
139 bcache[rev] = name
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
140 return name
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
141
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
142 bcache = {}
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
143 opmap = [['user', getname], ['number', str], ['changeset', getnode]]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
144 if not ops['user'] and not ops['changeset']:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
145 ops['number'] = 1
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
146
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 221
diff changeset
147 node = repo.dirstate.parents()[0]
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
148 if ops['revision']:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
149 node = repo.changelog.lookup(ops['revision'])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
150 change = repo.changelog.read(node)
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
151 mmap = repo.manifest.read(change[0])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
152 maxuserlen = 0
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
153 maxchangelen = 0
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
154 for f in relpath(repo, (file,) + files):
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
155 lines = repo.file(f).annotate(mmap[f])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
156 pieces = []
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
157
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
158 for o, f in opmap:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
159 if ops[o]:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
160 l = [ f(n) for n,t in lines ]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
161 m = max(map(len, l))
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
162 pieces.append([ "%*s" % (m, x) for x in l])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
163
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
164 for p,l in zip(zip(*pieces), lines):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
165 u.write(" ".join(p) + ": " + l[1])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
166
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
167 def cat(ui, repo, file, rev = []):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
168 """output the latest or given revision of a file"""
281
574420507d8c hg cat: relative file support
mpm@selenic.com
parents: 276
diff changeset
169 r = repo.file(relpath(repo, [file])[0])
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
170 n = r.tip()
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
171 if rev: n = r.lookup(rev)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
172 sys.stdout.write(r.read(n))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
173
289
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
174 def commit(ui, repo, *files, **opts):
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
175 """commit the specified files or all outstanding changes"""
289
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
176 text = opts['text']
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
177 if not text and opts['logfile']:
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
178 try: text = open(opts['logfile']).read()
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
179 except IOError: pass
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
180
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
181 repo.commit(relpath(repo, files), text)
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
182
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
183 def debugaddchangegroup(ui, repo):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
184 data = sys.stdin.read()
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
185 repo.addchangegroup(data)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
186
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
187 def debugchangegroup(ui, repo, roots):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
188 newer = repo.newer(map(repo.lookup, roots))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
189 for chunk in repo.changegroup(newer):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
190 sys.stdout.write(chunk)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
191
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
192 def debugindex(ui, file):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
193 r = hg.revlog(open, file, "")
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
194 print " rev offset length base linkrev"+\
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
195 " p1 p2 nodeid"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
196 for i in range(r.count()):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
197 e = r.index[i]
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
198 print "% 6d % 9d % 7d % 6d % 7d %s.. %s.. %s.." % (
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
199 i, e[0], e[1], e[2], e[3],
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
200 hg.hex(e[4][:5]), hg.hex(e[5][:5]), hg.hex(e[6][:5]))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
201
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
202 def debugindexdot(ui, file):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
203 r = hg.revlog(open, file, "")
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
204 print "digraph G {"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
205 for i in range(r.count()):
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
206 e = r.index[i]
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
207 print "\t%d -> %d" % (r.rev(e[4]), i)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
208 if e[5] != hg.nullid:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
209 print "\t%d -> %d" % (r.rev(e[5]), i)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
210 print "}"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
211
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
212 def diff(ui, repo, *files, **opts):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
213 """diff working directory (or selected files)"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
214 revs = []
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
215 if opts['rev']:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
216 revs = map(lambda x: repo.lookup(x), opts['rev'])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
217
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
218 if len(revs) > 2:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
219 self.ui.warn("too many revisions to diff\n")
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
220 sys.exit(1)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
221
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
222 if files:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
223 files = relpath(repo, files)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
224 else:
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
225 files = relpath(repo, [""])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
226
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
227 dodiff(repo, files, *revs)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
228
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
229 def export(ui, repo, changeset):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
230 """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
231 node = repo.lookup(changeset)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
232 prev, other = repo.changelog.parents(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
233 change = repo.changelog.read(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
234 print "# HG changeset patch"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
235 print "# User %s" % change[1]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
236 print "# Node ID %s" % hg.hex(node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
237 print "# Parent %s" % hg.hex(prev)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
238 print
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
239 if other != hg.nullid:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
240 print "# Parent %s" % hg.hex(other)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
241 print change[4].rstrip()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
242 print
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
243
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
244 dodiff(repo, None, prev, node)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
245
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
246 def forget(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
247 """don't add the specified files on the next commit"""
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
248 repo.forget(relpath(repo, (file,) + files))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
249
221
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
250 def heads(ui, repo):
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
251 '''show current repository heads'''
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
252 for n in repo.changelog.heads():
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
253 i = repo.changelog.rev(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
254 changes = repo.changelog.read(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
255 (p1, p2) = repo.changelog.parents(n)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
256 (h, h1, h2) = map(hg.hex, (n, p1, p2))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
257 (i1, i2) = map(repo.changelog.rev, (p1, p2))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
258 print "rev: %4d:%s" % (i, h)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
259 print "parents: %4d:%s" % (i1, h1)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
260 if i2: print " %4d:%s" % (i2, h2)
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
261 print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
262 hg.hex(changes[0]))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
263 print "user:", changes[1]
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
264 print "date:", time.asctime(
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
265 time.localtime(float(changes[2].split(' ')[0])))
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
266 if ui.verbose: print "files:", " ".join(changes[3])
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
267 print "description:"
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
268 print changes[4]
2bfe525ef6ca Beginning of multi-head support
mpm@selenic.com
parents: 220
diff changeset
269
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
270 def history(ui, repo):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
271 """show the changelog history"""
270
5a80ed2158c8 Reverse order of hg log and hg history lists
mpm@selenic.com
parents: 268
diff changeset
272 for i in range(repo.changelog.count() - 1, -1, -1):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
273 n = repo.changelog.node(i)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
274 changes = repo.changelog.read(n)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
275 (p1, p2) = repo.changelog.parents(n)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
276 (h, h1, h2) = map(hg.hex, (n, p1, p2))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
277 (i1, i2) = map(repo.changelog.rev, (p1, p2))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
278 print "rev: %4d:%s" % (i, h)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
279 print "parents: %4d:%s" % (i1, h1)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
280 if i2: print " %4d:%s" % (i2, h2)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
281 print "manifest: %4d:%s" % (repo.manifest.rev(changes[0]),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
282 hg.hex(changes[0]))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
283 print "user:", changes[1]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
284 print "date:", time.asctime(
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
285 time.localtime(float(changes[2].split(' ')[0])))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
286 if ui.verbose: print "files:", " ".join(changes[3])
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
287 print "description:"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
288 print changes[4]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
289
290
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
290 def init(ui, source=None):
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
291 """create a new repository or copy an existing one"""
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
292
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
293 if source:
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
294 paths = {}
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
295 for name, path in ui.configitems("paths"):
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
296 paths[name] = path
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
297
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
298 if source in paths: source = paths[source]
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
299
290
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
300 link = 0
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
301 if not source.startswith("http://"):
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
302 d1 = os.stat(os.getcwd()).st_dev
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
303 d2 = os.stat(source).st_dev
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
304 if d1 == d2: link = 1
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
305
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
306 if link:
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
307 ui.debug("copying by hardlink\n")
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
308 os.system("cp -al %s/.hg .hg" % source)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
309 else:
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
310 repo = hg.repository(ui, ".", create=1)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
311 other = hg.repository(ui, source)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
312 cg = repo.getchangegroup(other)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
313 repo.addchangegroup(cg)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
314 else:
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
315 hg.repository(ui, ".", create=1)
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
316
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
317 def log(ui, repo, f):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
318 """show the revision history of a single file"""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
319 f = relpath(repo, [f])[0]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
320
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
321 r = repo.file(f)
270
5a80ed2158c8 Reverse order of hg log and hg history lists
mpm@selenic.com
parents: 268
diff changeset
322 for i in range(r.count() - 1, -1, -1):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
323 n = r.node(i)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
324 (p1, p2) = r.parents(n)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
325 (h, h1, h2) = map(hg.hex, (n, p1, p2))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
326 (i1, i2) = map(r.rev, (p1, p2))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
327 cr = r.linkrev(n)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
328 cn = hg.hex(repo.changelog.node(cr))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
329 print "rev: %4d:%s" % (i, h)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
330 print "changeset: %4d:%s" % (cr, cn)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
331 print "parents: %4d:%s" % (i1, h1)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
332 if i2: print " %4d:%s" % (i2, h2)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
333 changes = repo.changelog.read(repo.changelog.node(cr))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
334 print "user: %s" % changes[1]
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
335 print "date: %s" % time.asctime(
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
336 time.localtime(float(changes[2].split(' ')[0])))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
337 print "description:"
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
338 print changes[4].rstrip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
339 print
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
340
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
341 def manifest(ui, repo, rev = []):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
342 """output the latest or given revision of the project manifest"""
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
343 n = repo.manifest.tip()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
344 if rev:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
345 n = repo.manifest.lookup(rev)
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
346 m = repo.manifest.read(n)
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
347 mf = repo.manifest.readflags(n)
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
348 files = m.keys()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
349 files.sort()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
350
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
351 for f in files:
276
10e325db7347 add tracking of execute permissions
mpm@selenic.com
parents: 275
diff changeset
352 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
353
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
354 def parents(ui, repo, node = None):
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
355 '''show the parents of the current working dir'''
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
356 if node:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
357 p = repo.changelog.parents(repo.lookup(hg.bin(node)))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
358 else:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
359 p = repo.dirstate.parents()
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
360
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
361 for n in p:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
362 if n != hg.nullid:
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
363 ui.write("%d:%s\n" % (repo.changelog.rev(n), hg.hex(n)))
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
364
266
4af7677de4a9 Fix argument processing for patch and rawcommit
mpm@selenic.com
parents: 264
diff changeset
365 def patch(ui, repo, patches, **opts):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
366 """import an ordered set of patches"""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
367 try:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
368 import psyco
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
369 psyco.full()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
370 except:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
371 pass
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
372
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
373 d = opts["base"]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
374 strip = opts["strip"]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
375 quiet = opts["quiet"] and "> /dev/null" or ""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
376
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
377 for patch in patches:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
378 ui.status("applying %s\n" % patch)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
379 pf = os.path.join(d, patch)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
380
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
381 text = ""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
382 for l in file(pf):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
383 if l[:4] == "--- ": break
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
384 text += l
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
385
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
386 f = os.popen("lsdiff --strip %d %s" % (strip, pf))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
387 files = filter(None, map(lambda x: x.rstrip(), f.read().splitlines()))
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
388 f.close()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
389
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
390 if files:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
391 if os.system("patch -p%d < %s %s" % (strip, pf, quiet)):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
392 raise "patch failed!"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
393 repo.commit(files, text)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
394
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
395 def pull(ui, repo, source):
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
396 """pull changes from the specified source"""
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
397 paths = {}
286
bd9d1e93f8d6 hg pull: ditch .hgpaths for new .hgrc
mpm@selenic.com
parents: 281
diff changeset
398 for name, path in ui.configitems("paths"):
290
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
399 paths[name] = path
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
400
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
401 if source in paths: source = paths[source]
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
402
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
403 other = hg.repository(ui, source)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
404 cg = repo.getchangegroup(other)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
405 repo.addchangegroup(cg)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
406
266
4af7677de4a9 Fix argument processing for patch and rawcommit
mpm@selenic.com
parents: 264
diff changeset
407 def rawcommit(ui, repo, files, **rc):
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
408 "raw commit interface"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
409
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
410 text = rc['text']
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
411 if not text and rc['logfile']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
412 try: text = open(rc['logfile']).read()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
413 except IOError: pass
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
414 if not text and not rc['logfile']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
415 print "missing commit text"
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
416 return 1
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
417
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
418 files = relpath(repo, files)
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
419 if rc['files']:
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
420 files += open(rc['files']).read().splitlines()
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
421
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
422 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
423
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
424 def recover(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
425 """roll back an interrupted transaction"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
426 repo.recover()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
427
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
428 def remove(ui, repo, file, *files):
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
429 """remove the specified files on the next commit"""
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
430 repo.remove(relpath(repo, (file,) + files))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
431
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
432 def serve(ui, repo, **opts):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
433 """export the repository via HTTP"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
434 hgweb.server(repo.root, opts["name"], opts["templates"],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
435 opts["address"], opts["port"])
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
436
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
437 def status(ui, repo):
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
438 '''show changed files in the working directory
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
439
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
440 C = changed
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
441 A = added
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
442 R = removed
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
443 ? = not tracked'''
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
444
230
00ea3613f82c make diffdir default to dirstate.parents()
mpm@selenic.com
parents: 227
diff changeset
445 (c, a, d, u) = repo.diffdir(repo.root)
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
446 (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u))
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
447
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
448 for f in c: print "C", f
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
449 for f in a: print "A", f
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
450 for f in d: print "R", f
220
3113a94c1bff change dircache into dirstate
mpm@selenic.com
parents: 219
diff changeset
451 for f in u: print "?", f
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
452
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
453 def tags(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
454 """list repository tags"""
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
455 repo.lookup(0) # prime the cache
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
456 i = repo.tags.items()
257
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
457 n = []
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
458 for e in i:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
459 try:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
460 l = repo.changelog.rev(e[1])
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
461 except KeyError:
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
462 l = -2
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
463 n.append((l, e))
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
464
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
465 n.sort()
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
466 n.reverse()
65dccc4555c2 Sort tags in revision order
mpm@selenic.com
parents: 255
diff changeset
467 i = [ e[1] for e in n ]
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
468 for k, n in i:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
469 try:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
470 r = repo.changelog.rev(n)
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
471 except KeyError:
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
472 r = "?"
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
473 print "%-30s %5d:%s" % (k, repo.changelog.rev(n), hg.hex(n))
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
474
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
475 def tip(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
476 """show the tip revision"""
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
477 n = repo.changelog.tip()
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
478 t = repo.changelog.rev(n)
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
479 ui.status("%d:%s\n" % (t, hg.hex(n)))
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
480
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
481 def undo(ui, repo):
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
482 """undo the last transaction"""
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
483 repo.undo()
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
484
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
485 def update(ui, repo, node=None, merge=False, clean=False):
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
486 '''update or merge working directory
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
487
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
488 If there are no outstanding changes in the working directory and
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
489 there is a linear relationship between the current version and the
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
490 requested version, the result is the requested version.
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
491
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
492 Otherwise the result is a merge between the contents of the
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
493 current working directory and the requested version. Files that
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
494 changed between either parent are marked as changed for the next
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
495 commit and a commit must be performed before any further updates
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
496 are allowed.
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
497 '''
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
498 node = node and repo.lookup(node) or repo.changelog.tip()
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
499 return repo.update(node, allow=merge, force=clean)
254
c03f58e5fd2d unify checkout and resolve into update
mpm@selenic.com
parents: 252
diff changeset
500
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
501 def verify(ui, repo):
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
502 """verify the integrity of the repository"""
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
503 return repo.verify()
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
504
255
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
505 # Command options and aliases are listed here, alphabetically
20a44c82795f hg help: use docstrings only
mpm@selenic.com
parents: 254
diff changeset
506
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
507 table = {
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
508 "add": (add, [], "hg add [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
509 "addremove": (addremove, [], "hg addremove"),
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
510 "ann|annotate": (annotate,
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
511 [('r', 'revision', '', 'revision'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
512 ('u', 'user', None, 'show user'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
513 ('n', 'number', None, 'show revision number'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
514 ('c', 'changeset', None, 'show changeset')],
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
515 'hg annotate [-u] [-c] [-n] [-r id] [files]'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
516 "cat|dump": (cat, [], 'hg cat <file> [rev]'),
289
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
517 "commit|ci": (commit,
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
518 [('t', 'text', "", 'commit text'),
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
519 ('l', 'logfile', "", 'commit text file')],
266396e32006 hg commit: add -t and -l options
mpm@selenic.com
parents: 286
diff changeset
520 'hg commit [files]'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
521 "debugaddchangegroup": (debugaddchangegroup, [], 'debugaddchangegroup'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
522 "debugchangegroup": (debugchangegroup, [], 'debugchangegroup [roots]'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
523 "debugindex": (debugindex, [], 'debugindex <file>'),
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
524 "debugindexdot": (debugindexdot, [], 'debugindexdot <file>'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
525 "diff": (diff, [('r', 'rev', [], 'revision')],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
526 'hg diff [-r A] [-r B] [files]'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
527 "export": (export, [], "hg export <changeset>"),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
528 "forget": (forget, [], "hg forget [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
529 "heads": (heads, [], 'hg heads'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
530 "history": (history, [], 'hg history'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
531 "help": (help, [], 'hg help [command]'),
290
07c6cb9fd1c5 replace hg branch with hg init [source]
mpm@selenic.com
parents: 289
diff changeset
532 "init": (init, [], 'hg init [url]'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
533 "log": (log, [], 'hg log <file>'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
534 "manifest|dumpmanifest": (manifest, [], 'hg manifest [rev]'),
227
f57519cddd3d move repo.current to dirstate.parents()
mpm@selenic.com
parents: 221
diff changeset
535 "parents": (parents, [], 'hg parents [node]'),
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
536 "patch|import": (patch,
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
537 [('p', 'strip', 1, 'path strip'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
538 ('b', 'base', "", 'base path'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
539 ('q', 'quiet', "", 'silence diff')],
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
540 "hg import [options] patches"),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
541 "pull|merge": (pull, [], 'hg pull [source]'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
542 "rawcommit": (rawcommit,
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
543 [('p', 'parent', [], 'parent'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
544 ('d', 'date', "", 'data'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
545 ('u', 'user', "", 'user'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
546 ('F', 'files', "", 'file list'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
547 ('t', 'text', "", 'commit text'),
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
548 ('l', 'logfile', "", 'commit text file')],
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
549 'hg rawcommit [options] [files]'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
550 "recover": (recover, [], "hg recover"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
551 "remove": (remove, [], "hg remove [files]"),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
552 "serve": (serve, [('p', 'port', 8000, 'listen port'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
553 ('a', 'address', '', 'interface address'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
554 ('n', 'name', os.getcwd(), 'repository name'),
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
555 ('t', 'templates', "", 'template map')],
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
556 "hg serve [options]"),
213
d2172916ef6c commands: migrate status and branch
mpm@selenic.com
parents: 212
diff changeset
557 "status": (status, [], 'hg status'),
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
558 "tags": (tags, [], 'hg tags'),
245
fef0f8e041aa big heap of command clean-up work
mpm@selenic.com
parents: 241
diff changeset
559 "tip": (tip, [], 'hg tip'),
210
d2badbd7d1ad hg undo: fixup working dir state
mpm@selenic.com
parents: 209
diff changeset
560 "undo": (undo, [], 'hg undo'),
275
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
561 "update|up|checkout|co|resolve": (update,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
562 [('m', 'merge', None,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
563 'allow merging of conflicts'),
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
564 ('C', 'clean', None,
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
565 'overwrite locally modified files')],
61d45b0ba8fb various merge improvements
mpm@selenic.com
parents: 270
diff changeset
566 'hg update [options] [node]'),
247
863b508c5b36 migrate verify
mpm@selenic.com
parents: 246
diff changeset
567 "verify": (verify, [], 'hg verify'),
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
568 }
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
569
248
b7645b3c86ff migrate remaining commands
mpm@selenic.com
parents: 247
diff changeset
570 norepo = "init branch help debugindex debugindexdot"
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
571
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
572 def find(cmd):
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
573 i = None
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
574 for e in table.keys():
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
575 if re.match(e + "$", cmd):
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
576 return table[e]
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
577
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
578 raise UnknownCommand(cmd)
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
579
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
580 class SignalInterrupt(Exception): pass
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
581
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
582 def catchterm(*args):
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
583 raise SignalInterrupt
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
584
249
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
585 def run():
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
586 sys.exit(dispatch(sys.argv[1:]))
619e775aa7f9 import and startup cleanups
mpm@selenic.com
parents: 248
diff changeset
587
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
588 def dispatch(args):
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
589 options = {}
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
590 opts = [('v', 'verbose', None, 'verbose'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
591 ('d', 'debug', None, 'debug'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
592 ('q', 'quiet', None, 'quiet'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
593 ('y', 'noninteractive', None, 'run non-interactively'),
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
594 ]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
595
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
596 args = fancyopts.fancyopts(args, opts, options,
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
597 'hg [options] <command> [options] [files]')
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
598
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
599 if not args:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
600 cmd = "help"
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
601 else:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
602 cmd, args = args[0], args[1:]
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
603
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
604 u = ui.ui(options["verbose"], options["debug"], options["quiet"],
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
605 not options["noninteractive"])
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
606
252
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
607 try:
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
608 i = find(cmd)
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
609 except UnknownCommand:
268
1634a7ea6748 unknown command fixups
mpm@selenic.com
parents: 266
diff changeset
610 u.warn("hg: unknown command '%s'\n" % cmd)
252
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
611 help(u)
5eda6c542978 Handle unknown commands nicely
mpm@selenic.com
parents: 250
diff changeset
612 sys.exit(1)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
613
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
614 signal.signal(signal.SIGTERM, catchterm)
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
615
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
616 cmdoptions = {}
293
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
617 try:
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
618 args = fancyopts.fancyopts(args, i[1], cmdoptions, i[2])
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
619 except fancyopts.getopt.GetoptError, inst:
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
620 u.warn("hg %s: %s\n" % (cmd, inst))
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
621 help(u, cmd)
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
622 sys.exit(-1)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
623
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
624 if cmd not in norepo.split():
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
625 repo = hg.repository(ui = u)
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
626 d = lambda: i[0](u, repo, *args, **cmdoptions)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
627 else:
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
628 d = lambda: i[0](u, *args, **cmdoptions)
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
629
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
630 try:
246
96cde50a746f Migrate rawcommit, import, export, history, and merge
mpm@selenic.com
parents: 245
diff changeset
631 return d()
214
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
632 except SignalInterrupt:
2d60aa9bde0a catch TERM signal in command processor
mpm@selenic.com
parents: 213
diff changeset
633 u.warn("killed!\n")
209
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
634 except KeyboardInterrupt:
63af1db35611 Beginning of new command parsing interface
mpm@selenic.com
parents:
diff changeset
635 u.warn("interrupted!\n")
250
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
636 except IOError, inst:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
637 if inst.errno == 32:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
638 u.warn("broken pipe\n")
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
639 else:
45ee7c4cae4f Catch broken pipes in command interpreter
mpm@selenic.com
parents: 249
diff changeset
640 raise
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
641 except TypeError, inst:
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
642 # was this an argument error?
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
643 tb = traceback.extract_tb(sys.exc_info()[2])
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
644 if len(tb) > 2: # no
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
645 raise
293
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
646 u.debug(inst, "\n")
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
647 u.warn("%s: invalid arguments\n" % i[0].__name__)
293
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
648 help(u, cmd)
212
48398a5353e3 commands: better argument processing, per-command help
mpm@selenic.com
parents: 211
diff changeset
649 sys.exit(-1)
293
11d64332a1cb hg help improvements
mpm@selenic.com
parents: 290
diff changeset
650