##// END OF EJS Templates
add branch and branches commands
Matt Mackall -
r3502:8dc14d63 default
parent child Browse files
Show More
@@ -1,3523 +1,3554 b''
1 # commands.py - command processing for mercurial
1 # commands.py - command processing for mercurial
2 #
2 #
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from demandload import demandload
8 from demandload import demandload
9 from node import *
9 from node import *
10 from i18n import gettext as _
10 from i18n import gettext as _
11 demandload(globals(), "os re sys signal shutil imp urllib pdb shlex")
11 demandload(globals(), "os re sys signal shutil imp urllib pdb shlex")
12 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo")
12 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo")
13 demandload(globals(), "fnmatch difflib patch random signal tempfile time")
13 demandload(globals(), "fnmatch difflib patch random signal tempfile time")
14 demandload(globals(), "traceback errno socket version struct atexit sets bz2")
14 demandload(globals(), "traceback errno socket version struct atexit sets bz2")
15 demandload(globals(), "archival cStringIO changegroup")
15 demandload(globals(), "archival cStringIO changegroup")
16 demandload(globals(), "cmdutil hgweb.server sshserver")
16 demandload(globals(), "cmdutil hgweb.server sshserver")
17
17
18 class UnknownCommand(Exception):
18 class UnknownCommand(Exception):
19 """Exception raised if command is not in the command table."""
19 """Exception raised if command is not in the command table."""
20 class AmbiguousCommand(Exception):
20 class AmbiguousCommand(Exception):
21 """Exception raised if command shortcut matches more than one command."""
21 """Exception raised if command shortcut matches more than one command."""
22
22
23 def bail_if_changed(repo):
23 def bail_if_changed(repo):
24 modified, added, removed, deleted = repo.status()[:4]
24 modified, added, removed, deleted = repo.status()[:4]
25 if modified or added or removed or deleted:
25 if modified or added or removed or deleted:
26 raise util.Abort(_("outstanding uncommitted changes"))
26 raise util.Abort(_("outstanding uncommitted changes"))
27
27
28 def relpath(repo, args):
28 def relpath(repo, args):
29 cwd = repo.getcwd()
29 cwd = repo.getcwd()
30 if cwd:
30 if cwd:
31 return [util.normpath(os.path.join(cwd, x)) for x in args]
31 return [util.normpath(os.path.join(cwd, x)) for x in args]
32 return args
32 return args
33
33
34 def logmessage(opts):
34 def logmessage(opts):
35 """ get the log message according to -m and -l option """
35 """ get the log message according to -m and -l option """
36 message = opts['message']
36 message = opts['message']
37 logfile = opts['logfile']
37 logfile = opts['logfile']
38
38
39 if message and logfile:
39 if message and logfile:
40 raise util.Abort(_('options --message and --logfile are mutually '
40 raise util.Abort(_('options --message and --logfile are mutually '
41 'exclusive'))
41 'exclusive'))
42 if not message and logfile:
42 if not message and logfile:
43 try:
43 try:
44 if logfile == '-':
44 if logfile == '-':
45 message = sys.stdin.read()
45 message = sys.stdin.read()
46 else:
46 else:
47 message = open(logfile).read()
47 message = open(logfile).read()
48 except IOError, inst:
48 except IOError, inst:
49 raise util.Abort(_("can't read commit message '%s': %s") %
49 raise util.Abort(_("can't read commit message '%s': %s") %
50 (logfile, inst.strerror))
50 (logfile, inst.strerror))
51 return message
51 return message
52
52
53 def walkchangerevs(ui, repo, pats, opts):
53 def walkchangerevs(ui, repo, pats, opts):
54 '''Iterate over files and the revs they changed in.
54 '''Iterate over files and the revs they changed in.
55
55
56 Callers most commonly need to iterate backwards over the history
56 Callers most commonly need to iterate backwards over the history
57 it is interested in. Doing so has awful (quadratic-looking)
57 it is interested in. Doing so has awful (quadratic-looking)
58 performance, so we use iterators in a "windowed" way.
58 performance, so we use iterators in a "windowed" way.
59
59
60 We walk a window of revisions in the desired order. Within the
60 We walk a window of revisions in the desired order. Within the
61 window, we first walk forwards to gather data, then in the desired
61 window, we first walk forwards to gather data, then in the desired
62 order (usually backwards) to display it.
62 order (usually backwards) to display it.
63
63
64 This function returns an (iterator, getchange, matchfn) tuple. The
64 This function returns an (iterator, getchange, matchfn) tuple. The
65 getchange function returns the changelog entry for a numeric
65 getchange function returns the changelog entry for a numeric
66 revision. The iterator yields 3-tuples. They will be of one of
66 revision. The iterator yields 3-tuples. They will be of one of
67 the following forms:
67 the following forms:
68
68
69 "window", incrementing, lastrev: stepping through a window,
69 "window", incrementing, lastrev: stepping through a window,
70 positive if walking forwards through revs, last rev in the
70 positive if walking forwards through revs, last rev in the
71 sequence iterated over - use to reset state for the current window
71 sequence iterated over - use to reset state for the current window
72
72
73 "add", rev, fns: out-of-order traversal of the given file names
73 "add", rev, fns: out-of-order traversal of the given file names
74 fns, which changed during revision rev - use to gather data for
74 fns, which changed during revision rev - use to gather data for
75 possible display
75 possible display
76
76
77 "iter", rev, None: in-order traversal of the revs earlier iterated
77 "iter", rev, None: in-order traversal of the revs earlier iterated
78 over with "add" - use to display data'''
78 over with "add" - use to display data'''
79
79
80 def increasing_windows(start, end, windowsize=8, sizelimit=512):
80 def increasing_windows(start, end, windowsize=8, sizelimit=512):
81 if start < end:
81 if start < end:
82 while start < end:
82 while start < end:
83 yield start, min(windowsize, end-start)
83 yield start, min(windowsize, end-start)
84 start += windowsize
84 start += windowsize
85 if windowsize < sizelimit:
85 if windowsize < sizelimit:
86 windowsize *= 2
86 windowsize *= 2
87 else:
87 else:
88 while start > end:
88 while start > end:
89 yield start, min(windowsize, start-end-1)
89 yield start, min(windowsize, start-end-1)
90 start -= windowsize
90 start -= windowsize
91 if windowsize < sizelimit:
91 if windowsize < sizelimit:
92 windowsize *= 2
92 windowsize *= 2
93
93
94
94
95 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
95 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
96 follow = opts.get('follow') or opts.get('follow_first')
96 follow = opts.get('follow') or opts.get('follow_first')
97
97
98 if repo.changelog.count() == 0:
98 if repo.changelog.count() == 0:
99 return [], False, matchfn
99 return [], False, matchfn
100
100
101 if follow:
101 if follow:
102 defrange = '%s:0' % repo.changectx().rev()
102 defrange = '%s:0' % repo.changectx().rev()
103 else:
103 else:
104 defrange = 'tip:0'
104 defrange = 'tip:0'
105 revs = map(int, cmdutil.revrange(ui, repo, opts['rev'] or [defrange]))
105 revs = map(int, cmdutil.revrange(ui, repo, opts['rev'] or [defrange]))
106 wanted = {}
106 wanted = {}
107 slowpath = anypats
107 slowpath = anypats
108 fncache = {}
108 fncache = {}
109
109
110 chcache = {}
110 chcache = {}
111 def getchange(rev):
111 def getchange(rev):
112 ch = chcache.get(rev)
112 ch = chcache.get(rev)
113 if ch is None:
113 if ch is None:
114 chcache[rev] = ch = repo.changelog.read(repo.lookup(str(rev)))
114 chcache[rev] = ch = repo.changelog.read(repo.lookup(str(rev)))
115 return ch
115 return ch
116
116
117 if not slowpath and not files:
117 if not slowpath and not files:
118 # No files, no patterns. Display all revs.
118 # No files, no patterns. Display all revs.
119 wanted = dict(zip(revs, revs))
119 wanted = dict(zip(revs, revs))
120 copies = []
120 copies = []
121 if not slowpath:
121 if not slowpath:
122 # Only files, no patterns. Check the history of each file.
122 # Only files, no patterns. Check the history of each file.
123 def filerevgen(filelog, node):
123 def filerevgen(filelog, node):
124 cl_count = repo.changelog.count()
124 cl_count = repo.changelog.count()
125 if node is None:
125 if node is None:
126 last = filelog.count() - 1
126 last = filelog.count() - 1
127 else:
127 else:
128 last = filelog.rev(node)
128 last = filelog.rev(node)
129 for i, window in increasing_windows(last, -1):
129 for i, window in increasing_windows(last, -1):
130 revs = []
130 revs = []
131 for j in xrange(i - window, i + 1):
131 for j in xrange(i - window, i + 1):
132 n = filelog.node(j)
132 n = filelog.node(j)
133 revs.append((filelog.linkrev(n),
133 revs.append((filelog.linkrev(n),
134 follow and filelog.renamed(n)))
134 follow and filelog.renamed(n)))
135 revs.reverse()
135 revs.reverse()
136 for rev in revs:
136 for rev in revs:
137 # only yield rev for which we have the changelog, it can
137 # only yield rev for which we have the changelog, it can
138 # happen while doing "hg log" during a pull or commit
138 # happen while doing "hg log" during a pull or commit
139 if rev[0] < cl_count:
139 if rev[0] < cl_count:
140 yield rev
140 yield rev
141 def iterfiles():
141 def iterfiles():
142 for filename in files:
142 for filename in files:
143 yield filename, None
143 yield filename, None
144 for filename_node in copies:
144 for filename_node in copies:
145 yield filename_node
145 yield filename_node
146 minrev, maxrev = min(revs), max(revs)
146 minrev, maxrev = min(revs), max(revs)
147 for file_, node in iterfiles():
147 for file_, node in iterfiles():
148 filelog = repo.file(file_)
148 filelog = repo.file(file_)
149 # A zero count may be a directory or deleted file, so
149 # A zero count may be a directory or deleted file, so
150 # try to find matching entries on the slow path.
150 # try to find matching entries on the slow path.
151 if filelog.count() == 0:
151 if filelog.count() == 0:
152 slowpath = True
152 slowpath = True
153 break
153 break
154 for rev, copied in filerevgen(filelog, node):
154 for rev, copied in filerevgen(filelog, node):
155 if rev <= maxrev:
155 if rev <= maxrev:
156 if rev < minrev:
156 if rev < minrev:
157 break
157 break
158 fncache.setdefault(rev, [])
158 fncache.setdefault(rev, [])
159 fncache[rev].append(file_)
159 fncache[rev].append(file_)
160 wanted[rev] = 1
160 wanted[rev] = 1
161 if follow and copied:
161 if follow and copied:
162 copies.append(copied)
162 copies.append(copied)
163 if slowpath:
163 if slowpath:
164 if follow:
164 if follow:
165 raise util.Abort(_('can only follow copies/renames for explicit '
165 raise util.Abort(_('can only follow copies/renames for explicit '
166 'file names'))
166 'file names'))
167
167
168 # The slow path checks files modified in every changeset.
168 # The slow path checks files modified in every changeset.
169 def changerevgen():
169 def changerevgen():
170 for i, window in increasing_windows(repo.changelog.count()-1, -1):
170 for i, window in increasing_windows(repo.changelog.count()-1, -1):
171 for j in xrange(i - window, i + 1):
171 for j in xrange(i - window, i + 1):
172 yield j, getchange(j)[3]
172 yield j, getchange(j)[3]
173
173
174 for rev, changefiles in changerevgen():
174 for rev, changefiles in changerevgen():
175 matches = filter(matchfn, changefiles)
175 matches = filter(matchfn, changefiles)
176 if matches:
176 if matches:
177 fncache[rev] = matches
177 fncache[rev] = matches
178 wanted[rev] = 1
178 wanted[rev] = 1
179
179
180 class followfilter:
180 class followfilter:
181 def __init__(self, onlyfirst=False):
181 def __init__(self, onlyfirst=False):
182 self.startrev = -1
182 self.startrev = -1
183 self.roots = []
183 self.roots = []
184 self.onlyfirst = onlyfirst
184 self.onlyfirst = onlyfirst
185
185
186 def match(self, rev):
186 def match(self, rev):
187 def realparents(rev):
187 def realparents(rev):
188 if self.onlyfirst:
188 if self.onlyfirst:
189 return repo.changelog.parentrevs(rev)[0:1]
189 return repo.changelog.parentrevs(rev)[0:1]
190 else:
190 else:
191 return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
191 return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
192
192
193 if self.startrev == -1:
193 if self.startrev == -1:
194 self.startrev = rev
194 self.startrev = rev
195 return True
195 return True
196
196
197 if rev > self.startrev:
197 if rev > self.startrev:
198 # forward: all descendants
198 # forward: all descendants
199 if not self.roots:
199 if not self.roots:
200 self.roots.append(self.startrev)
200 self.roots.append(self.startrev)
201 for parent in realparents(rev):
201 for parent in realparents(rev):
202 if parent in self.roots:
202 if parent in self.roots:
203 self.roots.append(rev)
203 self.roots.append(rev)
204 return True
204 return True
205 else:
205 else:
206 # backwards: all parents
206 # backwards: all parents
207 if not self.roots:
207 if not self.roots:
208 self.roots.extend(realparents(self.startrev))
208 self.roots.extend(realparents(self.startrev))
209 if rev in self.roots:
209 if rev in self.roots:
210 self.roots.remove(rev)
210 self.roots.remove(rev)
211 self.roots.extend(realparents(rev))
211 self.roots.extend(realparents(rev))
212 return True
212 return True
213
213
214 return False
214 return False
215
215
216 # it might be worthwhile to do this in the iterator if the rev range
216 # it might be worthwhile to do this in the iterator if the rev range
217 # is descending and the prune args are all within that range
217 # is descending and the prune args are all within that range
218 for rev in opts.get('prune', ()):
218 for rev in opts.get('prune', ()):
219 rev = repo.changelog.rev(repo.lookup(rev))
219 rev = repo.changelog.rev(repo.lookup(rev))
220 ff = followfilter()
220 ff = followfilter()
221 stop = min(revs[0], revs[-1])
221 stop = min(revs[0], revs[-1])
222 for x in xrange(rev, stop-1, -1):
222 for x in xrange(rev, stop-1, -1):
223 if ff.match(x) and wanted.has_key(x):
223 if ff.match(x) and wanted.has_key(x):
224 del wanted[x]
224 del wanted[x]
225
225
226 def iterate():
226 def iterate():
227 if follow and not files:
227 if follow and not files:
228 ff = followfilter(onlyfirst=opts.get('follow_first'))
228 ff = followfilter(onlyfirst=opts.get('follow_first'))
229 def want(rev):
229 def want(rev):
230 if ff.match(rev) and rev in wanted:
230 if ff.match(rev) and rev in wanted:
231 return True
231 return True
232 return False
232 return False
233 else:
233 else:
234 def want(rev):
234 def want(rev):
235 return rev in wanted
235 return rev in wanted
236
236
237 for i, window in increasing_windows(0, len(revs)):
237 for i, window in increasing_windows(0, len(revs)):
238 yield 'window', revs[0] < revs[-1], revs[-1]
238 yield 'window', revs[0] < revs[-1], revs[-1]
239 nrevs = [rev for rev in revs[i:i+window] if want(rev)]
239 nrevs = [rev for rev in revs[i:i+window] if want(rev)]
240 srevs = list(nrevs)
240 srevs = list(nrevs)
241 srevs.sort()
241 srevs.sort()
242 for rev in srevs:
242 for rev in srevs:
243 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3])
243 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3])
244 yield 'add', rev, fns
244 yield 'add', rev, fns
245 for rev in nrevs:
245 for rev in nrevs:
246 yield 'iter', rev, None
246 yield 'iter', rev, None
247 return iterate(), getchange, matchfn
247 return iterate(), getchange, matchfn
248
248
249 def write_bundle(cg, filename=None, compress=True):
249 def write_bundle(cg, filename=None, compress=True):
250 """Write a bundle file and return its filename.
250 """Write a bundle file and return its filename.
251
251
252 Existing files will not be overwritten.
252 Existing files will not be overwritten.
253 If no filename is specified, a temporary file is created.
253 If no filename is specified, a temporary file is created.
254 bz2 compression can be turned off.
254 bz2 compression can be turned off.
255 The bundle file will be deleted in case of errors.
255 The bundle file will be deleted in case of errors.
256 """
256 """
257 class nocompress(object):
257 class nocompress(object):
258 def compress(self, x):
258 def compress(self, x):
259 return x
259 return x
260 def flush(self):
260 def flush(self):
261 return ""
261 return ""
262
262
263 fh = None
263 fh = None
264 cleanup = None
264 cleanup = None
265 try:
265 try:
266 if filename:
266 if filename:
267 if os.path.exists(filename):
267 if os.path.exists(filename):
268 raise util.Abort(_("file '%s' already exists") % filename)
268 raise util.Abort(_("file '%s' already exists") % filename)
269 fh = open(filename, "wb")
269 fh = open(filename, "wb")
270 else:
270 else:
271 fd, filename = tempfile.mkstemp(prefix="hg-bundle-", suffix=".hg")
271 fd, filename = tempfile.mkstemp(prefix="hg-bundle-", suffix=".hg")
272 fh = os.fdopen(fd, "wb")
272 fh = os.fdopen(fd, "wb")
273 cleanup = filename
273 cleanup = filename
274
274
275 if compress:
275 if compress:
276 fh.write("HG10")
276 fh.write("HG10")
277 z = bz2.BZ2Compressor(9)
277 z = bz2.BZ2Compressor(9)
278 else:
278 else:
279 fh.write("HG10UN")
279 fh.write("HG10UN")
280 z = nocompress()
280 z = nocompress()
281 # parse the changegroup data, otherwise we will block
281 # parse the changegroup data, otherwise we will block
282 # in case of sshrepo because we don't know the end of the stream
282 # in case of sshrepo because we don't know the end of the stream
283
283
284 # an empty chunkiter is the end of the changegroup
284 # an empty chunkiter is the end of the changegroup
285 empty = False
285 empty = False
286 while not empty:
286 while not empty:
287 empty = True
287 empty = True
288 for chunk in changegroup.chunkiter(cg):
288 for chunk in changegroup.chunkiter(cg):
289 empty = False
289 empty = False
290 fh.write(z.compress(changegroup.genchunk(chunk)))
290 fh.write(z.compress(changegroup.genchunk(chunk)))
291 fh.write(z.compress(changegroup.closechunk()))
291 fh.write(z.compress(changegroup.closechunk()))
292 fh.write(z.flush())
292 fh.write(z.flush())
293 cleanup = None
293 cleanup = None
294 return filename
294 return filename
295 finally:
295 finally:
296 if fh is not None:
296 if fh is not None:
297 fh.close()
297 fh.close()
298 if cleanup is not None:
298 if cleanup is not None:
299 os.unlink(cleanup)
299 os.unlink(cleanup)
300
300
301 def trimuser(ui, name, rev, revcache):
301 def trimuser(ui, name, rev, revcache):
302 """trim the name of the user who committed a change"""
302 """trim the name of the user who committed a change"""
303 user = revcache.get(rev)
303 user = revcache.get(rev)
304 if user is None:
304 if user is None:
305 user = revcache[rev] = ui.shortuser(name)
305 user = revcache[rev] = ui.shortuser(name)
306 return user
306 return user
307
307
308 class changeset_printer(object):
308 class changeset_printer(object):
309 '''show changeset information when templating not requested.'''
309 '''show changeset information when templating not requested.'''
310
310
311 def __init__(self, ui, repo):
311 def __init__(self, ui, repo):
312 self.ui = ui
312 self.ui = ui
313 self.repo = repo
313 self.repo = repo
314
314
315 def show(self, rev=0, changenode=None, brinfo=None, copies=None):
315 def show(self, rev=0, changenode=None, brinfo=None, copies=None):
316 '''show a single changeset or file revision'''
316 '''show a single changeset or file revision'''
317 log = self.repo.changelog
317 log = self.repo.changelog
318 if changenode is None:
318 if changenode is None:
319 changenode = log.node(rev)
319 changenode = log.node(rev)
320 elif not rev:
320 elif not rev:
321 rev = log.rev(changenode)
321 rev = log.rev(changenode)
322
322
323 if self.ui.quiet:
323 if self.ui.quiet:
324 self.ui.write("%d:%s\n" % (rev, short(changenode)))
324 self.ui.write("%d:%s\n" % (rev, short(changenode)))
325 return
325 return
326
326
327 changes = log.read(changenode)
327 changes = log.read(changenode)
328 date = util.datestr(changes[2])
328 date = util.datestr(changes[2])
329 extra = changes[5]
329 extra = changes[5]
330 branch = extra.get("branch")
330 branch = extra.get("branch")
331
331
332 hexfunc = self.ui.debugflag and hex or short
332 hexfunc = self.ui.debugflag and hex or short
333
333
334 parents = [(log.rev(p), hexfunc(p)) for p in log.parents(changenode)
334 parents = [(log.rev(p), hexfunc(p)) for p in log.parents(changenode)
335 if self.ui.debugflag or p != nullid]
335 if self.ui.debugflag or p != nullid]
336 if (not self.ui.debugflag and len(parents) == 1 and
336 if (not self.ui.debugflag and len(parents) == 1 and
337 parents[0][0] == rev-1):
337 parents[0][0] == rev-1):
338 parents = []
338 parents = []
339
339
340 self.ui.write(_("changeset: %d:%s\n") % (rev, hexfunc(changenode)))
340 self.ui.write(_("changeset: %d:%s\n") % (rev, hexfunc(changenode)))
341
341
342 if branch:
342 if branch:
343 self.ui.status(_("branch: %s\n") % branch)
343 self.ui.status(_("branch: %s\n") % branch)
344 for tag in self.repo.nodetags(changenode):
344 for tag in self.repo.nodetags(changenode):
345 self.ui.status(_("tag: %s\n") % tag)
345 self.ui.status(_("tag: %s\n") % tag)
346 for parent in parents:
346 for parent in parents:
347 self.ui.write(_("parent: %d:%s\n") % parent)
347 self.ui.write(_("parent: %d:%s\n") % parent)
348
348
349 if brinfo and changenode in brinfo:
349 if brinfo and changenode in brinfo:
350 br = brinfo[changenode]
350 br = brinfo[changenode]
351 self.ui.write(_("branch: %s\n") % " ".join(br))
351 self.ui.write(_("branch: %s\n") % " ".join(br))
352
352
353 self.ui.debug(_("manifest: %d:%s\n") %
353 self.ui.debug(_("manifest: %d:%s\n") %
354 (self.repo.manifest.rev(changes[0]), hex(changes[0])))
354 (self.repo.manifest.rev(changes[0]), hex(changes[0])))
355 self.ui.status(_("user: %s\n") % changes[1])
355 self.ui.status(_("user: %s\n") % changes[1])
356 self.ui.status(_("date: %s\n") % date)
356 self.ui.status(_("date: %s\n") % date)
357
357
358 if self.ui.debugflag:
358 if self.ui.debugflag:
359 files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
359 files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
360 for key, value in zip([_("files:"), _("files+:"), _("files-:")],
360 for key, value in zip([_("files:"), _("files+:"), _("files-:")],
361 files):
361 files):
362 if value:
362 if value:
363 self.ui.note("%-12s %s\n" % (key, " ".join(value)))
363 self.ui.note("%-12s %s\n" % (key, " ".join(value)))
364 elif changes[3]:
364 elif changes[3]:
365 self.ui.note(_("files: %s\n") % " ".join(changes[3]))
365 self.ui.note(_("files: %s\n") % " ".join(changes[3]))
366 if copies:
366 if copies:
367 copies = ['%s (%s)' % c for c in copies]
367 copies = ['%s (%s)' % c for c in copies]
368 self.ui.note(_("copies: %s\n") % ' '.join(copies))
368 self.ui.note(_("copies: %s\n") % ' '.join(copies))
369
369
370 if extra and self.ui.debugflag:
370 if extra and self.ui.debugflag:
371 extraitems = extra.items()
371 extraitems = extra.items()
372 extraitems.sort()
372 extraitems.sort()
373 for key, value in extraitems:
373 for key, value in extraitems:
374 self.ui.debug(_("extra: %s=%s\n")
374 self.ui.debug(_("extra: %s=%s\n")
375 % (key, value.encode('string_escape')))
375 % (key, value.encode('string_escape')))
376
376
377 description = changes[4].strip()
377 description = changes[4].strip()
378 if description:
378 if description:
379 if self.ui.verbose:
379 if self.ui.verbose:
380 self.ui.status(_("description:\n"))
380 self.ui.status(_("description:\n"))
381 self.ui.status(description)
381 self.ui.status(description)
382 self.ui.status("\n\n")
382 self.ui.status("\n\n")
383 else:
383 else:
384 self.ui.status(_("summary: %s\n") %
384 self.ui.status(_("summary: %s\n") %
385 description.splitlines()[0])
385 description.splitlines()[0])
386 self.ui.status("\n")
386 self.ui.status("\n")
387
387
388 def show_changeset(ui, repo, opts):
388 def show_changeset(ui, repo, opts):
389 """show one changeset using template or regular display.
389 """show one changeset using template or regular display.
390
390
391 Display format will be the first non-empty hit of:
391 Display format will be the first non-empty hit of:
392 1. option 'template'
392 1. option 'template'
393 2. option 'style'
393 2. option 'style'
394 3. [ui] setting 'logtemplate'
394 3. [ui] setting 'logtemplate'
395 4. [ui] setting 'style'
395 4. [ui] setting 'style'
396 If all of these values are either the unset or the empty string,
396 If all of these values are either the unset or the empty string,
397 regular display via changeset_printer() is done.
397 regular display via changeset_printer() is done.
398 """
398 """
399 # options
399 # options
400 tmpl = opts.get('template')
400 tmpl = opts.get('template')
401 mapfile = None
401 mapfile = None
402 if tmpl:
402 if tmpl:
403 tmpl = templater.parsestring(tmpl, quoted=False)
403 tmpl = templater.parsestring(tmpl, quoted=False)
404 else:
404 else:
405 mapfile = opts.get('style')
405 mapfile = opts.get('style')
406 # ui settings
406 # ui settings
407 if not mapfile:
407 if not mapfile:
408 tmpl = ui.config('ui', 'logtemplate')
408 tmpl = ui.config('ui', 'logtemplate')
409 if tmpl:
409 if tmpl:
410 tmpl = templater.parsestring(tmpl)
410 tmpl = templater.parsestring(tmpl)
411 else:
411 else:
412 mapfile = ui.config('ui', 'style')
412 mapfile = ui.config('ui', 'style')
413
413
414 if tmpl or mapfile:
414 if tmpl or mapfile:
415 if mapfile:
415 if mapfile:
416 if not os.path.split(mapfile)[0]:
416 if not os.path.split(mapfile)[0]:
417 mapname = (templater.templatepath('map-cmdline.' + mapfile)
417 mapname = (templater.templatepath('map-cmdline.' + mapfile)
418 or templater.templatepath(mapfile))
418 or templater.templatepath(mapfile))
419 if mapname: mapfile = mapname
419 if mapname: mapfile = mapname
420 try:
420 try:
421 t = templater.changeset_templater(ui, repo, mapfile)
421 t = templater.changeset_templater(ui, repo, mapfile)
422 except SyntaxError, inst:
422 except SyntaxError, inst:
423 raise util.Abort(inst.args[0])
423 raise util.Abort(inst.args[0])
424 if tmpl: t.use_template(tmpl)
424 if tmpl: t.use_template(tmpl)
425 return t
425 return t
426 return changeset_printer(ui, repo)
426 return changeset_printer(ui, repo)
427
427
428 def setremoteconfig(ui, opts):
428 def setremoteconfig(ui, opts):
429 "copy remote options to ui tree"
429 "copy remote options to ui tree"
430 if opts.get('ssh'):
430 if opts.get('ssh'):
431 ui.setconfig("ui", "ssh", opts['ssh'])
431 ui.setconfig("ui", "ssh", opts['ssh'])
432 if opts.get('remotecmd'):
432 if opts.get('remotecmd'):
433 ui.setconfig("ui", "remotecmd", opts['remotecmd'])
433 ui.setconfig("ui", "remotecmd", opts['remotecmd'])
434
434
435 def show_version(ui):
435 def show_version(ui):
436 """output version and copyright information"""
436 """output version and copyright information"""
437 ui.write(_("Mercurial Distributed SCM (version %s)\n")
437 ui.write(_("Mercurial Distributed SCM (version %s)\n")
438 % version.get_version())
438 % version.get_version())
439 ui.status(_(
439 ui.status(_(
440 "\nCopyright (C) 2005, 2006 Matt Mackall <mpm@selenic.com>\n"
440 "\nCopyright (C) 2005, 2006 Matt Mackall <mpm@selenic.com>\n"
441 "This is free software; see the source for copying conditions. "
441 "This is free software; see the source for copying conditions. "
442 "There is NO\nwarranty; "
442 "There is NO\nwarranty; "
443 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
443 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
444 ))
444 ))
445
445
446 def help_(ui, name=None, with_version=False):
446 def help_(ui, name=None, with_version=False):
447 """show help for a command, extension, or list of commands
447 """show help for a command, extension, or list of commands
448
448
449 With no arguments, print a list of commands and short help.
449 With no arguments, print a list of commands and short help.
450
450
451 Given a command name, print help for that command.
451 Given a command name, print help for that command.
452
452
453 Given an extension name, print help for that extension, and the
453 Given an extension name, print help for that extension, and the
454 commands it provides."""
454 commands it provides."""
455 option_lists = []
455 option_lists = []
456
456
457 def helpcmd(name):
457 def helpcmd(name):
458 if with_version:
458 if with_version:
459 show_version(ui)
459 show_version(ui)
460 ui.write('\n')
460 ui.write('\n')
461 aliases, i = findcmd(ui, name)
461 aliases, i = findcmd(ui, name)
462 # synopsis
462 # synopsis
463 ui.write("%s\n\n" % i[2])
463 ui.write("%s\n\n" % i[2])
464
464
465 # description
465 # description
466 doc = i[0].__doc__
466 doc = i[0].__doc__
467 if not doc:
467 if not doc:
468 doc = _("(No help text available)")
468 doc = _("(No help text available)")
469 if ui.quiet:
469 if ui.quiet:
470 doc = doc.splitlines(0)[0]
470 doc = doc.splitlines(0)[0]
471 ui.write("%s\n" % doc.rstrip())
471 ui.write("%s\n" % doc.rstrip())
472
472
473 if not ui.quiet:
473 if not ui.quiet:
474 # aliases
474 # aliases
475 if len(aliases) > 1:
475 if len(aliases) > 1:
476 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
476 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
477
477
478 # options
478 # options
479 if i[1]:
479 if i[1]:
480 option_lists.append(("options", i[1]))
480 option_lists.append(("options", i[1]))
481
481
482 def helplist(select=None):
482 def helplist(select=None):
483 h = {}
483 h = {}
484 cmds = {}
484 cmds = {}
485 for c, e in table.items():
485 for c, e in table.items():
486 f = c.split("|", 1)[0]
486 f = c.split("|", 1)[0]
487 if select and not select(f):
487 if select and not select(f):
488 continue
488 continue
489 if name == "shortlist" and not f.startswith("^"):
489 if name == "shortlist" and not f.startswith("^"):
490 continue
490 continue
491 f = f.lstrip("^")
491 f = f.lstrip("^")
492 if not ui.debugflag and f.startswith("debug"):
492 if not ui.debugflag and f.startswith("debug"):
493 continue
493 continue
494 doc = e[0].__doc__
494 doc = e[0].__doc__
495 if not doc:
495 if not doc:
496 doc = _("(No help text available)")
496 doc = _("(No help text available)")
497 h[f] = doc.splitlines(0)[0].rstrip()
497 h[f] = doc.splitlines(0)[0].rstrip()
498 cmds[f] = c.lstrip("^")
498 cmds[f] = c.lstrip("^")
499
499
500 fns = h.keys()
500 fns = h.keys()
501 fns.sort()
501 fns.sort()
502 m = max(map(len, fns))
502 m = max(map(len, fns))
503 for f in fns:
503 for f in fns:
504 if ui.verbose:
504 if ui.verbose:
505 commands = cmds[f].replace("|",", ")
505 commands = cmds[f].replace("|",", ")
506 ui.write(" %s:\n %s\n"%(commands, h[f]))
506 ui.write(" %s:\n %s\n"%(commands, h[f]))
507 else:
507 else:
508 ui.write(' %-*s %s\n' % (m, f, h[f]))
508 ui.write(' %-*s %s\n' % (m, f, h[f]))
509
509
510 def helpext(name):
510 def helpext(name):
511 try:
511 try:
512 mod = findext(name)
512 mod = findext(name)
513 except KeyError:
513 except KeyError:
514 raise UnknownCommand(name)
514 raise UnknownCommand(name)
515
515
516 doc = (mod.__doc__ or _('No help text available')).splitlines(0)
516 doc = (mod.__doc__ or _('No help text available')).splitlines(0)
517 ui.write(_('%s extension - %s\n') % (name.split('.')[-1], doc[0]))
517 ui.write(_('%s extension - %s\n') % (name.split('.')[-1], doc[0]))
518 for d in doc[1:]:
518 for d in doc[1:]:
519 ui.write(d, '\n')
519 ui.write(d, '\n')
520
520
521 ui.status('\n')
521 ui.status('\n')
522 if ui.verbose:
522 if ui.verbose:
523 ui.status(_('list of commands:\n\n'))
523 ui.status(_('list of commands:\n\n'))
524 else:
524 else:
525 ui.status(_('list of commands (use "hg help -v %s" '
525 ui.status(_('list of commands (use "hg help -v %s" '
526 'to show aliases and global options):\n\n') % name)
526 'to show aliases and global options):\n\n') % name)
527
527
528 modcmds = dict.fromkeys([c.split('|', 1)[0] for c in mod.cmdtable])
528 modcmds = dict.fromkeys([c.split('|', 1)[0] for c in mod.cmdtable])
529 helplist(modcmds.has_key)
529 helplist(modcmds.has_key)
530
530
531 if name and name != 'shortlist':
531 if name and name != 'shortlist':
532 try:
532 try:
533 helpcmd(name)
533 helpcmd(name)
534 except UnknownCommand:
534 except UnknownCommand:
535 helpext(name)
535 helpext(name)
536
536
537 else:
537 else:
538 # program name
538 # program name
539 if ui.verbose or with_version:
539 if ui.verbose or with_version:
540 show_version(ui)
540 show_version(ui)
541 else:
541 else:
542 ui.status(_("Mercurial Distributed SCM\n"))
542 ui.status(_("Mercurial Distributed SCM\n"))
543 ui.status('\n')
543 ui.status('\n')
544
544
545 # list of commands
545 # list of commands
546 if name == "shortlist":
546 if name == "shortlist":
547 ui.status(_('basic commands (use "hg help" '
547 ui.status(_('basic commands (use "hg help" '
548 'for the full list or option "-v" for details):\n\n'))
548 'for the full list or option "-v" for details):\n\n'))
549 elif ui.verbose:
549 elif ui.verbose:
550 ui.status(_('list of commands:\n\n'))
550 ui.status(_('list of commands:\n\n'))
551 else:
551 else:
552 ui.status(_('list of commands (use "hg help -v" '
552 ui.status(_('list of commands (use "hg help -v" '
553 'to show aliases and global options):\n\n'))
553 'to show aliases and global options):\n\n'))
554
554
555 helplist()
555 helplist()
556
556
557 # global options
557 # global options
558 if ui.verbose:
558 if ui.verbose:
559 option_lists.append(("global options", globalopts))
559 option_lists.append(("global options", globalopts))
560
560
561 # list all option lists
561 # list all option lists
562 opt_output = []
562 opt_output = []
563 for title, options in option_lists:
563 for title, options in option_lists:
564 opt_output.append(("\n%s:\n" % title, None))
564 opt_output.append(("\n%s:\n" % title, None))
565 for shortopt, longopt, default, desc in options:
565 for shortopt, longopt, default, desc in options:
566 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
566 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
567 longopt and " --%s" % longopt),
567 longopt and " --%s" % longopt),
568 "%s%s" % (desc,
568 "%s%s" % (desc,
569 default
569 default
570 and _(" (default: %s)") % default
570 and _(" (default: %s)") % default
571 or "")))
571 or "")))
572
572
573 if opt_output:
573 if opt_output:
574 opts_len = max([len(line[0]) for line in opt_output if line[1]])
574 opts_len = max([len(line[0]) for line in opt_output if line[1]])
575 for first, second in opt_output:
575 for first, second in opt_output:
576 if second:
576 if second:
577 ui.write(" %-*s %s\n" % (opts_len, first, second))
577 ui.write(" %-*s %s\n" % (opts_len, first, second))
578 else:
578 else:
579 ui.write("%s\n" % first)
579 ui.write("%s\n" % first)
580
580
581 # Commands start here, listed alphabetically
581 # Commands start here, listed alphabetically
582
582
583 def add(ui, repo, *pats, **opts):
583 def add(ui, repo, *pats, **opts):
584 """add the specified files on the next commit
584 """add the specified files on the next commit
585
585
586 Schedule files to be version controlled and added to the repository.
586 Schedule files to be version controlled and added to the repository.
587
587
588 The files will be added to the repository at the next commit.
588 The files will be added to the repository at the next commit.
589
589
590 If no names are given, add all files in the repository.
590 If no names are given, add all files in the repository.
591 """
591 """
592
592
593 names = []
593 names = []
594 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
594 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
595 if exact:
595 if exact:
596 if ui.verbose:
596 if ui.verbose:
597 ui.status(_('adding %s\n') % rel)
597 ui.status(_('adding %s\n') % rel)
598 names.append(abs)
598 names.append(abs)
599 elif repo.dirstate.state(abs) == '?':
599 elif repo.dirstate.state(abs) == '?':
600 ui.status(_('adding %s\n') % rel)
600 ui.status(_('adding %s\n') % rel)
601 names.append(abs)
601 names.append(abs)
602 if not opts.get('dry_run'):
602 if not opts.get('dry_run'):
603 repo.add(names)
603 repo.add(names)
604
604
605 def addremove(ui, repo, *pats, **opts):
605 def addremove(ui, repo, *pats, **opts):
606 """add all new files, delete all missing files
606 """add all new files, delete all missing files
607
607
608 Add all new files and remove all missing files from the repository.
608 Add all new files and remove all missing files from the repository.
609
609
610 New files are ignored if they match any of the patterns in .hgignore. As
610 New files are ignored if they match any of the patterns in .hgignore. As
611 with add, these changes take effect at the next commit.
611 with add, these changes take effect at the next commit.
612
612
613 Use the -s option to detect renamed files. With a parameter > 0,
613 Use the -s option to detect renamed files. With a parameter > 0,
614 this compares every removed file with every added file and records
614 this compares every removed file with every added file and records
615 those similar enough as renames. This option takes a percentage
615 those similar enough as renames. This option takes a percentage
616 between 0 (disabled) and 100 (files must be identical) as its
616 between 0 (disabled) and 100 (files must be identical) as its
617 parameter. Detecting renamed files this way can be expensive.
617 parameter. Detecting renamed files this way can be expensive.
618 """
618 """
619 sim = float(opts.get('similarity') or 0)
619 sim = float(opts.get('similarity') or 0)
620 if sim < 0 or sim > 100:
620 if sim < 0 or sim > 100:
621 raise util.Abort(_('similarity must be between 0 and 100'))
621 raise util.Abort(_('similarity must be between 0 and 100'))
622 return cmdutil.addremove(repo, pats, opts, similarity=sim/100.)
622 return cmdutil.addremove(repo, pats, opts, similarity=sim/100.)
623
623
624 def annotate(ui, repo, *pats, **opts):
624 def annotate(ui, repo, *pats, **opts):
625 """show changeset information per file line
625 """show changeset information per file line
626
626
627 List changes in files, showing the revision id responsible for each line
627 List changes in files, showing the revision id responsible for each line
628
628
629 This command is useful to discover who did a change or when a change took
629 This command is useful to discover who did a change or when a change took
630 place.
630 place.
631
631
632 Without the -a option, annotate will avoid processing files it
632 Without the -a option, annotate will avoid processing files it
633 detects as binary. With -a, annotate will generate an annotation
633 detects as binary. With -a, annotate will generate an annotation
634 anyway, probably with undesirable results.
634 anyway, probably with undesirable results.
635 """
635 """
636 getdate = util.cachefunc(lambda x: util.datestr(x.date()))
636 getdate = util.cachefunc(lambda x: util.datestr(x.date()))
637
637
638 if not pats:
638 if not pats:
639 raise util.Abort(_('at least one file name or pattern required'))
639 raise util.Abort(_('at least one file name or pattern required'))
640
640
641 opmap = [['user', lambda x: ui.shortuser(x.user())],
641 opmap = [['user', lambda x: ui.shortuser(x.user())],
642 ['number', lambda x: str(x.rev())],
642 ['number', lambda x: str(x.rev())],
643 ['changeset', lambda x: short(x.node())],
643 ['changeset', lambda x: short(x.node())],
644 ['date', getdate], ['follow', lambda x: x.path()]]
644 ['date', getdate], ['follow', lambda x: x.path()]]
645 if (not opts['user'] and not opts['changeset'] and not opts['date']
645 if (not opts['user'] and not opts['changeset'] and not opts['date']
646 and not opts['follow']):
646 and not opts['follow']):
647 opts['number'] = 1
647 opts['number'] = 1
648
648
649 ctx = repo.changectx(opts['rev'])
649 ctx = repo.changectx(opts['rev'])
650
650
651 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
651 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
652 node=ctx.node()):
652 node=ctx.node()):
653 fctx = ctx.filectx(abs)
653 fctx = ctx.filectx(abs)
654 if not opts['text'] and util.binary(fctx.data()):
654 if not opts['text'] and util.binary(fctx.data()):
655 ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
655 ui.write(_("%s: binary file\n") % ((pats and rel) or abs))
656 continue
656 continue
657
657
658 lines = fctx.annotate(follow=opts.get('follow'))
658 lines = fctx.annotate(follow=opts.get('follow'))
659 pieces = []
659 pieces = []
660
660
661 for o, f in opmap:
661 for o, f in opmap:
662 if opts[o]:
662 if opts[o]:
663 l = [f(n) for n, dummy in lines]
663 l = [f(n) for n, dummy in lines]
664 if l:
664 if l:
665 m = max(map(len, l))
665 m = max(map(len, l))
666 pieces.append(["%*s" % (m, x) for x in l])
666 pieces.append(["%*s" % (m, x) for x in l])
667
667
668 if pieces:
668 if pieces:
669 for p, l in zip(zip(*pieces), lines):
669 for p, l in zip(zip(*pieces), lines):
670 ui.write("%s: %s" % (" ".join(p), l[1]))
670 ui.write("%s: %s" % (" ".join(p), l[1]))
671
671
672 def archive(ui, repo, dest, **opts):
672 def archive(ui, repo, dest, **opts):
673 '''create unversioned archive of a repository revision
673 '''create unversioned archive of a repository revision
674
674
675 By default, the revision used is the parent of the working
675 By default, the revision used is the parent of the working
676 directory; use "-r" to specify a different revision.
676 directory; use "-r" to specify a different revision.
677
677
678 To specify the type of archive to create, use "-t". Valid
678 To specify the type of archive to create, use "-t". Valid
679 types are:
679 types are:
680
680
681 "files" (default): a directory full of files
681 "files" (default): a directory full of files
682 "tar": tar archive, uncompressed
682 "tar": tar archive, uncompressed
683 "tbz2": tar archive, compressed using bzip2
683 "tbz2": tar archive, compressed using bzip2
684 "tgz": tar archive, compressed using gzip
684 "tgz": tar archive, compressed using gzip
685 "uzip": zip archive, uncompressed
685 "uzip": zip archive, uncompressed
686 "zip": zip archive, compressed using deflate
686 "zip": zip archive, compressed using deflate
687
687
688 The exact name of the destination archive or directory is given
688 The exact name of the destination archive or directory is given
689 using a format string; see "hg help export" for details.
689 using a format string; see "hg help export" for details.
690
690
691 Each member added to an archive file has a directory prefix
691 Each member added to an archive file has a directory prefix
692 prepended. Use "-p" to specify a format string for the prefix.
692 prepended. Use "-p" to specify a format string for the prefix.
693 The default is the basename of the archive, with suffixes removed.
693 The default is the basename of the archive, with suffixes removed.
694 '''
694 '''
695
695
696 node = repo.changectx(opts['rev']).node()
696 node = repo.changectx(opts['rev']).node()
697 dest = cmdutil.make_filename(repo, dest, node)
697 dest = cmdutil.make_filename(repo, dest, node)
698 if os.path.realpath(dest) == repo.root:
698 if os.path.realpath(dest) == repo.root:
699 raise util.Abort(_('repository root cannot be destination'))
699 raise util.Abort(_('repository root cannot be destination'))
700 dummy, matchfn, dummy = cmdutil.matchpats(repo, [], opts)
700 dummy, matchfn, dummy = cmdutil.matchpats(repo, [], opts)
701 kind = opts.get('type') or 'files'
701 kind = opts.get('type') or 'files'
702 prefix = opts['prefix']
702 prefix = opts['prefix']
703 if dest == '-':
703 if dest == '-':
704 if kind == 'files':
704 if kind == 'files':
705 raise util.Abort(_('cannot archive plain files to stdout'))
705 raise util.Abort(_('cannot archive plain files to stdout'))
706 dest = sys.stdout
706 dest = sys.stdout
707 if not prefix: prefix = os.path.basename(repo.root) + '-%h'
707 if not prefix: prefix = os.path.basename(repo.root) + '-%h'
708 prefix = cmdutil.make_filename(repo, prefix, node)
708 prefix = cmdutil.make_filename(repo, prefix, node)
709 archival.archive(repo, dest, node, kind, not opts['no_decode'],
709 archival.archive(repo, dest, node, kind, not opts['no_decode'],
710 matchfn, prefix)
710 matchfn, prefix)
711
711
712 def backout(ui, repo, rev, **opts):
712 def backout(ui, repo, rev, **opts):
713 '''reverse effect of earlier changeset
713 '''reverse effect of earlier changeset
714
714
715 Commit the backed out changes as a new changeset. The new
715 Commit the backed out changes as a new changeset. The new
716 changeset is a child of the backed out changeset.
716 changeset is a child of the backed out changeset.
717
717
718 If you back out a changeset other than the tip, a new head is
718 If you back out a changeset other than the tip, a new head is
719 created. This head is the parent of the working directory. If
719 created. This head is the parent of the working directory. If
720 you back out an old changeset, your working directory will appear
720 you back out an old changeset, your working directory will appear
721 old after the backout. You should merge the backout changeset
721 old after the backout. You should merge the backout changeset
722 with another head.
722 with another head.
723
723
724 The --merge option remembers the parent of the working directory
724 The --merge option remembers the parent of the working directory
725 before starting the backout, then merges the new head with that
725 before starting the backout, then merges the new head with that
726 changeset afterwards. This saves you from doing the merge by
726 changeset afterwards. This saves you from doing the merge by
727 hand. The result of this merge is not committed, as for a normal
727 hand. The result of this merge is not committed, as for a normal
728 merge.'''
728 merge.'''
729
729
730 bail_if_changed(repo)
730 bail_if_changed(repo)
731 op1, op2 = repo.dirstate.parents()
731 op1, op2 = repo.dirstate.parents()
732 if op2 != nullid:
732 if op2 != nullid:
733 raise util.Abort(_('outstanding uncommitted merge'))
733 raise util.Abort(_('outstanding uncommitted merge'))
734 node = repo.lookup(rev)
734 node = repo.lookup(rev)
735 p1, p2 = repo.changelog.parents(node)
735 p1, p2 = repo.changelog.parents(node)
736 if p1 == nullid:
736 if p1 == nullid:
737 raise util.Abort(_('cannot back out a change with no parents'))
737 raise util.Abort(_('cannot back out a change with no parents'))
738 if p2 != nullid:
738 if p2 != nullid:
739 if not opts['parent']:
739 if not opts['parent']:
740 raise util.Abort(_('cannot back out a merge changeset without '
740 raise util.Abort(_('cannot back out a merge changeset without '
741 '--parent'))
741 '--parent'))
742 p = repo.lookup(opts['parent'])
742 p = repo.lookup(opts['parent'])
743 if p not in (p1, p2):
743 if p not in (p1, p2):
744 raise util.Abort(_('%s is not a parent of %s' %
744 raise util.Abort(_('%s is not a parent of %s' %
745 (short(p), short(node))))
745 (short(p), short(node))))
746 parent = p
746 parent = p
747 else:
747 else:
748 if opts['parent']:
748 if opts['parent']:
749 raise util.Abort(_('cannot use --parent on non-merge changeset'))
749 raise util.Abort(_('cannot use --parent on non-merge changeset'))
750 parent = p1
750 parent = p1
751 hg.clean(repo, node, show_stats=False)
751 hg.clean(repo, node, show_stats=False)
752 revert_opts = opts.copy()
752 revert_opts = opts.copy()
753 revert_opts['all'] = True
753 revert_opts['all'] = True
754 revert_opts['rev'] = hex(parent)
754 revert_opts['rev'] = hex(parent)
755 revert(ui, repo, **revert_opts)
755 revert(ui, repo, **revert_opts)
756 commit_opts = opts.copy()
756 commit_opts = opts.copy()
757 commit_opts['addremove'] = False
757 commit_opts['addremove'] = False
758 if not commit_opts['message'] and not commit_opts['logfile']:
758 if not commit_opts['message'] and not commit_opts['logfile']:
759 commit_opts['message'] = _("Backed out changeset %s") % (hex(node))
759 commit_opts['message'] = _("Backed out changeset %s") % (hex(node))
760 commit_opts['force_editor'] = True
760 commit_opts['force_editor'] = True
761 commit(ui, repo, **commit_opts)
761 commit(ui, repo, **commit_opts)
762 def nice(node):
762 def nice(node):
763 return '%d:%s' % (repo.changelog.rev(node), short(node))
763 return '%d:%s' % (repo.changelog.rev(node), short(node))
764 ui.status(_('changeset %s backs out changeset %s\n') %
764 ui.status(_('changeset %s backs out changeset %s\n') %
765 (nice(repo.changelog.tip()), nice(node)))
765 (nice(repo.changelog.tip()), nice(node)))
766 if op1 != node:
766 if op1 != node:
767 if opts['merge']:
767 if opts['merge']:
768 ui.status(_('merging with changeset %s\n') % nice(op1))
768 ui.status(_('merging with changeset %s\n') % nice(op1))
769 n = _lookup(repo, hex(op1))
769 n = _lookup(repo, hex(op1))
770 hg.merge(repo, n)
770 hg.merge(repo, n)
771 else:
771 else:
772 ui.status(_('the backout changeset is a new head - '
772 ui.status(_('the backout changeset is a new head - '
773 'do not forget to merge\n'))
773 'do not forget to merge\n'))
774 ui.status(_('(use "backout --merge" '
774 ui.status(_('(use "backout --merge" '
775 'if you want to auto-merge)\n'))
775 'if you want to auto-merge)\n'))
776
776
777 def branch(ui, repo, label=None):
778 """set or show the current branch name
779
780 With <name>, set the current branch name. Otherwise, show the
781 current branch name.
782 """
783
784 if label is not None:
785 repo.opener("branch", "w").write(label)
786 else:
787 b = repo.workingctx().branch()
788 if b:
789 ui.write("%s\n" % b)
790
791 def branches(ui, repo):
792 """list repository named branches
793
794 List the repository's named branches.
795 """
796 b = repo.branchtags()
797 l = [(-repo.changelog.rev(n), n, t) for t,n in b.items()]
798 l.sort()
799 for r, n, t in l:
800 hexfunc = ui.debugflag and hex or short
801 if ui.quiet:
802 ui.write("%s\n" % t)
803 else:
804 ui.write("%-30s %s:%s\n" % (t, -r, hexfunc(n)))
805
777 def bundle(ui, repo, fname, dest=None, **opts):
806 def bundle(ui, repo, fname, dest=None, **opts):
778 """create a changegroup file
807 """create a changegroup file
779
808
780 Generate a compressed changegroup file collecting changesets.
809 Generate a compressed changegroup file collecting changesets.
781 not found in the other repository.
810 not found in the other repository.
782
811
783 If no destination repository is specified the destination is
812 If no destination repository is specified the destination is
784 assumed to have all the node specified by --base.
813 assumed to have all the node specified by --base.
785
814
786 This file can then be transferred using conventional means and
815 This file can then be transferred using conventional means and
787 applied to another repository with the unbundle command. This is
816 applied to another repository with the unbundle command. This is
788 useful when native push and pull are not available or when
817 useful when native push and pull are not available or when
789 exporting an entire repository is undesirable. The standard file
818 exporting an entire repository is undesirable. The standard file
790 extension is ".hg".
819 extension is ".hg".
791
820
792 Unlike import/export, this exactly preserves all changeset
821 Unlike import/export, this exactly preserves all changeset
793 contents including permissions, rename data, and revision history.
822 contents including permissions, rename data, and revision history.
794 """
823 """
795 revs = opts.get('rev') or None
824 revs = opts.get('rev') or None
796 if revs:
825 if revs:
797 revs = [repo.lookup(rev) for rev in revs]
826 revs = [repo.lookup(rev) for rev in revs]
798 base = opts.get('base')
827 base = opts.get('base')
799 if base:
828 if base:
800 if dest:
829 if dest:
801 raise util.Abort(_("--base is incompatible with specifiying "
830 raise util.Abort(_("--base is incompatible with specifiying "
802 "a destination"))
831 "a destination"))
803 base = [repo.lookup(rev) for rev in base]
832 base = [repo.lookup(rev) for rev in base]
804 # create the right base
833 # create the right base
805 # XXX: nodesbetween / changegroup* should be "fixed" instead
834 # XXX: nodesbetween / changegroup* should be "fixed" instead
806 o = []
835 o = []
807 has_set = sets.Set(base)
836 has_set = sets.Set(base)
808 for n in base:
837 for n in base:
809 has_set.update(repo.changelog.reachable(n))
838 has_set.update(repo.changelog.reachable(n))
810 if revs:
839 if revs:
811 visit = list(revs)
840 visit = list(revs)
812 else:
841 else:
813 visit = repo.changelog.heads()
842 visit = repo.changelog.heads()
814 while visit:
843 while visit:
815 n = visit.pop(0)
844 n = visit.pop(0)
816 parents = [p for p in repo.changelog.parents(n)
845 parents = [p for p in repo.changelog.parents(n)
817 if p != nullid and p not in has_set]
846 if p != nullid and p not in has_set]
818 if len(parents) == 0:
847 if len(parents) == 0:
819 o.insert(0, n)
848 o.insert(0, n)
820 else:
849 else:
821 visit.extend(parents)
850 visit.extend(parents)
822 else:
851 else:
823 setremoteconfig(ui, opts)
852 setremoteconfig(ui, opts)
824 dest = ui.expandpath(dest or 'default-push', dest or 'default')
853 dest = ui.expandpath(dest or 'default-push', dest or 'default')
825 other = hg.repository(ui, dest)
854 other = hg.repository(ui, dest)
826 o = repo.findoutgoing(other, force=opts['force'])
855 o = repo.findoutgoing(other, force=opts['force'])
827
856
828 if revs:
857 if revs:
829 cg = repo.changegroupsubset(o, revs, 'bundle')
858 cg = repo.changegroupsubset(o, revs, 'bundle')
830 else:
859 else:
831 cg = repo.changegroup(o, 'bundle')
860 cg = repo.changegroup(o, 'bundle')
832 write_bundle(cg, fname)
861 write_bundle(cg, fname)
833
862
834 def cat(ui, repo, file1, *pats, **opts):
863 def cat(ui, repo, file1, *pats, **opts):
835 """output the latest or given revisions of files
864 """output the latest or given revisions of files
836
865
837 Print the specified files as they were at the given revision.
866 Print the specified files as they were at the given revision.
838 If no revision is given then working dir parent is used, or tip
867 If no revision is given then working dir parent is used, or tip
839 if no revision is checked out.
868 if no revision is checked out.
840
869
841 Output may be to a file, in which case the name of the file is
870 Output may be to a file, in which case the name of the file is
842 given using a format string. The formatting rules are the same as
871 given using a format string. The formatting rules are the same as
843 for the export command, with the following additions:
872 for the export command, with the following additions:
844
873
845 %s basename of file being printed
874 %s basename of file being printed
846 %d dirname of file being printed, or '.' if in repo root
875 %d dirname of file being printed, or '.' if in repo root
847 %p root-relative path name of file being printed
876 %p root-relative path name of file being printed
848 """
877 """
849 ctx = repo.changectx(opts['rev'])
878 ctx = repo.changectx(opts['rev'])
850 for src, abs, rel, exact in cmdutil.walk(repo, (file1,) + pats, opts,
879 for src, abs, rel, exact in cmdutil.walk(repo, (file1,) + pats, opts,
851 ctx.node()):
880 ctx.node()):
852 fp = cmdutil.make_file(repo, opts['output'], ctx.node(), pathname=abs)
881 fp = cmdutil.make_file(repo, opts['output'], ctx.node(), pathname=abs)
853 fp.write(ctx.filectx(abs).data())
882 fp.write(ctx.filectx(abs).data())
854
883
855 def clone(ui, source, dest=None, **opts):
884 def clone(ui, source, dest=None, **opts):
856 """make a copy of an existing repository
885 """make a copy of an existing repository
857
886
858 Create a copy of an existing repository in a new directory.
887 Create a copy of an existing repository in a new directory.
859
888
860 If no destination directory name is specified, it defaults to the
889 If no destination directory name is specified, it defaults to the
861 basename of the source.
890 basename of the source.
862
891
863 The location of the source is added to the new repository's
892 The location of the source is added to the new repository's
864 .hg/hgrc file, as the default to be used for future pulls.
893 .hg/hgrc file, as the default to be used for future pulls.
865
894
866 For efficiency, hardlinks are used for cloning whenever the source
895 For efficiency, hardlinks are used for cloning whenever the source
867 and destination are on the same filesystem (note this applies only
896 and destination are on the same filesystem (note this applies only
868 to the repository data, not to the checked out files). Some
897 to the repository data, not to the checked out files). Some
869 filesystems, such as AFS, implement hardlinking incorrectly, but
898 filesystems, such as AFS, implement hardlinking incorrectly, but
870 do not report errors. In these cases, use the --pull option to
899 do not report errors. In these cases, use the --pull option to
871 avoid hardlinking.
900 avoid hardlinking.
872
901
873 You can safely clone repositories and checked out files using full
902 You can safely clone repositories and checked out files using full
874 hardlinks with
903 hardlinks with
875
904
876 $ cp -al REPO REPOCLONE
905 $ cp -al REPO REPOCLONE
877
906
878 which is the fastest way to clone. However, the operation is not
907 which is the fastest way to clone. However, the operation is not
879 atomic (making sure REPO is not modified during the operation is
908 atomic (making sure REPO is not modified during the operation is
880 up to you) and you have to make sure your editor breaks hardlinks
909 up to you) and you have to make sure your editor breaks hardlinks
881 (Emacs and most Linux Kernel tools do so).
910 (Emacs and most Linux Kernel tools do so).
882
911
883 If you use the -r option to clone up to a specific revision, no
912 If you use the -r option to clone up to a specific revision, no
884 subsequent revisions will be present in the cloned repository.
913 subsequent revisions will be present in the cloned repository.
885 This option implies --pull, even on local repositories.
914 This option implies --pull, even on local repositories.
886
915
887 See pull for valid source format details.
916 See pull for valid source format details.
888
917
889 It is possible to specify an ssh:// URL as the destination, but no
918 It is possible to specify an ssh:// URL as the destination, but no
890 .hg/hgrc will be created on the remote side. Look at the help text
919 .hg/hgrc will be created on the remote side. Look at the help text
891 for the pull command for important details about ssh:// URLs.
920 for the pull command for important details about ssh:// URLs.
892 """
921 """
893 setremoteconfig(ui, opts)
922 setremoteconfig(ui, opts)
894 hg.clone(ui, ui.expandpath(source), dest,
923 hg.clone(ui, ui.expandpath(source), dest,
895 pull=opts['pull'],
924 pull=opts['pull'],
896 stream=opts['uncompressed'],
925 stream=opts['uncompressed'],
897 rev=opts['rev'],
926 rev=opts['rev'],
898 update=not opts['noupdate'])
927 update=not opts['noupdate'])
899
928
900 def commit(ui, repo, *pats, **opts):
929 def commit(ui, repo, *pats, **opts):
901 """commit the specified files or all outstanding changes
930 """commit the specified files or all outstanding changes
902
931
903 Commit changes to the given files into the repository.
932 Commit changes to the given files into the repository.
904
933
905 If a list of files is omitted, all changes reported by "hg status"
934 If a list of files is omitted, all changes reported by "hg status"
906 will be committed.
935 will be committed.
907
936
908 If no commit message is specified, the editor configured in your hgrc
937 If no commit message is specified, the editor configured in your hgrc
909 or in the EDITOR environment variable is started to enter a message.
938 or in the EDITOR environment variable is started to enter a message.
910 """
939 """
911 message = logmessage(opts)
940 message = logmessage(opts)
912
941
913 if opts['addremove']:
942 if opts['addremove']:
914 cmdutil.addremove(repo, pats, opts)
943 cmdutil.addremove(repo, pats, opts)
915 fns, match, anypats = cmdutil.matchpats(repo, pats, opts)
944 fns, match, anypats = cmdutil.matchpats(repo, pats, opts)
916 if pats:
945 if pats:
917 modified, added, removed = repo.status(files=fns, match=match)[:3]
946 modified, added, removed = repo.status(files=fns, match=match)[:3]
918 files = modified + added + removed
947 files = modified + added + removed
919 else:
948 else:
920 files = []
949 files = []
921 try:
950 try:
922 repo.commit(files, message, opts['user'], opts['date'], match,
951 repo.commit(files, message, opts['user'], opts['date'], match,
923 force_editor=opts.get('force_editor'))
952 force_editor=opts.get('force_editor'))
924 except ValueError, inst:
953 except ValueError, inst:
925 raise util.Abort(str(inst))
954 raise util.Abort(str(inst))
926
955
927 def docopy(ui, repo, pats, opts, wlock):
956 def docopy(ui, repo, pats, opts, wlock):
928 # called with the repo lock held
957 # called with the repo lock held
929 cwd = repo.getcwd()
958 cwd = repo.getcwd()
930 errors = 0
959 errors = 0
931 copied = []
960 copied = []
932 targets = {}
961 targets = {}
933
962
934 def okaytocopy(abs, rel, exact):
963 def okaytocopy(abs, rel, exact):
935 reasons = {'?': _('is not managed'),
964 reasons = {'?': _('is not managed'),
936 'a': _('has been marked for add'),
965 'a': _('has been marked for add'),
937 'r': _('has been marked for remove')}
966 'r': _('has been marked for remove')}
938 state = repo.dirstate.state(abs)
967 state = repo.dirstate.state(abs)
939 reason = reasons.get(state)
968 reason = reasons.get(state)
940 if reason:
969 if reason:
941 if state == 'a':
970 if state == 'a':
942 origsrc = repo.dirstate.copied(abs)
971 origsrc = repo.dirstate.copied(abs)
943 if origsrc is not None:
972 if origsrc is not None:
944 return origsrc
973 return origsrc
945 if exact:
974 if exact:
946 ui.warn(_('%s: not copying - file %s\n') % (rel, reason))
975 ui.warn(_('%s: not copying - file %s\n') % (rel, reason))
947 else:
976 else:
948 return abs
977 return abs
949
978
950 def copy(origsrc, abssrc, relsrc, target, exact):
979 def copy(origsrc, abssrc, relsrc, target, exact):
951 abstarget = util.canonpath(repo.root, cwd, target)
980 abstarget = util.canonpath(repo.root, cwd, target)
952 reltarget = util.pathto(cwd, abstarget)
981 reltarget = util.pathto(cwd, abstarget)
953 prevsrc = targets.get(abstarget)
982 prevsrc = targets.get(abstarget)
954 if prevsrc is not None:
983 if prevsrc is not None:
955 ui.warn(_('%s: not overwriting - %s collides with %s\n') %
984 ui.warn(_('%s: not overwriting - %s collides with %s\n') %
956 (reltarget, abssrc, prevsrc))
985 (reltarget, abssrc, prevsrc))
957 return
986 return
958 if (not opts['after'] and os.path.exists(reltarget) or
987 if (not opts['after'] and os.path.exists(reltarget) or
959 opts['after'] and repo.dirstate.state(abstarget) not in '?r'):
988 opts['after'] and repo.dirstate.state(abstarget) not in '?r'):
960 if not opts['force']:
989 if not opts['force']:
961 ui.warn(_('%s: not overwriting - file exists\n') %
990 ui.warn(_('%s: not overwriting - file exists\n') %
962 reltarget)
991 reltarget)
963 return
992 return
964 if not opts['after'] and not opts.get('dry_run'):
993 if not opts['after'] and not opts.get('dry_run'):
965 os.unlink(reltarget)
994 os.unlink(reltarget)
966 if opts['after']:
995 if opts['after']:
967 if not os.path.exists(reltarget):
996 if not os.path.exists(reltarget):
968 return
997 return
969 else:
998 else:
970 targetdir = os.path.dirname(reltarget) or '.'
999 targetdir = os.path.dirname(reltarget) or '.'
971 if not os.path.isdir(targetdir) and not opts.get('dry_run'):
1000 if not os.path.isdir(targetdir) and not opts.get('dry_run'):
972 os.makedirs(targetdir)
1001 os.makedirs(targetdir)
973 try:
1002 try:
974 restore = repo.dirstate.state(abstarget) == 'r'
1003 restore = repo.dirstate.state(abstarget) == 'r'
975 if restore and not opts.get('dry_run'):
1004 if restore and not opts.get('dry_run'):
976 repo.undelete([abstarget], wlock)
1005 repo.undelete([abstarget], wlock)
977 try:
1006 try:
978 if not opts.get('dry_run'):
1007 if not opts.get('dry_run'):
979 shutil.copyfile(relsrc, reltarget)
1008 shutil.copyfile(relsrc, reltarget)
980 shutil.copymode(relsrc, reltarget)
1009 shutil.copymode(relsrc, reltarget)
981 restore = False
1010 restore = False
982 finally:
1011 finally:
983 if restore:
1012 if restore:
984 repo.remove([abstarget], wlock)
1013 repo.remove([abstarget], wlock)
985 except shutil.Error, inst:
1014 except shutil.Error, inst:
986 raise util.Abort(str(inst))
1015 raise util.Abort(str(inst))
987 except IOError, inst:
1016 except IOError, inst:
988 if inst.errno == errno.ENOENT:
1017 if inst.errno == errno.ENOENT:
989 ui.warn(_('%s: deleted in working copy\n') % relsrc)
1018 ui.warn(_('%s: deleted in working copy\n') % relsrc)
990 else:
1019 else:
991 ui.warn(_('%s: cannot copy - %s\n') %
1020 ui.warn(_('%s: cannot copy - %s\n') %
992 (relsrc, inst.strerror))
1021 (relsrc, inst.strerror))
993 errors += 1
1022 errors += 1
994 return
1023 return
995 if ui.verbose or not exact:
1024 if ui.verbose or not exact:
996 ui.status(_('copying %s to %s\n') % (relsrc, reltarget))
1025 ui.status(_('copying %s to %s\n') % (relsrc, reltarget))
997 targets[abstarget] = abssrc
1026 targets[abstarget] = abssrc
998 if abstarget != origsrc and not opts.get('dry_run'):
1027 if abstarget != origsrc and not opts.get('dry_run'):
999 repo.copy(origsrc, abstarget, wlock)
1028 repo.copy(origsrc, abstarget, wlock)
1000 copied.append((abssrc, relsrc, exact))
1029 copied.append((abssrc, relsrc, exact))
1001
1030
1002 def targetpathfn(pat, dest, srcs):
1031 def targetpathfn(pat, dest, srcs):
1003 if os.path.isdir(pat):
1032 if os.path.isdir(pat):
1004 abspfx = util.canonpath(repo.root, cwd, pat)
1033 abspfx = util.canonpath(repo.root, cwd, pat)
1005 if destdirexists:
1034 if destdirexists:
1006 striplen = len(os.path.split(abspfx)[0])
1035 striplen = len(os.path.split(abspfx)[0])
1007 else:
1036 else:
1008 striplen = len(abspfx)
1037 striplen = len(abspfx)
1009 if striplen:
1038 if striplen:
1010 striplen += len(os.sep)
1039 striplen += len(os.sep)
1011 res = lambda p: os.path.join(dest, p[striplen:])
1040 res = lambda p: os.path.join(dest, p[striplen:])
1012 elif destdirexists:
1041 elif destdirexists:
1013 res = lambda p: os.path.join(dest, os.path.basename(p))
1042 res = lambda p: os.path.join(dest, os.path.basename(p))
1014 else:
1043 else:
1015 res = lambda p: dest
1044 res = lambda p: dest
1016 return res
1045 return res
1017
1046
1018 def targetpathafterfn(pat, dest, srcs):
1047 def targetpathafterfn(pat, dest, srcs):
1019 if util.patkind(pat, None)[0]:
1048 if util.patkind(pat, None)[0]:
1020 # a mercurial pattern
1049 # a mercurial pattern
1021 res = lambda p: os.path.join(dest, os.path.basename(p))
1050 res = lambda p: os.path.join(dest, os.path.basename(p))
1022 else:
1051 else:
1023 abspfx = util.canonpath(repo.root, cwd, pat)
1052 abspfx = util.canonpath(repo.root, cwd, pat)
1024 if len(abspfx) < len(srcs[0][0]):
1053 if len(abspfx) < len(srcs[0][0]):
1025 # A directory. Either the target path contains the last
1054 # A directory. Either the target path contains the last
1026 # component of the source path or it does not.
1055 # component of the source path or it does not.
1027 def evalpath(striplen):
1056 def evalpath(striplen):
1028 score = 0
1057 score = 0
1029 for s in srcs:
1058 for s in srcs:
1030 t = os.path.join(dest, s[0][striplen:])
1059 t = os.path.join(dest, s[0][striplen:])
1031 if os.path.exists(t):
1060 if os.path.exists(t):
1032 score += 1
1061 score += 1
1033 return score
1062 return score
1034
1063
1035 striplen = len(abspfx)
1064 striplen = len(abspfx)
1036 if striplen:
1065 if striplen:
1037 striplen += len(os.sep)
1066 striplen += len(os.sep)
1038 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
1067 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
1039 score = evalpath(striplen)
1068 score = evalpath(striplen)
1040 striplen1 = len(os.path.split(abspfx)[0])
1069 striplen1 = len(os.path.split(abspfx)[0])
1041 if striplen1:
1070 if striplen1:
1042 striplen1 += len(os.sep)
1071 striplen1 += len(os.sep)
1043 if evalpath(striplen1) > score:
1072 if evalpath(striplen1) > score:
1044 striplen = striplen1
1073 striplen = striplen1
1045 res = lambda p: os.path.join(dest, p[striplen:])
1074 res = lambda p: os.path.join(dest, p[striplen:])
1046 else:
1075 else:
1047 # a file
1076 # a file
1048 if destdirexists:
1077 if destdirexists:
1049 res = lambda p: os.path.join(dest, os.path.basename(p))
1078 res = lambda p: os.path.join(dest, os.path.basename(p))
1050 else:
1079 else:
1051 res = lambda p: dest
1080 res = lambda p: dest
1052 return res
1081 return res
1053
1082
1054
1083
1055 pats = list(pats)
1084 pats = list(pats)
1056 if not pats:
1085 if not pats:
1057 raise util.Abort(_('no source or destination specified'))
1086 raise util.Abort(_('no source or destination specified'))
1058 if len(pats) == 1:
1087 if len(pats) == 1:
1059 raise util.Abort(_('no destination specified'))
1088 raise util.Abort(_('no destination specified'))
1060 dest = pats.pop()
1089 dest = pats.pop()
1061 destdirexists = os.path.isdir(dest)
1090 destdirexists = os.path.isdir(dest)
1062 if (len(pats) > 1 or util.patkind(pats[0], None)[0]) and not destdirexists:
1091 if (len(pats) > 1 or util.patkind(pats[0], None)[0]) and not destdirexists:
1063 raise util.Abort(_('with multiple sources, destination must be an '
1092 raise util.Abort(_('with multiple sources, destination must be an '
1064 'existing directory'))
1093 'existing directory'))
1065 if opts['after']:
1094 if opts['after']:
1066 tfn = targetpathafterfn
1095 tfn = targetpathafterfn
1067 else:
1096 else:
1068 tfn = targetpathfn
1097 tfn = targetpathfn
1069 copylist = []
1098 copylist = []
1070 for pat in pats:
1099 for pat in pats:
1071 srcs = []
1100 srcs = []
1072 for tag, abssrc, relsrc, exact in cmdutil.walk(repo, [pat], opts):
1101 for tag, abssrc, relsrc, exact in cmdutil.walk(repo, [pat], opts):
1073 origsrc = okaytocopy(abssrc, relsrc, exact)
1102 origsrc = okaytocopy(abssrc, relsrc, exact)
1074 if origsrc:
1103 if origsrc:
1075 srcs.append((origsrc, abssrc, relsrc, exact))
1104 srcs.append((origsrc, abssrc, relsrc, exact))
1076 if not srcs:
1105 if not srcs:
1077 continue
1106 continue
1078 copylist.append((tfn(pat, dest, srcs), srcs))
1107 copylist.append((tfn(pat, dest, srcs), srcs))
1079 if not copylist:
1108 if not copylist:
1080 raise util.Abort(_('no files to copy'))
1109 raise util.Abort(_('no files to copy'))
1081
1110
1082 for targetpath, srcs in copylist:
1111 for targetpath, srcs in copylist:
1083 for origsrc, abssrc, relsrc, exact in srcs:
1112 for origsrc, abssrc, relsrc, exact in srcs:
1084 copy(origsrc, abssrc, relsrc, targetpath(abssrc), exact)
1113 copy(origsrc, abssrc, relsrc, targetpath(abssrc), exact)
1085
1114
1086 if errors:
1115 if errors:
1087 ui.warn(_('(consider using --after)\n'))
1116 ui.warn(_('(consider using --after)\n'))
1088 return errors, copied
1117 return errors, copied
1089
1118
1090 def copy(ui, repo, *pats, **opts):
1119 def copy(ui, repo, *pats, **opts):
1091 """mark files as copied for the next commit
1120 """mark files as copied for the next commit
1092
1121
1093 Mark dest as having copies of source files. If dest is a
1122 Mark dest as having copies of source files. If dest is a
1094 directory, copies are put in that directory. If dest is a file,
1123 directory, copies are put in that directory. If dest is a file,
1095 there can only be one source.
1124 there can only be one source.
1096
1125
1097 By default, this command copies the contents of files as they
1126 By default, this command copies the contents of files as they
1098 stand in the working directory. If invoked with --after, the
1127 stand in the working directory. If invoked with --after, the
1099 operation is recorded, but no copying is performed.
1128 operation is recorded, but no copying is performed.
1100
1129
1101 This command takes effect in the next commit.
1130 This command takes effect in the next commit.
1102
1131
1103 NOTE: This command should be treated as experimental. While it
1132 NOTE: This command should be treated as experimental. While it
1104 should properly record copied files, this information is not yet
1133 should properly record copied files, this information is not yet
1105 fully used by merge, nor fully reported by log.
1134 fully used by merge, nor fully reported by log.
1106 """
1135 """
1107 wlock = repo.wlock(0)
1136 wlock = repo.wlock(0)
1108 errs, copied = docopy(ui, repo, pats, opts, wlock)
1137 errs, copied = docopy(ui, repo, pats, opts, wlock)
1109 return errs
1138 return errs
1110
1139
1111 def debugancestor(ui, index, rev1, rev2):
1140 def debugancestor(ui, index, rev1, rev2):
1112 """find the ancestor revision of two revisions in a given index"""
1141 """find the ancestor revision of two revisions in a given index"""
1113 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index, "", 0)
1142 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index, "", 0)
1114 a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
1143 a = r.ancestor(r.lookup(rev1), r.lookup(rev2))
1115 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1144 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1116
1145
1117 def debugcomplete(ui, cmd='', **opts):
1146 def debugcomplete(ui, cmd='', **opts):
1118 """returns the completion list associated with the given command"""
1147 """returns the completion list associated with the given command"""
1119
1148
1120 if opts['options']:
1149 if opts['options']:
1121 options = []
1150 options = []
1122 otables = [globalopts]
1151 otables = [globalopts]
1123 if cmd:
1152 if cmd:
1124 aliases, entry = findcmd(ui, cmd)
1153 aliases, entry = findcmd(ui, cmd)
1125 otables.append(entry[1])
1154 otables.append(entry[1])
1126 for t in otables:
1155 for t in otables:
1127 for o in t:
1156 for o in t:
1128 if o[0]:
1157 if o[0]:
1129 options.append('-%s' % o[0])
1158 options.append('-%s' % o[0])
1130 options.append('--%s' % o[1])
1159 options.append('--%s' % o[1])
1131 ui.write("%s\n" % "\n".join(options))
1160 ui.write("%s\n" % "\n".join(options))
1132 return
1161 return
1133
1162
1134 clist = findpossible(ui, cmd).keys()
1163 clist = findpossible(ui, cmd).keys()
1135 clist.sort()
1164 clist.sort()
1136 ui.write("%s\n" % "\n".join(clist))
1165 ui.write("%s\n" % "\n".join(clist))
1137
1166
1138 def debugrebuildstate(ui, repo, rev=None):
1167 def debugrebuildstate(ui, repo, rev=None):
1139 """rebuild the dirstate as it would look like for the given revision"""
1168 """rebuild the dirstate as it would look like for the given revision"""
1140 if not rev:
1169 if not rev:
1141 rev = repo.changelog.tip()
1170 rev = repo.changelog.tip()
1142 else:
1171 else:
1143 rev = repo.lookup(rev)
1172 rev = repo.lookup(rev)
1144 change = repo.changelog.read(rev)
1173 change = repo.changelog.read(rev)
1145 n = change[0]
1174 n = change[0]
1146 files = repo.manifest.read(n)
1175 files = repo.manifest.read(n)
1147 wlock = repo.wlock()
1176 wlock = repo.wlock()
1148 repo.dirstate.rebuild(rev, files)
1177 repo.dirstate.rebuild(rev, files)
1149
1178
1150 def debugcheckstate(ui, repo):
1179 def debugcheckstate(ui, repo):
1151 """validate the correctness of the current dirstate"""
1180 """validate the correctness of the current dirstate"""
1152 parent1, parent2 = repo.dirstate.parents()
1181 parent1, parent2 = repo.dirstate.parents()
1153 repo.dirstate.read()
1182 repo.dirstate.read()
1154 dc = repo.dirstate.map
1183 dc = repo.dirstate.map
1155 keys = dc.keys()
1184 keys = dc.keys()
1156 keys.sort()
1185 keys.sort()
1157 m1n = repo.changelog.read(parent1)[0]
1186 m1n = repo.changelog.read(parent1)[0]
1158 m2n = repo.changelog.read(parent2)[0]
1187 m2n = repo.changelog.read(parent2)[0]
1159 m1 = repo.manifest.read(m1n)
1188 m1 = repo.manifest.read(m1n)
1160 m2 = repo.manifest.read(m2n)
1189 m2 = repo.manifest.read(m2n)
1161 errors = 0
1190 errors = 0
1162 for f in dc:
1191 for f in dc:
1163 state = repo.dirstate.state(f)
1192 state = repo.dirstate.state(f)
1164 if state in "nr" and f not in m1:
1193 if state in "nr" and f not in m1:
1165 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1194 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1166 errors += 1
1195 errors += 1
1167 if state in "a" and f in m1:
1196 if state in "a" and f in m1:
1168 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1197 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1169 errors += 1
1198 errors += 1
1170 if state in "m" and f not in m1 and f not in m2:
1199 if state in "m" and f not in m1 and f not in m2:
1171 ui.warn(_("%s in state %s, but not in either manifest\n") %
1200 ui.warn(_("%s in state %s, but not in either manifest\n") %
1172 (f, state))
1201 (f, state))
1173 errors += 1
1202 errors += 1
1174 for f in m1:
1203 for f in m1:
1175 state = repo.dirstate.state(f)
1204 state = repo.dirstate.state(f)
1176 if state not in "nrm":
1205 if state not in "nrm":
1177 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1206 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1178 errors += 1
1207 errors += 1
1179 if errors:
1208 if errors:
1180 error = _(".hg/dirstate inconsistent with current parent's manifest")
1209 error = _(".hg/dirstate inconsistent with current parent's manifest")
1181 raise util.Abort(error)
1210 raise util.Abort(error)
1182
1211
1183 def showconfig(ui, repo, *values):
1212 def showconfig(ui, repo, *values):
1184 """show combined config settings from all hgrc files
1213 """show combined config settings from all hgrc files
1185
1214
1186 With no args, print names and values of all config items.
1215 With no args, print names and values of all config items.
1187
1216
1188 With one arg of the form section.name, print just the value of
1217 With one arg of the form section.name, print just the value of
1189 that config item.
1218 that config item.
1190
1219
1191 With multiple args, print names and values of all config items
1220 With multiple args, print names and values of all config items
1192 with matching section names."""
1221 with matching section names."""
1193
1222
1194 if values:
1223 if values:
1195 if len([v for v in values if '.' in v]) > 1:
1224 if len([v for v in values if '.' in v]) > 1:
1196 raise util.Abort(_('only one config item permitted'))
1225 raise util.Abort(_('only one config item permitted'))
1197 for section, name, value in ui.walkconfig():
1226 for section, name, value in ui.walkconfig():
1198 sectname = section + '.' + name
1227 sectname = section + '.' + name
1199 if values:
1228 if values:
1200 for v in values:
1229 for v in values:
1201 if v == section:
1230 if v == section:
1202 ui.write('%s=%s\n' % (sectname, value))
1231 ui.write('%s=%s\n' % (sectname, value))
1203 elif v == sectname:
1232 elif v == sectname:
1204 ui.write(value, '\n')
1233 ui.write(value, '\n')
1205 else:
1234 else:
1206 ui.write('%s=%s\n' % (sectname, value))
1235 ui.write('%s=%s\n' % (sectname, value))
1207
1236
1208 def debugsetparents(ui, repo, rev1, rev2=None):
1237 def debugsetparents(ui, repo, rev1, rev2=None):
1209 """manually set the parents of the current working directory
1238 """manually set the parents of the current working directory
1210
1239
1211 This is useful for writing repository conversion tools, but should
1240 This is useful for writing repository conversion tools, but should
1212 be used with care.
1241 be used with care.
1213 """
1242 """
1214
1243
1215 if not rev2:
1244 if not rev2:
1216 rev2 = hex(nullid)
1245 rev2 = hex(nullid)
1217
1246
1218 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
1247 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
1219
1248
1220 def debugstate(ui, repo):
1249 def debugstate(ui, repo):
1221 """show the contents of the current dirstate"""
1250 """show the contents of the current dirstate"""
1222 repo.dirstate.read()
1251 repo.dirstate.read()
1223 dc = repo.dirstate.map
1252 dc = repo.dirstate.map
1224 keys = dc.keys()
1253 keys = dc.keys()
1225 keys.sort()
1254 keys.sort()
1226 for file_ in keys:
1255 for file_ in keys:
1227 ui.write("%c %3o %10d %s %s\n"
1256 ui.write("%c %3o %10d %s %s\n"
1228 % (dc[file_][0], dc[file_][1] & 0777, dc[file_][2],
1257 % (dc[file_][0], dc[file_][1] & 0777, dc[file_][2],
1229 time.strftime("%x %X",
1258 time.strftime("%x %X",
1230 time.localtime(dc[file_][3])), file_))
1259 time.localtime(dc[file_][3])), file_))
1231 for f in repo.dirstate.copies():
1260 for f in repo.dirstate.copies():
1232 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
1261 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
1233
1262
1234 def debugdata(ui, file_, rev):
1263 def debugdata(ui, file_, rev):
1235 """dump the contents of an data file revision"""
1264 """dump the contents of an data file revision"""
1236 r = revlog.revlog(util.opener(os.getcwd(), audit=False),
1265 r = revlog.revlog(util.opener(os.getcwd(), audit=False),
1237 file_[:-2] + ".i", file_, 0)
1266 file_[:-2] + ".i", file_, 0)
1238 try:
1267 try:
1239 ui.write(r.revision(r.lookup(rev)))
1268 ui.write(r.revision(r.lookup(rev)))
1240 except KeyError:
1269 except KeyError:
1241 raise util.Abort(_('invalid revision identifier %s') % rev)
1270 raise util.Abort(_('invalid revision identifier %s') % rev)
1242
1271
1243 def debugindex(ui, file_):
1272 def debugindex(ui, file_):
1244 """dump the contents of an index file"""
1273 """dump the contents of an index file"""
1245 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "", 0)
1274 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "", 0)
1246 ui.write(" rev offset length base linkrev" +
1275 ui.write(" rev offset length base linkrev" +
1247 " nodeid p1 p2\n")
1276 " nodeid p1 p2\n")
1248 for i in xrange(r.count()):
1277 for i in xrange(r.count()):
1249 node = r.node(i)
1278 node = r.node(i)
1250 pp = r.parents(node)
1279 pp = r.parents(node)
1251 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
1280 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
1252 i, r.start(i), r.length(i), r.base(i), r.linkrev(node),
1281 i, r.start(i), r.length(i), r.base(i), r.linkrev(node),
1253 short(node), short(pp[0]), short(pp[1])))
1282 short(node), short(pp[0]), short(pp[1])))
1254
1283
1255 def debugindexdot(ui, file_):
1284 def debugindexdot(ui, file_):
1256 """dump an index DAG as a .dot file"""
1285 """dump an index DAG as a .dot file"""
1257 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "", 0)
1286 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_, "", 0)
1258 ui.write("digraph G {\n")
1287 ui.write("digraph G {\n")
1259 for i in xrange(r.count()):
1288 for i in xrange(r.count()):
1260 node = r.node(i)
1289 node = r.node(i)
1261 pp = r.parents(node)
1290 pp = r.parents(node)
1262 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
1291 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
1263 if pp[1] != nullid:
1292 if pp[1] != nullid:
1264 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
1293 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
1265 ui.write("}\n")
1294 ui.write("}\n")
1266
1295
1267 def debugrename(ui, repo, file, rev=None):
1296 def debugrename(ui, repo, file, rev=None):
1268 """dump rename information"""
1297 """dump rename information"""
1269 r = repo.file(relpath(repo, [file])[0])
1298 r = repo.file(relpath(repo, [file])[0])
1270 if rev:
1299 if rev:
1271 try:
1300 try:
1272 # assume all revision numbers are for changesets
1301 # assume all revision numbers are for changesets
1273 n = repo.lookup(rev)
1302 n = repo.lookup(rev)
1274 change = repo.changelog.read(n)
1303 change = repo.changelog.read(n)
1275 m = repo.manifest.read(change[0])
1304 m = repo.manifest.read(change[0])
1276 n = m[relpath(repo, [file])[0]]
1305 n = m[relpath(repo, [file])[0]]
1277 except (hg.RepoError, KeyError):
1306 except (hg.RepoError, KeyError):
1278 n = r.lookup(rev)
1307 n = r.lookup(rev)
1279 else:
1308 else:
1280 n = r.tip()
1309 n = r.tip()
1281 m = r.renamed(n)
1310 m = r.renamed(n)
1282 if m:
1311 if m:
1283 ui.write(_("renamed from %s:%s\n") % (m[0], hex(m[1])))
1312 ui.write(_("renamed from %s:%s\n") % (m[0], hex(m[1])))
1284 else:
1313 else:
1285 ui.write(_("not renamed\n"))
1314 ui.write(_("not renamed\n"))
1286
1315
1287 def debugwalk(ui, repo, *pats, **opts):
1316 def debugwalk(ui, repo, *pats, **opts):
1288 """show how files match on given patterns"""
1317 """show how files match on given patterns"""
1289 items = list(cmdutil.walk(repo, pats, opts))
1318 items = list(cmdutil.walk(repo, pats, opts))
1290 if not items:
1319 if not items:
1291 return
1320 return
1292 fmt = '%%s %%-%ds %%-%ds %%s' % (
1321 fmt = '%%s %%-%ds %%-%ds %%s' % (
1293 max([len(abs) for (src, abs, rel, exact) in items]),
1322 max([len(abs) for (src, abs, rel, exact) in items]),
1294 max([len(rel) for (src, abs, rel, exact) in items]))
1323 max([len(rel) for (src, abs, rel, exact) in items]))
1295 for src, abs, rel, exact in items:
1324 for src, abs, rel, exact in items:
1296 line = fmt % (src, abs, rel, exact and 'exact' or '')
1325 line = fmt % (src, abs, rel, exact and 'exact' or '')
1297 ui.write("%s\n" % line.rstrip())
1326 ui.write("%s\n" % line.rstrip())
1298
1327
1299 def diff(ui, repo, *pats, **opts):
1328 def diff(ui, repo, *pats, **opts):
1300 """diff repository (or selected files)
1329 """diff repository (or selected files)
1301
1330
1302 Show differences between revisions for the specified files.
1331 Show differences between revisions for the specified files.
1303
1332
1304 Differences between files are shown using the unified diff format.
1333 Differences between files are shown using the unified diff format.
1305
1334
1306 When two revision arguments are given, then changes are shown
1335 When two revision arguments are given, then changes are shown
1307 between those revisions. If only one revision is specified then
1336 between those revisions. If only one revision is specified then
1308 that revision is compared to the working directory, and, when no
1337 that revision is compared to the working directory, and, when no
1309 revisions are specified, the working directory files are compared
1338 revisions are specified, the working directory files are compared
1310 to its parent.
1339 to its parent.
1311
1340
1312 Without the -a option, diff will avoid generating diffs of files
1341 Without the -a option, diff will avoid generating diffs of files
1313 it detects as binary. With -a, diff will generate a diff anyway,
1342 it detects as binary. With -a, diff will generate a diff anyway,
1314 probably with undesirable results.
1343 probably with undesirable results.
1315 """
1344 """
1316 node1, node2 = cmdutil.revpair(ui, repo, opts['rev'])
1345 node1, node2 = cmdutil.revpair(ui, repo, opts['rev'])
1317
1346
1318 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
1347 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
1319
1348
1320 patch.diff(repo, node1, node2, fns, match=matchfn,
1349 patch.diff(repo, node1, node2, fns, match=matchfn,
1321 opts=patch.diffopts(ui, opts))
1350 opts=patch.diffopts(ui, opts))
1322
1351
1323 def export(ui, repo, *changesets, **opts):
1352 def export(ui, repo, *changesets, **opts):
1324 """dump the header and diffs for one or more changesets
1353 """dump the header and diffs for one or more changesets
1325
1354
1326 Print the changeset header and diffs for one or more revisions.
1355 Print the changeset header and diffs for one or more revisions.
1327
1356
1328 The information shown in the changeset header is: author,
1357 The information shown in the changeset header is: author,
1329 changeset hash, parent and commit comment.
1358 changeset hash, parent and commit comment.
1330
1359
1331 Output may be to a file, in which case the name of the file is
1360 Output may be to a file, in which case the name of the file is
1332 given using a format string. The formatting rules are as follows:
1361 given using a format string. The formatting rules are as follows:
1333
1362
1334 %% literal "%" character
1363 %% literal "%" character
1335 %H changeset hash (40 bytes of hexadecimal)
1364 %H changeset hash (40 bytes of hexadecimal)
1336 %N number of patches being generated
1365 %N number of patches being generated
1337 %R changeset revision number
1366 %R changeset revision number
1338 %b basename of the exporting repository
1367 %b basename of the exporting repository
1339 %h short-form changeset hash (12 bytes of hexadecimal)
1368 %h short-form changeset hash (12 bytes of hexadecimal)
1340 %n zero-padded sequence number, starting at 1
1369 %n zero-padded sequence number, starting at 1
1341 %r zero-padded changeset revision number
1370 %r zero-padded changeset revision number
1342
1371
1343 Without the -a option, export will avoid generating diffs of files
1372 Without the -a option, export will avoid generating diffs of files
1344 it detects as binary. With -a, export will generate a diff anyway,
1373 it detects as binary. With -a, export will generate a diff anyway,
1345 probably with undesirable results.
1374 probably with undesirable results.
1346
1375
1347 With the --switch-parent option, the diff will be against the second
1376 With the --switch-parent option, the diff will be against the second
1348 parent. It can be useful to review a merge.
1377 parent. It can be useful to review a merge.
1349 """
1378 """
1350 if not changesets:
1379 if not changesets:
1351 raise util.Abort(_("export requires at least one changeset"))
1380 raise util.Abort(_("export requires at least one changeset"))
1352 revs = list(cmdutil.revrange(ui, repo, changesets))
1381 revs = list(cmdutil.revrange(ui, repo, changesets))
1353 if len(revs) > 1:
1382 if len(revs) > 1:
1354 ui.note(_('exporting patches:\n'))
1383 ui.note(_('exporting patches:\n'))
1355 else:
1384 else:
1356 ui.note(_('exporting patch:\n'))
1385 ui.note(_('exporting patch:\n'))
1357 patch.export(repo, map(repo.lookup, revs), template=opts['output'],
1386 patch.export(repo, map(repo.lookup, revs), template=opts['output'],
1358 switch_parent=opts['switch_parent'],
1387 switch_parent=opts['switch_parent'],
1359 opts=patch.diffopts(ui, opts))
1388 opts=patch.diffopts(ui, opts))
1360
1389
1361 def forget(ui, repo, *pats, **opts):
1390 def forget(ui, repo, *pats, **opts):
1362 """don't add the specified files on the next commit (DEPRECATED)
1391 """don't add the specified files on the next commit (DEPRECATED)
1363
1392
1364 (DEPRECATED)
1393 (DEPRECATED)
1365 Undo an 'hg add' scheduled for the next commit.
1394 Undo an 'hg add' scheduled for the next commit.
1366
1395
1367 This command is now deprecated and will be removed in a future
1396 This command is now deprecated and will be removed in a future
1368 release. Please use revert instead.
1397 release. Please use revert instead.
1369 """
1398 """
1370 ui.warn(_("(the forget command is deprecated; use revert instead)\n"))
1399 ui.warn(_("(the forget command is deprecated; use revert instead)\n"))
1371 forget = []
1400 forget = []
1372 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
1401 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
1373 if repo.dirstate.state(abs) == 'a':
1402 if repo.dirstate.state(abs) == 'a':
1374 forget.append(abs)
1403 forget.append(abs)
1375 if ui.verbose or not exact:
1404 if ui.verbose or not exact:
1376 ui.status(_('forgetting %s\n') % ((pats and rel) or abs))
1405 ui.status(_('forgetting %s\n') % ((pats and rel) or abs))
1377 repo.forget(forget)
1406 repo.forget(forget)
1378
1407
1379 def grep(ui, repo, pattern, *pats, **opts):
1408 def grep(ui, repo, pattern, *pats, **opts):
1380 """search for a pattern in specified files and revisions
1409 """search for a pattern in specified files and revisions
1381
1410
1382 Search revisions of files for a regular expression.
1411 Search revisions of files for a regular expression.
1383
1412
1384 This command behaves differently than Unix grep. It only accepts
1413 This command behaves differently than Unix grep. It only accepts
1385 Python/Perl regexps. It searches repository history, not the
1414 Python/Perl regexps. It searches repository history, not the
1386 working directory. It always prints the revision number in which
1415 working directory. It always prints the revision number in which
1387 a match appears.
1416 a match appears.
1388
1417
1389 By default, grep only prints output for the first revision of a
1418 By default, grep only prints output for the first revision of a
1390 file in which it finds a match. To get it to print every revision
1419 file in which it finds a match. To get it to print every revision
1391 that contains a change in match status ("-" for a match that
1420 that contains a change in match status ("-" for a match that
1392 becomes a non-match, or "+" for a non-match that becomes a match),
1421 becomes a non-match, or "+" for a non-match that becomes a match),
1393 use the --all flag.
1422 use the --all flag.
1394 """
1423 """
1395 reflags = 0
1424 reflags = 0
1396 if opts['ignore_case']:
1425 if opts['ignore_case']:
1397 reflags |= re.I
1426 reflags |= re.I
1398 regexp = re.compile(pattern, reflags)
1427 regexp = re.compile(pattern, reflags)
1399 sep, eol = ':', '\n'
1428 sep, eol = ':', '\n'
1400 if opts['print0']:
1429 if opts['print0']:
1401 sep = eol = '\0'
1430 sep = eol = '\0'
1402
1431
1403 fcache = {}
1432 fcache = {}
1404 def getfile(fn):
1433 def getfile(fn):
1405 if fn not in fcache:
1434 if fn not in fcache:
1406 fcache[fn] = repo.file(fn)
1435 fcache[fn] = repo.file(fn)
1407 return fcache[fn]
1436 return fcache[fn]
1408
1437
1409 def matchlines(body):
1438 def matchlines(body):
1410 begin = 0
1439 begin = 0
1411 linenum = 0
1440 linenum = 0
1412 while True:
1441 while True:
1413 match = regexp.search(body, begin)
1442 match = regexp.search(body, begin)
1414 if not match:
1443 if not match:
1415 break
1444 break
1416 mstart, mend = match.span()
1445 mstart, mend = match.span()
1417 linenum += body.count('\n', begin, mstart) + 1
1446 linenum += body.count('\n', begin, mstart) + 1
1418 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1447 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1419 lend = body.find('\n', mend)
1448 lend = body.find('\n', mend)
1420 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1449 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1421 begin = lend + 1
1450 begin = lend + 1
1422
1451
1423 class linestate(object):
1452 class linestate(object):
1424 def __init__(self, line, linenum, colstart, colend):
1453 def __init__(self, line, linenum, colstart, colend):
1425 self.line = line
1454 self.line = line
1426 self.linenum = linenum
1455 self.linenum = linenum
1427 self.colstart = colstart
1456 self.colstart = colstart
1428 self.colend = colend
1457 self.colend = colend
1429
1458
1430 def __eq__(self, other):
1459 def __eq__(self, other):
1431 return self.line == other.line
1460 return self.line == other.line
1432
1461
1433 matches = {}
1462 matches = {}
1434 copies = {}
1463 copies = {}
1435 def grepbody(fn, rev, body):
1464 def grepbody(fn, rev, body):
1436 matches[rev].setdefault(fn, [])
1465 matches[rev].setdefault(fn, [])
1437 m = matches[rev][fn]
1466 m = matches[rev][fn]
1438 for lnum, cstart, cend, line in matchlines(body):
1467 for lnum, cstart, cend, line in matchlines(body):
1439 s = linestate(line, lnum, cstart, cend)
1468 s = linestate(line, lnum, cstart, cend)
1440 m.append(s)
1469 m.append(s)
1441
1470
1442 def difflinestates(a, b):
1471 def difflinestates(a, b):
1443 sm = difflib.SequenceMatcher(None, a, b)
1472 sm = difflib.SequenceMatcher(None, a, b)
1444 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1473 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1445 if tag == 'insert':
1474 if tag == 'insert':
1446 for i in xrange(blo, bhi):
1475 for i in xrange(blo, bhi):
1447 yield ('+', b[i])
1476 yield ('+', b[i])
1448 elif tag == 'delete':
1477 elif tag == 'delete':
1449 for i in xrange(alo, ahi):
1478 for i in xrange(alo, ahi):
1450 yield ('-', a[i])
1479 yield ('-', a[i])
1451 elif tag == 'replace':
1480 elif tag == 'replace':
1452 for i in xrange(alo, ahi):
1481 for i in xrange(alo, ahi):
1453 yield ('-', a[i])
1482 yield ('-', a[i])
1454 for i in xrange(blo, bhi):
1483 for i in xrange(blo, bhi):
1455 yield ('+', b[i])
1484 yield ('+', b[i])
1456
1485
1457 prev = {}
1486 prev = {}
1458 ucache = {}
1487 ucache = {}
1459 def display(fn, rev, states, prevstates):
1488 def display(fn, rev, states, prevstates):
1460 counts = {'-': 0, '+': 0}
1489 counts = {'-': 0, '+': 0}
1461 filerevmatches = {}
1490 filerevmatches = {}
1462 if incrementing or not opts['all']:
1491 if incrementing or not opts['all']:
1463 a, b = prevstates, states
1492 a, b = prevstates, states
1464 else:
1493 else:
1465 a, b = states, prevstates
1494 a, b = states, prevstates
1466 for change, l in difflinestates(a, b):
1495 for change, l in difflinestates(a, b):
1467 if incrementing or not opts['all']:
1496 if incrementing or not opts['all']:
1468 r = rev
1497 r = rev
1469 else:
1498 else:
1470 r = prev[fn]
1499 r = prev[fn]
1471 cols = [fn, str(r)]
1500 cols = [fn, str(r)]
1472 if opts['line_number']:
1501 if opts['line_number']:
1473 cols.append(str(l.linenum))
1502 cols.append(str(l.linenum))
1474 if opts['all']:
1503 if opts['all']:
1475 cols.append(change)
1504 cols.append(change)
1476 if opts['user']:
1505 if opts['user']:
1477 cols.append(trimuser(ui, getchange(r)[1], rev,
1506 cols.append(trimuser(ui, getchange(r)[1], rev,
1478 ucache))
1507 ucache))
1479 if opts['files_with_matches']:
1508 if opts['files_with_matches']:
1480 c = (fn, rev)
1509 c = (fn, rev)
1481 if c in filerevmatches:
1510 if c in filerevmatches:
1482 continue
1511 continue
1483 filerevmatches[c] = 1
1512 filerevmatches[c] = 1
1484 else:
1513 else:
1485 cols.append(l.line)
1514 cols.append(l.line)
1486 ui.write(sep.join(cols), eol)
1515 ui.write(sep.join(cols), eol)
1487 counts[change] += 1
1516 counts[change] += 1
1488 return counts['+'], counts['-']
1517 return counts['+'], counts['-']
1489
1518
1490 fstate = {}
1519 fstate = {}
1491 skip = {}
1520 skip = {}
1492 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts)
1521 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts)
1493 count = 0
1522 count = 0
1494 incrementing = False
1523 incrementing = False
1495 follow = opts.get('follow')
1524 follow = opts.get('follow')
1496 for st, rev, fns in changeiter:
1525 for st, rev, fns in changeiter:
1497 if st == 'window':
1526 if st == 'window':
1498 incrementing = rev
1527 incrementing = rev
1499 matches.clear()
1528 matches.clear()
1500 elif st == 'add':
1529 elif st == 'add':
1501 change = repo.changelog.read(repo.lookup(str(rev)))
1530 change = repo.changelog.read(repo.lookup(str(rev)))
1502 mf = repo.manifest.read(change[0])
1531 mf = repo.manifest.read(change[0])
1503 matches[rev] = {}
1532 matches[rev] = {}
1504 for fn in fns:
1533 for fn in fns:
1505 if fn in skip:
1534 if fn in skip:
1506 continue
1535 continue
1507 fstate.setdefault(fn, {})
1536 fstate.setdefault(fn, {})
1508 try:
1537 try:
1509 grepbody(fn, rev, getfile(fn).read(mf[fn]))
1538 grepbody(fn, rev, getfile(fn).read(mf[fn]))
1510 if follow:
1539 if follow:
1511 copied = getfile(fn).renamed(mf[fn])
1540 copied = getfile(fn).renamed(mf[fn])
1512 if copied:
1541 if copied:
1513 copies.setdefault(rev, {})[fn] = copied[0]
1542 copies.setdefault(rev, {})[fn] = copied[0]
1514 except KeyError:
1543 except KeyError:
1515 pass
1544 pass
1516 elif st == 'iter':
1545 elif st == 'iter':
1517 states = matches[rev].items()
1546 states = matches[rev].items()
1518 states.sort()
1547 states.sort()
1519 for fn, m in states:
1548 for fn, m in states:
1520 copy = copies.get(rev, {}).get(fn)
1549 copy = copies.get(rev, {}).get(fn)
1521 if fn in skip:
1550 if fn in skip:
1522 if copy:
1551 if copy:
1523 skip[copy] = True
1552 skip[copy] = True
1524 continue
1553 continue
1525 if incrementing or not opts['all'] or fstate[fn]:
1554 if incrementing or not opts['all'] or fstate[fn]:
1526 pos, neg = display(fn, rev, m, fstate[fn])
1555 pos, neg = display(fn, rev, m, fstate[fn])
1527 count += pos + neg
1556 count += pos + neg
1528 if pos and not opts['all']:
1557 if pos and not opts['all']:
1529 skip[fn] = True
1558 skip[fn] = True
1530 if copy:
1559 if copy:
1531 skip[copy] = True
1560 skip[copy] = True
1532 fstate[fn] = m
1561 fstate[fn] = m
1533 if copy:
1562 if copy:
1534 fstate[copy] = m
1563 fstate[copy] = m
1535 prev[fn] = rev
1564 prev[fn] = rev
1536
1565
1537 if not incrementing:
1566 if not incrementing:
1538 fstate = fstate.items()
1567 fstate = fstate.items()
1539 fstate.sort()
1568 fstate.sort()
1540 for fn, state in fstate:
1569 for fn, state in fstate:
1541 if fn in skip:
1570 if fn in skip:
1542 continue
1571 continue
1543 if fn not in copies.get(prev[fn], {}):
1572 if fn not in copies.get(prev[fn], {}):
1544 display(fn, rev, {}, state)
1573 display(fn, rev, {}, state)
1545 return (count == 0 and 1) or 0
1574 return (count == 0 and 1) or 0
1546
1575
1547 def heads(ui, repo, **opts):
1576 def heads(ui, repo, **opts):
1548 """show current repository heads
1577 """show current repository heads
1549
1578
1550 Show all repository head changesets.
1579 Show all repository head changesets.
1551
1580
1552 Repository "heads" are changesets that don't have children
1581 Repository "heads" are changesets that don't have children
1553 changesets. They are where development generally takes place and
1582 changesets. They are where development generally takes place and
1554 are the usual targets for update and merge operations.
1583 are the usual targets for update and merge operations.
1555 """
1584 """
1556 if opts['rev']:
1585 if opts['rev']:
1557 heads = repo.heads(repo.lookup(opts['rev']))
1586 heads = repo.heads(repo.lookup(opts['rev']))
1558 else:
1587 else:
1559 heads = repo.heads()
1588 heads = repo.heads()
1560 br = None
1589 br = None
1561 if opts['branches']:
1590 if opts['branches']:
1562 br = repo.branchlookup(heads)
1591 br = repo.branchlookup(heads)
1563 displayer = show_changeset(ui, repo, opts)
1592 displayer = show_changeset(ui, repo, opts)
1564 for n in heads:
1593 for n in heads:
1565 displayer.show(changenode=n, brinfo=br)
1594 displayer.show(changenode=n, brinfo=br)
1566
1595
1567 def identify(ui, repo):
1596 def identify(ui, repo):
1568 """print information about the working copy
1597 """print information about the working copy
1569
1598
1570 Print a short summary of the current state of the repo.
1599 Print a short summary of the current state of the repo.
1571
1600
1572 This summary identifies the repository state using one or two parent
1601 This summary identifies the repository state using one or two parent
1573 hash identifiers, followed by a "+" if there are uncommitted changes
1602 hash identifiers, followed by a "+" if there are uncommitted changes
1574 in the working directory, followed by a list of tags for this revision.
1603 in the working directory, followed by a list of tags for this revision.
1575 """
1604 """
1576 parents = [p for p in repo.dirstate.parents() if p != nullid]
1605 parents = [p for p in repo.dirstate.parents() if p != nullid]
1577 if not parents:
1606 if not parents:
1578 ui.write(_("unknown\n"))
1607 ui.write(_("unknown\n"))
1579 return
1608 return
1580
1609
1581 hexfunc = ui.debugflag and hex or short
1610 hexfunc = ui.debugflag and hex or short
1582 modified, added, removed, deleted = repo.status()[:4]
1611 modified, added, removed, deleted = repo.status()[:4]
1583 output = ["%s%s" %
1612 output = ["%s%s" %
1584 ('+'.join([hexfunc(parent) for parent in parents]),
1613 ('+'.join([hexfunc(parent) for parent in parents]),
1585 (modified or added or removed or deleted) and "+" or "")]
1614 (modified or added or removed or deleted) and "+" or "")]
1586
1615
1587 if not ui.quiet:
1616 if not ui.quiet:
1588
1617
1589 branch = repo.workingctx().branch()
1618 branch = repo.workingctx().branch()
1590 if branch:
1619 if branch:
1591 output.append("(%s)" % branch)
1620 output.append("(%s)" % branch)
1592
1621
1593 # multiple tags for a single parent separated by '/'
1622 # multiple tags for a single parent separated by '/'
1594 parenttags = ['/'.join(tags)
1623 parenttags = ['/'.join(tags)
1595 for tags in map(repo.nodetags, parents) if tags]
1624 for tags in map(repo.nodetags, parents) if tags]
1596 # tags for multiple parents separated by ' + '
1625 # tags for multiple parents separated by ' + '
1597 if parenttags:
1626 if parenttags:
1598 output.append(' + '.join(parenttags))
1627 output.append(' + '.join(parenttags))
1599
1628
1600 ui.write("%s\n" % ' '.join(output))
1629 ui.write("%s\n" % ' '.join(output))
1601
1630
1602 def import_(ui, repo, patch1, *patches, **opts):
1631 def import_(ui, repo, patch1, *patches, **opts):
1603 """import an ordered set of patches
1632 """import an ordered set of patches
1604
1633
1605 Import a list of patches and commit them individually.
1634 Import a list of patches and commit them individually.
1606
1635
1607 If there are outstanding changes in the working directory, import
1636 If there are outstanding changes in the working directory, import
1608 will abort unless given the -f flag.
1637 will abort unless given the -f flag.
1609
1638
1610 You can import a patch straight from a mail message. Even patches
1639 You can import a patch straight from a mail message. Even patches
1611 as attachments work (body part must be type text/plain or
1640 as attachments work (body part must be type text/plain or
1612 text/x-patch to be used). From and Subject headers of email
1641 text/x-patch to be used). From and Subject headers of email
1613 message are used as default committer and commit message. All
1642 message are used as default committer and commit message. All
1614 text/plain body parts before first diff are added to commit
1643 text/plain body parts before first diff are added to commit
1615 message.
1644 message.
1616
1645
1617 If imported patch was generated by hg export, user and description
1646 If imported patch was generated by hg export, user and description
1618 from patch override values from message headers and body. Values
1647 from patch override values from message headers and body. Values
1619 given on command line with -m and -u override these.
1648 given on command line with -m and -u override these.
1620
1649
1621 To read a patch from standard input, use patch name "-".
1650 To read a patch from standard input, use patch name "-".
1622 """
1651 """
1623 patches = (patch1,) + patches
1652 patches = (patch1,) + patches
1624
1653
1625 if not opts['force']:
1654 if not opts['force']:
1626 bail_if_changed(repo)
1655 bail_if_changed(repo)
1627
1656
1628 d = opts["base"]
1657 d = opts["base"]
1629 strip = opts["strip"]
1658 strip = opts["strip"]
1630
1659
1631 wlock = repo.wlock()
1660 wlock = repo.wlock()
1632 lock = repo.lock()
1661 lock = repo.lock()
1633
1662
1634 for p in patches:
1663 for p in patches:
1635 pf = os.path.join(d, p)
1664 pf = os.path.join(d, p)
1636
1665
1637 if pf == '-':
1666 if pf == '-':
1638 ui.status(_("applying patch from stdin\n"))
1667 ui.status(_("applying patch from stdin\n"))
1639 tmpname, message, user, date = patch.extract(ui, sys.stdin)
1668 tmpname, message, user, date = patch.extract(ui, sys.stdin)
1640 else:
1669 else:
1641 ui.status(_("applying %s\n") % p)
1670 ui.status(_("applying %s\n") % p)
1642 tmpname, message, user, date = patch.extract(ui, file(pf))
1671 tmpname, message, user, date = patch.extract(ui, file(pf))
1643
1672
1644 if tmpname is None:
1673 if tmpname is None:
1645 raise util.Abort(_('no diffs found'))
1674 raise util.Abort(_('no diffs found'))
1646
1675
1647 try:
1676 try:
1648 if opts['message']:
1677 if opts['message']:
1649 # pickup the cmdline msg
1678 # pickup the cmdline msg
1650 message = opts['message']
1679 message = opts['message']
1651 elif message:
1680 elif message:
1652 # pickup the patch msg
1681 # pickup the patch msg
1653 message = message.strip()
1682 message = message.strip()
1654 else:
1683 else:
1655 # launch the editor
1684 # launch the editor
1656 message = None
1685 message = None
1657 ui.debug(_('message:\n%s\n') % message)
1686 ui.debug(_('message:\n%s\n') % message)
1658
1687
1659 files = {}
1688 files = {}
1660 try:
1689 try:
1661 fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1690 fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1662 files=files)
1691 files=files)
1663 finally:
1692 finally:
1664 files = patch.updatedir(ui, repo, files, wlock=wlock)
1693 files = patch.updatedir(ui, repo, files, wlock=wlock)
1665 repo.commit(files, message, user, date, wlock=wlock, lock=lock)
1694 repo.commit(files, message, user, date, wlock=wlock, lock=lock)
1666 finally:
1695 finally:
1667 os.unlink(tmpname)
1696 os.unlink(tmpname)
1668
1697
1669 def incoming(ui, repo, source="default", **opts):
1698 def incoming(ui, repo, source="default", **opts):
1670 """show new changesets found in source
1699 """show new changesets found in source
1671
1700
1672 Show new changesets found in the specified path/URL or the default
1701 Show new changesets found in the specified path/URL or the default
1673 pull location. These are the changesets that would be pulled if a pull
1702 pull location. These are the changesets that would be pulled if a pull
1674 was requested.
1703 was requested.
1675
1704
1676 For remote repository, using --bundle avoids downloading the changesets
1705 For remote repository, using --bundle avoids downloading the changesets
1677 twice if the incoming is followed by a pull.
1706 twice if the incoming is followed by a pull.
1678
1707
1679 See pull for valid source format details.
1708 See pull for valid source format details.
1680 """
1709 """
1681 source = ui.expandpath(source)
1710 source = ui.expandpath(source)
1682 setremoteconfig(ui, opts)
1711 setremoteconfig(ui, opts)
1683
1712
1684 other = hg.repository(ui, source)
1713 other = hg.repository(ui, source)
1685 incoming = repo.findincoming(other, force=opts["force"])
1714 incoming = repo.findincoming(other, force=opts["force"])
1686 if not incoming:
1715 if not incoming:
1687 ui.status(_("no changes found\n"))
1716 ui.status(_("no changes found\n"))
1688 return
1717 return
1689
1718
1690 cleanup = None
1719 cleanup = None
1691 try:
1720 try:
1692 fname = opts["bundle"]
1721 fname = opts["bundle"]
1693 if fname or not other.local():
1722 if fname or not other.local():
1694 # create a bundle (uncompressed if other repo is not local)
1723 # create a bundle (uncompressed if other repo is not local)
1695 cg = other.changegroup(incoming, "incoming")
1724 cg = other.changegroup(incoming, "incoming")
1696 fname = cleanup = write_bundle(cg, fname, compress=other.local())
1725 fname = cleanup = write_bundle(cg, fname, compress=other.local())
1697 # keep written bundle?
1726 # keep written bundle?
1698 if opts["bundle"]:
1727 if opts["bundle"]:
1699 cleanup = None
1728 cleanup = None
1700 if not other.local():
1729 if not other.local():
1701 # use the created uncompressed bundlerepo
1730 # use the created uncompressed bundlerepo
1702 other = bundlerepo.bundlerepository(ui, repo.root, fname)
1731 other = bundlerepo.bundlerepository(ui, repo.root, fname)
1703
1732
1704 revs = None
1733 revs = None
1705 if opts['rev']:
1734 if opts['rev']:
1706 revs = [other.lookup(rev) for rev in opts['rev']]
1735 revs = [other.lookup(rev) for rev in opts['rev']]
1707 o = other.changelog.nodesbetween(incoming, revs)[0]
1736 o = other.changelog.nodesbetween(incoming, revs)[0]
1708 if opts['newest_first']:
1737 if opts['newest_first']:
1709 o.reverse()
1738 o.reverse()
1710 displayer = show_changeset(ui, other, opts)
1739 displayer = show_changeset(ui, other, opts)
1711 for n in o:
1740 for n in o:
1712 parents = [p for p in other.changelog.parents(n) if p != nullid]
1741 parents = [p for p in other.changelog.parents(n) if p != nullid]
1713 if opts['no_merges'] and len(parents) == 2:
1742 if opts['no_merges'] and len(parents) == 2:
1714 continue
1743 continue
1715 displayer.show(changenode=n)
1744 displayer.show(changenode=n)
1716 if opts['patch']:
1745 if opts['patch']:
1717 prev = (parents and parents[0]) or nullid
1746 prev = (parents and parents[0]) or nullid
1718 patch.diff(other, prev, n, fp=repo.ui)
1747 patch.diff(other, prev, n, fp=repo.ui)
1719 ui.write("\n")
1748 ui.write("\n")
1720 finally:
1749 finally:
1721 if hasattr(other, 'close'):
1750 if hasattr(other, 'close'):
1722 other.close()
1751 other.close()
1723 if cleanup:
1752 if cleanup:
1724 os.unlink(cleanup)
1753 os.unlink(cleanup)
1725
1754
1726 def init(ui, dest=".", **opts):
1755 def init(ui, dest=".", **opts):
1727 """create a new repository in the given directory
1756 """create a new repository in the given directory
1728
1757
1729 Initialize a new repository in the given directory. If the given
1758 Initialize a new repository in the given directory. If the given
1730 directory does not exist, it is created.
1759 directory does not exist, it is created.
1731
1760
1732 If no directory is given, the current directory is used.
1761 If no directory is given, the current directory is used.
1733
1762
1734 It is possible to specify an ssh:// URL as the destination.
1763 It is possible to specify an ssh:// URL as the destination.
1735 Look at the help text for the pull command for important details
1764 Look at the help text for the pull command for important details
1736 about ssh:// URLs.
1765 about ssh:// URLs.
1737 """
1766 """
1738 setremoteconfig(ui, opts)
1767 setremoteconfig(ui, opts)
1739 hg.repository(ui, dest, create=1)
1768 hg.repository(ui, dest, create=1)
1740
1769
1741 def locate(ui, repo, *pats, **opts):
1770 def locate(ui, repo, *pats, **opts):
1742 """locate files matching specific patterns
1771 """locate files matching specific patterns
1743
1772
1744 Print all files under Mercurial control whose names match the
1773 Print all files under Mercurial control whose names match the
1745 given patterns.
1774 given patterns.
1746
1775
1747 This command searches the current directory and its
1776 This command searches the current directory and its
1748 subdirectories. To search an entire repository, move to the root
1777 subdirectories. To search an entire repository, move to the root
1749 of the repository.
1778 of the repository.
1750
1779
1751 If no patterns are given to match, this command prints all file
1780 If no patterns are given to match, this command prints all file
1752 names.
1781 names.
1753
1782
1754 If you want to feed the output of this command into the "xargs"
1783 If you want to feed the output of this command into the "xargs"
1755 command, use the "-0" option to both this command and "xargs".
1784 command, use the "-0" option to both this command and "xargs".
1756 This will avoid the problem of "xargs" treating single filenames
1785 This will avoid the problem of "xargs" treating single filenames
1757 that contain white space as multiple filenames.
1786 that contain white space as multiple filenames.
1758 """
1787 """
1759 end = opts['print0'] and '\0' or '\n'
1788 end = opts['print0'] and '\0' or '\n'
1760 rev = opts['rev']
1789 rev = opts['rev']
1761 if rev:
1790 if rev:
1762 node = repo.lookup(rev)
1791 node = repo.lookup(rev)
1763 else:
1792 else:
1764 node = None
1793 node = None
1765
1794
1766 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
1795 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
1767 head='(?:.*/|)'):
1796 head='(?:.*/|)'):
1768 if not node and repo.dirstate.state(abs) == '?':
1797 if not node and repo.dirstate.state(abs) == '?':
1769 continue
1798 continue
1770 if opts['fullpath']:
1799 if opts['fullpath']:
1771 ui.write(os.path.join(repo.root, abs), end)
1800 ui.write(os.path.join(repo.root, abs), end)
1772 else:
1801 else:
1773 ui.write(((pats and rel) or abs), end)
1802 ui.write(((pats and rel) or abs), end)
1774
1803
1775 def log(ui, repo, *pats, **opts):
1804 def log(ui, repo, *pats, **opts):
1776 """show revision history of entire repository or files
1805 """show revision history of entire repository or files
1777
1806
1778 Print the revision history of the specified files or the entire
1807 Print the revision history of the specified files or the entire
1779 project.
1808 project.
1780
1809
1781 File history is shown without following rename or copy history of
1810 File history is shown without following rename or copy history of
1782 files. Use -f/--follow with a file name to follow history across
1811 files. Use -f/--follow with a file name to follow history across
1783 renames and copies. --follow without a file name will only show
1812 renames and copies. --follow without a file name will only show
1784 ancestors or descendants of the starting revision. --follow-first
1813 ancestors or descendants of the starting revision. --follow-first
1785 only follows the first parent of merge revisions.
1814 only follows the first parent of merge revisions.
1786
1815
1787 If no revision range is specified, the default is tip:0 unless
1816 If no revision range is specified, the default is tip:0 unless
1788 --follow is set, in which case the working directory parent is
1817 --follow is set, in which case the working directory parent is
1789 used as the starting revision.
1818 used as the starting revision.
1790
1819
1791 By default this command outputs: changeset id and hash, tags,
1820 By default this command outputs: changeset id and hash, tags,
1792 non-trivial parents, user, date and time, and a summary for each
1821 non-trivial parents, user, date and time, and a summary for each
1793 commit. When the -v/--verbose switch is used, the list of changed
1822 commit. When the -v/--verbose switch is used, the list of changed
1794 files and full commit message is shown.
1823 files and full commit message is shown.
1795 """
1824 """
1796 class dui(object):
1825 class dui(object):
1797 # Implement and delegate some ui protocol. Save hunks of
1826 # Implement and delegate some ui protocol. Save hunks of
1798 # output for later display in the desired order.
1827 # output for later display in the desired order.
1799 def __init__(self, ui):
1828 def __init__(self, ui):
1800 self.ui = ui
1829 self.ui = ui
1801 self.hunk = {}
1830 self.hunk = {}
1802 self.header = {}
1831 self.header = {}
1803 def bump(self, rev):
1832 def bump(self, rev):
1804 self.rev = rev
1833 self.rev = rev
1805 self.hunk[rev] = []
1834 self.hunk[rev] = []
1806 self.header[rev] = []
1835 self.header[rev] = []
1807 def note(self, *args):
1836 def note(self, *args):
1808 if self.verbose:
1837 if self.verbose:
1809 self.write(*args)
1838 self.write(*args)
1810 def status(self, *args):
1839 def status(self, *args):
1811 if not self.quiet:
1840 if not self.quiet:
1812 self.write(*args)
1841 self.write(*args)
1813 def write(self, *args):
1842 def write(self, *args):
1814 self.hunk[self.rev].append(args)
1843 self.hunk[self.rev].append(args)
1815 def write_header(self, *args):
1844 def write_header(self, *args):
1816 self.header[self.rev].append(args)
1845 self.header[self.rev].append(args)
1817 def debug(self, *args):
1846 def debug(self, *args):
1818 if self.debugflag:
1847 if self.debugflag:
1819 self.write(*args)
1848 self.write(*args)
1820 def __getattr__(self, key):
1849 def __getattr__(self, key):
1821 return getattr(self.ui, key)
1850 return getattr(self.ui, key)
1822
1851
1823 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts)
1852 changeiter, getchange, matchfn = walkchangerevs(ui, repo, pats, opts)
1824
1853
1825 if opts['limit']:
1854 if opts['limit']:
1826 try:
1855 try:
1827 limit = int(opts['limit'])
1856 limit = int(opts['limit'])
1828 except ValueError:
1857 except ValueError:
1829 raise util.Abort(_('limit must be a positive integer'))
1858 raise util.Abort(_('limit must be a positive integer'))
1830 if limit <= 0: raise util.Abort(_('limit must be positive'))
1859 if limit <= 0: raise util.Abort(_('limit must be positive'))
1831 else:
1860 else:
1832 limit = sys.maxint
1861 limit = sys.maxint
1833 count = 0
1862 count = 0
1834
1863
1835 if opts['copies'] and opts['rev']:
1864 if opts['copies'] and opts['rev']:
1836 endrev = max([int(i)
1865 endrev = max([int(i)
1837 for i in cmdutil.revrange(ui, repo, opts['rev'])]) + 1
1866 for i in cmdutil.revrange(ui, repo, opts['rev'])]) + 1
1838 else:
1867 else:
1839 endrev = repo.changelog.count()
1868 endrev = repo.changelog.count()
1840 rcache = {}
1869 rcache = {}
1841 ncache = {}
1870 ncache = {}
1842 dcache = []
1871 dcache = []
1843 def getrenamed(fn, rev, man):
1872 def getrenamed(fn, rev, man):
1844 '''looks up all renames for a file (up to endrev) the first
1873 '''looks up all renames for a file (up to endrev) the first
1845 time the file is given. It indexes on the changerev and only
1874 time the file is given. It indexes on the changerev and only
1846 parses the manifest if linkrev != changerev.
1875 parses the manifest if linkrev != changerev.
1847 Returns rename info for fn at changerev rev.'''
1876 Returns rename info for fn at changerev rev.'''
1848 if fn not in rcache:
1877 if fn not in rcache:
1849 rcache[fn] = {}
1878 rcache[fn] = {}
1850 ncache[fn] = {}
1879 ncache[fn] = {}
1851 fl = repo.file(fn)
1880 fl = repo.file(fn)
1852 for i in xrange(fl.count()):
1881 for i in xrange(fl.count()):
1853 node = fl.node(i)
1882 node = fl.node(i)
1854 lr = fl.linkrev(node)
1883 lr = fl.linkrev(node)
1855 renamed = fl.renamed(node)
1884 renamed = fl.renamed(node)
1856 rcache[fn][lr] = renamed
1885 rcache[fn][lr] = renamed
1857 if renamed:
1886 if renamed:
1858 ncache[fn][node] = renamed
1887 ncache[fn][node] = renamed
1859 if lr >= endrev:
1888 if lr >= endrev:
1860 break
1889 break
1861 if rev in rcache[fn]:
1890 if rev in rcache[fn]:
1862 return rcache[fn][rev]
1891 return rcache[fn][rev]
1863 mr = repo.manifest.rev(man)
1892 mr = repo.manifest.rev(man)
1864 if repo.manifest.parentrevs(mr) != (mr - 1, -1):
1893 if repo.manifest.parentrevs(mr) != (mr - 1, -1):
1865 return ncache[fn].get(repo.manifest.find(man, fn)[0])
1894 return ncache[fn].get(repo.manifest.find(man, fn)[0])
1866 if not dcache or dcache[0] != man:
1895 if not dcache or dcache[0] != man:
1867 dcache[:] = [man, repo.manifest.readdelta(man)]
1896 dcache[:] = [man, repo.manifest.readdelta(man)]
1868 if fn in dcache[1]:
1897 if fn in dcache[1]:
1869 return ncache[fn].get(dcache[1][fn])
1898 return ncache[fn].get(dcache[1][fn])
1870 return None
1899 return None
1871
1900
1872 displayer = show_changeset(ui, repo, opts)
1901 displayer = show_changeset(ui, repo, opts)
1873 for st, rev, fns in changeiter:
1902 for st, rev, fns in changeiter:
1874 if st == 'window':
1903 if st == 'window':
1875 du = dui(ui)
1904 du = dui(ui)
1876 displayer.ui = du
1905 displayer.ui = du
1877 elif st == 'add':
1906 elif st == 'add':
1878 du.bump(rev)
1907 du.bump(rev)
1879 changenode = repo.changelog.node(rev)
1908 changenode = repo.changelog.node(rev)
1880 parents = [p for p in repo.changelog.parents(changenode)
1909 parents = [p for p in repo.changelog.parents(changenode)
1881 if p != nullid]
1910 if p != nullid]
1882 if opts['no_merges'] and len(parents) == 2:
1911 if opts['no_merges'] and len(parents) == 2:
1883 continue
1912 continue
1884 if opts['only_merges'] and len(parents) != 2:
1913 if opts['only_merges'] and len(parents) != 2:
1885 continue
1914 continue
1886
1915
1887 if opts['keyword']:
1916 if opts['keyword']:
1888 changes = getchange(rev)
1917 changes = getchange(rev)
1889 miss = 0
1918 miss = 0
1890 for k in [kw.lower() for kw in opts['keyword']]:
1919 for k in [kw.lower() for kw in opts['keyword']]:
1891 if not (k in changes[1].lower() or
1920 if not (k in changes[1].lower() or
1892 k in changes[4].lower() or
1921 k in changes[4].lower() or
1893 k in " ".join(changes[3][:20]).lower()):
1922 k in " ".join(changes[3][:20]).lower()):
1894 miss = 1
1923 miss = 1
1895 break
1924 break
1896 if miss:
1925 if miss:
1897 continue
1926 continue
1898
1927
1899 br = None
1928 br = None
1900 if opts['branches']:
1929 if opts['branches']:
1901 br = repo.branchlookup([repo.changelog.node(rev)])
1930 br = repo.branchlookup([repo.changelog.node(rev)])
1902
1931
1903 copies = []
1932 copies = []
1904 if opts.get('copies') and rev:
1933 if opts.get('copies') and rev:
1905 mf = getchange(rev)[0]
1934 mf = getchange(rev)[0]
1906 for fn in getchange(rev)[3]:
1935 for fn in getchange(rev)[3]:
1907 rename = getrenamed(fn, rev, mf)
1936 rename = getrenamed(fn, rev, mf)
1908 if rename:
1937 if rename:
1909 copies.append((fn, rename[0]))
1938 copies.append((fn, rename[0]))
1910 displayer.show(rev, brinfo=br, copies=copies)
1939 displayer.show(rev, brinfo=br, copies=copies)
1911 if opts['patch']:
1940 if opts['patch']:
1912 prev = (parents and parents[0]) or nullid
1941 prev = (parents and parents[0]) or nullid
1913 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
1942 patch.diff(repo, prev, changenode, match=matchfn, fp=du)
1914 du.write("\n\n")
1943 du.write("\n\n")
1915 elif st == 'iter':
1944 elif st == 'iter':
1916 if count == limit: break
1945 if count == limit: break
1917 if du.header[rev]:
1946 if du.header[rev]:
1918 for args in du.header[rev]:
1947 for args in du.header[rev]:
1919 ui.write_header(*args)
1948 ui.write_header(*args)
1920 if du.hunk[rev]:
1949 if du.hunk[rev]:
1921 count += 1
1950 count += 1
1922 for args in du.hunk[rev]:
1951 for args in du.hunk[rev]:
1923 ui.write(*args)
1952 ui.write(*args)
1924
1953
1925 def manifest(ui, repo, rev=None):
1954 def manifest(ui, repo, rev=None):
1926 """output the latest or given revision of the project manifest
1955 """output the latest or given revision of the project manifest
1927
1956
1928 Print a list of version controlled files for the given revision.
1957 Print a list of version controlled files for the given revision.
1929
1958
1930 The manifest is the list of files being version controlled. If no revision
1959 The manifest is the list of files being version controlled. If no revision
1931 is given then the tip is used.
1960 is given then the tip is used.
1932 """
1961 """
1933 if rev:
1962 if rev:
1934 try:
1963 try:
1935 # assume all revision numbers are for changesets
1964 # assume all revision numbers are for changesets
1936 n = repo.lookup(rev)
1965 n = repo.lookup(rev)
1937 change = repo.changelog.read(n)
1966 change = repo.changelog.read(n)
1938 n = change[0]
1967 n = change[0]
1939 except hg.RepoError:
1968 except hg.RepoError:
1940 n = repo.manifest.lookup(rev)
1969 n = repo.manifest.lookup(rev)
1941 else:
1970 else:
1942 n = repo.manifest.tip()
1971 n = repo.manifest.tip()
1943 m = repo.manifest.read(n)
1972 m = repo.manifest.read(n)
1944 files = m.keys()
1973 files = m.keys()
1945 files.sort()
1974 files.sort()
1946
1975
1947 for f in files:
1976 for f in files:
1948 ui.write("%40s %3s %s\n" % (hex(m[f]),
1977 ui.write("%40s %3s %s\n" % (hex(m[f]),
1949 m.execf(f) and "755" or "644", f))
1978 m.execf(f) and "755" or "644", f))
1950
1979
1951 def merge(ui, repo, node=None, force=None, branch=None):
1980 def merge(ui, repo, node=None, force=None, branch=None):
1952 """Merge working directory with another revision
1981 """Merge working directory with another revision
1953
1982
1954 Merge the contents of the current working directory and the
1983 Merge the contents of the current working directory and the
1955 requested revision. Files that changed between either parent are
1984 requested revision. Files that changed between either parent are
1956 marked as changed for the next commit and a commit must be
1985 marked as changed for the next commit and a commit must be
1957 performed before any further updates are allowed.
1986 performed before any further updates are allowed.
1958
1987
1959 If no revision is specified, the working directory's parent is a
1988 If no revision is specified, the working directory's parent is a
1960 head revision, and the repository contains exactly one other head,
1989 head revision, and the repository contains exactly one other head,
1961 the other head is merged with by default. Otherwise, an explicit
1990 the other head is merged with by default. Otherwise, an explicit
1962 revision to merge with must be provided.
1991 revision to merge with must be provided.
1963 """
1992 """
1964
1993
1965 if node or branch:
1994 if node or branch:
1966 node = _lookup(repo, node, branch)
1995 node = _lookup(repo, node, branch)
1967 else:
1996 else:
1968 heads = repo.heads()
1997 heads = repo.heads()
1969 if len(heads) > 2:
1998 if len(heads) > 2:
1970 raise util.Abort(_('repo has %d heads - '
1999 raise util.Abort(_('repo has %d heads - '
1971 'please merge with an explicit rev') %
2000 'please merge with an explicit rev') %
1972 len(heads))
2001 len(heads))
1973 if len(heads) == 1:
2002 if len(heads) == 1:
1974 raise util.Abort(_('there is nothing to merge - '
2003 raise util.Abort(_('there is nothing to merge - '
1975 'use "hg update" instead'))
2004 'use "hg update" instead'))
1976 parent = repo.dirstate.parents()[0]
2005 parent = repo.dirstate.parents()[0]
1977 if parent not in heads:
2006 if parent not in heads:
1978 raise util.Abort(_('working dir not at a head rev - '
2007 raise util.Abort(_('working dir not at a head rev - '
1979 'use "hg update" or merge with an explicit rev'))
2008 'use "hg update" or merge with an explicit rev'))
1980 node = parent == heads[0] and heads[-1] or heads[0]
2009 node = parent == heads[0] and heads[-1] or heads[0]
1981 return hg.merge(repo, node, force=force)
2010 return hg.merge(repo, node, force=force)
1982
2011
1983 def outgoing(ui, repo, dest=None, **opts):
2012 def outgoing(ui, repo, dest=None, **opts):
1984 """show changesets not found in destination
2013 """show changesets not found in destination
1985
2014
1986 Show changesets not found in the specified destination repository or
2015 Show changesets not found in the specified destination repository or
1987 the default push location. These are the changesets that would be pushed
2016 the default push location. These are the changesets that would be pushed
1988 if a push was requested.
2017 if a push was requested.
1989
2018
1990 See pull for valid destination format details.
2019 See pull for valid destination format details.
1991 """
2020 """
1992 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2021 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1993 setremoteconfig(ui, opts)
2022 setremoteconfig(ui, opts)
1994 revs = None
2023 revs = None
1995 if opts['rev']:
2024 if opts['rev']:
1996 revs = [repo.lookup(rev) for rev in opts['rev']]
2025 revs = [repo.lookup(rev) for rev in opts['rev']]
1997
2026
1998 other = hg.repository(ui, dest)
2027 other = hg.repository(ui, dest)
1999 o = repo.findoutgoing(other, force=opts['force'])
2028 o = repo.findoutgoing(other, force=opts['force'])
2000 if not o:
2029 if not o:
2001 ui.status(_("no changes found\n"))
2030 ui.status(_("no changes found\n"))
2002 return
2031 return
2003 o = repo.changelog.nodesbetween(o, revs)[0]
2032 o = repo.changelog.nodesbetween(o, revs)[0]
2004 if opts['newest_first']:
2033 if opts['newest_first']:
2005 o.reverse()
2034 o.reverse()
2006 displayer = show_changeset(ui, repo, opts)
2035 displayer = show_changeset(ui, repo, opts)
2007 for n in o:
2036 for n in o:
2008 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2037 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2009 if opts['no_merges'] and len(parents) == 2:
2038 if opts['no_merges'] and len(parents) == 2:
2010 continue
2039 continue
2011 displayer.show(changenode=n)
2040 displayer.show(changenode=n)
2012 if opts['patch']:
2041 if opts['patch']:
2013 prev = (parents and parents[0]) or nullid
2042 prev = (parents and parents[0]) or nullid
2014 patch.diff(repo, prev, n)
2043 patch.diff(repo, prev, n)
2015 ui.write("\n")
2044 ui.write("\n")
2016
2045
2017 def parents(ui, repo, file_=None, rev=None, branches=None, **opts):
2046 def parents(ui, repo, file_=None, rev=None, branches=None, **opts):
2018 """show the parents of the working dir or revision
2047 """show the parents of the working dir or revision
2019
2048
2020 Print the working directory's parent revisions.
2049 Print the working directory's parent revisions.
2021 """
2050 """
2022 # legacy
2051 # legacy
2023 if file_ and not rev:
2052 if file_ and not rev:
2024 try:
2053 try:
2025 rev = repo.lookup(file_)
2054 rev = repo.lookup(file_)
2026 file_ = None
2055 file_ = None
2027 except hg.RepoError:
2056 except hg.RepoError:
2028 pass
2057 pass
2029 else:
2058 else:
2030 ui.warn(_("'hg parent REV' is deprecated, "
2059 ui.warn(_("'hg parent REV' is deprecated, "
2031 "please use 'hg parents -r REV instead\n"))
2060 "please use 'hg parents -r REV instead\n"))
2032
2061
2033 if rev:
2062 if rev:
2034 if file_:
2063 if file_:
2035 ctx = repo.filectx(file_, changeid=rev)
2064 ctx = repo.filectx(file_, changeid=rev)
2036 else:
2065 else:
2037 ctx = repo.changectx(rev)
2066 ctx = repo.changectx(rev)
2038 p = [cp.node() for cp in ctx.parents()]
2067 p = [cp.node() for cp in ctx.parents()]
2039 else:
2068 else:
2040 p = repo.dirstate.parents()
2069 p = repo.dirstate.parents()
2041
2070
2042 br = None
2071 br = None
2043 if branches is not None:
2072 if branches is not None:
2044 br = repo.branchlookup(p)
2073 br = repo.branchlookup(p)
2045 displayer = show_changeset(ui, repo, opts)
2074 displayer = show_changeset(ui, repo, opts)
2046 for n in p:
2075 for n in p:
2047 if n != nullid:
2076 if n != nullid:
2048 displayer.show(changenode=n, brinfo=br)
2077 displayer.show(changenode=n, brinfo=br)
2049
2078
2050 def paths(ui, repo, search=None):
2079 def paths(ui, repo, search=None):
2051 """show definition of symbolic path names
2080 """show definition of symbolic path names
2052
2081
2053 Show definition of symbolic path name NAME. If no name is given, show
2082 Show definition of symbolic path name NAME. If no name is given, show
2054 definition of available names.
2083 definition of available names.
2055
2084
2056 Path names are defined in the [paths] section of /etc/mercurial/hgrc
2085 Path names are defined in the [paths] section of /etc/mercurial/hgrc
2057 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
2086 and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too.
2058 """
2087 """
2059 if search:
2088 if search:
2060 for name, path in ui.configitems("paths"):
2089 for name, path in ui.configitems("paths"):
2061 if name == search:
2090 if name == search:
2062 ui.write("%s\n" % path)
2091 ui.write("%s\n" % path)
2063 return
2092 return
2064 ui.warn(_("not found!\n"))
2093 ui.warn(_("not found!\n"))
2065 return 1
2094 return 1
2066 else:
2095 else:
2067 for name, path in ui.configitems("paths"):
2096 for name, path in ui.configitems("paths"):
2068 ui.write("%s = %s\n" % (name, path))
2097 ui.write("%s = %s\n" % (name, path))
2069
2098
2070 def postincoming(ui, repo, modheads, optupdate):
2099 def postincoming(ui, repo, modheads, optupdate):
2071 if modheads == 0:
2100 if modheads == 0:
2072 return
2101 return
2073 if optupdate:
2102 if optupdate:
2074 if modheads == 1:
2103 if modheads == 1:
2075 return hg.update(repo, repo.changelog.tip()) # update
2104 return hg.update(repo, repo.changelog.tip()) # update
2076 else:
2105 else:
2077 ui.status(_("not updating, since new heads added\n"))
2106 ui.status(_("not updating, since new heads added\n"))
2078 if modheads > 1:
2107 if modheads > 1:
2079 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2108 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2080 else:
2109 else:
2081 ui.status(_("(run 'hg update' to get a working copy)\n"))
2110 ui.status(_("(run 'hg update' to get a working copy)\n"))
2082
2111
2083 def pull(ui, repo, source="default", **opts):
2112 def pull(ui, repo, source="default", **opts):
2084 """pull changes from the specified source
2113 """pull changes from the specified source
2085
2114
2086 Pull changes from a remote repository to a local one.
2115 Pull changes from a remote repository to a local one.
2087
2116
2088 This finds all changes from the repository at the specified path
2117 This finds all changes from the repository at the specified path
2089 or URL and adds them to the local repository. By default, this
2118 or URL and adds them to the local repository. By default, this
2090 does not update the copy of the project in the working directory.
2119 does not update the copy of the project in the working directory.
2091
2120
2092 Valid URLs are of the form:
2121 Valid URLs are of the form:
2093
2122
2094 local/filesystem/path
2123 local/filesystem/path
2095 http://[user@]host[:port]/[path]
2124 http://[user@]host[:port]/[path]
2096 https://[user@]host[:port]/[path]
2125 https://[user@]host[:port]/[path]
2097 ssh://[user@]host[:port]/[path]
2126 ssh://[user@]host[:port]/[path]
2098
2127
2099 Some notes about using SSH with Mercurial:
2128 Some notes about using SSH with Mercurial:
2100 - SSH requires an accessible shell account on the destination machine
2129 - SSH requires an accessible shell account on the destination machine
2101 and a copy of hg in the remote path or specified with as remotecmd.
2130 and a copy of hg in the remote path or specified with as remotecmd.
2102 - path is relative to the remote user's home directory by default.
2131 - path is relative to the remote user's home directory by default.
2103 Use an extra slash at the start of a path to specify an absolute path:
2132 Use an extra slash at the start of a path to specify an absolute path:
2104 ssh://example.com//tmp/repository
2133 ssh://example.com//tmp/repository
2105 - Mercurial doesn't use its own compression via SSH; the right thing
2134 - Mercurial doesn't use its own compression via SSH; the right thing
2106 to do is to configure it in your ~/.ssh/config, e.g.:
2135 to do is to configure it in your ~/.ssh/config, e.g.:
2107 Host *.mylocalnetwork.example.com
2136 Host *.mylocalnetwork.example.com
2108 Compression no
2137 Compression no
2109 Host *
2138 Host *
2110 Compression yes
2139 Compression yes
2111 Alternatively specify "ssh -C" as your ssh command in your hgrc or
2140 Alternatively specify "ssh -C" as your ssh command in your hgrc or
2112 with the --ssh command line option.
2141 with the --ssh command line option.
2113 """
2142 """
2114 source = ui.expandpath(source)
2143 source = ui.expandpath(source)
2115 setremoteconfig(ui, opts)
2144 setremoteconfig(ui, opts)
2116
2145
2117 other = hg.repository(ui, source)
2146 other = hg.repository(ui, source)
2118 ui.status(_('pulling from %s\n') % (source))
2147 ui.status(_('pulling from %s\n') % (source))
2119 revs = None
2148 revs = None
2120 if opts['rev']:
2149 if opts['rev']:
2121 if 'lookup' in other.capabilities:
2150 if 'lookup' in other.capabilities:
2122 revs = [other.lookup(rev) for rev in opts['rev']]
2151 revs = [other.lookup(rev) for rev in opts['rev']]
2123 else:
2152 else:
2124 error = _("Other repository doesn't support revision lookup, so a rev cannot be specified.")
2153 error = _("Other repository doesn't support revision lookup, so a rev cannot be specified.")
2125 raise util.Abort(error)
2154 raise util.Abort(error)
2126 modheads = repo.pull(other, heads=revs, force=opts['force'])
2155 modheads = repo.pull(other, heads=revs, force=opts['force'])
2127 return postincoming(ui, repo, modheads, opts['update'])
2156 return postincoming(ui, repo, modheads, opts['update'])
2128
2157
2129 def push(ui, repo, dest=None, **opts):
2158 def push(ui, repo, dest=None, **opts):
2130 """push changes to the specified destination
2159 """push changes to the specified destination
2131
2160
2132 Push changes from the local repository to the given destination.
2161 Push changes from the local repository to the given destination.
2133
2162
2134 This is the symmetrical operation for pull. It helps to move
2163 This is the symmetrical operation for pull. It helps to move
2135 changes from the current repository to a different one. If the
2164 changes from the current repository to a different one. If the
2136 destination is local this is identical to a pull in that directory
2165 destination is local this is identical to a pull in that directory
2137 from the current one.
2166 from the current one.
2138
2167
2139 By default, push will refuse to run if it detects the result would
2168 By default, push will refuse to run if it detects the result would
2140 increase the number of remote heads. This generally indicates the
2169 increase the number of remote heads. This generally indicates the
2141 the client has forgotten to sync and merge before pushing.
2170 the client has forgotten to sync and merge before pushing.
2142
2171
2143 Valid URLs are of the form:
2172 Valid URLs are of the form:
2144
2173
2145 local/filesystem/path
2174 local/filesystem/path
2146 ssh://[user@]host[:port]/[path]
2175 ssh://[user@]host[:port]/[path]
2147
2176
2148 Look at the help text for the pull command for important details
2177 Look at the help text for the pull command for important details
2149 about ssh:// URLs.
2178 about ssh:// URLs.
2150
2179
2151 Pushing to http:// and https:// URLs is possible, too, if this
2180 Pushing to http:// and https:// URLs is possible, too, if this
2152 feature is enabled on the remote Mercurial server.
2181 feature is enabled on the remote Mercurial server.
2153 """
2182 """
2154 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2183 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2155 setremoteconfig(ui, opts)
2184 setremoteconfig(ui, opts)
2156
2185
2157 other = hg.repository(ui, dest)
2186 other = hg.repository(ui, dest)
2158 ui.status('pushing to %s\n' % (dest))
2187 ui.status('pushing to %s\n' % (dest))
2159 revs = None
2188 revs = None
2160 if opts['rev']:
2189 if opts['rev']:
2161 revs = [repo.lookup(rev) for rev in opts['rev']]
2190 revs = [repo.lookup(rev) for rev in opts['rev']]
2162 r = repo.push(other, opts['force'], revs=revs)
2191 r = repo.push(other, opts['force'], revs=revs)
2163 return r == 0
2192 return r == 0
2164
2193
2165 def rawcommit(ui, repo, *flist, **rc):
2194 def rawcommit(ui, repo, *flist, **rc):
2166 """raw commit interface (DEPRECATED)
2195 """raw commit interface (DEPRECATED)
2167
2196
2168 (DEPRECATED)
2197 (DEPRECATED)
2169 Lowlevel commit, for use in helper scripts.
2198 Lowlevel commit, for use in helper scripts.
2170
2199
2171 This command is not intended to be used by normal users, as it is
2200 This command is not intended to be used by normal users, as it is
2172 primarily useful for importing from other SCMs.
2201 primarily useful for importing from other SCMs.
2173
2202
2174 This command is now deprecated and will be removed in a future
2203 This command is now deprecated and will be removed in a future
2175 release, please use debugsetparents and commit instead.
2204 release, please use debugsetparents and commit instead.
2176 """
2205 """
2177
2206
2178 ui.warn(_("(the rawcommit command is deprecated)\n"))
2207 ui.warn(_("(the rawcommit command is deprecated)\n"))
2179
2208
2180 message = rc['message']
2209 message = rc['message']
2181 if not message and rc['logfile']:
2210 if not message and rc['logfile']:
2182 try:
2211 try:
2183 message = open(rc['logfile']).read()
2212 message = open(rc['logfile']).read()
2184 except IOError:
2213 except IOError:
2185 pass
2214 pass
2186 if not message and not rc['logfile']:
2215 if not message and not rc['logfile']:
2187 raise util.Abort(_("missing commit message"))
2216 raise util.Abort(_("missing commit message"))
2188
2217
2189 files = relpath(repo, list(flist))
2218 files = relpath(repo, list(flist))
2190 if rc['files']:
2219 if rc['files']:
2191 files += open(rc['files']).read().splitlines()
2220 files += open(rc['files']).read().splitlines()
2192
2221
2193 rc['parent'] = map(repo.lookup, rc['parent'])
2222 rc['parent'] = map(repo.lookup, rc['parent'])
2194
2223
2195 try:
2224 try:
2196 repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
2225 repo.rawcommit(files, message, rc['user'], rc['date'], *rc['parent'])
2197 except ValueError, inst:
2226 except ValueError, inst:
2198 raise util.Abort(str(inst))
2227 raise util.Abort(str(inst))
2199
2228
2200 def recover(ui, repo):
2229 def recover(ui, repo):
2201 """roll back an interrupted transaction
2230 """roll back an interrupted transaction
2202
2231
2203 Recover from an interrupted commit or pull.
2232 Recover from an interrupted commit or pull.
2204
2233
2205 This command tries to fix the repository status after an interrupted
2234 This command tries to fix the repository status after an interrupted
2206 operation. It should only be necessary when Mercurial suggests it.
2235 operation. It should only be necessary when Mercurial suggests it.
2207 """
2236 """
2208 if repo.recover():
2237 if repo.recover():
2209 return hg.verify(repo)
2238 return hg.verify(repo)
2210 return 1
2239 return 1
2211
2240
2212 def remove(ui, repo, *pats, **opts):
2241 def remove(ui, repo, *pats, **opts):
2213 """remove the specified files on the next commit
2242 """remove the specified files on the next commit
2214
2243
2215 Schedule the indicated files for removal from the repository.
2244 Schedule the indicated files for removal from the repository.
2216
2245
2217 This command schedules the files to be removed at the next commit.
2246 This command schedules the files to be removed at the next commit.
2218 This only removes files from the current branch, not from the
2247 This only removes files from the current branch, not from the
2219 entire project history. If the files still exist in the working
2248 entire project history. If the files still exist in the working
2220 directory, they will be deleted from it. If invoked with --after,
2249 directory, they will be deleted from it. If invoked with --after,
2221 files that have been manually deleted are marked as removed.
2250 files that have been manually deleted are marked as removed.
2222
2251
2223 Modified files and added files are not removed by default. To
2252 Modified files and added files are not removed by default. To
2224 remove them, use the -f/--force option.
2253 remove them, use the -f/--force option.
2225 """
2254 """
2226 names = []
2255 names = []
2227 if not opts['after'] and not pats:
2256 if not opts['after'] and not pats:
2228 raise util.Abort(_('no files specified'))
2257 raise util.Abort(_('no files specified'))
2229 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
2258 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
2230 exact = dict.fromkeys(files)
2259 exact = dict.fromkeys(files)
2231 mardu = map(dict.fromkeys, repo.status(files=files, match=matchfn))[:5]
2260 mardu = map(dict.fromkeys, repo.status(files=files, match=matchfn))[:5]
2232 modified, added, removed, deleted, unknown = mardu
2261 modified, added, removed, deleted, unknown = mardu
2233 remove, forget = [], []
2262 remove, forget = [], []
2234 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
2263 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts):
2235 reason = None
2264 reason = None
2236 if abs not in deleted and opts['after']:
2265 if abs not in deleted and opts['after']:
2237 reason = _('is still present')
2266 reason = _('is still present')
2238 elif abs in modified and not opts['force']:
2267 elif abs in modified and not opts['force']:
2239 reason = _('is modified (use -f to force removal)')
2268 reason = _('is modified (use -f to force removal)')
2240 elif abs in added:
2269 elif abs in added:
2241 if opts['force']:
2270 if opts['force']:
2242 forget.append(abs)
2271 forget.append(abs)
2243 continue
2272 continue
2244 reason = _('has been marked for add (use -f to force removal)')
2273 reason = _('has been marked for add (use -f to force removal)')
2245 elif abs in unknown:
2274 elif abs in unknown:
2246 reason = _('is not managed')
2275 reason = _('is not managed')
2247 elif abs in removed:
2276 elif abs in removed:
2248 continue
2277 continue
2249 if reason:
2278 if reason:
2250 if exact:
2279 if exact:
2251 ui.warn(_('not removing %s: file %s\n') % (rel, reason))
2280 ui.warn(_('not removing %s: file %s\n') % (rel, reason))
2252 else:
2281 else:
2253 if ui.verbose or not exact:
2282 if ui.verbose or not exact:
2254 ui.status(_('removing %s\n') % rel)
2283 ui.status(_('removing %s\n') % rel)
2255 remove.append(abs)
2284 remove.append(abs)
2256 repo.forget(forget)
2285 repo.forget(forget)
2257 repo.remove(remove, unlink=not opts['after'])
2286 repo.remove(remove, unlink=not opts['after'])
2258
2287
2259 def rename(ui, repo, *pats, **opts):
2288 def rename(ui, repo, *pats, **opts):
2260 """rename files; equivalent of copy + remove
2289 """rename files; equivalent of copy + remove
2261
2290
2262 Mark dest as copies of sources; mark sources for deletion. If
2291 Mark dest as copies of sources; mark sources for deletion. If
2263 dest is a directory, copies are put in that directory. If dest is
2292 dest is a directory, copies are put in that directory. If dest is
2264 a file, there can only be one source.
2293 a file, there can only be one source.
2265
2294
2266 By default, this command copies the contents of files as they
2295 By default, this command copies the contents of files as they
2267 stand in the working directory. If invoked with --after, the
2296 stand in the working directory. If invoked with --after, the
2268 operation is recorded, but no copying is performed.
2297 operation is recorded, but no copying is performed.
2269
2298
2270 This command takes effect in the next commit.
2299 This command takes effect in the next commit.
2271
2300
2272 NOTE: This command should be treated as experimental. While it
2301 NOTE: This command should be treated as experimental. While it
2273 should properly record rename files, this information is not yet
2302 should properly record rename files, this information is not yet
2274 fully used by merge, nor fully reported by log.
2303 fully used by merge, nor fully reported by log.
2275 """
2304 """
2276 wlock = repo.wlock(0)
2305 wlock = repo.wlock(0)
2277 errs, copied = docopy(ui, repo, pats, opts, wlock)
2306 errs, copied = docopy(ui, repo, pats, opts, wlock)
2278 names = []
2307 names = []
2279 for abs, rel, exact in copied:
2308 for abs, rel, exact in copied:
2280 if ui.verbose or not exact:
2309 if ui.verbose or not exact:
2281 ui.status(_('removing %s\n') % rel)
2310 ui.status(_('removing %s\n') % rel)
2282 names.append(abs)
2311 names.append(abs)
2283 if not opts.get('dry_run'):
2312 if not opts.get('dry_run'):
2284 repo.remove(names, True, wlock)
2313 repo.remove(names, True, wlock)
2285 return errs
2314 return errs
2286
2315
2287 def revert(ui, repo, *pats, **opts):
2316 def revert(ui, repo, *pats, **opts):
2288 """revert files or dirs to their states as of some revision
2317 """revert files or dirs to their states as of some revision
2289
2318
2290 With no revision specified, revert the named files or directories
2319 With no revision specified, revert the named files or directories
2291 to the contents they had in the parent of the working directory.
2320 to the contents they had in the parent of the working directory.
2292 This restores the contents of the affected files to an unmodified
2321 This restores the contents of the affected files to an unmodified
2293 state. If the working directory has two parents, you must
2322 state. If the working directory has two parents, you must
2294 explicitly specify the revision to revert to.
2323 explicitly specify the revision to revert to.
2295
2324
2296 Modified files are saved with a .orig suffix before reverting.
2325 Modified files are saved with a .orig suffix before reverting.
2297 To disable these backups, use --no-backup.
2326 To disable these backups, use --no-backup.
2298
2327
2299 Using the -r option, revert the given files or directories to their
2328 Using the -r option, revert the given files or directories to their
2300 contents as of a specific revision. This can be helpful to "roll
2329 contents as of a specific revision. This can be helpful to "roll
2301 back" some or all of a change that should not have been committed.
2330 back" some or all of a change that should not have been committed.
2302
2331
2303 Revert modifies the working directory. It does not commit any
2332 Revert modifies the working directory. It does not commit any
2304 changes, or change the parent of the working directory. If you
2333 changes, or change the parent of the working directory. If you
2305 revert to a revision other than the parent of the working
2334 revert to a revision other than the parent of the working
2306 directory, the reverted files will thus appear modified
2335 directory, the reverted files will thus appear modified
2307 afterwards.
2336 afterwards.
2308
2337
2309 If a file has been deleted, it is recreated. If the executable
2338 If a file has been deleted, it is recreated. If the executable
2310 mode of a file was changed, it is reset.
2339 mode of a file was changed, it is reset.
2311
2340
2312 If names are given, all files matching the names are reverted.
2341 If names are given, all files matching the names are reverted.
2313
2342
2314 If no arguments are given, no files are reverted.
2343 If no arguments are given, no files are reverted.
2315 """
2344 """
2316
2345
2317 if not pats and not opts['all']:
2346 if not pats and not opts['all']:
2318 raise util.Abort(_('no files or directories specified; '
2347 raise util.Abort(_('no files or directories specified; '
2319 'use --all to revert the whole repo'))
2348 'use --all to revert the whole repo'))
2320
2349
2321 parent, p2 = repo.dirstate.parents()
2350 parent, p2 = repo.dirstate.parents()
2322 if not opts['rev'] and p2 != nullid:
2351 if not opts['rev'] and p2 != nullid:
2323 raise util.Abort(_('uncommitted merge - please provide a '
2352 raise util.Abort(_('uncommitted merge - please provide a '
2324 'specific revision'))
2353 'specific revision'))
2325 node = repo.changectx(opts['rev']).node()
2354 node = repo.changectx(opts['rev']).node()
2326 mf = repo.manifest.read(repo.changelog.read(node)[0])
2355 mf = repo.manifest.read(repo.changelog.read(node)[0])
2327 if node == parent:
2356 if node == parent:
2328 pmf = mf
2357 pmf = mf
2329 else:
2358 else:
2330 pmf = None
2359 pmf = None
2331
2360
2332 wlock = repo.wlock()
2361 wlock = repo.wlock()
2333
2362
2334 # need all matching names in dirstate and manifest of target rev,
2363 # need all matching names in dirstate and manifest of target rev,
2335 # so have to walk both. do not print errors if files exist in one
2364 # so have to walk both. do not print errors if files exist in one
2336 # but not other.
2365 # but not other.
2337
2366
2338 names = {}
2367 names = {}
2339 target_only = {}
2368 target_only = {}
2340
2369
2341 # walk dirstate.
2370 # walk dirstate.
2342
2371
2343 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
2372 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
2344 badmatch=mf.has_key):
2373 badmatch=mf.has_key):
2345 names[abs] = (rel, exact)
2374 names[abs] = (rel, exact)
2346 if src == 'b':
2375 if src == 'b':
2347 target_only[abs] = True
2376 target_only[abs] = True
2348
2377
2349 # walk target manifest.
2378 # walk target manifest.
2350
2379
2351 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
2380 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
2352 badmatch=names.has_key):
2381 badmatch=names.has_key):
2353 if abs in names: continue
2382 if abs in names: continue
2354 names[abs] = (rel, exact)
2383 names[abs] = (rel, exact)
2355 target_only[abs] = True
2384 target_only[abs] = True
2356
2385
2357 changes = repo.status(match=names.has_key, wlock=wlock)[:5]
2386 changes = repo.status(match=names.has_key, wlock=wlock)[:5]
2358 modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
2387 modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
2359
2388
2360 revert = ([], _('reverting %s\n'))
2389 revert = ([], _('reverting %s\n'))
2361 add = ([], _('adding %s\n'))
2390 add = ([], _('adding %s\n'))
2362 remove = ([], _('removing %s\n'))
2391 remove = ([], _('removing %s\n'))
2363 forget = ([], _('forgetting %s\n'))
2392 forget = ([], _('forgetting %s\n'))
2364 undelete = ([], _('undeleting %s\n'))
2393 undelete = ([], _('undeleting %s\n'))
2365 update = {}
2394 update = {}
2366
2395
2367 disptable = (
2396 disptable = (
2368 # dispatch table:
2397 # dispatch table:
2369 # file state
2398 # file state
2370 # action if in target manifest
2399 # action if in target manifest
2371 # action if not in target manifest
2400 # action if not in target manifest
2372 # make backup if in target manifest
2401 # make backup if in target manifest
2373 # make backup if not in target manifest
2402 # make backup if not in target manifest
2374 (modified, revert, remove, True, True),
2403 (modified, revert, remove, True, True),
2375 (added, revert, forget, True, False),
2404 (added, revert, forget, True, False),
2376 (removed, undelete, None, False, False),
2405 (removed, undelete, None, False, False),
2377 (deleted, revert, remove, False, False),
2406 (deleted, revert, remove, False, False),
2378 (unknown, add, None, True, False),
2407 (unknown, add, None, True, False),
2379 (target_only, add, None, False, False),
2408 (target_only, add, None, False, False),
2380 )
2409 )
2381
2410
2382 entries = names.items()
2411 entries = names.items()
2383 entries.sort()
2412 entries.sort()
2384
2413
2385 for abs, (rel, exact) in entries:
2414 for abs, (rel, exact) in entries:
2386 mfentry = mf.get(abs)
2415 mfentry = mf.get(abs)
2387 def handle(xlist, dobackup):
2416 def handle(xlist, dobackup):
2388 xlist[0].append(abs)
2417 xlist[0].append(abs)
2389 update[abs] = 1
2418 update[abs] = 1
2390 if dobackup and not opts['no_backup'] and os.path.exists(rel):
2419 if dobackup and not opts['no_backup'] and os.path.exists(rel):
2391 bakname = "%s.orig" % rel
2420 bakname = "%s.orig" % rel
2392 ui.note(_('saving current version of %s as %s\n') %
2421 ui.note(_('saving current version of %s as %s\n') %
2393 (rel, bakname))
2422 (rel, bakname))
2394 if not opts.get('dry_run'):
2423 if not opts.get('dry_run'):
2395 shutil.copyfile(rel, bakname)
2424 shutil.copyfile(rel, bakname)
2396 shutil.copymode(rel, bakname)
2425 shutil.copymode(rel, bakname)
2397 if ui.verbose or not exact:
2426 if ui.verbose or not exact:
2398 ui.status(xlist[1] % rel)
2427 ui.status(xlist[1] % rel)
2399 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2428 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2400 if abs not in table: continue
2429 if abs not in table: continue
2401 # file has changed in dirstate
2430 # file has changed in dirstate
2402 if mfentry:
2431 if mfentry:
2403 handle(hitlist, backuphit)
2432 handle(hitlist, backuphit)
2404 elif misslist is not None:
2433 elif misslist is not None:
2405 handle(misslist, backupmiss)
2434 handle(misslist, backupmiss)
2406 else:
2435 else:
2407 if exact: ui.warn(_('file not managed: %s\n' % rel))
2436 if exact: ui.warn(_('file not managed: %s\n' % rel))
2408 break
2437 break
2409 else:
2438 else:
2410 # file has not changed in dirstate
2439 # file has not changed in dirstate
2411 if node == parent:
2440 if node == parent:
2412 if exact: ui.warn(_('no changes needed to %s\n' % rel))
2441 if exact: ui.warn(_('no changes needed to %s\n' % rel))
2413 continue
2442 continue
2414 if pmf is None:
2443 if pmf is None:
2415 # only need parent manifest in this unlikely case,
2444 # only need parent manifest in this unlikely case,
2416 # so do not read by default
2445 # so do not read by default
2417 pmf = repo.manifest.read(repo.changelog.read(parent)[0])
2446 pmf = repo.manifest.read(repo.changelog.read(parent)[0])
2418 if abs in pmf:
2447 if abs in pmf:
2419 if mfentry:
2448 if mfentry:
2420 # if version of file is same in parent and target
2449 # if version of file is same in parent and target
2421 # manifests, do nothing
2450 # manifests, do nothing
2422 if pmf[abs] != mfentry:
2451 if pmf[abs] != mfentry:
2423 handle(revert, False)
2452 handle(revert, False)
2424 else:
2453 else:
2425 handle(remove, False)
2454 handle(remove, False)
2426
2455
2427 if not opts.get('dry_run'):
2456 if not opts.get('dry_run'):
2428 repo.dirstate.forget(forget[0])
2457 repo.dirstate.forget(forget[0])
2429 r = hg.revert(repo, node, update.has_key, wlock)
2458 r = hg.revert(repo, node, update.has_key, wlock)
2430 repo.dirstate.update(add[0], 'a')
2459 repo.dirstate.update(add[0], 'a')
2431 repo.dirstate.update(undelete[0], 'n')
2460 repo.dirstate.update(undelete[0], 'n')
2432 repo.dirstate.update(remove[0], 'r')
2461 repo.dirstate.update(remove[0], 'r')
2433 return r
2462 return r
2434
2463
2435 def rollback(ui, repo):
2464 def rollback(ui, repo):
2436 """roll back the last transaction in this repository
2465 """roll back the last transaction in this repository
2437
2466
2438 Roll back the last transaction in this repository, restoring the
2467 Roll back the last transaction in this repository, restoring the
2439 project to its state prior to the transaction.
2468 project to its state prior to the transaction.
2440
2469
2441 Transactions are used to encapsulate the effects of all commands
2470 Transactions are used to encapsulate the effects of all commands
2442 that create new changesets or propagate existing changesets into a
2471 that create new changesets or propagate existing changesets into a
2443 repository. For example, the following commands are transactional,
2472 repository. For example, the following commands are transactional,
2444 and their effects can be rolled back:
2473 and their effects can be rolled back:
2445
2474
2446 commit
2475 commit
2447 import
2476 import
2448 pull
2477 pull
2449 push (with this repository as destination)
2478 push (with this repository as destination)
2450 unbundle
2479 unbundle
2451
2480
2452 This command should be used with care. There is only one level of
2481 This command should be used with care. There is only one level of
2453 rollback, and there is no way to undo a rollback.
2482 rollback, and there is no way to undo a rollback.
2454
2483
2455 This command is not intended for use on public repositories. Once
2484 This command is not intended for use on public repositories. Once
2456 changes are visible for pull by other users, rolling a transaction
2485 changes are visible for pull by other users, rolling a transaction
2457 back locally is ineffective (someone else may already have pulled
2486 back locally is ineffective (someone else may already have pulled
2458 the changes). Furthermore, a race is possible with readers of the
2487 the changes). Furthermore, a race is possible with readers of the
2459 repository; for example an in-progress pull from the repository
2488 repository; for example an in-progress pull from the repository
2460 may fail if a rollback is performed.
2489 may fail if a rollback is performed.
2461 """
2490 """
2462 repo.rollback()
2491 repo.rollback()
2463
2492
2464 def root(ui, repo):
2493 def root(ui, repo):
2465 """print the root (top) of the current working dir
2494 """print the root (top) of the current working dir
2466
2495
2467 Print the root directory of the current repository.
2496 Print the root directory of the current repository.
2468 """
2497 """
2469 ui.write(repo.root + "\n")
2498 ui.write(repo.root + "\n")
2470
2499
2471 def serve(ui, repo, **opts):
2500 def serve(ui, repo, **opts):
2472 """export the repository via HTTP
2501 """export the repository via HTTP
2473
2502
2474 Start a local HTTP repository browser and pull server.
2503 Start a local HTTP repository browser and pull server.
2475
2504
2476 By default, the server logs accesses to stdout and errors to
2505 By default, the server logs accesses to stdout and errors to
2477 stderr. Use the "-A" and "-E" options to log to files.
2506 stderr. Use the "-A" and "-E" options to log to files.
2478 """
2507 """
2479
2508
2480 if opts["stdio"]:
2509 if opts["stdio"]:
2481 if repo is None:
2510 if repo is None:
2482 raise hg.RepoError(_("There is no Mercurial repository here"
2511 raise hg.RepoError(_("There is no Mercurial repository here"
2483 " (.hg not found)"))
2512 " (.hg not found)"))
2484 s = sshserver.sshserver(ui, repo)
2513 s = sshserver.sshserver(ui, repo)
2485 s.serve_forever()
2514 s.serve_forever()
2486
2515
2487 optlist = ("name templates style address port ipv6"
2516 optlist = ("name templates style address port ipv6"
2488 " accesslog errorlog webdir_conf")
2517 " accesslog errorlog webdir_conf")
2489 for o in optlist.split():
2518 for o in optlist.split():
2490 if opts[o]:
2519 if opts[o]:
2491 ui.setconfig("web", o, str(opts[o]))
2520 ui.setconfig("web", o, str(opts[o]))
2492
2521
2493 if repo is None and not ui.config("web", "webdir_conf"):
2522 if repo is None and not ui.config("web", "webdir_conf"):
2494 raise hg.RepoError(_("There is no Mercurial repository here"
2523 raise hg.RepoError(_("There is no Mercurial repository here"
2495 " (.hg not found)"))
2524 " (.hg not found)"))
2496
2525
2497 if opts['daemon'] and not opts['daemon_pipefds']:
2526 if opts['daemon'] and not opts['daemon_pipefds']:
2498 rfd, wfd = os.pipe()
2527 rfd, wfd = os.pipe()
2499 args = sys.argv[:]
2528 args = sys.argv[:]
2500 args.append('--daemon-pipefds=%d,%d' % (rfd, wfd))
2529 args.append('--daemon-pipefds=%d,%d' % (rfd, wfd))
2501 pid = os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0),
2530 pid = os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0),
2502 args[0], args)
2531 args[0], args)
2503 os.close(wfd)
2532 os.close(wfd)
2504 os.read(rfd, 1)
2533 os.read(rfd, 1)
2505 os._exit(0)
2534 os._exit(0)
2506
2535
2507 try:
2536 try:
2508 httpd = hgweb.server.create_server(ui, repo)
2537 httpd = hgweb.server.create_server(ui, repo)
2509 except socket.error, inst:
2538 except socket.error, inst:
2510 raise util.Abort(_('cannot start server: %s') % inst.args[1])
2539 raise util.Abort(_('cannot start server: %s') % inst.args[1])
2511
2540
2512 if ui.verbose:
2541 if ui.verbose:
2513 addr, port = httpd.socket.getsockname()
2542 addr, port = httpd.socket.getsockname()
2514 if addr == '0.0.0.0':
2543 if addr == '0.0.0.0':
2515 addr = socket.gethostname()
2544 addr = socket.gethostname()
2516 else:
2545 else:
2517 try:
2546 try:
2518 addr = socket.gethostbyaddr(addr)[0]
2547 addr = socket.gethostbyaddr(addr)[0]
2519 except socket.error:
2548 except socket.error:
2520 pass
2549 pass
2521 if port != 80:
2550 if port != 80:
2522 ui.status(_('listening at http://%s:%d/\n') % (addr, port))
2551 ui.status(_('listening at http://%s:%d/\n') % (addr, port))
2523 else:
2552 else:
2524 ui.status(_('listening at http://%s/\n') % addr)
2553 ui.status(_('listening at http://%s/\n') % addr)
2525
2554
2526 if opts['pid_file']:
2555 if opts['pid_file']:
2527 fp = open(opts['pid_file'], 'w')
2556 fp = open(opts['pid_file'], 'w')
2528 fp.write(str(os.getpid()) + '\n')
2557 fp.write(str(os.getpid()) + '\n')
2529 fp.close()
2558 fp.close()
2530
2559
2531 if opts['daemon_pipefds']:
2560 if opts['daemon_pipefds']:
2532 rfd, wfd = [int(x) for x in opts['daemon_pipefds'].split(',')]
2561 rfd, wfd = [int(x) for x in opts['daemon_pipefds'].split(',')]
2533 os.close(rfd)
2562 os.close(rfd)
2534 os.write(wfd, 'y')
2563 os.write(wfd, 'y')
2535 os.close(wfd)
2564 os.close(wfd)
2536 sys.stdout.flush()
2565 sys.stdout.flush()
2537 sys.stderr.flush()
2566 sys.stderr.flush()
2538 fd = os.open(util.nulldev, os.O_RDWR)
2567 fd = os.open(util.nulldev, os.O_RDWR)
2539 if fd != 0: os.dup2(fd, 0)
2568 if fd != 0: os.dup2(fd, 0)
2540 if fd != 1: os.dup2(fd, 1)
2569 if fd != 1: os.dup2(fd, 1)
2541 if fd != 2: os.dup2(fd, 2)
2570 if fd != 2: os.dup2(fd, 2)
2542 if fd not in (0, 1, 2): os.close(fd)
2571 if fd not in (0, 1, 2): os.close(fd)
2543
2572
2544 httpd.serve_forever()
2573 httpd.serve_forever()
2545
2574
2546 def status(ui, repo, *pats, **opts):
2575 def status(ui, repo, *pats, **opts):
2547 """show changed files in the working directory
2576 """show changed files in the working directory
2548
2577
2549 Show status of files in the repository. If names are given, only
2578 Show status of files in the repository. If names are given, only
2550 files that match are shown. Files that are clean or ignored, are
2579 files that match are shown. Files that are clean or ignored, are
2551 not listed unless -c (clean), -i (ignored) or -A is given.
2580 not listed unless -c (clean), -i (ignored) or -A is given.
2552
2581
2553 If one revision is given, it is used as the base revision.
2582 If one revision is given, it is used as the base revision.
2554 If two revisions are given, the difference between them is shown.
2583 If two revisions are given, the difference between them is shown.
2555
2584
2556 The codes used to show the status of files are:
2585 The codes used to show the status of files are:
2557 M = modified
2586 M = modified
2558 A = added
2587 A = added
2559 R = removed
2588 R = removed
2560 C = clean
2589 C = clean
2561 ! = deleted, but still tracked
2590 ! = deleted, but still tracked
2562 ? = not tracked
2591 ? = not tracked
2563 I = ignored (not shown by default)
2592 I = ignored (not shown by default)
2564 = the previous added file was copied from here
2593 = the previous added file was copied from here
2565 """
2594 """
2566
2595
2567 all = opts['all']
2596 all = opts['all']
2568 node1, node2 = cmdutil.revpair(ui, repo, opts.get('rev'))
2597 node1, node2 = cmdutil.revpair(ui, repo, opts.get('rev'))
2569
2598
2570 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
2599 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
2571 cwd = (pats and repo.getcwd()) or ''
2600 cwd = (pats and repo.getcwd()) or ''
2572 modified, added, removed, deleted, unknown, ignored, clean = [
2601 modified, added, removed, deleted, unknown, ignored, clean = [
2573 [util.pathto(cwd, x) for x in n]
2602 [util.pathto(cwd, x) for x in n]
2574 for n in repo.status(node1=node1, node2=node2, files=files,
2603 for n in repo.status(node1=node1, node2=node2, files=files,
2575 match=matchfn,
2604 match=matchfn,
2576 list_ignored=all or opts['ignored'],
2605 list_ignored=all or opts['ignored'],
2577 list_clean=all or opts['clean'])]
2606 list_clean=all or opts['clean'])]
2578
2607
2579 changetypes = (('modified', 'M', modified),
2608 changetypes = (('modified', 'M', modified),
2580 ('added', 'A', added),
2609 ('added', 'A', added),
2581 ('removed', 'R', removed),
2610 ('removed', 'R', removed),
2582 ('deleted', '!', deleted),
2611 ('deleted', '!', deleted),
2583 ('unknown', '?', unknown),
2612 ('unknown', '?', unknown),
2584 ('ignored', 'I', ignored))
2613 ('ignored', 'I', ignored))
2585
2614
2586 explicit_changetypes = changetypes + (('clean', 'C', clean),)
2615 explicit_changetypes = changetypes + (('clean', 'C', clean),)
2587
2616
2588 end = opts['print0'] and '\0' or '\n'
2617 end = opts['print0'] and '\0' or '\n'
2589
2618
2590 for opt, char, changes in ([ct for ct in explicit_changetypes
2619 for opt, char, changes in ([ct for ct in explicit_changetypes
2591 if all or opts[ct[0]]]
2620 if all or opts[ct[0]]]
2592 or changetypes):
2621 or changetypes):
2593 if opts['no_status']:
2622 if opts['no_status']:
2594 format = "%%s%s" % end
2623 format = "%%s%s" % end
2595 else:
2624 else:
2596 format = "%s %%s%s" % (char, end)
2625 format = "%s %%s%s" % (char, end)
2597
2626
2598 for f in changes:
2627 for f in changes:
2599 ui.write(format % f)
2628 ui.write(format % f)
2600 if ((all or opts.get('copies')) and not opts.get('no_status')):
2629 if ((all or opts.get('copies')) and not opts.get('no_status')):
2601 copied = repo.dirstate.copied(f)
2630 copied = repo.dirstate.copied(f)
2602 if copied:
2631 if copied:
2603 ui.write(' %s%s' % (copied, end))
2632 ui.write(' %s%s' % (copied, end))
2604
2633
2605 def tag(ui, repo, name, rev_=None, **opts):
2634 def tag(ui, repo, name, rev_=None, **opts):
2606 """add a tag for the current tip or a given revision
2635 """add a tag for the current tip or a given revision
2607
2636
2608 Name a particular revision using <name>.
2637 Name a particular revision using <name>.
2609
2638
2610 Tags are used to name particular revisions of the repository and are
2639 Tags are used to name particular revisions of the repository and are
2611 very useful to compare different revision, to go back to significant
2640 very useful to compare different revision, to go back to significant
2612 earlier versions or to mark branch points as releases, etc.
2641 earlier versions or to mark branch points as releases, etc.
2613
2642
2614 If no revision is given, the parent of the working directory is used.
2643 If no revision is given, the parent of the working directory is used.
2615
2644
2616 To facilitate version control, distribution, and merging of tags,
2645 To facilitate version control, distribution, and merging of tags,
2617 they are stored as a file named ".hgtags" which is managed
2646 they are stored as a file named ".hgtags" which is managed
2618 similarly to other project files and can be hand-edited if
2647 similarly to other project files and can be hand-edited if
2619 necessary. The file '.hg/localtags' is used for local tags (not
2648 necessary. The file '.hg/localtags' is used for local tags (not
2620 shared among repositories).
2649 shared among repositories).
2621 """
2650 """
2622 if name in ['tip', '.']:
2651 if name in ['tip', '.']:
2623 raise util.Abort(_("the name '%s' is reserved") % name)
2652 raise util.Abort(_("the name '%s' is reserved") % name)
2624 if rev_ is not None:
2653 if rev_ is not None:
2625 ui.warn(_("use of 'hg tag NAME [REV]' is deprecated, "
2654 ui.warn(_("use of 'hg tag NAME [REV]' is deprecated, "
2626 "please use 'hg tag [-r REV] NAME' instead\n"))
2655 "please use 'hg tag [-r REV] NAME' instead\n"))
2627 if opts['rev']:
2656 if opts['rev']:
2628 raise util.Abort(_("use only one form to specify the revision"))
2657 raise util.Abort(_("use only one form to specify the revision"))
2629 if opts['rev']:
2658 if opts['rev']:
2630 rev_ = opts['rev']
2659 rev_ = opts['rev']
2631 if not rev_ and repo.dirstate.parents()[1] != nullid:
2660 if not rev_ and repo.dirstate.parents()[1] != nullid:
2632 raise util.Abort(_('uncommitted merge - please provide a '
2661 raise util.Abort(_('uncommitted merge - please provide a '
2633 'specific revision'))
2662 'specific revision'))
2634 r = repo.changectx(rev_).node()
2663 r = repo.changectx(rev_).node()
2635
2664
2636 message = opts['message']
2665 message = opts['message']
2637 if not message:
2666 if not message:
2638 message = _('Added tag %s for changeset %s') % (name, short(r))
2667 message = _('Added tag %s for changeset %s') % (name, short(r))
2639
2668
2640 repo.tag(name, r, message, opts['local'], opts['user'], opts['date'])
2669 repo.tag(name, r, message, opts['local'], opts['user'], opts['date'])
2641
2670
2642 def tags(ui, repo):
2671 def tags(ui, repo):
2643 """list repository tags
2672 """list repository tags
2644
2673
2645 List the repository tags.
2674 List the repository tags.
2646
2675
2647 This lists both regular and local tags.
2676 This lists both regular and local tags.
2648 """
2677 """
2649
2678
2650 l = repo.tagslist()
2679 l = repo.tagslist()
2651 l.reverse()
2680 l.reverse()
2652 hexfunc = ui.debugflag and hex or short
2681 hexfunc = ui.debugflag and hex or short
2653 for t, n in l:
2682 for t, n in l:
2654 try:
2683 try:
2655 r = "%5d:%s" % (repo.changelog.rev(n), hexfunc(n))
2684 r = "%5d:%s" % (repo.changelog.rev(n), hexfunc(n))
2656 except KeyError:
2685 except KeyError:
2657 r = " ?:?"
2686 r = " ?:?"
2658 if ui.quiet:
2687 if ui.quiet:
2659 ui.write("%s\n" % t)
2688 ui.write("%s\n" % t)
2660 else:
2689 else:
2661 ui.write("%-30s %s\n" % (t, r))
2690 ui.write("%-30s %s\n" % (t, r))
2662
2691
2663 def tip(ui, repo, **opts):
2692 def tip(ui, repo, **opts):
2664 """show the tip revision
2693 """show the tip revision
2665
2694
2666 Show the tip revision.
2695 Show the tip revision.
2667 """
2696 """
2668 n = repo.changelog.tip()
2697 n = repo.changelog.tip()
2669 br = None
2698 br = None
2670 if opts['branches']:
2699 if opts['branches']:
2671 br = repo.branchlookup([n])
2700 br = repo.branchlookup([n])
2672 show_changeset(ui, repo, opts).show(changenode=n, brinfo=br)
2701 show_changeset(ui, repo, opts).show(changenode=n, brinfo=br)
2673 if opts['patch']:
2702 if opts['patch']:
2674 patch.diff(repo, repo.changelog.parents(n)[0], n)
2703 patch.diff(repo, repo.changelog.parents(n)[0], n)
2675
2704
2676 def unbundle(ui, repo, fname, **opts):
2705 def unbundle(ui, repo, fname, **opts):
2677 """apply a changegroup file
2706 """apply a changegroup file
2678
2707
2679 Apply a compressed changegroup file generated by the bundle
2708 Apply a compressed changegroup file generated by the bundle
2680 command.
2709 command.
2681 """
2710 """
2682 f = urllib.urlopen(fname)
2711 f = urllib.urlopen(fname)
2683
2712
2684 header = f.read(6)
2713 header = f.read(6)
2685 if not header.startswith("HG"):
2714 if not header.startswith("HG"):
2686 raise util.Abort(_("%s: not a Mercurial bundle file") % fname)
2715 raise util.Abort(_("%s: not a Mercurial bundle file") % fname)
2687 elif not header.startswith("HG10"):
2716 elif not header.startswith("HG10"):
2688 raise util.Abort(_("%s: unknown bundle version") % fname)
2717 raise util.Abort(_("%s: unknown bundle version") % fname)
2689 elif header == "HG10BZ":
2718 elif header == "HG10BZ":
2690 def generator(f):
2719 def generator(f):
2691 zd = bz2.BZ2Decompressor()
2720 zd = bz2.BZ2Decompressor()
2692 zd.decompress("BZ")
2721 zd.decompress("BZ")
2693 for chunk in f:
2722 for chunk in f:
2694 yield zd.decompress(chunk)
2723 yield zd.decompress(chunk)
2695 elif header == "HG10UN":
2724 elif header == "HG10UN":
2696 def generator(f):
2725 def generator(f):
2697 for chunk in f:
2726 for chunk in f:
2698 yield chunk
2727 yield chunk
2699 else:
2728 else:
2700 raise util.Abort(_("%s: unknown bundle compression type")
2729 raise util.Abort(_("%s: unknown bundle compression type")
2701 % fname)
2730 % fname)
2702 gen = generator(util.filechunkiter(f, 4096))
2731 gen = generator(util.filechunkiter(f, 4096))
2703 modheads = repo.addchangegroup(util.chunkbuffer(gen), 'unbundle',
2732 modheads = repo.addchangegroup(util.chunkbuffer(gen), 'unbundle',
2704 'bundle:' + fname)
2733 'bundle:' + fname)
2705 return postincoming(ui, repo, modheads, opts['update'])
2734 return postincoming(ui, repo, modheads, opts['update'])
2706
2735
2707 def undo(ui, repo):
2736 def undo(ui, repo):
2708 """undo the last commit or pull (DEPRECATED)
2737 """undo the last commit or pull (DEPRECATED)
2709
2738
2710 (DEPRECATED)
2739 (DEPRECATED)
2711 This command is now deprecated and will be removed in a future
2740 This command is now deprecated and will be removed in a future
2712 release. Please use the rollback command instead. For usage
2741 release. Please use the rollback command instead. For usage
2713 instructions, see the rollback command.
2742 instructions, see the rollback command.
2714 """
2743 """
2715 ui.warn(_('(the undo command is deprecated; use rollback instead)\n'))
2744 ui.warn(_('(the undo command is deprecated; use rollback instead)\n'))
2716 repo.rollback()
2745 repo.rollback()
2717
2746
2718 def update(ui, repo, node=None, merge=False, clean=False, force=None,
2747 def update(ui, repo, node=None, merge=False, clean=False, force=None,
2719 branch=None):
2748 branch=None):
2720 """update or merge working directory
2749 """update or merge working directory
2721
2750
2722 Update the working directory to the specified revision.
2751 Update the working directory to the specified revision.
2723
2752
2724 If there are no outstanding changes in the working directory and
2753 If there are no outstanding changes in the working directory and
2725 there is a linear relationship between the current version and the
2754 there is a linear relationship between the current version and the
2726 requested version, the result is the requested version.
2755 requested version, the result is the requested version.
2727
2756
2728 To merge the working directory with another revision, use the
2757 To merge the working directory with another revision, use the
2729 merge command.
2758 merge command.
2730
2759
2731 By default, update will refuse to run if doing so would require
2760 By default, update will refuse to run if doing so would require
2732 merging or discarding local changes.
2761 merging or discarding local changes.
2733 """
2762 """
2734 node = _lookup(repo, node, branch)
2763 node = _lookup(repo, node, branch)
2735 if merge:
2764 if merge:
2736 ui.warn(_('(the -m/--merge option is deprecated; '
2765 ui.warn(_('(the -m/--merge option is deprecated; '
2737 'use the merge command instead)\n'))
2766 'use the merge command instead)\n'))
2738 return hg.merge(repo, node, force=force)
2767 return hg.merge(repo, node, force=force)
2739 elif clean:
2768 elif clean:
2740 return hg.clean(repo, node)
2769 return hg.clean(repo, node)
2741 else:
2770 else:
2742 return hg.update(repo, node)
2771 return hg.update(repo, node)
2743
2772
2744 def _lookup(repo, node, branch=None):
2773 def _lookup(repo, node, branch=None):
2745 if branch:
2774 if branch:
2746 br = repo.branchlookup(branch=branch)
2775 br = repo.branchlookup(branch=branch)
2747 found = []
2776 found = []
2748 for x in br:
2777 for x in br:
2749 if branch in br[x]:
2778 if branch in br[x]:
2750 found.append(x)
2779 found.append(x)
2751 if len(found) > 1:
2780 if len(found) > 1:
2752 repo.ui.warn(_("Found multiple heads for %s\n") % branch)
2781 repo.ui.warn(_("Found multiple heads for %s\n") % branch)
2753 for x in found:
2782 for x in found:
2754 show_changeset(ui, repo, {}).show(changenode=x, brinfo=br)
2783 show_changeset(ui, repo, {}).show(changenode=x, brinfo=br)
2755 raise util.Abort("")
2784 raise util.Abort("")
2756 if len(found) == 1:
2785 if len(found) == 1:
2757 node = found[0]
2786 node = found[0]
2758 repo.ui.warn(_("Using head %s for branch %s\n")
2787 repo.ui.warn(_("Using head %s for branch %s\n")
2759 % (short(node), branch))
2788 % (short(node), branch))
2760 else:
2789 else:
2761 raise util.Abort(_("branch %s not found") % branch)
2790 raise util.Abort(_("branch %s not found") % branch)
2762 else:
2791 else:
2763 node = node and repo.lookup(node) or repo.changelog.tip()
2792 node = node and repo.lookup(node) or repo.changelog.tip()
2764 return node
2793 return node
2765
2794
2766 def verify(ui, repo):
2795 def verify(ui, repo):
2767 """verify the integrity of the repository
2796 """verify the integrity of the repository
2768
2797
2769 Verify the integrity of the current repository.
2798 Verify the integrity of the current repository.
2770
2799
2771 This will perform an extensive check of the repository's
2800 This will perform an extensive check of the repository's
2772 integrity, validating the hashes and checksums of each entry in
2801 integrity, validating the hashes and checksums of each entry in
2773 the changelog, manifest, and tracked files, as well as the
2802 the changelog, manifest, and tracked files, as well as the
2774 integrity of their crosslinks and indices.
2803 integrity of their crosslinks and indices.
2775 """
2804 """
2776 return hg.verify(repo)
2805 return hg.verify(repo)
2777
2806
2778 # Command options and aliases are listed here, alphabetically
2807 # Command options and aliases are listed here, alphabetically
2779
2808
2780 globalopts = [
2809 globalopts = [
2781 ('R', 'repository', '',
2810 ('R', 'repository', '',
2782 _('repository root directory or symbolic path name')),
2811 _('repository root directory or symbolic path name')),
2783 ('', 'cwd', '', _('change working directory')),
2812 ('', 'cwd', '', _('change working directory')),
2784 ('y', 'noninteractive', None,
2813 ('y', 'noninteractive', None,
2785 _('do not prompt, assume \'yes\' for any required answers')),
2814 _('do not prompt, assume \'yes\' for any required answers')),
2786 ('q', 'quiet', None, _('suppress output')),
2815 ('q', 'quiet', None, _('suppress output')),
2787 ('v', 'verbose', None, _('enable additional output')),
2816 ('v', 'verbose', None, _('enable additional output')),
2788 ('', 'config', [], _('set/override config option')),
2817 ('', 'config', [], _('set/override config option')),
2789 ('', 'debug', None, _('enable debugging output')),
2818 ('', 'debug', None, _('enable debugging output')),
2790 ('', 'debugger', None, _('start debugger')),
2819 ('', 'debugger', None, _('start debugger')),
2791 ('', 'lsprof', None, _('print improved command execution profile')),
2820 ('', 'lsprof', None, _('print improved command execution profile')),
2792 ('', 'traceback', None, _('print traceback on exception')),
2821 ('', 'traceback', None, _('print traceback on exception')),
2793 ('', 'time', None, _('time how long the command takes')),
2822 ('', 'time', None, _('time how long the command takes')),
2794 ('', 'profile', None, _('print command execution profile')),
2823 ('', 'profile', None, _('print command execution profile')),
2795 ('', 'version', None, _('output version information and exit')),
2824 ('', 'version', None, _('output version information and exit')),
2796 ('h', 'help', None, _('display help and exit')),
2825 ('h', 'help', None, _('display help and exit')),
2797 ]
2826 ]
2798
2827
2799 dryrunopts = [('n', 'dry-run', None,
2828 dryrunopts = [('n', 'dry-run', None,
2800 _('do not perform actions, just print output'))]
2829 _('do not perform actions, just print output'))]
2801
2830
2802 remoteopts = [
2831 remoteopts = [
2803 ('e', 'ssh', '', _('specify ssh command to use')),
2832 ('e', 'ssh', '', _('specify ssh command to use')),
2804 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
2833 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
2805 ]
2834 ]
2806
2835
2807 walkopts = [
2836 walkopts = [
2808 ('I', 'include', [], _('include names matching the given patterns')),
2837 ('I', 'include', [], _('include names matching the given patterns')),
2809 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2838 ('X', 'exclude', [], _('exclude names matching the given patterns')),
2810 ]
2839 ]
2811
2840
2812 table = {
2841 table = {
2813 "^add":
2842 "^add":
2814 (add,
2843 (add,
2815 walkopts + dryrunopts,
2844 walkopts + dryrunopts,
2816 _('hg add [OPTION]... [FILE]...')),
2845 _('hg add [OPTION]... [FILE]...')),
2817 "addremove":
2846 "addremove":
2818 (addremove,
2847 (addremove,
2819 [('s', 'similarity', '',
2848 [('s', 'similarity', '',
2820 _('guess renamed files by similarity (0<=s<=100)')),
2849 _('guess renamed files by similarity (0<=s<=100)')),
2821 ] + walkopts + dryrunopts,
2850 ] + walkopts + dryrunopts,
2822 _('hg addremove [OPTION]... [FILE]...')),
2851 _('hg addremove [OPTION]... [FILE]...')),
2823 "^annotate":
2852 "^annotate":
2824 (annotate,
2853 (annotate,
2825 [('r', 'rev', '', _('annotate the specified revision')),
2854 [('r', 'rev', '', _('annotate the specified revision')),
2826 ('f', 'follow', None, _('follow file copies and renames')),
2855 ('f', 'follow', None, _('follow file copies and renames')),
2827 ('a', 'text', None, _('treat all files as text')),
2856 ('a', 'text', None, _('treat all files as text')),
2828 ('u', 'user', None, _('list the author')),
2857 ('u', 'user', None, _('list the author')),
2829 ('d', 'date', None, _('list the date')),
2858 ('d', 'date', None, _('list the date')),
2830 ('n', 'number', None, _('list the revision number (default)')),
2859 ('n', 'number', None, _('list the revision number (default)')),
2831 ('c', 'changeset', None, _('list the changeset')),
2860 ('c', 'changeset', None, _('list the changeset')),
2832 ] + walkopts,
2861 ] + walkopts,
2833 _('hg annotate [-r REV] [-a] [-u] [-d] [-n] [-c] FILE...')),
2862 _('hg annotate [-r REV] [-a] [-u] [-d] [-n] [-c] FILE...')),
2834 "archive":
2863 "archive":
2835 (archive,
2864 (archive,
2836 [('', 'no-decode', None, _('do not pass files through decoders')),
2865 [('', 'no-decode', None, _('do not pass files through decoders')),
2837 ('p', 'prefix', '', _('directory prefix for files in archive')),
2866 ('p', 'prefix', '', _('directory prefix for files in archive')),
2838 ('r', 'rev', '', _('revision to distribute')),
2867 ('r', 'rev', '', _('revision to distribute')),
2839 ('t', 'type', '', _('type of distribution to create')),
2868 ('t', 'type', '', _('type of distribution to create')),
2840 ] + walkopts,
2869 ] + walkopts,
2841 _('hg archive [OPTION]... DEST')),
2870 _('hg archive [OPTION]... DEST')),
2842 "backout":
2871 "backout":
2843 (backout,
2872 (backout,
2844 [('', 'merge', None,
2873 [('', 'merge', None,
2845 _('merge with old dirstate parent after backout')),
2874 _('merge with old dirstate parent after backout')),
2846 ('m', 'message', '', _('use <text> as commit message')),
2875 ('m', 'message', '', _('use <text> as commit message')),
2847 ('l', 'logfile', '', _('read commit message from <file>')),
2876 ('l', 'logfile', '', _('read commit message from <file>')),
2848 ('d', 'date', '', _('record datecode as commit date')),
2877 ('d', 'date', '', _('record datecode as commit date')),
2849 ('', 'parent', '', _('parent to choose when backing out merge')),
2878 ('', 'parent', '', _('parent to choose when backing out merge')),
2850 ('u', 'user', '', _('record user as committer')),
2879 ('u', 'user', '', _('record user as committer')),
2851 ] + walkopts,
2880 ] + walkopts,
2852 _('hg backout [OPTION]... REV')),
2881 _('hg backout [OPTION]... REV')),
2882 "branch": (branch, [], _('hg branch [NAME]')),
2883 "branches": (branches, [], _('hg branches')),
2853 "bundle":
2884 "bundle":
2854 (bundle,
2885 (bundle,
2855 [('f', 'force', None,
2886 [('f', 'force', None,
2856 _('run even when remote repository is unrelated')),
2887 _('run even when remote repository is unrelated')),
2857 ('r', 'rev', [],
2888 ('r', 'rev', [],
2858 _('a changeset you would like to bundle')),
2889 _('a changeset you would like to bundle')),
2859 ('', 'base', [],
2890 ('', 'base', [],
2860 _('a base changeset to specify instead of a destination')),
2891 _('a base changeset to specify instead of a destination')),
2861 ] + remoteopts,
2892 ] + remoteopts,
2862 _('hg bundle [--base REV]... [--rev REV]... FILE [DEST]')),
2893 _('hg bundle [--base REV]... [--rev REV]... FILE [DEST]')),
2863 "cat":
2894 "cat":
2864 (cat,
2895 (cat,
2865 [('o', 'output', '', _('print output to file with formatted name')),
2896 [('o', 'output', '', _('print output to file with formatted name')),
2866 ('r', 'rev', '', _('print the given revision')),
2897 ('r', 'rev', '', _('print the given revision')),
2867 ] + walkopts,
2898 ] + walkopts,
2868 _('hg cat [OPTION]... FILE...')),
2899 _('hg cat [OPTION]... FILE...')),
2869 "^clone":
2900 "^clone":
2870 (clone,
2901 (clone,
2871 [('U', 'noupdate', None, _('do not update the new working directory')),
2902 [('U', 'noupdate', None, _('do not update the new working directory')),
2872 ('r', 'rev', [],
2903 ('r', 'rev', [],
2873 _('a changeset you would like to have after cloning')),
2904 _('a changeset you would like to have after cloning')),
2874 ('', 'pull', None, _('use pull protocol to copy metadata')),
2905 ('', 'pull', None, _('use pull protocol to copy metadata')),
2875 ('', 'uncompressed', None,
2906 ('', 'uncompressed', None,
2876 _('use uncompressed transfer (fast over LAN)')),
2907 _('use uncompressed transfer (fast over LAN)')),
2877 ] + remoteopts,
2908 ] + remoteopts,
2878 _('hg clone [OPTION]... SOURCE [DEST]')),
2909 _('hg clone [OPTION]... SOURCE [DEST]')),
2879 "^commit|ci":
2910 "^commit|ci":
2880 (commit,
2911 (commit,
2881 [('A', 'addremove', None,
2912 [('A', 'addremove', None,
2882 _('mark new/missing files as added/removed before committing')),
2913 _('mark new/missing files as added/removed before committing')),
2883 ('m', 'message', '', _('use <text> as commit message')),
2914 ('m', 'message', '', _('use <text> as commit message')),
2884 ('l', 'logfile', '', _('read the commit message from <file>')),
2915 ('l', 'logfile', '', _('read the commit message from <file>')),
2885 ('d', 'date', '', _('record datecode as commit date')),
2916 ('d', 'date', '', _('record datecode as commit date')),
2886 ('u', 'user', '', _('record user as commiter')),
2917 ('u', 'user', '', _('record user as commiter')),
2887 ] + walkopts,
2918 ] + walkopts,
2888 _('hg commit [OPTION]... [FILE]...')),
2919 _('hg commit [OPTION]... [FILE]...')),
2889 "copy|cp":
2920 "copy|cp":
2890 (copy,
2921 (copy,
2891 [('A', 'after', None, _('record a copy that has already occurred')),
2922 [('A', 'after', None, _('record a copy that has already occurred')),
2892 ('f', 'force', None,
2923 ('f', 'force', None,
2893 _('forcibly copy over an existing managed file')),
2924 _('forcibly copy over an existing managed file')),
2894 ] + walkopts + dryrunopts,
2925 ] + walkopts + dryrunopts,
2895 _('hg copy [OPTION]... [SOURCE]... DEST')),
2926 _('hg copy [OPTION]... [SOURCE]... DEST')),
2896 "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
2927 "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
2897 "debugcomplete":
2928 "debugcomplete":
2898 (debugcomplete,
2929 (debugcomplete,
2899 [('o', 'options', None, _('show the command options'))],
2930 [('o', 'options', None, _('show the command options'))],
2900 _('debugcomplete [-o] CMD')),
2931 _('debugcomplete [-o] CMD')),
2901 "debugrebuildstate":
2932 "debugrebuildstate":
2902 (debugrebuildstate,
2933 (debugrebuildstate,
2903 [('r', 'rev', '', _('revision to rebuild to'))],
2934 [('r', 'rev', '', _('revision to rebuild to'))],
2904 _('debugrebuildstate [-r REV] [REV]')),
2935 _('debugrebuildstate [-r REV] [REV]')),
2905 "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
2936 "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
2906 "debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
2937 "debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
2907 "debugstate": (debugstate, [], _('debugstate')),
2938 "debugstate": (debugstate, [], _('debugstate')),
2908 "debugdata": (debugdata, [], _('debugdata FILE REV')),
2939 "debugdata": (debugdata, [], _('debugdata FILE REV')),
2909 "debugindex": (debugindex, [], _('debugindex FILE')),
2940 "debugindex": (debugindex, [], _('debugindex FILE')),
2910 "debugindexdot": (debugindexdot, [], _('debugindexdot FILE')),
2941 "debugindexdot": (debugindexdot, [], _('debugindexdot FILE')),
2911 "debugrename": (debugrename, [], _('debugrename FILE [REV]')),
2942 "debugrename": (debugrename, [], _('debugrename FILE [REV]')),
2912 "debugwalk":
2943 "debugwalk":
2913 (debugwalk, walkopts, _('debugwalk [OPTION]... [FILE]...')),
2944 (debugwalk, walkopts, _('debugwalk [OPTION]... [FILE]...')),
2914 "^diff":
2945 "^diff":
2915 (diff,
2946 (diff,
2916 [('r', 'rev', [], _('revision')),
2947 [('r', 'rev', [], _('revision')),
2917 ('a', 'text', None, _('treat all files as text')),
2948 ('a', 'text', None, _('treat all files as text')),
2918 ('p', 'show-function', None,
2949 ('p', 'show-function', None,
2919 _('show which function each change is in')),
2950 _('show which function each change is in')),
2920 ('g', 'git', None, _('use git extended diff format')),
2951 ('g', 'git', None, _('use git extended diff format')),
2921 ('', 'nodates', None, _("don't include dates in diff headers")),
2952 ('', 'nodates', None, _("don't include dates in diff headers")),
2922 ('w', 'ignore-all-space', None,
2953 ('w', 'ignore-all-space', None,
2923 _('ignore white space when comparing lines')),
2954 _('ignore white space when comparing lines')),
2924 ('b', 'ignore-space-change', None,
2955 ('b', 'ignore-space-change', None,
2925 _('ignore changes in the amount of white space')),
2956 _('ignore changes in the amount of white space')),
2926 ('B', 'ignore-blank-lines', None,
2957 ('B', 'ignore-blank-lines', None,
2927 _('ignore changes whose lines are all blank')),
2958 _('ignore changes whose lines are all blank')),
2928 ] + walkopts,
2959 ] + walkopts,
2929 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')),
2960 _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')),
2930 "^export":
2961 "^export":
2931 (export,
2962 (export,
2932 [('o', 'output', '', _('print output to file with formatted name')),
2963 [('o', 'output', '', _('print output to file with formatted name')),
2933 ('a', 'text', None, _('treat all files as text')),
2964 ('a', 'text', None, _('treat all files as text')),
2934 ('g', 'git', None, _('use git extended diff format')),
2965 ('g', 'git', None, _('use git extended diff format')),
2935 ('', 'nodates', None, _("don't include dates in diff headers")),
2966 ('', 'nodates', None, _("don't include dates in diff headers")),
2936 ('', 'switch-parent', None, _('diff against the second parent'))],
2967 ('', 'switch-parent', None, _('diff against the second parent'))],
2937 _('hg export [-a] [-o OUTFILESPEC] REV...')),
2968 _('hg export [-a] [-o OUTFILESPEC] REV...')),
2938 "debugforget|forget":
2969 "debugforget|forget":
2939 (forget, walkopts, _('hg forget [OPTION]... FILE...')),
2970 (forget, walkopts, _('hg forget [OPTION]... FILE...')),
2940 "grep":
2971 "grep":
2941 (grep,
2972 (grep,
2942 [('0', 'print0', None, _('end fields with NUL')),
2973 [('0', 'print0', None, _('end fields with NUL')),
2943 ('', 'all', None, _('print all revisions that match')),
2974 ('', 'all', None, _('print all revisions that match')),
2944 ('f', 'follow', None,
2975 ('f', 'follow', None,
2945 _('follow changeset history, or file history across copies and renames')),
2976 _('follow changeset history, or file history across copies and renames')),
2946 ('i', 'ignore-case', None, _('ignore case when matching')),
2977 ('i', 'ignore-case', None, _('ignore case when matching')),
2947 ('l', 'files-with-matches', None,
2978 ('l', 'files-with-matches', None,
2948 _('print only filenames and revs that match')),
2979 _('print only filenames and revs that match')),
2949 ('n', 'line-number', None, _('print matching line numbers')),
2980 ('n', 'line-number', None, _('print matching line numbers')),
2950 ('r', 'rev', [], _('search in given revision range')),
2981 ('r', 'rev', [], _('search in given revision range')),
2951 ('u', 'user', None, _('print user who committed change')),
2982 ('u', 'user', None, _('print user who committed change')),
2952 ] + walkopts,
2983 ] + walkopts,
2953 _('hg grep [OPTION]... PATTERN [FILE]...')),
2984 _('hg grep [OPTION]... PATTERN [FILE]...')),
2954 "heads":
2985 "heads":
2955 (heads,
2986 (heads,
2956 [('b', 'branches', None, _('show branches')),
2987 [('b', 'branches', None, _('show branches')),
2957 ('', 'style', '', _('display using template map file')),
2988 ('', 'style', '', _('display using template map file')),
2958 ('r', 'rev', '', _('show only heads which are descendants of rev')),
2989 ('r', 'rev', '', _('show only heads which are descendants of rev')),
2959 ('', 'template', '', _('display with template'))],
2990 ('', 'template', '', _('display with template'))],
2960 _('hg heads [-b] [-r <rev>]')),
2991 _('hg heads [-b] [-r <rev>]')),
2961 "help": (help_, [], _('hg help [COMMAND]')),
2992 "help": (help_, [], _('hg help [COMMAND]')),
2962 "identify|id": (identify, [], _('hg identify')),
2993 "identify|id": (identify, [], _('hg identify')),
2963 "import|patch":
2994 "import|patch":
2964 (import_,
2995 (import_,
2965 [('p', 'strip', 1,
2996 [('p', 'strip', 1,
2966 _('directory strip option for patch. This has the same\n'
2997 _('directory strip option for patch. This has the same\n'
2967 'meaning as the corresponding patch option')),
2998 'meaning as the corresponding patch option')),
2968 ('m', 'message', '', _('use <text> as commit message')),
2999 ('m', 'message', '', _('use <text> as commit message')),
2969 ('b', 'base', '', _('base path')),
3000 ('b', 'base', '', _('base path')),
2970 ('f', 'force', None,
3001 ('f', 'force', None,
2971 _('skip check for outstanding uncommitted changes'))],
3002 _('skip check for outstanding uncommitted changes'))],
2972 _('hg import [-p NUM] [-b BASE] [-m MESSAGE] [-f] PATCH...')),
3003 _('hg import [-p NUM] [-b BASE] [-m MESSAGE] [-f] PATCH...')),
2973 "incoming|in": (incoming,
3004 "incoming|in": (incoming,
2974 [('M', 'no-merges', None, _('do not show merges')),
3005 [('M', 'no-merges', None, _('do not show merges')),
2975 ('f', 'force', None,
3006 ('f', 'force', None,
2976 _('run even when remote repository is unrelated')),
3007 _('run even when remote repository is unrelated')),
2977 ('', 'style', '', _('display using template map file')),
3008 ('', 'style', '', _('display using template map file')),
2978 ('n', 'newest-first', None, _('show newest record first')),
3009 ('n', 'newest-first', None, _('show newest record first')),
2979 ('', 'bundle', '', _('file to store the bundles into')),
3010 ('', 'bundle', '', _('file to store the bundles into')),
2980 ('p', 'patch', None, _('show patch')),
3011 ('p', 'patch', None, _('show patch')),
2981 ('r', 'rev', [], _('a specific revision up to which you would like to pull')),
3012 ('r', 'rev', [], _('a specific revision up to which you would like to pull')),
2982 ('', 'template', '', _('display with template')),
3013 ('', 'template', '', _('display with template')),
2983 ] + remoteopts,
3014 ] + remoteopts,
2984 _('hg incoming [-p] [-n] [-M] [-r REV]...'
3015 _('hg incoming [-p] [-n] [-M] [-r REV]...'
2985 ' [--bundle FILENAME] [SOURCE]')),
3016 ' [--bundle FILENAME] [SOURCE]')),
2986 "^init":
3017 "^init":
2987 (init, remoteopts, _('hg init [-e FILE] [--remotecmd FILE] [DEST]')),
3018 (init, remoteopts, _('hg init [-e FILE] [--remotecmd FILE] [DEST]')),
2988 "locate":
3019 "locate":
2989 (locate,
3020 (locate,
2990 [('r', 'rev', '', _('search the repository as it stood at rev')),
3021 [('r', 'rev', '', _('search the repository as it stood at rev')),
2991 ('0', 'print0', None,
3022 ('0', 'print0', None,
2992 _('end filenames with NUL, for use with xargs')),
3023 _('end filenames with NUL, for use with xargs')),
2993 ('f', 'fullpath', None,
3024 ('f', 'fullpath', None,
2994 _('print complete paths from the filesystem root')),
3025 _('print complete paths from the filesystem root')),
2995 ] + walkopts,
3026 ] + walkopts,
2996 _('hg locate [OPTION]... [PATTERN]...')),
3027 _('hg locate [OPTION]... [PATTERN]...')),
2997 "^log|history":
3028 "^log|history":
2998 (log,
3029 (log,
2999 [('b', 'branches', None, _('show branches')),
3030 [('b', 'branches', None, _('show branches')),
3000 ('f', 'follow', None,
3031 ('f', 'follow', None,
3001 _('follow changeset history, or file history across copies and renames')),
3032 _('follow changeset history, or file history across copies and renames')),
3002 ('', 'follow-first', None,
3033 ('', 'follow-first', None,
3003 _('only follow the first parent of merge changesets')),
3034 _('only follow the first parent of merge changesets')),
3004 ('C', 'copies', None, _('show copied files')),
3035 ('C', 'copies', None, _('show copied files')),
3005 ('k', 'keyword', [], _('search for a keyword')),
3036 ('k', 'keyword', [], _('search for a keyword')),
3006 ('l', 'limit', '', _('limit number of changes displayed')),
3037 ('l', 'limit', '', _('limit number of changes displayed')),
3007 ('r', 'rev', [], _('show the specified revision or range')),
3038 ('r', 'rev', [], _('show the specified revision or range')),
3008 ('M', 'no-merges', None, _('do not show merges')),
3039 ('M', 'no-merges', None, _('do not show merges')),
3009 ('', 'style', '', _('display using template map file')),
3040 ('', 'style', '', _('display using template map file')),
3010 ('m', 'only-merges', None, _('show only merges')),
3041 ('m', 'only-merges', None, _('show only merges')),
3011 ('p', 'patch', None, _('show patch')),
3042 ('p', 'patch', None, _('show patch')),
3012 ('P', 'prune', [], _('do not display revision or any of its ancestors')),
3043 ('P', 'prune', [], _('do not display revision or any of its ancestors')),
3013 ('', 'template', '', _('display with template')),
3044 ('', 'template', '', _('display with template')),
3014 ] + walkopts,
3045 ] + walkopts,
3015 _('hg log [OPTION]... [FILE]')),
3046 _('hg log [OPTION]... [FILE]')),
3016 "manifest": (manifest, [], _('hg manifest [REV]')),
3047 "manifest": (manifest, [], _('hg manifest [REV]')),
3017 "merge":
3048 "merge":
3018 (merge,
3049 (merge,
3019 [('b', 'branch', '', _('merge with head of a specific branch')),
3050 [('b', 'branch', '', _('merge with head of a specific branch')),
3020 ('f', 'force', None, _('force a merge with outstanding changes'))],
3051 ('f', 'force', None, _('force a merge with outstanding changes'))],
3021 _('hg merge [-b TAG] [-f] [REV]')),
3052 _('hg merge [-b TAG] [-f] [REV]')),
3022 "outgoing|out": (outgoing,
3053 "outgoing|out": (outgoing,
3023 [('M', 'no-merges', None, _('do not show merges')),
3054 [('M', 'no-merges', None, _('do not show merges')),
3024 ('f', 'force', None,
3055 ('f', 'force', None,
3025 _('run even when remote repository is unrelated')),
3056 _('run even when remote repository is unrelated')),
3026 ('p', 'patch', None, _('show patch')),
3057 ('p', 'patch', None, _('show patch')),
3027 ('', 'style', '', _('display using template map file')),
3058 ('', 'style', '', _('display using template map file')),
3028 ('r', 'rev', [], _('a specific revision you would like to push')),
3059 ('r', 'rev', [], _('a specific revision you would like to push')),
3029 ('n', 'newest-first', None, _('show newest record first')),
3060 ('n', 'newest-first', None, _('show newest record first')),
3030 ('', 'template', '', _('display with template')),
3061 ('', 'template', '', _('display with template')),
3031 ] + remoteopts,
3062 ] + remoteopts,
3032 _('hg outgoing [-M] [-p] [-n] [-r REV]... [DEST]')),
3063 _('hg outgoing [-M] [-p] [-n] [-r REV]... [DEST]')),
3033 "^parents":
3064 "^parents":
3034 (parents,
3065 (parents,
3035 [('b', 'branches', None, _('show branches')),
3066 [('b', 'branches', None, _('show branches')),
3036 ('r', 'rev', '', _('show parents from the specified rev')),
3067 ('r', 'rev', '', _('show parents from the specified rev')),
3037 ('', 'style', '', _('display using template map file')),
3068 ('', 'style', '', _('display using template map file')),
3038 ('', 'template', '', _('display with template'))],
3069 ('', 'template', '', _('display with template'))],
3039 _('hg parents [-b] [-r REV] [FILE]')),
3070 _('hg parents [-b] [-r REV] [FILE]')),
3040 "paths": (paths, [], _('hg paths [NAME]')),
3071 "paths": (paths, [], _('hg paths [NAME]')),
3041 "^pull":
3072 "^pull":
3042 (pull,
3073 (pull,
3043 [('u', 'update', None,
3074 [('u', 'update', None,
3044 _('update to new tip if changesets were pulled')),
3075 _('update to new tip if changesets were pulled')),
3045 ('f', 'force', None,
3076 ('f', 'force', None,
3046 _('run even when remote repository is unrelated')),
3077 _('run even when remote repository is unrelated')),
3047 ('r', 'rev', [], _('a specific revision up to which you would like to pull')),
3078 ('r', 'rev', [], _('a specific revision up to which you would like to pull')),
3048 ] + remoteopts,
3079 ] + remoteopts,
3049 _('hg pull [-u] [-r REV]... [-e FILE] [--remotecmd FILE] [SOURCE]')),
3080 _('hg pull [-u] [-r REV]... [-e FILE] [--remotecmd FILE] [SOURCE]')),
3050 "^push":
3081 "^push":
3051 (push,
3082 (push,
3052 [('f', 'force', None, _('force push')),
3083 [('f', 'force', None, _('force push')),
3053 ('r', 'rev', [], _('a specific revision you would like to push')),
3084 ('r', 'rev', [], _('a specific revision you would like to push')),
3054 ] + remoteopts,
3085 ] + remoteopts,
3055 _('hg push [-f] [-r REV]... [-e FILE] [--remotecmd FILE] [DEST]')),
3086 _('hg push [-f] [-r REV]... [-e FILE] [--remotecmd FILE] [DEST]')),
3056 "debugrawcommit|rawcommit":
3087 "debugrawcommit|rawcommit":
3057 (rawcommit,
3088 (rawcommit,
3058 [('p', 'parent', [], _('parent')),
3089 [('p', 'parent', [], _('parent')),
3059 ('d', 'date', '', _('date code')),
3090 ('d', 'date', '', _('date code')),
3060 ('u', 'user', '', _('user')),
3091 ('u', 'user', '', _('user')),
3061 ('F', 'files', '', _('file list')),
3092 ('F', 'files', '', _('file list')),
3062 ('m', 'message', '', _('commit message')),
3093 ('m', 'message', '', _('commit message')),
3063 ('l', 'logfile', '', _('commit message file'))],
3094 ('l', 'logfile', '', _('commit message file'))],
3064 _('hg debugrawcommit [OPTION]... [FILE]...')),
3095 _('hg debugrawcommit [OPTION]... [FILE]...')),
3065 "recover": (recover, [], _('hg recover')),
3096 "recover": (recover, [], _('hg recover')),
3066 "^remove|rm":
3097 "^remove|rm":
3067 (remove,
3098 (remove,
3068 [('A', 'after', None, _('record remove that has already occurred')),
3099 [('A', 'after', None, _('record remove that has already occurred')),
3069 ('f', 'force', None, _('remove file even if modified')),
3100 ('f', 'force', None, _('remove file even if modified')),
3070 ] + walkopts,
3101 ] + walkopts,
3071 _('hg remove [OPTION]... FILE...')),
3102 _('hg remove [OPTION]... FILE...')),
3072 "rename|mv":
3103 "rename|mv":
3073 (rename,
3104 (rename,
3074 [('A', 'after', None, _('record a rename that has already occurred')),
3105 [('A', 'after', None, _('record a rename that has already occurred')),
3075 ('f', 'force', None,
3106 ('f', 'force', None,
3076 _('forcibly copy over an existing managed file')),
3107 _('forcibly copy over an existing managed file')),
3077 ] + walkopts + dryrunopts,
3108 ] + walkopts + dryrunopts,
3078 _('hg rename [OPTION]... SOURCE... DEST')),
3109 _('hg rename [OPTION]... SOURCE... DEST')),
3079 "^revert":
3110 "^revert":
3080 (revert,
3111 (revert,
3081 [('a', 'all', None, _('revert all changes when no arguments given')),
3112 [('a', 'all', None, _('revert all changes when no arguments given')),
3082 ('r', 'rev', '', _('revision to revert to')),
3113 ('r', 'rev', '', _('revision to revert to')),
3083 ('', 'no-backup', None, _('do not save backup copies of files')),
3114 ('', 'no-backup', None, _('do not save backup copies of files')),
3084 ] + walkopts + dryrunopts,
3115 ] + walkopts + dryrunopts,
3085 _('hg revert [-r REV] [NAME]...')),
3116 _('hg revert [-r REV] [NAME]...')),
3086 "rollback": (rollback, [], _('hg rollback')),
3117 "rollback": (rollback, [], _('hg rollback')),
3087 "root": (root, [], _('hg root')),
3118 "root": (root, [], _('hg root')),
3088 "showconfig|debugconfig": (showconfig, [], _('showconfig [NAME]...')),
3119 "showconfig|debugconfig": (showconfig, [], _('showconfig [NAME]...')),
3089 "^serve":
3120 "^serve":
3090 (serve,
3121 (serve,
3091 [('A', 'accesslog', '', _('name of access log file to write to')),
3122 [('A', 'accesslog', '', _('name of access log file to write to')),
3092 ('d', 'daemon', None, _('run server in background')),
3123 ('d', 'daemon', None, _('run server in background')),
3093 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3124 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3094 ('E', 'errorlog', '', _('name of error log file to write to')),
3125 ('E', 'errorlog', '', _('name of error log file to write to')),
3095 ('p', 'port', 0, _('port to use (default: 8000)')),
3126 ('p', 'port', 0, _('port to use (default: 8000)')),
3096 ('a', 'address', '', _('address to use')),
3127 ('a', 'address', '', _('address to use')),
3097 ('n', 'name', '',
3128 ('n', 'name', '',
3098 _('name to show in web pages (default: working dir)')),
3129 _('name to show in web pages (default: working dir)')),
3099 ('', 'webdir-conf', '', _('name of the webdir config file'
3130 ('', 'webdir-conf', '', _('name of the webdir config file'
3100 ' (serve more than one repo)')),
3131 ' (serve more than one repo)')),
3101 ('', 'pid-file', '', _('name of file to write process ID to')),
3132 ('', 'pid-file', '', _('name of file to write process ID to')),
3102 ('', 'stdio', None, _('for remote clients')),
3133 ('', 'stdio', None, _('for remote clients')),
3103 ('t', 'templates', '', _('web templates to use')),
3134 ('t', 'templates', '', _('web templates to use')),
3104 ('', 'style', '', _('template style to use')),
3135 ('', 'style', '', _('template style to use')),
3105 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))],
3136 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))],
3106 _('hg serve [OPTION]...')),
3137 _('hg serve [OPTION]...')),
3107 "^status|st":
3138 "^status|st":
3108 (status,
3139 (status,
3109 [('A', 'all', None, _('show status of all files')),
3140 [('A', 'all', None, _('show status of all files')),
3110 ('m', 'modified', None, _('show only modified files')),
3141 ('m', 'modified', None, _('show only modified files')),
3111 ('a', 'added', None, _('show only added files')),
3142 ('a', 'added', None, _('show only added files')),
3112 ('r', 'removed', None, _('show only removed files')),
3143 ('r', 'removed', None, _('show only removed files')),
3113 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3144 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3114 ('c', 'clean', None, _('show only files without changes')),
3145 ('c', 'clean', None, _('show only files without changes')),
3115 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3146 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3116 ('i', 'ignored', None, _('show ignored files')),
3147 ('i', 'ignored', None, _('show ignored files')),
3117 ('n', 'no-status', None, _('hide status prefix')),
3148 ('n', 'no-status', None, _('hide status prefix')),
3118 ('C', 'copies', None, _('show source of copied files')),
3149 ('C', 'copies', None, _('show source of copied files')),
3119 ('0', 'print0', None,
3150 ('0', 'print0', None,
3120 _('end filenames with NUL, for use with xargs')),
3151 _('end filenames with NUL, for use with xargs')),
3121 ('', 'rev', [], _('show difference from revision')),
3152 ('', 'rev', [], _('show difference from revision')),
3122 ] + walkopts,
3153 ] + walkopts,
3123 _('hg status [OPTION]... [FILE]...')),
3154 _('hg status [OPTION]... [FILE]...')),
3124 "tag":
3155 "tag":
3125 (tag,
3156 (tag,
3126 [('l', 'local', None, _('make the tag local')),
3157 [('l', 'local', None, _('make the tag local')),
3127 ('m', 'message', '', _('message for tag commit log entry')),
3158 ('m', 'message', '', _('message for tag commit log entry')),
3128 ('d', 'date', '', _('record datecode as commit date')),
3159 ('d', 'date', '', _('record datecode as commit date')),
3129 ('u', 'user', '', _('record user as commiter')),
3160 ('u', 'user', '', _('record user as commiter')),
3130 ('r', 'rev', '', _('revision to tag'))],
3161 ('r', 'rev', '', _('revision to tag'))],
3131 _('hg tag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME')),
3162 _('hg tag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME')),
3132 "tags": (tags, [], _('hg tags')),
3163 "tags": (tags, [], _('hg tags')),
3133 "tip":
3164 "tip":
3134 (tip,
3165 (tip,
3135 [('b', 'branches', None, _('show branches')),
3166 [('b', 'branches', None, _('show branches')),
3136 ('', 'style', '', _('display using template map file')),
3167 ('', 'style', '', _('display using template map file')),
3137 ('p', 'patch', None, _('show patch')),
3168 ('p', 'patch', None, _('show patch')),
3138 ('', 'template', '', _('display with template'))],
3169 ('', 'template', '', _('display with template'))],
3139 _('hg tip [-b] [-p]')),
3170 _('hg tip [-b] [-p]')),
3140 "unbundle":
3171 "unbundle":
3141 (unbundle,
3172 (unbundle,
3142 [('u', 'update', None,
3173 [('u', 'update', None,
3143 _('update to new tip if changesets were unbundled'))],
3174 _('update to new tip if changesets were unbundled'))],
3144 _('hg unbundle [-u] FILE')),
3175 _('hg unbundle [-u] FILE')),
3145 "debugundo|undo": (undo, [], _('hg undo')),
3176 "debugundo|undo": (undo, [], _('hg undo')),
3146 "^update|up|checkout|co":
3177 "^update|up|checkout|co":
3147 (update,
3178 (update,
3148 [('b', 'branch', '', _('checkout the head of a specific branch')),
3179 [('b', 'branch', '', _('checkout the head of a specific branch')),
3149 ('m', 'merge', None, _('allow merging of branches (DEPRECATED)')),
3180 ('m', 'merge', None, _('allow merging of branches (DEPRECATED)')),
3150 ('C', 'clean', None, _('overwrite locally modified files')),
3181 ('C', 'clean', None, _('overwrite locally modified files')),
3151 ('f', 'force', None, _('force a merge with outstanding changes'))],
3182 ('f', 'force', None, _('force a merge with outstanding changes'))],
3152 _('hg update [-b TAG] [-m] [-C] [-f] [REV]')),
3183 _('hg update [-b TAG] [-m] [-C] [-f] [REV]')),
3153 "verify": (verify, [], _('hg verify')),
3184 "verify": (verify, [], _('hg verify')),
3154 "version": (show_version, [], _('hg version')),
3185 "version": (show_version, [], _('hg version')),
3155 }
3186 }
3156
3187
3157 norepo = ("clone init version help debugancestor debugcomplete debugdata"
3188 norepo = ("clone init version help debugancestor debugcomplete debugdata"
3158 " debugindex debugindexdot")
3189 " debugindex debugindexdot")
3159 optionalrepo = ("paths serve showconfig")
3190 optionalrepo = ("paths serve showconfig")
3160
3191
3161 def findpossible(ui, cmd):
3192 def findpossible(ui, cmd):
3162 """
3193 """
3163 Return cmd -> (aliases, command table entry)
3194 Return cmd -> (aliases, command table entry)
3164 for each matching command.
3195 for each matching command.
3165 Return debug commands (or their aliases) only if no normal command matches.
3196 Return debug commands (or their aliases) only if no normal command matches.
3166 """
3197 """
3167 choice = {}
3198 choice = {}
3168 debugchoice = {}
3199 debugchoice = {}
3169 for e in table.keys():
3200 for e in table.keys():
3170 aliases = e.lstrip("^").split("|")
3201 aliases = e.lstrip("^").split("|")
3171 found = None
3202 found = None
3172 if cmd in aliases:
3203 if cmd in aliases:
3173 found = cmd
3204 found = cmd
3174 elif not ui.config("ui", "strict"):
3205 elif not ui.config("ui", "strict"):
3175 for a in aliases:
3206 for a in aliases:
3176 if a.startswith(cmd):
3207 if a.startswith(cmd):
3177 found = a
3208 found = a
3178 break
3209 break
3179 if found is not None:
3210 if found is not None:
3180 if aliases[0].startswith("debug") or found.startswith("debug"):
3211 if aliases[0].startswith("debug") or found.startswith("debug"):
3181 debugchoice[found] = (aliases, table[e])
3212 debugchoice[found] = (aliases, table[e])
3182 else:
3213 else:
3183 choice[found] = (aliases, table[e])
3214 choice[found] = (aliases, table[e])
3184
3215
3185 if not choice and debugchoice:
3216 if not choice and debugchoice:
3186 choice = debugchoice
3217 choice = debugchoice
3187
3218
3188 return choice
3219 return choice
3189
3220
3190 def findcmd(ui, cmd):
3221 def findcmd(ui, cmd):
3191 """Return (aliases, command table entry) for command string."""
3222 """Return (aliases, command table entry) for command string."""
3192 choice = findpossible(ui, cmd)
3223 choice = findpossible(ui, cmd)
3193
3224
3194 if choice.has_key(cmd):
3225 if choice.has_key(cmd):
3195 return choice[cmd]
3226 return choice[cmd]
3196
3227
3197 if len(choice) > 1:
3228 if len(choice) > 1:
3198 clist = choice.keys()
3229 clist = choice.keys()
3199 clist.sort()
3230 clist.sort()
3200 raise AmbiguousCommand(cmd, clist)
3231 raise AmbiguousCommand(cmd, clist)
3201
3232
3202 if choice:
3233 if choice:
3203 return choice.values()[0]
3234 return choice.values()[0]
3204
3235
3205 raise UnknownCommand(cmd)
3236 raise UnknownCommand(cmd)
3206
3237
3207 def catchterm(*args):
3238 def catchterm(*args):
3208 raise util.SignalInterrupt
3239 raise util.SignalInterrupt
3209
3240
3210 def run():
3241 def run():
3211 sys.exit(dispatch(sys.argv[1:]))
3242 sys.exit(dispatch(sys.argv[1:]))
3212
3243
3213 class ParseError(Exception):
3244 class ParseError(Exception):
3214 """Exception raised on errors in parsing the command line."""
3245 """Exception raised on errors in parsing the command line."""
3215
3246
3216 def parse(ui, args):
3247 def parse(ui, args):
3217 options = {}
3248 options = {}
3218 cmdoptions = {}
3249 cmdoptions = {}
3219
3250
3220 try:
3251 try:
3221 args = fancyopts.fancyopts(args, globalopts, options)
3252 args = fancyopts.fancyopts(args, globalopts, options)
3222 except fancyopts.getopt.GetoptError, inst:
3253 except fancyopts.getopt.GetoptError, inst:
3223 raise ParseError(None, inst)
3254 raise ParseError(None, inst)
3224
3255
3225 if args:
3256 if args:
3226 cmd, args = args[0], args[1:]
3257 cmd, args = args[0], args[1:]
3227 aliases, i = findcmd(ui, cmd)
3258 aliases, i = findcmd(ui, cmd)
3228 cmd = aliases[0]
3259 cmd = aliases[0]
3229 defaults = ui.config("defaults", cmd)
3260 defaults = ui.config("defaults", cmd)
3230 if defaults:
3261 if defaults:
3231 args = shlex.split(defaults) + args
3262 args = shlex.split(defaults) + args
3232 c = list(i[1])
3263 c = list(i[1])
3233 else:
3264 else:
3234 cmd = None
3265 cmd = None
3235 c = []
3266 c = []
3236
3267
3237 # combine global options into local
3268 # combine global options into local
3238 for o in globalopts:
3269 for o in globalopts:
3239 c.append((o[0], o[1], options[o[1]], o[3]))
3270 c.append((o[0], o[1], options[o[1]], o[3]))
3240
3271
3241 try:
3272 try:
3242 args = fancyopts.fancyopts(args, c, cmdoptions)
3273 args = fancyopts.fancyopts(args, c, cmdoptions)
3243 except fancyopts.getopt.GetoptError, inst:
3274 except fancyopts.getopt.GetoptError, inst:
3244 raise ParseError(cmd, inst)
3275 raise ParseError(cmd, inst)
3245
3276
3246 # separate global options back out
3277 # separate global options back out
3247 for o in globalopts:
3278 for o in globalopts:
3248 n = o[1]
3279 n = o[1]
3249 options[n] = cmdoptions[n]
3280 options[n] = cmdoptions[n]
3250 del cmdoptions[n]
3281 del cmdoptions[n]
3251
3282
3252 return (cmd, cmd and i[0] or None, args, options, cmdoptions)
3283 return (cmd, cmd and i[0] or None, args, options, cmdoptions)
3253
3284
3254 external = {}
3285 external = {}
3255
3286
3256 def findext(name):
3287 def findext(name):
3257 '''return module with given extension name'''
3288 '''return module with given extension name'''
3258 try:
3289 try:
3259 return sys.modules[external[name]]
3290 return sys.modules[external[name]]
3260 except KeyError:
3291 except KeyError:
3261 for k, v in external.iteritems():
3292 for k, v in external.iteritems():
3262 if k.endswith('.' + name) or k.endswith('/' + name) or v == name:
3293 if k.endswith('.' + name) or k.endswith('/' + name) or v == name:
3263 return sys.modules[v]
3294 return sys.modules[v]
3264 raise KeyError(name)
3295 raise KeyError(name)
3265
3296
3266 def load_extensions(ui):
3297 def load_extensions(ui):
3267 added = []
3298 added = []
3268 for ext_name, load_from_name in ui.extensions():
3299 for ext_name, load_from_name in ui.extensions():
3269 if ext_name in external:
3300 if ext_name in external:
3270 continue
3301 continue
3271 try:
3302 try:
3272 if load_from_name:
3303 if load_from_name:
3273 # the module will be loaded in sys.modules
3304 # the module will be loaded in sys.modules
3274 # choose an unique name so that it doesn't
3305 # choose an unique name so that it doesn't
3275 # conflicts with other modules
3306 # conflicts with other modules
3276 module_name = "hgext_%s" % ext_name.replace('.', '_')
3307 module_name = "hgext_%s" % ext_name.replace('.', '_')
3277 mod = imp.load_source(module_name, load_from_name)
3308 mod = imp.load_source(module_name, load_from_name)
3278 else:
3309 else:
3279 def importh(name):
3310 def importh(name):
3280 mod = __import__(name)
3311 mod = __import__(name)
3281 components = name.split('.')
3312 components = name.split('.')
3282 for comp in components[1:]:
3313 for comp in components[1:]:
3283 mod = getattr(mod, comp)
3314 mod = getattr(mod, comp)
3284 return mod
3315 return mod
3285 try:
3316 try:
3286 mod = importh("hgext.%s" % ext_name)
3317 mod = importh("hgext.%s" % ext_name)
3287 except ImportError:
3318 except ImportError:
3288 mod = importh(ext_name)
3319 mod = importh(ext_name)
3289 external[ext_name] = mod.__name__
3320 external[ext_name] = mod.__name__
3290 added.append((mod, ext_name))
3321 added.append((mod, ext_name))
3291 except (util.SignalInterrupt, KeyboardInterrupt):
3322 except (util.SignalInterrupt, KeyboardInterrupt):
3292 raise
3323 raise
3293 except Exception, inst:
3324 except Exception, inst:
3294 ui.warn(_("*** failed to import extension %s: %s\n") %
3325 ui.warn(_("*** failed to import extension %s: %s\n") %
3295 (ext_name, inst))
3326 (ext_name, inst))
3296 if ui.print_exc():
3327 if ui.print_exc():
3297 return 1
3328 return 1
3298
3329
3299 for mod, name in added:
3330 for mod, name in added:
3300 uisetup = getattr(mod, 'uisetup', None)
3331 uisetup = getattr(mod, 'uisetup', None)
3301 if uisetup:
3332 if uisetup:
3302 uisetup(ui)
3333 uisetup(ui)
3303 cmdtable = getattr(mod, 'cmdtable', {})
3334 cmdtable = getattr(mod, 'cmdtable', {})
3304 for t in cmdtable:
3335 for t in cmdtable:
3305 if t in table:
3336 if t in table:
3306 ui.warn(_("module %s overrides %s\n") % (name, t))
3337 ui.warn(_("module %s overrides %s\n") % (name, t))
3307 table.update(cmdtable)
3338 table.update(cmdtable)
3308
3339
3309 def parseconfig(config):
3340 def parseconfig(config):
3310 """parse the --config options from the command line"""
3341 """parse the --config options from the command line"""
3311 parsed = []
3342 parsed = []
3312 for cfg in config:
3343 for cfg in config:
3313 try:
3344 try:
3314 name, value = cfg.split('=', 1)
3345 name, value = cfg.split('=', 1)
3315 section, name = name.split('.', 1)
3346 section, name = name.split('.', 1)
3316 if not section or not name:
3347 if not section or not name:
3317 raise IndexError
3348 raise IndexError
3318 parsed.append((section, name, value))
3349 parsed.append((section, name, value))
3319 except (IndexError, ValueError):
3350 except (IndexError, ValueError):
3320 raise util.Abort(_('malformed --config option: %s') % cfg)
3351 raise util.Abort(_('malformed --config option: %s') % cfg)
3321 return parsed
3352 return parsed
3322
3353
3323 def dispatch(args):
3354 def dispatch(args):
3324 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
3355 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
3325 num = getattr(signal, name, None)
3356 num = getattr(signal, name, None)
3326 if num: signal.signal(num, catchterm)
3357 if num: signal.signal(num, catchterm)
3327
3358
3328 try:
3359 try:
3329 u = ui.ui(traceback='--traceback' in sys.argv[1:])
3360 u = ui.ui(traceback='--traceback' in sys.argv[1:])
3330 except util.Abort, inst:
3361 except util.Abort, inst:
3331 sys.stderr.write(_("abort: %s\n") % inst)
3362 sys.stderr.write(_("abort: %s\n") % inst)
3332 return -1
3363 return -1
3333
3364
3334 load_extensions(u)
3365 load_extensions(u)
3335 u.addreadhook(load_extensions)
3366 u.addreadhook(load_extensions)
3336
3367
3337 try:
3368 try:
3338 cmd, func, args, options, cmdoptions = parse(u, args)
3369 cmd, func, args, options, cmdoptions = parse(u, args)
3339 if options["time"]:
3370 if options["time"]:
3340 def get_times():
3371 def get_times():
3341 t = os.times()
3372 t = os.times()
3342 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
3373 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
3343 t = (t[0], t[1], t[2], t[3], time.clock())
3374 t = (t[0], t[1], t[2], t[3], time.clock())
3344 return t
3375 return t
3345 s = get_times()
3376 s = get_times()
3346 def print_time():
3377 def print_time():
3347 t = get_times()
3378 t = get_times()
3348 u.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
3379 u.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
3349 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
3380 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
3350 atexit.register(print_time)
3381 atexit.register(print_time)
3351
3382
3352 # enter the debugger before command execution
3383 # enter the debugger before command execution
3353 if options['debugger']:
3384 if options['debugger']:
3354 pdb.set_trace()
3385 pdb.set_trace()
3355
3386
3356 try:
3387 try:
3357 if options['cwd']:
3388 if options['cwd']:
3358 try:
3389 try:
3359 os.chdir(options['cwd'])
3390 os.chdir(options['cwd'])
3360 except OSError, inst:
3391 except OSError, inst:
3361 raise util.Abort('%s: %s' %
3392 raise util.Abort('%s: %s' %
3362 (options['cwd'], inst.strerror))
3393 (options['cwd'], inst.strerror))
3363
3394
3364 u.updateopts(options["verbose"], options["debug"], options["quiet"],
3395 u.updateopts(options["verbose"], options["debug"], options["quiet"],
3365 not options["noninteractive"], options["traceback"],
3396 not options["noninteractive"], options["traceback"],
3366 parseconfig(options["config"]))
3397 parseconfig(options["config"]))
3367
3398
3368 path = u.expandpath(options["repository"]) or ""
3399 path = u.expandpath(options["repository"]) or ""
3369 repo = path and hg.repository(u, path=path) or None
3400 repo = path and hg.repository(u, path=path) or None
3370 if repo and not repo.local():
3401 if repo and not repo.local():
3371 raise util.Abort(_("repository '%s' is not local") % path)
3402 raise util.Abort(_("repository '%s' is not local") % path)
3372
3403
3373 if options['help']:
3404 if options['help']:
3374 return help_(u, cmd, options['version'])
3405 return help_(u, cmd, options['version'])
3375 elif options['version']:
3406 elif options['version']:
3376 return show_version(u)
3407 return show_version(u)
3377 elif not cmd:
3408 elif not cmd:
3378 return help_(u, 'shortlist')
3409 return help_(u, 'shortlist')
3379
3410
3380 if cmd not in norepo.split():
3411 if cmd not in norepo.split():
3381 try:
3412 try:
3382 if not repo:
3413 if not repo:
3383 repo = hg.repository(u, path=path)
3414 repo = hg.repository(u, path=path)
3384 u = repo.ui
3415 u = repo.ui
3385 for name in external.itervalues():
3416 for name in external.itervalues():
3386 mod = sys.modules[name]
3417 mod = sys.modules[name]
3387 if hasattr(mod, 'reposetup'):
3418 if hasattr(mod, 'reposetup'):
3388 mod.reposetup(u, repo)
3419 mod.reposetup(u, repo)
3389 hg.repo_setup_hooks.append(mod.reposetup)
3420 hg.repo_setup_hooks.append(mod.reposetup)
3390 except hg.RepoError:
3421 except hg.RepoError:
3391 if cmd not in optionalrepo.split():
3422 if cmd not in optionalrepo.split():
3392 raise
3423 raise
3393 d = lambda: func(u, repo, *args, **cmdoptions)
3424 d = lambda: func(u, repo, *args, **cmdoptions)
3394 else:
3425 else:
3395 d = lambda: func(u, *args, **cmdoptions)
3426 d = lambda: func(u, *args, **cmdoptions)
3396
3427
3397 try:
3428 try:
3398 if options['profile']:
3429 if options['profile']:
3399 import hotshot, hotshot.stats
3430 import hotshot, hotshot.stats
3400 prof = hotshot.Profile("hg.prof")
3431 prof = hotshot.Profile("hg.prof")
3401 try:
3432 try:
3402 try:
3433 try:
3403 return prof.runcall(d)
3434 return prof.runcall(d)
3404 except:
3435 except:
3405 try:
3436 try:
3406 u.warn(_('exception raised - generating '
3437 u.warn(_('exception raised - generating '
3407 'profile anyway\n'))
3438 'profile anyway\n'))
3408 except:
3439 except:
3409 pass
3440 pass
3410 raise
3441 raise
3411 finally:
3442 finally:
3412 prof.close()
3443 prof.close()
3413 stats = hotshot.stats.load("hg.prof")
3444 stats = hotshot.stats.load("hg.prof")
3414 stats.strip_dirs()
3445 stats.strip_dirs()
3415 stats.sort_stats('time', 'calls')
3446 stats.sort_stats('time', 'calls')
3416 stats.print_stats(40)
3447 stats.print_stats(40)
3417 elif options['lsprof']:
3448 elif options['lsprof']:
3418 try:
3449 try:
3419 from mercurial import lsprof
3450 from mercurial import lsprof
3420 except ImportError:
3451 except ImportError:
3421 raise util.Abort(_(
3452 raise util.Abort(_(
3422 'lsprof not available - install from '
3453 'lsprof not available - install from '
3423 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
3454 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
3424 p = lsprof.Profiler()
3455 p = lsprof.Profiler()
3425 p.enable(subcalls=True)
3456 p.enable(subcalls=True)
3426 try:
3457 try:
3427 return d()
3458 return d()
3428 finally:
3459 finally:
3429 p.disable()
3460 p.disable()
3430 stats = lsprof.Stats(p.getstats())
3461 stats = lsprof.Stats(p.getstats())
3431 stats.sort()
3462 stats.sort()
3432 stats.pprint(top=10, file=sys.stderr, climit=5)
3463 stats.pprint(top=10, file=sys.stderr, climit=5)
3433 else:
3464 else:
3434 return d()
3465 return d()
3435 finally:
3466 finally:
3436 u.flush()
3467 u.flush()
3437 except:
3468 except:
3438 # enter the debugger when we hit an exception
3469 # enter the debugger when we hit an exception
3439 if options['debugger']:
3470 if options['debugger']:
3440 pdb.post_mortem(sys.exc_info()[2])
3471 pdb.post_mortem(sys.exc_info()[2])
3441 u.print_exc()
3472 u.print_exc()
3442 raise
3473 raise
3443 except ParseError, inst:
3474 except ParseError, inst:
3444 if inst.args[0]:
3475 if inst.args[0]:
3445 u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
3476 u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
3446 help_(u, inst.args[0])
3477 help_(u, inst.args[0])
3447 else:
3478 else:
3448 u.warn(_("hg: %s\n") % inst.args[1])
3479 u.warn(_("hg: %s\n") % inst.args[1])
3449 help_(u, 'shortlist')
3480 help_(u, 'shortlist')
3450 except AmbiguousCommand, inst:
3481 except AmbiguousCommand, inst:
3451 u.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
3482 u.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
3452 (inst.args[0], " ".join(inst.args[1])))
3483 (inst.args[0], " ".join(inst.args[1])))
3453 except UnknownCommand, inst:
3484 except UnknownCommand, inst:
3454 u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
3485 u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
3455 help_(u, 'shortlist')
3486 help_(u, 'shortlist')
3456 except hg.RepoError, inst:
3487 except hg.RepoError, inst:
3457 u.warn(_("abort: %s!\n") % inst)
3488 u.warn(_("abort: %s!\n") % inst)
3458 except lock.LockHeld, inst:
3489 except lock.LockHeld, inst:
3459 if inst.errno == errno.ETIMEDOUT:
3490 if inst.errno == errno.ETIMEDOUT:
3460 reason = _('timed out waiting for lock held by %s') % inst.locker
3491 reason = _('timed out waiting for lock held by %s') % inst.locker
3461 else:
3492 else:
3462 reason = _('lock held by %s') % inst.locker
3493 reason = _('lock held by %s') % inst.locker
3463 u.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
3494 u.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
3464 except lock.LockUnavailable, inst:
3495 except lock.LockUnavailable, inst:
3465 u.warn(_("abort: could not lock %s: %s\n") %
3496 u.warn(_("abort: could not lock %s: %s\n") %
3466 (inst.desc or inst.filename, inst.strerror))
3497 (inst.desc or inst.filename, inst.strerror))
3467 except revlog.RevlogError, inst:
3498 except revlog.RevlogError, inst:
3468 u.warn(_("abort: %s!\n") % inst)
3499 u.warn(_("abort: %s!\n") % inst)
3469 except util.SignalInterrupt:
3500 except util.SignalInterrupt:
3470 u.warn(_("killed!\n"))
3501 u.warn(_("killed!\n"))
3471 except KeyboardInterrupt:
3502 except KeyboardInterrupt:
3472 try:
3503 try:
3473 u.warn(_("interrupted!\n"))
3504 u.warn(_("interrupted!\n"))
3474 except IOError, inst:
3505 except IOError, inst:
3475 if inst.errno == errno.EPIPE:
3506 if inst.errno == errno.EPIPE:
3476 if u.debugflag:
3507 if u.debugflag:
3477 u.warn(_("\nbroken pipe\n"))
3508 u.warn(_("\nbroken pipe\n"))
3478 else:
3509 else:
3479 raise
3510 raise
3480 except IOError, inst:
3511 except IOError, inst:
3481 if hasattr(inst, "code"):
3512 if hasattr(inst, "code"):
3482 u.warn(_("abort: %s\n") % inst)
3513 u.warn(_("abort: %s\n") % inst)
3483 elif hasattr(inst, "reason"):
3514 elif hasattr(inst, "reason"):
3484 u.warn(_("abort: error: %s\n") % inst.reason[1])
3515 u.warn(_("abort: error: %s\n") % inst.reason[1])
3485 elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
3516 elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
3486 if u.debugflag:
3517 if u.debugflag:
3487 u.warn(_("broken pipe\n"))
3518 u.warn(_("broken pipe\n"))
3488 elif getattr(inst, "strerror", None):
3519 elif getattr(inst, "strerror", None):
3489 if getattr(inst, "filename", None):
3520 if getattr(inst, "filename", None):
3490 u.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
3521 u.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
3491 else:
3522 else:
3492 u.warn(_("abort: %s\n") % inst.strerror)
3523 u.warn(_("abort: %s\n") % inst.strerror)
3493 else:
3524 else:
3494 raise
3525 raise
3495 except OSError, inst:
3526 except OSError, inst:
3496 if getattr(inst, "filename", None):
3527 if getattr(inst, "filename", None):
3497 u.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
3528 u.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
3498 else:
3529 else:
3499 u.warn(_("abort: %s\n") % inst.strerror)
3530 u.warn(_("abort: %s\n") % inst.strerror)
3500 except util.Abort, inst:
3531 except util.Abort, inst:
3501 u.warn(_("abort: %s\n") % inst)
3532 u.warn(_("abort: %s\n") % inst)
3502 except TypeError, inst:
3533 except TypeError, inst:
3503 # was this an argument error?
3534 # was this an argument error?
3504 tb = traceback.extract_tb(sys.exc_info()[2])
3535 tb = traceback.extract_tb(sys.exc_info()[2])
3505 if len(tb) > 2: # no
3536 if len(tb) > 2: # no
3506 raise
3537 raise
3507 u.debug(inst, "\n")
3538 u.debug(inst, "\n")
3508 u.warn(_("%s: invalid arguments\n") % cmd)
3539 u.warn(_("%s: invalid arguments\n") % cmd)
3509 help_(u, cmd)
3540 help_(u, cmd)
3510 except SystemExit, inst:
3541 except SystemExit, inst:
3511 # Commands shouldn't sys.exit directly, but give a return code.
3542 # Commands shouldn't sys.exit directly, but give a return code.
3512 # Just in case catch this and and pass exit code to caller.
3543 # Just in case catch this and and pass exit code to caller.
3513 return inst.code
3544 return inst.code
3514 except:
3545 except:
3515 u.warn(_("** unknown exception encountered, details follow\n"))
3546 u.warn(_("** unknown exception encountered, details follow\n"))
3516 u.warn(_("** report bug details to "
3547 u.warn(_("** report bug details to "
3517 "http://www.selenic.com/mercurial/bts\n"))
3548 "http://www.selenic.com/mercurial/bts\n"))
3518 u.warn(_("** or mercurial@selenic.com\n"))
3549 u.warn(_("** or mercurial@selenic.com\n"))
3519 u.warn(_("** Mercurial Distributed SCM (version %s)\n")
3550 u.warn(_("** Mercurial Distributed SCM (version %s)\n")
3520 % version.get_version())
3551 % version.get_version())
3521 raise
3552 raise
3522
3553
3523 return -1
3554 return -1
@@ -1,150 +1,152 b''
1 % Show all commands except debug commands
1 % Show all commands except debug commands
2 add
2 add
3 addremove
3 addremove
4 annotate
4 annotate
5 archive
5 archive
6 backout
6 backout
7 branch
8 branches
7 bundle
9 bundle
8 cat
10 cat
9 clone
11 clone
10 commit
12 commit
11 copy
13 copy
12 diff
14 diff
13 export
15 export
14 grep
16 grep
15 heads
17 heads
16 help
18 help
17 identify
19 identify
18 import
20 import
19 incoming
21 incoming
20 init
22 init
21 locate
23 locate
22 log
24 log
23 manifest
25 manifest
24 merge
26 merge
25 outgoing
27 outgoing
26 parents
28 parents
27 paths
29 paths
28 pull
30 pull
29 push
31 push
30 recover
32 recover
31 remove
33 remove
32 rename
34 rename
33 revert
35 revert
34 rollback
36 rollback
35 root
37 root
36 serve
38 serve
37 showconfig
39 showconfig
38 status
40 status
39 tag
41 tag
40 tags
42 tags
41 tip
43 tip
42 unbundle
44 unbundle
43 update
45 update
44 verify
46 verify
45 version
47 version
46
48
47 % Show all commands that start with "a"
49 % Show all commands that start with "a"
48 add
50 add
49 addremove
51 addremove
50 annotate
52 annotate
51 archive
53 archive
52
54
53 % Do not show debug commands if there are other candidates
55 % Do not show debug commands if there are other candidates
54 diff
56 diff
55
57
56 % Show debug commands if there are no other candidates
58 % Show debug commands if there are no other candidates
57 debugancestor
59 debugancestor
58 debugcheckstate
60 debugcheckstate
59 debugcomplete
61 debugcomplete
60 debugconfig
62 debugconfig
61 debugdata
63 debugdata
62 debugforget
64 debugforget
63 debugindex
65 debugindex
64 debugindexdot
66 debugindexdot
65 debugrawcommit
67 debugrawcommit
66 debugrebuildstate
68 debugrebuildstate
67 debugrename
69 debugrename
68 debugsetparents
70 debugsetparents
69 debugstate
71 debugstate
70 debugundo
72 debugundo
71 debugwalk
73 debugwalk
72
74
73 % Do not show the alias of a debug command if there are other candidates
75 % Do not show the alias of a debug command if there are other candidates
74 % (this should hide rawcommit)
76 % (this should hide rawcommit)
75 recover
77 recover
76 remove
78 remove
77 rename
79 rename
78 revert
80 revert
79 rollback
81 rollback
80 root
82 root
81
83
82 % Show the alias of a debug command if there are no other candidates
84 % Show the alias of a debug command if there are no other candidates
83 rawcommit
85 rawcommit
84
86
85 % Show the global options
87 % Show the global options
86 --config
88 --config
87 --cwd
89 --cwd
88 --debug
90 --debug
89 --debugger
91 --debugger
90 --help
92 --help
91 --lsprof
93 --lsprof
92 --noninteractive
94 --noninteractive
93 --profile
95 --profile
94 --quiet
96 --quiet
95 --repository
97 --repository
96 --time
98 --time
97 --traceback
99 --traceback
98 --verbose
100 --verbose
99 --version
101 --version
100 -R
102 -R
101 -h
103 -h
102 -q
104 -q
103 -v
105 -v
104 -y
106 -y
105
107
106 % Show the options for the "serve" command
108 % Show the options for the "serve" command
107 --accesslog
109 --accesslog
108 --address
110 --address
109 --config
111 --config
110 --cwd
112 --cwd
111 --daemon
113 --daemon
112 --daemon-pipefds
114 --daemon-pipefds
113 --debug
115 --debug
114 --debugger
116 --debugger
115 --errorlog
117 --errorlog
116 --help
118 --help
117 --ipv6
119 --ipv6
118 --lsprof
120 --lsprof
119 --name
121 --name
120 --noninteractive
122 --noninteractive
121 --pid-file
123 --pid-file
122 --port
124 --port
123 --profile
125 --profile
124 --quiet
126 --quiet
125 --repository
127 --repository
126 --stdio
128 --stdio
127 --style
129 --style
128 --templates
130 --templates
129 --time
131 --time
130 --traceback
132 --traceback
131 --verbose
133 --verbose
132 --version
134 --version
133 --webdir-conf
135 --webdir-conf
134 -6
136 -6
135 -A
137 -A
136 -E
138 -E
137 -R
139 -R
138 -a
140 -a
139 -d
141 -d
140 -h
142 -h
141 -n
143 -n
142 -p
144 -p
143 -q
145 -q
144 -t
146 -t
145 -v
147 -v
146 -y
148 -y
147
149
148 % Show an error if we use --options with an ambiguous abbreviation
150 % Show an error if we use --options with an ambiguous abbreviation
149 hg: command 's' is ambiguous:
151 hg: command 's' is ambiguous:
150 serve showconfig status
152 serve showconfig status
@@ -1,210 +1,214 b''
1 adding a
1 adding a
2 adding b
2 adding b
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 pulling from ../b
4 pulling from ../b
5 searching for changes
5 searching for changes
6 warning: repository is unrelated
6 warning: repository is unrelated
7 adding changesets
7 adding changesets
8 adding manifests
8 adding manifests
9 adding file changes
9 adding file changes
10 added 1 changesets with 1 changes to 1 files (+1 heads)
10 added 1 changesets with 1 changes to 1 files (+1 heads)
11 (run 'hg heads' to see heads, 'hg merge' to merge)
11 (run 'hg heads' to see heads, 'hg merge' to merge)
12 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 (branch merge, don't forget to commit)
13 (branch merge, don't forget to commit)
14 %% -R/--repository
14 %% -R/--repository
15 changeset: 0:8580ff50825a
15 changeset: 0:8580ff50825a
16 tag: tip
16 tag: tip
17 user: test
17 user: test
18 date: Thu Jan 01 00:00:01 1970 +0000
18 date: Thu Jan 01 00:00:01 1970 +0000
19 summary: a
19 summary: a
20
20
21 changeset: 0:b6c483daf290
21 changeset: 0:b6c483daf290
22 tag: tip
22 tag: tip
23 user: test
23 user: test
24 date: Thu Jan 01 00:00:01 1970 +0000
24 date: Thu Jan 01 00:00:01 1970 +0000
25 summary: b
25 summary: b
26
26
27 %% abbrev of long option
27 %% abbrev of long option
28 changeset: 1:b6c483daf290
28 changeset: 1:b6c483daf290
29 tag: tip
29 tag: tip
30 user: test
30 user: test
31 date: Thu Jan 01 00:00:01 1970 +0000
31 date: Thu Jan 01 00:00:01 1970 +0000
32 summary: b
32 summary: b
33
33
34 %% --cwd
34 %% --cwd
35 changeset: 0:8580ff50825a
35 changeset: 0:8580ff50825a
36 tag: tip
36 tag: tip
37 user: test
37 user: test
38 date: Thu Jan 01 00:00:01 1970 +0000
38 date: Thu Jan 01 00:00:01 1970 +0000
39 summary: a
39 summary: a
40
40
41 %% -y/--noninteractive - just be sure it is parsed
41 %% -y/--noninteractive - just be sure it is parsed
42 0:8580ff50825a
42 0:8580ff50825a
43 0:8580ff50825a
43 0:8580ff50825a
44 %% -q/--quiet
44 %% -q/--quiet
45 0:8580ff50825a
45 0:8580ff50825a
46 0:b6c483daf290
46 0:b6c483daf290
47 0:8580ff50825a
47 0:8580ff50825a
48 1:b6c483daf290
48 1:b6c483daf290
49 %% -v/--verbose
49 %% -v/--verbose
50 changeset: 1:b6c483daf290
50 changeset: 1:b6c483daf290
51 tag: tip
51 tag: tip
52 user: test
52 user: test
53 date: Thu Jan 01 00:00:01 1970 +0000
53 date: Thu Jan 01 00:00:01 1970 +0000
54 files: b
54 files: b
55 description:
55 description:
56 b
56 b
57
57
58
58
59 changeset: 0:8580ff50825a
59 changeset: 0:8580ff50825a
60 user: test
60 user: test
61 date: Thu Jan 01 00:00:01 1970 +0000
61 date: Thu Jan 01 00:00:01 1970 +0000
62 files: a
62 files: a
63 description:
63 description:
64 a
64 a
65
65
66
66
67 changeset: 0:b6c483daf290
67 changeset: 0:b6c483daf290
68 tag: tip
68 tag: tip
69 user: test
69 user: test
70 date: Thu Jan 01 00:00:01 1970 +0000
70 date: Thu Jan 01 00:00:01 1970 +0000
71 files: b
71 files: b
72 description:
72 description:
73 b
73 b
74
74
75
75
76 %% --config
76 %% --config
77 quuxfoo
77 quuxfoo
78 abort: malformed --config option:
78 abort: malformed --config option:
79 abort: malformed --config option: a.b
79 abort: malformed --config option: a.b
80 abort: malformed --config option: a
80 abort: malformed --config option: a
81 abort: malformed --config option: a.=
81 abort: malformed --config option: a.=
82 abort: malformed --config option: .b=
82 abort: malformed --config option: .b=
83 %% --debug
83 %% --debug
84 changeset: 1:b6c483daf2907ce5825c0bb50f5716226281cc1a
84 changeset: 1:b6c483daf2907ce5825c0bb50f5716226281cc1a
85 tag: tip
85 tag: tip
86 parent: -1:0000000000000000000000000000000000000000
86 parent: -1:0000000000000000000000000000000000000000
87 parent: -1:0000000000000000000000000000000000000000
87 parent: -1:0000000000000000000000000000000000000000
88 manifest: 1:23226e7a252cacdc2d99e4fbdc3653441056de49
88 manifest: 1:23226e7a252cacdc2d99e4fbdc3653441056de49
89 user: test
89 user: test
90 date: Thu Jan 01 00:00:01 1970 +0000
90 date: Thu Jan 01 00:00:01 1970 +0000
91 files+: b
91 files+: b
92 description:
92 description:
93 b
93 b
94
94
95
95
96 changeset: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
96 changeset: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
97 parent: -1:0000000000000000000000000000000000000000
97 parent: -1:0000000000000000000000000000000000000000
98 parent: -1:0000000000000000000000000000000000000000
98 parent: -1:0000000000000000000000000000000000000000
99 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
99 manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
100 user: test
100 user: test
101 date: Thu Jan 01 00:00:01 1970 +0000
101 date: Thu Jan 01 00:00:01 1970 +0000
102 files+: a
102 files+: a
103 description:
103 description:
104 a
104 a
105
105
106
106
107 %% --traceback
107 %% --traceback
108 Traceback (most recent call last):
108 Traceback (most recent call last):
109 %% --time
109 %% --time
110 Time: real x.x secs (user x.x+x.x sys x.x+x.x)
110 Time: real x.x secs (user x.x+x.x sys x.x+x.x)
111 %% --version
111 %% --version
112 Mercurial Distributed SCM (version xxx)
112 Mercurial Distributed SCM (version xxx)
113 %% -h/--help
113 %% -h/--help
114 Mercurial Distributed SCM
114 Mercurial Distributed SCM
115
115
116 list of commands (use "hg help -v" to show aliases and global options):
116 list of commands (use "hg help -v" to show aliases and global options):
117
117
118 add add the specified files on the next commit
118 add add the specified files on the next commit
119 addremove add all new files, delete all missing files
119 addremove add all new files, delete all missing files
120 annotate show changeset information per file line
120 annotate show changeset information per file line
121 archive create unversioned archive of a repository revision
121 archive create unversioned archive of a repository revision
122 backout reverse effect of earlier changeset
122 backout reverse effect of earlier changeset
123 branch set or show the current branch name
124 branches list repository named branches
123 bundle create a changegroup file
125 bundle create a changegroup file
124 cat output the latest or given revisions of files
126 cat output the latest or given revisions of files
125 clone make a copy of an existing repository
127 clone make a copy of an existing repository
126 commit commit the specified files or all outstanding changes
128 commit commit the specified files or all outstanding changes
127 copy mark files as copied for the next commit
129 copy mark files as copied for the next commit
128 diff diff repository (or selected files)
130 diff diff repository (or selected files)
129 export dump the header and diffs for one or more changesets
131 export dump the header and diffs for one or more changesets
130 grep search for a pattern in specified files and revisions
132 grep search for a pattern in specified files and revisions
131 heads show current repository heads
133 heads show current repository heads
132 help show help for a command, extension, or list of commands
134 help show help for a command, extension, or list of commands
133 identify print information about the working copy
135 identify print information about the working copy
134 import import an ordered set of patches
136 import import an ordered set of patches
135 incoming show new changesets found in source
137 incoming show new changesets found in source
136 init create a new repository in the given directory
138 init create a new repository in the given directory
137 locate locate files matching specific patterns
139 locate locate files matching specific patterns
138 log show revision history of entire repository or files
140 log show revision history of entire repository or files
139 manifest output the latest or given revision of the project manifest
141 manifest output the latest or given revision of the project manifest
140 merge Merge working directory with another revision
142 merge Merge working directory with another revision
141 outgoing show changesets not found in destination
143 outgoing show changesets not found in destination
142 parents show the parents of the working dir or revision
144 parents show the parents of the working dir or revision
143 paths show definition of symbolic path names
145 paths show definition of symbolic path names
144 pull pull changes from the specified source
146 pull pull changes from the specified source
145 push push changes to the specified destination
147 push push changes to the specified destination
146 recover roll back an interrupted transaction
148 recover roll back an interrupted transaction
147 remove remove the specified files on the next commit
149 remove remove the specified files on the next commit
148 rename rename files; equivalent of copy + remove
150 rename rename files; equivalent of copy + remove
149 revert revert files or dirs to their states as of some revision
151 revert revert files or dirs to their states as of some revision
150 rollback roll back the last transaction in this repository
152 rollback roll back the last transaction in this repository
151 root print the root (top) of the current working dir
153 root print the root (top) of the current working dir
152 serve export the repository via HTTP
154 serve export the repository via HTTP
153 showconfig show combined config settings from all hgrc files
155 showconfig show combined config settings from all hgrc files
154 status show changed files in the working directory
156 status show changed files in the working directory
155 tag add a tag for the current tip or a given revision
157 tag add a tag for the current tip or a given revision
156 tags list repository tags
158 tags list repository tags
157 tip show the tip revision
159 tip show the tip revision
158 unbundle apply a changegroup file
160 unbundle apply a changegroup file
159 update update or merge working directory
161 update update or merge working directory
160 verify verify the integrity of the repository
162 verify verify the integrity of the repository
161 version output version and copyright information
163 version output version and copyright information
162 Mercurial Distributed SCM
164 Mercurial Distributed SCM
163
165
164 list of commands (use "hg help -v" to show aliases and global options):
166 list of commands (use "hg help -v" to show aliases and global options):
165
167
166 add add the specified files on the next commit
168 add add the specified files on the next commit
167 addremove add all new files, delete all missing files
169 addremove add all new files, delete all missing files
168 annotate show changeset information per file line
170 annotate show changeset information per file line
169 archive create unversioned archive of a repository revision
171 archive create unversioned archive of a repository revision
170 backout reverse effect of earlier changeset
172 backout reverse effect of earlier changeset
173 branch set or show the current branch name
174 branches list repository named branches
171 bundle create a changegroup file
175 bundle create a changegroup file
172 cat output the latest or given revisions of files
176 cat output the latest or given revisions of files
173 clone make a copy of an existing repository
177 clone make a copy of an existing repository
174 commit commit the specified files or all outstanding changes
178 commit commit the specified files or all outstanding changes
175 copy mark files as copied for the next commit
179 copy mark files as copied for the next commit
176 diff diff repository (or selected files)
180 diff diff repository (or selected files)
177 export dump the header and diffs for one or more changesets
181 export dump the header and diffs for one or more changesets
178 grep search for a pattern in specified files and revisions
182 grep search for a pattern in specified files and revisions
179 heads show current repository heads
183 heads show current repository heads
180 help show help for a command, extension, or list of commands
184 help show help for a command, extension, or list of commands
181 identify print information about the working copy
185 identify print information about the working copy
182 import import an ordered set of patches
186 import import an ordered set of patches
183 incoming show new changesets found in source
187 incoming show new changesets found in source
184 init create a new repository in the given directory
188 init create a new repository in the given directory
185 locate locate files matching specific patterns
189 locate locate files matching specific patterns
186 log show revision history of entire repository or files
190 log show revision history of entire repository or files
187 manifest output the latest or given revision of the project manifest
191 manifest output the latest or given revision of the project manifest
188 merge Merge working directory with another revision
192 merge Merge working directory with another revision
189 outgoing show changesets not found in destination
193 outgoing show changesets not found in destination
190 parents show the parents of the working dir or revision
194 parents show the parents of the working dir or revision
191 paths show definition of symbolic path names
195 paths show definition of symbolic path names
192 pull pull changes from the specified source
196 pull pull changes from the specified source
193 push push changes to the specified destination
197 push push changes to the specified destination
194 recover roll back an interrupted transaction
198 recover roll back an interrupted transaction
195 remove remove the specified files on the next commit
199 remove remove the specified files on the next commit
196 rename rename files; equivalent of copy + remove
200 rename rename files; equivalent of copy + remove
197 revert revert files or dirs to their states as of some revision
201 revert revert files or dirs to their states as of some revision
198 rollback roll back the last transaction in this repository
202 rollback roll back the last transaction in this repository
199 root print the root (top) of the current working dir
203 root print the root (top) of the current working dir
200 serve export the repository via HTTP
204 serve export the repository via HTTP
201 showconfig show combined config settings from all hgrc files
205 showconfig show combined config settings from all hgrc files
202 status show changed files in the working directory
206 status show changed files in the working directory
203 tag add a tag for the current tip or a given revision
207 tag add a tag for the current tip or a given revision
204 tags list repository tags
208 tags list repository tags
205 tip show the tip revision
209 tip show the tip revision
206 unbundle apply a changegroup file
210 unbundle apply a changegroup file
207 update update or merge working directory
211 update update or merge working directory
208 verify verify the integrity of the repository
212 verify verify the integrity of the repository
209 version output version and copyright information
213 version output version and copyright information
210 %% not tested: --debugger
214 %% not tested: --debugger
@@ -1,273 +1,277 b''
1 Mercurial Distributed SCM
1 Mercurial Distributed SCM
2
2
3 basic commands (use "hg help" for the full list or option "-v" for details):
3 basic commands (use "hg help" for the full list or option "-v" for details):
4
4
5 add add the specified files on the next commit
5 add add the specified files on the next commit
6 annotate show changeset information per file line
6 annotate show changeset information per file line
7 clone make a copy of an existing repository
7 clone make a copy of an existing repository
8 commit commit the specified files or all outstanding changes
8 commit commit the specified files or all outstanding changes
9 diff diff repository (or selected files)
9 diff diff repository (or selected files)
10 export dump the header and diffs for one or more changesets
10 export dump the header and diffs for one or more changesets
11 init create a new repository in the given directory
11 init create a new repository in the given directory
12 log show revision history of entire repository or files
12 log show revision history of entire repository or files
13 parents show the parents of the working dir or revision
13 parents show the parents of the working dir or revision
14 pull pull changes from the specified source
14 pull pull changes from the specified source
15 push push changes to the specified destination
15 push push changes to the specified destination
16 remove remove the specified files on the next commit
16 remove remove the specified files on the next commit
17 revert revert files or dirs to their states as of some revision
17 revert revert files or dirs to their states as of some revision
18 serve export the repository via HTTP
18 serve export the repository via HTTP
19 status show changed files in the working directory
19 status show changed files in the working directory
20 update update or merge working directory
20 update update or merge working directory
21 add add the specified files on the next commit
21 add add the specified files on the next commit
22 annotate show changeset information per file line
22 annotate show changeset information per file line
23 clone make a copy of an existing repository
23 clone make a copy of an existing repository
24 commit commit the specified files or all outstanding changes
24 commit commit the specified files or all outstanding changes
25 diff diff repository (or selected files)
25 diff diff repository (or selected files)
26 export dump the header and diffs for one or more changesets
26 export dump the header and diffs for one or more changesets
27 init create a new repository in the given directory
27 init create a new repository in the given directory
28 log show revision history of entire repository or files
28 log show revision history of entire repository or files
29 parents show the parents of the working dir or revision
29 parents show the parents of the working dir or revision
30 pull pull changes from the specified source
30 pull pull changes from the specified source
31 push push changes to the specified destination
31 push push changes to the specified destination
32 remove remove the specified files on the next commit
32 remove remove the specified files on the next commit
33 revert revert files or dirs to their states as of some revision
33 revert revert files or dirs to their states as of some revision
34 serve export the repository via HTTP
34 serve export the repository via HTTP
35 status show changed files in the working directory
35 status show changed files in the working directory
36 update update or merge working directory
36 update update or merge working directory
37 Mercurial Distributed SCM
37 Mercurial Distributed SCM
38
38
39 list of commands (use "hg help -v" to show aliases and global options):
39 list of commands (use "hg help -v" to show aliases and global options):
40
40
41 add add the specified files on the next commit
41 add add the specified files on the next commit
42 addremove add all new files, delete all missing files
42 addremove add all new files, delete all missing files
43 annotate show changeset information per file line
43 annotate show changeset information per file line
44 archive create unversioned archive of a repository revision
44 archive create unversioned archive of a repository revision
45 backout reverse effect of earlier changeset
45 backout reverse effect of earlier changeset
46 branch set or show the current branch name
47 branches list repository named branches
46 bundle create a changegroup file
48 bundle create a changegroup file
47 cat output the latest or given revisions of files
49 cat output the latest or given revisions of files
48 clone make a copy of an existing repository
50 clone make a copy of an existing repository
49 commit commit the specified files or all outstanding changes
51 commit commit the specified files or all outstanding changes
50 copy mark files as copied for the next commit
52 copy mark files as copied for the next commit
51 diff diff repository (or selected files)
53 diff diff repository (or selected files)
52 export dump the header and diffs for one or more changesets
54 export dump the header and diffs for one or more changesets
53 grep search for a pattern in specified files and revisions
55 grep search for a pattern in specified files and revisions
54 heads show current repository heads
56 heads show current repository heads
55 help show help for a command, extension, or list of commands
57 help show help for a command, extension, or list of commands
56 identify print information about the working copy
58 identify print information about the working copy
57 import import an ordered set of patches
59 import import an ordered set of patches
58 incoming show new changesets found in source
60 incoming show new changesets found in source
59 init create a new repository in the given directory
61 init create a new repository in the given directory
60 locate locate files matching specific patterns
62 locate locate files matching specific patterns
61 log show revision history of entire repository or files
63 log show revision history of entire repository or files
62 manifest output the latest or given revision of the project manifest
64 manifest output the latest or given revision of the project manifest
63 merge Merge working directory with another revision
65 merge Merge working directory with another revision
64 outgoing show changesets not found in destination
66 outgoing show changesets not found in destination
65 parents show the parents of the working dir or revision
67 parents show the parents of the working dir or revision
66 paths show definition of symbolic path names
68 paths show definition of symbolic path names
67 pull pull changes from the specified source
69 pull pull changes from the specified source
68 push push changes to the specified destination
70 push push changes to the specified destination
69 recover roll back an interrupted transaction
71 recover roll back an interrupted transaction
70 remove remove the specified files on the next commit
72 remove remove the specified files on the next commit
71 rename rename files; equivalent of copy + remove
73 rename rename files; equivalent of copy + remove
72 revert revert files or dirs to their states as of some revision
74 revert revert files or dirs to their states as of some revision
73 rollback roll back the last transaction in this repository
75 rollback roll back the last transaction in this repository
74 root print the root (top) of the current working dir
76 root print the root (top) of the current working dir
75 serve export the repository via HTTP
77 serve export the repository via HTTP
76 showconfig show combined config settings from all hgrc files
78 showconfig show combined config settings from all hgrc files
77 status show changed files in the working directory
79 status show changed files in the working directory
78 tag add a tag for the current tip or a given revision
80 tag add a tag for the current tip or a given revision
79 tags list repository tags
81 tags list repository tags
80 tip show the tip revision
82 tip show the tip revision
81 unbundle apply a changegroup file
83 unbundle apply a changegroup file
82 update update or merge working directory
84 update update or merge working directory
83 verify verify the integrity of the repository
85 verify verify the integrity of the repository
84 version output version and copyright information
86 version output version and copyright information
85 add add the specified files on the next commit
87 add add the specified files on the next commit
86 addremove add all new files, delete all missing files
88 addremove add all new files, delete all missing files
87 annotate show changeset information per file line
89 annotate show changeset information per file line
88 archive create unversioned archive of a repository revision
90 archive create unversioned archive of a repository revision
89 backout reverse effect of earlier changeset
91 backout reverse effect of earlier changeset
92 branch set or show the current branch name
93 branches list repository named branches
90 bundle create a changegroup file
94 bundle create a changegroup file
91 cat output the latest or given revisions of files
95 cat output the latest or given revisions of files
92 clone make a copy of an existing repository
96 clone make a copy of an existing repository
93 commit commit the specified files or all outstanding changes
97 commit commit the specified files or all outstanding changes
94 copy mark files as copied for the next commit
98 copy mark files as copied for the next commit
95 diff diff repository (or selected files)
99 diff diff repository (or selected files)
96 export dump the header and diffs for one or more changesets
100 export dump the header and diffs for one or more changesets
97 grep search for a pattern in specified files and revisions
101 grep search for a pattern in specified files and revisions
98 heads show current repository heads
102 heads show current repository heads
99 help show help for a command, extension, or list of commands
103 help show help for a command, extension, or list of commands
100 identify print information about the working copy
104 identify print information about the working copy
101 import import an ordered set of patches
105 import import an ordered set of patches
102 incoming show new changesets found in source
106 incoming show new changesets found in source
103 init create a new repository in the given directory
107 init create a new repository in the given directory
104 locate locate files matching specific patterns
108 locate locate files matching specific patterns
105 log show revision history of entire repository or files
109 log show revision history of entire repository or files
106 manifest output the latest or given revision of the project manifest
110 manifest output the latest or given revision of the project manifest
107 merge Merge working directory with another revision
111 merge Merge working directory with another revision
108 outgoing show changesets not found in destination
112 outgoing show changesets not found in destination
109 parents show the parents of the working dir or revision
113 parents show the parents of the working dir or revision
110 paths show definition of symbolic path names
114 paths show definition of symbolic path names
111 pull pull changes from the specified source
115 pull pull changes from the specified source
112 push push changes to the specified destination
116 push push changes to the specified destination
113 recover roll back an interrupted transaction
117 recover roll back an interrupted transaction
114 remove remove the specified files on the next commit
118 remove remove the specified files on the next commit
115 rename rename files; equivalent of copy + remove
119 rename rename files; equivalent of copy + remove
116 revert revert files or dirs to their states as of some revision
120 revert revert files or dirs to their states as of some revision
117 rollback roll back the last transaction in this repository
121 rollback roll back the last transaction in this repository
118 root print the root (top) of the current working dir
122 root print the root (top) of the current working dir
119 serve export the repository via HTTP
123 serve export the repository via HTTP
120 showconfig show combined config settings from all hgrc files
124 showconfig show combined config settings from all hgrc files
121 status show changed files in the working directory
125 status show changed files in the working directory
122 tag add a tag for the current tip or a given revision
126 tag add a tag for the current tip or a given revision
123 tags list repository tags
127 tags list repository tags
124 tip show the tip revision
128 tip show the tip revision
125 unbundle apply a changegroup file
129 unbundle apply a changegroup file
126 update update or merge working directory
130 update update or merge working directory
127 verify verify the integrity of the repository
131 verify verify the integrity of the repository
128 version output version and copyright information
132 version output version and copyright information
129 hg add [OPTION]... [FILE]...
133 hg add [OPTION]... [FILE]...
130
134
131 add the specified files on the next commit
135 add the specified files on the next commit
132
136
133 Schedule files to be version controlled and added to the repository.
137 Schedule files to be version controlled and added to the repository.
134
138
135 The files will be added to the repository at the next commit.
139 The files will be added to the repository at the next commit.
136
140
137 If no names are given, add all files in the repository.
141 If no names are given, add all files in the repository.
138
142
139 options:
143 options:
140
144
141 -I --include include names matching the given patterns
145 -I --include include names matching the given patterns
142 -X --exclude exclude names matching the given patterns
146 -X --exclude exclude names matching the given patterns
143 -n --dry-run do not perform actions, just print output
147 -n --dry-run do not perform actions, just print output
144 hg add: option --skjdfks not recognized
148 hg add: option --skjdfks not recognized
145 hg add [OPTION]... [FILE]...
149 hg add [OPTION]... [FILE]...
146
150
147 add the specified files on the next commit
151 add the specified files on the next commit
148
152
149 Schedule files to be version controlled and added to the repository.
153 Schedule files to be version controlled and added to the repository.
150
154
151 The files will be added to the repository at the next commit.
155 The files will be added to the repository at the next commit.
152
156
153 If no names are given, add all files in the repository.
157 If no names are given, add all files in the repository.
154
158
155 options:
159 options:
156
160
157 -I --include include names matching the given patterns
161 -I --include include names matching the given patterns
158 -X --exclude exclude names matching the given patterns
162 -X --exclude exclude names matching the given patterns
159 -n --dry-run do not perform actions, just print output
163 -n --dry-run do not perform actions, just print output
160 hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...
164 hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...
161
165
162 diff repository (or selected files)
166 diff repository (or selected files)
163
167
164 Show differences between revisions for the specified files.
168 Show differences between revisions for the specified files.
165
169
166 Differences between files are shown using the unified diff format.
170 Differences between files are shown using the unified diff format.
167
171
168 When two revision arguments are given, then changes are shown
172 When two revision arguments are given, then changes are shown
169 between those revisions. If only one revision is specified then
173 between those revisions. If only one revision is specified then
170 that revision is compared to the working directory, and, when no
174 that revision is compared to the working directory, and, when no
171 revisions are specified, the working directory files are compared
175 revisions are specified, the working directory files are compared
172 to its parent.
176 to its parent.
173
177
174 Without the -a option, diff will avoid generating diffs of files
178 Without the -a option, diff will avoid generating diffs of files
175 it detects as binary. With -a, diff will generate a diff anyway,
179 it detects as binary. With -a, diff will generate a diff anyway,
176 probably with undesirable results.
180 probably with undesirable results.
177
181
178 options:
182 options:
179
183
180 -r --rev revision
184 -r --rev revision
181 -a --text treat all files as text
185 -a --text treat all files as text
182 -p --show-function show which function each change is in
186 -p --show-function show which function each change is in
183 -g --git use git extended diff format
187 -g --git use git extended diff format
184 --nodates don't include dates in diff headers
188 --nodates don't include dates in diff headers
185 -w --ignore-all-space ignore white space when comparing lines
189 -w --ignore-all-space ignore white space when comparing lines
186 -b --ignore-space-change ignore changes in the amount of white space
190 -b --ignore-space-change ignore changes in the amount of white space
187 -B --ignore-blank-lines ignore changes whose lines are all blank
191 -B --ignore-blank-lines ignore changes whose lines are all blank
188 -I --include include names matching the given patterns
192 -I --include include names matching the given patterns
189 -X --exclude exclude names matching the given patterns
193 -X --exclude exclude names matching the given patterns
190 hg status [OPTION]... [FILE]...
194 hg status [OPTION]... [FILE]...
191
195
192 show changed files in the working directory
196 show changed files in the working directory
193
197
194 Show status of files in the repository. If names are given, only
198 Show status of files in the repository. If names are given, only
195 files that match are shown. Files that are clean or ignored, are
199 files that match are shown. Files that are clean or ignored, are
196 not listed unless -c (clean), -i (ignored) or -A is given.
200 not listed unless -c (clean), -i (ignored) or -A is given.
197
201
198 If one revision is given, it is used as the base revision.
202 If one revision is given, it is used as the base revision.
199 If two revisions are given, the difference between them is shown.
203 If two revisions are given, the difference between them is shown.
200
204
201 The codes used to show the status of files are:
205 The codes used to show the status of files are:
202 M = modified
206 M = modified
203 A = added
207 A = added
204 R = removed
208 R = removed
205 C = clean
209 C = clean
206 ! = deleted, but still tracked
210 ! = deleted, but still tracked
207 ? = not tracked
211 ? = not tracked
208 I = ignored (not shown by default)
212 I = ignored (not shown by default)
209 = the previous added file was copied from here
213 = the previous added file was copied from here
210
214
211 aliases: st
215 aliases: st
212
216
213 options:
217 options:
214
218
215 -A --all show status of all files
219 -A --all show status of all files
216 -m --modified show only modified files
220 -m --modified show only modified files
217 -a --added show only added files
221 -a --added show only added files
218 -r --removed show only removed files
222 -r --removed show only removed files
219 -d --deleted show only deleted (but tracked) files
223 -d --deleted show only deleted (but tracked) files
220 -c --clean show only files without changes
224 -c --clean show only files without changes
221 -u --unknown show only unknown (not tracked) files
225 -u --unknown show only unknown (not tracked) files
222 -i --ignored show ignored files
226 -i --ignored show ignored files
223 -n --no-status hide status prefix
227 -n --no-status hide status prefix
224 -C --copies show source of copied files
228 -C --copies show source of copied files
225 -0 --print0 end filenames with NUL, for use with xargs
229 -0 --print0 end filenames with NUL, for use with xargs
226 --rev show difference from revision
230 --rev show difference from revision
227 -I --include include names matching the given patterns
231 -I --include include names matching the given patterns
228 -X --exclude exclude names matching the given patterns
232 -X --exclude exclude names matching the given patterns
229 hg status [OPTION]... [FILE]...
233 hg status [OPTION]... [FILE]...
230
234
231 show changed files in the working directory
235 show changed files in the working directory
232 hg: unknown command 'foo'
236 hg: unknown command 'foo'
233 Mercurial Distributed SCM
237 Mercurial Distributed SCM
234
238
235 basic commands (use "hg help" for the full list or option "-v" for details):
239 basic commands (use "hg help" for the full list or option "-v" for details):
236
240
237 add add the specified files on the next commit
241 add add the specified files on the next commit
238 annotate show changeset information per file line
242 annotate show changeset information per file line
239 clone make a copy of an existing repository
243 clone make a copy of an existing repository
240 commit commit the specified files or all outstanding changes
244 commit commit the specified files or all outstanding changes
241 diff diff repository (or selected files)
245 diff diff repository (or selected files)
242 export dump the header and diffs for one or more changesets
246 export dump the header and diffs for one or more changesets
243 init create a new repository in the given directory
247 init create a new repository in the given directory
244 log show revision history of entire repository or files
248 log show revision history of entire repository or files
245 parents show the parents of the working dir or revision
249 parents show the parents of the working dir or revision
246 pull pull changes from the specified source
250 pull pull changes from the specified source
247 push push changes to the specified destination
251 push push changes to the specified destination
248 remove remove the specified files on the next commit
252 remove remove the specified files on the next commit
249 revert revert files or dirs to their states as of some revision
253 revert revert files or dirs to their states as of some revision
250 serve export the repository via HTTP
254 serve export the repository via HTTP
251 status show changed files in the working directory
255 status show changed files in the working directory
252 update update or merge working directory
256 update update or merge working directory
253 hg: unknown command 'skjdfks'
257 hg: unknown command 'skjdfks'
254 Mercurial Distributed SCM
258 Mercurial Distributed SCM
255
259
256 basic commands (use "hg help" for the full list or option "-v" for details):
260 basic commands (use "hg help" for the full list or option "-v" for details):
257
261
258 add add the specified files on the next commit
262 add add the specified files on the next commit
259 annotate show changeset information per file line
263 annotate show changeset information per file line
260 clone make a copy of an existing repository
264 clone make a copy of an existing repository
261 commit commit the specified files or all outstanding changes
265 commit commit the specified files or all outstanding changes
262 diff diff repository (or selected files)
266 diff diff repository (or selected files)
263 export dump the header and diffs for one or more changesets
267 export dump the header and diffs for one or more changesets
264 init create a new repository in the given directory
268 init create a new repository in the given directory
265 log show revision history of entire repository or files
269 log show revision history of entire repository or files
266 parents show the parents of the working dir or revision
270 parents show the parents of the working dir or revision
267 pull pull changes from the specified source
271 pull pull changes from the specified source
268 push push changes to the specified destination
272 push push changes to the specified destination
269 remove remove the specified files on the next commit
273 remove remove the specified files on the next commit
270 revert revert files or dirs to their states as of some revision
274 revert revert files or dirs to their states as of some revision
271 serve export the repository via HTTP
275 serve export the repository via HTTP
272 status show changed files in the working directory
276 status show changed files in the working directory
273 update update or merge working directory
277 update update or merge working directory
@@ -1,28 +1,33 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 hg init t
3 hg init t
4 cd t
4 cd t
5 hg branches
5
6
6 echo foo > a
7 echo foo > a
7 hg add a
8 hg add a
8 hg ci -m "initial" -d "0 0"
9 hg ci -m "initial" -d "0 0"
9 echo foo > .hg/branch
10 hg branch foo
11 hg branch
10 hg ci -m "add branch name" -d "0 0"
12 hg ci -m "add branch name" -d "0 0"
11 echo bar > .hg/branch
13 hg branch bar
12 hg ci -m "change branch name" -d "0 0"
14 hg ci -m "change branch name" -d "0 0"
13 rm .hg/branch
15 hg branch ""
14 hg ci -m "clear branch name" -d "0 0"
16 hg ci -m "clear branch name" -d "0 0"
15
17
16 hg co foo
18 hg co foo
17 cat .hg/branch
19 hg branch
18 echo bleah > a
20 echo bleah > a
19 hg ci -m "modify a branch" -d "0 0"
21 hg ci -m "modify a branch" -d "0 0"
20
22
21 hg merge
23 hg merge
22 cat .hg/branch
24 hg branch
23 HG_MERGE=true hg ci -m "merge" -d "0 0"
25 HG_MERGE=true hg ci -m "merge" -d "0 0"
24 hg log
26 hg log
25
27
28 hg branches
29 hg branches -q
30
26 echo % test for invalid branch cache
31 echo % test for invalid branch cache
27 hg rollback
32 hg rollback
28 hg tip
33 hg tip
@@ -1,53 +1,58 b''
1 foo
1 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 foo
3 foo
3 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 (branch merge, don't forget to commit)
5 (branch merge, don't forget to commit)
5 foo
6 foo
6 changeset: 5:dc140083783b
7 changeset: 5:dc140083783b
7 branch: foo
8 branch: foo
8 tag: tip
9 tag: tip
9 parent: 4:98d14f698afe
10 parent: 4:98d14f698afe
10 parent: 3:9d567d0b51f9
11 parent: 3:9d567d0b51f9
11 user: test
12 user: test
12 date: Thu Jan 01 00:00:00 1970 +0000
13 date: Thu Jan 01 00:00:00 1970 +0000
13 summary: merge
14 summary: merge
14
15
15 changeset: 4:98d14f698afe
16 changeset: 4:98d14f698afe
16 branch: foo
17 branch: foo
17 parent: 1:0079f24813e2
18 parent: 1:0079f24813e2
18 user: test
19 user: test
19 date: Thu Jan 01 00:00:00 1970 +0000
20 date: Thu Jan 01 00:00:00 1970 +0000
20 summary: modify a branch
21 summary: modify a branch
21
22
22 changeset: 3:9d567d0b51f9
23 changeset: 3:9d567d0b51f9
23 user: test
24 user: test
24 date: Thu Jan 01 00:00:00 1970 +0000
25 date: Thu Jan 01 00:00:00 1970 +0000
25 summary: clear branch name
26 summary: clear branch name
26
27
27 changeset: 2:ed2bbf4e0102
28 changeset: 2:ed2bbf4e0102
28 branch: bar
29 branch: bar
29 user: test
30 user: test
30 date: Thu Jan 01 00:00:00 1970 +0000
31 date: Thu Jan 01 00:00:00 1970 +0000
31 summary: change branch name
32 summary: change branch name
32
33
33 changeset: 1:0079f24813e2
34 changeset: 1:0079f24813e2
34 branch: foo
35 branch: foo
35 user: test
36 user: test
36 date: Thu Jan 01 00:00:00 1970 +0000
37 date: Thu Jan 01 00:00:00 1970 +0000
37 summary: add branch name
38 summary: add branch name
38
39
39 changeset: 0:db01e8ea3388
40 changeset: 0:db01e8ea3388
40 user: test
41 user: test
41 date: Thu Jan 01 00:00:00 1970 +0000
42 date: Thu Jan 01 00:00:00 1970 +0000
42 summary: initial
43 summary: initial
43
44
45 foo 5:dc140083783b
46 bar 2:ed2bbf4e0102
47 foo
48 bar
44 % test for invalid branch cache
49 % test for invalid branch cache
45 rolling back last transaction
50 rolling back last transaction
46 changeset: 4:98d14f698afe
51 changeset: 4:98d14f698afe
47 branch: foo
52 branch: foo
48 tag: tip
53 tag: tip
49 parent: 1:0079f24813e2
54 parent: 1:0079f24813e2
50 user: test
55 user: test
51 date: Thu Jan 01 00:00:00 1970 +0000
56 date: Thu Jan 01 00:00:00 1970 +0000
52 summary: modify a branch
57 summary: modify a branch
53
58
General Comments 0
You need to be logged in to leave comments. Login now