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