##// END OF EJS Templates
commands: support consuming stream clone bundles...
Gregory Szorc -
r26758:bde7ef23 default
parent child Browse files
Show More
@@ -1,6704 +1,6716 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 of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from node import hex, bin, nullid, nullrev, short
8 from node import hex, bin, nullid, nullrev, short
9 from lock import release
9 from lock import release
10 from i18n import _
10 from i18n import _
11 import os, re, difflib, time, tempfile, errno, shlex
11 import os, re, difflib, time, tempfile, errno, shlex
12 import sys, socket
12 import sys, socket
13 import hg, scmutil, util, revlog, copies, error, bookmarks
13 import hg, scmutil, util, revlog, copies, error, bookmarks
14 import patch, help, encoding, templatekw, discovery
14 import patch, help, encoding, templatekw, discovery
15 import archival, changegroup, cmdutil, hbisect
15 import archival, changegroup, cmdutil, hbisect
16 import sshserver, hgweb
16 import sshserver, hgweb
17 import extensions
17 import extensions
18 from hgweb import server as hgweb_server
18 from hgweb import server as hgweb_server
19 import merge as mergemod
19 import merge as mergemod
20 import minirst, revset, fileset
20 import minirst, revset, fileset
21 import dagparser, context, simplemerge, graphmod, copies
21 import dagparser, context, simplemerge, graphmod, copies
22 import random, operator
22 import random, operator
23 import setdiscovery, treediscovery, dagutil, pvec, localrepo, destutil
23 import setdiscovery, treediscovery, dagutil, pvec, localrepo, destutil
24 import phases, obsolete, exchange, bundle2, repair, lock as lockmod
24 import phases, obsolete, exchange, bundle2, repair, lock as lockmod
25 import ui as uimod
25 import ui as uimod
26 import streamclone
26 import streamclone
27
27
28 table = {}
28 table = {}
29
29
30 command = cmdutil.command(table)
30 command = cmdutil.command(table)
31
31
32 # Space delimited list of commands that don't require local repositories.
32 # Space delimited list of commands that don't require local repositories.
33 # This should be populated by passing norepo=True into the @command decorator.
33 # This should be populated by passing norepo=True into the @command decorator.
34 norepo = ''
34 norepo = ''
35 # Space delimited list of commands that optionally require local repositories.
35 # Space delimited list of commands that optionally require local repositories.
36 # This should be populated by passing optionalrepo=True into the @command
36 # This should be populated by passing optionalrepo=True into the @command
37 # decorator.
37 # decorator.
38 optionalrepo = ''
38 optionalrepo = ''
39 # Space delimited list of commands that will examine arguments looking for
39 # Space delimited list of commands that will examine arguments looking for
40 # a repository. This should be populated by passing inferrepo=True into the
40 # a repository. This should be populated by passing inferrepo=True into the
41 # @command decorator.
41 # @command decorator.
42 inferrepo = ''
42 inferrepo = ''
43
43
44 # label constants
44 # label constants
45 # until 3.5, bookmarks.current was the advertised name, not
45 # until 3.5, bookmarks.current was the advertised name, not
46 # bookmarks.active, so we must use both to avoid breaking old
46 # bookmarks.active, so we must use both to avoid breaking old
47 # custom styles
47 # custom styles
48 activebookmarklabel = 'bookmarks.active bookmarks.current'
48 activebookmarklabel = 'bookmarks.active bookmarks.current'
49
49
50 # common command options
50 # common command options
51
51
52 globalopts = [
52 globalopts = [
53 ('R', 'repository', '',
53 ('R', 'repository', '',
54 _('repository root directory or name of overlay bundle file'),
54 _('repository root directory or name of overlay bundle file'),
55 _('REPO')),
55 _('REPO')),
56 ('', 'cwd', '',
56 ('', 'cwd', '',
57 _('change working directory'), _('DIR')),
57 _('change working directory'), _('DIR')),
58 ('y', 'noninteractive', None,
58 ('y', 'noninteractive', None,
59 _('do not prompt, automatically pick the first choice for all prompts')),
59 _('do not prompt, automatically pick the first choice for all prompts')),
60 ('q', 'quiet', None, _('suppress output')),
60 ('q', 'quiet', None, _('suppress output')),
61 ('v', 'verbose', None, _('enable additional output')),
61 ('v', 'verbose', None, _('enable additional output')),
62 ('', 'config', [],
62 ('', 'config', [],
63 _('set/override config option (use \'section.name=value\')'),
63 _('set/override config option (use \'section.name=value\')'),
64 _('CONFIG')),
64 _('CONFIG')),
65 ('', 'debug', None, _('enable debugging output')),
65 ('', 'debug', None, _('enable debugging output')),
66 ('', 'debugger', None, _('start debugger')),
66 ('', 'debugger', None, _('start debugger')),
67 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
67 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
68 _('ENCODE')),
68 _('ENCODE')),
69 ('', 'encodingmode', encoding.encodingmode,
69 ('', 'encodingmode', encoding.encodingmode,
70 _('set the charset encoding mode'), _('MODE')),
70 _('set the charset encoding mode'), _('MODE')),
71 ('', 'traceback', None, _('always print a traceback on exception')),
71 ('', 'traceback', None, _('always print a traceback on exception')),
72 ('', 'time', None, _('time how long the command takes')),
72 ('', 'time', None, _('time how long the command takes')),
73 ('', 'profile', None, _('print command execution profile')),
73 ('', 'profile', None, _('print command execution profile')),
74 ('', 'version', None, _('output version information and exit')),
74 ('', 'version', None, _('output version information and exit')),
75 ('h', 'help', None, _('display help and exit')),
75 ('h', 'help', None, _('display help and exit')),
76 ('', 'hidden', False, _('consider hidden changesets')),
76 ('', 'hidden', False, _('consider hidden changesets')),
77 ]
77 ]
78
78
79 dryrunopts = [('n', 'dry-run', None,
79 dryrunopts = [('n', 'dry-run', None,
80 _('do not perform actions, just print output'))]
80 _('do not perform actions, just print output'))]
81
81
82 remoteopts = [
82 remoteopts = [
83 ('e', 'ssh', '',
83 ('e', 'ssh', '',
84 _('specify ssh command to use'), _('CMD')),
84 _('specify ssh command to use'), _('CMD')),
85 ('', 'remotecmd', '',
85 ('', 'remotecmd', '',
86 _('specify hg command to run on the remote side'), _('CMD')),
86 _('specify hg command to run on the remote side'), _('CMD')),
87 ('', 'insecure', None,
87 ('', 'insecure', None,
88 _('do not verify server certificate (ignoring web.cacerts config)')),
88 _('do not verify server certificate (ignoring web.cacerts config)')),
89 ]
89 ]
90
90
91 walkopts = [
91 walkopts = [
92 ('I', 'include', [],
92 ('I', 'include', [],
93 _('include names matching the given patterns'), _('PATTERN')),
93 _('include names matching the given patterns'), _('PATTERN')),
94 ('X', 'exclude', [],
94 ('X', 'exclude', [],
95 _('exclude names matching the given patterns'), _('PATTERN')),
95 _('exclude names matching the given patterns'), _('PATTERN')),
96 ]
96 ]
97
97
98 commitopts = [
98 commitopts = [
99 ('m', 'message', '',
99 ('m', 'message', '',
100 _('use text as commit message'), _('TEXT')),
100 _('use text as commit message'), _('TEXT')),
101 ('l', 'logfile', '',
101 ('l', 'logfile', '',
102 _('read commit message from file'), _('FILE')),
102 _('read commit message from file'), _('FILE')),
103 ]
103 ]
104
104
105 commitopts2 = [
105 commitopts2 = [
106 ('d', 'date', '',
106 ('d', 'date', '',
107 _('record the specified date as commit date'), _('DATE')),
107 _('record the specified date as commit date'), _('DATE')),
108 ('u', 'user', '',
108 ('u', 'user', '',
109 _('record the specified user as committer'), _('USER')),
109 _('record the specified user as committer'), _('USER')),
110 ]
110 ]
111
111
112 # hidden for now
112 # hidden for now
113 formatteropts = [
113 formatteropts = [
114 ('T', 'template', '',
114 ('T', 'template', '',
115 _('display with template (EXPERIMENTAL)'), _('TEMPLATE')),
115 _('display with template (EXPERIMENTAL)'), _('TEMPLATE')),
116 ]
116 ]
117
117
118 templateopts = [
118 templateopts = [
119 ('', 'style', '',
119 ('', 'style', '',
120 _('display using template map file (DEPRECATED)'), _('STYLE')),
120 _('display using template map file (DEPRECATED)'), _('STYLE')),
121 ('T', 'template', '',
121 ('T', 'template', '',
122 _('display with template'), _('TEMPLATE')),
122 _('display with template'), _('TEMPLATE')),
123 ]
123 ]
124
124
125 logopts = [
125 logopts = [
126 ('p', 'patch', None, _('show patch')),
126 ('p', 'patch', None, _('show patch')),
127 ('g', 'git', None, _('use git extended diff format')),
127 ('g', 'git', None, _('use git extended diff format')),
128 ('l', 'limit', '',
128 ('l', 'limit', '',
129 _('limit number of changes displayed'), _('NUM')),
129 _('limit number of changes displayed'), _('NUM')),
130 ('M', 'no-merges', None, _('do not show merges')),
130 ('M', 'no-merges', None, _('do not show merges')),
131 ('', 'stat', None, _('output diffstat-style summary of changes')),
131 ('', 'stat', None, _('output diffstat-style summary of changes')),
132 ('G', 'graph', None, _("show the revision DAG")),
132 ('G', 'graph', None, _("show the revision DAG")),
133 ] + templateopts
133 ] + templateopts
134
134
135 diffopts = [
135 diffopts = [
136 ('a', 'text', None, _('treat all files as text')),
136 ('a', 'text', None, _('treat all files as text')),
137 ('g', 'git', None, _('use git extended diff format')),
137 ('g', 'git', None, _('use git extended diff format')),
138 ('', 'nodates', None, _('omit dates from diff headers'))
138 ('', 'nodates', None, _('omit dates from diff headers'))
139 ]
139 ]
140
140
141 diffwsopts = [
141 diffwsopts = [
142 ('w', 'ignore-all-space', None,
142 ('w', 'ignore-all-space', None,
143 _('ignore white space when comparing lines')),
143 _('ignore white space when comparing lines')),
144 ('b', 'ignore-space-change', None,
144 ('b', 'ignore-space-change', None,
145 _('ignore changes in the amount of white space')),
145 _('ignore changes in the amount of white space')),
146 ('B', 'ignore-blank-lines', None,
146 ('B', 'ignore-blank-lines', None,
147 _('ignore changes whose lines are all blank')),
147 _('ignore changes whose lines are all blank')),
148 ]
148 ]
149
149
150 diffopts2 = [
150 diffopts2 = [
151 ('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
151 ('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
152 ('p', 'show-function', None, _('show which function each change is in')),
152 ('p', 'show-function', None, _('show which function each change is in')),
153 ('', 'reverse', None, _('produce a diff that undoes the changes')),
153 ('', 'reverse', None, _('produce a diff that undoes the changes')),
154 ] + diffwsopts + [
154 ] + diffwsopts + [
155 ('U', 'unified', '',
155 ('U', 'unified', '',
156 _('number of lines of context to show'), _('NUM')),
156 _('number of lines of context to show'), _('NUM')),
157 ('', 'stat', None, _('output diffstat-style summary of changes')),
157 ('', 'stat', None, _('output diffstat-style summary of changes')),
158 ('', 'root', '', _('produce diffs relative to subdirectory'), _('DIR')),
158 ('', 'root', '', _('produce diffs relative to subdirectory'), _('DIR')),
159 ]
159 ]
160
160
161 mergetoolopts = [
161 mergetoolopts = [
162 ('t', 'tool', '', _('specify merge tool')),
162 ('t', 'tool', '', _('specify merge tool')),
163 ]
163 ]
164
164
165 similarityopts = [
165 similarityopts = [
166 ('s', 'similarity', '',
166 ('s', 'similarity', '',
167 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
167 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
168 ]
168 ]
169
169
170 subrepoopts = [
170 subrepoopts = [
171 ('S', 'subrepos', None,
171 ('S', 'subrepos', None,
172 _('recurse into subrepositories'))
172 _('recurse into subrepositories'))
173 ]
173 ]
174
174
175 # Commands start here, listed alphabetically
175 # Commands start here, listed alphabetically
176
176
177 @command('^add',
177 @command('^add',
178 walkopts + subrepoopts + dryrunopts,
178 walkopts + subrepoopts + dryrunopts,
179 _('[OPTION]... [FILE]...'),
179 _('[OPTION]... [FILE]...'),
180 inferrepo=True)
180 inferrepo=True)
181 def add(ui, repo, *pats, **opts):
181 def add(ui, repo, *pats, **opts):
182 """add the specified files on the next commit
182 """add the specified files on the next commit
183
183
184 Schedule files to be version controlled and added to the
184 Schedule files to be version controlled and added to the
185 repository.
185 repository.
186
186
187 The files will be added to the repository at the next commit. To
187 The files will be added to the repository at the next commit. To
188 undo an add before that, see :hg:`forget`.
188 undo an add before that, see :hg:`forget`.
189
189
190 If no names are given, add all files to the repository.
190 If no names are given, add all files to the repository.
191
191
192 .. container:: verbose
192 .. container:: verbose
193
193
194 An example showing how new (unknown) files are added
194 An example showing how new (unknown) files are added
195 automatically by :hg:`add`::
195 automatically by :hg:`add`::
196
196
197 $ ls
197 $ ls
198 foo.c
198 foo.c
199 $ hg status
199 $ hg status
200 ? foo.c
200 ? foo.c
201 $ hg add
201 $ hg add
202 adding foo.c
202 adding foo.c
203 $ hg status
203 $ hg status
204 A foo.c
204 A foo.c
205
205
206 Returns 0 if all files are successfully added.
206 Returns 0 if all files are successfully added.
207 """
207 """
208
208
209 m = scmutil.match(repo[None], pats, opts)
209 m = scmutil.match(repo[None], pats, opts)
210 rejected = cmdutil.add(ui, repo, m, "", False, **opts)
210 rejected = cmdutil.add(ui, repo, m, "", False, **opts)
211 return rejected and 1 or 0
211 return rejected and 1 or 0
212
212
213 @command('addremove',
213 @command('addremove',
214 similarityopts + subrepoopts + walkopts + dryrunopts,
214 similarityopts + subrepoopts + walkopts + dryrunopts,
215 _('[OPTION]... [FILE]...'),
215 _('[OPTION]... [FILE]...'),
216 inferrepo=True)
216 inferrepo=True)
217 def addremove(ui, repo, *pats, **opts):
217 def addremove(ui, repo, *pats, **opts):
218 """add all new files, delete all missing files
218 """add all new files, delete all missing files
219
219
220 Add all new files and remove all missing files from the
220 Add all new files and remove all missing files from the
221 repository.
221 repository.
222
222
223 New files are ignored if they match any of the patterns in
223 New files are ignored if they match any of the patterns in
224 ``.hgignore``. As with add, these changes take effect at the next
224 ``.hgignore``. As with add, these changes take effect at the next
225 commit.
225 commit.
226
226
227 Use the -s/--similarity option to detect renamed files. This
227 Use the -s/--similarity option to detect renamed files. This
228 option takes a percentage between 0 (disabled) and 100 (files must
228 option takes a percentage between 0 (disabled) and 100 (files must
229 be identical) as its parameter. With a parameter greater than 0,
229 be identical) as its parameter. With a parameter greater than 0,
230 this compares every removed file with every added file and records
230 this compares every removed file with every added file and records
231 those similar enough as renames. Detecting renamed files this way
231 those similar enough as renames. Detecting renamed files this way
232 can be expensive. After using this option, :hg:`status -C` can be
232 can be expensive. After using this option, :hg:`status -C` can be
233 used to check which files were identified as moved or renamed. If
233 used to check which files were identified as moved or renamed. If
234 not specified, -s/--similarity defaults to 100 and only renames of
234 not specified, -s/--similarity defaults to 100 and only renames of
235 identical files are detected.
235 identical files are detected.
236
236
237 Returns 0 if all files are successfully added.
237 Returns 0 if all files are successfully added.
238 """
238 """
239 try:
239 try:
240 sim = float(opts.get('similarity') or 100)
240 sim = float(opts.get('similarity') or 100)
241 except ValueError:
241 except ValueError:
242 raise error.Abort(_('similarity must be a number'))
242 raise error.Abort(_('similarity must be a number'))
243 if sim < 0 or sim > 100:
243 if sim < 0 or sim > 100:
244 raise error.Abort(_('similarity must be between 0 and 100'))
244 raise error.Abort(_('similarity must be between 0 and 100'))
245 matcher = scmutil.match(repo[None], pats, opts)
245 matcher = scmutil.match(repo[None], pats, opts)
246 return scmutil.addremove(repo, matcher, "", opts, similarity=sim / 100.0)
246 return scmutil.addremove(repo, matcher, "", opts, similarity=sim / 100.0)
247
247
248 @command('^annotate|blame',
248 @command('^annotate|blame',
249 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
249 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
250 ('', 'follow', None,
250 ('', 'follow', None,
251 _('follow copies/renames and list the filename (DEPRECATED)')),
251 _('follow copies/renames and list the filename (DEPRECATED)')),
252 ('', 'no-follow', None, _("don't follow copies and renames")),
252 ('', 'no-follow', None, _("don't follow copies and renames")),
253 ('a', 'text', None, _('treat all files as text')),
253 ('a', 'text', None, _('treat all files as text')),
254 ('u', 'user', None, _('list the author (long with -v)')),
254 ('u', 'user', None, _('list the author (long with -v)')),
255 ('f', 'file', None, _('list the filename')),
255 ('f', 'file', None, _('list the filename')),
256 ('d', 'date', None, _('list the date (short with -q)')),
256 ('d', 'date', None, _('list the date (short with -q)')),
257 ('n', 'number', None, _('list the revision number (default)')),
257 ('n', 'number', None, _('list the revision number (default)')),
258 ('c', 'changeset', None, _('list the changeset')),
258 ('c', 'changeset', None, _('list the changeset')),
259 ('l', 'line-number', None, _('show line number at the first appearance'))
259 ('l', 'line-number', None, _('show line number at the first appearance'))
260 ] + diffwsopts + walkopts + formatteropts,
260 ] + diffwsopts + walkopts + formatteropts,
261 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
261 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
262 inferrepo=True)
262 inferrepo=True)
263 def annotate(ui, repo, *pats, **opts):
263 def annotate(ui, repo, *pats, **opts):
264 """show changeset information by line for each file
264 """show changeset information by line for each file
265
265
266 List changes in files, showing the revision id responsible for
266 List changes in files, showing the revision id responsible for
267 each line
267 each line
268
268
269 This command is useful for discovering when a change was made and
269 This command is useful for discovering when a change was made and
270 by whom.
270 by whom.
271
271
272 Without the -a/--text option, annotate will avoid processing files
272 Without the -a/--text option, annotate will avoid processing files
273 it detects as binary. With -a, annotate will annotate the file
273 it detects as binary. With -a, annotate will annotate the file
274 anyway, although the results will probably be neither useful
274 anyway, although the results will probably be neither useful
275 nor desirable.
275 nor desirable.
276
276
277 Returns 0 on success.
277 Returns 0 on success.
278 """
278 """
279 if not pats:
279 if not pats:
280 raise error.Abort(_('at least one filename or pattern is required'))
280 raise error.Abort(_('at least one filename or pattern is required'))
281
281
282 if opts.get('follow'):
282 if opts.get('follow'):
283 # --follow is deprecated and now just an alias for -f/--file
283 # --follow is deprecated and now just an alias for -f/--file
284 # to mimic the behavior of Mercurial before version 1.5
284 # to mimic the behavior of Mercurial before version 1.5
285 opts['file'] = True
285 opts['file'] = True
286
286
287 ctx = scmutil.revsingle(repo, opts.get('rev'))
287 ctx = scmutil.revsingle(repo, opts.get('rev'))
288
288
289 fm = ui.formatter('annotate', opts)
289 fm = ui.formatter('annotate', opts)
290 if ui.quiet:
290 if ui.quiet:
291 datefunc = util.shortdate
291 datefunc = util.shortdate
292 else:
292 else:
293 datefunc = util.datestr
293 datefunc = util.datestr
294 if ctx.rev() is None:
294 if ctx.rev() is None:
295 def hexfn(node):
295 def hexfn(node):
296 if node is None:
296 if node is None:
297 return None
297 return None
298 else:
298 else:
299 return fm.hexfunc(node)
299 return fm.hexfunc(node)
300 if opts.get('changeset'):
300 if opts.get('changeset'):
301 # omit "+" suffix which is appended to node hex
301 # omit "+" suffix which is appended to node hex
302 def formatrev(rev):
302 def formatrev(rev):
303 if rev is None:
303 if rev is None:
304 return '%d' % ctx.p1().rev()
304 return '%d' % ctx.p1().rev()
305 else:
305 else:
306 return '%d' % rev
306 return '%d' % rev
307 else:
307 else:
308 def formatrev(rev):
308 def formatrev(rev):
309 if rev is None:
309 if rev is None:
310 return '%d+' % ctx.p1().rev()
310 return '%d+' % ctx.p1().rev()
311 else:
311 else:
312 return '%d ' % rev
312 return '%d ' % rev
313 def formathex(hex):
313 def formathex(hex):
314 if hex is None:
314 if hex is None:
315 return '%s+' % fm.hexfunc(ctx.p1().node())
315 return '%s+' % fm.hexfunc(ctx.p1().node())
316 else:
316 else:
317 return '%s ' % hex
317 return '%s ' % hex
318 else:
318 else:
319 hexfn = fm.hexfunc
319 hexfn = fm.hexfunc
320 formatrev = formathex = str
320 formatrev = formathex = str
321
321
322 opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser),
322 opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser),
323 ('number', ' ', lambda x: x[0].rev(), formatrev),
323 ('number', ' ', lambda x: x[0].rev(), formatrev),
324 ('changeset', ' ', lambda x: hexfn(x[0].node()), formathex),
324 ('changeset', ' ', lambda x: hexfn(x[0].node()), formathex),
325 ('date', ' ', lambda x: x[0].date(), util.cachefunc(datefunc)),
325 ('date', ' ', lambda x: x[0].date(), util.cachefunc(datefunc)),
326 ('file', ' ', lambda x: x[0].path(), str),
326 ('file', ' ', lambda x: x[0].path(), str),
327 ('line_number', ':', lambda x: x[1], str),
327 ('line_number', ':', lambda x: x[1], str),
328 ]
328 ]
329 fieldnamemap = {'number': 'rev', 'changeset': 'node'}
329 fieldnamemap = {'number': 'rev', 'changeset': 'node'}
330
330
331 if (not opts.get('user') and not opts.get('changeset')
331 if (not opts.get('user') and not opts.get('changeset')
332 and not opts.get('date') and not opts.get('file')):
332 and not opts.get('date') and not opts.get('file')):
333 opts['number'] = True
333 opts['number'] = True
334
334
335 linenumber = opts.get('line_number') is not None
335 linenumber = opts.get('line_number') is not None
336 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
336 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
337 raise error.Abort(_('at least one of -n/-c is required for -l'))
337 raise error.Abort(_('at least one of -n/-c is required for -l'))
338
338
339 if fm:
339 if fm:
340 def makefunc(get, fmt):
340 def makefunc(get, fmt):
341 return get
341 return get
342 else:
342 else:
343 def makefunc(get, fmt):
343 def makefunc(get, fmt):
344 return lambda x: fmt(get(x))
344 return lambda x: fmt(get(x))
345 funcmap = [(makefunc(get, fmt), sep) for op, sep, get, fmt in opmap
345 funcmap = [(makefunc(get, fmt), sep) for op, sep, get, fmt in opmap
346 if opts.get(op)]
346 if opts.get(op)]
347 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
347 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
348 fields = ' '.join(fieldnamemap.get(op, op) for op, sep, get, fmt in opmap
348 fields = ' '.join(fieldnamemap.get(op, op) for op, sep, get, fmt in opmap
349 if opts.get(op))
349 if opts.get(op))
350
350
351 def bad(x, y):
351 def bad(x, y):
352 raise error.Abort("%s: %s" % (x, y))
352 raise error.Abort("%s: %s" % (x, y))
353
353
354 m = scmutil.match(ctx, pats, opts, badfn=bad)
354 m = scmutil.match(ctx, pats, opts, badfn=bad)
355
355
356 follow = not opts.get('no_follow')
356 follow = not opts.get('no_follow')
357 diffopts = patch.difffeatureopts(ui, opts, section='annotate',
357 diffopts = patch.difffeatureopts(ui, opts, section='annotate',
358 whitespace=True)
358 whitespace=True)
359 for abs in ctx.walk(m):
359 for abs in ctx.walk(m):
360 fctx = ctx[abs]
360 fctx = ctx[abs]
361 if not opts.get('text') and util.binary(fctx.data()):
361 if not opts.get('text') and util.binary(fctx.data()):
362 fm.plain(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
362 fm.plain(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
363 continue
363 continue
364
364
365 lines = fctx.annotate(follow=follow, linenumber=linenumber,
365 lines = fctx.annotate(follow=follow, linenumber=linenumber,
366 diffopts=diffopts)
366 diffopts=diffopts)
367 formats = []
367 formats = []
368 pieces = []
368 pieces = []
369
369
370 for f, sep in funcmap:
370 for f, sep in funcmap:
371 l = [f(n) for n, dummy in lines]
371 l = [f(n) for n, dummy in lines]
372 if l:
372 if l:
373 if fm:
373 if fm:
374 formats.append(['%s' for x in l])
374 formats.append(['%s' for x in l])
375 else:
375 else:
376 sizes = [encoding.colwidth(x) for x in l]
376 sizes = [encoding.colwidth(x) for x in l]
377 ml = max(sizes)
377 ml = max(sizes)
378 formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes])
378 formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes])
379 pieces.append(l)
379 pieces.append(l)
380
380
381 for f, p, l in zip(zip(*formats), zip(*pieces), lines):
381 for f, p, l in zip(zip(*formats), zip(*pieces), lines):
382 fm.startitem()
382 fm.startitem()
383 fm.write(fields, "".join(f), *p)
383 fm.write(fields, "".join(f), *p)
384 fm.write('line', ": %s", l[1])
384 fm.write('line', ": %s", l[1])
385
385
386 if lines and not lines[-1][1].endswith('\n'):
386 if lines and not lines[-1][1].endswith('\n'):
387 fm.plain('\n')
387 fm.plain('\n')
388
388
389 fm.end()
389 fm.end()
390
390
391 @command('archive',
391 @command('archive',
392 [('', 'no-decode', None, _('do not pass files through decoders')),
392 [('', 'no-decode', None, _('do not pass files through decoders')),
393 ('p', 'prefix', '', _('directory prefix for files in archive'),
393 ('p', 'prefix', '', _('directory prefix for files in archive'),
394 _('PREFIX')),
394 _('PREFIX')),
395 ('r', 'rev', '', _('revision to distribute'), _('REV')),
395 ('r', 'rev', '', _('revision to distribute'), _('REV')),
396 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
396 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
397 ] + subrepoopts + walkopts,
397 ] + subrepoopts + walkopts,
398 _('[OPTION]... DEST'))
398 _('[OPTION]... DEST'))
399 def archive(ui, repo, dest, **opts):
399 def archive(ui, repo, dest, **opts):
400 '''create an unversioned archive of a repository revision
400 '''create an unversioned archive of a repository revision
401
401
402 By default, the revision used is the parent of the working
402 By default, the revision used is the parent of the working
403 directory; use -r/--rev to specify a different revision.
403 directory; use -r/--rev to specify a different revision.
404
404
405 The archive type is automatically detected based on file
405 The archive type is automatically detected based on file
406 extension (or override using -t/--type).
406 extension (or override using -t/--type).
407
407
408 .. container:: verbose
408 .. container:: verbose
409
409
410 Examples:
410 Examples:
411
411
412 - create a zip file containing the 1.0 release::
412 - create a zip file containing the 1.0 release::
413
413
414 hg archive -r 1.0 project-1.0.zip
414 hg archive -r 1.0 project-1.0.zip
415
415
416 - create a tarball excluding .hg files::
416 - create a tarball excluding .hg files::
417
417
418 hg archive project.tar.gz -X ".hg*"
418 hg archive project.tar.gz -X ".hg*"
419
419
420 Valid types are:
420 Valid types are:
421
421
422 :``files``: a directory full of files (default)
422 :``files``: a directory full of files (default)
423 :``tar``: tar archive, uncompressed
423 :``tar``: tar archive, uncompressed
424 :``tbz2``: tar archive, compressed using bzip2
424 :``tbz2``: tar archive, compressed using bzip2
425 :``tgz``: tar archive, compressed using gzip
425 :``tgz``: tar archive, compressed using gzip
426 :``uzip``: zip archive, uncompressed
426 :``uzip``: zip archive, uncompressed
427 :``zip``: zip archive, compressed using deflate
427 :``zip``: zip archive, compressed using deflate
428
428
429 The exact name of the destination archive or directory is given
429 The exact name of the destination archive or directory is given
430 using a format string; see :hg:`help export` for details.
430 using a format string; see :hg:`help export` for details.
431
431
432 Each member added to an archive file has a directory prefix
432 Each member added to an archive file has a directory prefix
433 prepended. Use -p/--prefix to specify a format string for the
433 prepended. Use -p/--prefix to specify a format string for the
434 prefix. The default is the basename of the archive, with suffixes
434 prefix. The default is the basename of the archive, with suffixes
435 removed.
435 removed.
436
436
437 Returns 0 on success.
437 Returns 0 on success.
438 '''
438 '''
439
439
440 ctx = scmutil.revsingle(repo, opts.get('rev'))
440 ctx = scmutil.revsingle(repo, opts.get('rev'))
441 if not ctx:
441 if not ctx:
442 raise error.Abort(_('no working directory: please specify a revision'))
442 raise error.Abort(_('no working directory: please specify a revision'))
443 node = ctx.node()
443 node = ctx.node()
444 dest = cmdutil.makefilename(repo, dest, node)
444 dest = cmdutil.makefilename(repo, dest, node)
445 if os.path.realpath(dest) == repo.root:
445 if os.path.realpath(dest) == repo.root:
446 raise error.Abort(_('repository root cannot be destination'))
446 raise error.Abort(_('repository root cannot be destination'))
447
447
448 kind = opts.get('type') or archival.guesskind(dest) or 'files'
448 kind = opts.get('type') or archival.guesskind(dest) or 'files'
449 prefix = opts.get('prefix')
449 prefix = opts.get('prefix')
450
450
451 if dest == '-':
451 if dest == '-':
452 if kind == 'files':
452 if kind == 'files':
453 raise error.Abort(_('cannot archive plain files to stdout'))
453 raise error.Abort(_('cannot archive plain files to stdout'))
454 dest = cmdutil.makefileobj(repo, dest)
454 dest = cmdutil.makefileobj(repo, dest)
455 if not prefix:
455 if not prefix:
456 prefix = os.path.basename(repo.root) + '-%h'
456 prefix = os.path.basename(repo.root) + '-%h'
457
457
458 prefix = cmdutil.makefilename(repo, prefix, node)
458 prefix = cmdutil.makefilename(repo, prefix, node)
459 matchfn = scmutil.match(ctx, [], opts)
459 matchfn = scmutil.match(ctx, [], opts)
460 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
460 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
461 matchfn, prefix, subrepos=opts.get('subrepos'))
461 matchfn, prefix, subrepos=opts.get('subrepos'))
462
462
463 @command('backout',
463 @command('backout',
464 [('', 'merge', None, _('merge with old dirstate parent after backout')),
464 [('', 'merge', None, _('merge with old dirstate parent after backout')),
465 ('', 'commit', None, _('commit if no conflicts were encountered')),
465 ('', 'commit', None, _('commit if no conflicts were encountered')),
466 ('', 'parent', '',
466 ('', 'parent', '',
467 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
467 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
468 ('r', 'rev', '', _('revision to backout'), _('REV')),
468 ('r', 'rev', '', _('revision to backout'), _('REV')),
469 ('e', 'edit', False, _('invoke editor on commit messages')),
469 ('e', 'edit', False, _('invoke editor on commit messages')),
470 ] + mergetoolopts + walkopts + commitopts + commitopts2,
470 ] + mergetoolopts + walkopts + commitopts + commitopts2,
471 _('[OPTION]... [-r] REV'))
471 _('[OPTION]... [-r] REV'))
472 def backout(ui, repo, node=None, rev=None, commit=False, **opts):
472 def backout(ui, repo, node=None, rev=None, commit=False, **opts):
473 '''reverse effect of earlier changeset
473 '''reverse effect of earlier changeset
474
474
475 Prepare a new changeset with the effect of REV undone in the
475 Prepare a new changeset with the effect of REV undone in the
476 current working directory.
476 current working directory.
477
477
478 If REV is the parent of the working directory, then this new changeset
478 If REV is the parent of the working directory, then this new changeset
479 is committed automatically. Otherwise, hg needs to merge the
479 is committed automatically. Otherwise, hg needs to merge the
480 changes and the merged result is left uncommitted.
480 changes and the merged result is left uncommitted.
481
481
482 .. note::
482 .. note::
483
483
484 backout cannot be used to fix either an unwanted or
484 backout cannot be used to fix either an unwanted or
485 incorrect merge.
485 incorrect merge.
486
486
487 .. container:: verbose
487 .. container:: verbose
488
488
489 By default, the pending changeset will have one parent,
489 By default, the pending changeset will have one parent,
490 maintaining a linear history. With --merge, the pending
490 maintaining a linear history. With --merge, the pending
491 changeset will instead have two parents: the old parent of the
491 changeset will instead have two parents: the old parent of the
492 working directory and a new child of REV that simply undoes REV.
492 working directory and a new child of REV that simply undoes REV.
493
493
494 Before version 1.7, the behavior without --merge was equivalent
494 Before version 1.7, the behavior without --merge was equivalent
495 to specifying --merge followed by :hg:`update --clean .` to
495 to specifying --merge followed by :hg:`update --clean .` to
496 cancel the merge and leave the child of REV as a head to be
496 cancel the merge and leave the child of REV as a head to be
497 merged separately.
497 merged separately.
498
498
499 See :hg:`help dates` for a list of formats valid for -d/--date.
499 See :hg:`help dates` for a list of formats valid for -d/--date.
500
500
501 See :hg:`help revert` for a way to restore files to the state
501 See :hg:`help revert` for a way to restore files to the state
502 of another revision.
502 of another revision.
503
503
504 Returns 0 on success, 1 if nothing to backout or there are unresolved
504 Returns 0 on success, 1 if nothing to backout or there are unresolved
505 files.
505 files.
506 '''
506 '''
507 if rev and node:
507 if rev and node:
508 raise error.Abort(_("please specify just one revision"))
508 raise error.Abort(_("please specify just one revision"))
509
509
510 if not rev:
510 if not rev:
511 rev = node
511 rev = node
512
512
513 if not rev:
513 if not rev:
514 raise error.Abort(_("please specify a revision to backout"))
514 raise error.Abort(_("please specify a revision to backout"))
515
515
516 date = opts.get('date')
516 date = opts.get('date')
517 if date:
517 if date:
518 opts['date'] = util.parsedate(date)
518 opts['date'] = util.parsedate(date)
519
519
520 cmdutil.checkunfinished(repo)
520 cmdutil.checkunfinished(repo)
521 cmdutil.bailifchanged(repo)
521 cmdutil.bailifchanged(repo)
522 node = scmutil.revsingle(repo, rev).node()
522 node = scmutil.revsingle(repo, rev).node()
523
523
524 op1, op2 = repo.dirstate.parents()
524 op1, op2 = repo.dirstate.parents()
525 if not repo.changelog.isancestor(node, op1):
525 if not repo.changelog.isancestor(node, op1):
526 raise error.Abort(_('cannot backout change that is not an ancestor'))
526 raise error.Abort(_('cannot backout change that is not an ancestor'))
527
527
528 p1, p2 = repo.changelog.parents(node)
528 p1, p2 = repo.changelog.parents(node)
529 if p1 == nullid:
529 if p1 == nullid:
530 raise error.Abort(_('cannot backout a change with no parents'))
530 raise error.Abort(_('cannot backout a change with no parents'))
531 if p2 != nullid:
531 if p2 != nullid:
532 if not opts.get('parent'):
532 if not opts.get('parent'):
533 raise error.Abort(_('cannot backout a merge changeset'))
533 raise error.Abort(_('cannot backout a merge changeset'))
534 p = repo.lookup(opts['parent'])
534 p = repo.lookup(opts['parent'])
535 if p not in (p1, p2):
535 if p not in (p1, p2):
536 raise error.Abort(_('%s is not a parent of %s') %
536 raise error.Abort(_('%s is not a parent of %s') %
537 (short(p), short(node)))
537 (short(p), short(node)))
538 parent = p
538 parent = p
539 else:
539 else:
540 if opts.get('parent'):
540 if opts.get('parent'):
541 raise error.Abort(_('cannot use --parent on non-merge changeset'))
541 raise error.Abort(_('cannot use --parent on non-merge changeset'))
542 parent = p1
542 parent = p1
543
543
544 # the backout should appear on the same branch
544 # the backout should appear on the same branch
545 wlock = repo.wlock()
545 wlock = repo.wlock()
546 try:
546 try:
547 branch = repo.dirstate.branch()
547 branch = repo.dirstate.branch()
548 bheads = repo.branchheads(branch)
548 bheads = repo.branchheads(branch)
549 rctx = scmutil.revsingle(repo, hex(parent))
549 rctx = scmutil.revsingle(repo, hex(parent))
550 if not opts.get('merge') and op1 != node:
550 if not opts.get('merge') and op1 != node:
551 dsguard = cmdutil.dirstateguard(repo, 'backout')
551 dsguard = cmdutil.dirstateguard(repo, 'backout')
552 try:
552 try:
553 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
553 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
554 'backout')
554 'backout')
555 stats = mergemod.update(repo, parent, True, True, False,
555 stats = mergemod.update(repo, parent, True, True, False,
556 node, False)
556 node, False)
557 repo.setparents(op1, op2)
557 repo.setparents(op1, op2)
558 dsguard.close()
558 dsguard.close()
559 hg._showstats(repo, stats)
559 hg._showstats(repo, stats)
560 if stats[3]:
560 if stats[3]:
561 repo.ui.status(_("use 'hg resolve' to retry unresolved "
561 repo.ui.status(_("use 'hg resolve' to retry unresolved "
562 "file merges\n"))
562 "file merges\n"))
563 return 1
563 return 1
564 elif not commit:
564 elif not commit:
565 msg = _("changeset %s backed out, "
565 msg = _("changeset %s backed out, "
566 "don't forget to commit.\n")
566 "don't forget to commit.\n")
567 ui.status(msg % short(node))
567 ui.status(msg % short(node))
568 return 0
568 return 0
569 finally:
569 finally:
570 ui.setconfig('ui', 'forcemerge', '', '')
570 ui.setconfig('ui', 'forcemerge', '', '')
571 lockmod.release(dsguard)
571 lockmod.release(dsguard)
572 else:
572 else:
573 hg.clean(repo, node, show_stats=False)
573 hg.clean(repo, node, show_stats=False)
574 repo.dirstate.setbranch(branch)
574 repo.dirstate.setbranch(branch)
575 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
575 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
576
576
577
577
578 def commitfunc(ui, repo, message, match, opts):
578 def commitfunc(ui, repo, message, match, opts):
579 editform = 'backout'
579 editform = 'backout'
580 e = cmdutil.getcommiteditor(editform=editform, **opts)
580 e = cmdutil.getcommiteditor(editform=editform, **opts)
581 if not message:
581 if not message:
582 # we don't translate commit messages
582 # we don't translate commit messages
583 message = "Backed out changeset %s" % short(node)
583 message = "Backed out changeset %s" % short(node)
584 e = cmdutil.getcommiteditor(edit=True, editform=editform)
584 e = cmdutil.getcommiteditor(edit=True, editform=editform)
585 return repo.commit(message, opts.get('user'), opts.get('date'),
585 return repo.commit(message, opts.get('user'), opts.get('date'),
586 match, editor=e)
586 match, editor=e)
587 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
587 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
588 if not newnode:
588 if not newnode:
589 ui.status(_("nothing changed\n"))
589 ui.status(_("nothing changed\n"))
590 return 1
590 return 1
591 cmdutil.commitstatus(repo, newnode, branch, bheads)
591 cmdutil.commitstatus(repo, newnode, branch, bheads)
592
592
593 def nice(node):
593 def nice(node):
594 return '%d:%s' % (repo.changelog.rev(node), short(node))
594 return '%d:%s' % (repo.changelog.rev(node), short(node))
595 ui.status(_('changeset %s backs out changeset %s\n') %
595 ui.status(_('changeset %s backs out changeset %s\n') %
596 (nice(repo.changelog.tip()), nice(node)))
596 (nice(repo.changelog.tip()), nice(node)))
597 if opts.get('merge') and op1 != node:
597 if opts.get('merge') and op1 != node:
598 hg.clean(repo, op1, show_stats=False)
598 hg.clean(repo, op1, show_stats=False)
599 ui.status(_('merging with changeset %s\n')
599 ui.status(_('merging with changeset %s\n')
600 % nice(repo.changelog.tip()))
600 % nice(repo.changelog.tip()))
601 try:
601 try:
602 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
602 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
603 'backout')
603 'backout')
604 return hg.merge(repo, hex(repo.changelog.tip()))
604 return hg.merge(repo, hex(repo.changelog.tip()))
605 finally:
605 finally:
606 ui.setconfig('ui', 'forcemerge', '', '')
606 ui.setconfig('ui', 'forcemerge', '', '')
607 finally:
607 finally:
608 wlock.release()
608 wlock.release()
609 return 0
609 return 0
610
610
611 @command('bisect',
611 @command('bisect',
612 [('r', 'reset', False, _('reset bisect state')),
612 [('r', 'reset', False, _('reset bisect state')),
613 ('g', 'good', False, _('mark changeset good')),
613 ('g', 'good', False, _('mark changeset good')),
614 ('b', 'bad', False, _('mark changeset bad')),
614 ('b', 'bad', False, _('mark changeset bad')),
615 ('s', 'skip', False, _('skip testing changeset')),
615 ('s', 'skip', False, _('skip testing changeset')),
616 ('e', 'extend', False, _('extend the bisect range')),
616 ('e', 'extend', False, _('extend the bisect range')),
617 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
617 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
618 ('U', 'noupdate', False, _('do not update to target'))],
618 ('U', 'noupdate', False, _('do not update to target'))],
619 _("[-gbsr] [-U] [-c CMD] [REV]"))
619 _("[-gbsr] [-U] [-c CMD] [REV]"))
620 def bisect(ui, repo, rev=None, extra=None, command=None,
620 def bisect(ui, repo, rev=None, extra=None, command=None,
621 reset=None, good=None, bad=None, skip=None, extend=None,
621 reset=None, good=None, bad=None, skip=None, extend=None,
622 noupdate=None):
622 noupdate=None):
623 """subdivision search of changesets
623 """subdivision search of changesets
624
624
625 This command helps to find changesets which introduce problems. To
625 This command helps to find changesets which introduce problems. To
626 use, mark the earliest changeset you know exhibits the problem as
626 use, mark the earliest changeset you know exhibits the problem as
627 bad, then mark the latest changeset which is free from the problem
627 bad, then mark the latest changeset which is free from the problem
628 as good. Bisect will update your working directory to a revision
628 as good. Bisect will update your working directory to a revision
629 for testing (unless the -U/--noupdate option is specified). Once
629 for testing (unless the -U/--noupdate option is specified). Once
630 you have performed tests, mark the working directory as good or
630 you have performed tests, mark the working directory as good or
631 bad, and bisect will either update to another candidate changeset
631 bad, and bisect will either update to another candidate changeset
632 or announce that it has found the bad revision.
632 or announce that it has found the bad revision.
633
633
634 As a shortcut, you can also use the revision argument to mark a
634 As a shortcut, you can also use the revision argument to mark a
635 revision as good or bad without checking it out first.
635 revision as good or bad without checking it out first.
636
636
637 If you supply a command, it will be used for automatic bisection.
637 If you supply a command, it will be used for automatic bisection.
638 The environment variable HG_NODE will contain the ID of the
638 The environment variable HG_NODE will contain the ID of the
639 changeset being tested. The exit status of the command will be
639 changeset being tested. The exit status of the command will be
640 used to mark revisions as good or bad: status 0 means good, 125
640 used to mark revisions as good or bad: status 0 means good, 125
641 means to skip the revision, 127 (command not found) will abort the
641 means to skip the revision, 127 (command not found) will abort the
642 bisection, and any other non-zero exit status means the revision
642 bisection, and any other non-zero exit status means the revision
643 is bad.
643 is bad.
644
644
645 .. container:: verbose
645 .. container:: verbose
646
646
647 Some examples:
647 Some examples:
648
648
649 - start a bisection with known bad revision 34, and good revision 12::
649 - start a bisection with known bad revision 34, and good revision 12::
650
650
651 hg bisect --bad 34
651 hg bisect --bad 34
652 hg bisect --good 12
652 hg bisect --good 12
653
653
654 - advance the current bisection by marking current revision as good or
654 - advance the current bisection by marking current revision as good or
655 bad::
655 bad::
656
656
657 hg bisect --good
657 hg bisect --good
658 hg bisect --bad
658 hg bisect --bad
659
659
660 - mark the current revision, or a known revision, to be skipped (e.g. if
660 - mark the current revision, or a known revision, to be skipped (e.g. if
661 that revision is not usable because of another issue)::
661 that revision is not usable because of another issue)::
662
662
663 hg bisect --skip
663 hg bisect --skip
664 hg bisect --skip 23
664 hg bisect --skip 23
665
665
666 - skip all revisions that do not touch directories ``foo`` or ``bar``::
666 - skip all revisions that do not touch directories ``foo`` or ``bar``::
667
667
668 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
668 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
669
669
670 - forget the current bisection::
670 - forget the current bisection::
671
671
672 hg bisect --reset
672 hg bisect --reset
673
673
674 - use 'make && make tests' to automatically find the first broken
674 - use 'make && make tests' to automatically find the first broken
675 revision::
675 revision::
676
676
677 hg bisect --reset
677 hg bisect --reset
678 hg bisect --bad 34
678 hg bisect --bad 34
679 hg bisect --good 12
679 hg bisect --good 12
680 hg bisect --command "make && make tests"
680 hg bisect --command "make && make tests"
681
681
682 - see all changesets whose states are already known in the current
682 - see all changesets whose states are already known in the current
683 bisection::
683 bisection::
684
684
685 hg log -r "bisect(pruned)"
685 hg log -r "bisect(pruned)"
686
686
687 - see the changeset currently being bisected (especially useful
687 - see the changeset currently being bisected (especially useful
688 if running with -U/--noupdate)::
688 if running with -U/--noupdate)::
689
689
690 hg log -r "bisect(current)"
690 hg log -r "bisect(current)"
691
691
692 - see all changesets that took part in the current bisection::
692 - see all changesets that took part in the current bisection::
693
693
694 hg log -r "bisect(range)"
694 hg log -r "bisect(range)"
695
695
696 - you can even get a nice graph::
696 - you can even get a nice graph::
697
697
698 hg log --graph -r "bisect(range)"
698 hg log --graph -r "bisect(range)"
699
699
700 See :hg:`help revsets` for more about the `bisect()` keyword.
700 See :hg:`help revsets` for more about the `bisect()` keyword.
701
701
702 Returns 0 on success.
702 Returns 0 on success.
703 """
703 """
704 def extendbisectrange(nodes, good):
704 def extendbisectrange(nodes, good):
705 # bisect is incomplete when it ends on a merge node and
705 # bisect is incomplete when it ends on a merge node and
706 # one of the parent was not checked.
706 # one of the parent was not checked.
707 parents = repo[nodes[0]].parents()
707 parents = repo[nodes[0]].parents()
708 if len(parents) > 1:
708 if len(parents) > 1:
709 if good:
709 if good:
710 side = state['bad']
710 side = state['bad']
711 else:
711 else:
712 side = state['good']
712 side = state['good']
713 num = len(set(i.node() for i in parents) & set(side))
713 num = len(set(i.node() for i in parents) & set(side))
714 if num == 1:
714 if num == 1:
715 return parents[0].ancestor(parents[1])
715 return parents[0].ancestor(parents[1])
716 return None
716 return None
717
717
718 def print_result(nodes, good):
718 def print_result(nodes, good):
719 displayer = cmdutil.show_changeset(ui, repo, {})
719 displayer = cmdutil.show_changeset(ui, repo, {})
720 if len(nodes) == 1:
720 if len(nodes) == 1:
721 # narrowed it down to a single revision
721 # narrowed it down to a single revision
722 if good:
722 if good:
723 ui.write(_("The first good revision is:\n"))
723 ui.write(_("The first good revision is:\n"))
724 else:
724 else:
725 ui.write(_("The first bad revision is:\n"))
725 ui.write(_("The first bad revision is:\n"))
726 displayer.show(repo[nodes[0]])
726 displayer.show(repo[nodes[0]])
727 extendnode = extendbisectrange(nodes, good)
727 extendnode = extendbisectrange(nodes, good)
728 if extendnode is not None:
728 if extendnode is not None:
729 ui.write(_('Not all ancestors of this changeset have been'
729 ui.write(_('Not all ancestors of this changeset have been'
730 ' checked.\nUse bisect --extend to continue the '
730 ' checked.\nUse bisect --extend to continue the '
731 'bisection from\nthe common ancestor, %s.\n')
731 'bisection from\nthe common ancestor, %s.\n')
732 % extendnode)
732 % extendnode)
733 else:
733 else:
734 # multiple possible revisions
734 # multiple possible revisions
735 if good:
735 if good:
736 ui.write(_("Due to skipped revisions, the first "
736 ui.write(_("Due to skipped revisions, the first "
737 "good revision could be any of:\n"))
737 "good revision could be any of:\n"))
738 else:
738 else:
739 ui.write(_("Due to skipped revisions, the first "
739 ui.write(_("Due to skipped revisions, the first "
740 "bad revision could be any of:\n"))
740 "bad revision could be any of:\n"))
741 for n in nodes:
741 for n in nodes:
742 displayer.show(repo[n])
742 displayer.show(repo[n])
743 displayer.close()
743 displayer.close()
744
744
745 def check_state(state, interactive=True):
745 def check_state(state, interactive=True):
746 if not state['good'] or not state['bad']:
746 if not state['good'] or not state['bad']:
747 if (good or bad or skip or reset) and interactive:
747 if (good or bad or skip or reset) and interactive:
748 return
748 return
749 if not state['good']:
749 if not state['good']:
750 raise error.Abort(_('cannot bisect (no known good revisions)'))
750 raise error.Abort(_('cannot bisect (no known good revisions)'))
751 else:
751 else:
752 raise error.Abort(_('cannot bisect (no known bad revisions)'))
752 raise error.Abort(_('cannot bisect (no known bad revisions)'))
753 return True
753 return True
754
754
755 # backward compatibility
755 # backward compatibility
756 if rev in "good bad reset init".split():
756 if rev in "good bad reset init".split():
757 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
757 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
758 cmd, rev, extra = rev, extra, None
758 cmd, rev, extra = rev, extra, None
759 if cmd == "good":
759 if cmd == "good":
760 good = True
760 good = True
761 elif cmd == "bad":
761 elif cmd == "bad":
762 bad = True
762 bad = True
763 else:
763 else:
764 reset = True
764 reset = True
765 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
765 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
766 raise error.Abort(_('incompatible arguments'))
766 raise error.Abort(_('incompatible arguments'))
767
767
768 cmdutil.checkunfinished(repo)
768 cmdutil.checkunfinished(repo)
769
769
770 if reset:
770 if reset:
771 p = repo.join("bisect.state")
771 p = repo.join("bisect.state")
772 if os.path.exists(p):
772 if os.path.exists(p):
773 os.unlink(p)
773 os.unlink(p)
774 return
774 return
775
775
776 state = hbisect.load_state(repo)
776 state = hbisect.load_state(repo)
777
777
778 if command:
778 if command:
779 changesets = 1
779 changesets = 1
780 if noupdate:
780 if noupdate:
781 try:
781 try:
782 node = state['current'][0]
782 node = state['current'][0]
783 except LookupError:
783 except LookupError:
784 raise error.Abort(_('current bisect revision is unknown - '
784 raise error.Abort(_('current bisect revision is unknown - '
785 'start a new bisect to fix'))
785 'start a new bisect to fix'))
786 else:
786 else:
787 node, p2 = repo.dirstate.parents()
787 node, p2 = repo.dirstate.parents()
788 if p2 != nullid:
788 if p2 != nullid:
789 raise error.Abort(_('current bisect revision is a merge'))
789 raise error.Abort(_('current bisect revision is a merge'))
790 try:
790 try:
791 while changesets:
791 while changesets:
792 # update state
792 # update state
793 state['current'] = [node]
793 state['current'] = [node]
794 hbisect.save_state(repo, state)
794 hbisect.save_state(repo, state)
795 status = ui.system(command, environ={'HG_NODE': hex(node)})
795 status = ui.system(command, environ={'HG_NODE': hex(node)})
796 if status == 125:
796 if status == 125:
797 transition = "skip"
797 transition = "skip"
798 elif status == 0:
798 elif status == 0:
799 transition = "good"
799 transition = "good"
800 # status < 0 means process was killed
800 # status < 0 means process was killed
801 elif status == 127:
801 elif status == 127:
802 raise error.Abort(_("failed to execute %s") % command)
802 raise error.Abort(_("failed to execute %s") % command)
803 elif status < 0:
803 elif status < 0:
804 raise error.Abort(_("%s killed") % command)
804 raise error.Abort(_("%s killed") % command)
805 else:
805 else:
806 transition = "bad"
806 transition = "bad"
807 ctx = scmutil.revsingle(repo, rev, node)
807 ctx = scmutil.revsingle(repo, rev, node)
808 rev = None # clear for future iterations
808 rev = None # clear for future iterations
809 state[transition].append(ctx.node())
809 state[transition].append(ctx.node())
810 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
810 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
811 check_state(state, interactive=False)
811 check_state(state, interactive=False)
812 # bisect
812 # bisect
813 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
813 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
814 # update to next check
814 # update to next check
815 node = nodes[0]
815 node = nodes[0]
816 if not noupdate:
816 if not noupdate:
817 cmdutil.bailifchanged(repo)
817 cmdutil.bailifchanged(repo)
818 hg.clean(repo, node, show_stats=False)
818 hg.clean(repo, node, show_stats=False)
819 finally:
819 finally:
820 state['current'] = [node]
820 state['current'] = [node]
821 hbisect.save_state(repo, state)
821 hbisect.save_state(repo, state)
822 print_result(nodes, bgood)
822 print_result(nodes, bgood)
823 return
823 return
824
824
825 # update state
825 # update state
826
826
827 if rev:
827 if rev:
828 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
828 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
829 else:
829 else:
830 nodes = [repo.lookup('.')]
830 nodes = [repo.lookup('.')]
831
831
832 if good or bad or skip:
832 if good or bad or skip:
833 if good:
833 if good:
834 state['good'] += nodes
834 state['good'] += nodes
835 elif bad:
835 elif bad:
836 state['bad'] += nodes
836 state['bad'] += nodes
837 elif skip:
837 elif skip:
838 state['skip'] += nodes
838 state['skip'] += nodes
839 hbisect.save_state(repo, state)
839 hbisect.save_state(repo, state)
840
840
841 if not check_state(state):
841 if not check_state(state):
842 return
842 return
843
843
844 # actually bisect
844 # actually bisect
845 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
845 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
846 if extend:
846 if extend:
847 if not changesets:
847 if not changesets:
848 extendnode = extendbisectrange(nodes, good)
848 extendnode = extendbisectrange(nodes, good)
849 if extendnode is not None:
849 if extendnode is not None:
850 ui.write(_("Extending search to changeset %d:%s\n")
850 ui.write(_("Extending search to changeset %d:%s\n")
851 % (extendnode.rev(), extendnode))
851 % (extendnode.rev(), extendnode))
852 state['current'] = [extendnode.node()]
852 state['current'] = [extendnode.node()]
853 hbisect.save_state(repo, state)
853 hbisect.save_state(repo, state)
854 if noupdate:
854 if noupdate:
855 return
855 return
856 cmdutil.bailifchanged(repo)
856 cmdutil.bailifchanged(repo)
857 return hg.clean(repo, extendnode.node())
857 return hg.clean(repo, extendnode.node())
858 raise error.Abort(_("nothing to extend"))
858 raise error.Abort(_("nothing to extend"))
859
859
860 if changesets == 0:
860 if changesets == 0:
861 print_result(nodes, good)
861 print_result(nodes, good)
862 else:
862 else:
863 assert len(nodes) == 1 # only a single node can be tested next
863 assert len(nodes) == 1 # only a single node can be tested next
864 node = nodes[0]
864 node = nodes[0]
865 # compute the approximate number of remaining tests
865 # compute the approximate number of remaining tests
866 tests, size = 0, 2
866 tests, size = 0, 2
867 while size <= changesets:
867 while size <= changesets:
868 tests, size = tests + 1, size * 2
868 tests, size = tests + 1, size * 2
869 rev = repo.changelog.rev(node)
869 rev = repo.changelog.rev(node)
870 ui.write(_("Testing changeset %d:%s "
870 ui.write(_("Testing changeset %d:%s "
871 "(%d changesets remaining, ~%d tests)\n")
871 "(%d changesets remaining, ~%d tests)\n")
872 % (rev, short(node), changesets, tests))
872 % (rev, short(node), changesets, tests))
873 state['current'] = [node]
873 state['current'] = [node]
874 hbisect.save_state(repo, state)
874 hbisect.save_state(repo, state)
875 if not noupdate:
875 if not noupdate:
876 cmdutil.bailifchanged(repo)
876 cmdutil.bailifchanged(repo)
877 return hg.clean(repo, node)
877 return hg.clean(repo, node)
878
878
879 @command('bookmarks|bookmark',
879 @command('bookmarks|bookmark',
880 [('f', 'force', False, _('force')),
880 [('f', 'force', False, _('force')),
881 ('r', 'rev', '', _('revision'), _('REV')),
881 ('r', 'rev', '', _('revision'), _('REV')),
882 ('d', 'delete', False, _('delete a given bookmark')),
882 ('d', 'delete', False, _('delete a given bookmark')),
883 ('m', 'rename', '', _('rename a given bookmark'), _('OLD')),
883 ('m', 'rename', '', _('rename a given bookmark'), _('OLD')),
884 ('i', 'inactive', False, _('mark a bookmark inactive')),
884 ('i', 'inactive', False, _('mark a bookmark inactive')),
885 ] + formatteropts,
885 ] + formatteropts,
886 _('hg bookmarks [OPTIONS]... [NAME]...'))
886 _('hg bookmarks [OPTIONS]... [NAME]...'))
887 def bookmark(ui, repo, *names, **opts):
887 def bookmark(ui, repo, *names, **opts):
888 '''create a new bookmark or list existing bookmarks
888 '''create a new bookmark or list existing bookmarks
889
889
890 Bookmarks are labels on changesets to help track lines of development.
890 Bookmarks are labels on changesets to help track lines of development.
891 Bookmarks are unversioned and can be moved, renamed and deleted.
891 Bookmarks are unversioned and can be moved, renamed and deleted.
892 Deleting or moving a bookmark has no effect on the associated changesets.
892 Deleting or moving a bookmark has no effect on the associated changesets.
893
893
894 Creating or updating to a bookmark causes it to be marked as 'active'.
894 Creating or updating to a bookmark causes it to be marked as 'active'.
895 The active bookmark is indicated with a '*'.
895 The active bookmark is indicated with a '*'.
896 When a commit is made, the active bookmark will advance to the new commit.
896 When a commit is made, the active bookmark will advance to the new commit.
897 A plain :hg:`update` will also advance an active bookmark, if possible.
897 A plain :hg:`update` will also advance an active bookmark, if possible.
898 Updating away from a bookmark will cause it to be deactivated.
898 Updating away from a bookmark will cause it to be deactivated.
899
899
900 Bookmarks can be pushed and pulled between repositories (see
900 Bookmarks can be pushed and pulled between repositories (see
901 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
901 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
902 diverged, a new 'divergent bookmark' of the form 'name@path' will
902 diverged, a new 'divergent bookmark' of the form 'name@path' will
903 be created. Using :hg:`merge` will resolve the divergence.
903 be created. Using :hg:`merge` will resolve the divergence.
904
904
905 A bookmark named '@' has the special property that :hg:`clone` will
905 A bookmark named '@' has the special property that :hg:`clone` will
906 check it out by default if it exists.
906 check it out by default if it exists.
907
907
908 .. container:: verbose
908 .. container:: verbose
909
909
910 Examples:
910 Examples:
911
911
912 - create an active bookmark for a new line of development::
912 - create an active bookmark for a new line of development::
913
913
914 hg book new-feature
914 hg book new-feature
915
915
916 - create an inactive bookmark as a place marker::
916 - create an inactive bookmark as a place marker::
917
917
918 hg book -i reviewed
918 hg book -i reviewed
919
919
920 - create an inactive bookmark on another changeset::
920 - create an inactive bookmark on another changeset::
921
921
922 hg book -r .^ tested
922 hg book -r .^ tested
923
923
924 - rename bookmark turkey to dinner::
924 - rename bookmark turkey to dinner::
925
925
926 hg book -m turkey dinner
926 hg book -m turkey dinner
927
927
928 - move the '@' bookmark from another branch::
928 - move the '@' bookmark from another branch::
929
929
930 hg book -f @
930 hg book -f @
931 '''
931 '''
932 force = opts.get('force')
932 force = opts.get('force')
933 rev = opts.get('rev')
933 rev = opts.get('rev')
934 delete = opts.get('delete')
934 delete = opts.get('delete')
935 rename = opts.get('rename')
935 rename = opts.get('rename')
936 inactive = opts.get('inactive')
936 inactive = opts.get('inactive')
937
937
938 def checkformat(mark):
938 def checkformat(mark):
939 mark = mark.strip()
939 mark = mark.strip()
940 if not mark:
940 if not mark:
941 raise error.Abort(_("bookmark names cannot consist entirely of "
941 raise error.Abort(_("bookmark names cannot consist entirely of "
942 "whitespace"))
942 "whitespace"))
943 scmutil.checknewlabel(repo, mark, 'bookmark')
943 scmutil.checknewlabel(repo, mark, 'bookmark')
944 return mark
944 return mark
945
945
946 def checkconflict(repo, mark, cur, force=False, target=None):
946 def checkconflict(repo, mark, cur, force=False, target=None):
947 if mark in marks and not force:
947 if mark in marks and not force:
948 if target:
948 if target:
949 if marks[mark] == target and target == cur:
949 if marks[mark] == target and target == cur:
950 # re-activating a bookmark
950 # re-activating a bookmark
951 return
951 return
952 anc = repo.changelog.ancestors([repo[target].rev()])
952 anc = repo.changelog.ancestors([repo[target].rev()])
953 bmctx = repo[marks[mark]]
953 bmctx = repo[marks[mark]]
954 divs = [repo[b].node() for b in marks
954 divs = [repo[b].node() for b in marks
955 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
955 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
956
956
957 # allow resolving a single divergent bookmark even if moving
957 # allow resolving a single divergent bookmark even if moving
958 # the bookmark across branches when a revision is specified
958 # the bookmark across branches when a revision is specified
959 # that contains a divergent bookmark
959 # that contains a divergent bookmark
960 if bmctx.rev() not in anc and target in divs:
960 if bmctx.rev() not in anc and target in divs:
961 bookmarks.deletedivergent(repo, [target], mark)
961 bookmarks.deletedivergent(repo, [target], mark)
962 return
962 return
963
963
964 deletefrom = [b for b in divs
964 deletefrom = [b for b in divs
965 if repo[b].rev() in anc or b == target]
965 if repo[b].rev() in anc or b == target]
966 bookmarks.deletedivergent(repo, deletefrom, mark)
966 bookmarks.deletedivergent(repo, deletefrom, mark)
967 if bookmarks.validdest(repo, bmctx, repo[target]):
967 if bookmarks.validdest(repo, bmctx, repo[target]):
968 ui.status(_("moving bookmark '%s' forward from %s\n") %
968 ui.status(_("moving bookmark '%s' forward from %s\n") %
969 (mark, short(bmctx.node())))
969 (mark, short(bmctx.node())))
970 return
970 return
971 raise error.Abort(_("bookmark '%s' already exists "
971 raise error.Abort(_("bookmark '%s' already exists "
972 "(use -f to force)") % mark)
972 "(use -f to force)") % mark)
973 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
973 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
974 and not force):
974 and not force):
975 raise error.Abort(
975 raise error.Abort(
976 _("a bookmark cannot have the name of an existing branch"))
976 _("a bookmark cannot have the name of an existing branch"))
977
977
978 if delete and rename:
978 if delete and rename:
979 raise error.Abort(_("--delete and --rename are incompatible"))
979 raise error.Abort(_("--delete and --rename are incompatible"))
980 if delete and rev:
980 if delete and rev:
981 raise error.Abort(_("--rev is incompatible with --delete"))
981 raise error.Abort(_("--rev is incompatible with --delete"))
982 if rename and rev:
982 if rename and rev:
983 raise error.Abort(_("--rev is incompatible with --rename"))
983 raise error.Abort(_("--rev is incompatible with --rename"))
984 if not names and (delete or rev):
984 if not names and (delete or rev):
985 raise error.Abort(_("bookmark name required"))
985 raise error.Abort(_("bookmark name required"))
986
986
987 if delete or rename or names or inactive:
987 if delete or rename or names or inactive:
988 wlock = lock = tr = None
988 wlock = lock = tr = None
989 try:
989 try:
990 wlock = repo.wlock()
990 wlock = repo.wlock()
991 lock = repo.lock()
991 lock = repo.lock()
992 cur = repo.changectx('.').node()
992 cur = repo.changectx('.').node()
993 marks = repo._bookmarks
993 marks = repo._bookmarks
994 if delete:
994 if delete:
995 tr = repo.transaction('bookmark')
995 tr = repo.transaction('bookmark')
996 for mark in names:
996 for mark in names:
997 if mark not in marks:
997 if mark not in marks:
998 raise error.Abort(_("bookmark '%s' does not exist") %
998 raise error.Abort(_("bookmark '%s' does not exist") %
999 mark)
999 mark)
1000 if mark == repo._activebookmark:
1000 if mark == repo._activebookmark:
1001 bookmarks.deactivate(repo)
1001 bookmarks.deactivate(repo)
1002 del marks[mark]
1002 del marks[mark]
1003
1003
1004 elif rename:
1004 elif rename:
1005 tr = repo.transaction('bookmark')
1005 tr = repo.transaction('bookmark')
1006 if not names:
1006 if not names:
1007 raise error.Abort(_("new bookmark name required"))
1007 raise error.Abort(_("new bookmark name required"))
1008 elif len(names) > 1:
1008 elif len(names) > 1:
1009 raise error.Abort(_("only one new bookmark name allowed"))
1009 raise error.Abort(_("only one new bookmark name allowed"))
1010 mark = checkformat(names[0])
1010 mark = checkformat(names[0])
1011 if rename not in marks:
1011 if rename not in marks:
1012 raise error.Abort(_("bookmark '%s' does not exist")
1012 raise error.Abort(_("bookmark '%s' does not exist")
1013 % rename)
1013 % rename)
1014 checkconflict(repo, mark, cur, force)
1014 checkconflict(repo, mark, cur, force)
1015 marks[mark] = marks[rename]
1015 marks[mark] = marks[rename]
1016 if repo._activebookmark == rename and not inactive:
1016 if repo._activebookmark == rename and not inactive:
1017 bookmarks.activate(repo, mark)
1017 bookmarks.activate(repo, mark)
1018 del marks[rename]
1018 del marks[rename]
1019 elif names:
1019 elif names:
1020 tr = repo.transaction('bookmark')
1020 tr = repo.transaction('bookmark')
1021 newact = None
1021 newact = None
1022 for mark in names:
1022 for mark in names:
1023 mark = checkformat(mark)
1023 mark = checkformat(mark)
1024 if newact is None:
1024 if newact is None:
1025 newact = mark
1025 newact = mark
1026 if inactive and mark == repo._activebookmark:
1026 if inactive and mark == repo._activebookmark:
1027 bookmarks.deactivate(repo)
1027 bookmarks.deactivate(repo)
1028 return
1028 return
1029 tgt = cur
1029 tgt = cur
1030 if rev:
1030 if rev:
1031 tgt = scmutil.revsingle(repo, rev).node()
1031 tgt = scmutil.revsingle(repo, rev).node()
1032 checkconflict(repo, mark, cur, force, tgt)
1032 checkconflict(repo, mark, cur, force, tgt)
1033 marks[mark] = tgt
1033 marks[mark] = tgt
1034 if not inactive and cur == marks[newact] and not rev:
1034 if not inactive and cur == marks[newact] and not rev:
1035 bookmarks.activate(repo, newact)
1035 bookmarks.activate(repo, newact)
1036 elif cur != tgt and newact == repo._activebookmark:
1036 elif cur != tgt and newact == repo._activebookmark:
1037 bookmarks.deactivate(repo)
1037 bookmarks.deactivate(repo)
1038 elif inactive:
1038 elif inactive:
1039 if len(marks) == 0:
1039 if len(marks) == 0:
1040 ui.status(_("no bookmarks set\n"))
1040 ui.status(_("no bookmarks set\n"))
1041 elif not repo._activebookmark:
1041 elif not repo._activebookmark:
1042 ui.status(_("no active bookmark\n"))
1042 ui.status(_("no active bookmark\n"))
1043 else:
1043 else:
1044 bookmarks.deactivate(repo)
1044 bookmarks.deactivate(repo)
1045 if tr is not None:
1045 if tr is not None:
1046 marks.recordchange(tr)
1046 marks.recordchange(tr)
1047 tr.close()
1047 tr.close()
1048 finally:
1048 finally:
1049 lockmod.release(tr, lock, wlock)
1049 lockmod.release(tr, lock, wlock)
1050 else: # show bookmarks
1050 else: # show bookmarks
1051 fm = ui.formatter('bookmarks', opts)
1051 fm = ui.formatter('bookmarks', opts)
1052 hexfn = fm.hexfunc
1052 hexfn = fm.hexfunc
1053 marks = repo._bookmarks
1053 marks = repo._bookmarks
1054 if len(marks) == 0 and not fm:
1054 if len(marks) == 0 and not fm:
1055 ui.status(_("no bookmarks set\n"))
1055 ui.status(_("no bookmarks set\n"))
1056 for bmark, n in sorted(marks.iteritems()):
1056 for bmark, n in sorted(marks.iteritems()):
1057 active = repo._activebookmark
1057 active = repo._activebookmark
1058 if bmark == active:
1058 if bmark == active:
1059 prefix, label = '*', activebookmarklabel
1059 prefix, label = '*', activebookmarklabel
1060 else:
1060 else:
1061 prefix, label = ' ', ''
1061 prefix, label = ' ', ''
1062
1062
1063 fm.startitem()
1063 fm.startitem()
1064 if not ui.quiet:
1064 if not ui.quiet:
1065 fm.plain(' %s ' % prefix, label=label)
1065 fm.plain(' %s ' % prefix, label=label)
1066 fm.write('bookmark', '%s', bmark, label=label)
1066 fm.write('bookmark', '%s', bmark, label=label)
1067 pad = " " * (25 - encoding.colwidth(bmark))
1067 pad = " " * (25 - encoding.colwidth(bmark))
1068 fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s',
1068 fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s',
1069 repo.changelog.rev(n), hexfn(n), label=label)
1069 repo.changelog.rev(n), hexfn(n), label=label)
1070 fm.data(active=(bmark == active))
1070 fm.data(active=(bmark == active))
1071 fm.plain('\n')
1071 fm.plain('\n')
1072 fm.end()
1072 fm.end()
1073
1073
1074 @command('branch',
1074 @command('branch',
1075 [('f', 'force', None,
1075 [('f', 'force', None,
1076 _('set branch name even if it shadows an existing branch')),
1076 _('set branch name even if it shadows an existing branch')),
1077 ('C', 'clean', None, _('reset branch name to parent branch name'))],
1077 ('C', 'clean', None, _('reset branch name to parent branch name'))],
1078 _('[-fC] [NAME]'))
1078 _('[-fC] [NAME]'))
1079 def branch(ui, repo, label=None, **opts):
1079 def branch(ui, repo, label=None, **opts):
1080 """set or show the current branch name
1080 """set or show the current branch name
1081
1081
1082 .. note::
1082 .. note::
1083
1083
1084 Branch names are permanent and global. Use :hg:`bookmark` to create a
1084 Branch names are permanent and global. Use :hg:`bookmark` to create a
1085 light-weight bookmark instead. See :hg:`help glossary` for more
1085 light-weight bookmark instead. See :hg:`help glossary` for more
1086 information about named branches and bookmarks.
1086 information about named branches and bookmarks.
1087
1087
1088 With no argument, show the current branch name. With one argument,
1088 With no argument, show the current branch name. With one argument,
1089 set the working directory branch name (the branch will not exist
1089 set the working directory branch name (the branch will not exist
1090 in the repository until the next commit). Standard practice
1090 in the repository until the next commit). Standard practice
1091 recommends that primary development take place on the 'default'
1091 recommends that primary development take place on the 'default'
1092 branch.
1092 branch.
1093
1093
1094 Unless -f/--force is specified, branch will not let you set a
1094 Unless -f/--force is specified, branch will not let you set a
1095 branch name that already exists.
1095 branch name that already exists.
1096
1096
1097 Use -C/--clean to reset the working directory branch to that of
1097 Use -C/--clean to reset the working directory branch to that of
1098 the parent of the working directory, negating a previous branch
1098 the parent of the working directory, negating a previous branch
1099 change.
1099 change.
1100
1100
1101 Use the command :hg:`update` to switch to an existing branch. Use
1101 Use the command :hg:`update` to switch to an existing branch. Use
1102 :hg:`commit --close-branch` to mark this branch head as closed.
1102 :hg:`commit --close-branch` to mark this branch head as closed.
1103 When all heads of the branch are closed, the branch will be
1103 When all heads of the branch are closed, the branch will be
1104 considered closed.
1104 considered closed.
1105
1105
1106 Returns 0 on success.
1106 Returns 0 on success.
1107 """
1107 """
1108 if label:
1108 if label:
1109 label = label.strip()
1109 label = label.strip()
1110
1110
1111 if not opts.get('clean') and not label:
1111 if not opts.get('clean') and not label:
1112 ui.write("%s\n" % repo.dirstate.branch())
1112 ui.write("%s\n" % repo.dirstate.branch())
1113 return
1113 return
1114
1114
1115 wlock = repo.wlock()
1115 wlock = repo.wlock()
1116 try:
1116 try:
1117 if opts.get('clean'):
1117 if opts.get('clean'):
1118 label = repo[None].p1().branch()
1118 label = repo[None].p1().branch()
1119 repo.dirstate.setbranch(label)
1119 repo.dirstate.setbranch(label)
1120 ui.status(_('reset working directory to branch %s\n') % label)
1120 ui.status(_('reset working directory to branch %s\n') % label)
1121 elif label:
1121 elif label:
1122 if not opts.get('force') and label in repo.branchmap():
1122 if not opts.get('force') and label in repo.branchmap():
1123 if label not in [p.branch() for p in repo.parents()]:
1123 if label not in [p.branch() for p in repo.parents()]:
1124 raise error.Abort(_('a branch of the same name already'
1124 raise error.Abort(_('a branch of the same name already'
1125 ' exists'),
1125 ' exists'),
1126 # i18n: "it" refers to an existing branch
1126 # i18n: "it" refers to an existing branch
1127 hint=_("use 'hg update' to switch to it"))
1127 hint=_("use 'hg update' to switch to it"))
1128 scmutil.checknewlabel(repo, label, 'branch')
1128 scmutil.checknewlabel(repo, label, 'branch')
1129 repo.dirstate.setbranch(label)
1129 repo.dirstate.setbranch(label)
1130 ui.status(_('marked working directory as branch %s\n') % label)
1130 ui.status(_('marked working directory as branch %s\n') % label)
1131
1131
1132 # find any open named branches aside from default
1132 # find any open named branches aside from default
1133 others = [n for n, h, t, c in repo.branchmap().iterbranches()
1133 others = [n for n, h, t, c in repo.branchmap().iterbranches()
1134 if n != "default" and not c]
1134 if n != "default" and not c]
1135 if not others:
1135 if not others:
1136 ui.status(_('(branches are permanent and global, '
1136 ui.status(_('(branches are permanent and global, '
1137 'did you want a bookmark?)\n'))
1137 'did you want a bookmark?)\n'))
1138 finally:
1138 finally:
1139 wlock.release()
1139 wlock.release()
1140
1140
1141 @command('branches',
1141 @command('branches',
1142 [('a', 'active', False,
1142 [('a', 'active', False,
1143 _('show only branches that have unmerged heads (DEPRECATED)')),
1143 _('show only branches that have unmerged heads (DEPRECATED)')),
1144 ('c', 'closed', False, _('show normal and closed branches')),
1144 ('c', 'closed', False, _('show normal and closed branches')),
1145 ] + formatteropts,
1145 ] + formatteropts,
1146 _('[-ac]'))
1146 _('[-ac]'))
1147 def branches(ui, repo, active=False, closed=False, **opts):
1147 def branches(ui, repo, active=False, closed=False, **opts):
1148 """list repository named branches
1148 """list repository named branches
1149
1149
1150 List the repository's named branches, indicating which ones are
1150 List the repository's named branches, indicating which ones are
1151 inactive. If -c/--closed is specified, also list branches which have
1151 inactive. If -c/--closed is specified, also list branches which have
1152 been marked closed (see :hg:`commit --close-branch`).
1152 been marked closed (see :hg:`commit --close-branch`).
1153
1153
1154 Use the command :hg:`update` to switch to an existing branch.
1154 Use the command :hg:`update` to switch to an existing branch.
1155
1155
1156 Returns 0.
1156 Returns 0.
1157 """
1157 """
1158
1158
1159 fm = ui.formatter('branches', opts)
1159 fm = ui.formatter('branches', opts)
1160 hexfunc = fm.hexfunc
1160 hexfunc = fm.hexfunc
1161
1161
1162 allheads = set(repo.heads())
1162 allheads = set(repo.heads())
1163 branches = []
1163 branches = []
1164 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1164 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1165 isactive = not isclosed and bool(set(heads) & allheads)
1165 isactive = not isclosed and bool(set(heads) & allheads)
1166 branches.append((tag, repo[tip], isactive, not isclosed))
1166 branches.append((tag, repo[tip], isactive, not isclosed))
1167 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1167 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1168 reverse=True)
1168 reverse=True)
1169
1169
1170 for tag, ctx, isactive, isopen in branches:
1170 for tag, ctx, isactive, isopen in branches:
1171 if active and not isactive:
1171 if active and not isactive:
1172 continue
1172 continue
1173 if isactive:
1173 if isactive:
1174 label = 'branches.active'
1174 label = 'branches.active'
1175 notice = ''
1175 notice = ''
1176 elif not isopen:
1176 elif not isopen:
1177 if not closed:
1177 if not closed:
1178 continue
1178 continue
1179 label = 'branches.closed'
1179 label = 'branches.closed'
1180 notice = _(' (closed)')
1180 notice = _(' (closed)')
1181 else:
1181 else:
1182 label = 'branches.inactive'
1182 label = 'branches.inactive'
1183 notice = _(' (inactive)')
1183 notice = _(' (inactive)')
1184 current = (tag == repo.dirstate.branch())
1184 current = (tag == repo.dirstate.branch())
1185 if current:
1185 if current:
1186 label = 'branches.current'
1186 label = 'branches.current'
1187
1187
1188 fm.startitem()
1188 fm.startitem()
1189 fm.write('branch', '%s', tag, label=label)
1189 fm.write('branch', '%s', tag, label=label)
1190 rev = ctx.rev()
1190 rev = ctx.rev()
1191 padsize = max(31 - len(str(rev)) - encoding.colwidth(tag), 0)
1191 padsize = max(31 - len(str(rev)) - encoding.colwidth(tag), 0)
1192 fmt = ' ' * padsize + ' %d:%s'
1192 fmt = ' ' * padsize + ' %d:%s'
1193 fm.condwrite(not ui.quiet, 'rev node', fmt, rev, hexfunc(ctx.node()),
1193 fm.condwrite(not ui.quiet, 'rev node', fmt, rev, hexfunc(ctx.node()),
1194 label='log.changeset changeset.%s' % ctx.phasestr())
1194 label='log.changeset changeset.%s' % ctx.phasestr())
1195 fm.data(active=isactive, closed=not isopen, current=current)
1195 fm.data(active=isactive, closed=not isopen, current=current)
1196 if not ui.quiet:
1196 if not ui.quiet:
1197 fm.plain(notice)
1197 fm.plain(notice)
1198 fm.plain('\n')
1198 fm.plain('\n')
1199 fm.end()
1199 fm.end()
1200
1200
1201 @command('bundle',
1201 @command('bundle',
1202 [('f', 'force', None, _('run even when the destination is unrelated')),
1202 [('f', 'force', None, _('run even when the destination is unrelated')),
1203 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1203 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1204 _('REV')),
1204 _('REV')),
1205 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1205 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1206 _('BRANCH')),
1206 _('BRANCH')),
1207 ('', 'base', [],
1207 ('', 'base', [],
1208 _('a base changeset assumed to be available at the destination'),
1208 _('a base changeset assumed to be available at the destination'),
1209 _('REV')),
1209 _('REV')),
1210 ('a', 'all', None, _('bundle all changesets in the repository')),
1210 ('a', 'all', None, _('bundle all changesets in the repository')),
1211 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1211 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1212 ] + remoteopts,
1212 ] + remoteopts,
1213 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1213 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1214 def bundle(ui, repo, fname, dest=None, **opts):
1214 def bundle(ui, repo, fname, dest=None, **opts):
1215 """create a changegroup file
1215 """create a changegroup file
1216
1216
1217 Generate a compressed changegroup file collecting changesets not
1217 Generate a compressed changegroup file collecting changesets not
1218 known to be in another repository.
1218 known to be in another repository.
1219
1219
1220 If you omit the destination repository, then hg assumes the
1220 If you omit the destination repository, then hg assumes the
1221 destination will have all the nodes you specify with --base
1221 destination will have all the nodes you specify with --base
1222 parameters. To create a bundle containing all changesets, use
1222 parameters. To create a bundle containing all changesets, use
1223 -a/--all (or --base null).
1223 -a/--all (or --base null).
1224
1224
1225 You can change bundle format with the -t/--type option. You can
1225 You can change bundle format with the -t/--type option. You can
1226 specify a compression, a bundle version or both using a dash
1226 specify a compression, a bundle version or both using a dash
1227 (comp-version). The available compression methods are: none, bzip2,
1227 (comp-version). The available compression methods are: none, bzip2,
1228 and gzip (by default, bundles are compressed using bzip2). The
1228 and gzip (by default, bundles are compressed using bzip2). The
1229 available format are: v1, v2 (default to most suitable).
1229 available format are: v1, v2 (default to most suitable).
1230
1230
1231 The bundle file can then be transferred using conventional means
1231 The bundle file can then be transferred using conventional means
1232 and applied to another repository with the unbundle or pull
1232 and applied to another repository with the unbundle or pull
1233 command. This is useful when direct push and pull are not
1233 command. This is useful when direct push and pull are not
1234 available or when exporting an entire repository is undesirable.
1234 available or when exporting an entire repository is undesirable.
1235
1235
1236 Applying bundles preserves all changeset contents including
1236 Applying bundles preserves all changeset contents including
1237 permissions, copy/rename information, and revision history.
1237 permissions, copy/rename information, and revision history.
1238
1238
1239 Returns 0 on success, 1 if no changes found.
1239 Returns 0 on success, 1 if no changes found.
1240 """
1240 """
1241 revs = None
1241 revs = None
1242 if 'rev' in opts:
1242 if 'rev' in opts:
1243 revs = scmutil.revrange(repo, opts['rev'])
1243 revs = scmutil.revrange(repo, opts['rev'])
1244
1244
1245 bundletype = opts.get('type', 'bzip2').lower()
1245 bundletype = opts.get('type', 'bzip2').lower()
1246 try:
1246 try:
1247 bcompression, cgversion = exchange.parsebundlespec(
1247 bcompression, cgversion = exchange.parsebundlespec(
1248 repo, bundletype, strict=False)
1248 repo, bundletype, strict=False)
1249 except error.UnsupportedBundleSpecification as e:
1249 except error.UnsupportedBundleSpecification as e:
1250 raise error.Abort(str(e),
1250 raise error.Abort(str(e),
1251 hint=_('see "hg help bundle" for supported '
1251 hint=_('see "hg help bundle" for supported '
1252 'values for --type'))
1252 'values for --type'))
1253
1253
1254 # Packed bundles are a pseudo bundle format for now.
1254 # Packed bundles are a pseudo bundle format for now.
1255 if cgversion == 's1':
1255 if cgversion == 's1':
1256 raise error.Abort(_('packed bundles cannot be produced by "hg bundle"'),
1256 raise error.Abort(_('packed bundles cannot be produced by "hg bundle"'),
1257 hint=_('use "hg debugcreatestreamclonebundle"'))
1257 hint=_('use "hg debugcreatestreamclonebundle"'))
1258
1258
1259 if opts.get('all'):
1259 if opts.get('all'):
1260 base = ['null']
1260 base = ['null']
1261 else:
1261 else:
1262 base = scmutil.revrange(repo, opts.get('base'))
1262 base = scmutil.revrange(repo, opts.get('base'))
1263 # TODO: get desired bundlecaps from command line.
1263 # TODO: get desired bundlecaps from command line.
1264 bundlecaps = None
1264 bundlecaps = None
1265 if base:
1265 if base:
1266 if dest:
1266 if dest:
1267 raise error.Abort(_("--base is incompatible with specifying "
1267 raise error.Abort(_("--base is incompatible with specifying "
1268 "a destination"))
1268 "a destination"))
1269 common = [repo.lookup(rev) for rev in base]
1269 common = [repo.lookup(rev) for rev in base]
1270 heads = revs and map(repo.lookup, revs) or revs
1270 heads = revs and map(repo.lookup, revs) or revs
1271 cg = changegroup.getchangegroup(repo, 'bundle', heads=heads,
1271 cg = changegroup.getchangegroup(repo, 'bundle', heads=heads,
1272 common=common, bundlecaps=bundlecaps,
1272 common=common, bundlecaps=bundlecaps,
1273 version=cgversion)
1273 version=cgversion)
1274 outgoing = None
1274 outgoing = None
1275 else:
1275 else:
1276 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1276 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1277 dest, branches = hg.parseurl(dest, opts.get('branch'))
1277 dest, branches = hg.parseurl(dest, opts.get('branch'))
1278 other = hg.peer(repo, opts, dest)
1278 other = hg.peer(repo, opts, dest)
1279 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1279 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1280 heads = revs and map(repo.lookup, revs) or revs
1280 heads = revs and map(repo.lookup, revs) or revs
1281 outgoing = discovery.findcommonoutgoing(repo, other,
1281 outgoing = discovery.findcommonoutgoing(repo, other,
1282 onlyheads=heads,
1282 onlyheads=heads,
1283 force=opts.get('force'),
1283 force=opts.get('force'),
1284 portable=True)
1284 portable=True)
1285 cg = changegroup.getlocalchangegroup(repo, 'bundle', outgoing,
1285 cg = changegroup.getlocalchangegroup(repo, 'bundle', outgoing,
1286 bundlecaps, version=cgversion)
1286 bundlecaps, version=cgversion)
1287 if not cg:
1287 if not cg:
1288 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1288 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1289 return 1
1289 return 1
1290
1290
1291 if cgversion == '01': #bundle1
1291 if cgversion == '01': #bundle1
1292 if bcompression is None:
1292 if bcompression is None:
1293 bcompression = 'UN'
1293 bcompression = 'UN'
1294 bversion = 'HG10' + bcompression
1294 bversion = 'HG10' + bcompression
1295 bcompression = None
1295 bcompression = None
1296 else:
1296 else:
1297 assert cgversion == '02'
1297 assert cgversion == '02'
1298 bversion = 'HG20'
1298 bversion = 'HG20'
1299
1299
1300
1300
1301 changegroup.writebundle(ui, cg, fname, bversion, compression=bcompression)
1301 changegroup.writebundle(ui, cg, fname, bversion, compression=bcompression)
1302
1302
1303 @command('cat',
1303 @command('cat',
1304 [('o', 'output', '',
1304 [('o', 'output', '',
1305 _('print output to file with formatted name'), _('FORMAT')),
1305 _('print output to file with formatted name'), _('FORMAT')),
1306 ('r', 'rev', '', _('print the given revision'), _('REV')),
1306 ('r', 'rev', '', _('print the given revision'), _('REV')),
1307 ('', 'decode', None, _('apply any matching decode filter')),
1307 ('', 'decode', None, _('apply any matching decode filter')),
1308 ] + walkopts,
1308 ] + walkopts,
1309 _('[OPTION]... FILE...'),
1309 _('[OPTION]... FILE...'),
1310 inferrepo=True)
1310 inferrepo=True)
1311 def cat(ui, repo, file1, *pats, **opts):
1311 def cat(ui, repo, file1, *pats, **opts):
1312 """output the current or given revision of files
1312 """output the current or given revision of files
1313
1313
1314 Print the specified files as they were at the given revision. If
1314 Print the specified files as they were at the given revision. If
1315 no revision is given, the parent of the working directory is used.
1315 no revision is given, the parent of the working directory is used.
1316
1316
1317 Output may be to a file, in which case the name of the file is
1317 Output may be to a file, in which case the name of the file is
1318 given using a format string. The formatting rules as follows:
1318 given using a format string. The formatting rules as follows:
1319
1319
1320 :``%%``: literal "%" character
1320 :``%%``: literal "%" character
1321 :``%s``: basename of file being printed
1321 :``%s``: basename of file being printed
1322 :``%d``: dirname of file being printed, or '.' if in repository root
1322 :``%d``: dirname of file being printed, or '.' if in repository root
1323 :``%p``: root-relative path name of file being printed
1323 :``%p``: root-relative path name of file being printed
1324 :``%H``: changeset hash (40 hexadecimal digits)
1324 :``%H``: changeset hash (40 hexadecimal digits)
1325 :``%R``: changeset revision number
1325 :``%R``: changeset revision number
1326 :``%h``: short-form changeset hash (12 hexadecimal digits)
1326 :``%h``: short-form changeset hash (12 hexadecimal digits)
1327 :``%r``: zero-padded changeset revision number
1327 :``%r``: zero-padded changeset revision number
1328 :``%b``: basename of the exporting repository
1328 :``%b``: basename of the exporting repository
1329
1329
1330 Returns 0 on success.
1330 Returns 0 on success.
1331 """
1331 """
1332 ctx = scmutil.revsingle(repo, opts.get('rev'))
1332 ctx = scmutil.revsingle(repo, opts.get('rev'))
1333 m = scmutil.match(ctx, (file1,) + pats, opts)
1333 m = scmutil.match(ctx, (file1,) + pats, opts)
1334
1334
1335 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1335 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1336
1336
1337 @command('^clone',
1337 @command('^clone',
1338 [('U', 'noupdate', None, _('the clone will include an empty working '
1338 [('U', 'noupdate', None, _('the clone will include an empty working '
1339 'directory (only a repository)')),
1339 'directory (only a repository)')),
1340 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1340 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1341 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1341 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1342 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1342 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1343 ('', 'pull', None, _('use pull protocol to copy metadata')),
1343 ('', 'pull', None, _('use pull protocol to copy metadata')),
1344 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1344 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1345 ] + remoteopts,
1345 ] + remoteopts,
1346 _('[OPTION]... SOURCE [DEST]'),
1346 _('[OPTION]... SOURCE [DEST]'),
1347 norepo=True)
1347 norepo=True)
1348 def clone(ui, source, dest=None, **opts):
1348 def clone(ui, source, dest=None, **opts):
1349 """make a copy of an existing repository
1349 """make a copy of an existing repository
1350
1350
1351 Create a copy of an existing repository in a new directory.
1351 Create a copy of an existing repository in a new directory.
1352
1352
1353 If no destination directory name is specified, it defaults to the
1353 If no destination directory name is specified, it defaults to the
1354 basename of the source.
1354 basename of the source.
1355
1355
1356 The location of the source is added to the new repository's
1356 The location of the source is added to the new repository's
1357 ``.hg/hgrc`` file, as the default to be used for future pulls.
1357 ``.hg/hgrc`` file, as the default to be used for future pulls.
1358
1358
1359 Only local paths and ``ssh://`` URLs are supported as
1359 Only local paths and ``ssh://`` URLs are supported as
1360 destinations. For ``ssh://`` destinations, no working directory or
1360 destinations. For ``ssh://`` destinations, no working directory or
1361 ``.hg/hgrc`` will be created on the remote side.
1361 ``.hg/hgrc`` will be created on the remote side.
1362
1362
1363 To pull only a subset of changesets, specify one or more revisions
1363 To pull only a subset of changesets, specify one or more revisions
1364 identifiers with -r/--rev or branches with -b/--branch. The
1364 identifiers with -r/--rev or branches with -b/--branch. The
1365 resulting clone will contain only the specified changesets and
1365 resulting clone will contain only the specified changesets and
1366 their ancestors. These options (or 'clone src#rev dest') imply
1366 their ancestors. These options (or 'clone src#rev dest') imply
1367 --pull, even for local source repositories. Note that specifying a
1367 --pull, even for local source repositories. Note that specifying a
1368 tag will include the tagged changeset but not the changeset
1368 tag will include the tagged changeset but not the changeset
1369 containing the tag.
1369 containing the tag.
1370
1370
1371 If the source repository has a bookmark called '@' set, that
1371 If the source repository has a bookmark called '@' set, that
1372 revision will be checked out in the new repository by default.
1372 revision will be checked out in the new repository by default.
1373
1373
1374 To check out a particular version, use -u/--update, or
1374 To check out a particular version, use -u/--update, or
1375 -U/--noupdate to create a clone with no working directory.
1375 -U/--noupdate to create a clone with no working directory.
1376
1376
1377 .. container:: verbose
1377 .. container:: verbose
1378
1378
1379 For efficiency, hardlinks are used for cloning whenever the
1379 For efficiency, hardlinks are used for cloning whenever the
1380 source and destination are on the same filesystem (note this
1380 source and destination are on the same filesystem (note this
1381 applies only to the repository data, not to the working
1381 applies only to the repository data, not to the working
1382 directory). Some filesystems, such as AFS, implement hardlinking
1382 directory). Some filesystems, such as AFS, implement hardlinking
1383 incorrectly, but do not report errors. In these cases, use the
1383 incorrectly, but do not report errors. In these cases, use the
1384 --pull option to avoid hardlinking.
1384 --pull option to avoid hardlinking.
1385
1385
1386 In some cases, you can clone repositories and the working
1386 In some cases, you can clone repositories and the working
1387 directory using full hardlinks with ::
1387 directory using full hardlinks with ::
1388
1388
1389 $ cp -al REPO REPOCLONE
1389 $ cp -al REPO REPOCLONE
1390
1390
1391 This is the fastest way to clone, but it is not always safe. The
1391 This is the fastest way to clone, but it is not always safe. The
1392 operation is not atomic (making sure REPO is not modified during
1392 operation is not atomic (making sure REPO is not modified during
1393 the operation is up to you) and you have to make sure your
1393 the operation is up to you) and you have to make sure your
1394 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1394 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1395 so). Also, this is not compatible with certain extensions that
1395 so). Also, this is not compatible with certain extensions that
1396 place their metadata under the .hg directory, such as mq.
1396 place their metadata under the .hg directory, such as mq.
1397
1397
1398 Mercurial will update the working directory to the first applicable
1398 Mercurial will update the working directory to the first applicable
1399 revision from this list:
1399 revision from this list:
1400
1400
1401 a) null if -U or the source repository has no changesets
1401 a) null if -U or the source repository has no changesets
1402 b) if -u . and the source repository is local, the first parent of
1402 b) if -u . and the source repository is local, the first parent of
1403 the source repository's working directory
1403 the source repository's working directory
1404 c) the changeset specified with -u (if a branch name, this means the
1404 c) the changeset specified with -u (if a branch name, this means the
1405 latest head of that branch)
1405 latest head of that branch)
1406 d) the changeset specified with -r
1406 d) the changeset specified with -r
1407 e) the tipmost head specified with -b
1407 e) the tipmost head specified with -b
1408 f) the tipmost head specified with the url#branch source syntax
1408 f) the tipmost head specified with the url#branch source syntax
1409 g) the revision marked with the '@' bookmark, if present
1409 g) the revision marked with the '@' bookmark, if present
1410 h) the tipmost head of the default branch
1410 h) the tipmost head of the default branch
1411 i) tip
1411 i) tip
1412
1412
1413 Examples:
1413 Examples:
1414
1414
1415 - clone a remote repository to a new directory named hg/::
1415 - clone a remote repository to a new directory named hg/::
1416
1416
1417 hg clone http://selenic.com/hg
1417 hg clone http://selenic.com/hg
1418
1418
1419 - create a lightweight local clone::
1419 - create a lightweight local clone::
1420
1420
1421 hg clone project/ project-feature/
1421 hg clone project/ project-feature/
1422
1422
1423 - clone from an absolute path on an ssh server (note double-slash)::
1423 - clone from an absolute path on an ssh server (note double-slash)::
1424
1424
1425 hg clone ssh://user@server//home/projects/alpha/
1425 hg clone ssh://user@server//home/projects/alpha/
1426
1426
1427 - do a high-speed clone over a LAN while checking out a
1427 - do a high-speed clone over a LAN while checking out a
1428 specified version::
1428 specified version::
1429
1429
1430 hg clone --uncompressed http://server/repo -u 1.5
1430 hg clone --uncompressed http://server/repo -u 1.5
1431
1431
1432 - create a repository without changesets after a particular revision::
1432 - create a repository without changesets after a particular revision::
1433
1433
1434 hg clone -r 04e544 experimental/ good/
1434 hg clone -r 04e544 experimental/ good/
1435
1435
1436 - clone (and track) a particular named branch::
1436 - clone (and track) a particular named branch::
1437
1437
1438 hg clone http://selenic.com/hg#stable
1438 hg clone http://selenic.com/hg#stable
1439
1439
1440 See :hg:`help urls` for details on specifying URLs.
1440 See :hg:`help urls` for details on specifying URLs.
1441
1441
1442 Returns 0 on success.
1442 Returns 0 on success.
1443 """
1443 """
1444 if opts.get('noupdate') and opts.get('updaterev'):
1444 if opts.get('noupdate') and opts.get('updaterev'):
1445 raise error.Abort(_("cannot specify both --noupdate and --updaterev"))
1445 raise error.Abort(_("cannot specify both --noupdate and --updaterev"))
1446
1446
1447 r = hg.clone(ui, opts, source, dest,
1447 r = hg.clone(ui, opts, source, dest,
1448 pull=opts.get('pull'),
1448 pull=opts.get('pull'),
1449 stream=opts.get('uncompressed'),
1449 stream=opts.get('uncompressed'),
1450 rev=opts.get('rev'),
1450 rev=opts.get('rev'),
1451 update=opts.get('updaterev') or not opts.get('noupdate'),
1451 update=opts.get('updaterev') or not opts.get('noupdate'),
1452 branch=opts.get('branch'),
1452 branch=opts.get('branch'),
1453 shareopts=opts.get('shareopts'))
1453 shareopts=opts.get('shareopts'))
1454
1454
1455 return r is None
1455 return r is None
1456
1456
1457 @command('^commit|ci',
1457 @command('^commit|ci',
1458 [('A', 'addremove', None,
1458 [('A', 'addremove', None,
1459 _('mark new/missing files as added/removed before committing')),
1459 _('mark new/missing files as added/removed before committing')),
1460 ('', 'close-branch', None,
1460 ('', 'close-branch', None,
1461 _('mark a branch head as closed')),
1461 _('mark a branch head as closed')),
1462 ('', 'amend', None, _('amend the parent of the working directory')),
1462 ('', 'amend', None, _('amend the parent of the working directory')),
1463 ('s', 'secret', None, _('use the secret phase for committing')),
1463 ('s', 'secret', None, _('use the secret phase for committing')),
1464 ('e', 'edit', None, _('invoke editor on commit messages')),
1464 ('e', 'edit', None, _('invoke editor on commit messages')),
1465 ('i', 'interactive', None, _('use interactive mode')),
1465 ('i', 'interactive', None, _('use interactive mode')),
1466 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1466 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1467 _('[OPTION]... [FILE]...'),
1467 _('[OPTION]... [FILE]...'),
1468 inferrepo=True)
1468 inferrepo=True)
1469 def commit(ui, repo, *pats, **opts):
1469 def commit(ui, repo, *pats, **opts):
1470 """commit the specified files or all outstanding changes
1470 """commit the specified files or all outstanding changes
1471
1471
1472 Commit changes to the given files into the repository. Unlike a
1472 Commit changes to the given files into the repository. Unlike a
1473 centralized SCM, this operation is a local operation. See
1473 centralized SCM, this operation is a local operation. See
1474 :hg:`push` for a way to actively distribute your changes.
1474 :hg:`push` for a way to actively distribute your changes.
1475
1475
1476 If a list of files is omitted, all changes reported by :hg:`status`
1476 If a list of files is omitted, all changes reported by :hg:`status`
1477 will be committed.
1477 will be committed.
1478
1478
1479 If you are committing the result of a merge, do not provide any
1479 If you are committing the result of a merge, do not provide any
1480 filenames or -I/-X filters.
1480 filenames or -I/-X filters.
1481
1481
1482 If no commit message is specified, Mercurial starts your
1482 If no commit message is specified, Mercurial starts your
1483 configured editor where you can enter a message. In case your
1483 configured editor where you can enter a message. In case your
1484 commit fails, you will find a backup of your message in
1484 commit fails, you will find a backup of your message in
1485 ``.hg/last-message.txt``.
1485 ``.hg/last-message.txt``.
1486
1486
1487 The --close-branch flag can be used to mark the current branch
1487 The --close-branch flag can be used to mark the current branch
1488 head closed. When all heads of a branch are closed, the branch
1488 head closed. When all heads of a branch are closed, the branch
1489 will be considered closed and no longer listed.
1489 will be considered closed and no longer listed.
1490
1490
1491 The --amend flag can be used to amend the parent of the
1491 The --amend flag can be used to amend the parent of the
1492 working directory with a new commit that contains the changes
1492 working directory with a new commit that contains the changes
1493 in the parent in addition to those currently reported by :hg:`status`,
1493 in the parent in addition to those currently reported by :hg:`status`,
1494 if there are any. The old commit is stored in a backup bundle in
1494 if there are any. The old commit is stored in a backup bundle in
1495 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1495 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1496 on how to restore it).
1496 on how to restore it).
1497
1497
1498 Message, user and date are taken from the amended commit unless
1498 Message, user and date are taken from the amended commit unless
1499 specified. When a message isn't specified on the command line,
1499 specified. When a message isn't specified on the command line,
1500 the editor will open with the message of the amended commit.
1500 the editor will open with the message of the amended commit.
1501
1501
1502 It is not possible to amend public changesets (see :hg:`help phases`)
1502 It is not possible to amend public changesets (see :hg:`help phases`)
1503 or changesets that have children.
1503 or changesets that have children.
1504
1504
1505 See :hg:`help dates` for a list of formats valid for -d/--date.
1505 See :hg:`help dates` for a list of formats valid for -d/--date.
1506
1506
1507 Returns 0 on success, 1 if nothing changed.
1507 Returns 0 on success, 1 if nothing changed.
1508 """
1508 """
1509 if opts.get('interactive'):
1509 if opts.get('interactive'):
1510 opts.pop('interactive')
1510 opts.pop('interactive')
1511 cmdutil.dorecord(ui, repo, commit, None, False,
1511 cmdutil.dorecord(ui, repo, commit, None, False,
1512 cmdutil.recordfilter, *pats, **opts)
1512 cmdutil.recordfilter, *pats, **opts)
1513 return
1513 return
1514
1514
1515 if opts.get('subrepos'):
1515 if opts.get('subrepos'):
1516 if opts.get('amend'):
1516 if opts.get('amend'):
1517 raise error.Abort(_('cannot amend with --subrepos'))
1517 raise error.Abort(_('cannot amend with --subrepos'))
1518 # Let --subrepos on the command line override config setting.
1518 # Let --subrepos on the command line override config setting.
1519 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1519 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1520
1520
1521 cmdutil.checkunfinished(repo, commit=True)
1521 cmdutil.checkunfinished(repo, commit=True)
1522
1522
1523 branch = repo[None].branch()
1523 branch = repo[None].branch()
1524 bheads = repo.branchheads(branch)
1524 bheads = repo.branchheads(branch)
1525
1525
1526 extra = {}
1526 extra = {}
1527 if opts.get('close_branch'):
1527 if opts.get('close_branch'):
1528 extra['close'] = 1
1528 extra['close'] = 1
1529
1529
1530 if not bheads:
1530 if not bheads:
1531 raise error.Abort(_('can only close branch heads'))
1531 raise error.Abort(_('can only close branch heads'))
1532 elif opts.get('amend'):
1532 elif opts.get('amend'):
1533 if repo.parents()[0].p1().branch() != branch and \
1533 if repo.parents()[0].p1().branch() != branch and \
1534 repo.parents()[0].p2().branch() != branch:
1534 repo.parents()[0].p2().branch() != branch:
1535 raise error.Abort(_('can only close branch heads'))
1535 raise error.Abort(_('can only close branch heads'))
1536
1536
1537 if opts.get('amend'):
1537 if opts.get('amend'):
1538 if ui.configbool('ui', 'commitsubrepos'):
1538 if ui.configbool('ui', 'commitsubrepos'):
1539 raise error.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1539 raise error.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1540
1540
1541 old = repo['.']
1541 old = repo['.']
1542 if not old.mutable():
1542 if not old.mutable():
1543 raise error.Abort(_('cannot amend public changesets'))
1543 raise error.Abort(_('cannot amend public changesets'))
1544 if len(repo[None].parents()) > 1:
1544 if len(repo[None].parents()) > 1:
1545 raise error.Abort(_('cannot amend while merging'))
1545 raise error.Abort(_('cannot amend while merging'))
1546 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
1546 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
1547 if not allowunstable and old.children():
1547 if not allowunstable and old.children():
1548 raise error.Abort(_('cannot amend changeset with children'))
1548 raise error.Abort(_('cannot amend changeset with children'))
1549
1549
1550 # commitfunc is used only for temporary amend commit by cmdutil.amend
1550 # commitfunc is used only for temporary amend commit by cmdutil.amend
1551 def commitfunc(ui, repo, message, match, opts):
1551 def commitfunc(ui, repo, message, match, opts):
1552 return repo.commit(message,
1552 return repo.commit(message,
1553 opts.get('user') or old.user(),
1553 opts.get('user') or old.user(),
1554 opts.get('date') or old.date(),
1554 opts.get('date') or old.date(),
1555 match,
1555 match,
1556 extra=extra)
1556 extra=extra)
1557
1557
1558 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1558 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1559 if node == old.node():
1559 if node == old.node():
1560 ui.status(_("nothing changed\n"))
1560 ui.status(_("nothing changed\n"))
1561 return 1
1561 return 1
1562 else:
1562 else:
1563 def commitfunc(ui, repo, message, match, opts):
1563 def commitfunc(ui, repo, message, match, opts):
1564 backup = ui.backupconfig('phases', 'new-commit')
1564 backup = ui.backupconfig('phases', 'new-commit')
1565 baseui = repo.baseui
1565 baseui = repo.baseui
1566 basebackup = baseui.backupconfig('phases', 'new-commit')
1566 basebackup = baseui.backupconfig('phases', 'new-commit')
1567 try:
1567 try:
1568 if opts.get('secret'):
1568 if opts.get('secret'):
1569 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1569 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1570 # Propagate to subrepos
1570 # Propagate to subrepos
1571 baseui.setconfig('phases', 'new-commit', 'secret', 'commit')
1571 baseui.setconfig('phases', 'new-commit', 'secret', 'commit')
1572
1572
1573 editform = cmdutil.mergeeditform(repo[None], 'commit.normal')
1573 editform = cmdutil.mergeeditform(repo[None], 'commit.normal')
1574 editor = cmdutil.getcommiteditor(editform=editform, **opts)
1574 editor = cmdutil.getcommiteditor(editform=editform, **opts)
1575 return repo.commit(message, opts.get('user'), opts.get('date'),
1575 return repo.commit(message, opts.get('user'), opts.get('date'),
1576 match,
1576 match,
1577 editor=editor,
1577 editor=editor,
1578 extra=extra)
1578 extra=extra)
1579 finally:
1579 finally:
1580 ui.restoreconfig(backup)
1580 ui.restoreconfig(backup)
1581 repo.baseui.restoreconfig(basebackup)
1581 repo.baseui.restoreconfig(basebackup)
1582
1582
1583
1583
1584 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1584 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1585
1585
1586 if not node:
1586 if not node:
1587 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1587 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1588 if stat[3]:
1588 if stat[3]:
1589 ui.status(_("nothing changed (%d missing files, see "
1589 ui.status(_("nothing changed (%d missing files, see "
1590 "'hg status')\n") % len(stat[3]))
1590 "'hg status')\n") % len(stat[3]))
1591 else:
1591 else:
1592 ui.status(_("nothing changed\n"))
1592 ui.status(_("nothing changed\n"))
1593 return 1
1593 return 1
1594
1594
1595 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1595 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1596
1596
1597 @command('config|showconfig|debugconfig',
1597 @command('config|showconfig|debugconfig',
1598 [('u', 'untrusted', None, _('show untrusted configuration options')),
1598 [('u', 'untrusted', None, _('show untrusted configuration options')),
1599 ('e', 'edit', None, _('edit user config')),
1599 ('e', 'edit', None, _('edit user config')),
1600 ('l', 'local', None, _('edit repository config')),
1600 ('l', 'local', None, _('edit repository config')),
1601 ('g', 'global', None, _('edit global config'))],
1601 ('g', 'global', None, _('edit global config'))],
1602 _('[-u] [NAME]...'),
1602 _('[-u] [NAME]...'),
1603 optionalrepo=True)
1603 optionalrepo=True)
1604 def config(ui, repo, *values, **opts):
1604 def config(ui, repo, *values, **opts):
1605 """show combined config settings from all hgrc files
1605 """show combined config settings from all hgrc files
1606
1606
1607 With no arguments, print names and values of all config items.
1607 With no arguments, print names and values of all config items.
1608
1608
1609 With one argument of the form section.name, print just the value
1609 With one argument of the form section.name, print just the value
1610 of that config item.
1610 of that config item.
1611
1611
1612 With multiple arguments, print names and values of all config
1612 With multiple arguments, print names and values of all config
1613 items with matching section names.
1613 items with matching section names.
1614
1614
1615 With --edit, start an editor on the user-level config file. With
1615 With --edit, start an editor on the user-level config file. With
1616 --global, edit the system-wide config file. With --local, edit the
1616 --global, edit the system-wide config file. With --local, edit the
1617 repository-level config file.
1617 repository-level config file.
1618
1618
1619 With --debug, the source (filename and line number) is printed
1619 With --debug, the source (filename and line number) is printed
1620 for each config item.
1620 for each config item.
1621
1621
1622 See :hg:`help config` for more information about config files.
1622 See :hg:`help config` for more information about config files.
1623
1623
1624 Returns 0 on success, 1 if NAME does not exist.
1624 Returns 0 on success, 1 if NAME does not exist.
1625
1625
1626 """
1626 """
1627
1627
1628 if opts.get('edit') or opts.get('local') or opts.get('global'):
1628 if opts.get('edit') or opts.get('local') or opts.get('global'):
1629 if opts.get('local') and opts.get('global'):
1629 if opts.get('local') and opts.get('global'):
1630 raise error.Abort(_("can't use --local and --global together"))
1630 raise error.Abort(_("can't use --local and --global together"))
1631
1631
1632 if opts.get('local'):
1632 if opts.get('local'):
1633 if not repo:
1633 if not repo:
1634 raise error.Abort(_("can't use --local outside a repository"))
1634 raise error.Abort(_("can't use --local outside a repository"))
1635 paths = [repo.join('hgrc')]
1635 paths = [repo.join('hgrc')]
1636 elif opts.get('global'):
1636 elif opts.get('global'):
1637 paths = scmutil.systemrcpath()
1637 paths = scmutil.systemrcpath()
1638 else:
1638 else:
1639 paths = scmutil.userrcpath()
1639 paths = scmutil.userrcpath()
1640
1640
1641 for f in paths:
1641 for f in paths:
1642 if os.path.exists(f):
1642 if os.path.exists(f):
1643 break
1643 break
1644 else:
1644 else:
1645 if opts.get('global'):
1645 if opts.get('global'):
1646 samplehgrc = uimod.samplehgrcs['global']
1646 samplehgrc = uimod.samplehgrcs['global']
1647 elif opts.get('local'):
1647 elif opts.get('local'):
1648 samplehgrc = uimod.samplehgrcs['local']
1648 samplehgrc = uimod.samplehgrcs['local']
1649 else:
1649 else:
1650 samplehgrc = uimod.samplehgrcs['user']
1650 samplehgrc = uimod.samplehgrcs['user']
1651
1651
1652 f = paths[0]
1652 f = paths[0]
1653 fp = open(f, "w")
1653 fp = open(f, "w")
1654 fp.write(samplehgrc)
1654 fp.write(samplehgrc)
1655 fp.close()
1655 fp.close()
1656
1656
1657 editor = ui.geteditor()
1657 editor = ui.geteditor()
1658 ui.system("%s \"%s\"" % (editor, f),
1658 ui.system("%s \"%s\"" % (editor, f),
1659 onerr=error.Abort, errprefix=_("edit failed"))
1659 onerr=error.Abort, errprefix=_("edit failed"))
1660 return
1660 return
1661
1661
1662 for f in scmutil.rcpath():
1662 for f in scmutil.rcpath():
1663 ui.debug('read config from: %s\n' % f)
1663 ui.debug('read config from: %s\n' % f)
1664 untrusted = bool(opts.get('untrusted'))
1664 untrusted = bool(opts.get('untrusted'))
1665 if values:
1665 if values:
1666 sections = [v for v in values if '.' not in v]
1666 sections = [v for v in values if '.' not in v]
1667 items = [v for v in values if '.' in v]
1667 items = [v for v in values if '.' in v]
1668 if len(items) > 1 or items and sections:
1668 if len(items) > 1 or items and sections:
1669 raise error.Abort(_('only one config item permitted'))
1669 raise error.Abort(_('only one config item permitted'))
1670 matched = False
1670 matched = False
1671 for section, name, value in ui.walkconfig(untrusted=untrusted):
1671 for section, name, value in ui.walkconfig(untrusted=untrusted):
1672 value = str(value).replace('\n', '\\n')
1672 value = str(value).replace('\n', '\\n')
1673 sectname = section + '.' + name
1673 sectname = section + '.' + name
1674 if values:
1674 if values:
1675 for v in values:
1675 for v in values:
1676 if v == section:
1676 if v == section:
1677 ui.debug('%s: ' %
1677 ui.debug('%s: ' %
1678 ui.configsource(section, name, untrusted))
1678 ui.configsource(section, name, untrusted))
1679 ui.write('%s=%s\n' % (sectname, value))
1679 ui.write('%s=%s\n' % (sectname, value))
1680 matched = True
1680 matched = True
1681 elif v == sectname:
1681 elif v == sectname:
1682 ui.debug('%s: ' %
1682 ui.debug('%s: ' %
1683 ui.configsource(section, name, untrusted))
1683 ui.configsource(section, name, untrusted))
1684 ui.write(value, '\n')
1684 ui.write(value, '\n')
1685 matched = True
1685 matched = True
1686 else:
1686 else:
1687 ui.debug('%s: ' %
1687 ui.debug('%s: ' %
1688 ui.configsource(section, name, untrusted))
1688 ui.configsource(section, name, untrusted))
1689 ui.write('%s=%s\n' % (sectname, value))
1689 ui.write('%s=%s\n' % (sectname, value))
1690 matched = True
1690 matched = True
1691 if matched:
1691 if matched:
1692 return 0
1692 return 0
1693 return 1
1693 return 1
1694
1694
1695 @command('copy|cp',
1695 @command('copy|cp',
1696 [('A', 'after', None, _('record a copy that has already occurred')),
1696 [('A', 'after', None, _('record a copy that has already occurred')),
1697 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1697 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1698 ] + walkopts + dryrunopts,
1698 ] + walkopts + dryrunopts,
1699 _('[OPTION]... [SOURCE]... DEST'))
1699 _('[OPTION]... [SOURCE]... DEST'))
1700 def copy(ui, repo, *pats, **opts):
1700 def copy(ui, repo, *pats, **opts):
1701 """mark files as copied for the next commit
1701 """mark files as copied for the next commit
1702
1702
1703 Mark dest as having copies of source files. If dest is a
1703 Mark dest as having copies of source files. If dest is a
1704 directory, copies are put in that directory. If dest is a file,
1704 directory, copies are put in that directory. If dest is a file,
1705 the source must be a single file.
1705 the source must be a single file.
1706
1706
1707 By default, this command copies the contents of files as they
1707 By default, this command copies the contents of files as they
1708 exist in the working directory. If invoked with -A/--after, the
1708 exist in the working directory. If invoked with -A/--after, the
1709 operation is recorded, but no copying is performed.
1709 operation is recorded, but no copying is performed.
1710
1710
1711 This command takes effect with the next commit. To undo a copy
1711 This command takes effect with the next commit. To undo a copy
1712 before that, see :hg:`revert`.
1712 before that, see :hg:`revert`.
1713
1713
1714 Returns 0 on success, 1 if errors are encountered.
1714 Returns 0 on success, 1 if errors are encountered.
1715 """
1715 """
1716 wlock = repo.wlock(False)
1716 wlock = repo.wlock(False)
1717 try:
1717 try:
1718 return cmdutil.copy(ui, repo, pats, opts)
1718 return cmdutil.copy(ui, repo, pats, opts)
1719 finally:
1719 finally:
1720 wlock.release()
1720 wlock.release()
1721
1721
1722 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1722 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1723 def debugancestor(ui, repo, *args):
1723 def debugancestor(ui, repo, *args):
1724 """find the ancestor revision of two revisions in a given index"""
1724 """find the ancestor revision of two revisions in a given index"""
1725 if len(args) == 3:
1725 if len(args) == 3:
1726 index, rev1, rev2 = args
1726 index, rev1, rev2 = args
1727 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1727 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1728 lookup = r.lookup
1728 lookup = r.lookup
1729 elif len(args) == 2:
1729 elif len(args) == 2:
1730 if not repo:
1730 if not repo:
1731 raise error.Abort(_("there is no Mercurial repository here "
1731 raise error.Abort(_("there is no Mercurial repository here "
1732 "(.hg not found)"))
1732 "(.hg not found)"))
1733 rev1, rev2 = args
1733 rev1, rev2 = args
1734 r = repo.changelog
1734 r = repo.changelog
1735 lookup = repo.lookup
1735 lookup = repo.lookup
1736 else:
1736 else:
1737 raise error.Abort(_('either two or three arguments required'))
1737 raise error.Abort(_('either two or three arguments required'))
1738 a = r.ancestor(lookup(rev1), lookup(rev2))
1738 a = r.ancestor(lookup(rev1), lookup(rev2))
1739 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1739 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1740
1740
1741 @command('debugbuilddag',
1741 @command('debugbuilddag',
1742 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1742 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1743 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1743 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1744 ('n', 'new-file', None, _('add new file at each rev'))],
1744 ('n', 'new-file', None, _('add new file at each rev'))],
1745 _('[OPTION]... [TEXT]'))
1745 _('[OPTION]... [TEXT]'))
1746 def debugbuilddag(ui, repo, text=None,
1746 def debugbuilddag(ui, repo, text=None,
1747 mergeable_file=False,
1747 mergeable_file=False,
1748 overwritten_file=False,
1748 overwritten_file=False,
1749 new_file=False):
1749 new_file=False):
1750 """builds a repo with a given DAG from scratch in the current empty repo
1750 """builds a repo with a given DAG from scratch in the current empty repo
1751
1751
1752 The description of the DAG is read from stdin if not given on the
1752 The description of the DAG is read from stdin if not given on the
1753 command line.
1753 command line.
1754
1754
1755 Elements:
1755 Elements:
1756
1756
1757 - "+n" is a linear run of n nodes based on the current default parent
1757 - "+n" is a linear run of n nodes based on the current default parent
1758 - "." is a single node based on the current default parent
1758 - "." is a single node based on the current default parent
1759 - "$" resets the default parent to null (implied at the start);
1759 - "$" resets the default parent to null (implied at the start);
1760 otherwise the default parent is always the last node created
1760 otherwise the default parent is always the last node created
1761 - "<p" sets the default parent to the backref p
1761 - "<p" sets the default parent to the backref p
1762 - "*p" is a fork at parent p, which is a backref
1762 - "*p" is a fork at parent p, which is a backref
1763 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1763 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1764 - "/p2" is a merge of the preceding node and p2
1764 - "/p2" is a merge of the preceding node and p2
1765 - ":tag" defines a local tag for the preceding node
1765 - ":tag" defines a local tag for the preceding node
1766 - "@branch" sets the named branch for subsequent nodes
1766 - "@branch" sets the named branch for subsequent nodes
1767 - "#...\\n" is a comment up to the end of the line
1767 - "#...\\n" is a comment up to the end of the line
1768
1768
1769 Whitespace between the above elements is ignored.
1769 Whitespace between the above elements is ignored.
1770
1770
1771 A backref is either
1771 A backref is either
1772
1772
1773 - a number n, which references the node curr-n, where curr is the current
1773 - a number n, which references the node curr-n, where curr is the current
1774 node, or
1774 node, or
1775 - the name of a local tag you placed earlier using ":tag", or
1775 - the name of a local tag you placed earlier using ":tag", or
1776 - empty to denote the default parent.
1776 - empty to denote the default parent.
1777
1777
1778 All string valued-elements are either strictly alphanumeric, or must
1778 All string valued-elements are either strictly alphanumeric, or must
1779 be enclosed in double quotes ("..."), with "\\" as escape character.
1779 be enclosed in double quotes ("..."), with "\\" as escape character.
1780 """
1780 """
1781
1781
1782 if text is None:
1782 if text is None:
1783 ui.status(_("reading DAG from stdin\n"))
1783 ui.status(_("reading DAG from stdin\n"))
1784 text = ui.fin.read()
1784 text = ui.fin.read()
1785
1785
1786 cl = repo.changelog
1786 cl = repo.changelog
1787 if len(cl) > 0:
1787 if len(cl) > 0:
1788 raise error.Abort(_('repository is not empty'))
1788 raise error.Abort(_('repository is not empty'))
1789
1789
1790 # determine number of revs in DAG
1790 # determine number of revs in DAG
1791 total = 0
1791 total = 0
1792 for type, data in dagparser.parsedag(text):
1792 for type, data in dagparser.parsedag(text):
1793 if type == 'n':
1793 if type == 'n':
1794 total += 1
1794 total += 1
1795
1795
1796 if mergeable_file:
1796 if mergeable_file:
1797 linesperrev = 2
1797 linesperrev = 2
1798 # make a file with k lines per rev
1798 # make a file with k lines per rev
1799 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1799 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1800 initialmergedlines.append("")
1800 initialmergedlines.append("")
1801
1801
1802 tags = []
1802 tags = []
1803
1803
1804 lock = tr = None
1804 lock = tr = None
1805 try:
1805 try:
1806 lock = repo.lock()
1806 lock = repo.lock()
1807 tr = repo.transaction("builddag")
1807 tr = repo.transaction("builddag")
1808
1808
1809 at = -1
1809 at = -1
1810 atbranch = 'default'
1810 atbranch = 'default'
1811 nodeids = []
1811 nodeids = []
1812 id = 0
1812 id = 0
1813 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1813 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1814 for type, data in dagparser.parsedag(text):
1814 for type, data in dagparser.parsedag(text):
1815 if type == 'n':
1815 if type == 'n':
1816 ui.note(('node %s\n' % str(data)))
1816 ui.note(('node %s\n' % str(data)))
1817 id, ps = data
1817 id, ps = data
1818
1818
1819 files = []
1819 files = []
1820 fctxs = {}
1820 fctxs = {}
1821
1821
1822 p2 = None
1822 p2 = None
1823 if mergeable_file:
1823 if mergeable_file:
1824 fn = "mf"
1824 fn = "mf"
1825 p1 = repo[ps[0]]
1825 p1 = repo[ps[0]]
1826 if len(ps) > 1:
1826 if len(ps) > 1:
1827 p2 = repo[ps[1]]
1827 p2 = repo[ps[1]]
1828 pa = p1.ancestor(p2)
1828 pa = p1.ancestor(p2)
1829 base, local, other = [x[fn].data() for x in (pa, p1,
1829 base, local, other = [x[fn].data() for x in (pa, p1,
1830 p2)]
1830 p2)]
1831 m3 = simplemerge.Merge3Text(base, local, other)
1831 m3 = simplemerge.Merge3Text(base, local, other)
1832 ml = [l.strip() for l in m3.merge_lines()]
1832 ml = [l.strip() for l in m3.merge_lines()]
1833 ml.append("")
1833 ml.append("")
1834 elif at > 0:
1834 elif at > 0:
1835 ml = p1[fn].data().split("\n")
1835 ml = p1[fn].data().split("\n")
1836 else:
1836 else:
1837 ml = initialmergedlines
1837 ml = initialmergedlines
1838 ml[id * linesperrev] += " r%i" % id
1838 ml[id * linesperrev] += " r%i" % id
1839 mergedtext = "\n".join(ml)
1839 mergedtext = "\n".join(ml)
1840 files.append(fn)
1840 files.append(fn)
1841 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1841 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1842
1842
1843 if overwritten_file:
1843 if overwritten_file:
1844 fn = "of"
1844 fn = "of"
1845 files.append(fn)
1845 files.append(fn)
1846 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1846 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1847
1847
1848 if new_file:
1848 if new_file:
1849 fn = "nf%i" % id
1849 fn = "nf%i" % id
1850 files.append(fn)
1850 files.append(fn)
1851 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1851 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1852 if len(ps) > 1:
1852 if len(ps) > 1:
1853 if not p2:
1853 if not p2:
1854 p2 = repo[ps[1]]
1854 p2 = repo[ps[1]]
1855 for fn in p2:
1855 for fn in p2:
1856 if fn.startswith("nf"):
1856 if fn.startswith("nf"):
1857 files.append(fn)
1857 files.append(fn)
1858 fctxs[fn] = p2[fn]
1858 fctxs[fn] = p2[fn]
1859
1859
1860 def fctxfn(repo, cx, path):
1860 def fctxfn(repo, cx, path):
1861 return fctxs.get(path)
1861 return fctxs.get(path)
1862
1862
1863 if len(ps) == 0 or ps[0] < 0:
1863 if len(ps) == 0 or ps[0] < 0:
1864 pars = [None, None]
1864 pars = [None, None]
1865 elif len(ps) == 1:
1865 elif len(ps) == 1:
1866 pars = [nodeids[ps[0]], None]
1866 pars = [nodeids[ps[0]], None]
1867 else:
1867 else:
1868 pars = [nodeids[p] for p in ps]
1868 pars = [nodeids[p] for p in ps]
1869 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1869 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1870 date=(id, 0),
1870 date=(id, 0),
1871 user="debugbuilddag",
1871 user="debugbuilddag",
1872 extra={'branch': atbranch})
1872 extra={'branch': atbranch})
1873 nodeid = repo.commitctx(cx)
1873 nodeid = repo.commitctx(cx)
1874 nodeids.append(nodeid)
1874 nodeids.append(nodeid)
1875 at = id
1875 at = id
1876 elif type == 'l':
1876 elif type == 'l':
1877 id, name = data
1877 id, name = data
1878 ui.note(('tag %s\n' % name))
1878 ui.note(('tag %s\n' % name))
1879 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1879 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1880 elif type == 'a':
1880 elif type == 'a':
1881 ui.note(('branch %s\n' % data))
1881 ui.note(('branch %s\n' % data))
1882 atbranch = data
1882 atbranch = data
1883 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1883 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1884 tr.close()
1884 tr.close()
1885
1885
1886 if tags:
1886 if tags:
1887 repo.vfs.write("localtags", "".join(tags))
1887 repo.vfs.write("localtags", "".join(tags))
1888 finally:
1888 finally:
1889 ui.progress(_('building'), None)
1889 ui.progress(_('building'), None)
1890 release(tr, lock)
1890 release(tr, lock)
1891
1891
1892 @command('debugbundle',
1892 @command('debugbundle',
1893 [('a', 'all', None, _('show all details'))],
1893 [('a', 'all', None, _('show all details'))],
1894 _('FILE'),
1894 _('FILE'),
1895 norepo=True)
1895 norepo=True)
1896 def debugbundle(ui, bundlepath, all=None, **opts):
1896 def debugbundle(ui, bundlepath, all=None, **opts):
1897 """lists the contents of a bundle"""
1897 """lists the contents of a bundle"""
1898 f = hg.openpath(ui, bundlepath)
1898 f = hg.openpath(ui, bundlepath)
1899 try:
1899 try:
1900 gen = exchange.readbundle(ui, f, bundlepath)
1900 gen = exchange.readbundle(ui, f, bundlepath)
1901 if isinstance(gen, bundle2.unbundle20):
1901 if isinstance(gen, bundle2.unbundle20):
1902 return _debugbundle2(ui, gen, all=all, **opts)
1902 return _debugbundle2(ui, gen, all=all, **opts)
1903 if all:
1903 if all:
1904 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1904 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1905
1905
1906 def showchunks(named):
1906 def showchunks(named):
1907 ui.write("\n%s\n" % named)
1907 ui.write("\n%s\n" % named)
1908 chain = None
1908 chain = None
1909 while True:
1909 while True:
1910 chunkdata = gen.deltachunk(chain)
1910 chunkdata = gen.deltachunk(chain)
1911 if not chunkdata:
1911 if not chunkdata:
1912 break
1912 break
1913 node = chunkdata['node']
1913 node = chunkdata['node']
1914 p1 = chunkdata['p1']
1914 p1 = chunkdata['p1']
1915 p2 = chunkdata['p2']
1915 p2 = chunkdata['p2']
1916 cs = chunkdata['cs']
1916 cs = chunkdata['cs']
1917 deltabase = chunkdata['deltabase']
1917 deltabase = chunkdata['deltabase']
1918 delta = chunkdata['delta']
1918 delta = chunkdata['delta']
1919 ui.write("%s %s %s %s %s %s\n" %
1919 ui.write("%s %s %s %s %s %s\n" %
1920 (hex(node), hex(p1), hex(p2),
1920 (hex(node), hex(p1), hex(p2),
1921 hex(cs), hex(deltabase), len(delta)))
1921 hex(cs), hex(deltabase), len(delta)))
1922 chain = node
1922 chain = node
1923
1923
1924 chunkdata = gen.changelogheader()
1924 chunkdata = gen.changelogheader()
1925 showchunks("changelog")
1925 showchunks("changelog")
1926 chunkdata = gen.manifestheader()
1926 chunkdata = gen.manifestheader()
1927 showchunks("manifest")
1927 showchunks("manifest")
1928 while True:
1928 while True:
1929 chunkdata = gen.filelogheader()
1929 chunkdata = gen.filelogheader()
1930 if not chunkdata:
1930 if not chunkdata:
1931 break
1931 break
1932 fname = chunkdata['filename']
1932 fname = chunkdata['filename']
1933 showchunks(fname)
1933 showchunks(fname)
1934 else:
1934 else:
1935 if isinstance(gen, bundle2.unbundle20):
1935 if isinstance(gen, bundle2.unbundle20):
1936 raise error.Abort(_('use debugbundle2 for this file'))
1936 raise error.Abort(_('use debugbundle2 for this file'))
1937 chunkdata = gen.changelogheader()
1937 chunkdata = gen.changelogheader()
1938 chain = None
1938 chain = None
1939 while True:
1939 while True:
1940 chunkdata = gen.deltachunk(chain)
1940 chunkdata = gen.deltachunk(chain)
1941 if not chunkdata:
1941 if not chunkdata:
1942 break
1942 break
1943 node = chunkdata['node']
1943 node = chunkdata['node']
1944 ui.write("%s\n" % hex(node))
1944 ui.write("%s\n" % hex(node))
1945 chain = node
1945 chain = node
1946 finally:
1946 finally:
1947 f.close()
1947 f.close()
1948
1948
1949 def _debugbundle2(ui, gen, **opts):
1949 def _debugbundle2(ui, gen, **opts):
1950 """lists the contents of a bundle2"""
1950 """lists the contents of a bundle2"""
1951 if not isinstance(gen, bundle2.unbundle20):
1951 if not isinstance(gen, bundle2.unbundle20):
1952 raise error.Abort(_('not a bundle2 file'))
1952 raise error.Abort(_('not a bundle2 file'))
1953 ui.write(('Stream params: %s\n' % repr(gen.params)))
1953 ui.write(('Stream params: %s\n' % repr(gen.params)))
1954 for part in gen.iterparts():
1954 for part in gen.iterparts():
1955 ui.write('%s -- %r\n' % (part.type, repr(part.params)))
1955 ui.write('%s -- %r\n' % (part.type, repr(part.params)))
1956 if part.type == 'changegroup':
1956 if part.type == 'changegroup':
1957 version = part.params.get('version', '01')
1957 version = part.params.get('version', '01')
1958 cg = changegroup.packermap[version][1](part, 'UN')
1958 cg = changegroup.packermap[version][1](part, 'UN')
1959 chunkdata = cg.changelogheader()
1959 chunkdata = cg.changelogheader()
1960 chain = None
1960 chain = None
1961 while True:
1961 while True:
1962 chunkdata = cg.deltachunk(chain)
1962 chunkdata = cg.deltachunk(chain)
1963 if not chunkdata:
1963 if not chunkdata:
1964 break
1964 break
1965 node = chunkdata['node']
1965 node = chunkdata['node']
1966 ui.write(" %s\n" % hex(node))
1966 ui.write(" %s\n" % hex(node))
1967 chain = node
1967 chain = node
1968
1968
1969 @command('debugcreatestreamclonebundle', [], 'FILE')
1969 @command('debugcreatestreamclonebundle', [], 'FILE')
1970 def debugcreatestreamclonebundle(ui, repo, fname):
1970 def debugcreatestreamclonebundle(ui, repo, fname):
1971 """create a stream clone bundle file
1971 """create a stream clone bundle file
1972
1972
1973 Stream bundles are special bundles that are essentially archives of
1973 Stream bundles are special bundles that are essentially archives of
1974 revlog files. They are commonly used for cloning very quickly.
1974 revlog files. They are commonly used for cloning very quickly.
1975 """
1975 """
1976 requirements, gen = streamclone.generatebundlev1(repo)
1976 requirements, gen = streamclone.generatebundlev1(repo)
1977 changegroup.writechunks(ui, gen, fname)
1977 changegroup.writechunks(ui, gen, fname)
1978
1978
1979 ui.write(_('bundle requirements: %s\n') % ', '.join(sorted(requirements)))
1979 ui.write(_('bundle requirements: %s\n') % ', '.join(sorted(requirements)))
1980
1980
1981 @command('debugapplystreamclonebundle', [], 'FILE')
1982 def debugapplystreamclonebundle(ui, repo, fname):
1983 """apply a stream clone bundle file"""
1984 f = hg.openpath(ui, fname)
1985 gen = exchange.readbundle(ui, f, fname)
1986 gen.apply(repo)
1987
1981 @command('debugcheckstate', [], '')
1988 @command('debugcheckstate', [], '')
1982 def debugcheckstate(ui, repo):
1989 def debugcheckstate(ui, repo):
1983 """validate the correctness of the current dirstate"""
1990 """validate the correctness of the current dirstate"""
1984 parent1, parent2 = repo.dirstate.parents()
1991 parent1, parent2 = repo.dirstate.parents()
1985 m1 = repo[parent1].manifest()
1992 m1 = repo[parent1].manifest()
1986 m2 = repo[parent2].manifest()
1993 m2 = repo[parent2].manifest()
1987 errors = 0
1994 errors = 0
1988 for f in repo.dirstate:
1995 for f in repo.dirstate:
1989 state = repo.dirstate[f]
1996 state = repo.dirstate[f]
1990 if state in "nr" and f not in m1:
1997 if state in "nr" and f not in m1:
1991 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1998 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1992 errors += 1
1999 errors += 1
1993 if state in "a" and f in m1:
2000 if state in "a" and f in m1:
1994 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
2001 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1995 errors += 1
2002 errors += 1
1996 if state in "m" and f not in m1 and f not in m2:
2003 if state in "m" and f not in m1 and f not in m2:
1997 ui.warn(_("%s in state %s, but not in either manifest\n") %
2004 ui.warn(_("%s in state %s, but not in either manifest\n") %
1998 (f, state))
2005 (f, state))
1999 errors += 1
2006 errors += 1
2000 for f in m1:
2007 for f in m1:
2001 state = repo.dirstate[f]
2008 state = repo.dirstate[f]
2002 if state not in "nrm":
2009 if state not in "nrm":
2003 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
2010 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
2004 errors += 1
2011 errors += 1
2005 if errors:
2012 if errors:
2006 error = _(".hg/dirstate inconsistent with current parent's manifest")
2013 error = _(".hg/dirstate inconsistent with current parent's manifest")
2007 raise error.Abort(error)
2014 raise error.Abort(error)
2008
2015
2009 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
2016 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
2010 def debugcommands(ui, cmd='', *args):
2017 def debugcommands(ui, cmd='', *args):
2011 """list all available commands and options"""
2018 """list all available commands and options"""
2012 for cmd, vals in sorted(table.iteritems()):
2019 for cmd, vals in sorted(table.iteritems()):
2013 cmd = cmd.split('|')[0].strip('^')
2020 cmd = cmd.split('|')[0].strip('^')
2014 opts = ', '.join([i[1] for i in vals[1]])
2021 opts = ', '.join([i[1] for i in vals[1]])
2015 ui.write('%s: %s\n' % (cmd, opts))
2022 ui.write('%s: %s\n' % (cmd, opts))
2016
2023
2017 @command('debugcomplete',
2024 @command('debugcomplete',
2018 [('o', 'options', None, _('show the command options'))],
2025 [('o', 'options', None, _('show the command options'))],
2019 _('[-o] CMD'),
2026 _('[-o] CMD'),
2020 norepo=True)
2027 norepo=True)
2021 def debugcomplete(ui, cmd='', **opts):
2028 def debugcomplete(ui, cmd='', **opts):
2022 """returns the completion list associated with the given command"""
2029 """returns the completion list associated with the given command"""
2023
2030
2024 if opts.get('options'):
2031 if opts.get('options'):
2025 options = []
2032 options = []
2026 otables = [globalopts]
2033 otables = [globalopts]
2027 if cmd:
2034 if cmd:
2028 aliases, entry = cmdutil.findcmd(cmd, table, False)
2035 aliases, entry = cmdutil.findcmd(cmd, table, False)
2029 otables.append(entry[1])
2036 otables.append(entry[1])
2030 for t in otables:
2037 for t in otables:
2031 for o in t:
2038 for o in t:
2032 if "(DEPRECATED)" in o[3]:
2039 if "(DEPRECATED)" in o[3]:
2033 continue
2040 continue
2034 if o[0]:
2041 if o[0]:
2035 options.append('-%s' % o[0])
2042 options.append('-%s' % o[0])
2036 options.append('--%s' % o[1])
2043 options.append('--%s' % o[1])
2037 ui.write("%s\n" % "\n".join(options))
2044 ui.write("%s\n" % "\n".join(options))
2038 return
2045 return
2039
2046
2040 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2047 cmdlist, unused_allcmds = cmdutil.findpossible(cmd, table)
2041 if ui.verbose:
2048 if ui.verbose:
2042 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
2049 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
2043 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
2050 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
2044
2051
2045 @command('debugdag',
2052 @command('debugdag',
2046 [('t', 'tags', None, _('use tags as labels')),
2053 [('t', 'tags', None, _('use tags as labels')),
2047 ('b', 'branches', None, _('annotate with branch names')),
2054 ('b', 'branches', None, _('annotate with branch names')),
2048 ('', 'dots', None, _('use dots for runs')),
2055 ('', 'dots', None, _('use dots for runs')),
2049 ('s', 'spaces', None, _('separate elements by spaces'))],
2056 ('s', 'spaces', None, _('separate elements by spaces'))],
2050 _('[OPTION]... [FILE [REV]...]'),
2057 _('[OPTION]... [FILE [REV]...]'),
2051 optionalrepo=True)
2058 optionalrepo=True)
2052 def debugdag(ui, repo, file_=None, *revs, **opts):
2059 def debugdag(ui, repo, file_=None, *revs, **opts):
2053 """format the changelog or an index DAG as a concise textual description
2060 """format the changelog or an index DAG as a concise textual description
2054
2061
2055 If you pass a revlog index, the revlog's DAG is emitted. If you list
2062 If you pass a revlog index, the revlog's DAG is emitted. If you list
2056 revision numbers, they get labeled in the output as rN.
2063 revision numbers, they get labeled in the output as rN.
2057
2064
2058 Otherwise, the changelog DAG of the current repo is emitted.
2065 Otherwise, the changelog DAG of the current repo is emitted.
2059 """
2066 """
2060 spaces = opts.get('spaces')
2067 spaces = opts.get('spaces')
2061 dots = opts.get('dots')
2068 dots = opts.get('dots')
2062 if file_:
2069 if file_:
2063 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2070 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2064 revs = set((int(r) for r in revs))
2071 revs = set((int(r) for r in revs))
2065 def events():
2072 def events():
2066 for r in rlog:
2073 for r in rlog:
2067 yield 'n', (r, list(p for p in rlog.parentrevs(r)
2074 yield 'n', (r, list(p for p in rlog.parentrevs(r)
2068 if p != -1))
2075 if p != -1))
2069 if r in revs:
2076 if r in revs:
2070 yield 'l', (r, "r%i" % r)
2077 yield 'l', (r, "r%i" % r)
2071 elif repo:
2078 elif repo:
2072 cl = repo.changelog
2079 cl = repo.changelog
2073 tags = opts.get('tags')
2080 tags = opts.get('tags')
2074 branches = opts.get('branches')
2081 branches = opts.get('branches')
2075 if tags:
2082 if tags:
2076 labels = {}
2083 labels = {}
2077 for l, n in repo.tags().items():
2084 for l, n in repo.tags().items():
2078 labels.setdefault(cl.rev(n), []).append(l)
2085 labels.setdefault(cl.rev(n), []).append(l)
2079 def events():
2086 def events():
2080 b = "default"
2087 b = "default"
2081 for r in cl:
2088 for r in cl:
2082 if branches:
2089 if branches:
2083 newb = cl.read(cl.node(r))[5]['branch']
2090 newb = cl.read(cl.node(r))[5]['branch']
2084 if newb != b:
2091 if newb != b:
2085 yield 'a', newb
2092 yield 'a', newb
2086 b = newb
2093 b = newb
2087 yield 'n', (r, list(p for p in cl.parentrevs(r)
2094 yield 'n', (r, list(p for p in cl.parentrevs(r)
2088 if p != -1))
2095 if p != -1))
2089 if tags:
2096 if tags:
2090 ls = labels.get(r)
2097 ls = labels.get(r)
2091 if ls:
2098 if ls:
2092 for l in ls:
2099 for l in ls:
2093 yield 'l', (r, l)
2100 yield 'l', (r, l)
2094 else:
2101 else:
2095 raise error.Abort(_('need repo for changelog dag'))
2102 raise error.Abort(_('need repo for changelog dag'))
2096
2103
2097 for line in dagparser.dagtextlines(events(),
2104 for line in dagparser.dagtextlines(events(),
2098 addspaces=spaces,
2105 addspaces=spaces,
2099 wraplabels=True,
2106 wraplabels=True,
2100 wrapannotations=True,
2107 wrapannotations=True,
2101 wrapnonlinear=dots,
2108 wrapnonlinear=dots,
2102 usedots=dots,
2109 usedots=dots,
2103 maxlinewidth=70):
2110 maxlinewidth=70):
2104 ui.write(line)
2111 ui.write(line)
2105 ui.write("\n")
2112 ui.write("\n")
2106
2113
2107 @command('debugdata',
2114 @command('debugdata',
2108 [('c', 'changelog', False, _('open changelog')),
2115 [('c', 'changelog', False, _('open changelog')),
2109 ('m', 'manifest', False, _('open manifest')),
2116 ('m', 'manifest', False, _('open manifest')),
2110 ('', 'dir', False, _('open directory manifest'))],
2117 ('', 'dir', False, _('open directory manifest'))],
2111 _('-c|-m|FILE REV'))
2118 _('-c|-m|FILE REV'))
2112 def debugdata(ui, repo, file_, rev=None, **opts):
2119 def debugdata(ui, repo, file_, rev=None, **opts):
2113 """dump the contents of a data file revision"""
2120 """dump the contents of a data file revision"""
2114 if opts.get('changelog') or opts.get('manifest'):
2121 if opts.get('changelog') or opts.get('manifest'):
2115 file_, rev = None, file_
2122 file_, rev = None, file_
2116 elif rev is None:
2123 elif rev is None:
2117 raise error.CommandError('debugdata', _('invalid arguments'))
2124 raise error.CommandError('debugdata', _('invalid arguments'))
2118 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
2125 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
2119 try:
2126 try:
2120 ui.write(r.revision(r.lookup(rev)))
2127 ui.write(r.revision(r.lookup(rev)))
2121 except KeyError:
2128 except KeyError:
2122 raise error.Abort(_('invalid revision identifier %s') % rev)
2129 raise error.Abort(_('invalid revision identifier %s') % rev)
2123
2130
2124 @command('debugdate',
2131 @command('debugdate',
2125 [('e', 'extended', None, _('try extended date formats'))],
2132 [('e', 'extended', None, _('try extended date formats'))],
2126 _('[-e] DATE [RANGE]'),
2133 _('[-e] DATE [RANGE]'),
2127 norepo=True, optionalrepo=True)
2134 norepo=True, optionalrepo=True)
2128 def debugdate(ui, date, range=None, **opts):
2135 def debugdate(ui, date, range=None, **opts):
2129 """parse and display a date"""
2136 """parse and display a date"""
2130 if opts["extended"]:
2137 if opts["extended"]:
2131 d = util.parsedate(date, util.extendeddateformats)
2138 d = util.parsedate(date, util.extendeddateformats)
2132 else:
2139 else:
2133 d = util.parsedate(date)
2140 d = util.parsedate(date)
2134 ui.write(("internal: %s %s\n") % d)
2141 ui.write(("internal: %s %s\n") % d)
2135 ui.write(("standard: %s\n") % util.datestr(d))
2142 ui.write(("standard: %s\n") % util.datestr(d))
2136 if range:
2143 if range:
2137 m = util.matchdate(range)
2144 m = util.matchdate(range)
2138 ui.write(("match: %s\n") % m(d[0]))
2145 ui.write(("match: %s\n") % m(d[0]))
2139
2146
2140 @command('debugdiscovery',
2147 @command('debugdiscovery',
2141 [('', 'old', None, _('use old-style discovery')),
2148 [('', 'old', None, _('use old-style discovery')),
2142 ('', 'nonheads', None,
2149 ('', 'nonheads', None,
2143 _('use old-style discovery with non-heads included')),
2150 _('use old-style discovery with non-heads included')),
2144 ] + remoteopts,
2151 ] + remoteopts,
2145 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
2152 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
2146 def debugdiscovery(ui, repo, remoteurl="default", **opts):
2153 def debugdiscovery(ui, repo, remoteurl="default", **opts):
2147 """runs the changeset discovery protocol in isolation"""
2154 """runs the changeset discovery protocol in isolation"""
2148 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
2155 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
2149 opts.get('branch'))
2156 opts.get('branch'))
2150 remote = hg.peer(repo, opts, remoteurl)
2157 remote = hg.peer(repo, opts, remoteurl)
2151 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
2158 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
2152
2159
2153 # make sure tests are repeatable
2160 # make sure tests are repeatable
2154 random.seed(12323)
2161 random.seed(12323)
2155
2162
2156 def doit(localheads, remoteheads, remote=remote):
2163 def doit(localheads, remoteheads, remote=remote):
2157 if opts.get('old'):
2164 if opts.get('old'):
2158 if localheads:
2165 if localheads:
2159 raise error.Abort('cannot use localheads with old style '
2166 raise error.Abort('cannot use localheads with old style '
2160 'discovery')
2167 'discovery')
2161 if not util.safehasattr(remote, 'branches'):
2168 if not util.safehasattr(remote, 'branches'):
2162 # enable in-client legacy support
2169 # enable in-client legacy support
2163 remote = localrepo.locallegacypeer(remote.local())
2170 remote = localrepo.locallegacypeer(remote.local())
2164 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2171 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2165 force=True)
2172 force=True)
2166 common = set(common)
2173 common = set(common)
2167 if not opts.get('nonheads'):
2174 if not opts.get('nonheads'):
2168 ui.write(("unpruned common: %s\n") %
2175 ui.write(("unpruned common: %s\n") %
2169 " ".join(sorted(short(n) for n in common)))
2176 " ".join(sorted(short(n) for n in common)))
2170 dag = dagutil.revlogdag(repo.changelog)
2177 dag = dagutil.revlogdag(repo.changelog)
2171 all = dag.ancestorset(dag.internalizeall(common))
2178 all = dag.ancestorset(dag.internalizeall(common))
2172 common = dag.externalizeall(dag.headsetofconnecteds(all))
2179 common = dag.externalizeall(dag.headsetofconnecteds(all))
2173 else:
2180 else:
2174 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2181 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2175 common = set(common)
2182 common = set(common)
2176 rheads = set(hds)
2183 rheads = set(hds)
2177 lheads = set(repo.heads())
2184 lheads = set(repo.heads())
2178 ui.write(("common heads: %s\n") %
2185 ui.write(("common heads: %s\n") %
2179 " ".join(sorted(short(n) for n in common)))
2186 " ".join(sorted(short(n) for n in common)))
2180 if lheads <= common:
2187 if lheads <= common:
2181 ui.write(("local is subset\n"))
2188 ui.write(("local is subset\n"))
2182 elif rheads <= common:
2189 elif rheads <= common:
2183 ui.write(("remote is subset\n"))
2190 ui.write(("remote is subset\n"))
2184
2191
2185 serverlogs = opts.get('serverlog')
2192 serverlogs = opts.get('serverlog')
2186 if serverlogs:
2193 if serverlogs:
2187 for filename in serverlogs:
2194 for filename in serverlogs:
2188 logfile = open(filename, 'r')
2195 logfile = open(filename, 'r')
2189 try:
2196 try:
2190 line = logfile.readline()
2197 line = logfile.readline()
2191 while line:
2198 while line:
2192 parts = line.strip().split(';')
2199 parts = line.strip().split(';')
2193 op = parts[1]
2200 op = parts[1]
2194 if op == 'cg':
2201 if op == 'cg':
2195 pass
2202 pass
2196 elif op == 'cgss':
2203 elif op == 'cgss':
2197 doit(parts[2].split(' '), parts[3].split(' '))
2204 doit(parts[2].split(' '), parts[3].split(' '))
2198 elif op == 'unb':
2205 elif op == 'unb':
2199 doit(parts[3].split(' '), parts[2].split(' '))
2206 doit(parts[3].split(' '), parts[2].split(' '))
2200 line = logfile.readline()
2207 line = logfile.readline()
2201 finally:
2208 finally:
2202 logfile.close()
2209 logfile.close()
2203
2210
2204 else:
2211 else:
2205 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2212 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2206 opts.get('remote_head'))
2213 opts.get('remote_head'))
2207 localrevs = opts.get('local_head')
2214 localrevs = opts.get('local_head')
2208 doit(localrevs, remoterevs)
2215 doit(localrevs, remoterevs)
2209
2216
2210 @command('debugextensions', formatteropts, [], norepo=True)
2217 @command('debugextensions', formatteropts, [], norepo=True)
2211 def debugextensions(ui, **opts):
2218 def debugextensions(ui, **opts):
2212 '''show information about active extensions'''
2219 '''show information about active extensions'''
2213 exts = extensions.extensions(ui)
2220 exts = extensions.extensions(ui)
2214 fm = ui.formatter('debugextensions', opts)
2221 fm = ui.formatter('debugextensions', opts)
2215 for extname, extmod in sorted(exts, key=operator.itemgetter(0)):
2222 for extname, extmod in sorted(exts, key=operator.itemgetter(0)):
2216 extsource = extmod.__file__
2223 extsource = extmod.__file__
2217 exttestedwith = getattr(extmod, 'testedwith', None)
2224 exttestedwith = getattr(extmod, 'testedwith', None)
2218 if exttestedwith is not None:
2225 if exttestedwith is not None:
2219 exttestedwith = exttestedwith.split()
2226 exttestedwith = exttestedwith.split()
2220 extbuglink = getattr(extmod, 'buglink', None)
2227 extbuglink = getattr(extmod, 'buglink', None)
2221
2228
2222 fm.startitem()
2229 fm.startitem()
2223
2230
2224 if ui.quiet or ui.verbose:
2231 if ui.quiet or ui.verbose:
2225 fm.write('name', '%s\n', extname)
2232 fm.write('name', '%s\n', extname)
2226 else:
2233 else:
2227 fm.write('name', '%s', extname)
2234 fm.write('name', '%s', extname)
2228 if not exttestedwith:
2235 if not exttestedwith:
2229 fm.plain(_(' (untested!)\n'))
2236 fm.plain(_(' (untested!)\n'))
2230 else:
2237 else:
2231 if exttestedwith == ['internal'] or \
2238 if exttestedwith == ['internal'] or \
2232 util.version() in exttestedwith:
2239 util.version() in exttestedwith:
2233 fm.plain('\n')
2240 fm.plain('\n')
2234 else:
2241 else:
2235 lasttestedversion = exttestedwith[-1]
2242 lasttestedversion = exttestedwith[-1]
2236 fm.plain(' (%s!)\n' % lasttestedversion)
2243 fm.plain(' (%s!)\n' % lasttestedversion)
2237
2244
2238 fm.condwrite(ui.verbose and extsource, 'source',
2245 fm.condwrite(ui.verbose and extsource, 'source',
2239 _(' location: %s\n'), extsource or "")
2246 _(' location: %s\n'), extsource or "")
2240
2247
2241 fm.condwrite(ui.verbose and exttestedwith, 'testedwith',
2248 fm.condwrite(ui.verbose and exttestedwith, 'testedwith',
2242 _(' tested with: %s\n'), ' '.join(exttestedwith or []))
2249 _(' tested with: %s\n'), ' '.join(exttestedwith or []))
2243
2250
2244 fm.condwrite(ui.verbose and extbuglink, 'buglink',
2251 fm.condwrite(ui.verbose and extbuglink, 'buglink',
2245 _(' bug reporting: %s\n'), extbuglink or "")
2252 _(' bug reporting: %s\n'), extbuglink or "")
2246
2253
2247 fm.end()
2254 fm.end()
2248
2255
2249 @command('debugfileset',
2256 @command('debugfileset',
2250 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2257 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2251 _('[-r REV] FILESPEC'))
2258 _('[-r REV] FILESPEC'))
2252 def debugfileset(ui, repo, expr, **opts):
2259 def debugfileset(ui, repo, expr, **opts):
2253 '''parse and apply a fileset specification'''
2260 '''parse and apply a fileset specification'''
2254 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2261 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2255 if ui.verbose:
2262 if ui.verbose:
2256 tree = fileset.parse(expr)
2263 tree = fileset.parse(expr)
2257 ui.note(fileset.prettyformat(tree), "\n")
2264 ui.note(fileset.prettyformat(tree), "\n")
2258
2265
2259 for f in ctx.getfileset(expr):
2266 for f in ctx.getfileset(expr):
2260 ui.write("%s\n" % f)
2267 ui.write("%s\n" % f)
2261
2268
2262 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2269 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2263 def debugfsinfo(ui, path="."):
2270 def debugfsinfo(ui, path="."):
2264 """show information detected about current filesystem"""
2271 """show information detected about current filesystem"""
2265 util.writefile('.debugfsinfo', '')
2272 util.writefile('.debugfsinfo', '')
2266 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2273 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2267 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2274 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2268 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2275 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2269 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2276 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2270 and 'yes' or 'no'))
2277 and 'yes' or 'no'))
2271 os.unlink('.debugfsinfo')
2278 os.unlink('.debugfsinfo')
2272
2279
2273 @command('debuggetbundle',
2280 @command('debuggetbundle',
2274 [('H', 'head', [], _('id of head node'), _('ID')),
2281 [('H', 'head', [], _('id of head node'), _('ID')),
2275 ('C', 'common', [], _('id of common node'), _('ID')),
2282 ('C', 'common', [], _('id of common node'), _('ID')),
2276 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2283 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2277 _('REPO FILE [-H|-C ID]...'),
2284 _('REPO FILE [-H|-C ID]...'),
2278 norepo=True)
2285 norepo=True)
2279 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2286 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2280 """retrieves a bundle from a repo
2287 """retrieves a bundle from a repo
2281
2288
2282 Every ID must be a full-length hex node id string. Saves the bundle to the
2289 Every ID must be a full-length hex node id string. Saves the bundle to the
2283 given file.
2290 given file.
2284 """
2291 """
2285 repo = hg.peer(ui, opts, repopath)
2292 repo = hg.peer(ui, opts, repopath)
2286 if not repo.capable('getbundle'):
2293 if not repo.capable('getbundle'):
2287 raise error.Abort("getbundle() not supported by target repository")
2294 raise error.Abort("getbundle() not supported by target repository")
2288 args = {}
2295 args = {}
2289 if common:
2296 if common:
2290 args['common'] = [bin(s) for s in common]
2297 args['common'] = [bin(s) for s in common]
2291 if head:
2298 if head:
2292 args['heads'] = [bin(s) for s in head]
2299 args['heads'] = [bin(s) for s in head]
2293 # TODO: get desired bundlecaps from command line.
2300 # TODO: get desired bundlecaps from command line.
2294 args['bundlecaps'] = None
2301 args['bundlecaps'] = None
2295 bundle = repo.getbundle('debug', **args)
2302 bundle = repo.getbundle('debug', **args)
2296
2303
2297 bundletype = opts.get('type', 'bzip2').lower()
2304 bundletype = opts.get('type', 'bzip2').lower()
2298 btypes = {'none': 'HG10UN',
2305 btypes = {'none': 'HG10UN',
2299 'bzip2': 'HG10BZ',
2306 'bzip2': 'HG10BZ',
2300 'gzip': 'HG10GZ',
2307 'gzip': 'HG10GZ',
2301 'bundle2': 'HG20'}
2308 'bundle2': 'HG20'}
2302 bundletype = btypes.get(bundletype)
2309 bundletype = btypes.get(bundletype)
2303 if bundletype not in changegroup.bundletypes:
2310 if bundletype not in changegroup.bundletypes:
2304 raise error.Abort(_('unknown bundle type specified with --type'))
2311 raise error.Abort(_('unknown bundle type specified with --type'))
2305 changegroup.writebundle(ui, bundle, bundlepath, bundletype)
2312 changegroup.writebundle(ui, bundle, bundlepath, bundletype)
2306
2313
2307 @command('debugignore', [], '')
2314 @command('debugignore', [], '')
2308 def debugignore(ui, repo, *values, **opts):
2315 def debugignore(ui, repo, *values, **opts):
2309 """display the combined ignore pattern"""
2316 """display the combined ignore pattern"""
2310 ignore = repo.dirstate._ignore
2317 ignore = repo.dirstate._ignore
2311 includepat = getattr(ignore, 'includepat', None)
2318 includepat = getattr(ignore, 'includepat', None)
2312 if includepat is not None:
2319 if includepat is not None:
2313 ui.write("%s\n" % includepat)
2320 ui.write("%s\n" % includepat)
2314 else:
2321 else:
2315 raise error.Abort(_("no ignore patterns found"))
2322 raise error.Abort(_("no ignore patterns found"))
2316
2323
2317 @command('debugindex',
2324 @command('debugindex',
2318 [('c', 'changelog', False, _('open changelog')),
2325 [('c', 'changelog', False, _('open changelog')),
2319 ('m', 'manifest', False, _('open manifest')),
2326 ('m', 'manifest', False, _('open manifest')),
2320 ('', 'dir', False, _('open directory manifest')),
2327 ('', 'dir', False, _('open directory manifest')),
2321 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2328 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2322 _('[-f FORMAT] -c|-m|FILE'),
2329 _('[-f FORMAT] -c|-m|FILE'),
2323 optionalrepo=True)
2330 optionalrepo=True)
2324 def debugindex(ui, repo, file_=None, **opts):
2331 def debugindex(ui, repo, file_=None, **opts):
2325 """dump the contents of an index file"""
2332 """dump the contents of an index file"""
2326 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2333 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2327 format = opts.get('format', 0)
2334 format = opts.get('format', 0)
2328 if format not in (0, 1):
2335 if format not in (0, 1):
2329 raise error.Abort(_("unknown format %d") % format)
2336 raise error.Abort(_("unknown format %d") % format)
2330
2337
2331 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2338 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2332 if generaldelta:
2339 if generaldelta:
2333 basehdr = ' delta'
2340 basehdr = ' delta'
2334 else:
2341 else:
2335 basehdr = ' base'
2342 basehdr = ' base'
2336
2343
2337 if ui.debugflag:
2344 if ui.debugflag:
2338 shortfn = hex
2345 shortfn = hex
2339 else:
2346 else:
2340 shortfn = short
2347 shortfn = short
2341
2348
2342 # There might not be anything in r, so have a sane default
2349 # There might not be anything in r, so have a sane default
2343 idlen = 12
2350 idlen = 12
2344 for i in r:
2351 for i in r:
2345 idlen = len(shortfn(r.node(i)))
2352 idlen = len(shortfn(r.node(i)))
2346 break
2353 break
2347
2354
2348 if format == 0:
2355 if format == 0:
2349 ui.write(" rev offset length " + basehdr + " linkrev"
2356 ui.write(" rev offset length " + basehdr + " linkrev"
2350 " %s %s p2\n" % ("nodeid".ljust(idlen), "p1".ljust(idlen)))
2357 " %s %s p2\n" % ("nodeid".ljust(idlen), "p1".ljust(idlen)))
2351 elif format == 1:
2358 elif format == 1:
2352 ui.write(" rev flag offset length"
2359 ui.write(" rev flag offset length"
2353 " size " + basehdr + " link p1 p2"
2360 " size " + basehdr + " link p1 p2"
2354 " %s\n" % "nodeid".rjust(idlen))
2361 " %s\n" % "nodeid".rjust(idlen))
2355
2362
2356 for i in r:
2363 for i in r:
2357 node = r.node(i)
2364 node = r.node(i)
2358 if generaldelta:
2365 if generaldelta:
2359 base = r.deltaparent(i)
2366 base = r.deltaparent(i)
2360 else:
2367 else:
2361 base = r.chainbase(i)
2368 base = r.chainbase(i)
2362 if format == 0:
2369 if format == 0:
2363 try:
2370 try:
2364 pp = r.parents(node)
2371 pp = r.parents(node)
2365 except Exception:
2372 except Exception:
2366 pp = [nullid, nullid]
2373 pp = [nullid, nullid]
2367 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2374 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2368 i, r.start(i), r.length(i), base, r.linkrev(i),
2375 i, r.start(i), r.length(i), base, r.linkrev(i),
2369 shortfn(node), shortfn(pp[0]), shortfn(pp[1])))
2376 shortfn(node), shortfn(pp[0]), shortfn(pp[1])))
2370 elif format == 1:
2377 elif format == 1:
2371 pr = r.parentrevs(i)
2378 pr = r.parentrevs(i)
2372 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2379 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2373 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2380 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2374 base, r.linkrev(i), pr[0], pr[1], shortfn(node)))
2381 base, r.linkrev(i), pr[0], pr[1], shortfn(node)))
2375
2382
2376 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2383 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2377 def debugindexdot(ui, repo, file_):
2384 def debugindexdot(ui, repo, file_):
2378 """dump an index DAG as a graphviz dot file"""
2385 """dump an index DAG as a graphviz dot file"""
2379 r = None
2386 r = None
2380 if repo:
2387 if repo:
2381 filelog = repo.file(file_)
2388 filelog = repo.file(file_)
2382 if len(filelog):
2389 if len(filelog):
2383 r = filelog
2390 r = filelog
2384 if not r:
2391 if not r:
2385 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2392 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2386 ui.write(("digraph G {\n"))
2393 ui.write(("digraph G {\n"))
2387 for i in r:
2394 for i in r:
2388 node = r.node(i)
2395 node = r.node(i)
2389 pp = r.parents(node)
2396 pp = r.parents(node)
2390 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2397 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2391 if pp[1] != nullid:
2398 if pp[1] != nullid:
2392 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2399 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2393 ui.write("}\n")
2400 ui.write("}\n")
2394
2401
2395 @command('debuginstall', [], '', norepo=True)
2402 @command('debuginstall', [], '', norepo=True)
2396 def debuginstall(ui):
2403 def debuginstall(ui):
2397 '''test Mercurial installation
2404 '''test Mercurial installation
2398
2405
2399 Returns 0 on success.
2406 Returns 0 on success.
2400 '''
2407 '''
2401
2408
2402 def writetemp(contents):
2409 def writetemp(contents):
2403 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2410 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2404 f = os.fdopen(fd, "wb")
2411 f = os.fdopen(fd, "wb")
2405 f.write(contents)
2412 f.write(contents)
2406 f.close()
2413 f.close()
2407 return name
2414 return name
2408
2415
2409 problems = 0
2416 problems = 0
2410
2417
2411 # encoding
2418 # encoding
2412 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2419 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2413 try:
2420 try:
2414 encoding.fromlocal("test")
2421 encoding.fromlocal("test")
2415 except error.Abort as inst:
2422 except error.Abort as inst:
2416 ui.write(" %s\n" % inst)
2423 ui.write(" %s\n" % inst)
2417 ui.write(_(" (check that your locale is properly set)\n"))
2424 ui.write(_(" (check that your locale is properly set)\n"))
2418 problems += 1
2425 problems += 1
2419
2426
2420 # Python
2427 # Python
2421 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2428 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2422 ui.status(_("checking Python version (%s)\n")
2429 ui.status(_("checking Python version (%s)\n")
2423 % ("%s.%s.%s" % sys.version_info[:3]))
2430 % ("%s.%s.%s" % sys.version_info[:3]))
2424 ui.status(_("checking Python lib (%s)...\n")
2431 ui.status(_("checking Python lib (%s)...\n")
2425 % os.path.dirname(os.__file__))
2432 % os.path.dirname(os.__file__))
2426
2433
2427 # compiled modules
2434 # compiled modules
2428 ui.status(_("checking installed modules (%s)...\n")
2435 ui.status(_("checking installed modules (%s)...\n")
2429 % os.path.dirname(__file__))
2436 % os.path.dirname(__file__))
2430 try:
2437 try:
2431 import bdiff, mpatch, base85, osutil
2438 import bdiff, mpatch, base85, osutil
2432 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2439 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2433 except Exception as inst:
2440 except Exception as inst:
2434 ui.write(" %s\n" % inst)
2441 ui.write(" %s\n" % inst)
2435 ui.write(_(" One or more extensions could not be found"))
2442 ui.write(_(" One or more extensions could not be found"))
2436 ui.write(_(" (check that you compiled the extensions)\n"))
2443 ui.write(_(" (check that you compiled the extensions)\n"))
2437 problems += 1
2444 problems += 1
2438
2445
2439 # templates
2446 # templates
2440 import templater
2447 import templater
2441 p = templater.templatepaths()
2448 p = templater.templatepaths()
2442 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2449 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2443 if p:
2450 if p:
2444 m = templater.templatepath("map-cmdline.default")
2451 m = templater.templatepath("map-cmdline.default")
2445 if m:
2452 if m:
2446 # template found, check if it is working
2453 # template found, check if it is working
2447 try:
2454 try:
2448 templater.templater(m)
2455 templater.templater(m)
2449 except Exception as inst:
2456 except Exception as inst:
2450 ui.write(" %s\n" % inst)
2457 ui.write(" %s\n" % inst)
2451 p = None
2458 p = None
2452 else:
2459 else:
2453 ui.write(_(" template 'default' not found\n"))
2460 ui.write(_(" template 'default' not found\n"))
2454 p = None
2461 p = None
2455 else:
2462 else:
2456 ui.write(_(" no template directories found\n"))
2463 ui.write(_(" no template directories found\n"))
2457 if not p:
2464 if not p:
2458 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2465 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2459 problems += 1
2466 problems += 1
2460
2467
2461 # editor
2468 # editor
2462 ui.status(_("checking commit editor...\n"))
2469 ui.status(_("checking commit editor...\n"))
2463 editor = ui.geteditor()
2470 editor = ui.geteditor()
2464 editor = util.expandpath(editor)
2471 editor = util.expandpath(editor)
2465 cmdpath = util.findexe(shlex.split(editor)[0])
2472 cmdpath = util.findexe(shlex.split(editor)[0])
2466 if not cmdpath:
2473 if not cmdpath:
2467 if editor == 'vi':
2474 if editor == 'vi':
2468 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2475 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2469 ui.write(_(" (specify a commit editor in your configuration"
2476 ui.write(_(" (specify a commit editor in your configuration"
2470 " file)\n"))
2477 " file)\n"))
2471 else:
2478 else:
2472 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2479 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2473 ui.write(_(" (specify a commit editor in your configuration"
2480 ui.write(_(" (specify a commit editor in your configuration"
2474 " file)\n"))
2481 " file)\n"))
2475 problems += 1
2482 problems += 1
2476
2483
2477 # check username
2484 # check username
2478 ui.status(_("checking username...\n"))
2485 ui.status(_("checking username...\n"))
2479 try:
2486 try:
2480 ui.username()
2487 ui.username()
2481 except error.Abort as e:
2488 except error.Abort as e:
2482 ui.write(" %s\n" % e)
2489 ui.write(" %s\n" % e)
2483 ui.write(_(" (specify a username in your configuration file)\n"))
2490 ui.write(_(" (specify a username in your configuration file)\n"))
2484 problems += 1
2491 problems += 1
2485
2492
2486 if not problems:
2493 if not problems:
2487 ui.status(_("no problems detected\n"))
2494 ui.status(_("no problems detected\n"))
2488 else:
2495 else:
2489 ui.write(_("%s problems detected,"
2496 ui.write(_("%s problems detected,"
2490 " please check your install!\n") % problems)
2497 " please check your install!\n") % problems)
2491
2498
2492 return problems
2499 return problems
2493
2500
2494 @command('debugknown', [], _('REPO ID...'), norepo=True)
2501 @command('debugknown', [], _('REPO ID...'), norepo=True)
2495 def debugknown(ui, repopath, *ids, **opts):
2502 def debugknown(ui, repopath, *ids, **opts):
2496 """test whether node ids are known to a repo
2503 """test whether node ids are known to a repo
2497
2504
2498 Every ID must be a full-length hex node id string. Returns a list of 0s
2505 Every ID must be a full-length hex node id string. Returns a list of 0s
2499 and 1s indicating unknown/known.
2506 and 1s indicating unknown/known.
2500 """
2507 """
2501 repo = hg.peer(ui, opts, repopath)
2508 repo = hg.peer(ui, opts, repopath)
2502 if not repo.capable('known'):
2509 if not repo.capable('known'):
2503 raise error.Abort("known() not supported by target repository")
2510 raise error.Abort("known() not supported by target repository")
2504 flags = repo.known([bin(s) for s in ids])
2511 flags = repo.known([bin(s) for s in ids])
2505 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2512 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2506
2513
2507 @command('debuglabelcomplete', [], _('LABEL...'))
2514 @command('debuglabelcomplete', [], _('LABEL...'))
2508 def debuglabelcomplete(ui, repo, *args):
2515 def debuglabelcomplete(ui, repo, *args):
2509 '''backwards compatibility with old bash completion scripts (DEPRECATED)'''
2516 '''backwards compatibility with old bash completion scripts (DEPRECATED)'''
2510 debugnamecomplete(ui, repo, *args)
2517 debugnamecomplete(ui, repo, *args)
2511
2518
2512 @command('debugmergestate', [], '')
2519 @command('debugmergestate', [], '')
2513 def debugmergestate(ui, repo, *args):
2520 def debugmergestate(ui, repo, *args):
2514 """print merge state
2521 """print merge state
2515
2522
2516 Use --verbose to print out information about whether v1 or v2 merge state
2523 Use --verbose to print out information about whether v1 or v2 merge state
2517 was chosen."""
2524 was chosen."""
2518 def printrecords(version):
2525 def printrecords(version):
2519 ui.write(('* version %s records\n') % version)
2526 ui.write(('* version %s records\n') % version)
2520 if version == 1:
2527 if version == 1:
2521 records = v1records
2528 records = v1records
2522 else:
2529 else:
2523 records = v2records
2530 records = v2records
2524
2531
2525 for rtype, record in records:
2532 for rtype, record in records:
2526 # pretty print some record types
2533 # pretty print some record types
2527 if rtype == 'L':
2534 if rtype == 'L':
2528 ui.write(('local: %s\n') % record)
2535 ui.write(('local: %s\n') % record)
2529 elif rtype == 'O':
2536 elif rtype == 'O':
2530 ui.write(('other: %s\n') % record)
2537 ui.write(('other: %s\n') % record)
2531 elif rtype == 'm':
2538 elif rtype == 'm':
2532 driver, mdstate = record.split('\0', 1)
2539 driver, mdstate = record.split('\0', 1)
2533 ui.write(('merge driver: %s (state "%s")\n')
2540 ui.write(('merge driver: %s (state "%s")\n')
2534 % (driver, mdstate))
2541 % (driver, mdstate))
2535 elif rtype in 'FD':
2542 elif rtype in 'FD':
2536 r = record.split('\0')
2543 r = record.split('\0')
2537 f, state, hash, lfile, afile, anode, ofile = r[0:7]
2544 f, state, hash, lfile, afile, anode, ofile = r[0:7]
2538 if version == 1:
2545 if version == 1:
2539 onode = 'not stored in v1 format'
2546 onode = 'not stored in v1 format'
2540 flags = r[7]
2547 flags = r[7]
2541 else:
2548 else:
2542 onode, flags = r[7:9]
2549 onode, flags = r[7:9]
2543 ui.write(('file: %s (state "%s", hash %s)\n')
2550 ui.write(('file: %s (state "%s", hash %s)\n')
2544 % (f, state, hash))
2551 % (f, state, hash))
2545 ui.write((' local path: %s (flags "%s")\n') % (lfile, flags))
2552 ui.write((' local path: %s (flags "%s")\n') % (lfile, flags))
2546 ui.write((' ancestor path: %s (node %s)\n') % (afile, anode))
2553 ui.write((' ancestor path: %s (node %s)\n') % (afile, anode))
2547 ui.write((' other path: %s (node %s)\n') % (ofile, onode))
2554 ui.write((' other path: %s (node %s)\n') % (ofile, onode))
2548 else:
2555 else:
2549 ui.write(('unrecognized entry: %s\t%s\n')
2556 ui.write(('unrecognized entry: %s\t%s\n')
2550 % (rtype, record.replace('\0', '\t')))
2557 % (rtype, record.replace('\0', '\t')))
2551
2558
2552 ms = mergemod.mergestate(repo)
2559 ms = mergemod.mergestate(repo)
2553
2560
2554 # sort so that reasonable information is on top
2561 # sort so that reasonable information is on top
2555 v1records = ms._readrecordsv1()
2562 v1records = ms._readrecordsv1()
2556 v2records = ms._readrecordsv2()
2563 v2records = ms._readrecordsv2()
2557 order = 'LOm'
2564 order = 'LOm'
2558 def key(r):
2565 def key(r):
2559 idx = order.find(r[0])
2566 idx = order.find(r[0])
2560 if idx == -1:
2567 if idx == -1:
2561 return (1, r[1])
2568 return (1, r[1])
2562 else:
2569 else:
2563 return (0, idx)
2570 return (0, idx)
2564 v1records.sort(key=key)
2571 v1records.sort(key=key)
2565 v2records.sort(key=key)
2572 v2records.sort(key=key)
2566
2573
2567 if not v1records and not v2records:
2574 if not v1records and not v2records:
2568 ui.write(('no merge state found\n'))
2575 ui.write(('no merge state found\n'))
2569 elif not v2records:
2576 elif not v2records:
2570 ui.note(('no version 2 merge state\n'))
2577 ui.note(('no version 2 merge state\n'))
2571 printrecords(1)
2578 printrecords(1)
2572 elif ms._v1v2match(v1records, v2records):
2579 elif ms._v1v2match(v1records, v2records):
2573 ui.note(('v1 and v2 states match: using v2\n'))
2580 ui.note(('v1 and v2 states match: using v2\n'))
2574 printrecords(2)
2581 printrecords(2)
2575 else:
2582 else:
2576 ui.note(('v1 and v2 states mismatch: using v1\n'))
2583 ui.note(('v1 and v2 states mismatch: using v1\n'))
2577 printrecords(1)
2584 printrecords(1)
2578 if ui.verbose:
2585 if ui.verbose:
2579 printrecords(2)
2586 printrecords(2)
2580
2587
2581 @command('debugnamecomplete', [], _('NAME...'))
2588 @command('debugnamecomplete', [], _('NAME...'))
2582 def debugnamecomplete(ui, repo, *args):
2589 def debugnamecomplete(ui, repo, *args):
2583 '''complete "names" - tags, open branch names, bookmark names'''
2590 '''complete "names" - tags, open branch names, bookmark names'''
2584
2591
2585 names = set()
2592 names = set()
2586 # since we previously only listed open branches, we will handle that
2593 # since we previously only listed open branches, we will handle that
2587 # specially (after this for loop)
2594 # specially (after this for loop)
2588 for name, ns in repo.names.iteritems():
2595 for name, ns in repo.names.iteritems():
2589 if name != 'branches':
2596 if name != 'branches':
2590 names.update(ns.listnames(repo))
2597 names.update(ns.listnames(repo))
2591 names.update(tag for (tag, heads, tip, closed)
2598 names.update(tag for (tag, heads, tip, closed)
2592 in repo.branchmap().iterbranches() if not closed)
2599 in repo.branchmap().iterbranches() if not closed)
2593 completions = set()
2600 completions = set()
2594 if not args:
2601 if not args:
2595 args = ['']
2602 args = ['']
2596 for a in args:
2603 for a in args:
2597 completions.update(n for n in names if n.startswith(a))
2604 completions.update(n for n in names if n.startswith(a))
2598 ui.write('\n'.join(sorted(completions)))
2605 ui.write('\n'.join(sorted(completions)))
2599 ui.write('\n')
2606 ui.write('\n')
2600
2607
2601 @command('debuglocks',
2608 @command('debuglocks',
2602 [('L', 'force-lock', None, _('free the store lock (DANGEROUS)')),
2609 [('L', 'force-lock', None, _('free the store lock (DANGEROUS)')),
2603 ('W', 'force-wlock', None,
2610 ('W', 'force-wlock', None,
2604 _('free the working state lock (DANGEROUS)'))],
2611 _('free the working state lock (DANGEROUS)'))],
2605 _('[OPTION]...'))
2612 _('[OPTION]...'))
2606 def debuglocks(ui, repo, **opts):
2613 def debuglocks(ui, repo, **opts):
2607 """show or modify state of locks
2614 """show or modify state of locks
2608
2615
2609 By default, this command will show which locks are held. This
2616 By default, this command will show which locks are held. This
2610 includes the user and process holding the lock, the amount of time
2617 includes the user and process holding the lock, the amount of time
2611 the lock has been held, and the machine name where the process is
2618 the lock has been held, and the machine name where the process is
2612 running if it's not local.
2619 running if it's not local.
2613
2620
2614 Locks protect the integrity of Mercurial's data, so should be
2621 Locks protect the integrity of Mercurial's data, so should be
2615 treated with care. System crashes or other interruptions may cause
2622 treated with care. System crashes or other interruptions may cause
2616 locks to not be properly released, though Mercurial will usually
2623 locks to not be properly released, though Mercurial will usually
2617 detect and remove such stale locks automatically.
2624 detect and remove such stale locks automatically.
2618
2625
2619 However, detecting stale locks may not always be possible (for
2626 However, detecting stale locks may not always be possible (for
2620 instance, on a shared filesystem). Removing locks may also be
2627 instance, on a shared filesystem). Removing locks may also be
2621 blocked by filesystem permissions.
2628 blocked by filesystem permissions.
2622
2629
2623 Returns 0 if no locks are held.
2630 Returns 0 if no locks are held.
2624
2631
2625 """
2632 """
2626
2633
2627 if opts.get('force_lock'):
2634 if opts.get('force_lock'):
2628 repo.svfs.unlink('lock')
2635 repo.svfs.unlink('lock')
2629 if opts.get('force_wlock'):
2636 if opts.get('force_wlock'):
2630 repo.vfs.unlink('wlock')
2637 repo.vfs.unlink('wlock')
2631 if opts.get('force_lock') or opts.get('force_lock'):
2638 if opts.get('force_lock') or opts.get('force_lock'):
2632 return 0
2639 return 0
2633
2640
2634 now = time.time()
2641 now = time.time()
2635 held = 0
2642 held = 0
2636
2643
2637 def report(vfs, name, method):
2644 def report(vfs, name, method):
2638 # this causes stale locks to get reaped for more accurate reporting
2645 # this causes stale locks to get reaped for more accurate reporting
2639 try:
2646 try:
2640 l = method(False)
2647 l = method(False)
2641 except error.LockHeld:
2648 except error.LockHeld:
2642 l = None
2649 l = None
2643
2650
2644 if l:
2651 if l:
2645 l.release()
2652 l.release()
2646 else:
2653 else:
2647 try:
2654 try:
2648 stat = vfs.lstat(name)
2655 stat = vfs.lstat(name)
2649 age = now - stat.st_mtime
2656 age = now - stat.st_mtime
2650 user = util.username(stat.st_uid)
2657 user = util.username(stat.st_uid)
2651 locker = vfs.readlock(name)
2658 locker = vfs.readlock(name)
2652 if ":" in locker:
2659 if ":" in locker:
2653 host, pid = locker.split(':')
2660 host, pid = locker.split(':')
2654 if host == socket.gethostname():
2661 if host == socket.gethostname():
2655 locker = 'user %s, process %s' % (user, pid)
2662 locker = 'user %s, process %s' % (user, pid)
2656 else:
2663 else:
2657 locker = 'user %s, process %s, host %s' \
2664 locker = 'user %s, process %s, host %s' \
2658 % (user, pid, host)
2665 % (user, pid, host)
2659 ui.write("%-6s %s (%ds)\n" % (name + ":", locker, age))
2666 ui.write("%-6s %s (%ds)\n" % (name + ":", locker, age))
2660 return 1
2667 return 1
2661 except OSError as e:
2668 except OSError as e:
2662 if e.errno != errno.ENOENT:
2669 if e.errno != errno.ENOENT:
2663 raise
2670 raise
2664
2671
2665 ui.write("%-6s free\n" % (name + ":"))
2672 ui.write("%-6s free\n" % (name + ":"))
2666 return 0
2673 return 0
2667
2674
2668 held += report(repo.svfs, "lock", repo.lock)
2675 held += report(repo.svfs, "lock", repo.lock)
2669 held += report(repo.vfs, "wlock", repo.wlock)
2676 held += report(repo.vfs, "wlock", repo.wlock)
2670
2677
2671 return held
2678 return held
2672
2679
2673 @command('debugobsolete',
2680 @command('debugobsolete',
2674 [('', 'flags', 0, _('markers flag')),
2681 [('', 'flags', 0, _('markers flag')),
2675 ('', 'record-parents', False,
2682 ('', 'record-parents', False,
2676 _('record parent information for the precursor')),
2683 _('record parent information for the precursor')),
2677 ('r', 'rev', [], _('display markers relevant to REV')),
2684 ('r', 'rev', [], _('display markers relevant to REV')),
2678 ] + commitopts2,
2685 ] + commitopts2,
2679 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2686 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2680 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2687 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2681 """create arbitrary obsolete marker
2688 """create arbitrary obsolete marker
2682
2689
2683 With no arguments, displays the list of obsolescence markers."""
2690 With no arguments, displays the list of obsolescence markers."""
2684
2691
2685 def parsenodeid(s):
2692 def parsenodeid(s):
2686 try:
2693 try:
2687 # We do not use revsingle/revrange functions here to accept
2694 # We do not use revsingle/revrange functions here to accept
2688 # arbitrary node identifiers, possibly not present in the
2695 # arbitrary node identifiers, possibly not present in the
2689 # local repository.
2696 # local repository.
2690 n = bin(s)
2697 n = bin(s)
2691 if len(n) != len(nullid):
2698 if len(n) != len(nullid):
2692 raise TypeError()
2699 raise TypeError()
2693 return n
2700 return n
2694 except TypeError:
2701 except TypeError:
2695 raise error.Abort('changeset references must be full hexadecimal '
2702 raise error.Abort('changeset references must be full hexadecimal '
2696 'node identifiers')
2703 'node identifiers')
2697
2704
2698 if precursor is not None:
2705 if precursor is not None:
2699 if opts['rev']:
2706 if opts['rev']:
2700 raise error.Abort('cannot select revision when creating marker')
2707 raise error.Abort('cannot select revision when creating marker')
2701 metadata = {}
2708 metadata = {}
2702 metadata['user'] = opts['user'] or ui.username()
2709 metadata['user'] = opts['user'] or ui.username()
2703 succs = tuple(parsenodeid(succ) for succ in successors)
2710 succs = tuple(parsenodeid(succ) for succ in successors)
2704 l = repo.lock()
2711 l = repo.lock()
2705 try:
2712 try:
2706 tr = repo.transaction('debugobsolete')
2713 tr = repo.transaction('debugobsolete')
2707 try:
2714 try:
2708 date = opts.get('date')
2715 date = opts.get('date')
2709 if date:
2716 if date:
2710 date = util.parsedate(date)
2717 date = util.parsedate(date)
2711 else:
2718 else:
2712 date = None
2719 date = None
2713 prec = parsenodeid(precursor)
2720 prec = parsenodeid(precursor)
2714 parents = None
2721 parents = None
2715 if opts['record_parents']:
2722 if opts['record_parents']:
2716 if prec not in repo.unfiltered():
2723 if prec not in repo.unfiltered():
2717 raise error.Abort('cannot used --record-parents on '
2724 raise error.Abort('cannot used --record-parents on '
2718 'unknown changesets')
2725 'unknown changesets')
2719 parents = repo.unfiltered()[prec].parents()
2726 parents = repo.unfiltered()[prec].parents()
2720 parents = tuple(p.node() for p in parents)
2727 parents = tuple(p.node() for p in parents)
2721 repo.obsstore.create(tr, prec, succs, opts['flags'],
2728 repo.obsstore.create(tr, prec, succs, opts['flags'],
2722 parents=parents, date=date,
2729 parents=parents, date=date,
2723 metadata=metadata)
2730 metadata=metadata)
2724 tr.close()
2731 tr.close()
2725 except ValueError as exc:
2732 except ValueError as exc:
2726 raise error.Abort(_('bad obsmarker input: %s') % exc)
2733 raise error.Abort(_('bad obsmarker input: %s') % exc)
2727 finally:
2734 finally:
2728 tr.release()
2735 tr.release()
2729 finally:
2736 finally:
2730 l.release()
2737 l.release()
2731 else:
2738 else:
2732 if opts['rev']:
2739 if opts['rev']:
2733 revs = scmutil.revrange(repo, opts['rev'])
2740 revs = scmutil.revrange(repo, opts['rev'])
2734 nodes = [repo[r].node() for r in revs]
2741 nodes = [repo[r].node() for r in revs]
2735 markers = list(obsolete.getmarkers(repo, nodes=nodes))
2742 markers = list(obsolete.getmarkers(repo, nodes=nodes))
2736 markers.sort(key=lambda x: x._data)
2743 markers.sort(key=lambda x: x._data)
2737 else:
2744 else:
2738 markers = obsolete.getmarkers(repo)
2745 markers = obsolete.getmarkers(repo)
2739
2746
2740 for m in markers:
2747 for m in markers:
2741 cmdutil.showmarker(ui, m)
2748 cmdutil.showmarker(ui, m)
2742
2749
2743 @command('debugpathcomplete',
2750 @command('debugpathcomplete',
2744 [('f', 'full', None, _('complete an entire path')),
2751 [('f', 'full', None, _('complete an entire path')),
2745 ('n', 'normal', None, _('show only normal files')),
2752 ('n', 'normal', None, _('show only normal files')),
2746 ('a', 'added', None, _('show only added files')),
2753 ('a', 'added', None, _('show only added files')),
2747 ('r', 'removed', None, _('show only removed files'))],
2754 ('r', 'removed', None, _('show only removed files'))],
2748 _('FILESPEC...'))
2755 _('FILESPEC...'))
2749 def debugpathcomplete(ui, repo, *specs, **opts):
2756 def debugpathcomplete(ui, repo, *specs, **opts):
2750 '''complete part or all of a tracked path
2757 '''complete part or all of a tracked path
2751
2758
2752 This command supports shells that offer path name completion. It
2759 This command supports shells that offer path name completion. It
2753 currently completes only files already known to the dirstate.
2760 currently completes only files already known to the dirstate.
2754
2761
2755 Completion extends only to the next path segment unless
2762 Completion extends only to the next path segment unless
2756 --full is specified, in which case entire paths are used.'''
2763 --full is specified, in which case entire paths are used.'''
2757
2764
2758 def complete(path, acceptable):
2765 def complete(path, acceptable):
2759 dirstate = repo.dirstate
2766 dirstate = repo.dirstate
2760 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2767 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2761 rootdir = repo.root + os.sep
2768 rootdir = repo.root + os.sep
2762 if spec != repo.root and not spec.startswith(rootdir):
2769 if spec != repo.root and not spec.startswith(rootdir):
2763 return [], []
2770 return [], []
2764 if os.path.isdir(spec):
2771 if os.path.isdir(spec):
2765 spec += '/'
2772 spec += '/'
2766 spec = spec[len(rootdir):]
2773 spec = spec[len(rootdir):]
2767 fixpaths = os.sep != '/'
2774 fixpaths = os.sep != '/'
2768 if fixpaths:
2775 if fixpaths:
2769 spec = spec.replace(os.sep, '/')
2776 spec = spec.replace(os.sep, '/')
2770 speclen = len(spec)
2777 speclen = len(spec)
2771 fullpaths = opts['full']
2778 fullpaths = opts['full']
2772 files, dirs = set(), set()
2779 files, dirs = set(), set()
2773 adddir, addfile = dirs.add, files.add
2780 adddir, addfile = dirs.add, files.add
2774 for f, st in dirstate.iteritems():
2781 for f, st in dirstate.iteritems():
2775 if f.startswith(spec) and st[0] in acceptable:
2782 if f.startswith(spec) and st[0] in acceptable:
2776 if fixpaths:
2783 if fixpaths:
2777 f = f.replace('/', os.sep)
2784 f = f.replace('/', os.sep)
2778 if fullpaths:
2785 if fullpaths:
2779 addfile(f)
2786 addfile(f)
2780 continue
2787 continue
2781 s = f.find(os.sep, speclen)
2788 s = f.find(os.sep, speclen)
2782 if s >= 0:
2789 if s >= 0:
2783 adddir(f[:s])
2790 adddir(f[:s])
2784 else:
2791 else:
2785 addfile(f)
2792 addfile(f)
2786 return files, dirs
2793 return files, dirs
2787
2794
2788 acceptable = ''
2795 acceptable = ''
2789 if opts['normal']:
2796 if opts['normal']:
2790 acceptable += 'nm'
2797 acceptable += 'nm'
2791 if opts['added']:
2798 if opts['added']:
2792 acceptable += 'a'
2799 acceptable += 'a'
2793 if opts['removed']:
2800 if opts['removed']:
2794 acceptable += 'r'
2801 acceptable += 'r'
2795 cwd = repo.getcwd()
2802 cwd = repo.getcwd()
2796 if not specs:
2803 if not specs:
2797 specs = ['.']
2804 specs = ['.']
2798
2805
2799 files, dirs = set(), set()
2806 files, dirs = set(), set()
2800 for spec in specs:
2807 for spec in specs:
2801 f, d = complete(spec, acceptable or 'nmar')
2808 f, d = complete(spec, acceptable or 'nmar')
2802 files.update(f)
2809 files.update(f)
2803 dirs.update(d)
2810 dirs.update(d)
2804 files.update(dirs)
2811 files.update(dirs)
2805 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2812 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2806 ui.write('\n')
2813 ui.write('\n')
2807
2814
2808 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2815 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2809 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2816 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2810 '''access the pushkey key/value protocol
2817 '''access the pushkey key/value protocol
2811
2818
2812 With two args, list the keys in the given namespace.
2819 With two args, list the keys in the given namespace.
2813
2820
2814 With five args, set a key to new if it currently is set to old.
2821 With five args, set a key to new if it currently is set to old.
2815 Reports success or failure.
2822 Reports success or failure.
2816 '''
2823 '''
2817
2824
2818 target = hg.peer(ui, {}, repopath)
2825 target = hg.peer(ui, {}, repopath)
2819 if keyinfo:
2826 if keyinfo:
2820 key, old, new = keyinfo
2827 key, old, new = keyinfo
2821 r = target.pushkey(namespace, key, old, new)
2828 r = target.pushkey(namespace, key, old, new)
2822 ui.status(str(r) + '\n')
2829 ui.status(str(r) + '\n')
2823 return not r
2830 return not r
2824 else:
2831 else:
2825 for k, v in sorted(target.listkeys(namespace).iteritems()):
2832 for k, v in sorted(target.listkeys(namespace).iteritems()):
2826 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2833 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2827 v.encode('string-escape')))
2834 v.encode('string-escape')))
2828
2835
2829 @command('debugpvec', [], _('A B'))
2836 @command('debugpvec', [], _('A B'))
2830 def debugpvec(ui, repo, a, b=None):
2837 def debugpvec(ui, repo, a, b=None):
2831 ca = scmutil.revsingle(repo, a)
2838 ca = scmutil.revsingle(repo, a)
2832 cb = scmutil.revsingle(repo, b)
2839 cb = scmutil.revsingle(repo, b)
2833 pa = pvec.ctxpvec(ca)
2840 pa = pvec.ctxpvec(ca)
2834 pb = pvec.ctxpvec(cb)
2841 pb = pvec.ctxpvec(cb)
2835 if pa == pb:
2842 if pa == pb:
2836 rel = "="
2843 rel = "="
2837 elif pa > pb:
2844 elif pa > pb:
2838 rel = ">"
2845 rel = ">"
2839 elif pa < pb:
2846 elif pa < pb:
2840 rel = "<"
2847 rel = "<"
2841 elif pa | pb:
2848 elif pa | pb:
2842 rel = "|"
2849 rel = "|"
2843 ui.write(_("a: %s\n") % pa)
2850 ui.write(_("a: %s\n") % pa)
2844 ui.write(_("b: %s\n") % pb)
2851 ui.write(_("b: %s\n") % pb)
2845 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2852 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2846 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2853 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2847 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2854 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2848 pa.distance(pb), rel))
2855 pa.distance(pb), rel))
2849
2856
2850 @command('debugrebuilddirstate|debugrebuildstate',
2857 @command('debugrebuilddirstate|debugrebuildstate',
2851 [('r', 'rev', '', _('revision to rebuild to'), _('REV')),
2858 [('r', 'rev', '', _('revision to rebuild to'), _('REV')),
2852 ('', 'minimal', None, _('only rebuild files that are inconsistent with '
2859 ('', 'minimal', None, _('only rebuild files that are inconsistent with '
2853 'the working copy parent')),
2860 'the working copy parent')),
2854 ],
2861 ],
2855 _('[-r REV]'))
2862 _('[-r REV]'))
2856 def debugrebuilddirstate(ui, repo, rev, **opts):
2863 def debugrebuilddirstate(ui, repo, rev, **opts):
2857 """rebuild the dirstate as it would look like for the given revision
2864 """rebuild the dirstate as it would look like for the given revision
2858
2865
2859 If no revision is specified the first current parent will be used.
2866 If no revision is specified the first current parent will be used.
2860
2867
2861 The dirstate will be set to the files of the given revision.
2868 The dirstate will be set to the files of the given revision.
2862 The actual working directory content or existing dirstate
2869 The actual working directory content or existing dirstate
2863 information such as adds or removes is not considered.
2870 information such as adds or removes is not considered.
2864
2871
2865 ``minimal`` will only rebuild the dirstate status for files that claim to be
2872 ``minimal`` will only rebuild the dirstate status for files that claim to be
2866 tracked but are not in the parent manifest, or that exist in the parent
2873 tracked but are not in the parent manifest, or that exist in the parent
2867 manifest but are not in the dirstate. It will not change adds, removes, or
2874 manifest but are not in the dirstate. It will not change adds, removes, or
2868 modified files that are in the working copy parent.
2875 modified files that are in the working copy parent.
2869
2876
2870 One use of this command is to make the next :hg:`status` invocation
2877 One use of this command is to make the next :hg:`status` invocation
2871 check the actual file content.
2878 check the actual file content.
2872 """
2879 """
2873 ctx = scmutil.revsingle(repo, rev)
2880 ctx = scmutil.revsingle(repo, rev)
2874 wlock = repo.wlock()
2881 wlock = repo.wlock()
2875 try:
2882 try:
2876 dirstate = repo.dirstate
2883 dirstate = repo.dirstate
2877
2884
2878 # See command doc for what minimal does.
2885 # See command doc for what minimal does.
2879 if opts.get('minimal'):
2886 if opts.get('minimal'):
2880 dirstatefiles = set(dirstate)
2887 dirstatefiles = set(dirstate)
2881 ctxfiles = set(ctx.manifest().keys())
2888 ctxfiles = set(ctx.manifest().keys())
2882 for file in (dirstatefiles | ctxfiles):
2889 for file in (dirstatefiles | ctxfiles):
2883 indirstate = file in dirstatefiles
2890 indirstate = file in dirstatefiles
2884 inctx = file in ctxfiles
2891 inctx = file in ctxfiles
2885
2892
2886 if indirstate and not inctx and dirstate[file] != 'a':
2893 if indirstate and not inctx and dirstate[file] != 'a':
2887 dirstate.drop(file)
2894 dirstate.drop(file)
2888 elif inctx and not indirstate:
2895 elif inctx and not indirstate:
2889 dirstate.normallookup(file)
2896 dirstate.normallookup(file)
2890 else:
2897 else:
2891 dirstate.rebuild(ctx.node(), ctx.manifest())
2898 dirstate.rebuild(ctx.node(), ctx.manifest())
2892 finally:
2899 finally:
2893 wlock.release()
2900 wlock.release()
2894
2901
2895 @command('debugrebuildfncache', [], '')
2902 @command('debugrebuildfncache', [], '')
2896 def debugrebuildfncache(ui, repo):
2903 def debugrebuildfncache(ui, repo):
2897 """rebuild the fncache file"""
2904 """rebuild the fncache file"""
2898 repair.rebuildfncache(ui, repo)
2905 repair.rebuildfncache(ui, repo)
2899
2906
2900 @command('debugrename',
2907 @command('debugrename',
2901 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2908 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2902 _('[-r REV] FILE'))
2909 _('[-r REV] FILE'))
2903 def debugrename(ui, repo, file1, *pats, **opts):
2910 def debugrename(ui, repo, file1, *pats, **opts):
2904 """dump rename information"""
2911 """dump rename information"""
2905
2912
2906 ctx = scmutil.revsingle(repo, opts.get('rev'))
2913 ctx = scmutil.revsingle(repo, opts.get('rev'))
2907 m = scmutil.match(ctx, (file1,) + pats, opts)
2914 m = scmutil.match(ctx, (file1,) + pats, opts)
2908 for abs in ctx.walk(m):
2915 for abs in ctx.walk(m):
2909 fctx = ctx[abs]
2916 fctx = ctx[abs]
2910 o = fctx.filelog().renamed(fctx.filenode())
2917 o = fctx.filelog().renamed(fctx.filenode())
2911 rel = m.rel(abs)
2918 rel = m.rel(abs)
2912 if o:
2919 if o:
2913 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2920 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2914 else:
2921 else:
2915 ui.write(_("%s not renamed\n") % rel)
2922 ui.write(_("%s not renamed\n") % rel)
2916
2923
2917 @command('debugrevlog',
2924 @command('debugrevlog',
2918 [('c', 'changelog', False, _('open changelog')),
2925 [('c', 'changelog', False, _('open changelog')),
2919 ('m', 'manifest', False, _('open manifest')),
2926 ('m', 'manifest', False, _('open manifest')),
2920 ('', 'dir', False, _('open directory manifest')),
2927 ('', 'dir', False, _('open directory manifest')),
2921 ('d', 'dump', False, _('dump index data'))],
2928 ('d', 'dump', False, _('dump index data'))],
2922 _('-c|-m|FILE'),
2929 _('-c|-m|FILE'),
2923 optionalrepo=True)
2930 optionalrepo=True)
2924 def debugrevlog(ui, repo, file_=None, **opts):
2931 def debugrevlog(ui, repo, file_=None, **opts):
2925 """show data and statistics about a revlog"""
2932 """show data and statistics about a revlog"""
2926 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2933 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2927
2934
2928 if opts.get("dump"):
2935 if opts.get("dump"):
2929 numrevs = len(r)
2936 numrevs = len(r)
2930 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2937 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2931 " rawsize totalsize compression heads chainlen\n")
2938 " rawsize totalsize compression heads chainlen\n")
2932 ts = 0
2939 ts = 0
2933 heads = set()
2940 heads = set()
2934
2941
2935 for rev in xrange(numrevs):
2942 for rev in xrange(numrevs):
2936 dbase = r.deltaparent(rev)
2943 dbase = r.deltaparent(rev)
2937 if dbase == -1:
2944 if dbase == -1:
2938 dbase = rev
2945 dbase = rev
2939 cbase = r.chainbase(rev)
2946 cbase = r.chainbase(rev)
2940 clen = r.chainlen(rev)
2947 clen = r.chainlen(rev)
2941 p1, p2 = r.parentrevs(rev)
2948 p1, p2 = r.parentrevs(rev)
2942 rs = r.rawsize(rev)
2949 rs = r.rawsize(rev)
2943 ts = ts + rs
2950 ts = ts + rs
2944 heads -= set(r.parentrevs(rev))
2951 heads -= set(r.parentrevs(rev))
2945 heads.add(rev)
2952 heads.add(rev)
2946 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
2953 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
2947 "%11d %5d %8d\n" %
2954 "%11d %5d %8d\n" %
2948 (rev, p1, p2, r.start(rev), r.end(rev),
2955 (rev, p1, p2, r.start(rev), r.end(rev),
2949 r.start(dbase), r.start(cbase),
2956 r.start(dbase), r.start(cbase),
2950 r.start(p1), r.start(p2),
2957 r.start(p1), r.start(p2),
2951 rs, ts, ts / r.end(rev), len(heads), clen))
2958 rs, ts, ts / r.end(rev), len(heads), clen))
2952 return 0
2959 return 0
2953
2960
2954 v = r.version
2961 v = r.version
2955 format = v & 0xFFFF
2962 format = v & 0xFFFF
2956 flags = []
2963 flags = []
2957 gdelta = False
2964 gdelta = False
2958 if v & revlog.REVLOGNGINLINEDATA:
2965 if v & revlog.REVLOGNGINLINEDATA:
2959 flags.append('inline')
2966 flags.append('inline')
2960 if v & revlog.REVLOGGENERALDELTA:
2967 if v & revlog.REVLOGGENERALDELTA:
2961 gdelta = True
2968 gdelta = True
2962 flags.append('generaldelta')
2969 flags.append('generaldelta')
2963 if not flags:
2970 if not flags:
2964 flags = ['(none)']
2971 flags = ['(none)']
2965
2972
2966 nummerges = 0
2973 nummerges = 0
2967 numfull = 0
2974 numfull = 0
2968 numprev = 0
2975 numprev = 0
2969 nump1 = 0
2976 nump1 = 0
2970 nump2 = 0
2977 nump2 = 0
2971 numother = 0
2978 numother = 0
2972 nump1prev = 0
2979 nump1prev = 0
2973 nump2prev = 0
2980 nump2prev = 0
2974 chainlengths = []
2981 chainlengths = []
2975
2982
2976 datasize = [None, 0, 0L]
2983 datasize = [None, 0, 0L]
2977 fullsize = [None, 0, 0L]
2984 fullsize = [None, 0, 0L]
2978 deltasize = [None, 0, 0L]
2985 deltasize = [None, 0, 0L]
2979
2986
2980 def addsize(size, l):
2987 def addsize(size, l):
2981 if l[0] is None or size < l[0]:
2988 if l[0] is None or size < l[0]:
2982 l[0] = size
2989 l[0] = size
2983 if size > l[1]:
2990 if size > l[1]:
2984 l[1] = size
2991 l[1] = size
2985 l[2] += size
2992 l[2] += size
2986
2993
2987 numrevs = len(r)
2994 numrevs = len(r)
2988 for rev in xrange(numrevs):
2995 for rev in xrange(numrevs):
2989 p1, p2 = r.parentrevs(rev)
2996 p1, p2 = r.parentrevs(rev)
2990 delta = r.deltaparent(rev)
2997 delta = r.deltaparent(rev)
2991 if format > 0:
2998 if format > 0:
2992 addsize(r.rawsize(rev), datasize)
2999 addsize(r.rawsize(rev), datasize)
2993 if p2 != nullrev:
3000 if p2 != nullrev:
2994 nummerges += 1
3001 nummerges += 1
2995 size = r.length(rev)
3002 size = r.length(rev)
2996 if delta == nullrev:
3003 if delta == nullrev:
2997 chainlengths.append(0)
3004 chainlengths.append(0)
2998 numfull += 1
3005 numfull += 1
2999 addsize(size, fullsize)
3006 addsize(size, fullsize)
3000 else:
3007 else:
3001 chainlengths.append(chainlengths[delta] + 1)
3008 chainlengths.append(chainlengths[delta] + 1)
3002 addsize(size, deltasize)
3009 addsize(size, deltasize)
3003 if delta == rev - 1:
3010 if delta == rev - 1:
3004 numprev += 1
3011 numprev += 1
3005 if delta == p1:
3012 if delta == p1:
3006 nump1prev += 1
3013 nump1prev += 1
3007 elif delta == p2:
3014 elif delta == p2:
3008 nump2prev += 1
3015 nump2prev += 1
3009 elif delta == p1:
3016 elif delta == p1:
3010 nump1 += 1
3017 nump1 += 1
3011 elif delta == p2:
3018 elif delta == p2:
3012 nump2 += 1
3019 nump2 += 1
3013 elif delta != nullrev:
3020 elif delta != nullrev:
3014 numother += 1
3021 numother += 1
3015
3022
3016 # Adjust size min value for empty cases
3023 # Adjust size min value for empty cases
3017 for size in (datasize, fullsize, deltasize):
3024 for size in (datasize, fullsize, deltasize):
3018 if size[0] is None:
3025 if size[0] is None:
3019 size[0] = 0
3026 size[0] = 0
3020
3027
3021 numdeltas = numrevs - numfull
3028 numdeltas = numrevs - numfull
3022 numoprev = numprev - nump1prev - nump2prev
3029 numoprev = numprev - nump1prev - nump2prev
3023 totalrawsize = datasize[2]
3030 totalrawsize = datasize[2]
3024 datasize[2] /= numrevs
3031 datasize[2] /= numrevs
3025 fulltotal = fullsize[2]
3032 fulltotal = fullsize[2]
3026 fullsize[2] /= numfull
3033 fullsize[2] /= numfull
3027 deltatotal = deltasize[2]
3034 deltatotal = deltasize[2]
3028 if numrevs - numfull > 0:
3035 if numrevs - numfull > 0:
3029 deltasize[2] /= numrevs - numfull
3036 deltasize[2] /= numrevs - numfull
3030 totalsize = fulltotal + deltatotal
3037 totalsize = fulltotal + deltatotal
3031 avgchainlen = sum(chainlengths) / numrevs
3038 avgchainlen = sum(chainlengths) / numrevs
3032 maxchainlen = max(chainlengths)
3039 maxchainlen = max(chainlengths)
3033 compratio = totalrawsize / totalsize
3040 compratio = totalrawsize / totalsize
3034
3041
3035 basedfmtstr = '%%%dd\n'
3042 basedfmtstr = '%%%dd\n'
3036 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
3043 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
3037
3044
3038 def dfmtstr(max):
3045 def dfmtstr(max):
3039 return basedfmtstr % len(str(max))
3046 return basedfmtstr % len(str(max))
3040 def pcfmtstr(max, padding=0):
3047 def pcfmtstr(max, padding=0):
3041 return basepcfmtstr % (len(str(max)), ' ' * padding)
3048 return basepcfmtstr % (len(str(max)), ' ' * padding)
3042
3049
3043 def pcfmt(value, total):
3050 def pcfmt(value, total):
3044 return (value, 100 * float(value) / total)
3051 return (value, 100 * float(value) / total)
3045
3052
3046 ui.write(('format : %d\n') % format)
3053 ui.write(('format : %d\n') % format)
3047 ui.write(('flags : %s\n') % ', '.join(flags))
3054 ui.write(('flags : %s\n') % ', '.join(flags))
3048
3055
3049 ui.write('\n')
3056 ui.write('\n')
3050 fmt = pcfmtstr(totalsize)
3057 fmt = pcfmtstr(totalsize)
3051 fmt2 = dfmtstr(totalsize)
3058 fmt2 = dfmtstr(totalsize)
3052 ui.write(('revisions : ') + fmt2 % numrevs)
3059 ui.write(('revisions : ') + fmt2 % numrevs)
3053 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
3060 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
3054 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
3061 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
3055 ui.write(('revisions : ') + fmt2 % numrevs)
3062 ui.write(('revisions : ') + fmt2 % numrevs)
3056 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
3063 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
3057 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
3064 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
3058 ui.write(('revision size : ') + fmt2 % totalsize)
3065 ui.write(('revision size : ') + fmt2 % totalsize)
3059 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
3066 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
3060 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
3067 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
3061
3068
3062 ui.write('\n')
3069 ui.write('\n')
3063 fmt = dfmtstr(max(avgchainlen, compratio))
3070 fmt = dfmtstr(max(avgchainlen, compratio))
3064 ui.write(('avg chain length : ') + fmt % avgchainlen)
3071 ui.write(('avg chain length : ') + fmt % avgchainlen)
3065 ui.write(('max chain length : ') + fmt % maxchainlen)
3072 ui.write(('max chain length : ') + fmt % maxchainlen)
3066 ui.write(('compression ratio : ') + fmt % compratio)
3073 ui.write(('compression ratio : ') + fmt % compratio)
3067
3074
3068 if format > 0:
3075 if format > 0:
3069 ui.write('\n')
3076 ui.write('\n')
3070 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
3077 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
3071 % tuple(datasize))
3078 % tuple(datasize))
3072 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
3079 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
3073 % tuple(fullsize))
3080 % tuple(fullsize))
3074 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
3081 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
3075 % tuple(deltasize))
3082 % tuple(deltasize))
3076
3083
3077 if numdeltas > 0:
3084 if numdeltas > 0:
3078 ui.write('\n')
3085 ui.write('\n')
3079 fmt = pcfmtstr(numdeltas)
3086 fmt = pcfmtstr(numdeltas)
3080 fmt2 = pcfmtstr(numdeltas, 4)
3087 fmt2 = pcfmtstr(numdeltas, 4)
3081 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
3088 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
3082 if numprev > 0:
3089 if numprev > 0:
3083 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
3090 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
3084 numprev))
3091 numprev))
3085 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
3092 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
3086 numprev))
3093 numprev))
3087 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
3094 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
3088 numprev))
3095 numprev))
3089 if gdelta:
3096 if gdelta:
3090 ui.write(('deltas against p1 : ')
3097 ui.write(('deltas against p1 : ')
3091 + fmt % pcfmt(nump1, numdeltas))
3098 + fmt % pcfmt(nump1, numdeltas))
3092 ui.write(('deltas against p2 : ')
3099 ui.write(('deltas against p2 : ')
3093 + fmt % pcfmt(nump2, numdeltas))
3100 + fmt % pcfmt(nump2, numdeltas))
3094 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
3101 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
3095 numdeltas))
3102 numdeltas))
3096
3103
3097 @command('debugrevspec',
3104 @command('debugrevspec',
3098 [('', 'optimize', None, _('print parsed tree after optimizing'))],
3105 [('', 'optimize', None, _('print parsed tree after optimizing'))],
3099 ('REVSPEC'))
3106 ('REVSPEC'))
3100 def debugrevspec(ui, repo, expr, **opts):
3107 def debugrevspec(ui, repo, expr, **opts):
3101 """parse and apply a revision specification
3108 """parse and apply a revision specification
3102
3109
3103 Use --verbose to print the parsed tree before and after aliases
3110 Use --verbose to print the parsed tree before and after aliases
3104 expansion.
3111 expansion.
3105 """
3112 """
3106 if ui.verbose:
3113 if ui.verbose:
3107 tree = revset.parse(expr, lookup=repo.__contains__)
3114 tree = revset.parse(expr, lookup=repo.__contains__)
3108 ui.note(revset.prettyformat(tree), "\n")
3115 ui.note(revset.prettyformat(tree), "\n")
3109 newtree = revset.findaliases(ui, tree)
3116 newtree = revset.findaliases(ui, tree)
3110 if newtree != tree:
3117 if newtree != tree:
3111 ui.note(revset.prettyformat(newtree), "\n")
3118 ui.note(revset.prettyformat(newtree), "\n")
3112 tree = newtree
3119 tree = newtree
3113 newtree = revset.foldconcat(tree)
3120 newtree = revset.foldconcat(tree)
3114 if newtree != tree:
3121 if newtree != tree:
3115 ui.note(revset.prettyformat(newtree), "\n")
3122 ui.note(revset.prettyformat(newtree), "\n")
3116 if opts["optimize"]:
3123 if opts["optimize"]:
3117 weight, optimizedtree = revset.optimize(newtree, True)
3124 weight, optimizedtree = revset.optimize(newtree, True)
3118 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
3125 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
3119 func = revset.match(ui, expr, repo)
3126 func = revset.match(ui, expr, repo)
3120 revs = func(repo)
3127 revs = func(repo)
3121 if ui.verbose:
3128 if ui.verbose:
3122 ui.note("* set:\n", revset.prettyformatset(revs), "\n")
3129 ui.note("* set:\n", revset.prettyformatset(revs), "\n")
3123 for c in revs:
3130 for c in revs:
3124 ui.write("%s\n" % c)
3131 ui.write("%s\n" % c)
3125
3132
3126 @command('debugsetparents', [], _('REV1 [REV2]'))
3133 @command('debugsetparents', [], _('REV1 [REV2]'))
3127 def debugsetparents(ui, repo, rev1, rev2=None):
3134 def debugsetparents(ui, repo, rev1, rev2=None):
3128 """manually set the parents of the current working directory
3135 """manually set the parents of the current working directory
3129
3136
3130 This is useful for writing repository conversion tools, but should
3137 This is useful for writing repository conversion tools, but should
3131 be used with care. For example, neither the working directory nor the
3138 be used with care. For example, neither the working directory nor the
3132 dirstate is updated, so file status may be incorrect after running this
3139 dirstate is updated, so file status may be incorrect after running this
3133 command.
3140 command.
3134
3141
3135 Returns 0 on success.
3142 Returns 0 on success.
3136 """
3143 """
3137
3144
3138 r1 = scmutil.revsingle(repo, rev1).node()
3145 r1 = scmutil.revsingle(repo, rev1).node()
3139 r2 = scmutil.revsingle(repo, rev2, 'null').node()
3146 r2 = scmutil.revsingle(repo, rev2, 'null').node()
3140
3147
3141 wlock = repo.wlock()
3148 wlock = repo.wlock()
3142 try:
3149 try:
3143 repo.dirstate.beginparentchange()
3150 repo.dirstate.beginparentchange()
3144 repo.setparents(r1, r2)
3151 repo.setparents(r1, r2)
3145 repo.dirstate.endparentchange()
3152 repo.dirstate.endparentchange()
3146 finally:
3153 finally:
3147 wlock.release()
3154 wlock.release()
3148
3155
3149 @command('debugdirstate|debugstate',
3156 @command('debugdirstate|debugstate',
3150 [('', 'nodates', None, _('do not display the saved mtime')),
3157 [('', 'nodates', None, _('do not display the saved mtime')),
3151 ('', 'datesort', None, _('sort by saved mtime'))],
3158 ('', 'datesort', None, _('sort by saved mtime'))],
3152 _('[OPTION]...'))
3159 _('[OPTION]...'))
3153 def debugstate(ui, repo, nodates=None, datesort=None):
3160 def debugstate(ui, repo, nodates=None, datesort=None):
3154 """show the contents of the current dirstate"""
3161 """show the contents of the current dirstate"""
3155 timestr = ""
3162 timestr = ""
3156 if datesort:
3163 if datesort:
3157 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
3164 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
3158 else:
3165 else:
3159 keyfunc = None # sort by filename
3166 keyfunc = None # sort by filename
3160 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
3167 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
3161 if ent[3] == -1:
3168 if ent[3] == -1:
3162 timestr = 'unset '
3169 timestr = 'unset '
3163 elif nodates:
3170 elif nodates:
3164 timestr = 'set '
3171 timestr = 'set '
3165 else:
3172 else:
3166 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
3173 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
3167 time.localtime(ent[3]))
3174 time.localtime(ent[3]))
3168 if ent[1] & 0o20000:
3175 if ent[1] & 0o20000:
3169 mode = 'lnk'
3176 mode = 'lnk'
3170 else:
3177 else:
3171 mode = '%3o' % (ent[1] & 0o777 & ~util.umask)
3178 mode = '%3o' % (ent[1] & 0o777 & ~util.umask)
3172 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
3179 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
3173 for f in repo.dirstate.copies():
3180 for f in repo.dirstate.copies():
3174 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
3181 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
3175
3182
3176 @command('debugsub',
3183 @command('debugsub',
3177 [('r', 'rev', '',
3184 [('r', 'rev', '',
3178 _('revision to check'), _('REV'))],
3185 _('revision to check'), _('REV'))],
3179 _('[-r REV] [REV]'))
3186 _('[-r REV] [REV]'))
3180 def debugsub(ui, repo, rev=None):
3187 def debugsub(ui, repo, rev=None):
3181 ctx = scmutil.revsingle(repo, rev, None)
3188 ctx = scmutil.revsingle(repo, rev, None)
3182 for k, v in sorted(ctx.substate.items()):
3189 for k, v in sorted(ctx.substate.items()):
3183 ui.write(('path %s\n') % k)
3190 ui.write(('path %s\n') % k)
3184 ui.write((' source %s\n') % v[0])
3191 ui.write((' source %s\n') % v[0])
3185 ui.write((' revision %s\n') % v[1])
3192 ui.write((' revision %s\n') % v[1])
3186
3193
3187 @command('debugsuccessorssets',
3194 @command('debugsuccessorssets',
3188 [],
3195 [],
3189 _('[REV]'))
3196 _('[REV]'))
3190 def debugsuccessorssets(ui, repo, *revs):
3197 def debugsuccessorssets(ui, repo, *revs):
3191 """show set of successors for revision
3198 """show set of successors for revision
3192
3199
3193 A successors set of changeset A is a consistent group of revisions that
3200 A successors set of changeset A is a consistent group of revisions that
3194 succeed A. It contains non-obsolete changesets only.
3201 succeed A. It contains non-obsolete changesets only.
3195
3202
3196 In most cases a changeset A has a single successors set containing a single
3203 In most cases a changeset A has a single successors set containing a single
3197 successor (changeset A replaced by A').
3204 successor (changeset A replaced by A').
3198
3205
3199 A changeset that is made obsolete with no successors are called "pruned".
3206 A changeset that is made obsolete with no successors are called "pruned".
3200 Such changesets have no successors sets at all.
3207 Such changesets have no successors sets at all.
3201
3208
3202 A changeset that has been "split" will have a successors set containing
3209 A changeset that has been "split" will have a successors set containing
3203 more than one successor.
3210 more than one successor.
3204
3211
3205 A changeset that has been rewritten in multiple different ways is called
3212 A changeset that has been rewritten in multiple different ways is called
3206 "divergent". Such changesets have multiple successor sets (each of which
3213 "divergent". Such changesets have multiple successor sets (each of which
3207 may also be split, i.e. have multiple successors).
3214 may also be split, i.e. have multiple successors).
3208
3215
3209 Results are displayed as follows::
3216 Results are displayed as follows::
3210
3217
3211 <rev1>
3218 <rev1>
3212 <successors-1A>
3219 <successors-1A>
3213 <rev2>
3220 <rev2>
3214 <successors-2A>
3221 <successors-2A>
3215 <successors-2B1> <successors-2B2> <successors-2B3>
3222 <successors-2B1> <successors-2B2> <successors-2B3>
3216
3223
3217 Here rev2 has two possible (i.e. divergent) successors sets. The first
3224 Here rev2 has two possible (i.e. divergent) successors sets. The first
3218 holds one element, whereas the second holds three (i.e. the changeset has
3225 holds one element, whereas the second holds three (i.e. the changeset has
3219 been split).
3226 been split).
3220 """
3227 """
3221 # passed to successorssets caching computation from one call to another
3228 # passed to successorssets caching computation from one call to another
3222 cache = {}
3229 cache = {}
3223 ctx2str = str
3230 ctx2str = str
3224 node2str = short
3231 node2str = short
3225 if ui.debug():
3232 if ui.debug():
3226 def ctx2str(ctx):
3233 def ctx2str(ctx):
3227 return ctx.hex()
3234 return ctx.hex()
3228 node2str = hex
3235 node2str = hex
3229 for rev in scmutil.revrange(repo, revs):
3236 for rev in scmutil.revrange(repo, revs):
3230 ctx = repo[rev]
3237 ctx = repo[rev]
3231 ui.write('%s\n'% ctx2str(ctx))
3238 ui.write('%s\n'% ctx2str(ctx))
3232 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
3239 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
3233 if succsset:
3240 if succsset:
3234 ui.write(' ')
3241 ui.write(' ')
3235 ui.write(node2str(succsset[0]))
3242 ui.write(node2str(succsset[0]))
3236 for node in succsset[1:]:
3243 for node in succsset[1:]:
3237 ui.write(' ')
3244 ui.write(' ')
3238 ui.write(node2str(node))
3245 ui.write(node2str(node))
3239 ui.write('\n')
3246 ui.write('\n')
3240
3247
3241 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
3248 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
3242 def debugwalk(ui, repo, *pats, **opts):
3249 def debugwalk(ui, repo, *pats, **opts):
3243 """show how files match on given patterns"""
3250 """show how files match on given patterns"""
3244 m = scmutil.match(repo[None], pats, opts)
3251 m = scmutil.match(repo[None], pats, opts)
3245 items = list(repo.walk(m))
3252 items = list(repo.walk(m))
3246 if not items:
3253 if not items:
3247 return
3254 return
3248 f = lambda fn: fn
3255 f = lambda fn: fn
3249 if ui.configbool('ui', 'slash') and os.sep != '/':
3256 if ui.configbool('ui', 'slash') and os.sep != '/':
3250 f = lambda fn: util.normpath(fn)
3257 f = lambda fn: util.normpath(fn)
3251 fmt = 'f %%-%ds %%-%ds %%s' % (
3258 fmt = 'f %%-%ds %%-%ds %%s' % (
3252 max([len(abs) for abs in items]),
3259 max([len(abs) for abs in items]),
3253 max([len(m.rel(abs)) for abs in items]))
3260 max([len(m.rel(abs)) for abs in items]))
3254 for abs in items:
3261 for abs in items:
3255 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
3262 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
3256 ui.write("%s\n" % line.rstrip())
3263 ui.write("%s\n" % line.rstrip())
3257
3264
3258 @command('debugwireargs',
3265 @command('debugwireargs',
3259 [('', 'three', '', 'three'),
3266 [('', 'three', '', 'three'),
3260 ('', 'four', '', 'four'),
3267 ('', 'four', '', 'four'),
3261 ('', 'five', '', 'five'),
3268 ('', 'five', '', 'five'),
3262 ] + remoteopts,
3269 ] + remoteopts,
3263 _('REPO [OPTIONS]... [ONE [TWO]]'),
3270 _('REPO [OPTIONS]... [ONE [TWO]]'),
3264 norepo=True)
3271 norepo=True)
3265 def debugwireargs(ui, repopath, *vals, **opts):
3272 def debugwireargs(ui, repopath, *vals, **opts):
3266 repo = hg.peer(ui, opts, repopath)
3273 repo = hg.peer(ui, opts, repopath)
3267 for opt in remoteopts:
3274 for opt in remoteopts:
3268 del opts[opt[1]]
3275 del opts[opt[1]]
3269 args = {}
3276 args = {}
3270 for k, v in opts.iteritems():
3277 for k, v in opts.iteritems():
3271 if v:
3278 if v:
3272 args[k] = v
3279 args[k] = v
3273 # run twice to check that we don't mess up the stream for the next command
3280 # run twice to check that we don't mess up the stream for the next command
3274 res1 = repo.debugwireargs(*vals, **args)
3281 res1 = repo.debugwireargs(*vals, **args)
3275 res2 = repo.debugwireargs(*vals, **args)
3282 res2 = repo.debugwireargs(*vals, **args)
3276 ui.write("%s\n" % res1)
3283 ui.write("%s\n" % res1)
3277 if res1 != res2:
3284 if res1 != res2:
3278 ui.warn("%s\n" % res2)
3285 ui.warn("%s\n" % res2)
3279
3286
3280 @command('^diff',
3287 @command('^diff',
3281 [('r', 'rev', [], _('revision'), _('REV')),
3288 [('r', 'rev', [], _('revision'), _('REV')),
3282 ('c', 'change', '', _('change made by revision'), _('REV'))
3289 ('c', 'change', '', _('change made by revision'), _('REV'))
3283 ] + diffopts + diffopts2 + walkopts + subrepoopts,
3290 ] + diffopts + diffopts2 + walkopts + subrepoopts,
3284 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
3291 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
3285 inferrepo=True)
3292 inferrepo=True)
3286 def diff(ui, repo, *pats, **opts):
3293 def diff(ui, repo, *pats, **opts):
3287 """diff repository (or selected files)
3294 """diff repository (or selected files)
3288
3295
3289 Show differences between revisions for the specified files.
3296 Show differences between revisions for the specified files.
3290
3297
3291 Differences between files are shown using the unified diff format.
3298 Differences between files are shown using the unified diff format.
3292
3299
3293 .. note::
3300 .. note::
3294
3301
3295 diff may generate unexpected results for merges, as it will
3302 diff may generate unexpected results for merges, as it will
3296 default to comparing against the working directory's first
3303 default to comparing against the working directory's first
3297 parent changeset if no revisions are specified.
3304 parent changeset if no revisions are specified.
3298
3305
3299 When two revision arguments are given, then changes are shown
3306 When two revision arguments are given, then changes are shown
3300 between those revisions. If only one revision is specified then
3307 between those revisions. If only one revision is specified then
3301 that revision is compared to the working directory, and, when no
3308 that revision is compared to the working directory, and, when no
3302 revisions are specified, the working directory files are compared
3309 revisions are specified, the working directory files are compared
3303 to its parent.
3310 to its parent.
3304
3311
3305 Alternatively you can specify -c/--change with a revision to see
3312 Alternatively you can specify -c/--change with a revision to see
3306 the changes in that changeset relative to its first parent.
3313 the changes in that changeset relative to its first parent.
3307
3314
3308 Without the -a/--text option, diff will avoid generating diffs of
3315 Without the -a/--text option, diff will avoid generating diffs of
3309 files it detects as binary. With -a, diff will generate a diff
3316 files it detects as binary. With -a, diff will generate a diff
3310 anyway, probably with undesirable results.
3317 anyway, probably with undesirable results.
3311
3318
3312 Use the -g/--git option to generate diffs in the git extended diff
3319 Use the -g/--git option to generate diffs in the git extended diff
3313 format. For more information, read :hg:`help diffs`.
3320 format. For more information, read :hg:`help diffs`.
3314
3321
3315 .. container:: verbose
3322 .. container:: verbose
3316
3323
3317 Examples:
3324 Examples:
3318
3325
3319 - compare a file in the current working directory to its parent::
3326 - compare a file in the current working directory to its parent::
3320
3327
3321 hg diff foo.c
3328 hg diff foo.c
3322
3329
3323 - compare two historical versions of a directory, with rename info::
3330 - compare two historical versions of a directory, with rename info::
3324
3331
3325 hg diff --git -r 1.0:1.2 lib/
3332 hg diff --git -r 1.0:1.2 lib/
3326
3333
3327 - get change stats relative to the last change on some date::
3334 - get change stats relative to the last change on some date::
3328
3335
3329 hg diff --stat -r "date('may 2')"
3336 hg diff --stat -r "date('may 2')"
3330
3337
3331 - diff all newly-added files that contain a keyword::
3338 - diff all newly-added files that contain a keyword::
3332
3339
3333 hg diff "set:added() and grep(GNU)"
3340 hg diff "set:added() and grep(GNU)"
3334
3341
3335 - compare a revision and its parents::
3342 - compare a revision and its parents::
3336
3343
3337 hg diff -c 9353 # compare against first parent
3344 hg diff -c 9353 # compare against first parent
3338 hg diff -r 9353^:9353 # same using revset syntax
3345 hg diff -r 9353^:9353 # same using revset syntax
3339 hg diff -r 9353^2:9353 # compare against the second parent
3346 hg diff -r 9353^2:9353 # compare against the second parent
3340
3347
3341 Returns 0 on success.
3348 Returns 0 on success.
3342 """
3349 """
3343
3350
3344 revs = opts.get('rev')
3351 revs = opts.get('rev')
3345 change = opts.get('change')
3352 change = opts.get('change')
3346 stat = opts.get('stat')
3353 stat = opts.get('stat')
3347 reverse = opts.get('reverse')
3354 reverse = opts.get('reverse')
3348
3355
3349 if revs and change:
3356 if revs and change:
3350 msg = _('cannot specify --rev and --change at the same time')
3357 msg = _('cannot specify --rev and --change at the same time')
3351 raise error.Abort(msg)
3358 raise error.Abort(msg)
3352 elif change:
3359 elif change:
3353 node2 = scmutil.revsingle(repo, change, None).node()
3360 node2 = scmutil.revsingle(repo, change, None).node()
3354 node1 = repo[node2].p1().node()
3361 node1 = repo[node2].p1().node()
3355 else:
3362 else:
3356 node1, node2 = scmutil.revpair(repo, revs)
3363 node1, node2 = scmutil.revpair(repo, revs)
3357
3364
3358 if reverse:
3365 if reverse:
3359 node1, node2 = node2, node1
3366 node1, node2 = node2, node1
3360
3367
3361 diffopts = patch.diffallopts(ui, opts)
3368 diffopts = patch.diffallopts(ui, opts)
3362 m = scmutil.match(repo[node2], pats, opts)
3369 m = scmutil.match(repo[node2], pats, opts)
3363 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
3370 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
3364 listsubrepos=opts.get('subrepos'),
3371 listsubrepos=opts.get('subrepos'),
3365 root=opts.get('root'))
3372 root=opts.get('root'))
3366
3373
3367 @command('^export',
3374 @command('^export',
3368 [('o', 'output', '',
3375 [('o', 'output', '',
3369 _('print output to file with formatted name'), _('FORMAT')),
3376 _('print output to file with formatted name'), _('FORMAT')),
3370 ('', 'switch-parent', None, _('diff against the second parent')),
3377 ('', 'switch-parent', None, _('diff against the second parent')),
3371 ('r', 'rev', [], _('revisions to export'), _('REV')),
3378 ('r', 'rev', [], _('revisions to export'), _('REV')),
3372 ] + diffopts,
3379 ] + diffopts,
3373 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
3380 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
3374 def export(ui, repo, *changesets, **opts):
3381 def export(ui, repo, *changesets, **opts):
3375 """dump the header and diffs for one or more changesets
3382 """dump the header and diffs for one or more changesets
3376
3383
3377 Print the changeset header and diffs for one or more revisions.
3384 Print the changeset header and diffs for one or more revisions.
3378 If no revision is given, the parent of the working directory is used.
3385 If no revision is given, the parent of the working directory is used.
3379
3386
3380 The information shown in the changeset header is: author, date,
3387 The information shown in the changeset header is: author, date,
3381 branch name (if non-default), changeset hash, parent(s) and commit
3388 branch name (if non-default), changeset hash, parent(s) and commit
3382 comment.
3389 comment.
3383
3390
3384 .. note::
3391 .. note::
3385
3392
3386 export may generate unexpected diff output for merge
3393 export may generate unexpected diff output for merge
3387 changesets, as it will compare the merge changeset against its
3394 changesets, as it will compare the merge changeset against its
3388 first parent only.
3395 first parent only.
3389
3396
3390 Output may be to a file, in which case the name of the file is
3397 Output may be to a file, in which case the name of the file is
3391 given using a format string. The formatting rules are as follows:
3398 given using a format string. The formatting rules are as follows:
3392
3399
3393 :``%%``: literal "%" character
3400 :``%%``: literal "%" character
3394 :``%H``: changeset hash (40 hexadecimal digits)
3401 :``%H``: changeset hash (40 hexadecimal digits)
3395 :``%N``: number of patches being generated
3402 :``%N``: number of patches being generated
3396 :``%R``: changeset revision number
3403 :``%R``: changeset revision number
3397 :``%b``: basename of the exporting repository
3404 :``%b``: basename of the exporting repository
3398 :``%h``: short-form changeset hash (12 hexadecimal digits)
3405 :``%h``: short-form changeset hash (12 hexadecimal digits)
3399 :``%m``: first line of the commit message (only alphanumeric characters)
3406 :``%m``: first line of the commit message (only alphanumeric characters)
3400 :``%n``: zero-padded sequence number, starting at 1
3407 :``%n``: zero-padded sequence number, starting at 1
3401 :``%r``: zero-padded changeset revision number
3408 :``%r``: zero-padded changeset revision number
3402
3409
3403 Without the -a/--text option, export will avoid generating diffs
3410 Without the -a/--text option, export will avoid generating diffs
3404 of files it detects as binary. With -a, export will generate a
3411 of files it detects as binary. With -a, export will generate a
3405 diff anyway, probably with undesirable results.
3412 diff anyway, probably with undesirable results.
3406
3413
3407 Use the -g/--git option to generate diffs in the git extended diff
3414 Use the -g/--git option to generate diffs in the git extended diff
3408 format. See :hg:`help diffs` for more information.
3415 format. See :hg:`help diffs` for more information.
3409
3416
3410 With the --switch-parent option, the diff will be against the
3417 With the --switch-parent option, the diff will be against the
3411 second parent. It can be useful to review a merge.
3418 second parent. It can be useful to review a merge.
3412
3419
3413 .. container:: verbose
3420 .. container:: verbose
3414
3421
3415 Examples:
3422 Examples:
3416
3423
3417 - use export and import to transplant a bugfix to the current
3424 - use export and import to transplant a bugfix to the current
3418 branch::
3425 branch::
3419
3426
3420 hg export -r 9353 | hg import -
3427 hg export -r 9353 | hg import -
3421
3428
3422 - export all the changesets between two revisions to a file with
3429 - export all the changesets between two revisions to a file with
3423 rename information::
3430 rename information::
3424
3431
3425 hg export --git -r 123:150 > changes.txt
3432 hg export --git -r 123:150 > changes.txt
3426
3433
3427 - split outgoing changes into a series of patches with
3434 - split outgoing changes into a series of patches with
3428 descriptive names::
3435 descriptive names::
3429
3436
3430 hg export -r "outgoing()" -o "%n-%m.patch"
3437 hg export -r "outgoing()" -o "%n-%m.patch"
3431
3438
3432 Returns 0 on success.
3439 Returns 0 on success.
3433 """
3440 """
3434 changesets += tuple(opts.get('rev', []))
3441 changesets += tuple(opts.get('rev', []))
3435 if not changesets:
3442 if not changesets:
3436 changesets = ['.']
3443 changesets = ['.']
3437 revs = scmutil.revrange(repo, changesets)
3444 revs = scmutil.revrange(repo, changesets)
3438 if not revs:
3445 if not revs:
3439 raise error.Abort(_("export requires at least one changeset"))
3446 raise error.Abort(_("export requires at least one changeset"))
3440 if len(revs) > 1:
3447 if len(revs) > 1:
3441 ui.note(_('exporting patches:\n'))
3448 ui.note(_('exporting patches:\n'))
3442 else:
3449 else:
3443 ui.note(_('exporting patch:\n'))
3450 ui.note(_('exporting patch:\n'))
3444 cmdutil.export(repo, revs, template=opts.get('output'),
3451 cmdutil.export(repo, revs, template=opts.get('output'),
3445 switch_parent=opts.get('switch_parent'),
3452 switch_parent=opts.get('switch_parent'),
3446 opts=patch.diffallopts(ui, opts))
3453 opts=patch.diffallopts(ui, opts))
3447
3454
3448 @command('files',
3455 @command('files',
3449 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
3456 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
3450 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
3457 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
3451 ] + walkopts + formatteropts + subrepoopts,
3458 ] + walkopts + formatteropts + subrepoopts,
3452 _('[OPTION]... [PATTERN]...'))
3459 _('[OPTION]... [PATTERN]...'))
3453 def files(ui, repo, *pats, **opts):
3460 def files(ui, repo, *pats, **opts):
3454 """list tracked files
3461 """list tracked files
3455
3462
3456 Print files under Mercurial control in the working directory or
3463 Print files under Mercurial control in the working directory or
3457 specified revision whose names match the given patterns (excluding
3464 specified revision whose names match the given patterns (excluding
3458 removed files).
3465 removed files).
3459
3466
3460 If no patterns are given to match, this command prints the names
3467 If no patterns are given to match, this command prints the names
3461 of all files under Mercurial control in the working directory.
3468 of all files under Mercurial control in the working directory.
3462
3469
3463 .. container:: verbose
3470 .. container:: verbose
3464
3471
3465 Examples:
3472 Examples:
3466
3473
3467 - list all files under the current directory::
3474 - list all files under the current directory::
3468
3475
3469 hg files .
3476 hg files .
3470
3477
3471 - shows sizes and flags for current revision::
3478 - shows sizes and flags for current revision::
3472
3479
3473 hg files -vr .
3480 hg files -vr .
3474
3481
3475 - list all files named README::
3482 - list all files named README::
3476
3483
3477 hg files -I "**/README"
3484 hg files -I "**/README"
3478
3485
3479 - list all binary files::
3486 - list all binary files::
3480
3487
3481 hg files "set:binary()"
3488 hg files "set:binary()"
3482
3489
3483 - find files containing a regular expression::
3490 - find files containing a regular expression::
3484
3491
3485 hg files "set:grep('bob')"
3492 hg files "set:grep('bob')"
3486
3493
3487 - search tracked file contents with xargs and grep::
3494 - search tracked file contents with xargs and grep::
3488
3495
3489 hg files -0 | xargs -0 grep foo
3496 hg files -0 | xargs -0 grep foo
3490
3497
3491 See :hg:`help patterns` and :hg:`help filesets` for more information
3498 See :hg:`help patterns` and :hg:`help filesets` for more information
3492 on specifying file patterns.
3499 on specifying file patterns.
3493
3500
3494 Returns 0 if a match is found, 1 otherwise.
3501 Returns 0 if a match is found, 1 otherwise.
3495
3502
3496 """
3503 """
3497 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
3504 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
3498
3505
3499 end = '\n'
3506 end = '\n'
3500 if opts.get('print0'):
3507 if opts.get('print0'):
3501 end = '\0'
3508 end = '\0'
3502 fm = ui.formatter('files', opts)
3509 fm = ui.formatter('files', opts)
3503 fmt = '%s' + end
3510 fmt = '%s' + end
3504
3511
3505 m = scmutil.match(ctx, pats, opts)
3512 m = scmutil.match(ctx, pats, opts)
3506 ret = cmdutil.files(ui, ctx, m, fm, fmt, opts.get('subrepos'))
3513 ret = cmdutil.files(ui, ctx, m, fm, fmt, opts.get('subrepos'))
3507
3514
3508 fm.end()
3515 fm.end()
3509
3516
3510 return ret
3517 return ret
3511
3518
3512 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3519 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3513 def forget(ui, repo, *pats, **opts):
3520 def forget(ui, repo, *pats, **opts):
3514 """forget the specified files on the next commit
3521 """forget the specified files on the next commit
3515
3522
3516 Mark the specified files so they will no longer be tracked
3523 Mark the specified files so they will no longer be tracked
3517 after the next commit.
3524 after the next commit.
3518
3525
3519 This only removes files from the current branch, not from the
3526 This only removes files from the current branch, not from the
3520 entire project history, and it does not delete them from the
3527 entire project history, and it does not delete them from the
3521 working directory.
3528 working directory.
3522
3529
3523 To delete the file from the working directory, see :hg:`remove`.
3530 To delete the file from the working directory, see :hg:`remove`.
3524
3531
3525 To undo a forget before the next commit, see :hg:`add`.
3532 To undo a forget before the next commit, see :hg:`add`.
3526
3533
3527 .. container:: verbose
3534 .. container:: verbose
3528
3535
3529 Examples:
3536 Examples:
3530
3537
3531 - forget newly-added binary files::
3538 - forget newly-added binary files::
3532
3539
3533 hg forget "set:added() and binary()"
3540 hg forget "set:added() and binary()"
3534
3541
3535 - forget files that would be excluded by .hgignore::
3542 - forget files that would be excluded by .hgignore::
3536
3543
3537 hg forget "set:hgignore()"
3544 hg forget "set:hgignore()"
3538
3545
3539 Returns 0 on success.
3546 Returns 0 on success.
3540 """
3547 """
3541
3548
3542 if not pats:
3549 if not pats:
3543 raise error.Abort(_('no files specified'))
3550 raise error.Abort(_('no files specified'))
3544
3551
3545 m = scmutil.match(repo[None], pats, opts)
3552 m = scmutil.match(repo[None], pats, opts)
3546 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3553 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3547 return rejected and 1 or 0
3554 return rejected and 1 or 0
3548
3555
3549 @command(
3556 @command(
3550 'graft',
3557 'graft',
3551 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3558 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3552 ('c', 'continue', False, _('resume interrupted graft')),
3559 ('c', 'continue', False, _('resume interrupted graft')),
3553 ('e', 'edit', False, _('invoke editor on commit messages')),
3560 ('e', 'edit', False, _('invoke editor on commit messages')),
3554 ('', 'log', None, _('append graft info to log message')),
3561 ('', 'log', None, _('append graft info to log message')),
3555 ('f', 'force', False, _('force graft')),
3562 ('f', 'force', False, _('force graft')),
3556 ('D', 'currentdate', False,
3563 ('D', 'currentdate', False,
3557 _('record the current date as commit date')),
3564 _('record the current date as commit date')),
3558 ('U', 'currentuser', False,
3565 ('U', 'currentuser', False,
3559 _('record the current user as committer'), _('DATE'))]
3566 _('record the current user as committer'), _('DATE'))]
3560 + commitopts2 + mergetoolopts + dryrunopts,
3567 + commitopts2 + mergetoolopts + dryrunopts,
3561 _('[OPTION]... [-r] REV...'))
3568 _('[OPTION]... [-r] REV...'))
3562 def graft(ui, repo, *revs, **opts):
3569 def graft(ui, repo, *revs, **opts):
3563 '''copy changes from other branches onto the current branch
3570 '''copy changes from other branches onto the current branch
3564
3571
3565 This command uses Mercurial's merge logic to copy individual
3572 This command uses Mercurial's merge logic to copy individual
3566 changes from other branches without merging branches in the
3573 changes from other branches without merging branches in the
3567 history graph. This is sometimes known as 'backporting' or
3574 history graph. This is sometimes known as 'backporting' or
3568 'cherry-picking'. By default, graft will copy user, date, and
3575 'cherry-picking'. By default, graft will copy user, date, and
3569 description from the source changesets.
3576 description from the source changesets.
3570
3577
3571 Changesets that are ancestors of the current revision, that have
3578 Changesets that are ancestors of the current revision, that have
3572 already been grafted, or that are merges will be skipped.
3579 already been grafted, or that are merges will be skipped.
3573
3580
3574 If --log is specified, log messages will have a comment appended
3581 If --log is specified, log messages will have a comment appended
3575 of the form::
3582 of the form::
3576
3583
3577 (grafted from CHANGESETHASH)
3584 (grafted from CHANGESETHASH)
3578
3585
3579 If --force is specified, revisions will be grafted even if they
3586 If --force is specified, revisions will be grafted even if they
3580 are already ancestors of or have been grafted to the destination.
3587 are already ancestors of or have been grafted to the destination.
3581 This is useful when the revisions have since been backed out.
3588 This is useful when the revisions have since been backed out.
3582
3589
3583 If a graft merge results in conflicts, the graft process is
3590 If a graft merge results in conflicts, the graft process is
3584 interrupted so that the current merge can be manually resolved.
3591 interrupted so that the current merge can be manually resolved.
3585 Once all conflicts are addressed, the graft process can be
3592 Once all conflicts are addressed, the graft process can be
3586 continued with the -c/--continue option.
3593 continued with the -c/--continue option.
3587
3594
3588 .. note::
3595 .. note::
3589
3596
3590 The -c/--continue option does not reapply earlier options, except
3597 The -c/--continue option does not reapply earlier options, except
3591 for --force.
3598 for --force.
3592
3599
3593 .. container:: verbose
3600 .. container:: verbose
3594
3601
3595 Examples:
3602 Examples:
3596
3603
3597 - copy a single change to the stable branch and edit its description::
3604 - copy a single change to the stable branch and edit its description::
3598
3605
3599 hg update stable
3606 hg update stable
3600 hg graft --edit 9393
3607 hg graft --edit 9393
3601
3608
3602 - graft a range of changesets with one exception, updating dates::
3609 - graft a range of changesets with one exception, updating dates::
3603
3610
3604 hg graft -D "2085::2093 and not 2091"
3611 hg graft -D "2085::2093 and not 2091"
3605
3612
3606 - continue a graft after resolving conflicts::
3613 - continue a graft after resolving conflicts::
3607
3614
3608 hg graft -c
3615 hg graft -c
3609
3616
3610 - show the source of a grafted changeset::
3617 - show the source of a grafted changeset::
3611
3618
3612 hg log --debug -r .
3619 hg log --debug -r .
3613
3620
3614 See :hg:`help revisions` and :hg:`help revsets` for more about
3621 See :hg:`help revisions` and :hg:`help revsets` for more about
3615 specifying revisions.
3622 specifying revisions.
3616
3623
3617 Returns 0 on successful completion.
3624 Returns 0 on successful completion.
3618 '''
3625 '''
3619
3626
3620 revs = list(revs)
3627 revs = list(revs)
3621 revs.extend(opts['rev'])
3628 revs.extend(opts['rev'])
3622
3629
3623 if not opts.get('user') and opts.get('currentuser'):
3630 if not opts.get('user') and opts.get('currentuser'):
3624 opts['user'] = ui.username()
3631 opts['user'] = ui.username()
3625 if not opts.get('date') and opts.get('currentdate'):
3632 if not opts.get('date') and opts.get('currentdate'):
3626 opts['date'] = "%d %d" % util.makedate()
3633 opts['date'] = "%d %d" % util.makedate()
3627
3634
3628 editor = cmdutil.getcommiteditor(editform='graft', **opts)
3635 editor = cmdutil.getcommiteditor(editform='graft', **opts)
3629
3636
3630 cont = False
3637 cont = False
3631 if opts['continue']:
3638 if opts['continue']:
3632 cont = True
3639 cont = True
3633 if revs:
3640 if revs:
3634 raise error.Abort(_("can't specify --continue and revisions"))
3641 raise error.Abort(_("can't specify --continue and revisions"))
3635 # read in unfinished revisions
3642 # read in unfinished revisions
3636 try:
3643 try:
3637 nodes = repo.vfs.read('graftstate').splitlines()
3644 nodes = repo.vfs.read('graftstate').splitlines()
3638 revs = [repo[node].rev() for node in nodes]
3645 revs = [repo[node].rev() for node in nodes]
3639 except IOError as inst:
3646 except IOError as inst:
3640 if inst.errno != errno.ENOENT:
3647 if inst.errno != errno.ENOENT:
3641 raise
3648 raise
3642 raise error.Abort(_("no graft state found, can't continue"))
3649 raise error.Abort(_("no graft state found, can't continue"))
3643 else:
3650 else:
3644 cmdutil.checkunfinished(repo)
3651 cmdutil.checkunfinished(repo)
3645 cmdutil.bailifchanged(repo)
3652 cmdutil.bailifchanged(repo)
3646 if not revs:
3653 if not revs:
3647 raise error.Abort(_('no revisions specified'))
3654 raise error.Abort(_('no revisions specified'))
3648 revs = scmutil.revrange(repo, revs)
3655 revs = scmutil.revrange(repo, revs)
3649
3656
3650 skipped = set()
3657 skipped = set()
3651 # check for merges
3658 # check for merges
3652 for rev in repo.revs('%ld and merge()', revs):
3659 for rev in repo.revs('%ld and merge()', revs):
3653 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3660 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3654 skipped.add(rev)
3661 skipped.add(rev)
3655 revs = [r for r in revs if r not in skipped]
3662 revs = [r for r in revs if r not in skipped]
3656 if not revs:
3663 if not revs:
3657 return -1
3664 return -1
3658
3665
3659 # Don't check in the --continue case, in effect retaining --force across
3666 # Don't check in the --continue case, in effect retaining --force across
3660 # --continues. That's because without --force, any revisions we decided to
3667 # --continues. That's because without --force, any revisions we decided to
3661 # skip would have been filtered out here, so they wouldn't have made their
3668 # skip would have been filtered out here, so they wouldn't have made their
3662 # way to the graftstate. With --force, any revisions we would have otherwise
3669 # way to the graftstate. With --force, any revisions we would have otherwise
3663 # skipped would not have been filtered out, and if they hadn't been applied
3670 # skipped would not have been filtered out, and if they hadn't been applied
3664 # already, they'd have been in the graftstate.
3671 # already, they'd have been in the graftstate.
3665 if not (cont or opts.get('force')):
3672 if not (cont or opts.get('force')):
3666 # check for ancestors of dest branch
3673 # check for ancestors of dest branch
3667 crev = repo['.'].rev()
3674 crev = repo['.'].rev()
3668 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3675 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3669 # Cannot use x.remove(y) on smart set, this has to be a list.
3676 # Cannot use x.remove(y) on smart set, this has to be a list.
3670 # XXX make this lazy in the future
3677 # XXX make this lazy in the future
3671 revs = list(revs)
3678 revs = list(revs)
3672 # don't mutate while iterating, create a copy
3679 # don't mutate while iterating, create a copy
3673 for rev in list(revs):
3680 for rev in list(revs):
3674 if rev in ancestors:
3681 if rev in ancestors:
3675 ui.warn(_('skipping ancestor revision %d:%s\n') %
3682 ui.warn(_('skipping ancestor revision %d:%s\n') %
3676 (rev, repo[rev]))
3683 (rev, repo[rev]))
3677 # XXX remove on list is slow
3684 # XXX remove on list is slow
3678 revs.remove(rev)
3685 revs.remove(rev)
3679 if not revs:
3686 if not revs:
3680 return -1
3687 return -1
3681
3688
3682 # analyze revs for earlier grafts
3689 # analyze revs for earlier grafts
3683 ids = {}
3690 ids = {}
3684 for ctx in repo.set("%ld", revs):
3691 for ctx in repo.set("%ld", revs):
3685 ids[ctx.hex()] = ctx.rev()
3692 ids[ctx.hex()] = ctx.rev()
3686 n = ctx.extra().get('source')
3693 n = ctx.extra().get('source')
3687 if n:
3694 if n:
3688 ids[n] = ctx.rev()
3695 ids[n] = ctx.rev()
3689
3696
3690 # check ancestors for earlier grafts
3697 # check ancestors for earlier grafts
3691 ui.debug('scanning for duplicate grafts\n')
3698 ui.debug('scanning for duplicate grafts\n')
3692
3699
3693 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3700 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3694 ctx = repo[rev]
3701 ctx = repo[rev]
3695 n = ctx.extra().get('source')
3702 n = ctx.extra().get('source')
3696 if n in ids:
3703 if n in ids:
3697 try:
3704 try:
3698 r = repo[n].rev()
3705 r = repo[n].rev()
3699 except error.RepoLookupError:
3706 except error.RepoLookupError:
3700 r = None
3707 r = None
3701 if r in revs:
3708 if r in revs:
3702 ui.warn(_('skipping revision %d:%s '
3709 ui.warn(_('skipping revision %d:%s '
3703 '(already grafted to %d:%s)\n')
3710 '(already grafted to %d:%s)\n')
3704 % (r, repo[r], rev, ctx))
3711 % (r, repo[r], rev, ctx))
3705 revs.remove(r)
3712 revs.remove(r)
3706 elif ids[n] in revs:
3713 elif ids[n] in revs:
3707 if r is None:
3714 if r is None:
3708 ui.warn(_('skipping already grafted revision %d:%s '
3715 ui.warn(_('skipping already grafted revision %d:%s '
3709 '(%d:%s also has unknown origin %s)\n')
3716 '(%d:%s also has unknown origin %s)\n')
3710 % (ids[n], repo[ids[n]], rev, ctx, n[:12]))
3717 % (ids[n], repo[ids[n]], rev, ctx, n[:12]))
3711 else:
3718 else:
3712 ui.warn(_('skipping already grafted revision %d:%s '
3719 ui.warn(_('skipping already grafted revision %d:%s '
3713 '(%d:%s also has origin %d:%s)\n')
3720 '(%d:%s also has origin %d:%s)\n')
3714 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12]))
3721 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12]))
3715 revs.remove(ids[n])
3722 revs.remove(ids[n])
3716 elif ctx.hex() in ids:
3723 elif ctx.hex() in ids:
3717 r = ids[ctx.hex()]
3724 r = ids[ctx.hex()]
3718 ui.warn(_('skipping already grafted revision %d:%s '
3725 ui.warn(_('skipping already grafted revision %d:%s '
3719 '(was grafted from %d:%s)\n') %
3726 '(was grafted from %d:%s)\n') %
3720 (r, repo[r], rev, ctx))
3727 (r, repo[r], rev, ctx))
3721 revs.remove(r)
3728 revs.remove(r)
3722 if not revs:
3729 if not revs:
3723 return -1
3730 return -1
3724
3731
3725 wlock = repo.wlock()
3732 wlock = repo.wlock()
3726 try:
3733 try:
3727 for pos, ctx in enumerate(repo.set("%ld", revs)):
3734 for pos, ctx in enumerate(repo.set("%ld", revs)):
3728 desc = '%d:%s "%s"' % (ctx.rev(), ctx,
3735 desc = '%d:%s "%s"' % (ctx.rev(), ctx,
3729 ctx.description().split('\n', 1)[0])
3736 ctx.description().split('\n', 1)[0])
3730 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3737 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3731 if names:
3738 if names:
3732 desc += ' (%s)' % ' '.join(names)
3739 desc += ' (%s)' % ' '.join(names)
3733 ui.status(_('grafting %s\n') % desc)
3740 ui.status(_('grafting %s\n') % desc)
3734 if opts.get('dry_run'):
3741 if opts.get('dry_run'):
3735 continue
3742 continue
3736
3743
3737 source = ctx.extra().get('source')
3744 source = ctx.extra().get('source')
3738 extra = {}
3745 extra = {}
3739 if source:
3746 if source:
3740 extra['source'] = source
3747 extra['source'] = source
3741 extra['intermediate-source'] = ctx.hex()
3748 extra['intermediate-source'] = ctx.hex()
3742 else:
3749 else:
3743 extra['source'] = ctx.hex()
3750 extra['source'] = ctx.hex()
3744 user = ctx.user()
3751 user = ctx.user()
3745 if opts.get('user'):
3752 if opts.get('user'):
3746 user = opts['user']
3753 user = opts['user']
3747 date = ctx.date()
3754 date = ctx.date()
3748 if opts.get('date'):
3755 if opts.get('date'):
3749 date = opts['date']
3756 date = opts['date']
3750 message = ctx.description()
3757 message = ctx.description()
3751 if opts.get('log'):
3758 if opts.get('log'):
3752 message += '\n(grafted from %s)' % ctx.hex()
3759 message += '\n(grafted from %s)' % ctx.hex()
3753
3760
3754 # we don't merge the first commit when continuing
3761 # we don't merge the first commit when continuing
3755 if not cont:
3762 if not cont:
3756 # perform the graft merge with p1(rev) as 'ancestor'
3763 # perform the graft merge with p1(rev) as 'ancestor'
3757 try:
3764 try:
3758 # ui.forcemerge is an internal variable, do not document
3765 # ui.forcemerge is an internal variable, do not document
3759 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3766 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3760 'graft')
3767 'graft')
3761 stats = mergemod.graft(repo, ctx, ctx.p1(),
3768 stats = mergemod.graft(repo, ctx, ctx.p1(),
3762 ['local', 'graft'])
3769 ['local', 'graft'])
3763 finally:
3770 finally:
3764 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3771 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3765 # report any conflicts
3772 # report any conflicts
3766 if stats and stats[3] > 0:
3773 if stats and stats[3] > 0:
3767 # write out state for --continue
3774 # write out state for --continue
3768 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3775 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3769 repo.vfs.write('graftstate', ''.join(nodelines))
3776 repo.vfs.write('graftstate', ''.join(nodelines))
3770 raise error.Abort(
3777 raise error.Abort(
3771 _("unresolved conflicts, can't continue"),
3778 _("unresolved conflicts, can't continue"),
3772 hint=_('use hg resolve and hg graft --continue'))
3779 hint=_('use hg resolve and hg graft --continue'))
3773 else:
3780 else:
3774 cont = False
3781 cont = False
3775
3782
3776 # commit
3783 # commit
3777 node = repo.commit(text=message, user=user,
3784 node = repo.commit(text=message, user=user,
3778 date=date, extra=extra, editor=editor)
3785 date=date, extra=extra, editor=editor)
3779 if node is None:
3786 if node is None:
3780 ui.warn(
3787 ui.warn(
3781 _('note: graft of %d:%s created no changes to commit\n') %
3788 _('note: graft of %d:%s created no changes to commit\n') %
3782 (ctx.rev(), ctx))
3789 (ctx.rev(), ctx))
3783 finally:
3790 finally:
3784 wlock.release()
3791 wlock.release()
3785
3792
3786 # remove state when we complete successfully
3793 # remove state when we complete successfully
3787 if not opts.get('dry_run'):
3794 if not opts.get('dry_run'):
3788 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3795 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3789
3796
3790 return 0
3797 return 0
3791
3798
3792 @command('grep',
3799 @command('grep',
3793 [('0', 'print0', None, _('end fields with NUL')),
3800 [('0', 'print0', None, _('end fields with NUL')),
3794 ('', 'all', None, _('print all revisions that match')),
3801 ('', 'all', None, _('print all revisions that match')),
3795 ('a', 'text', None, _('treat all files as text')),
3802 ('a', 'text', None, _('treat all files as text')),
3796 ('f', 'follow', None,
3803 ('f', 'follow', None,
3797 _('follow changeset history,'
3804 _('follow changeset history,'
3798 ' or file history across copies and renames')),
3805 ' or file history across copies and renames')),
3799 ('i', 'ignore-case', None, _('ignore case when matching')),
3806 ('i', 'ignore-case', None, _('ignore case when matching')),
3800 ('l', 'files-with-matches', None,
3807 ('l', 'files-with-matches', None,
3801 _('print only filenames and revisions that match')),
3808 _('print only filenames and revisions that match')),
3802 ('n', 'line-number', None, _('print matching line numbers')),
3809 ('n', 'line-number', None, _('print matching line numbers')),
3803 ('r', 'rev', [],
3810 ('r', 'rev', [],
3804 _('only search files changed within revision range'), _('REV')),
3811 _('only search files changed within revision range'), _('REV')),
3805 ('u', 'user', None, _('list the author (long with -v)')),
3812 ('u', 'user', None, _('list the author (long with -v)')),
3806 ('d', 'date', None, _('list the date (short with -q)')),
3813 ('d', 'date', None, _('list the date (short with -q)')),
3807 ] + walkopts,
3814 ] + walkopts,
3808 _('[OPTION]... PATTERN [FILE]...'),
3815 _('[OPTION]... PATTERN [FILE]...'),
3809 inferrepo=True)
3816 inferrepo=True)
3810 def grep(ui, repo, pattern, *pats, **opts):
3817 def grep(ui, repo, pattern, *pats, **opts):
3811 """search for a pattern in specified files and revisions
3818 """search for a pattern in specified files and revisions
3812
3819
3813 Search revisions of files for a regular expression.
3820 Search revisions of files for a regular expression.
3814
3821
3815 This command behaves differently than Unix grep. It only accepts
3822 This command behaves differently than Unix grep. It only accepts
3816 Python/Perl regexps. It searches repository history, not the
3823 Python/Perl regexps. It searches repository history, not the
3817 working directory. It always prints the revision number in which a
3824 working directory. It always prints the revision number in which a
3818 match appears.
3825 match appears.
3819
3826
3820 By default, grep only prints output for the first revision of a
3827 By default, grep only prints output for the first revision of a
3821 file in which it finds a match. To get it to print every revision
3828 file in which it finds a match. To get it to print every revision
3822 that contains a change in match status ("-" for a match that
3829 that contains a change in match status ("-" for a match that
3823 becomes a non-match, or "+" for a non-match that becomes a match),
3830 becomes a non-match, or "+" for a non-match that becomes a match),
3824 use the --all flag.
3831 use the --all flag.
3825
3832
3826 Returns 0 if a match is found, 1 otherwise.
3833 Returns 0 if a match is found, 1 otherwise.
3827 """
3834 """
3828 reflags = re.M
3835 reflags = re.M
3829 if opts.get('ignore_case'):
3836 if opts.get('ignore_case'):
3830 reflags |= re.I
3837 reflags |= re.I
3831 try:
3838 try:
3832 regexp = util.re.compile(pattern, reflags)
3839 regexp = util.re.compile(pattern, reflags)
3833 except re.error as inst:
3840 except re.error as inst:
3834 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3841 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3835 return 1
3842 return 1
3836 sep, eol = ':', '\n'
3843 sep, eol = ':', '\n'
3837 if opts.get('print0'):
3844 if opts.get('print0'):
3838 sep = eol = '\0'
3845 sep = eol = '\0'
3839
3846
3840 getfile = util.lrucachefunc(repo.file)
3847 getfile = util.lrucachefunc(repo.file)
3841
3848
3842 def matchlines(body):
3849 def matchlines(body):
3843 begin = 0
3850 begin = 0
3844 linenum = 0
3851 linenum = 0
3845 while begin < len(body):
3852 while begin < len(body):
3846 match = regexp.search(body, begin)
3853 match = regexp.search(body, begin)
3847 if not match:
3854 if not match:
3848 break
3855 break
3849 mstart, mend = match.span()
3856 mstart, mend = match.span()
3850 linenum += body.count('\n', begin, mstart) + 1
3857 linenum += body.count('\n', begin, mstart) + 1
3851 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3858 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3852 begin = body.find('\n', mend) + 1 or len(body) + 1
3859 begin = body.find('\n', mend) + 1 or len(body) + 1
3853 lend = begin - 1
3860 lend = begin - 1
3854 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3861 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3855
3862
3856 class linestate(object):
3863 class linestate(object):
3857 def __init__(self, line, linenum, colstart, colend):
3864 def __init__(self, line, linenum, colstart, colend):
3858 self.line = line
3865 self.line = line
3859 self.linenum = linenum
3866 self.linenum = linenum
3860 self.colstart = colstart
3867 self.colstart = colstart
3861 self.colend = colend
3868 self.colend = colend
3862
3869
3863 def __hash__(self):
3870 def __hash__(self):
3864 return hash((self.linenum, self.line))
3871 return hash((self.linenum, self.line))
3865
3872
3866 def __eq__(self, other):
3873 def __eq__(self, other):
3867 return self.line == other.line
3874 return self.line == other.line
3868
3875
3869 def __iter__(self):
3876 def __iter__(self):
3870 yield (self.line[:self.colstart], '')
3877 yield (self.line[:self.colstart], '')
3871 yield (self.line[self.colstart:self.colend], 'grep.match')
3878 yield (self.line[self.colstart:self.colend], 'grep.match')
3872 rest = self.line[self.colend:]
3879 rest = self.line[self.colend:]
3873 while rest != '':
3880 while rest != '':
3874 match = regexp.search(rest)
3881 match = regexp.search(rest)
3875 if not match:
3882 if not match:
3876 yield (rest, '')
3883 yield (rest, '')
3877 break
3884 break
3878 mstart, mend = match.span()
3885 mstart, mend = match.span()
3879 yield (rest[:mstart], '')
3886 yield (rest[:mstart], '')
3880 yield (rest[mstart:mend], 'grep.match')
3887 yield (rest[mstart:mend], 'grep.match')
3881 rest = rest[mend:]
3888 rest = rest[mend:]
3882
3889
3883 matches = {}
3890 matches = {}
3884 copies = {}
3891 copies = {}
3885 def grepbody(fn, rev, body):
3892 def grepbody(fn, rev, body):
3886 matches[rev].setdefault(fn, [])
3893 matches[rev].setdefault(fn, [])
3887 m = matches[rev][fn]
3894 m = matches[rev][fn]
3888 for lnum, cstart, cend, line in matchlines(body):
3895 for lnum, cstart, cend, line in matchlines(body):
3889 s = linestate(line, lnum, cstart, cend)
3896 s = linestate(line, lnum, cstart, cend)
3890 m.append(s)
3897 m.append(s)
3891
3898
3892 def difflinestates(a, b):
3899 def difflinestates(a, b):
3893 sm = difflib.SequenceMatcher(None, a, b)
3900 sm = difflib.SequenceMatcher(None, a, b)
3894 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3901 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3895 if tag == 'insert':
3902 if tag == 'insert':
3896 for i in xrange(blo, bhi):
3903 for i in xrange(blo, bhi):
3897 yield ('+', b[i])
3904 yield ('+', b[i])
3898 elif tag == 'delete':
3905 elif tag == 'delete':
3899 for i in xrange(alo, ahi):
3906 for i in xrange(alo, ahi):
3900 yield ('-', a[i])
3907 yield ('-', a[i])
3901 elif tag == 'replace':
3908 elif tag == 'replace':
3902 for i in xrange(alo, ahi):
3909 for i in xrange(alo, ahi):
3903 yield ('-', a[i])
3910 yield ('-', a[i])
3904 for i in xrange(blo, bhi):
3911 for i in xrange(blo, bhi):
3905 yield ('+', b[i])
3912 yield ('+', b[i])
3906
3913
3907 def display(fn, ctx, pstates, states):
3914 def display(fn, ctx, pstates, states):
3908 rev = ctx.rev()
3915 rev = ctx.rev()
3909 if ui.quiet:
3916 if ui.quiet:
3910 datefunc = util.shortdate
3917 datefunc = util.shortdate
3911 else:
3918 else:
3912 datefunc = util.datestr
3919 datefunc = util.datestr
3913 found = False
3920 found = False
3914 @util.cachefunc
3921 @util.cachefunc
3915 def binary():
3922 def binary():
3916 flog = getfile(fn)
3923 flog = getfile(fn)
3917 return util.binary(flog.read(ctx.filenode(fn)))
3924 return util.binary(flog.read(ctx.filenode(fn)))
3918
3925
3919 if opts.get('all'):
3926 if opts.get('all'):
3920 iter = difflinestates(pstates, states)
3927 iter = difflinestates(pstates, states)
3921 else:
3928 else:
3922 iter = [('', l) for l in states]
3929 iter = [('', l) for l in states]
3923 for change, l in iter:
3930 for change, l in iter:
3924 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3931 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3925
3932
3926 if opts.get('line_number'):
3933 if opts.get('line_number'):
3927 cols.append((str(l.linenum), 'grep.linenumber'))
3934 cols.append((str(l.linenum), 'grep.linenumber'))
3928 if opts.get('all'):
3935 if opts.get('all'):
3929 cols.append((change, 'grep.change'))
3936 cols.append((change, 'grep.change'))
3930 if opts.get('user'):
3937 if opts.get('user'):
3931 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3938 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3932 if opts.get('date'):
3939 if opts.get('date'):
3933 cols.append((datefunc(ctx.date()), 'grep.date'))
3940 cols.append((datefunc(ctx.date()), 'grep.date'))
3934 for col, label in cols[:-1]:
3941 for col, label in cols[:-1]:
3935 ui.write(col, label=label)
3942 ui.write(col, label=label)
3936 ui.write(sep, label='grep.sep')
3943 ui.write(sep, label='grep.sep')
3937 ui.write(cols[-1][0], label=cols[-1][1])
3944 ui.write(cols[-1][0], label=cols[-1][1])
3938 if not opts.get('files_with_matches'):
3945 if not opts.get('files_with_matches'):
3939 ui.write(sep, label='grep.sep')
3946 ui.write(sep, label='grep.sep')
3940 if not opts.get('text') and binary():
3947 if not opts.get('text') and binary():
3941 ui.write(" Binary file matches")
3948 ui.write(" Binary file matches")
3942 else:
3949 else:
3943 for s, label in l:
3950 for s, label in l:
3944 ui.write(s, label=label)
3951 ui.write(s, label=label)
3945 ui.write(eol)
3952 ui.write(eol)
3946 found = True
3953 found = True
3947 if opts.get('files_with_matches'):
3954 if opts.get('files_with_matches'):
3948 break
3955 break
3949 return found
3956 return found
3950
3957
3951 skip = {}
3958 skip = {}
3952 revfiles = {}
3959 revfiles = {}
3953 matchfn = scmutil.match(repo[None], pats, opts)
3960 matchfn = scmutil.match(repo[None], pats, opts)
3954 found = False
3961 found = False
3955 follow = opts.get('follow')
3962 follow = opts.get('follow')
3956
3963
3957 def prep(ctx, fns):
3964 def prep(ctx, fns):
3958 rev = ctx.rev()
3965 rev = ctx.rev()
3959 pctx = ctx.p1()
3966 pctx = ctx.p1()
3960 parent = pctx.rev()
3967 parent = pctx.rev()
3961 matches.setdefault(rev, {})
3968 matches.setdefault(rev, {})
3962 matches.setdefault(parent, {})
3969 matches.setdefault(parent, {})
3963 files = revfiles.setdefault(rev, [])
3970 files = revfiles.setdefault(rev, [])
3964 for fn in fns:
3971 for fn in fns:
3965 flog = getfile(fn)
3972 flog = getfile(fn)
3966 try:
3973 try:
3967 fnode = ctx.filenode(fn)
3974 fnode = ctx.filenode(fn)
3968 except error.LookupError:
3975 except error.LookupError:
3969 continue
3976 continue
3970
3977
3971 copied = flog.renamed(fnode)
3978 copied = flog.renamed(fnode)
3972 copy = follow and copied and copied[0]
3979 copy = follow and copied and copied[0]
3973 if copy:
3980 if copy:
3974 copies.setdefault(rev, {})[fn] = copy
3981 copies.setdefault(rev, {})[fn] = copy
3975 if fn in skip:
3982 if fn in skip:
3976 if copy:
3983 if copy:
3977 skip[copy] = True
3984 skip[copy] = True
3978 continue
3985 continue
3979 files.append(fn)
3986 files.append(fn)
3980
3987
3981 if fn not in matches[rev]:
3988 if fn not in matches[rev]:
3982 grepbody(fn, rev, flog.read(fnode))
3989 grepbody(fn, rev, flog.read(fnode))
3983
3990
3984 pfn = copy or fn
3991 pfn = copy or fn
3985 if pfn not in matches[parent]:
3992 if pfn not in matches[parent]:
3986 try:
3993 try:
3987 fnode = pctx.filenode(pfn)
3994 fnode = pctx.filenode(pfn)
3988 grepbody(pfn, parent, flog.read(fnode))
3995 grepbody(pfn, parent, flog.read(fnode))
3989 except error.LookupError:
3996 except error.LookupError:
3990 pass
3997 pass
3991
3998
3992 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3999 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3993 rev = ctx.rev()
4000 rev = ctx.rev()
3994 parent = ctx.p1().rev()
4001 parent = ctx.p1().rev()
3995 for fn in sorted(revfiles.get(rev, [])):
4002 for fn in sorted(revfiles.get(rev, [])):
3996 states = matches[rev][fn]
4003 states = matches[rev][fn]
3997 copy = copies.get(rev, {}).get(fn)
4004 copy = copies.get(rev, {}).get(fn)
3998 if fn in skip:
4005 if fn in skip:
3999 if copy:
4006 if copy:
4000 skip[copy] = True
4007 skip[copy] = True
4001 continue
4008 continue
4002 pstates = matches.get(parent, {}).get(copy or fn, [])
4009 pstates = matches.get(parent, {}).get(copy or fn, [])
4003 if pstates or states:
4010 if pstates or states:
4004 r = display(fn, ctx, pstates, states)
4011 r = display(fn, ctx, pstates, states)
4005 found = found or r
4012 found = found or r
4006 if r and not opts.get('all'):
4013 if r and not opts.get('all'):
4007 skip[fn] = True
4014 skip[fn] = True
4008 if copy:
4015 if copy:
4009 skip[copy] = True
4016 skip[copy] = True
4010 del matches[rev]
4017 del matches[rev]
4011 del revfiles[rev]
4018 del revfiles[rev]
4012
4019
4013 return not found
4020 return not found
4014
4021
4015 @command('heads',
4022 @command('heads',
4016 [('r', 'rev', '',
4023 [('r', 'rev', '',
4017 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
4024 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
4018 ('t', 'topo', False, _('show topological heads only')),
4025 ('t', 'topo', False, _('show topological heads only')),
4019 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
4026 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
4020 ('c', 'closed', False, _('show normal and closed branch heads')),
4027 ('c', 'closed', False, _('show normal and closed branch heads')),
4021 ] + templateopts,
4028 ] + templateopts,
4022 _('[-ct] [-r STARTREV] [REV]...'))
4029 _('[-ct] [-r STARTREV] [REV]...'))
4023 def heads(ui, repo, *branchrevs, **opts):
4030 def heads(ui, repo, *branchrevs, **opts):
4024 """show branch heads
4031 """show branch heads
4025
4032
4026 With no arguments, show all open branch heads in the repository.
4033 With no arguments, show all open branch heads in the repository.
4027 Branch heads are changesets that have no descendants on the
4034 Branch heads are changesets that have no descendants on the
4028 same branch. They are where development generally takes place and
4035 same branch. They are where development generally takes place and
4029 are the usual targets for update and merge operations.
4036 are the usual targets for update and merge operations.
4030
4037
4031 If one or more REVs are given, only open branch heads on the
4038 If one or more REVs are given, only open branch heads on the
4032 branches associated with the specified changesets are shown. This
4039 branches associated with the specified changesets are shown. This
4033 means that you can use :hg:`heads .` to see the heads on the
4040 means that you can use :hg:`heads .` to see the heads on the
4034 currently checked-out branch.
4041 currently checked-out branch.
4035
4042
4036 If -c/--closed is specified, also show branch heads marked closed
4043 If -c/--closed is specified, also show branch heads marked closed
4037 (see :hg:`commit --close-branch`).
4044 (see :hg:`commit --close-branch`).
4038
4045
4039 If STARTREV is specified, only those heads that are descendants of
4046 If STARTREV is specified, only those heads that are descendants of
4040 STARTREV will be displayed.
4047 STARTREV will be displayed.
4041
4048
4042 If -t/--topo is specified, named branch mechanics will be ignored and only
4049 If -t/--topo is specified, named branch mechanics will be ignored and only
4043 topological heads (changesets with no children) will be shown.
4050 topological heads (changesets with no children) will be shown.
4044
4051
4045 Returns 0 if matching heads are found, 1 if not.
4052 Returns 0 if matching heads are found, 1 if not.
4046 """
4053 """
4047
4054
4048 start = None
4055 start = None
4049 if 'rev' in opts:
4056 if 'rev' in opts:
4050 start = scmutil.revsingle(repo, opts['rev'], None).node()
4057 start = scmutil.revsingle(repo, opts['rev'], None).node()
4051
4058
4052 if opts.get('topo'):
4059 if opts.get('topo'):
4053 heads = [repo[h] for h in repo.heads(start)]
4060 heads = [repo[h] for h in repo.heads(start)]
4054 else:
4061 else:
4055 heads = []
4062 heads = []
4056 for branch in repo.branchmap():
4063 for branch in repo.branchmap():
4057 heads += repo.branchheads(branch, start, opts.get('closed'))
4064 heads += repo.branchheads(branch, start, opts.get('closed'))
4058 heads = [repo[h] for h in heads]
4065 heads = [repo[h] for h in heads]
4059
4066
4060 if branchrevs:
4067 if branchrevs:
4061 branches = set(repo[br].branch() for br in branchrevs)
4068 branches = set(repo[br].branch() for br in branchrevs)
4062 heads = [h for h in heads if h.branch() in branches]
4069 heads = [h for h in heads if h.branch() in branches]
4063
4070
4064 if opts.get('active') and branchrevs:
4071 if opts.get('active') and branchrevs:
4065 dagheads = repo.heads(start)
4072 dagheads = repo.heads(start)
4066 heads = [h for h in heads if h.node() in dagheads]
4073 heads = [h for h in heads if h.node() in dagheads]
4067
4074
4068 if branchrevs:
4075 if branchrevs:
4069 haveheads = set(h.branch() for h in heads)
4076 haveheads = set(h.branch() for h in heads)
4070 if branches - haveheads:
4077 if branches - haveheads:
4071 headless = ', '.join(b for b in branches - haveheads)
4078 headless = ', '.join(b for b in branches - haveheads)
4072 msg = _('no open branch heads found on branches %s')
4079 msg = _('no open branch heads found on branches %s')
4073 if opts.get('rev'):
4080 if opts.get('rev'):
4074 msg += _(' (started at %s)') % opts['rev']
4081 msg += _(' (started at %s)') % opts['rev']
4075 ui.warn((msg + '\n') % headless)
4082 ui.warn((msg + '\n') % headless)
4076
4083
4077 if not heads:
4084 if not heads:
4078 return 1
4085 return 1
4079
4086
4080 heads = sorted(heads, key=lambda x: -x.rev())
4087 heads = sorted(heads, key=lambda x: -x.rev())
4081 displayer = cmdutil.show_changeset(ui, repo, opts)
4088 displayer = cmdutil.show_changeset(ui, repo, opts)
4082 for ctx in heads:
4089 for ctx in heads:
4083 displayer.show(ctx)
4090 displayer.show(ctx)
4084 displayer.close()
4091 displayer.close()
4085
4092
4086 @command('help',
4093 @command('help',
4087 [('e', 'extension', None, _('show only help for extensions')),
4094 [('e', 'extension', None, _('show only help for extensions')),
4088 ('c', 'command', None, _('show only help for commands')),
4095 ('c', 'command', None, _('show only help for commands')),
4089 ('k', 'keyword', None, _('show topics matching keyword')),
4096 ('k', 'keyword', None, _('show topics matching keyword')),
4090 ],
4097 ],
4091 _('[-eck] [TOPIC]'),
4098 _('[-eck] [TOPIC]'),
4092 norepo=True)
4099 norepo=True)
4093 def help_(ui, name=None, **opts):
4100 def help_(ui, name=None, **opts):
4094 """show help for a given topic or a help overview
4101 """show help for a given topic or a help overview
4095
4102
4096 With no arguments, print a list of commands with short help messages.
4103 With no arguments, print a list of commands with short help messages.
4097
4104
4098 Given a topic, extension, or command name, print help for that
4105 Given a topic, extension, or command name, print help for that
4099 topic.
4106 topic.
4100
4107
4101 Returns 0 if successful.
4108 Returns 0 if successful.
4102 """
4109 """
4103
4110
4104 textwidth = min(ui.termwidth(), 80) - 2
4111 textwidth = min(ui.termwidth(), 80) - 2
4105
4112
4106 keep = []
4113 keep = []
4107 if ui.verbose:
4114 if ui.verbose:
4108 keep.append('verbose')
4115 keep.append('verbose')
4109 if sys.platform.startswith('win'):
4116 if sys.platform.startswith('win'):
4110 keep.append('windows')
4117 keep.append('windows')
4111 elif sys.platform == 'OpenVMS':
4118 elif sys.platform == 'OpenVMS':
4112 keep.append('vms')
4119 keep.append('vms')
4113 elif sys.platform == 'plan9':
4120 elif sys.platform == 'plan9':
4114 keep.append('plan9')
4121 keep.append('plan9')
4115 else:
4122 else:
4116 keep.append('unix')
4123 keep.append('unix')
4117 keep.append(sys.platform.lower())
4124 keep.append(sys.platform.lower())
4118
4125
4119 section = None
4126 section = None
4120 if name and '.' in name:
4127 if name and '.' in name:
4121 name, section = name.split('.', 1)
4128 name, section = name.split('.', 1)
4122 section = section.lower()
4129 section = section.lower()
4123
4130
4124 text = help.help_(ui, name, **opts)
4131 text = help.help_(ui, name, **opts)
4125
4132
4126 formatted, pruned = minirst.format(text, textwidth, keep=keep,
4133 formatted, pruned = minirst.format(text, textwidth, keep=keep,
4127 section=section)
4134 section=section)
4128
4135
4129 # We could have been given a weird ".foo" section without a name
4136 # We could have been given a weird ".foo" section without a name
4130 # to look for, or we could have simply failed to found "foo.bar"
4137 # to look for, or we could have simply failed to found "foo.bar"
4131 # because bar isn't a section of foo
4138 # because bar isn't a section of foo
4132 if section and not (formatted and name):
4139 if section and not (formatted and name):
4133 raise error.Abort(_("help section not found"))
4140 raise error.Abort(_("help section not found"))
4134
4141
4135 if 'verbose' in pruned:
4142 if 'verbose' in pruned:
4136 keep.append('omitted')
4143 keep.append('omitted')
4137 else:
4144 else:
4138 keep.append('notomitted')
4145 keep.append('notomitted')
4139 formatted, pruned = minirst.format(text, textwidth, keep=keep,
4146 formatted, pruned = minirst.format(text, textwidth, keep=keep,
4140 section=section)
4147 section=section)
4141 ui.write(formatted)
4148 ui.write(formatted)
4142
4149
4143
4150
4144 @command('identify|id',
4151 @command('identify|id',
4145 [('r', 'rev', '',
4152 [('r', 'rev', '',
4146 _('identify the specified revision'), _('REV')),
4153 _('identify the specified revision'), _('REV')),
4147 ('n', 'num', None, _('show local revision number')),
4154 ('n', 'num', None, _('show local revision number')),
4148 ('i', 'id', None, _('show global revision id')),
4155 ('i', 'id', None, _('show global revision id')),
4149 ('b', 'branch', None, _('show branch')),
4156 ('b', 'branch', None, _('show branch')),
4150 ('t', 'tags', None, _('show tags')),
4157 ('t', 'tags', None, _('show tags')),
4151 ('B', 'bookmarks', None, _('show bookmarks')),
4158 ('B', 'bookmarks', None, _('show bookmarks')),
4152 ] + remoteopts,
4159 ] + remoteopts,
4153 _('[-nibtB] [-r REV] [SOURCE]'),
4160 _('[-nibtB] [-r REV] [SOURCE]'),
4154 optionalrepo=True)
4161 optionalrepo=True)
4155 def identify(ui, repo, source=None, rev=None,
4162 def identify(ui, repo, source=None, rev=None,
4156 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
4163 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
4157 """identify the working directory or specified revision
4164 """identify the working directory or specified revision
4158
4165
4159 Print a summary identifying the repository state at REV using one or
4166 Print a summary identifying the repository state at REV using one or
4160 two parent hash identifiers, followed by a "+" if the working
4167 two parent hash identifiers, followed by a "+" if the working
4161 directory has uncommitted changes, the branch name (if not default),
4168 directory has uncommitted changes, the branch name (if not default),
4162 a list of tags, and a list of bookmarks.
4169 a list of tags, and a list of bookmarks.
4163
4170
4164 When REV is not given, print a summary of the current state of the
4171 When REV is not given, print a summary of the current state of the
4165 repository.
4172 repository.
4166
4173
4167 Specifying a path to a repository root or Mercurial bundle will
4174 Specifying a path to a repository root or Mercurial bundle will
4168 cause lookup to operate on that repository/bundle.
4175 cause lookup to operate on that repository/bundle.
4169
4176
4170 .. container:: verbose
4177 .. container:: verbose
4171
4178
4172 Examples:
4179 Examples:
4173
4180
4174 - generate a build identifier for the working directory::
4181 - generate a build identifier for the working directory::
4175
4182
4176 hg id --id > build-id.dat
4183 hg id --id > build-id.dat
4177
4184
4178 - find the revision corresponding to a tag::
4185 - find the revision corresponding to a tag::
4179
4186
4180 hg id -n -r 1.3
4187 hg id -n -r 1.3
4181
4188
4182 - check the most recent revision of a remote repository::
4189 - check the most recent revision of a remote repository::
4183
4190
4184 hg id -r tip http://selenic.com/hg/
4191 hg id -r tip http://selenic.com/hg/
4185
4192
4186 Returns 0 if successful.
4193 Returns 0 if successful.
4187 """
4194 """
4188
4195
4189 if not repo and not source:
4196 if not repo and not source:
4190 raise error.Abort(_("there is no Mercurial repository here "
4197 raise error.Abort(_("there is no Mercurial repository here "
4191 "(.hg not found)"))
4198 "(.hg not found)"))
4192
4199
4193 if ui.debugflag:
4200 if ui.debugflag:
4194 hexfunc = hex
4201 hexfunc = hex
4195 else:
4202 else:
4196 hexfunc = short
4203 hexfunc = short
4197 default = not (num or id or branch or tags or bookmarks)
4204 default = not (num or id or branch or tags or bookmarks)
4198 output = []
4205 output = []
4199 revs = []
4206 revs = []
4200
4207
4201 if source:
4208 if source:
4202 source, branches = hg.parseurl(ui.expandpath(source))
4209 source, branches = hg.parseurl(ui.expandpath(source))
4203 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
4210 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
4204 repo = peer.local()
4211 repo = peer.local()
4205 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
4212 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
4206
4213
4207 if not repo:
4214 if not repo:
4208 if num or branch or tags:
4215 if num or branch or tags:
4209 raise error.Abort(
4216 raise error.Abort(
4210 _("can't query remote revision number, branch, or tags"))
4217 _("can't query remote revision number, branch, or tags"))
4211 if not rev and revs:
4218 if not rev and revs:
4212 rev = revs[0]
4219 rev = revs[0]
4213 if not rev:
4220 if not rev:
4214 rev = "tip"
4221 rev = "tip"
4215
4222
4216 remoterev = peer.lookup(rev)
4223 remoterev = peer.lookup(rev)
4217 if default or id:
4224 if default or id:
4218 output = [hexfunc(remoterev)]
4225 output = [hexfunc(remoterev)]
4219
4226
4220 def getbms():
4227 def getbms():
4221 bms = []
4228 bms = []
4222
4229
4223 if 'bookmarks' in peer.listkeys('namespaces'):
4230 if 'bookmarks' in peer.listkeys('namespaces'):
4224 hexremoterev = hex(remoterev)
4231 hexremoterev = hex(remoterev)
4225 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
4232 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
4226 if bmr == hexremoterev]
4233 if bmr == hexremoterev]
4227
4234
4228 return sorted(bms)
4235 return sorted(bms)
4229
4236
4230 if bookmarks:
4237 if bookmarks:
4231 output.extend(getbms())
4238 output.extend(getbms())
4232 elif default and not ui.quiet:
4239 elif default and not ui.quiet:
4233 # multiple bookmarks for a single parent separated by '/'
4240 # multiple bookmarks for a single parent separated by '/'
4234 bm = '/'.join(getbms())
4241 bm = '/'.join(getbms())
4235 if bm:
4242 if bm:
4236 output.append(bm)
4243 output.append(bm)
4237 else:
4244 else:
4238 ctx = scmutil.revsingle(repo, rev, None)
4245 ctx = scmutil.revsingle(repo, rev, None)
4239
4246
4240 if ctx.rev() is None:
4247 if ctx.rev() is None:
4241 ctx = repo[None]
4248 ctx = repo[None]
4242 parents = ctx.parents()
4249 parents = ctx.parents()
4243 taglist = []
4250 taglist = []
4244 for p in parents:
4251 for p in parents:
4245 taglist.extend(p.tags())
4252 taglist.extend(p.tags())
4246
4253
4247 changed = ""
4254 changed = ""
4248 if default or id or num:
4255 if default or id or num:
4249 if (any(repo.status())
4256 if (any(repo.status())
4250 or any(ctx.sub(s).dirty() for s in ctx.substate)):
4257 or any(ctx.sub(s).dirty() for s in ctx.substate)):
4251 changed = '+'
4258 changed = '+'
4252 if default or id:
4259 if default or id:
4253 output = ["%s%s" %
4260 output = ["%s%s" %
4254 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
4261 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
4255 if num:
4262 if num:
4256 output.append("%s%s" %
4263 output.append("%s%s" %
4257 ('+'.join([str(p.rev()) for p in parents]), changed))
4264 ('+'.join([str(p.rev()) for p in parents]), changed))
4258 else:
4265 else:
4259 if default or id:
4266 if default or id:
4260 output = [hexfunc(ctx.node())]
4267 output = [hexfunc(ctx.node())]
4261 if num:
4268 if num:
4262 output.append(str(ctx.rev()))
4269 output.append(str(ctx.rev()))
4263 taglist = ctx.tags()
4270 taglist = ctx.tags()
4264
4271
4265 if default and not ui.quiet:
4272 if default and not ui.quiet:
4266 b = ctx.branch()
4273 b = ctx.branch()
4267 if b != 'default':
4274 if b != 'default':
4268 output.append("(%s)" % b)
4275 output.append("(%s)" % b)
4269
4276
4270 # multiple tags for a single parent separated by '/'
4277 # multiple tags for a single parent separated by '/'
4271 t = '/'.join(taglist)
4278 t = '/'.join(taglist)
4272 if t:
4279 if t:
4273 output.append(t)
4280 output.append(t)
4274
4281
4275 # multiple bookmarks for a single parent separated by '/'
4282 # multiple bookmarks for a single parent separated by '/'
4276 bm = '/'.join(ctx.bookmarks())
4283 bm = '/'.join(ctx.bookmarks())
4277 if bm:
4284 if bm:
4278 output.append(bm)
4285 output.append(bm)
4279 else:
4286 else:
4280 if branch:
4287 if branch:
4281 output.append(ctx.branch())
4288 output.append(ctx.branch())
4282
4289
4283 if tags:
4290 if tags:
4284 output.extend(taglist)
4291 output.extend(taglist)
4285
4292
4286 if bookmarks:
4293 if bookmarks:
4287 output.extend(ctx.bookmarks())
4294 output.extend(ctx.bookmarks())
4288
4295
4289 ui.write("%s\n" % ' '.join(output))
4296 ui.write("%s\n" % ' '.join(output))
4290
4297
4291 @command('import|patch',
4298 @command('import|patch',
4292 [('p', 'strip', 1,
4299 [('p', 'strip', 1,
4293 _('directory strip option for patch. This has the same '
4300 _('directory strip option for patch. This has the same '
4294 'meaning as the corresponding patch option'), _('NUM')),
4301 'meaning as the corresponding patch option'), _('NUM')),
4295 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
4302 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
4296 ('e', 'edit', False, _('invoke editor on commit messages')),
4303 ('e', 'edit', False, _('invoke editor on commit messages')),
4297 ('f', 'force', None,
4304 ('f', 'force', None,
4298 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
4305 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
4299 ('', 'no-commit', None,
4306 ('', 'no-commit', None,
4300 _("don't commit, just update the working directory")),
4307 _("don't commit, just update the working directory")),
4301 ('', 'bypass', None,
4308 ('', 'bypass', None,
4302 _("apply patch without touching the working directory")),
4309 _("apply patch without touching the working directory")),
4303 ('', 'partial', None,
4310 ('', 'partial', None,
4304 _('commit even if some hunks fail')),
4311 _('commit even if some hunks fail')),
4305 ('', 'exact', None,
4312 ('', 'exact', None,
4306 _('apply patch to the nodes from which it was generated')),
4313 _('apply patch to the nodes from which it was generated')),
4307 ('', 'prefix', '',
4314 ('', 'prefix', '',
4308 _('apply patch to subdirectory'), _('DIR')),
4315 _('apply patch to subdirectory'), _('DIR')),
4309 ('', 'import-branch', None,
4316 ('', 'import-branch', None,
4310 _('use any branch information in patch (implied by --exact)'))] +
4317 _('use any branch information in patch (implied by --exact)'))] +
4311 commitopts + commitopts2 + similarityopts,
4318 commitopts + commitopts2 + similarityopts,
4312 _('[OPTION]... PATCH...'))
4319 _('[OPTION]... PATCH...'))
4313 def import_(ui, repo, patch1=None, *patches, **opts):
4320 def import_(ui, repo, patch1=None, *patches, **opts):
4314 """import an ordered set of patches
4321 """import an ordered set of patches
4315
4322
4316 Import a list of patches and commit them individually (unless
4323 Import a list of patches and commit them individually (unless
4317 --no-commit is specified).
4324 --no-commit is specified).
4318
4325
4319 Because import first applies changes to the working directory,
4326 Because import first applies changes to the working directory,
4320 import will abort if there are outstanding changes.
4327 import will abort if there are outstanding changes.
4321
4328
4322 You can import a patch straight from a mail message. Even patches
4329 You can import a patch straight from a mail message. Even patches
4323 as attachments work (to use the body part, it must have type
4330 as attachments work (to use the body part, it must have type
4324 text/plain or text/x-patch). From and Subject headers of email
4331 text/plain or text/x-patch). From and Subject headers of email
4325 message are used as default committer and commit message. All
4332 message are used as default committer and commit message. All
4326 text/plain body parts before first diff are added to commit
4333 text/plain body parts before first diff are added to commit
4327 message.
4334 message.
4328
4335
4329 If the imported patch was generated by :hg:`export`, user and
4336 If the imported patch was generated by :hg:`export`, user and
4330 description from patch override values from message headers and
4337 description from patch override values from message headers and
4331 body. Values given on command line with -m/--message and -u/--user
4338 body. Values given on command line with -m/--message and -u/--user
4332 override these.
4339 override these.
4333
4340
4334 If --exact is specified, import will set the working directory to
4341 If --exact is specified, import will set the working directory to
4335 the parent of each patch before applying it, and will abort if the
4342 the parent of each patch before applying it, and will abort if the
4336 resulting changeset has a different ID than the one recorded in
4343 resulting changeset has a different ID than the one recorded in
4337 the patch. This may happen due to character set problems or other
4344 the patch. This may happen due to character set problems or other
4338 deficiencies in the text patch format.
4345 deficiencies in the text patch format.
4339
4346
4340 Use --bypass to apply and commit patches directly to the
4347 Use --bypass to apply and commit patches directly to the
4341 repository, not touching the working directory. Without --exact,
4348 repository, not touching the working directory. Without --exact,
4342 patches will be applied on top of the working directory parent
4349 patches will be applied on top of the working directory parent
4343 revision.
4350 revision.
4344
4351
4345 With -s/--similarity, hg will attempt to discover renames and
4352 With -s/--similarity, hg will attempt to discover renames and
4346 copies in the patch in the same way as :hg:`addremove`.
4353 copies in the patch in the same way as :hg:`addremove`.
4347
4354
4348 Use --partial to ensure a changeset will be created from the patch
4355 Use --partial to ensure a changeset will be created from the patch
4349 even if some hunks fail to apply. Hunks that fail to apply will be
4356 even if some hunks fail to apply. Hunks that fail to apply will be
4350 written to a <target-file>.rej file. Conflicts can then be resolved
4357 written to a <target-file>.rej file. Conflicts can then be resolved
4351 by hand before :hg:`commit --amend` is run to update the created
4358 by hand before :hg:`commit --amend` is run to update the created
4352 changeset. This flag exists to let people import patches that
4359 changeset. This flag exists to let people import patches that
4353 partially apply without losing the associated metadata (author,
4360 partially apply without losing the associated metadata (author,
4354 date, description, ...). Note that when none of the hunk applies
4361 date, description, ...). Note that when none of the hunk applies
4355 cleanly, :hg:`import --partial` will create an empty changeset,
4362 cleanly, :hg:`import --partial` will create an empty changeset,
4356 importing only the patch metadata.
4363 importing only the patch metadata.
4357
4364
4358 It is possible to use external patch programs to perform the patch
4365 It is possible to use external patch programs to perform the patch
4359 by setting the ``ui.patch`` configuration option. For the default
4366 by setting the ``ui.patch`` configuration option. For the default
4360 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4367 internal tool, the fuzz can also be configured via ``patch.fuzz``.
4361 See :hg:`help config` for more information about configuration
4368 See :hg:`help config` for more information about configuration
4362 files and how to use these options.
4369 files and how to use these options.
4363
4370
4364 To read a patch from standard input, use "-" as the patch name. If
4371 To read a patch from standard input, use "-" as the patch name. If
4365 a URL is specified, the patch will be downloaded from it.
4372 a URL is specified, the patch will be downloaded from it.
4366 See :hg:`help dates` for a list of formats valid for -d/--date.
4373 See :hg:`help dates` for a list of formats valid for -d/--date.
4367
4374
4368 .. container:: verbose
4375 .. container:: verbose
4369
4376
4370 Examples:
4377 Examples:
4371
4378
4372 - import a traditional patch from a website and detect renames::
4379 - import a traditional patch from a website and detect renames::
4373
4380
4374 hg import -s 80 http://example.com/bugfix.patch
4381 hg import -s 80 http://example.com/bugfix.patch
4375
4382
4376 - import a changeset from an hgweb server::
4383 - import a changeset from an hgweb server::
4377
4384
4378 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
4385 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
4379
4386
4380 - import all the patches in an Unix-style mbox::
4387 - import all the patches in an Unix-style mbox::
4381
4388
4382 hg import incoming-patches.mbox
4389 hg import incoming-patches.mbox
4383
4390
4384 - attempt to exactly restore an exported changeset (not always
4391 - attempt to exactly restore an exported changeset (not always
4385 possible)::
4392 possible)::
4386
4393
4387 hg import --exact proposed-fix.patch
4394 hg import --exact proposed-fix.patch
4388
4395
4389 - use an external tool to apply a patch which is too fuzzy for
4396 - use an external tool to apply a patch which is too fuzzy for
4390 the default internal tool.
4397 the default internal tool.
4391
4398
4392 hg import --config ui.patch="patch --merge" fuzzy.patch
4399 hg import --config ui.patch="patch --merge" fuzzy.patch
4393
4400
4394 - change the default fuzzing from 2 to a less strict 7
4401 - change the default fuzzing from 2 to a less strict 7
4395
4402
4396 hg import --config ui.fuzz=7 fuzz.patch
4403 hg import --config ui.fuzz=7 fuzz.patch
4397
4404
4398 Returns 0 on success, 1 on partial success (see --partial).
4405 Returns 0 on success, 1 on partial success (see --partial).
4399 """
4406 """
4400
4407
4401 if not patch1:
4408 if not patch1:
4402 raise error.Abort(_('need at least one patch to import'))
4409 raise error.Abort(_('need at least one patch to import'))
4403
4410
4404 patches = (patch1,) + patches
4411 patches = (patch1,) + patches
4405
4412
4406 date = opts.get('date')
4413 date = opts.get('date')
4407 if date:
4414 if date:
4408 opts['date'] = util.parsedate(date)
4415 opts['date'] = util.parsedate(date)
4409
4416
4410 update = not opts.get('bypass')
4417 update = not opts.get('bypass')
4411 if not update and opts.get('no_commit'):
4418 if not update and opts.get('no_commit'):
4412 raise error.Abort(_('cannot use --no-commit with --bypass'))
4419 raise error.Abort(_('cannot use --no-commit with --bypass'))
4413 try:
4420 try:
4414 sim = float(opts.get('similarity') or 0)
4421 sim = float(opts.get('similarity') or 0)
4415 except ValueError:
4422 except ValueError:
4416 raise error.Abort(_('similarity must be a number'))
4423 raise error.Abort(_('similarity must be a number'))
4417 if sim < 0 or sim > 100:
4424 if sim < 0 or sim > 100:
4418 raise error.Abort(_('similarity must be between 0 and 100'))
4425 raise error.Abort(_('similarity must be between 0 and 100'))
4419 if sim and not update:
4426 if sim and not update:
4420 raise error.Abort(_('cannot use --similarity with --bypass'))
4427 raise error.Abort(_('cannot use --similarity with --bypass'))
4421 if opts.get('exact') and opts.get('edit'):
4428 if opts.get('exact') and opts.get('edit'):
4422 raise error.Abort(_('cannot use --exact with --edit'))
4429 raise error.Abort(_('cannot use --exact with --edit'))
4423 if opts.get('exact') and opts.get('prefix'):
4430 if opts.get('exact') and opts.get('prefix'):
4424 raise error.Abort(_('cannot use --exact with --prefix'))
4431 raise error.Abort(_('cannot use --exact with --prefix'))
4425
4432
4426 if update:
4433 if update:
4427 cmdutil.checkunfinished(repo)
4434 cmdutil.checkunfinished(repo)
4428 if (opts.get('exact') or not opts.get('force')) and update:
4435 if (opts.get('exact') or not opts.get('force')) and update:
4429 cmdutil.bailifchanged(repo)
4436 cmdutil.bailifchanged(repo)
4430
4437
4431 base = opts["base"]
4438 base = opts["base"]
4432 wlock = dsguard = lock = tr = None
4439 wlock = dsguard = lock = tr = None
4433 msgs = []
4440 msgs = []
4434 ret = 0
4441 ret = 0
4435
4442
4436
4443
4437 try:
4444 try:
4438 try:
4445 try:
4439 wlock = repo.wlock()
4446 wlock = repo.wlock()
4440 if not opts.get('no_commit'):
4447 if not opts.get('no_commit'):
4441 lock = repo.lock()
4448 lock = repo.lock()
4442 tr = repo.transaction('import')
4449 tr = repo.transaction('import')
4443 else:
4450 else:
4444 dsguard = cmdutil.dirstateguard(repo, 'import')
4451 dsguard = cmdutil.dirstateguard(repo, 'import')
4445 parents = repo.parents()
4452 parents = repo.parents()
4446 for patchurl in patches:
4453 for patchurl in patches:
4447 if patchurl == '-':
4454 if patchurl == '-':
4448 ui.status(_('applying patch from stdin\n'))
4455 ui.status(_('applying patch from stdin\n'))
4449 patchfile = ui.fin
4456 patchfile = ui.fin
4450 patchurl = 'stdin' # for error message
4457 patchurl = 'stdin' # for error message
4451 else:
4458 else:
4452 patchurl = os.path.join(base, patchurl)
4459 patchurl = os.path.join(base, patchurl)
4453 ui.status(_('applying %s\n') % patchurl)
4460 ui.status(_('applying %s\n') % patchurl)
4454 patchfile = hg.openpath(ui, patchurl)
4461 patchfile = hg.openpath(ui, patchurl)
4455
4462
4456 haspatch = False
4463 haspatch = False
4457 for hunk in patch.split(patchfile):
4464 for hunk in patch.split(patchfile):
4458 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
4465 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
4459 parents, opts,
4466 parents, opts,
4460 msgs, hg.clean)
4467 msgs, hg.clean)
4461 if msg:
4468 if msg:
4462 haspatch = True
4469 haspatch = True
4463 ui.note(msg + '\n')
4470 ui.note(msg + '\n')
4464 if update or opts.get('exact'):
4471 if update or opts.get('exact'):
4465 parents = repo.parents()
4472 parents = repo.parents()
4466 else:
4473 else:
4467 parents = [repo[node]]
4474 parents = [repo[node]]
4468 if rej:
4475 if rej:
4469 ui.write_err(_("patch applied partially\n"))
4476 ui.write_err(_("patch applied partially\n"))
4470 ui.write_err(_("(fix the .rej files and run "
4477 ui.write_err(_("(fix the .rej files and run "
4471 "`hg commit --amend`)\n"))
4478 "`hg commit --amend`)\n"))
4472 ret = 1
4479 ret = 1
4473 break
4480 break
4474
4481
4475 if not haspatch:
4482 if not haspatch:
4476 raise error.Abort(_('%s: no diffs found') % patchurl)
4483 raise error.Abort(_('%s: no diffs found') % patchurl)
4477
4484
4478 if tr:
4485 if tr:
4479 tr.close()
4486 tr.close()
4480 if msgs:
4487 if msgs:
4481 repo.savecommitmessage('\n* * *\n'.join(msgs))
4488 repo.savecommitmessage('\n* * *\n'.join(msgs))
4482 if dsguard:
4489 if dsguard:
4483 dsguard.close()
4490 dsguard.close()
4484 return ret
4491 return ret
4485 finally:
4492 finally:
4486 # TODO: get rid of this meaningless try/finally enclosing.
4493 # TODO: get rid of this meaningless try/finally enclosing.
4487 # this is kept only to reduce changes in a patch.
4494 # this is kept only to reduce changes in a patch.
4488 pass
4495 pass
4489 finally:
4496 finally:
4490 if tr:
4497 if tr:
4491 tr.release()
4498 tr.release()
4492 release(lock, dsguard, wlock)
4499 release(lock, dsguard, wlock)
4493
4500
4494 @command('incoming|in',
4501 @command('incoming|in',
4495 [('f', 'force', None,
4502 [('f', 'force', None,
4496 _('run even if remote repository is unrelated')),
4503 _('run even if remote repository is unrelated')),
4497 ('n', 'newest-first', None, _('show newest record first')),
4504 ('n', 'newest-first', None, _('show newest record first')),
4498 ('', 'bundle', '',
4505 ('', 'bundle', '',
4499 _('file to store the bundles into'), _('FILE')),
4506 _('file to store the bundles into'), _('FILE')),
4500 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4507 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4501 ('B', 'bookmarks', False, _("compare bookmarks")),
4508 ('B', 'bookmarks', False, _("compare bookmarks")),
4502 ('b', 'branch', [],
4509 ('b', 'branch', [],
4503 _('a specific branch you would like to pull'), _('BRANCH')),
4510 _('a specific branch you would like to pull'), _('BRANCH')),
4504 ] + logopts + remoteopts + subrepoopts,
4511 ] + logopts + remoteopts + subrepoopts,
4505 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
4512 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
4506 def incoming(ui, repo, source="default", **opts):
4513 def incoming(ui, repo, source="default", **opts):
4507 """show new changesets found in source
4514 """show new changesets found in source
4508
4515
4509 Show new changesets found in the specified path/URL or the default
4516 Show new changesets found in the specified path/URL or the default
4510 pull location. These are the changesets that would have been pulled
4517 pull location. These are the changesets that would have been pulled
4511 if a pull at the time you issued this command.
4518 if a pull at the time you issued this command.
4512
4519
4513 See pull for valid source format details.
4520 See pull for valid source format details.
4514
4521
4515 .. container:: verbose
4522 .. container:: verbose
4516
4523
4517 With -B/--bookmarks, the result of bookmark comparison between
4524 With -B/--bookmarks, the result of bookmark comparison between
4518 local and remote repositories is displayed. With -v/--verbose,
4525 local and remote repositories is displayed. With -v/--verbose,
4519 status is also displayed for each bookmark like below::
4526 status is also displayed for each bookmark like below::
4520
4527
4521 BM1 01234567890a added
4528 BM1 01234567890a added
4522 BM2 1234567890ab advanced
4529 BM2 1234567890ab advanced
4523 BM3 234567890abc diverged
4530 BM3 234567890abc diverged
4524 BM4 34567890abcd changed
4531 BM4 34567890abcd changed
4525
4532
4526 The action taken locally when pulling depends on the
4533 The action taken locally when pulling depends on the
4527 status of each bookmark:
4534 status of each bookmark:
4528
4535
4529 :``added``: pull will create it
4536 :``added``: pull will create it
4530 :``advanced``: pull will update it
4537 :``advanced``: pull will update it
4531 :``diverged``: pull will create a divergent bookmark
4538 :``diverged``: pull will create a divergent bookmark
4532 :``changed``: result depends on remote changesets
4539 :``changed``: result depends on remote changesets
4533
4540
4534 From the point of view of pulling behavior, bookmark
4541 From the point of view of pulling behavior, bookmark
4535 existing only in the remote repository are treated as ``added``,
4542 existing only in the remote repository are treated as ``added``,
4536 even if it is in fact locally deleted.
4543 even if it is in fact locally deleted.
4537
4544
4538 .. container:: verbose
4545 .. container:: verbose
4539
4546
4540 For remote repository, using --bundle avoids downloading the
4547 For remote repository, using --bundle avoids downloading the
4541 changesets twice if the incoming is followed by a pull.
4548 changesets twice if the incoming is followed by a pull.
4542
4549
4543 Examples:
4550 Examples:
4544
4551
4545 - show incoming changes with patches and full description::
4552 - show incoming changes with patches and full description::
4546
4553
4547 hg incoming -vp
4554 hg incoming -vp
4548
4555
4549 - show incoming changes excluding merges, store a bundle::
4556 - show incoming changes excluding merges, store a bundle::
4550
4557
4551 hg in -vpM --bundle incoming.hg
4558 hg in -vpM --bundle incoming.hg
4552 hg pull incoming.hg
4559 hg pull incoming.hg
4553
4560
4554 - briefly list changes inside a bundle::
4561 - briefly list changes inside a bundle::
4555
4562
4556 hg in changes.hg -T "{desc|firstline}\\n"
4563 hg in changes.hg -T "{desc|firstline}\\n"
4557
4564
4558 Returns 0 if there are incoming changes, 1 otherwise.
4565 Returns 0 if there are incoming changes, 1 otherwise.
4559 """
4566 """
4560 if opts.get('graph'):
4567 if opts.get('graph'):
4561 cmdutil.checkunsupportedgraphflags([], opts)
4568 cmdutil.checkunsupportedgraphflags([], opts)
4562 def display(other, chlist, displayer):
4569 def display(other, chlist, displayer):
4563 revdag = cmdutil.graphrevs(other, chlist, opts)
4570 revdag = cmdutil.graphrevs(other, chlist, opts)
4564 showparents = [ctx.node() for ctx in repo[None].parents()]
4571 showparents = [ctx.node() for ctx in repo[None].parents()]
4565 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4572 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4566 graphmod.asciiedges)
4573 graphmod.asciiedges)
4567
4574
4568 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4575 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4569 return 0
4576 return 0
4570
4577
4571 if opts.get('bundle') and opts.get('subrepos'):
4578 if opts.get('bundle') and opts.get('subrepos'):
4572 raise error.Abort(_('cannot combine --bundle and --subrepos'))
4579 raise error.Abort(_('cannot combine --bundle and --subrepos'))
4573
4580
4574 if opts.get('bookmarks'):
4581 if opts.get('bookmarks'):
4575 source, branches = hg.parseurl(ui.expandpath(source),
4582 source, branches = hg.parseurl(ui.expandpath(source),
4576 opts.get('branch'))
4583 opts.get('branch'))
4577 other = hg.peer(repo, opts, source)
4584 other = hg.peer(repo, opts, source)
4578 if 'bookmarks' not in other.listkeys('namespaces'):
4585 if 'bookmarks' not in other.listkeys('namespaces'):
4579 ui.warn(_("remote doesn't support bookmarks\n"))
4586 ui.warn(_("remote doesn't support bookmarks\n"))
4580 return 0
4587 return 0
4581 ui.status(_('comparing with %s\n') % util.hidepassword(source))
4588 ui.status(_('comparing with %s\n') % util.hidepassword(source))
4582 return bookmarks.incoming(ui, repo, other)
4589 return bookmarks.incoming(ui, repo, other)
4583
4590
4584 repo._subtoppath = ui.expandpath(source)
4591 repo._subtoppath = ui.expandpath(source)
4585 try:
4592 try:
4586 return hg.incoming(ui, repo, source, opts)
4593 return hg.incoming(ui, repo, source, opts)
4587 finally:
4594 finally:
4588 del repo._subtoppath
4595 del repo._subtoppath
4589
4596
4590
4597
4591 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
4598 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
4592 norepo=True)
4599 norepo=True)
4593 def init(ui, dest=".", **opts):
4600 def init(ui, dest=".", **opts):
4594 """create a new repository in the given directory
4601 """create a new repository in the given directory
4595
4602
4596 Initialize a new repository in the given directory. If the given
4603 Initialize a new repository in the given directory. If the given
4597 directory does not exist, it will be created.
4604 directory does not exist, it will be created.
4598
4605
4599 If no directory is given, the current directory is used.
4606 If no directory is given, the current directory is used.
4600
4607
4601 It is possible to specify an ``ssh://`` URL as the destination.
4608 It is possible to specify an ``ssh://`` URL as the destination.
4602 See :hg:`help urls` for more information.
4609 See :hg:`help urls` for more information.
4603
4610
4604 Returns 0 on success.
4611 Returns 0 on success.
4605 """
4612 """
4606 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4613 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4607
4614
4608 @command('locate',
4615 @command('locate',
4609 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
4616 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
4610 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4617 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4611 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4618 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4612 ] + walkopts,
4619 ] + walkopts,
4613 _('[OPTION]... [PATTERN]...'))
4620 _('[OPTION]... [PATTERN]...'))
4614 def locate(ui, repo, *pats, **opts):
4621 def locate(ui, repo, *pats, **opts):
4615 """locate files matching specific patterns (DEPRECATED)
4622 """locate files matching specific patterns (DEPRECATED)
4616
4623
4617 Print files under Mercurial control in the working directory whose
4624 Print files under Mercurial control in the working directory whose
4618 names match the given patterns.
4625 names match the given patterns.
4619
4626
4620 By default, this command searches all directories in the working
4627 By default, this command searches all directories in the working
4621 directory. To search just the current directory and its
4628 directory. To search just the current directory and its
4622 subdirectories, use "--include .".
4629 subdirectories, use "--include .".
4623
4630
4624 If no patterns are given to match, this command prints the names
4631 If no patterns are given to match, this command prints the names
4625 of all files under Mercurial control in the working directory.
4632 of all files under Mercurial control in the working directory.
4626
4633
4627 If you want to feed the output of this command into the "xargs"
4634 If you want to feed the output of this command into the "xargs"
4628 command, use the -0 option to both this command and "xargs". This
4635 command, use the -0 option to both this command and "xargs". This
4629 will avoid the problem of "xargs" treating single filenames that
4636 will avoid the problem of "xargs" treating single filenames that
4630 contain whitespace as multiple filenames.
4637 contain whitespace as multiple filenames.
4631
4638
4632 See :hg:`help files` for a more versatile command.
4639 See :hg:`help files` for a more versatile command.
4633
4640
4634 Returns 0 if a match is found, 1 otherwise.
4641 Returns 0 if a match is found, 1 otherwise.
4635 """
4642 """
4636 if opts.get('print0'):
4643 if opts.get('print0'):
4637 end = '\0'
4644 end = '\0'
4638 else:
4645 else:
4639 end = '\n'
4646 end = '\n'
4640 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4647 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4641
4648
4642 ret = 1
4649 ret = 1
4643 ctx = repo[rev]
4650 ctx = repo[rev]
4644 m = scmutil.match(ctx, pats, opts, default='relglob',
4651 m = scmutil.match(ctx, pats, opts, default='relglob',
4645 badfn=lambda x, y: False)
4652 badfn=lambda x, y: False)
4646
4653
4647 for abs in ctx.matches(m):
4654 for abs in ctx.matches(m):
4648 if opts.get('fullpath'):
4655 if opts.get('fullpath'):
4649 ui.write(repo.wjoin(abs), end)
4656 ui.write(repo.wjoin(abs), end)
4650 else:
4657 else:
4651 ui.write(((pats and m.rel(abs)) or abs), end)
4658 ui.write(((pats and m.rel(abs)) or abs), end)
4652 ret = 0
4659 ret = 0
4653
4660
4654 return ret
4661 return ret
4655
4662
4656 @command('^log|history',
4663 @command('^log|history',
4657 [('f', 'follow', None,
4664 [('f', 'follow', None,
4658 _('follow changeset history, or file history across copies and renames')),
4665 _('follow changeset history, or file history across copies and renames')),
4659 ('', 'follow-first', None,
4666 ('', 'follow-first', None,
4660 _('only follow the first parent of merge changesets (DEPRECATED)')),
4667 _('only follow the first parent of merge changesets (DEPRECATED)')),
4661 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4668 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4662 ('C', 'copies', None, _('show copied files')),
4669 ('C', 'copies', None, _('show copied files')),
4663 ('k', 'keyword', [],
4670 ('k', 'keyword', [],
4664 _('do case-insensitive search for a given text'), _('TEXT')),
4671 _('do case-insensitive search for a given text'), _('TEXT')),
4665 ('r', 'rev', [], _('show the specified revision or revset'), _('REV')),
4672 ('r', 'rev', [], _('show the specified revision or revset'), _('REV')),
4666 ('', 'removed', None, _('include revisions where files were removed')),
4673 ('', 'removed', None, _('include revisions where files were removed')),
4667 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4674 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4668 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4675 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4669 ('', 'only-branch', [],
4676 ('', 'only-branch', [],
4670 _('show only changesets within the given named branch (DEPRECATED)'),
4677 _('show only changesets within the given named branch (DEPRECATED)'),
4671 _('BRANCH')),
4678 _('BRANCH')),
4672 ('b', 'branch', [],
4679 ('b', 'branch', [],
4673 _('show changesets within the given named branch'), _('BRANCH')),
4680 _('show changesets within the given named branch'), _('BRANCH')),
4674 ('P', 'prune', [],
4681 ('P', 'prune', [],
4675 _('do not display revision or any of its ancestors'), _('REV')),
4682 _('do not display revision or any of its ancestors'), _('REV')),
4676 ] + logopts + walkopts,
4683 ] + logopts + walkopts,
4677 _('[OPTION]... [FILE]'),
4684 _('[OPTION]... [FILE]'),
4678 inferrepo=True)
4685 inferrepo=True)
4679 def log(ui, repo, *pats, **opts):
4686 def log(ui, repo, *pats, **opts):
4680 """show revision history of entire repository or files
4687 """show revision history of entire repository or files
4681
4688
4682 Print the revision history of the specified files or the entire
4689 Print the revision history of the specified files or the entire
4683 project.
4690 project.
4684
4691
4685 If no revision range is specified, the default is ``tip:0`` unless
4692 If no revision range is specified, the default is ``tip:0`` unless
4686 --follow is set, in which case the working directory parent is
4693 --follow is set, in which case the working directory parent is
4687 used as the starting revision.
4694 used as the starting revision.
4688
4695
4689 File history is shown without following rename or copy history of
4696 File history is shown without following rename or copy history of
4690 files. Use -f/--follow with a filename to follow history across
4697 files. Use -f/--follow with a filename to follow history across
4691 renames and copies. --follow without a filename will only show
4698 renames and copies. --follow without a filename will only show
4692 ancestors or descendants of the starting revision.
4699 ancestors or descendants of the starting revision.
4693
4700
4694 By default this command prints revision number and changeset id,
4701 By default this command prints revision number and changeset id,
4695 tags, non-trivial parents, user, date and time, and a summary for
4702 tags, non-trivial parents, user, date and time, and a summary for
4696 each commit. When the -v/--verbose switch is used, the list of
4703 each commit. When the -v/--verbose switch is used, the list of
4697 changed files and full commit message are shown.
4704 changed files and full commit message are shown.
4698
4705
4699 With --graph the revisions are shown as an ASCII art DAG with the most
4706 With --graph the revisions are shown as an ASCII art DAG with the most
4700 recent changeset at the top.
4707 recent changeset at the top.
4701 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4708 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4702 and '+' represents a fork where the changeset from the lines below is a
4709 and '+' represents a fork where the changeset from the lines below is a
4703 parent of the 'o' merge on the same line.
4710 parent of the 'o' merge on the same line.
4704
4711
4705 .. note::
4712 .. note::
4706
4713
4707 log -p/--patch may generate unexpected diff output for merge
4714 log -p/--patch may generate unexpected diff output for merge
4708 changesets, as it will only compare the merge changeset against
4715 changesets, as it will only compare the merge changeset against
4709 its first parent. Also, only files different from BOTH parents
4716 its first parent. Also, only files different from BOTH parents
4710 will appear in files:.
4717 will appear in files:.
4711
4718
4712 .. note::
4719 .. note::
4713
4720
4714 for performance reasons, log FILE may omit duplicate changes
4721 for performance reasons, log FILE may omit duplicate changes
4715 made on branches and will not show removals or mode changes. To
4722 made on branches and will not show removals or mode changes. To
4716 see all such changes, use the --removed switch.
4723 see all such changes, use the --removed switch.
4717
4724
4718 .. container:: verbose
4725 .. container:: verbose
4719
4726
4720 Some examples:
4727 Some examples:
4721
4728
4722 - changesets with full descriptions and file lists::
4729 - changesets with full descriptions and file lists::
4723
4730
4724 hg log -v
4731 hg log -v
4725
4732
4726 - changesets ancestral to the working directory::
4733 - changesets ancestral to the working directory::
4727
4734
4728 hg log -f
4735 hg log -f
4729
4736
4730 - last 10 commits on the current branch::
4737 - last 10 commits on the current branch::
4731
4738
4732 hg log -l 10 -b .
4739 hg log -l 10 -b .
4733
4740
4734 - changesets showing all modifications of a file, including removals::
4741 - changesets showing all modifications of a file, including removals::
4735
4742
4736 hg log --removed file.c
4743 hg log --removed file.c
4737
4744
4738 - all changesets that touch a directory, with diffs, excluding merges::
4745 - all changesets that touch a directory, with diffs, excluding merges::
4739
4746
4740 hg log -Mp lib/
4747 hg log -Mp lib/
4741
4748
4742 - all revision numbers that match a keyword::
4749 - all revision numbers that match a keyword::
4743
4750
4744 hg log -k bug --template "{rev}\\n"
4751 hg log -k bug --template "{rev}\\n"
4745
4752
4746 - list available log templates::
4753 - list available log templates::
4747
4754
4748 hg log -T list
4755 hg log -T list
4749
4756
4750 - check if a given changeset is included in a tagged release::
4757 - check if a given changeset is included in a tagged release::
4751
4758
4752 hg log -r "a21ccf and ancestor(1.9)"
4759 hg log -r "a21ccf and ancestor(1.9)"
4753
4760
4754 - find all changesets by some user in a date range::
4761 - find all changesets by some user in a date range::
4755
4762
4756 hg log -k alice -d "may 2008 to jul 2008"
4763 hg log -k alice -d "may 2008 to jul 2008"
4757
4764
4758 - summary of all changesets after the last tag::
4765 - summary of all changesets after the last tag::
4759
4766
4760 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4767 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4761
4768
4762 See :hg:`help dates` for a list of formats valid for -d/--date.
4769 See :hg:`help dates` for a list of formats valid for -d/--date.
4763
4770
4764 See :hg:`help revisions` and :hg:`help revsets` for more about
4771 See :hg:`help revisions` and :hg:`help revsets` for more about
4765 specifying revisions.
4772 specifying revisions.
4766
4773
4767 See :hg:`help templates` for more about pre-packaged styles and
4774 See :hg:`help templates` for more about pre-packaged styles and
4768 specifying custom templates.
4775 specifying custom templates.
4769
4776
4770 Returns 0 on success.
4777 Returns 0 on success.
4771
4778
4772 """
4779 """
4773 if opts.get('follow') and opts.get('rev'):
4780 if opts.get('follow') and opts.get('rev'):
4774 opts['rev'] = [revset.formatspec('reverse(::%lr)', opts.get('rev'))]
4781 opts['rev'] = [revset.formatspec('reverse(::%lr)', opts.get('rev'))]
4775 del opts['follow']
4782 del opts['follow']
4776
4783
4777 if opts.get('graph'):
4784 if opts.get('graph'):
4778 return cmdutil.graphlog(ui, repo, *pats, **opts)
4785 return cmdutil.graphlog(ui, repo, *pats, **opts)
4779
4786
4780 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4787 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4781 limit = cmdutil.loglimit(opts)
4788 limit = cmdutil.loglimit(opts)
4782 count = 0
4789 count = 0
4783
4790
4784 getrenamed = None
4791 getrenamed = None
4785 if opts.get('copies'):
4792 if opts.get('copies'):
4786 endrev = None
4793 endrev = None
4787 if opts.get('rev'):
4794 if opts.get('rev'):
4788 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4795 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4789 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4796 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4790
4797
4791 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4798 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4792 for rev in revs:
4799 for rev in revs:
4793 if count == limit:
4800 if count == limit:
4794 break
4801 break
4795 ctx = repo[rev]
4802 ctx = repo[rev]
4796 copies = None
4803 copies = None
4797 if getrenamed is not None and rev:
4804 if getrenamed is not None and rev:
4798 copies = []
4805 copies = []
4799 for fn in ctx.files():
4806 for fn in ctx.files():
4800 rename = getrenamed(fn, rev)
4807 rename = getrenamed(fn, rev)
4801 if rename:
4808 if rename:
4802 copies.append((fn, rename[0]))
4809 copies.append((fn, rename[0]))
4803 if filematcher:
4810 if filematcher:
4804 revmatchfn = filematcher(ctx.rev())
4811 revmatchfn = filematcher(ctx.rev())
4805 else:
4812 else:
4806 revmatchfn = None
4813 revmatchfn = None
4807 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4814 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4808 if displayer.flush(ctx):
4815 if displayer.flush(ctx):
4809 count += 1
4816 count += 1
4810
4817
4811 displayer.close()
4818 displayer.close()
4812
4819
4813 @command('manifest',
4820 @command('manifest',
4814 [('r', 'rev', '', _('revision to display'), _('REV')),
4821 [('r', 'rev', '', _('revision to display'), _('REV')),
4815 ('', 'all', False, _("list files from all revisions"))]
4822 ('', 'all', False, _("list files from all revisions"))]
4816 + formatteropts,
4823 + formatteropts,
4817 _('[-r REV]'))
4824 _('[-r REV]'))
4818 def manifest(ui, repo, node=None, rev=None, **opts):
4825 def manifest(ui, repo, node=None, rev=None, **opts):
4819 """output the current or given revision of the project manifest
4826 """output the current or given revision of the project manifest
4820
4827
4821 Print a list of version controlled files for the given revision.
4828 Print a list of version controlled files for the given revision.
4822 If no revision is given, the first parent of the working directory
4829 If no revision is given, the first parent of the working directory
4823 is used, or the null revision if no revision is checked out.
4830 is used, or the null revision if no revision is checked out.
4824
4831
4825 With -v, print file permissions, symlink and executable bits.
4832 With -v, print file permissions, symlink and executable bits.
4826 With --debug, print file revision hashes.
4833 With --debug, print file revision hashes.
4827
4834
4828 If option --all is specified, the list of all files from all revisions
4835 If option --all is specified, the list of all files from all revisions
4829 is printed. This includes deleted and renamed files.
4836 is printed. This includes deleted and renamed files.
4830
4837
4831 Returns 0 on success.
4838 Returns 0 on success.
4832 """
4839 """
4833
4840
4834 fm = ui.formatter('manifest', opts)
4841 fm = ui.formatter('manifest', opts)
4835
4842
4836 if opts.get('all'):
4843 if opts.get('all'):
4837 if rev or node:
4844 if rev or node:
4838 raise error.Abort(_("can't specify a revision with --all"))
4845 raise error.Abort(_("can't specify a revision with --all"))
4839
4846
4840 res = []
4847 res = []
4841 prefix = "data/"
4848 prefix = "data/"
4842 suffix = ".i"
4849 suffix = ".i"
4843 plen = len(prefix)
4850 plen = len(prefix)
4844 slen = len(suffix)
4851 slen = len(suffix)
4845 lock = repo.lock()
4852 lock = repo.lock()
4846 try:
4853 try:
4847 for fn, b, size in repo.store.datafiles():
4854 for fn, b, size in repo.store.datafiles():
4848 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4855 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4849 res.append(fn[plen:-slen])
4856 res.append(fn[plen:-slen])
4850 finally:
4857 finally:
4851 lock.release()
4858 lock.release()
4852 for f in res:
4859 for f in res:
4853 fm.startitem()
4860 fm.startitem()
4854 fm.write("path", '%s\n', f)
4861 fm.write("path", '%s\n', f)
4855 fm.end()
4862 fm.end()
4856 return
4863 return
4857
4864
4858 if rev and node:
4865 if rev and node:
4859 raise error.Abort(_("please specify just one revision"))
4866 raise error.Abort(_("please specify just one revision"))
4860
4867
4861 if not node:
4868 if not node:
4862 node = rev
4869 node = rev
4863
4870
4864 char = {'l': '@', 'x': '*', '': ''}
4871 char = {'l': '@', 'x': '*', '': ''}
4865 mode = {'l': '644', 'x': '755', '': '644'}
4872 mode = {'l': '644', 'x': '755', '': '644'}
4866 ctx = scmutil.revsingle(repo, node)
4873 ctx = scmutil.revsingle(repo, node)
4867 mf = ctx.manifest()
4874 mf = ctx.manifest()
4868 for f in ctx:
4875 for f in ctx:
4869 fm.startitem()
4876 fm.startitem()
4870 fl = ctx[f].flags()
4877 fl = ctx[f].flags()
4871 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4878 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4872 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4879 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4873 fm.write('path', '%s\n', f)
4880 fm.write('path', '%s\n', f)
4874 fm.end()
4881 fm.end()
4875
4882
4876 @command('^merge',
4883 @command('^merge',
4877 [('f', 'force', None,
4884 [('f', 'force', None,
4878 _('force a merge including outstanding changes (DEPRECATED)')),
4885 _('force a merge including outstanding changes (DEPRECATED)')),
4879 ('r', 'rev', '', _('revision to merge'), _('REV')),
4886 ('r', 'rev', '', _('revision to merge'), _('REV')),
4880 ('P', 'preview', None,
4887 ('P', 'preview', None,
4881 _('review revisions to merge (no merge is performed)'))
4888 _('review revisions to merge (no merge is performed)'))
4882 ] + mergetoolopts,
4889 ] + mergetoolopts,
4883 _('[-P] [-f] [[-r] REV]'))
4890 _('[-P] [-f] [[-r] REV]'))
4884 def merge(ui, repo, node=None, **opts):
4891 def merge(ui, repo, node=None, **opts):
4885 """merge another revision into working directory
4892 """merge another revision into working directory
4886
4893
4887 The current working directory is updated with all changes made in
4894 The current working directory is updated with all changes made in
4888 the requested revision since the last common predecessor revision.
4895 the requested revision since the last common predecessor revision.
4889
4896
4890 Files that changed between either parent are marked as changed for
4897 Files that changed between either parent are marked as changed for
4891 the next commit and a commit must be performed before any further
4898 the next commit and a commit must be performed before any further
4892 updates to the repository are allowed. The next commit will have
4899 updates to the repository are allowed. The next commit will have
4893 two parents.
4900 two parents.
4894
4901
4895 ``--tool`` can be used to specify the merge tool used for file
4902 ``--tool`` can be used to specify the merge tool used for file
4896 merges. It overrides the HGMERGE environment variable and your
4903 merges. It overrides the HGMERGE environment variable and your
4897 configuration files. See :hg:`help merge-tools` for options.
4904 configuration files. See :hg:`help merge-tools` for options.
4898
4905
4899 If no revision is specified, the working directory's parent is a
4906 If no revision is specified, the working directory's parent is a
4900 head revision, and the current branch contains exactly one other
4907 head revision, and the current branch contains exactly one other
4901 head, the other head is merged with by default. Otherwise, an
4908 head, the other head is merged with by default. Otherwise, an
4902 explicit revision with which to merge with must be provided.
4909 explicit revision with which to merge with must be provided.
4903
4910
4904 :hg:`resolve` must be used to resolve unresolved files.
4911 :hg:`resolve` must be used to resolve unresolved files.
4905
4912
4906 To undo an uncommitted merge, use :hg:`update --clean .` which
4913 To undo an uncommitted merge, use :hg:`update --clean .` which
4907 will check out a clean copy of the original merge parent, losing
4914 will check out a clean copy of the original merge parent, losing
4908 all changes.
4915 all changes.
4909
4916
4910 Returns 0 on success, 1 if there are unresolved files.
4917 Returns 0 on success, 1 if there are unresolved files.
4911 """
4918 """
4912
4919
4913 if opts.get('rev') and node:
4920 if opts.get('rev') and node:
4914 raise error.Abort(_("please specify just one revision"))
4921 raise error.Abort(_("please specify just one revision"))
4915 if not node:
4922 if not node:
4916 node = opts.get('rev')
4923 node = opts.get('rev')
4917
4924
4918 if node:
4925 if node:
4919 node = scmutil.revsingle(repo, node).node()
4926 node = scmutil.revsingle(repo, node).node()
4920
4927
4921 if not node:
4928 if not node:
4922 node = repo[destutil.destmerge(repo)].node()
4929 node = repo[destutil.destmerge(repo)].node()
4923
4930
4924 if opts.get('preview'):
4931 if opts.get('preview'):
4925 # find nodes that are ancestors of p2 but not of p1
4932 # find nodes that are ancestors of p2 but not of p1
4926 p1 = repo.lookup('.')
4933 p1 = repo.lookup('.')
4927 p2 = repo.lookup(node)
4934 p2 = repo.lookup(node)
4928 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4935 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4929
4936
4930 displayer = cmdutil.show_changeset(ui, repo, opts)
4937 displayer = cmdutil.show_changeset(ui, repo, opts)
4931 for node in nodes:
4938 for node in nodes:
4932 displayer.show(repo[node])
4939 displayer.show(repo[node])
4933 displayer.close()
4940 displayer.close()
4934 return 0
4941 return 0
4935
4942
4936 try:
4943 try:
4937 # ui.forcemerge is an internal variable, do not document
4944 # ui.forcemerge is an internal variable, do not document
4938 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4945 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4939 return hg.merge(repo, node, force=opts.get('force'))
4946 return hg.merge(repo, node, force=opts.get('force'))
4940 finally:
4947 finally:
4941 ui.setconfig('ui', 'forcemerge', '', 'merge')
4948 ui.setconfig('ui', 'forcemerge', '', 'merge')
4942
4949
4943 @command('outgoing|out',
4950 @command('outgoing|out',
4944 [('f', 'force', None, _('run even when the destination is unrelated')),
4951 [('f', 'force', None, _('run even when the destination is unrelated')),
4945 ('r', 'rev', [],
4952 ('r', 'rev', [],
4946 _('a changeset intended to be included in the destination'), _('REV')),
4953 _('a changeset intended to be included in the destination'), _('REV')),
4947 ('n', 'newest-first', None, _('show newest record first')),
4954 ('n', 'newest-first', None, _('show newest record first')),
4948 ('B', 'bookmarks', False, _('compare bookmarks')),
4955 ('B', 'bookmarks', False, _('compare bookmarks')),
4949 ('b', 'branch', [], _('a specific branch you would like to push'),
4956 ('b', 'branch', [], _('a specific branch you would like to push'),
4950 _('BRANCH')),
4957 _('BRANCH')),
4951 ] + logopts + remoteopts + subrepoopts,
4958 ] + logopts + remoteopts + subrepoopts,
4952 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4959 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4953 def outgoing(ui, repo, dest=None, **opts):
4960 def outgoing(ui, repo, dest=None, **opts):
4954 """show changesets not found in the destination
4961 """show changesets not found in the destination
4955
4962
4956 Show changesets not found in the specified destination repository
4963 Show changesets not found in the specified destination repository
4957 or the default push location. These are the changesets that would
4964 or the default push location. These are the changesets that would
4958 be pushed if a push was requested.
4965 be pushed if a push was requested.
4959
4966
4960 See pull for details of valid destination formats.
4967 See pull for details of valid destination formats.
4961
4968
4962 .. container:: verbose
4969 .. container:: verbose
4963
4970
4964 With -B/--bookmarks, the result of bookmark comparison between
4971 With -B/--bookmarks, the result of bookmark comparison between
4965 local and remote repositories is displayed. With -v/--verbose,
4972 local and remote repositories is displayed. With -v/--verbose,
4966 status is also displayed for each bookmark like below::
4973 status is also displayed for each bookmark like below::
4967
4974
4968 BM1 01234567890a added
4975 BM1 01234567890a added
4969 BM2 deleted
4976 BM2 deleted
4970 BM3 234567890abc advanced
4977 BM3 234567890abc advanced
4971 BM4 34567890abcd diverged
4978 BM4 34567890abcd diverged
4972 BM5 4567890abcde changed
4979 BM5 4567890abcde changed
4973
4980
4974 The action taken when pushing depends on the
4981 The action taken when pushing depends on the
4975 status of each bookmark:
4982 status of each bookmark:
4976
4983
4977 :``added``: push with ``-B`` will create it
4984 :``added``: push with ``-B`` will create it
4978 :``deleted``: push with ``-B`` will delete it
4985 :``deleted``: push with ``-B`` will delete it
4979 :``advanced``: push will update it
4986 :``advanced``: push will update it
4980 :``diverged``: push with ``-B`` will update it
4987 :``diverged``: push with ``-B`` will update it
4981 :``changed``: push with ``-B`` will update it
4988 :``changed``: push with ``-B`` will update it
4982
4989
4983 From the point of view of pushing behavior, bookmarks
4990 From the point of view of pushing behavior, bookmarks
4984 existing only in the remote repository are treated as
4991 existing only in the remote repository are treated as
4985 ``deleted``, even if it is in fact added remotely.
4992 ``deleted``, even if it is in fact added remotely.
4986
4993
4987 Returns 0 if there are outgoing changes, 1 otherwise.
4994 Returns 0 if there are outgoing changes, 1 otherwise.
4988 """
4995 """
4989 if opts.get('graph'):
4996 if opts.get('graph'):
4990 cmdutil.checkunsupportedgraphflags([], opts)
4997 cmdutil.checkunsupportedgraphflags([], opts)
4991 o, other = hg._outgoing(ui, repo, dest, opts)
4998 o, other = hg._outgoing(ui, repo, dest, opts)
4992 if not o:
4999 if not o:
4993 cmdutil.outgoinghooks(ui, repo, other, opts, o)
5000 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4994 return
5001 return
4995
5002
4996 revdag = cmdutil.graphrevs(repo, o, opts)
5003 revdag = cmdutil.graphrevs(repo, o, opts)
4997 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
5004 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4998 showparents = [ctx.node() for ctx in repo[None].parents()]
5005 showparents = [ctx.node() for ctx in repo[None].parents()]
4999 cmdutil.displaygraph(ui, revdag, displayer, showparents,
5006 cmdutil.displaygraph(ui, revdag, displayer, showparents,
5000 graphmod.asciiedges)
5007 graphmod.asciiedges)
5001 cmdutil.outgoinghooks(ui, repo, other, opts, o)
5008 cmdutil.outgoinghooks(ui, repo, other, opts, o)
5002 return 0
5009 return 0
5003
5010
5004 if opts.get('bookmarks'):
5011 if opts.get('bookmarks'):
5005 dest = ui.expandpath(dest or 'default-push', dest or 'default')
5012 dest = ui.expandpath(dest or 'default-push', dest or 'default')
5006 dest, branches = hg.parseurl(dest, opts.get('branch'))
5013 dest, branches = hg.parseurl(dest, opts.get('branch'))
5007 other = hg.peer(repo, opts, dest)
5014 other = hg.peer(repo, opts, dest)
5008 if 'bookmarks' not in other.listkeys('namespaces'):
5015 if 'bookmarks' not in other.listkeys('namespaces'):
5009 ui.warn(_("remote doesn't support bookmarks\n"))
5016 ui.warn(_("remote doesn't support bookmarks\n"))
5010 return 0
5017 return 0
5011 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
5018 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
5012 return bookmarks.outgoing(ui, repo, other)
5019 return bookmarks.outgoing(ui, repo, other)
5013
5020
5014 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
5021 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
5015 try:
5022 try:
5016 return hg.outgoing(ui, repo, dest, opts)
5023 return hg.outgoing(ui, repo, dest, opts)
5017 finally:
5024 finally:
5018 del repo._subtoppath
5025 del repo._subtoppath
5019
5026
5020 @command('parents',
5027 @command('parents',
5021 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
5028 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
5022 ] + templateopts,
5029 ] + templateopts,
5023 _('[-r REV] [FILE]'),
5030 _('[-r REV] [FILE]'),
5024 inferrepo=True)
5031 inferrepo=True)
5025 def parents(ui, repo, file_=None, **opts):
5032 def parents(ui, repo, file_=None, **opts):
5026 """show the parents of the working directory or revision (DEPRECATED)
5033 """show the parents of the working directory or revision (DEPRECATED)
5027
5034
5028 Print the working directory's parent revisions. If a revision is
5035 Print the working directory's parent revisions. If a revision is
5029 given via -r/--rev, the parent of that revision will be printed.
5036 given via -r/--rev, the parent of that revision will be printed.
5030 If a file argument is given, the revision in which the file was
5037 If a file argument is given, the revision in which the file was
5031 last changed (before the working directory revision or the
5038 last changed (before the working directory revision or the
5032 argument to --rev if given) is printed.
5039 argument to --rev if given) is printed.
5033
5040
5034 See :hg:`summary` and :hg:`help revsets` for related information.
5041 See :hg:`summary` and :hg:`help revsets` for related information.
5035
5042
5036 Returns 0 on success.
5043 Returns 0 on success.
5037 """
5044 """
5038
5045
5039 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
5046 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
5040
5047
5041 if file_:
5048 if file_:
5042 m = scmutil.match(ctx, (file_,), opts)
5049 m = scmutil.match(ctx, (file_,), opts)
5043 if m.anypats() or len(m.files()) != 1:
5050 if m.anypats() or len(m.files()) != 1:
5044 raise error.Abort(_('can only specify an explicit filename'))
5051 raise error.Abort(_('can only specify an explicit filename'))
5045 file_ = m.files()[0]
5052 file_ = m.files()[0]
5046 filenodes = []
5053 filenodes = []
5047 for cp in ctx.parents():
5054 for cp in ctx.parents():
5048 if not cp:
5055 if not cp:
5049 continue
5056 continue
5050 try:
5057 try:
5051 filenodes.append(cp.filenode(file_))
5058 filenodes.append(cp.filenode(file_))
5052 except error.LookupError:
5059 except error.LookupError:
5053 pass
5060 pass
5054 if not filenodes:
5061 if not filenodes:
5055 raise error.Abort(_("'%s' not found in manifest!") % file_)
5062 raise error.Abort(_("'%s' not found in manifest!") % file_)
5056 p = []
5063 p = []
5057 for fn in filenodes:
5064 for fn in filenodes:
5058 fctx = repo.filectx(file_, fileid=fn)
5065 fctx = repo.filectx(file_, fileid=fn)
5059 p.append(fctx.node())
5066 p.append(fctx.node())
5060 else:
5067 else:
5061 p = [cp.node() for cp in ctx.parents()]
5068 p = [cp.node() for cp in ctx.parents()]
5062
5069
5063 displayer = cmdutil.show_changeset(ui, repo, opts)
5070 displayer = cmdutil.show_changeset(ui, repo, opts)
5064 for n in p:
5071 for n in p:
5065 if n != nullid:
5072 if n != nullid:
5066 displayer.show(repo[n])
5073 displayer.show(repo[n])
5067 displayer.close()
5074 displayer.close()
5068
5075
5069 @command('paths', [], _('[NAME]'), optionalrepo=True)
5076 @command('paths', [], _('[NAME]'), optionalrepo=True)
5070 def paths(ui, repo, search=None):
5077 def paths(ui, repo, search=None):
5071 """show aliases for remote repositories
5078 """show aliases for remote repositories
5072
5079
5073 Show definition of symbolic path name NAME. If no name is given,
5080 Show definition of symbolic path name NAME. If no name is given,
5074 show definition of all available names.
5081 show definition of all available names.
5075
5082
5076 Option -q/--quiet suppresses all output when searching for NAME
5083 Option -q/--quiet suppresses all output when searching for NAME
5077 and shows only the path names when listing all definitions.
5084 and shows only the path names when listing all definitions.
5078
5085
5079 Path names are defined in the [paths] section of your
5086 Path names are defined in the [paths] section of your
5080 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5087 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
5081 repository, ``.hg/hgrc`` is used, too.
5088 repository, ``.hg/hgrc`` is used, too.
5082
5089
5083 The path names ``default`` and ``default-push`` have a special
5090 The path names ``default`` and ``default-push`` have a special
5084 meaning. When performing a push or pull operation, they are used
5091 meaning. When performing a push or pull operation, they are used
5085 as fallbacks if no location is specified on the command-line.
5092 as fallbacks if no location is specified on the command-line.
5086 When ``default-push`` is set, it will be used for push and
5093 When ``default-push`` is set, it will be used for push and
5087 ``default`` will be used for pull; otherwise ``default`` is used
5094 ``default`` will be used for pull; otherwise ``default`` is used
5088 as the fallback for both. When cloning a repository, the clone
5095 as the fallback for both. When cloning a repository, the clone
5089 source is written as ``default`` in ``.hg/hgrc``. Note that
5096 source is written as ``default`` in ``.hg/hgrc``. Note that
5090 ``default`` and ``default-push`` apply to all inbound (e.g.
5097 ``default`` and ``default-push`` apply to all inbound (e.g.
5091 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
5098 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
5092 :hg:`bundle`) operations.
5099 :hg:`bundle`) operations.
5093
5100
5094 See :hg:`help urls` for more information.
5101 See :hg:`help urls` for more information.
5095
5102
5096 Returns 0 on success.
5103 Returns 0 on success.
5097 """
5104 """
5098 if search:
5105 if search:
5099 for name, path in sorted(ui.paths.iteritems()):
5106 for name, path in sorted(ui.paths.iteritems()):
5100 if name == search:
5107 if name == search:
5101 ui.status("%s\n" % util.hidepassword(path.loc))
5108 ui.status("%s\n" % util.hidepassword(path.loc))
5102 return
5109 return
5103 if not ui.quiet:
5110 if not ui.quiet:
5104 ui.warn(_("not found!\n"))
5111 ui.warn(_("not found!\n"))
5105 return 1
5112 return 1
5106 else:
5113 else:
5107 for name, path in sorted(ui.paths.iteritems()):
5114 for name, path in sorted(ui.paths.iteritems()):
5108 if ui.quiet:
5115 if ui.quiet:
5109 ui.write("%s\n" % name)
5116 ui.write("%s\n" % name)
5110 else:
5117 else:
5111 ui.write("%s = %s\n" % (name,
5118 ui.write("%s = %s\n" % (name,
5112 util.hidepassword(path.loc)))
5119 util.hidepassword(path.loc)))
5113
5120
5114 @command('phase',
5121 @command('phase',
5115 [('p', 'public', False, _('set changeset phase to public')),
5122 [('p', 'public', False, _('set changeset phase to public')),
5116 ('d', 'draft', False, _('set changeset phase to draft')),
5123 ('d', 'draft', False, _('set changeset phase to draft')),
5117 ('s', 'secret', False, _('set changeset phase to secret')),
5124 ('s', 'secret', False, _('set changeset phase to secret')),
5118 ('f', 'force', False, _('allow to move boundary backward')),
5125 ('f', 'force', False, _('allow to move boundary backward')),
5119 ('r', 'rev', [], _('target revision'), _('REV')),
5126 ('r', 'rev', [], _('target revision'), _('REV')),
5120 ],
5127 ],
5121 _('[-p|-d|-s] [-f] [-r] [REV...]'))
5128 _('[-p|-d|-s] [-f] [-r] [REV...]'))
5122 def phase(ui, repo, *revs, **opts):
5129 def phase(ui, repo, *revs, **opts):
5123 """set or show the current phase name
5130 """set or show the current phase name
5124
5131
5125 With no argument, show the phase name of the current revision(s).
5132 With no argument, show the phase name of the current revision(s).
5126
5133
5127 With one of -p/--public, -d/--draft or -s/--secret, change the
5134 With one of -p/--public, -d/--draft or -s/--secret, change the
5128 phase value of the specified revisions.
5135 phase value of the specified revisions.
5129
5136
5130 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
5137 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
5131 lower phase to an higher phase. Phases are ordered as follows::
5138 lower phase to an higher phase. Phases are ordered as follows::
5132
5139
5133 public < draft < secret
5140 public < draft < secret
5134
5141
5135 Returns 0 on success, 1 if some phases could not be changed.
5142 Returns 0 on success, 1 if some phases could not be changed.
5136
5143
5137 (For more information about the phases concept, see :hg:`help phases`.)
5144 (For more information about the phases concept, see :hg:`help phases`.)
5138 """
5145 """
5139 # search for a unique phase argument
5146 # search for a unique phase argument
5140 targetphase = None
5147 targetphase = None
5141 for idx, name in enumerate(phases.phasenames):
5148 for idx, name in enumerate(phases.phasenames):
5142 if opts[name]:
5149 if opts[name]:
5143 if targetphase is not None:
5150 if targetphase is not None:
5144 raise error.Abort(_('only one phase can be specified'))
5151 raise error.Abort(_('only one phase can be specified'))
5145 targetphase = idx
5152 targetphase = idx
5146
5153
5147 # look for specified revision
5154 # look for specified revision
5148 revs = list(revs)
5155 revs = list(revs)
5149 revs.extend(opts['rev'])
5156 revs.extend(opts['rev'])
5150 if not revs:
5157 if not revs:
5151 # display both parents as the second parent phase can influence
5158 # display both parents as the second parent phase can influence
5152 # the phase of a merge commit
5159 # the phase of a merge commit
5153 revs = [c.rev() for c in repo[None].parents()]
5160 revs = [c.rev() for c in repo[None].parents()]
5154
5161
5155 revs = scmutil.revrange(repo, revs)
5162 revs = scmutil.revrange(repo, revs)
5156
5163
5157 lock = None
5164 lock = None
5158 ret = 0
5165 ret = 0
5159 if targetphase is None:
5166 if targetphase is None:
5160 # display
5167 # display
5161 for r in revs:
5168 for r in revs:
5162 ctx = repo[r]
5169 ctx = repo[r]
5163 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5170 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
5164 else:
5171 else:
5165 tr = None
5172 tr = None
5166 lock = repo.lock()
5173 lock = repo.lock()
5167 try:
5174 try:
5168 tr = repo.transaction("phase")
5175 tr = repo.transaction("phase")
5169 # set phase
5176 # set phase
5170 if not revs:
5177 if not revs:
5171 raise error.Abort(_('empty revision set'))
5178 raise error.Abort(_('empty revision set'))
5172 nodes = [repo[r].node() for r in revs]
5179 nodes = [repo[r].node() for r in revs]
5173 # moving revision from public to draft may hide them
5180 # moving revision from public to draft may hide them
5174 # We have to check result on an unfiltered repository
5181 # We have to check result on an unfiltered repository
5175 unfi = repo.unfiltered()
5182 unfi = repo.unfiltered()
5176 getphase = unfi._phasecache.phase
5183 getphase = unfi._phasecache.phase
5177 olddata = [getphase(unfi, r) for r in unfi]
5184 olddata = [getphase(unfi, r) for r in unfi]
5178 phases.advanceboundary(repo, tr, targetphase, nodes)
5185 phases.advanceboundary(repo, tr, targetphase, nodes)
5179 if opts['force']:
5186 if opts['force']:
5180 phases.retractboundary(repo, tr, targetphase, nodes)
5187 phases.retractboundary(repo, tr, targetphase, nodes)
5181 tr.close()
5188 tr.close()
5182 finally:
5189 finally:
5183 if tr is not None:
5190 if tr is not None:
5184 tr.release()
5191 tr.release()
5185 lock.release()
5192 lock.release()
5186 getphase = unfi._phasecache.phase
5193 getphase = unfi._phasecache.phase
5187 newdata = [getphase(unfi, r) for r in unfi]
5194 newdata = [getphase(unfi, r) for r in unfi]
5188 changes = sum(newdata[r] != olddata[r] for r in unfi)
5195 changes = sum(newdata[r] != olddata[r] for r in unfi)
5189 cl = unfi.changelog
5196 cl = unfi.changelog
5190 rejected = [n for n in nodes
5197 rejected = [n for n in nodes
5191 if newdata[cl.rev(n)] < targetphase]
5198 if newdata[cl.rev(n)] < targetphase]
5192 if rejected:
5199 if rejected:
5193 ui.warn(_('cannot move %i changesets to a higher '
5200 ui.warn(_('cannot move %i changesets to a higher '
5194 'phase, use --force\n') % len(rejected))
5201 'phase, use --force\n') % len(rejected))
5195 ret = 1
5202 ret = 1
5196 if changes:
5203 if changes:
5197 msg = _('phase changed for %i changesets\n') % changes
5204 msg = _('phase changed for %i changesets\n') % changes
5198 if ret:
5205 if ret:
5199 ui.status(msg)
5206 ui.status(msg)
5200 else:
5207 else:
5201 ui.note(msg)
5208 ui.note(msg)
5202 else:
5209 else:
5203 ui.warn(_('no phases changed\n'))
5210 ui.warn(_('no phases changed\n'))
5204 return ret
5211 return ret
5205
5212
5206 def postincoming(ui, repo, modheads, optupdate, checkout):
5213 def postincoming(ui, repo, modheads, optupdate, checkout):
5207 if modheads == 0:
5214 if modheads == 0:
5208 return
5215 return
5209 if optupdate:
5216 if optupdate:
5210 try:
5217 try:
5211 brev = checkout
5218 brev = checkout
5212 movemarkfrom = None
5219 movemarkfrom = None
5213 if not checkout:
5220 if not checkout:
5214 updata = destutil.destupdate(repo)
5221 updata = destutil.destupdate(repo)
5215 checkout, movemarkfrom, brev = updata
5222 checkout, movemarkfrom, brev = updata
5216 ret = hg.update(repo, checkout)
5223 ret = hg.update(repo, checkout)
5217 except error.UpdateAbort as inst:
5224 except error.UpdateAbort as inst:
5218 ui.warn(_("not updating: %s\n") % str(inst))
5225 ui.warn(_("not updating: %s\n") % str(inst))
5219 if inst.hint:
5226 if inst.hint:
5220 ui.warn(_("(%s)\n") % inst.hint)
5227 ui.warn(_("(%s)\n") % inst.hint)
5221 return 0
5228 return 0
5222 if not ret and not checkout:
5229 if not ret and not checkout:
5223 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
5230 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
5224 ui.status(_("updating bookmark %s\n") % repo._activebookmark)
5231 ui.status(_("updating bookmark %s\n") % repo._activebookmark)
5225 return ret
5232 return ret
5226 if modheads > 1:
5233 if modheads > 1:
5227 currentbranchheads = len(repo.branchheads())
5234 currentbranchheads = len(repo.branchheads())
5228 if currentbranchheads == modheads:
5235 if currentbranchheads == modheads:
5229 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
5236 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
5230 elif currentbranchheads > 1:
5237 elif currentbranchheads > 1:
5231 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
5238 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
5232 "merge)\n"))
5239 "merge)\n"))
5233 else:
5240 else:
5234 ui.status(_("(run 'hg heads' to see heads)\n"))
5241 ui.status(_("(run 'hg heads' to see heads)\n"))
5235 else:
5242 else:
5236 ui.status(_("(run 'hg update' to get a working copy)\n"))
5243 ui.status(_("(run 'hg update' to get a working copy)\n"))
5237
5244
5238 @command('^pull',
5245 @command('^pull',
5239 [('u', 'update', None,
5246 [('u', 'update', None,
5240 _('update to new branch head if changesets were pulled')),
5247 _('update to new branch head if changesets were pulled')),
5241 ('f', 'force', None, _('run even when remote repository is unrelated')),
5248 ('f', 'force', None, _('run even when remote repository is unrelated')),
5242 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
5249 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
5243 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
5250 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
5244 ('b', 'branch', [], _('a specific branch you would like to pull'),
5251 ('b', 'branch', [], _('a specific branch you would like to pull'),
5245 _('BRANCH')),
5252 _('BRANCH')),
5246 ] + remoteopts,
5253 ] + remoteopts,
5247 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
5254 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
5248 def pull(ui, repo, source="default", **opts):
5255 def pull(ui, repo, source="default", **opts):
5249 """pull changes from the specified source
5256 """pull changes from the specified source
5250
5257
5251 Pull changes from a remote repository to a local one.
5258 Pull changes from a remote repository to a local one.
5252
5259
5253 This finds all changes from the repository at the specified path
5260 This finds all changes from the repository at the specified path
5254 or URL and adds them to a local repository (the current one unless
5261 or URL and adds them to a local repository (the current one unless
5255 -R is specified). By default, this does not update the copy of the
5262 -R is specified). By default, this does not update the copy of the
5256 project in the working directory.
5263 project in the working directory.
5257
5264
5258 Use :hg:`incoming` if you want to see what would have been added
5265 Use :hg:`incoming` if you want to see what would have been added
5259 by a pull at the time you issued this command. If you then decide
5266 by a pull at the time you issued this command. If you then decide
5260 to add those changes to the repository, you should use :hg:`pull
5267 to add those changes to the repository, you should use :hg:`pull
5261 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5268 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
5262
5269
5263 If SOURCE is omitted, the 'default' path will be used.
5270 If SOURCE is omitted, the 'default' path will be used.
5264 See :hg:`help urls` for more information.
5271 See :hg:`help urls` for more information.
5265
5272
5266 Returns 0 on success, 1 if an update had unresolved files.
5273 Returns 0 on success, 1 if an update had unresolved files.
5267 """
5274 """
5268 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
5275 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
5269 ui.status(_('pulling from %s\n') % util.hidepassword(source))
5276 ui.status(_('pulling from %s\n') % util.hidepassword(source))
5270 other = hg.peer(repo, opts, source)
5277 other = hg.peer(repo, opts, source)
5271 try:
5278 try:
5272 revs, checkout = hg.addbranchrevs(repo, other, branches,
5279 revs, checkout = hg.addbranchrevs(repo, other, branches,
5273 opts.get('rev'))
5280 opts.get('rev'))
5274
5281
5275
5282
5276 pullopargs = {}
5283 pullopargs = {}
5277 if opts.get('bookmark'):
5284 if opts.get('bookmark'):
5278 if not revs:
5285 if not revs:
5279 revs = []
5286 revs = []
5280 # The list of bookmark used here is not the one used to actually
5287 # The list of bookmark used here is not the one used to actually
5281 # update the bookmark name. This can result in the revision pulled
5288 # update the bookmark name. This can result in the revision pulled
5282 # not ending up with the name of the bookmark because of a race
5289 # not ending up with the name of the bookmark because of a race
5283 # condition on the server. (See issue 4689 for details)
5290 # condition on the server. (See issue 4689 for details)
5284 remotebookmarks = other.listkeys('bookmarks')
5291 remotebookmarks = other.listkeys('bookmarks')
5285 pullopargs['remotebookmarks'] = remotebookmarks
5292 pullopargs['remotebookmarks'] = remotebookmarks
5286 for b in opts['bookmark']:
5293 for b in opts['bookmark']:
5287 if b not in remotebookmarks:
5294 if b not in remotebookmarks:
5288 raise error.Abort(_('remote bookmark %s not found!') % b)
5295 raise error.Abort(_('remote bookmark %s not found!') % b)
5289 revs.append(remotebookmarks[b])
5296 revs.append(remotebookmarks[b])
5290
5297
5291 if revs:
5298 if revs:
5292 try:
5299 try:
5293 # When 'rev' is a bookmark name, we cannot guarantee that it
5300 # When 'rev' is a bookmark name, we cannot guarantee that it
5294 # will be updated with that name because of a race condition
5301 # will be updated with that name because of a race condition
5295 # server side. (See issue 4689 for details)
5302 # server side. (See issue 4689 for details)
5296 oldrevs = revs
5303 oldrevs = revs
5297 revs = [] # actually, nodes
5304 revs = [] # actually, nodes
5298 for r in oldrevs:
5305 for r in oldrevs:
5299 node = other.lookup(r)
5306 node = other.lookup(r)
5300 revs.append(node)
5307 revs.append(node)
5301 if r == checkout:
5308 if r == checkout:
5302 checkout = node
5309 checkout = node
5303 except error.CapabilityError:
5310 except error.CapabilityError:
5304 err = _("other repository doesn't support revision lookup, "
5311 err = _("other repository doesn't support revision lookup, "
5305 "so a rev cannot be specified.")
5312 "so a rev cannot be specified.")
5306 raise error.Abort(err)
5313 raise error.Abort(err)
5307
5314
5308 modheads = exchange.pull(repo, other, heads=revs,
5315 modheads = exchange.pull(repo, other, heads=revs,
5309 force=opts.get('force'),
5316 force=opts.get('force'),
5310 bookmarks=opts.get('bookmark', ()),
5317 bookmarks=opts.get('bookmark', ()),
5311 opargs=pullopargs).cgresult
5318 opargs=pullopargs).cgresult
5312 if checkout:
5319 if checkout:
5313 checkout = str(repo.changelog.rev(checkout))
5320 checkout = str(repo.changelog.rev(checkout))
5314 repo._subtoppath = source
5321 repo._subtoppath = source
5315 try:
5322 try:
5316 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
5323 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
5317
5324
5318 finally:
5325 finally:
5319 del repo._subtoppath
5326 del repo._subtoppath
5320
5327
5321 finally:
5328 finally:
5322 other.close()
5329 other.close()
5323 return ret
5330 return ret
5324
5331
5325 @command('^push',
5332 @command('^push',
5326 [('f', 'force', None, _('force push')),
5333 [('f', 'force', None, _('force push')),
5327 ('r', 'rev', [],
5334 ('r', 'rev', [],
5328 _('a changeset intended to be included in the destination'),
5335 _('a changeset intended to be included in the destination'),
5329 _('REV')),
5336 _('REV')),
5330 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
5337 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
5331 ('b', 'branch', [],
5338 ('b', 'branch', [],
5332 _('a specific branch you would like to push'), _('BRANCH')),
5339 _('a specific branch you would like to push'), _('BRANCH')),
5333 ('', 'new-branch', False, _('allow pushing a new branch')),
5340 ('', 'new-branch', False, _('allow pushing a new branch')),
5334 ] + remoteopts,
5341 ] + remoteopts,
5335 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
5342 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
5336 def push(ui, repo, dest=None, **opts):
5343 def push(ui, repo, dest=None, **opts):
5337 """push changes to the specified destination
5344 """push changes to the specified destination
5338
5345
5339 Push changesets from the local repository to the specified
5346 Push changesets from the local repository to the specified
5340 destination.
5347 destination.
5341
5348
5342 This operation is symmetrical to pull: it is identical to a pull
5349 This operation is symmetrical to pull: it is identical to a pull
5343 in the destination repository from the current one.
5350 in the destination repository from the current one.
5344
5351
5345 By default, push will not allow creation of new heads at the
5352 By default, push will not allow creation of new heads at the
5346 destination, since multiple heads would make it unclear which head
5353 destination, since multiple heads would make it unclear which head
5347 to use. In this situation, it is recommended to pull and merge
5354 to use. In this situation, it is recommended to pull and merge
5348 before pushing.
5355 before pushing.
5349
5356
5350 Use --new-branch if you want to allow push to create a new named
5357 Use --new-branch if you want to allow push to create a new named
5351 branch that is not present at the destination. This allows you to
5358 branch that is not present at the destination. This allows you to
5352 only create a new branch without forcing other changes.
5359 only create a new branch without forcing other changes.
5353
5360
5354 .. note::
5361 .. note::
5355
5362
5356 Extra care should be taken with the -f/--force option,
5363 Extra care should be taken with the -f/--force option,
5357 which will push all new heads on all branches, an action which will
5364 which will push all new heads on all branches, an action which will
5358 almost always cause confusion for collaborators.
5365 almost always cause confusion for collaborators.
5359
5366
5360 If -r/--rev is used, the specified revision and all its ancestors
5367 If -r/--rev is used, the specified revision and all its ancestors
5361 will be pushed to the remote repository.
5368 will be pushed to the remote repository.
5362
5369
5363 If -B/--bookmark is used, the specified bookmarked revision, its
5370 If -B/--bookmark is used, the specified bookmarked revision, its
5364 ancestors, and the bookmark will be pushed to the remote
5371 ancestors, and the bookmark will be pushed to the remote
5365 repository.
5372 repository.
5366
5373
5367 Please see :hg:`help urls` for important details about ``ssh://``
5374 Please see :hg:`help urls` for important details about ``ssh://``
5368 URLs. If DESTINATION is omitted, a default path will be used.
5375 URLs. If DESTINATION is omitted, a default path will be used.
5369
5376
5370 Returns 0 if push was successful, 1 if nothing to push.
5377 Returns 0 if push was successful, 1 if nothing to push.
5371 """
5378 """
5372
5379
5373 if opts.get('bookmark'):
5380 if opts.get('bookmark'):
5374 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
5381 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
5375 for b in opts['bookmark']:
5382 for b in opts['bookmark']:
5376 # translate -B options to -r so changesets get pushed
5383 # translate -B options to -r so changesets get pushed
5377 if b in repo._bookmarks:
5384 if b in repo._bookmarks:
5378 opts.setdefault('rev', []).append(b)
5385 opts.setdefault('rev', []).append(b)
5379 else:
5386 else:
5380 # if we try to push a deleted bookmark, translate it to null
5387 # if we try to push a deleted bookmark, translate it to null
5381 # this lets simultaneous -r, -b options continue working
5388 # this lets simultaneous -r, -b options continue working
5382 opts.setdefault('rev', []).append("null")
5389 opts.setdefault('rev', []).append("null")
5383
5390
5384 path = ui.paths.getpath(dest, default='default')
5391 path = ui.paths.getpath(dest, default='default')
5385 if not path:
5392 if not path:
5386 raise error.Abort(_('default repository not configured!'),
5393 raise error.Abort(_('default repository not configured!'),
5387 hint=_('see the "path" section in "hg help config"'))
5394 hint=_('see the "path" section in "hg help config"'))
5388 dest, branches = path.pushloc, (path.branch, opts.get('branch') or [])
5395 dest, branches = path.pushloc, (path.branch, opts.get('branch') or [])
5389 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
5396 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
5390 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
5397 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
5391 other = hg.peer(repo, opts, dest)
5398 other = hg.peer(repo, opts, dest)
5392
5399
5393 if revs:
5400 if revs:
5394 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
5401 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
5395 if not revs:
5402 if not revs:
5396 raise error.Abort(_("specified revisions evaluate to an empty set"),
5403 raise error.Abort(_("specified revisions evaluate to an empty set"),
5397 hint=_("use different revision arguments"))
5404 hint=_("use different revision arguments"))
5398
5405
5399 repo._subtoppath = dest
5406 repo._subtoppath = dest
5400 try:
5407 try:
5401 # push subrepos depth-first for coherent ordering
5408 # push subrepos depth-first for coherent ordering
5402 c = repo['']
5409 c = repo['']
5403 subs = c.substate # only repos that are committed
5410 subs = c.substate # only repos that are committed
5404 for s in sorted(subs):
5411 for s in sorted(subs):
5405 result = c.sub(s).push(opts)
5412 result = c.sub(s).push(opts)
5406 if result == 0:
5413 if result == 0:
5407 return not result
5414 return not result
5408 finally:
5415 finally:
5409 del repo._subtoppath
5416 del repo._subtoppath
5410 pushop = exchange.push(repo, other, opts.get('force'), revs=revs,
5417 pushop = exchange.push(repo, other, opts.get('force'), revs=revs,
5411 newbranch=opts.get('new_branch'),
5418 newbranch=opts.get('new_branch'),
5412 bookmarks=opts.get('bookmark', ()))
5419 bookmarks=opts.get('bookmark', ()))
5413
5420
5414 result = not pushop.cgresult
5421 result = not pushop.cgresult
5415
5422
5416 if pushop.bkresult is not None:
5423 if pushop.bkresult is not None:
5417 if pushop.bkresult == 2:
5424 if pushop.bkresult == 2:
5418 result = 2
5425 result = 2
5419 elif not result and pushop.bkresult:
5426 elif not result and pushop.bkresult:
5420 result = 2
5427 result = 2
5421
5428
5422 return result
5429 return result
5423
5430
5424 @command('recover', [])
5431 @command('recover', [])
5425 def recover(ui, repo):
5432 def recover(ui, repo):
5426 """roll back an interrupted transaction
5433 """roll back an interrupted transaction
5427
5434
5428 Recover from an interrupted commit or pull.
5435 Recover from an interrupted commit or pull.
5429
5436
5430 This command tries to fix the repository status after an
5437 This command tries to fix the repository status after an
5431 interrupted operation. It should only be necessary when Mercurial
5438 interrupted operation. It should only be necessary when Mercurial
5432 suggests it.
5439 suggests it.
5433
5440
5434 Returns 0 if successful, 1 if nothing to recover or verify fails.
5441 Returns 0 if successful, 1 if nothing to recover or verify fails.
5435 """
5442 """
5436 if repo.recover():
5443 if repo.recover():
5437 return hg.verify(repo)
5444 return hg.verify(repo)
5438 return 1
5445 return 1
5439
5446
5440 @command('^remove|rm',
5447 @command('^remove|rm',
5441 [('A', 'after', None, _('record delete for missing files')),
5448 [('A', 'after', None, _('record delete for missing files')),
5442 ('f', 'force', None,
5449 ('f', 'force', None,
5443 _('remove (and delete) file even if added or modified')),
5450 _('remove (and delete) file even if added or modified')),
5444 ] + subrepoopts + walkopts,
5451 ] + subrepoopts + walkopts,
5445 _('[OPTION]... FILE...'),
5452 _('[OPTION]... FILE...'),
5446 inferrepo=True)
5453 inferrepo=True)
5447 def remove(ui, repo, *pats, **opts):
5454 def remove(ui, repo, *pats, **opts):
5448 """remove the specified files on the next commit
5455 """remove the specified files on the next commit
5449
5456
5450 Schedule the indicated files for removal from the current branch.
5457 Schedule the indicated files for removal from the current branch.
5451
5458
5452 This command schedules the files to be removed at the next commit.
5459 This command schedules the files to be removed at the next commit.
5453 To undo a remove before that, see :hg:`revert`. To undo added
5460 To undo a remove before that, see :hg:`revert`. To undo added
5454 files, see :hg:`forget`.
5461 files, see :hg:`forget`.
5455
5462
5456 .. container:: verbose
5463 .. container:: verbose
5457
5464
5458 -A/--after can be used to remove only files that have already
5465 -A/--after can be used to remove only files that have already
5459 been deleted, -f/--force can be used to force deletion, and -Af
5466 been deleted, -f/--force can be used to force deletion, and -Af
5460 can be used to remove files from the next revision without
5467 can be used to remove files from the next revision without
5461 deleting them from the working directory.
5468 deleting them from the working directory.
5462
5469
5463 The following table details the behavior of remove for different
5470 The following table details the behavior of remove for different
5464 file states (columns) and option combinations (rows). The file
5471 file states (columns) and option combinations (rows). The file
5465 states are Added [A], Clean [C], Modified [M] and Missing [!]
5472 states are Added [A], Clean [C], Modified [M] and Missing [!]
5466 (as reported by :hg:`status`). The actions are Warn, Remove
5473 (as reported by :hg:`status`). The actions are Warn, Remove
5467 (from branch) and Delete (from disk):
5474 (from branch) and Delete (from disk):
5468
5475
5469 ========= == == == ==
5476 ========= == == == ==
5470 opt/state A C M !
5477 opt/state A C M !
5471 ========= == == == ==
5478 ========= == == == ==
5472 none W RD W R
5479 none W RD W R
5473 -f R RD RD R
5480 -f R RD RD R
5474 -A W W W R
5481 -A W W W R
5475 -Af R R R R
5482 -Af R R R R
5476 ========= == == == ==
5483 ========= == == == ==
5477
5484
5478 Note that remove never deletes files in Added [A] state from the
5485 Note that remove never deletes files in Added [A] state from the
5479 working directory, not even if option --force is specified.
5486 working directory, not even if option --force is specified.
5480
5487
5481 Returns 0 on success, 1 if any warnings encountered.
5488 Returns 0 on success, 1 if any warnings encountered.
5482 """
5489 """
5483
5490
5484 after, force = opts.get('after'), opts.get('force')
5491 after, force = opts.get('after'), opts.get('force')
5485 if not pats and not after:
5492 if not pats and not after:
5486 raise error.Abort(_('no files specified'))
5493 raise error.Abort(_('no files specified'))
5487
5494
5488 m = scmutil.match(repo[None], pats, opts)
5495 m = scmutil.match(repo[None], pats, opts)
5489 subrepos = opts.get('subrepos')
5496 subrepos = opts.get('subrepos')
5490 return cmdutil.remove(ui, repo, m, "", after, force, subrepos)
5497 return cmdutil.remove(ui, repo, m, "", after, force, subrepos)
5491
5498
5492 @command('rename|move|mv',
5499 @command('rename|move|mv',
5493 [('A', 'after', None, _('record a rename that has already occurred')),
5500 [('A', 'after', None, _('record a rename that has already occurred')),
5494 ('f', 'force', None, _('forcibly copy over an existing managed file')),
5501 ('f', 'force', None, _('forcibly copy over an existing managed file')),
5495 ] + walkopts + dryrunopts,
5502 ] + walkopts + dryrunopts,
5496 _('[OPTION]... SOURCE... DEST'))
5503 _('[OPTION]... SOURCE... DEST'))
5497 def rename(ui, repo, *pats, **opts):
5504 def rename(ui, repo, *pats, **opts):
5498 """rename files; equivalent of copy + remove
5505 """rename files; equivalent of copy + remove
5499
5506
5500 Mark dest as copies of sources; mark sources for deletion. If dest
5507 Mark dest as copies of sources; mark sources for deletion. If dest
5501 is a directory, copies are put in that directory. If dest is a
5508 is a directory, copies are put in that directory. If dest is a
5502 file, there can only be one source.
5509 file, there can only be one source.
5503
5510
5504 By default, this command copies the contents of files as they
5511 By default, this command copies the contents of files as they
5505 exist in the working directory. If invoked with -A/--after, the
5512 exist in the working directory. If invoked with -A/--after, the
5506 operation is recorded, but no copying is performed.
5513 operation is recorded, but no copying is performed.
5507
5514
5508 This command takes effect at the next commit. To undo a rename
5515 This command takes effect at the next commit. To undo a rename
5509 before that, see :hg:`revert`.
5516 before that, see :hg:`revert`.
5510
5517
5511 Returns 0 on success, 1 if errors are encountered.
5518 Returns 0 on success, 1 if errors are encountered.
5512 """
5519 """
5513 wlock = repo.wlock(False)
5520 wlock = repo.wlock(False)
5514 try:
5521 try:
5515 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5522 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5516 finally:
5523 finally:
5517 wlock.release()
5524 wlock.release()
5518
5525
5519 @command('resolve',
5526 @command('resolve',
5520 [('a', 'all', None, _('select all unresolved files')),
5527 [('a', 'all', None, _('select all unresolved files')),
5521 ('l', 'list', None, _('list state of files needing merge')),
5528 ('l', 'list', None, _('list state of files needing merge')),
5522 ('m', 'mark', None, _('mark files as resolved')),
5529 ('m', 'mark', None, _('mark files as resolved')),
5523 ('u', 'unmark', None, _('mark files as unresolved')),
5530 ('u', 'unmark', None, _('mark files as unresolved')),
5524 ('n', 'no-status', None, _('hide status prefix'))]
5531 ('n', 'no-status', None, _('hide status prefix'))]
5525 + mergetoolopts + walkopts + formatteropts,
5532 + mergetoolopts + walkopts + formatteropts,
5526 _('[OPTION]... [FILE]...'),
5533 _('[OPTION]... [FILE]...'),
5527 inferrepo=True)
5534 inferrepo=True)
5528 def resolve(ui, repo, *pats, **opts):
5535 def resolve(ui, repo, *pats, **opts):
5529 """redo merges or set/view the merge status of files
5536 """redo merges or set/view the merge status of files
5530
5537
5531 Merges with unresolved conflicts are often the result of
5538 Merges with unresolved conflicts are often the result of
5532 non-interactive merging using the ``internal:merge`` configuration
5539 non-interactive merging using the ``internal:merge`` configuration
5533 setting, or a command-line merge tool like ``diff3``. The resolve
5540 setting, or a command-line merge tool like ``diff3``. The resolve
5534 command is used to manage the files involved in a merge, after
5541 command is used to manage the files involved in a merge, after
5535 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5542 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5536 working directory must have two parents). See :hg:`help
5543 working directory must have two parents). See :hg:`help
5537 merge-tools` for information on configuring merge tools.
5544 merge-tools` for information on configuring merge tools.
5538
5545
5539 The resolve command can be used in the following ways:
5546 The resolve command can be used in the following ways:
5540
5547
5541 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
5548 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
5542 files, discarding any previous merge attempts. Re-merging is not
5549 files, discarding any previous merge attempts. Re-merging is not
5543 performed for files already marked as resolved. Use ``--all/-a``
5550 performed for files already marked as resolved. Use ``--all/-a``
5544 to select all unresolved files. ``--tool`` can be used to specify
5551 to select all unresolved files. ``--tool`` can be used to specify
5545 the merge tool used for the given files. It overrides the HGMERGE
5552 the merge tool used for the given files. It overrides the HGMERGE
5546 environment variable and your configuration files. Previous file
5553 environment variable and your configuration files. Previous file
5547 contents are saved with a ``.orig`` suffix.
5554 contents are saved with a ``.orig`` suffix.
5548
5555
5549 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5556 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5550 (e.g. after having manually fixed-up the files). The default is
5557 (e.g. after having manually fixed-up the files). The default is
5551 to mark all unresolved files.
5558 to mark all unresolved files.
5552
5559
5553 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5560 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5554 default is to mark all resolved files.
5561 default is to mark all resolved files.
5555
5562
5556 - :hg:`resolve -l`: list files which had or still have conflicts.
5563 - :hg:`resolve -l`: list files which had or still have conflicts.
5557 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5564 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5558
5565
5559 Note that Mercurial will not let you commit files with unresolved
5566 Note that Mercurial will not let you commit files with unresolved
5560 merge conflicts. You must use :hg:`resolve -m ...` before you can
5567 merge conflicts. You must use :hg:`resolve -m ...` before you can
5561 commit after a conflicting merge.
5568 commit after a conflicting merge.
5562
5569
5563 Returns 0 on success, 1 if any files fail a resolve attempt.
5570 Returns 0 on success, 1 if any files fail a resolve attempt.
5564 """
5571 """
5565
5572
5566 all, mark, unmark, show, nostatus = \
5573 all, mark, unmark, show, nostatus = \
5567 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
5574 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
5568
5575
5569 if (show and (mark or unmark)) or (mark and unmark):
5576 if (show and (mark or unmark)) or (mark and unmark):
5570 raise error.Abort(_("too many options specified"))
5577 raise error.Abort(_("too many options specified"))
5571 if pats and all:
5578 if pats and all:
5572 raise error.Abort(_("can't specify --all and patterns"))
5579 raise error.Abort(_("can't specify --all and patterns"))
5573 if not (all or pats or show or mark or unmark):
5580 if not (all or pats or show or mark or unmark):
5574 raise error.Abort(_('no files or directories specified'),
5581 raise error.Abort(_('no files or directories specified'),
5575 hint=('use --all to re-merge all unresolved files'))
5582 hint=('use --all to re-merge all unresolved files'))
5576
5583
5577 if show:
5584 if show:
5578 fm = ui.formatter('resolve', opts)
5585 fm = ui.formatter('resolve', opts)
5579 ms = mergemod.mergestate(repo)
5586 ms = mergemod.mergestate(repo)
5580 m = scmutil.match(repo[None], pats, opts)
5587 m = scmutil.match(repo[None], pats, opts)
5581 for f in ms:
5588 for f in ms:
5582 if not m(f):
5589 if not m(f):
5583 continue
5590 continue
5584 l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved'}[ms[f]]
5591 l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved'}[ms[f]]
5585 fm.startitem()
5592 fm.startitem()
5586 fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
5593 fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
5587 fm.write('path', '%s\n', f, label=l)
5594 fm.write('path', '%s\n', f, label=l)
5588 fm.end()
5595 fm.end()
5589 return 0
5596 return 0
5590
5597
5591 wlock = repo.wlock()
5598 wlock = repo.wlock()
5592 try:
5599 try:
5593 ms = mergemod.mergestate(repo)
5600 ms = mergemod.mergestate(repo)
5594
5601
5595 if not (ms.active() or repo.dirstate.p2() != nullid):
5602 if not (ms.active() or repo.dirstate.p2() != nullid):
5596 raise error.Abort(
5603 raise error.Abort(
5597 _('resolve command not applicable when not merging'))
5604 _('resolve command not applicable when not merging'))
5598
5605
5599 m = scmutil.match(repo[None], pats, opts)
5606 m = scmutil.match(repo[None], pats, opts)
5600 ret = 0
5607 ret = 0
5601 didwork = False
5608 didwork = False
5602
5609
5603 tocomplete = []
5610 tocomplete = []
5604 for f in ms:
5611 for f in ms:
5605 if not m(f):
5612 if not m(f):
5606 continue
5613 continue
5607
5614
5608 didwork = True
5615 didwork = True
5609
5616
5610 if mark:
5617 if mark:
5611 ms.mark(f, "r")
5618 ms.mark(f, "r")
5612 elif unmark:
5619 elif unmark:
5613 ms.mark(f, "u")
5620 ms.mark(f, "u")
5614 else:
5621 else:
5615 wctx = repo[None]
5622 wctx = repo[None]
5616
5623
5617 # backup pre-resolve (merge uses .orig for its own purposes)
5624 # backup pre-resolve (merge uses .orig for its own purposes)
5618 a = repo.wjoin(f)
5625 a = repo.wjoin(f)
5619 util.copyfile(a, a + ".resolve")
5626 util.copyfile(a, a + ".resolve")
5620
5627
5621 try:
5628 try:
5622 # preresolve file
5629 # preresolve file
5623 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5630 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5624 'resolve')
5631 'resolve')
5625 complete, r = ms.preresolve(f, wctx)
5632 complete, r = ms.preresolve(f, wctx)
5626 if not complete:
5633 if not complete:
5627 tocomplete.append(f)
5634 tocomplete.append(f)
5628 elif r:
5635 elif r:
5629 ret = 1
5636 ret = 1
5630 finally:
5637 finally:
5631 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5638 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5632 ms.commit()
5639 ms.commit()
5633
5640
5634 # replace filemerge's .orig file with our resolve file
5641 # replace filemerge's .orig file with our resolve file
5635 # for files in tocomplete, ms.resolve will not overwrite
5642 # for files in tocomplete, ms.resolve will not overwrite
5636 # .orig -- only preresolve does
5643 # .orig -- only preresolve does
5637 util.rename(a + ".resolve", a + ".orig")
5644 util.rename(a + ".resolve", a + ".orig")
5638
5645
5639 for f in tocomplete:
5646 for f in tocomplete:
5640 try:
5647 try:
5641 # resolve file
5648 # resolve file
5642 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5649 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5643 'resolve')
5650 'resolve')
5644 r = ms.resolve(f, wctx)
5651 r = ms.resolve(f, wctx)
5645 if r:
5652 if r:
5646 ret = 1
5653 ret = 1
5647 finally:
5654 finally:
5648 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5655 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5649 ms.commit()
5656 ms.commit()
5650
5657
5651 ms.commit()
5658 ms.commit()
5652
5659
5653 if not didwork and pats:
5660 if not didwork and pats:
5654 ui.warn(_("arguments do not match paths that need resolving\n"))
5661 ui.warn(_("arguments do not match paths that need resolving\n"))
5655
5662
5656 finally:
5663 finally:
5657 wlock.release()
5664 wlock.release()
5658
5665
5659 # Nudge users into finishing an unfinished operation
5666 # Nudge users into finishing an unfinished operation
5660 if not list(ms.unresolved()):
5667 if not list(ms.unresolved()):
5661 ui.status(_('(no more unresolved files)\n'))
5668 ui.status(_('(no more unresolved files)\n'))
5662
5669
5663 return ret
5670 return ret
5664
5671
5665 @command('revert',
5672 @command('revert',
5666 [('a', 'all', None, _('revert all changes when no arguments given')),
5673 [('a', 'all', None, _('revert all changes when no arguments given')),
5667 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5674 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5668 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5675 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5669 ('C', 'no-backup', None, _('do not save backup copies of files')),
5676 ('C', 'no-backup', None, _('do not save backup copies of files')),
5670 ('i', 'interactive', None,
5677 ('i', 'interactive', None,
5671 _('interactively select the changes (EXPERIMENTAL)')),
5678 _('interactively select the changes (EXPERIMENTAL)')),
5672 ] + walkopts + dryrunopts,
5679 ] + walkopts + dryrunopts,
5673 _('[OPTION]... [-r REV] [NAME]...'))
5680 _('[OPTION]... [-r REV] [NAME]...'))
5674 def revert(ui, repo, *pats, **opts):
5681 def revert(ui, repo, *pats, **opts):
5675 """restore files to their checkout state
5682 """restore files to their checkout state
5676
5683
5677 .. note::
5684 .. note::
5678
5685
5679 To check out earlier revisions, you should use :hg:`update REV`.
5686 To check out earlier revisions, you should use :hg:`update REV`.
5680 To cancel an uncommitted merge (and lose your changes),
5687 To cancel an uncommitted merge (and lose your changes),
5681 use :hg:`update --clean .`.
5688 use :hg:`update --clean .`.
5682
5689
5683 With no revision specified, revert the specified files or directories
5690 With no revision specified, revert the specified files or directories
5684 to the contents they had in the parent of the working directory.
5691 to the contents they had in the parent of the working directory.
5685 This restores the contents of files to an unmodified
5692 This restores the contents of files to an unmodified
5686 state and unschedules adds, removes, copies, and renames. If the
5693 state and unschedules adds, removes, copies, and renames. If the
5687 working directory has two parents, you must explicitly specify a
5694 working directory has two parents, you must explicitly specify a
5688 revision.
5695 revision.
5689
5696
5690 Using the -r/--rev or -d/--date options, revert the given files or
5697 Using the -r/--rev or -d/--date options, revert the given files or
5691 directories to their states as of a specific revision. Because
5698 directories to their states as of a specific revision. Because
5692 revert does not change the working directory parents, this will
5699 revert does not change the working directory parents, this will
5693 cause these files to appear modified. This can be helpful to "back
5700 cause these files to appear modified. This can be helpful to "back
5694 out" some or all of an earlier change. See :hg:`backout` for a
5701 out" some or all of an earlier change. See :hg:`backout` for a
5695 related method.
5702 related method.
5696
5703
5697 Modified files are saved with a .orig suffix before reverting.
5704 Modified files are saved with a .orig suffix before reverting.
5698 To disable these backups, use --no-backup.
5705 To disable these backups, use --no-backup.
5699
5706
5700 See :hg:`help dates` for a list of formats valid for -d/--date.
5707 See :hg:`help dates` for a list of formats valid for -d/--date.
5701
5708
5702 See :hg:`help backout` for a way to reverse the effect of an
5709 See :hg:`help backout` for a way to reverse the effect of an
5703 earlier changeset.
5710 earlier changeset.
5704
5711
5705 Returns 0 on success.
5712 Returns 0 on success.
5706 """
5713 """
5707
5714
5708 if opts.get("date"):
5715 if opts.get("date"):
5709 if opts.get("rev"):
5716 if opts.get("rev"):
5710 raise error.Abort(_("you can't specify a revision and a date"))
5717 raise error.Abort(_("you can't specify a revision and a date"))
5711 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5718 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5712
5719
5713 parent, p2 = repo.dirstate.parents()
5720 parent, p2 = repo.dirstate.parents()
5714 if not opts.get('rev') and p2 != nullid:
5721 if not opts.get('rev') and p2 != nullid:
5715 # revert after merge is a trap for new users (issue2915)
5722 # revert after merge is a trap for new users (issue2915)
5716 raise error.Abort(_('uncommitted merge with no revision specified'),
5723 raise error.Abort(_('uncommitted merge with no revision specified'),
5717 hint=_('use "hg update" or see "hg help revert"'))
5724 hint=_('use "hg update" or see "hg help revert"'))
5718
5725
5719 ctx = scmutil.revsingle(repo, opts.get('rev'))
5726 ctx = scmutil.revsingle(repo, opts.get('rev'))
5720
5727
5721 if (not (pats or opts.get('include') or opts.get('exclude') or
5728 if (not (pats or opts.get('include') or opts.get('exclude') or
5722 opts.get('all') or opts.get('interactive'))):
5729 opts.get('all') or opts.get('interactive'))):
5723 msg = _("no files or directories specified")
5730 msg = _("no files or directories specified")
5724 if p2 != nullid:
5731 if p2 != nullid:
5725 hint = _("uncommitted merge, use --all to discard all changes,"
5732 hint = _("uncommitted merge, use --all to discard all changes,"
5726 " or 'hg update -C .' to abort the merge")
5733 " or 'hg update -C .' to abort the merge")
5727 raise error.Abort(msg, hint=hint)
5734 raise error.Abort(msg, hint=hint)
5728 dirty = any(repo.status())
5735 dirty = any(repo.status())
5729 node = ctx.node()
5736 node = ctx.node()
5730 if node != parent:
5737 if node != parent:
5731 if dirty:
5738 if dirty:
5732 hint = _("uncommitted changes, use --all to discard all"
5739 hint = _("uncommitted changes, use --all to discard all"
5733 " changes, or 'hg update %s' to update") % ctx.rev()
5740 " changes, or 'hg update %s' to update") % ctx.rev()
5734 else:
5741 else:
5735 hint = _("use --all to revert all files,"
5742 hint = _("use --all to revert all files,"
5736 " or 'hg update %s' to update") % ctx.rev()
5743 " or 'hg update %s' to update") % ctx.rev()
5737 elif dirty:
5744 elif dirty:
5738 hint = _("uncommitted changes, use --all to discard all changes")
5745 hint = _("uncommitted changes, use --all to discard all changes")
5739 else:
5746 else:
5740 hint = _("use --all to revert all files")
5747 hint = _("use --all to revert all files")
5741 raise error.Abort(msg, hint=hint)
5748 raise error.Abort(msg, hint=hint)
5742
5749
5743 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5750 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5744
5751
5745 @command('rollback', dryrunopts +
5752 @command('rollback', dryrunopts +
5746 [('f', 'force', False, _('ignore safety measures'))])
5753 [('f', 'force', False, _('ignore safety measures'))])
5747 def rollback(ui, repo, **opts):
5754 def rollback(ui, repo, **opts):
5748 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5755 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5749
5756
5750 Please use :hg:`commit --amend` instead of rollback to correct
5757 Please use :hg:`commit --amend` instead of rollback to correct
5751 mistakes in the last commit.
5758 mistakes in the last commit.
5752
5759
5753 This command should be used with care. There is only one level of
5760 This command should be used with care. There is only one level of
5754 rollback, and there is no way to undo a rollback. It will also
5761 rollback, and there is no way to undo a rollback. It will also
5755 restore the dirstate at the time of the last transaction, losing
5762 restore the dirstate at the time of the last transaction, losing
5756 any dirstate changes since that time. This command does not alter
5763 any dirstate changes since that time. This command does not alter
5757 the working directory.
5764 the working directory.
5758
5765
5759 Transactions are used to encapsulate the effects of all commands
5766 Transactions are used to encapsulate the effects of all commands
5760 that create new changesets or propagate existing changesets into a
5767 that create new changesets or propagate existing changesets into a
5761 repository.
5768 repository.
5762
5769
5763 .. container:: verbose
5770 .. container:: verbose
5764
5771
5765 For example, the following commands are transactional, and their
5772 For example, the following commands are transactional, and their
5766 effects can be rolled back:
5773 effects can be rolled back:
5767
5774
5768 - commit
5775 - commit
5769 - import
5776 - import
5770 - pull
5777 - pull
5771 - push (with this repository as the destination)
5778 - push (with this repository as the destination)
5772 - unbundle
5779 - unbundle
5773
5780
5774 To avoid permanent data loss, rollback will refuse to rollback a
5781 To avoid permanent data loss, rollback will refuse to rollback a
5775 commit transaction if it isn't checked out. Use --force to
5782 commit transaction if it isn't checked out. Use --force to
5776 override this protection.
5783 override this protection.
5777
5784
5778 This command is not intended for use on public repositories. Once
5785 This command is not intended for use on public repositories. Once
5779 changes are visible for pull by other users, rolling a transaction
5786 changes are visible for pull by other users, rolling a transaction
5780 back locally is ineffective (someone else may already have pulled
5787 back locally is ineffective (someone else may already have pulled
5781 the changes). Furthermore, a race is possible with readers of the
5788 the changes). Furthermore, a race is possible with readers of the
5782 repository; for example an in-progress pull from the repository
5789 repository; for example an in-progress pull from the repository
5783 may fail if a rollback is performed.
5790 may fail if a rollback is performed.
5784
5791
5785 Returns 0 on success, 1 if no rollback data is available.
5792 Returns 0 on success, 1 if no rollback data is available.
5786 """
5793 """
5787 return repo.rollback(dryrun=opts.get('dry_run'),
5794 return repo.rollback(dryrun=opts.get('dry_run'),
5788 force=opts.get('force'))
5795 force=opts.get('force'))
5789
5796
5790 @command('root', [])
5797 @command('root', [])
5791 def root(ui, repo):
5798 def root(ui, repo):
5792 """print the root (top) of the current working directory
5799 """print the root (top) of the current working directory
5793
5800
5794 Print the root directory of the current repository.
5801 Print the root directory of the current repository.
5795
5802
5796 Returns 0 on success.
5803 Returns 0 on success.
5797 """
5804 """
5798 ui.write(repo.root + "\n")
5805 ui.write(repo.root + "\n")
5799
5806
5800 @command('^serve',
5807 @command('^serve',
5801 [('A', 'accesslog', '', _('name of access log file to write to'),
5808 [('A', 'accesslog', '', _('name of access log file to write to'),
5802 _('FILE')),
5809 _('FILE')),
5803 ('d', 'daemon', None, _('run server in background')),
5810 ('d', 'daemon', None, _('run server in background')),
5804 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('FILE')),
5811 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('FILE')),
5805 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5812 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5806 # use string type, then we can check if something was passed
5813 # use string type, then we can check if something was passed
5807 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5814 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5808 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5815 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5809 _('ADDR')),
5816 _('ADDR')),
5810 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5817 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5811 _('PREFIX')),
5818 _('PREFIX')),
5812 ('n', 'name', '',
5819 ('n', 'name', '',
5813 _('name to show in web pages (default: working directory)'), _('NAME')),
5820 _('name to show in web pages (default: working directory)'), _('NAME')),
5814 ('', 'web-conf', '',
5821 ('', 'web-conf', '',
5815 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5822 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5816 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5823 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5817 _('FILE')),
5824 _('FILE')),
5818 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5825 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5819 ('', 'stdio', None, _('for remote clients')),
5826 ('', 'stdio', None, _('for remote clients')),
5820 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5827 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5821 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5828 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5822 ('', 'style', '', _('template style to use'), _('STYLE')),
5829 ('', 'style', '', _('template style to use'), _('STYLE')),
5823 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5830 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5824 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5831 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5825 _('[OPTION]...'),
5832 _('[OPTION]...'),
5826 optionalrepo=True)
5833 optionalrepo=True)
5827 def serve(ui, repo, **opts):
5834 def serve(ui, repo, **opts):
5828 """start stand-alone webserver
5835 """start stand-alone webserver
5829
5836
5830 Start a local HTTP repository browser and pull server. You can use
5837 Start a local HTTP repository browser and pull server. You can use
5831 this for ad-hoc sharing and browsing of repositories. It is
5838 this for ad-hoc sharing and browsing of repositories. It is
5832 recommended to use a real web server to serve a repository for
5839 recommended to use a real web server to serve a repository for
5833 longer periods of time.
5840 longer periods of time.
5834
5841
5835 Please note that the server does not implement access control.
5842 Please note that the server does not implement access control.
5836 This means that, by default, anybody can read from the server and
5843 This means that, by default, anybody can read from the server and
5837 nobody can write to it by default. Set the ``web.allow_push``
5844 nobody can write to it by default. Set the ``web.allow_push``
5838 option to ``*`` to allow everybody to push to the server. You
5845 option to ``*`` to allow everybody to push to the server. You
5839 should use a real web server if you need to authenticate users.
5846 should use a real web server if you need to authenticate users.
5840
5847
5841 By default, the server logs accesses to stdout and errors to
5848 By default, the server logs accesses to stdout and errors to
5842 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5849 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5843 files.
5850 files.
5844
5851
5845 To have the server choose a free port number to listen on, specify
5852 To have the server choose a free port number to listen on, specify
5846 a port number of 0; in this case, the server will print the port
5853 a port number of 0; in this case, the server will print the port
5847 number it uses.
5854 number it uses.
5848
5855
5849 Returns 0 on success.
5856 Returns 0 on success.
5850 """
5857 """
5851
5858
5852 if opts["stdio"] and opts["cmdserver"]:
5859 if opts["stdio"] and opts["cmdserver"]:
5853 raise error.Abort(_("cannot use --stdio with --cmdserver"))
5860 raise error.Abort(_("cannot use --stdio with --cmdserver"))
5854
5861
5855 if opts["stdio"]:
5862 if opts["stdio"]:
5856 if repo is None:
5863 if repo is None:
5857 raise error.RepoError(_("there is no Mercurial repository here"
5864 raise error.RepoError(_("there is no Mercurial repository here"
5858 " (.hg not found)"))
5865 " (.hg not found)"))
5859 s = sshserver.sshserver(ui, repo)
5866 s = sshserver.sshserver(ui, repo)
5860 s.serve_forever()
5867 s.serve_forever()
5861
5868
5862 if opts["cmdserver"]:
5869 if opts["cmdserver"]:
5863 import commandserver
5870 import commandserver
5864 service = commandserver.createservice(ui, repo, opts)
5871 service = commandserver.createservice(ui, repo, opts)
5865 return cmdutil.service(opts, initfn=service.init, runfn=service.run)
5872 return cmdutil.service(opts, initfn=service.init, runfn=service.run)
5866
5873
5867 # this way we can check if something was given in the command-line
5874 # this way we can check if something was given in the command-line
5868 if opts.get('port'):
5875 if opts.get('port'):
5869 opts['port'] = util.getport(opts.get('port'))
5876 opts['port'] = util.getport(opts.get('port'))
5870
5877
5871 if repo:
5878 if repo:
5872 baseui = repo.baseui
5879 baseui = repo.baseui
5873 else:
5880 else:
5874 baseui = ui
5881 baseui = ui
5875 optlist = ("name templates style address port prefix ipv6"
5882 optlist = ("name templates style address port prefix ipv6"
5876 " accesslog errorlog certificate encoding")
5883 " accesslog errorlog certificate encoding")
5877 for o in optlist.split():
5884 for o in optlist.split():
5878 val = opts.get(o, '')
5885 val = opts.get(o, '')
5879 if val in (None, ''): # should check against default options instead
5886 if val in (None, ''): # should check against default options instead
5880 continue
5887 continue
5881 baseui.setconfig("web", o, val, 'serve')
5888 baseui.setconfig("web", o, val, 'serve')
5882 if repo and repo.ui != baseui:
5889 if repo and repo.ui != baseui:
5883 repo.ui.setconfig("web", o, val, 'serve')
5890 repo.ui.setconfig("web", o, val, 'serve')
5884
5891
5885 o = opts.get('web_conf') or opts.get('webdir_conf')
5892 o = opts.get('web_conf') or opts.get('webdir_conf')
5886 if not o:
5893 if not o:
5887 if not repo:
5894 if not repo:
5888 raise error.RepoError(_("there is no Mercurial repository"
5895 raise error.RepoError(_("there is no Mercurial repository"
5889 " here (.hg not found)"))
5896 " here (.hg not found)"))
5890 o = repo
5897 o = repo
5891
5898
5892 app = hgweb.hgweb(o, baseui=baseui)
5899 app = hgweb.hgweb(o, baseui=baseui)
5893 service = httpservice(ui, app, opts)
5900 service = httpservice(ui, app, opts)
5894 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5901 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5895
5902
5896 class httpservice(object):
5903 class httpservice(object):
5897 def __init__(self, ui, app, opts):
5904 def __init__(self, ui, app, opts):
5898 self.ui = ui
5905 self.ui = ui
5899 self.app = app
5906 self.app = app
5900 self.opts = opts
5907 self.opts = opts
5901
5908
5902 def init(self):
5909 def init(self):
5903 util.setsignalhandler()
5910 util.setsignalhandler()
5904 self.httpd = hgweb_server.create_server(self.ui, self.app)
5911 self.httpd = hgweb_server.create_server(self.ui, self.app)
5905
5912
5906 if self.opts['port'] and not self.ui.verbose:
5913 if self.opts['port'] and not self.ui.verbose:
5907 return
5914 return
5908
5915
5909 if self.httpd.prefix:
5916 if self.httpd.prefix:
5910 prefix = self.httpd.prefix.strip('/') + '/'
5917 prefix = self.httpd.prefix.strip('/') + '/'
5911 else:
5918 else:
5912 prefix = ''
5919 prefix = ''
5913
5920
5914 port = ':%d' % self.httpd.port
5921 port = ':%d' % self.httpd.port
5915 if port == ':80':
5922 if port == ':80':
5916 port = ''
5923 port = ''
5917
5924
5918 bindaddr = self.httpd.addr
5925 bindaddr = self.httpd.addr
5919 if bindaddr == '0.0.0.0':
5926 if bindaddr == '0.0.0.0':
5920 bindaddr = '*'
5927 bindaddr = '*'
5921 elif ':' in bindaddr: # IPv6
5928 elif ':' in bindaddr: # IPv6
5922 bindaddr = '[%s]' % bindaddr
5929 bindaddr = '[%s]' % bindaddr
5923
5930
5924 fqaddr = self.httpd.fqaddr
5931 fqaddr = self.httpd.fqaddr
5925 if ':' in fqaddr:
5932 if ':' in fqaddr:
5926 fqaddr = '[%s]' % fqaddr
5933 fqaddr = '[%s]' % fqaddr
5927 if self.opts['port']:
5934 if self.opts['port']:
5928 write = self.ui.status
5935 write = self.ui.status
5929 else:
5936 else:
5930 write = self.ui.write
5937 write = self.ui.write
5931 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5938 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5932 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5939 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5933 self.ui.flush() # avoid buffering of status message
5940 self.ui.flush() # avoid buffering of status message
5934
5941
5935 def run(self):
5942 def run(self):
5936 self.httpd.serve_forever()
5943 self.httpd.serve_forever()
5937
5944
5938
5945
5939 @command('^status|st',
5946 @command('^status|st',
5940 [('A', 'all', None, _('show status of all files')),
5947 [('A', 'all', None, _('show status of all files')),
5941 ('m', 'modified', None, _('show only modified files')),
5948 ('m', 'modified', None, _('show only modified files')),
5942 ('a', 'added', None, _('show only added files')),
5949 ('a', 'added', None, _('show only added files')),
5943 ('r', 'removed', None, _('show only removed files')),
5950 ('r', 'removed', None, _('show only removed files')),
5944 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5951 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5945 ('c', 'clean', None, _('show only files without changes')),
5952 ('c', 'clean', None, _('show only files without changes')),
5946 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5953 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5947 ('i', 'ignored', None, _('show only ignored files')),
5954 ('i', 'ignored', None, _('show only ignored files')),
5948 ('n', 'no-status', None, _('hide status prefix')),
5955 ('n', 'no-status', None, _('hide status prefix')),
5949 ('C', 'copies', None, _('show source of copied files')),
5956 ('C', 'copies', None, _('show source of copied files')),
5950 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5957 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5951 ('', 'rev', [], _('show difference from revision'), _('REV')),
5958 ('', 'rev', [], _('show difference from revision'), _('REV')),
5952 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5959 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5953 ] + walkopts + subrepoopts + formatteropts,
5960 ] + walkopts + subrepoopts + formatteropts,
5954 _('[OPTION]... [FILE]...'),
5961 _('[OPTION]... [FILE]...'),
5955 inferrepo=True)
5962 inferrepo=True)
5956 def status(ui, repo, *pats, **opts):
5963 def status(ui, repo, *pats, **opts):
5957 """show changed files in the working directory
5964 """show changed files in the working directory
5958
5965
5959 Show status of files in the repository. If names are given, only
5966 Show status of files in the repository. If names are given, only
5960 files that match are shown. Files that are clean or ignored or
5967 files that match are shown. Files that are clean or ignored or
5961 the source of a copy/move operation, are not listed unless
5968 the source of a copy/move operation, are not listed unless
5962 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5969 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5963 Unless options described with "show only ..." are given, the
5970 Unless options described with "show only ..." are given, the
5964 options -mardu are used.
5971 options -mardu are used.
5965
5972
5966 Option -q/--quiet hides untracked (unknown and ignored) files
5973 Option -q/--quiet hides untracked (unknown and ignored) files
5967 unless explicitly requested with -u/--unknown or -i/--ignored.
5974 unless explicitly requested with -u/--unknown or -i/--ignored.
5968
5975
5969 .. note::
5976 .. note::
5970
5977
5971 status may appear to disagree with diff if permissions have
5978 status may appear to disagree with diff if permissions have
5972 changed or a merge has occurred. The standard diff format does
5979 changed or a merge has occurred. The standard diff format does
5973 not report permission changes and diff only reports changes
5980 not report permission changes and diff only reports changes
5974 relative to one merge parent.
5981 relative to one merge parent.
5975
5982
5976 If one revision is given, it is used as the base revision.
5983 If one revision is given, it is used as the base revision.
5977 If two revisions are given, the differences between them are
5984 If two revisions are given, the differences between them are
5978 shown. The --change option can also be used as a shortcut to list
5985 shown. The --change option can also be used as a shortcut to list
5979 the changed files of a revision from its first parent.
5986 the changed files of a revision from its first parent.
5980
5987
5981 The codes used to show the status of files are::
5988 The codes used to show the status of files are::
5982
5989
5983 M = modified
5990 M = modified
5984 A = added
5991 A = added
5985 R = removed
5992 R = removed
5986 C = clean
5993 C = clean
5987 ! = missing (deleted by non-hg command, but still tracked)
5994 ! = missing (deleted by non-hg command, but still tracked)
5988 ? = not tracked
5995 ? = not tracked
5989 I = ignored
5996 I = ignored
5990 = origin of the previous file (with --copies)
5997 = origin of the previous file (with --copies)
5991
5998
5992 .. container:: verbose
5999 .. container:: verbose
5993
6000
5994 Examples:
6001 Examples:
5995
6002
5996 - show changes in the working directory relative to a
6003 - show changes in the working directory relative to a
5997 changeset::
6004 changeset::
5998
6005
5999 hg status --rev 9353
6006 hg status --rev 9353
6000
6007
6001 - show changes in the working directory relative to the
6008 - show changes in the working directory relative to the
6002 current directory (see :hg:`help patterns` for more information)::
6009 current directory (see :hg:`help patterns` for more information)::
6003
6010
6004 hg status re:
6011 hg status re:
6005
6012
6006 - show all changes including copies in an existing changeset::
6013 - show all changes including copies in an existing changeset::
6007
6014
6008 hg status --copies --change 9353
6015 hg status --copies --change 9353
6009
6016
6010 - get a NUL separated list of added files, suitable for xargs::
6017 - get a NUL separated list of added files, suitable for xargs::
6011
6018
6012 hg status -an0
6019 hg status -an0
6013
6020
6014 Returns 0 on success.
6021 Returns 0 on success.
6015 """
6022 """
6016
6023
6017 revs = opts.get('rev')
6024 revs = opts.get('rev')
6018 change = opts.get('change')
6025 change = opts.get('change')
6019
6026
6020 if revs and change:
6027 if revs and change:
6021 msg = _('cannot specify --rev and --change at the same time')
6028 msg = _('cannot specify --rev and --change at the same time')
6022 raise error.Abort(msg)
6029 raise error.Abort(msg)
6023 elif change:
6030 elif change:
6024 node2 = scmutil.revsingle(repo, change, None).node()
6031 node2 = scmutil.revsingle(repo, change, None).node()
6025 node1 = repo[node2].p1().node()
6032 node1 = repo[node2].p1().node()
6026 else:
6033 else:
6027 node1, node2 = scmutil.revpair(repo, revs)
6034 node1, node2 = scmutil.revpair(repo, revs)
6028
6035
6029 if pats:
6036 if pats:
6030 cwd = repo.getcwd()
6037 cwd = repo.getcwd()
6031 else:
6038 else:
6032 cwd = ''
6039 cwd = ''
6033
6040
6034 if opts.get('print0'):
6041 if opts.get('print0'):
6035 end = '\0'
6042 end = '\0'
6036 else:
6043 else:
6037 end = '\n'
6044 end = '\n'
6038 copy = {}
6045 copy = {}
6039 states = 'modified added removed deleted unknown ignored clean'.split()
6046 states = 'modified added removed deleted unknown ignored clean'.split()
6040 show = [k for k in states if opts.get(k)]
6047 show = [k for k in states if opts.get(k)]
6041 if opts.get('all'):
6048 if opts.get('all'):
6042 show += ui.quiet and (states[:4] + ['clean']) or states
6049 show += ui.quiet and (states[:4] + ['clean']) or states
6043 if not show:
6050 if not show:
6044 if ui.quiet:
6051 if ui.quiet:
6045 show = states[:4]
6052 show = states[:4]
6046 else:
6053 else:
6047 show = states[:5]
6054 show = states[:5]
6048
6055
6049 m = scmutil.match(repo[node2], pats, opts)
6056 m = scmutil.match(repo[node2], pats, opts)
6050 stat = repo.status(node1, node2, m,
6057 stat = repo.status(node1, node2, m,
6051 'ignored' in show, 'clean' in show, 'unknown' in show,
6058 'ignored' in show, 'clean' in show, 'unknown' in show,
6052 opts.get('subrepos'))
6059 opts.get('subrepos'))
6053 changestates = zip(states, 'MAR!?IC', stat)
6060 changestates = zip(states, 'MAR!?IC', stat)
6054
6061
6055 if (opts.get('all') or opts.get('copies')
6062 if (opts.get('all') or opts.get('copies')
6056 or ui.configbool('ui', 'statuscopies')) and not opts.get('no_status'):
6063 or ui.configbool('ui', 'statuscopies')) and not opts.get('no_status'):
6057 copy = copies.pathcopies(repo[node1], repo[node2], m)
6064 copy = copies.pathcopies(repo[node1], repo[node2], m)
6058
6065
6059 fm = ui.formatter('status', opts)
6066 fm = ui.formatter('status', opts)
6060 fmt = '%s' + end
6067 fmt = '%s' + end
6061 showchar = not opts.get('no_status')
6068 showchar = not opts.get('no_status')
6062
6069
6063 for state, char, files in changestates:
6070 for state, char, files in changestates:
6064 if state in show:
6071 if state in show:
6065 label = 'status.' + state
6072 label = 'status.' + state
6066 for f in files:
6073 for f in files:
6067 fm.startitem()
6074 fm.startitem()
6068 fm.condwrite(showchar, 'status', '%s ', char, label=label)
6075 fm.condwrite(showchar, 'status', '%s ', char, label=label)
6069 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
6076 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
6070 if f in copy:
6077 if f in copy:
6071 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
6078 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
6072 label='status.copied')
6079 label='status.copied')
6073 fm.end()
6080 fm.end()
6074
6081
6075 @command('^summary|sum',
6082 @command('^summary|sum',
6076 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
6083 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
6077 def summary(ui, repo, **opts):
6084 def summary(ui, repo, **opts):
6078 """summarize working directory state
6085 """summarize working directory state
6079
6086
6080 This generates a brief summary of the working directory state,
6087 This generates a brief summary of the working directory state,
6081 including parents, branch, commit status, phase and available updates.
6088 including parents, branch, commit status, phase and available updates.
6082
6089
6083 With the --remote option, this will check the default paths for
6090 With the --remote option, this will check the default paths for
6084 incoming and outgoing changes. This can be time-consuming.
6091 incoming and outgoing changes. This can be time-consuming.
6085
6092
6086 Returns 0 on success.
6093 Returns 0 on success.
6087 """
6094 """
6088
6095
6089 ctx = repo[None]
6096 ctx = repo[None]
6090 parents = ctx.parents()
6097 parents = ctx.parents()
6091 pnode = parents[0].node()
6098 pnode = parents[0].node()
6092 marks = []
6099 marks = []
6093
6100
6094 for p in parents:
6101 for p in parents:
6095 # label with log.changeset (instead of log.parent) since this
6102 # label with log.changeset (instead of log.parent) since this
6096 # shows a working directory parent *changeset*:
6103 # shows a working directory parent *changeset*:
6097 # i18n: column positioning for "hg summary"
6104 # i18n: column positioning for "hg summary"
6098 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
6105 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
6099 label='log.changeset changeset.%s' % p.phasestr())
6106 label='log.changeset changeset.%s' % p.phasestr())
6100 ui.write(' '.join(p.tags()), label='log.tag')
6107 ui.write(' '.join(p.tags()), label='log.tag')
6101 if p.bookmarks():
6108 if p.bookmarks():
6102 marks.extend(p.bookmarks())
6109 marks.extend(p.bookmarks())
6103 if p.rev() == -1:
6110 if p.rev() == -1:
6104 if not len(repo):
6111 if not len(repo):
6105 ui.write(_(' (empty repository)'))
6112 ui.write(_(' (empty repository)'))
6106 else:
6113 else:
6107 ui.write(_(' (no revision checked out)'))
6114 ui.write(_(' (no revision checked out)'))
6108 ui.write('\n')
6115 ui.write('\n')
6109 if p.description():
6116 if p.description():
6110 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
6117 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
6111 label='log.summary')
6118 label='log.summary')
6112
6119
6113 branch = ctx.branch()
6120 branch = ctx.branch()
6114 bheads = repo.branchheads(branch)
6121 bheads = repo.branchheads(branch)
6115 # i18n: column positioning for "hg summary"
6122 # i18n: column positioning for "hg summary"
6116 m = _('branch: %s\n') % branch
6123 m = _('branch: %s\n') % branch
6117 if branch != 'default':
6124 if branch != 'default':
6118 ui.write(m, label='log.branch')
6125 ui.write(m, label='log.branch')
6119 else:
6126 else:
6120 ui.status(m, label='log.branch')
6127 ui.status(m, label='log.branch')
6121
6128
6122 if marks:
6129 if marks:
6123 active = repo._activebookmark
6130 active = repo._activebookmark
6124 # i18n: column positioning for "hg summary"
6131 # i18n: column positioning for "hg summary"
6125 ui.write(_('bookmarks:'), label='log.bookmark')
6132 ui.write(_('bookmarks:'), label='log.bookmark')
6126 if active is not None:
6133 if active is not None:
6127 if active in marks:
6134 if active in marks:
6128 ui.write(' *' + active, label=activebookmarklabel)
6135 ui.write(' *' + active, label=activebookmarklabel)
6129 marks.remove(active)
6136 marks.remove(active)
6130 else:
6137 else:
6131 ui.write(' [%s]' % active, label=activebookmarklabel)
6138 ui.write(' [%s]' % active, label=activebookmarklabel)
6132 for m in marks:
6139 for m in marks:
6133 ui.write(' ' + m, label='log.bookmark')
6140 ui.write(' ' + m, label='log.bookmark')
6134 ui.write('\n', label='log.bookmark')
6141 ui.write('\n', label='log.bookmark')
6135
6142
6136 status = repo.status(unknown=True)
6143 status = repo.status(unknown=True)
6137
6144
6138 c = repo.dirstate.copies()
6145 c = repo.dirstate.copies()
6139 copied, renamed = [], []
6146 copied, renamed = [], []
6140 for d, s in c.iteritems():
6147 for d, s in c.iteritems():
6141 if s in status.removed:
6148 if s in status.removed:
6142 status.removed.remove(s)
6149 status.removed.remove(s)
6143 renamed.append(d)
6150 renamed.append(d)
6144 else:
6151 else:
6145 copied.append(d)
6152 copied.append(d)
6146 if d in status.added:
6153 if d in status.added:
6147 status.added.remove(d)
6154 status.added.remove(d)
6148
6155
6149 ms = mergemod.mergestate(repo)
6156 ms = mergemod.mergestate(repo)
6150 unresolved = [f for f in ms if ms[f] == 'u']
6157 unresolved = [f for f in ms if ms[f] == 'u']
6151
6158
6152 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
6159 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
6153
6160
6154 labels = [(ui.label(_('%d modified'), 'status.modified'), status.modified),
6161 labels = [(ui.label(_('%d modified'), 'status.modified'), status.modified),
6155 (ui.label(_('%d added'), 'status.added'), status.added),
6162 (ui.label(_('%d added'), 'status.added'), status.added),
6156 (ui.label(_('%d removed'), 'status.removed'), status.removed),
6163 (ui.label(_('%d removed'), 'status.removed'), status.removed),
6157 (ui.label(_('%d renamed'), 'status.copied'), renamed),
6164 (ui.label(_('%d renamed'), 'status.copied'), renamed),
6158 (ui.label(_('%d copied'), 'status.copied'), copied),
6165 (ui.label(_('%d copied'), 'status.copied'), copied),
6159 (ui.label(_('%d deleted'), 'status.deleted'), status.deleted),
6166 (ui.label(_('%d deleted'), 'status.deleted'), status.deleted),
6160 (ui.label(_('%d unknown'), 'status.unknown'), status.unknown),
6167 (ui.label(_('%d unknown'), 'status.unknown'), status.unknown),
6161 (ui.label(_('%d unresolved'), 'resolve.unresolved'), unresolved),
6168 (ui.label(_('%d unresolved'), 'resolve.unresolved'), unresolved),
6162 (ui.label(_('%d subrepos'), 'status.modified'), subs)]
6169 (ui.label(_('%d subrepos'), 'status.modified'), subs)]
6163 t = []
6170 t = []
6164 for l, s in labels:
6171 for l, s in labels:
6165 if s:
6172 if s:
6166 t.append(l % len(s))
6173 t.append(l % len(s))
6167
6174
6168 t = ', '.join(t)
6175 t = ', '.join(t)
6169 cleanworkdir = False
6176 cleanworkdir = False
6170
6177
6171 if repo.vfs.exists('updatestate'):
6178 if repo.vfs.exists('updatestate'):
6172 t += _(' (interrupted update)')
6179 t += _(' (interrupted update)')
6173 elif len(parents) > 1:
6180 elif len(parents) > 1:
6174 t += _(' (merge)')
6181 t += _(' (merge)')
6175 elif branch != parents[0].branch():
6182 elif branch != parents[0].branch():
6176 t += _(' (new branch)')
6183 t += _(' (new branch)')
6177 elif (parents[0].closesbranch() and
6184 elif (parents[0].closesbranch() and
6178 pnode in repo.branchheads(branch, closed=True)):
6185 pnode in repo.branchheads(branch, closed=True)):
6179 t += _(' (head closed)')
6186 t += _(' (head closed)')
6180 elif not (status.modified or status.added or status.removed or renamed or
6187 elif not (status.modified or status.added or status.removed or renamed or
6181 copied or subs):
6188 copied or subs):
6182 t += _(' (clean)')
6189 t += _(' (clean)')
6183 cleanworkdir = True
6190 cleanworkdir = True
6184 elif pnode not in bheads:
6191 elif pnode not in bheads:
6185 t += _(' (new branch head)')
6192 t += _(' (new branch head)')
6186
6193
6187 if parents:
6194 if parents:
6188 pendingphase = max(p.phase() for p in parents)
6195 pendingphase = max(p.phase() for p in parents)
6189 else:
6196 else:
6190 pendingphase = phases.public
6197 pendingphase = phases.public
6191
6198
6192 if pendingphase > phases.newcommitphase(ui):
6199 if pendingphase > phases.newcommitphase(ui):
6193 t += ' (%s)' % phases.phasenames[pendingphase]
6200 t += ' (%s)' % phases.phasenames[pendingphase]
6194
6201
6195 if cleanworkdir:
6202 if cleanworkdir:
6196 # i18n: column positioning for "hg summary"
6203 # i18n: column positioning for "hg summary"
6197 ui.status(_('commit: %s\n') % t.strip())
6204 ui.status(_('commit: %s\n') % t.strip())
6198 else:
6205 else:
6199 # i18n: column positioning for "hg summary"
6206 # i18n: column positioning for "hg summary"
6200 ui.write(_('commit: %s\n') % t.strip())
6207 ui.write(_('commit: %s\n') % t.strip())
6201
6208
6202 # all ancestors of branch heads - all ancestors of parent = new csets
6209 # all ancestors of branch heads - all ancestors of parent = new csets
6203 new = len(repo.changelog.findmissing([pctx.node() for pctx in parents],
6210 new = len(repo.changelog.findmissing([pctx.node() for pctx in parents],
6204 bheads))
6211 bheads))
6205
6212
6206 if new == 0:
6213 if new == 0:
6207 # i18n: column positioning for "hg summary"
6214 # i18n: column positioning for "hg summary"
6208 ui.status(_('update: (current)\n'))
6215 ui.status(_('update: (current)\n'))
6209 elif pnode not in bheads:
6216 elif pnode not in bheads:
6210 # i18n: column positioning for "hg summary"
6217 # i18n: column positioning for "hg summary"
6211 ui.write(_('update: %d new changesets (update)\n') % new)
6218 ui.write(_('update: %d new changesets (update)\n') % new)
6212 else:
6219 else:
6213 # i18n: column positioning for "hg summary"
6220 # i18n: column positioning for "hg summary"
6214 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
6221 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
6215 (new, len(bheads)))
6222 (new, len(bheads)))
6216
6223
6217 t = []
6224 t = []
6218 draft = len(repo.revs('draft()'))
6225 draft = len(repo.revs('draft()'))
6219 if draft:
6226 if draft:
6220 t.append(_('%d draft') % draft)
6227 t.append(_('%d draft') % draft)
6221 secret = len(repo.revs('secret()'))
6228 secret = len(repo.revs('secret()'))
6222 if secret:
6229 if secret:
6223 t.append(_('%d secret') % secret)
6230 t.append(_('%d secret') % secret)
6224
6231
6225 if draft or secret:
6232 if draft or secret:
6226 ui.status(_('phases: %s\n') % ', '.join(t))
6233 ui.status(_('phases: %s\n') % ', '.join(t))
6227
6234
6228 cmdutil.summaryhooks(ui, repo)
6235 cmdutil.summaryhooks(ui, repo)
6229
6236
6230 if opts.get('remote'):
6237 if opts.get('remote'):
6231 needsincoming, needsoutgoing = True, True
6238 needsincoming, needsoutgoing = True, True
6232 else:
6239 else:
6233 needsincoming, needsoutgoing = False, False
6240 needsincoming, needsoutgoing = False, False
6234 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
6241 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
6235 if i:
6242 if i:
6236 needsincoming = True
6243 needsincoming = True
6237 if o:
6244 if o:
6238 needsoutgoing = True
6245 needsoutgoing = True
6239 if not needsincoming and not needsoutgoing:
6246 if not needsincoming and not needsoutgoing:
6240 return
6247 return
6241
6248
6242 def getincoming():
6249 def getincoming():
6243 source, branches = hg.parseurl(ui.expandpath('default'))
6250 source, branches = hg.parseurl(ui.expandpath('default'))
6244 sbranch = branches[0]
6251 sbranch = branches[0]
6245 try:
6252 try:
6246 other = hg.peer(repo, {}, source)
6253 other = hg.peer(repo, {}, source)
6247 except error.RepoError:
6254 except error.RepoError:
6248 if opts.get('remote'):
6255 if opts.get('remote'):
6249 raise
6256 raise
6250 return source, sbranch, None, None, None
6257 return source, sbranch, None, None, None
6251 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
6258 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
6252 if revs:
6259 if revs:
6253 revs = [other.lookup(rev) for rev in revs]
6260 revs = [other.lookup(rev) for rev in revs]
6254 ui.debug('comparing with %s\n' % util.hidepassword(source))
6261 ui.debug('comparing with %s\n' % util.hidepassword(source))
6255 repo.ui.pushbuffer()
6262 repo.ui.pushbuffer()
6256 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
6263 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
6257 repo.ui.popbuffer()
6264 repo.ui.popbuffer()
6258 return source, sbranch, other, commoninc, commoninc[1]
6265 return source, sbranch, other, commoninc, commoninc[1]
6259
6266
6260 if needsincoming:
6267 if needsincoming:
6261 source, sbranch, sother, commoninc, incoming = getincoming()
6268 source, sbranch, sother, commoninc, incoming = getincoming()
6262 else:
6269 else:
6263 source = sbranch = sother = commoninc = incoming = None
6270 source = sbranch = sother = commoninc = incoming = None
6264
6271
6265 def getoutgoing():
6272 def getoutgoing():
6266 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
6273 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
6267 dbranch = branches[0]
6274 dbranch = branches[0]
6268 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
6275 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
6269 if source != dest:
6276 if source != dest:
6270 try:
6277 try:
6271 dother = hg.peer(repo, {}, dest)
6278 dother = hg.peer(repo, {}, dest)
6272 except error.RepoError:
6279 except error.RepoError:
6273 if opts.get('remote'):
6280 if opts.get('remote'):
6274 raise
6281 raise
6275 return dest, dbranch, None, None
6282 return dest, dbranch, None, None
6276 ui.debug('comparing with %s\n' % util.hidepassword(dest))
6283 ui.debug('comparing with %s\n' % util.hidepassword(dest))
6277 elif sother is None:
6284 elif sother is None:
6278 # there is no explicit destination peer, but source one is invalid
6285 # there is no explicit destination peer, but source one is invalid
6279 return dest, dbranch, None, None
6286 return dest, dbranch, None, None
6280 else:
6287 else:
6281 dother = sother
6288 dother = sother
6282 if (source != dest or (sbranch is not None and sbranch != dbranch)):
6289 if (source != dest or (sbranch is not None and sbranch != dbranch)):
6283 common = None
6290 common = None
6284 else:
6291 else:
6285 common = commoninc
6292 common = commoninc
6286 if revs:
6293 if revs:
6287 revs = [repo.lookup(rev) for rev in revs]
6294 revs = [repo.lookup(rev) for rev in revs]
6288 repo.ui.pushbuffer()
6295 repo.ui.pushbuffer()
6289 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
6296 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
6290 commoninc=common)
6297 commoninc=common)
6291 repo.ui.popbuffer()
6298 repo.ui.popbuffer()
6292 return dest, dbranch, dother, outgoing
6299 return dest, dbranch, dother, outgoing
6293
6300
6294 if needsoutgoing:
6301 if needsoutgoing:
6295 dest, dbranch, dother, outgoing = getoutgoing()
6302 dest, dbranch, dother, outgoing = getoutgoing()
6296 else:
6303 else:
6297 dest = dbranch = dother = outgoing = None
6304 dest = dbranch = dother = outgoing = None
6298
6305
6299 if opts.get('remote'):
6306 if opts.get('remote'):
6300 t = []
6307 t = []
6301 if incoming:
6308 if incoming:
6302 t.append(_('1 or more incoming'))
6309 t.append(_('1 or more incoming'))
6303 o = outgoing.missing
6310 o = outgoing.missing
6304 if o:
6311 if o:
6305 t.append(_('%d outgoing') % len(o))
6312 t.append(_('%d outgoing') % len(o))
6306 other = dother or sother
6313 other = dother or sother
6307 if 'bookmarks' in other.listkeys('namespaces'):
6314 if 'bookmarks' in other.listkeys('namespaces'):
6308 counts = bookmarks.summary(repo, other)
6315 counts = bookmarks.summary(repo, other)
6309 if counts[0] > 0:
6316 if counts[0] > 0:
6310 t.append(_('%d incoming bookmarks') % counts[0])
6317 t.append(_('%d incoming bookmarks') % counts[0])
6311 if counts[1] > 0:
6318 if counts[1] > 0:
6312 t.append(_('%d outgoing bookmarks') % counts[1])
6319 t.append(_('%d outgoing bookmarks') % counts[1])
6313
6320
6314 if t:
6321 if t:
6315 # i18n: column positioning for "hg summary"
6322 # i18n: column positioning for "hg summary"
6316 ui.write(_('remote: %s\n') % (', '.join(t)))
6323 ui.write(_('remote: %s\n') % (', '.join(t)))
6317 else:
6324 else:
6318 # i18n: column positioning for "hg summary"
6325 # i18n: column positioning for "hg summary"
6319 ui.status(_('remote: (synced)\n'))
6326 ui.status(_('remote: (synced)\n'))
6320
6327
6321 cmdutil.summaryremotehooks(ui, repo, opts,
6328 cmdutil.summaryremotehooks(ui, repo, opts,
6322 ((source, sbranch, sother, commoninc),
6329 ((source, sbranch, sother, commoninc),
6323 (dest, dbranch, dother, outgoing)))
6330 (dest, dbranch, dother, outgoing)))
6324
6331
6325 @command('tag',
6332 @command('tag',
6326 [('f', 'force', None, _('force tag')),
6333 [('f', 'force', None, _('force tag')),
6327 ('l', 'local', None, _('make the tag local')),
6334 ('l', 'local', None, _('make the tag local')),
6328 ('r', 'rev', '', _('revision to tag'), _('REV')),
6335 ('r', 'rev', '', _('revision to tag'), _('REV')),
6329 ('', 'remove', None, _('remove a tag')),
6336 ('', 'remove', None, _('remove a tag')),
6330 # -l/--local is already there, commitopts cannot be used
6337 # -l/--local is already there, commitopts cannot be used
6331 ('e', 'edit', None, _('invoke editor on commit messages')),
6338 ('e', 'edit', None, _('invoke editor on commit messages')),
6332 ('m', 'message', '', _('use text as commit message'), _('TEXT')),
6339 ('m', 'message', '', _('use text as commit message'), _('TEXT')),
6333 ] + commitopts2,
6340 ] + commitopts2,
6334 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
6341 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
6335 def tag(ui, repo, name1, *names, **opts):
6342 def tag(ui, repo, name1, *names, **opts):
6336 """add one or more tags for the current or given revision
6343 """add one or more tags for the current or given revision
6337
6344
6338 Name a particular revision using <name>.
6345 Name a particular revision using <name>.
6339
6346
6340 Tags are used to name particular revisions of the repository and are
6347 Tags are used to name particular revisions of the repository and are
6341 very useful to compare different revisions, to go back to significant
6348 very useful to compare different revisions, to go back to significant
6342 earlier versions or to mark branch points as releases, etc. Changing
6349 earlier versions or to mark branch points as releases, etc. Changing
6343 an existing tag is normally disallowed; use -f/--force to override.
6350 an existing tag is normally disallowed; use -f/--force to override.
6344
6351
6345 If no revision is given, the parent of the working directory is
6352 If no revision is given, the parent of the working directory is
6346 used.
6353 used.
6347
6354
6348 To facilitate version control, distribution, and merging of tags,
6355 To facilitate version control, distribution, and merging of tags,
6349 they are stored as a file named ".hgtags" which is managed similarly
6356 they are stored as a file named ".hgtags" which is managed similarly
6350 to other project files and can be hand-edited if necessary. This
6357 to other project files and can be hand-edited if necessary. This
6351 also means that tagging creates a new commit. The file
6358 also means that tagging creates a new commit. The file
6352 ".hg/localtags" is used for local tags (not shared among
6359 ".hg/localtags" is used for local tags (not shared among
6353 repositories).
6360 repositories).
6354
6361
6355 Tag commits are usually made at the head of a branch. If the parent
6362 Tag commits are usually made at the head of a branch. If the parent
6356 of the working directory is not a branch head, :hg:`tag` aborts; use
6363 of the working directory is not a branch head, :hg:`tag` aborts; use
6357 -f/--force to force the tag commit to be based on a non-head
6364 -f/--force to force the tag commit to be based on a non-head
6358 changeset.
6365 changeset.
6359
6366
6360 See :hg:`help dates` for a list of formats valid for -d/--date.
6367 See :hg:`help dates` for a list of formats valid for -d/--date.
6361
6368
6362 Since tag names have priority over branch names during revision
6369 Since tag names have priority over branch names during revision
6363 lookup, using an existing branch name as a tag name is discouraged.
6370 lookup, using an existing branch name as a tag name is discouraged.
6364
6371
6365 Returns 0 on success.
6372 Returns 0 on success.
6366 """
6373 """
6367 wlock = lock = None
6374 wlock = lock = None
6368 try:
6375 try:
6369 wlock = repo.wlock()
6376 wlock = repo.wlock()
6370 lock = repo.lock()
6377 lock = repo.lock()
6371 rev_ = "."
6378 rev_ = "."
6372 names = [t.strip() for t in (name1,) + names]
6379 names = [t.strip() for t in (name1,) + names]
6373 if len(names) != len(set(names)):
6380 if len(names) != len(set(names)):
6374 raise error.Abort(_('tag names must be unique'))
6381 raise error.Abort(_('tag names must be unique'))
6375 for n in names:
6382 for n in names:
6376 scmutil.checknewlabel(repo, n, 'tag')
6383 scmutil.checknewlabel(repo, n, 'tag')
6377 if not n:
6384 if not n:
6378 raise error.Abort(_('tag names cannot consist entirely of '
6385 raise error.Abort(_('tag names cannot consist entirely of '
6379 'whitespace'))
6386 'whitespace'))
6380 if opts.get('rev') and opts.get('remove'):
6387 if opts.get('rev') and opts.get('remove'):
6381 raise error.Abort(_("--rev and --remove are incompatible"))
6388 raise error.Abort(_("--rev and --remove are incompatible"))
6382 if opts.get('rev'):
6389 if opts.get('rev'):
6383 rev_ = opts['rev']
6390 rev_ = opts['rev']
6384 message = opts.get('message')
6391 message = opts.get('message')
6385 if opts.get('remove'):
6392 if opts.get('remove'):
6386 if opts.get('local'):
6393 if opts.get('local'):
6387 expectedtype = 'local'
6394 expectedtype = 'local'
6388 else:
6395 else:
6389 expectedtype = 'global'
6396 expectedtype = 'global'
6390
6397
6391 for n in names:
6398 for n in names:
6392 if not repo.tagtype(n):
6399 if not repo.tagtype(n):
6393 raise error.Abort(_("tag '%s' does not exist") % n)
6400 raise error.Abort(_("tag '%s' does not exist") % n)
6394 if repo.tagtype(n) != expectedtype:
6401 if repo.tagtype(n) != expectedtype:
6395 if expectedtype == 'global':
6402 if expectedtype == 'global':
6396 raise error.Abort(_("tag '%s' is not a global tag") % n)
6403 raise error.Abort(_("tag '%s' is not a global tag") % n)
6397 else:
6404 else:
6398 raise error.Abort(_("tag '%s' is not a local tag") % n)
6405 raise error.Abort(_("tag '%s' is not a local tag") % n)
6399 rev_ = 'null'
6406 rev_ = 'null'
6400 if not message:
6407 if not message:
6401 # we don't translate commit messages
6408 # we don't translate commit messages
6402 message = 'Removed tag %s' % ', '.join(names)
6409 message = 'Removed tag %s' % ', '.join(names)
6403 elif not opts.get('force'):
6410 elif not opts.get('force'):
6404 for n in names:
6411 for n in names:
6405 if n in repo.tags():
6412 if n in repo.tags():
6406 raise error.Abort(_("tag '%s' already exists "
6413 raise error.Abort(_("tag '%s' already exists "
6407 "(use -f to force)") % n)
6414 "(use -f to force)") % n)
6408 if not opts.get('local'):
6415 if not opts.get('local'):
6409 p1, p2 = repo.dirstate.parents()
6416 p1, p2 = repo.dirstate.parents()
6410 if p2 != nullid:
6417 if p2 != nullid:
6411 raise error.Abort(_('uncommitted merge'))
6418 raise error.Abort(_('uncommitted merge'))
6412 bheads = repo.branchheads()
6419 bheads = repo.branchheads()
6413 if not opts.get('force') and bheads and p1 not in bheads:
6420 if not opts.get('force') and bheads and p1 not in bheads:
6414 raise error.Abort(_('not at a branch head (use -f to force)'))
6421 raise error.Abort(_('not at a branch head (use -f to force)'))
6415 r = scmutil.revsingle(repo, rev_).node()
6422 r = scmutil.revsingle(repo, rev_).node()
6416
6423
6417 if not message:
6424 if not message:
6418 # we don't translate commit messages
6425 # we don't translate commit messages
6419 message = ('Added tag %s for changeset %s' %
6426 message = ('Added tag %s for changeset %s' %
6420 (', '.join(names), short(r)))
6427 (', '.join(names), short(r)))
6421
6428
6422 date = opts.get('date')
6429 date = opts.get('date')
6423 if date:
6430 if date:
6424 date = util.parsedate(date)
6431 date = util.parsedate(date)
6425
6432
6426 if opts.get('remove'):
6433 if opts.get('remove'):
6427 editform = 'tag.remove'
6434 editform = 'tag.remove'
6428 else:
6435 else:
6429 editform = 'tag.add'
6436 editform = 'tag.add'
6430 editor = cmdutil.getcommiteditor(editform=editform, **opts)
6437 editor = cmdutil.getcommiteditor(editform=editform, **opts)
6431
6438
6432 # don't allow tagging the null rev
6439 # don't allow tagging the null rev
6433 if (not opts.get('remove') and
6440 if (not opts.get('remove') and
6434 scmutil.revsingle(repo, rev_).rev() == nullrev):
6441 scmutil.revsingle(repo, rev_).rev() == nullrev):
6435 raise error.Abort(_("cannot tag null revision"))
6442 raise error.Abort(_("cannot tag null revision"))
6436
6443
6437 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
6444 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
6438 editor=editor)
6445 editor=editor)
6439 finally:
6446 finally:
6440 release(lock, wlock)
6447 release(lock, wlock)
6441
6448
6442 @command('tags', formatteropts, '')
6449 @command('tags', formatteropts, '')
6443 def tags(ui, repo, **opts):
6450 def tags(ui, repo, **opts):
6444 """list repository tags
6451 """list repository tags
6445
6452
6446 This lists both regular and local tags. When the -v/--verbose
6453 This lists both regular and local tags. When the -v/--verbose
6447 switch is used, a third column "local" is printed for local tags.
6454 switch is used, a third column "local" is printed for local tags.
6448
6455
6449 Returns 0 on success.
6456 Returns 0 on success.
6450 """
6457 """
6451
6458
6452 fm = ui.formatter('tags', opts)
6459 fm = ui.formatter('tags', opts)
6453 hexfunc = fm.hexfunc
6460 hexfunc = fm.hexfunc
6454 tagtype = ""
6461 tagtype = ""
6455
6462
6456 for t, n in reversed(repo.tagslist()):
6463 for t, n in reversed(repo.tagslist()):
6457 hn = hexfunc(n)
6464 hn = hexfunc(n)
6458 label = 'tags.normal'
6465 label = 'tags.normal'
6459 tagtype = ''
6466 tagtype = ''
6460 if repo.tagtype(t) == 'local':
6467 if repo.tagtype(t) == 'local':
6461 label = 'tags.local'
6468 label = 'tags.local'
6462 tagtype = 'local'
6469 tagtype = 'local'
6463
6470
6464 fm.startitem()
6471 fm.startitem()
6465 fm.write('tag', '%s', t, label=label)
6472 fm.write('tag', '%s', t, label=label)
6466 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
6473 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
6467 fm.condwrite(not ui.quiet, 'rev node', fmt,
6474 fm.condwrite(not ui.quiet, 'rev node', fmt,
6468 repo.changelog.rev(n), hn, label=label)
6475 repo.changelog.rev(n), hn, label=label)
6469 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
6476 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
6470 tagtype, label=label)
6477 tagtype, label=label)
6471 fm.plain('\n')
6478 fm.plain('\n')
6472 fm.end()
6479 fm.end()
6473
6480
6474 @command('tip',
6481 @command('tip',
6475 [('p', 'patch', None, _('show patch')),
6482 [('p', 'patch', None, _('show patch')),
6476 ('g', 'git', None, _('use git extended diff format')),
6483 ('g', 'git', None, _('use git extended diff format')),
6477 ] + templateopts,
6484 ] + templateopts,
6478 _('[-p] [-g]'))
6485 _('[-p] [-g]'))
6479 def tip(ui, repo, **opts):
6486 def tip(ui, repo, **opts):
6480 """show the tip revision (DEPRECATED)
6487 """show the tip revision (DEPRECATED)
6481
6488
6482 The tip revision (usually just called the tip) is the changeset
6489 The tip revision (usually just called the tip) is the changeset
6483 most recently added to the repository (and therefore the most
6490 most recently added to the repository (and therefore the most
6484 recently changed head).
6491 recently changed head).
6485
6492
6486 If you have just made a commit, that commit will be the tip. If
6493 If you have just made a commit, that commit will be the tip. If
6487 you have just pulled changes from another repository, the tip of
6494 you have just pulled changes from another repository, the tip of
6488 that repository becomes the current tip. The "tip" tag is special
6495 that repository becomes the current tip. The "tip" tag is special
6489 and cannot be renamed or assigned to a different changeset.
6496 and cannot be renamed or assigned to a different changeset.
6490
6497
6491 This command is deprecated, please use :hg:`heads` instead.
6498 This command is deprecated, please use :hg:`heads` instead.
6492
6499
6493 Returns 0 on success.
6500 Returns 0 on success.
6494 """
6501 """
6495 displayer = cmdutil.show_changeset(ui, repo, opts)
6502 displayer = cmdutil.show_changeset(ui, repo, opts)
6496 displayer.show(repo['tip'])
6503 displayer.show(repo['tip'])
6497 displayer.close()
6504 displayer.close()
6498
6505
6499 @command('unbundle',
6506 @command('unbundle',
6500 [('u', 'update', None,
6507 [('u', 'update', None,
6501 _('update to new branch head if changesets were unbundled'))],
6508 _('update to new branch head if changesets were unbundled'))],
6502 _('[-u] FILE...'))
6509 _('[-u] FILE...'))
6503 def unbundle(ui, repo, fname1, *fnames, **opts):
6510 def unbundle(ui, repo, fname1, *fnames, **opts):
6504 """apply one or more changegroup files
6511 """apply one or more changegroup files
6505
6512
6506 Apply one or more compressed changegroup files generated by the
6513 Apply one or more compressed changegroup files generated by the
6507 bundle command.
6514 bundle command.
6508
6515
6509 Returns 0 on success, 1 if an update has unresolved files.
6516 Returns 0 on success, 1 if an update has unresolved files.
6510 """
6517 """
6511 fnames = (fname1,) + fnames
6518 fnames = (fname1,) + fnames
6512
6519
6513 lock = repo.lock()
6520 lock = repo.lock()
6514 try:
6521 try:
6515 for fname in fnames:
6522 for fname in fnames:
6516 f = hg.openpath(ui, fname)
6523 f = hg.openpath(ui, fname)
6517 gen = exchange.readbundle(ui, f, fname)
6524 gen = exchange.readbundle(ui, f, fname)
6518 if isinstance(gen, bundle2.unbundle20):
6525 if isinstance(gen, bundle2.unbundle20):
6519 tr = repo.transaction('unbundle')
6526 tr = repo.transaction('unbundle')
6520 try:
6527 try:
6521 op = bundle2.processbundle(repo, gen, lambda: tr)
6528 op = bundle2.processbundle(repo, gen, lambda: tr)
6522 tr.close()
6529 tr.close()
6523 except error.BundleUnknownFeatureError as exc:
6530 except error.BundleUnknownFeatureError as exc:
6524 raise error.Abort(_('%s: unknown bundle feature, %s')
6531 raise error.Abort(_('%s: unknown bundle feature, %s')
6525 % (fname, exc),
6532 % (fname, exc),
6526 hint=_("see https://mercurial-scm.org/"
6533 hint=_("see https://mercurial-scm.org/"
6527 "wiki/BundleFeature for more "
6534 "wiki/BundleFeature for more "
6528 "information"))
6535 "information"))
6529 finally:
6536 finally:
6530 if tr:
6537 if tr:
6531 tr.release()
6538 tr.release()
6532 changes = [r.get('return', 0)
6539 changes = [r.get('return', 0)
6533 for r in op.records['changegroup']]
6540 for r in op.records['changegroup']]
6534 modheads = changegroup.combineresults(changes)
6541 modheads = changegroup.combineresults(changes)
6542 elif isinstance(gen, streamclone.streamcloneapplier):
6543 raise error.Abort(
6544 _('packed bundles cannot be applied with '
6545 '"hg unbundle"'),
6546 hint=_('use "hg debugapplystreamclonebundle"'))
6535 else:
6547 else:
6536 modheads = gen.apply(repo, 'unbundle', 'bundle:' + fname)
6548 modheads = gen.apply(repo, 'unbundle', 'bundle:' + fname)
6537 finally:
6549 finally:
6538 lock.release()
6550 lock.release()
6539
6551
6540 return postincoming(ui, repo, modheads, opts.get('update'), None)
6552 return postincoming(ui, repo, modheads, opts.get('update'), None)
6541
6553
6542 @command('^update|up|checkout|co',
6554 @command('^update|up|checkout|co',
6543 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
6555 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
6544 ('c', 'check', None,
6556 ('c', 'check', None,
6545 _('update across branches if no uncommitted changes')),
6557 _('update across branches if no uncommitted changes')),
6546 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
6558 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
6547 ('r', 'rev', '', _('revision'), _('REV'))
6559 ('r', 'rev', '', _('revision'), _('REV'))
6548 ] + mergetoolopts,
6560 ] + mergetoolopts,
6549 _('[-c] [-C] [-d DATE] [[-r] REV]'))
6561 _('[-c] [-C] [-d DATE] [[-r] REV]'))
6550 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
6562 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
6551 tool=None):
6563 tool=None):
6552 """update working directory (or switch revisions)
6564 """update working directory (or switch revisions)
6553
6565
6554 Update the repository's working directory to the specified
6566 Update the repository's working directory to the specified
6555 changeset. If no changeset is specified, update to the tip of the
6567 changeset. If no changeset is specified, update to the tip of the
6556 current named branch and move the active bookmark (see :hg:`help
6568 current named branch and move the active bookmark (see :hg:`help
6557 bookmarks`).
6569 bookmarks`).
6558
6570
6559 Update sets the working directory's parent revision to the specified
6571 Update sets the working directory's parent revision to the specified
6560 changeset (see :hg:`help parents`).
6572 changeset (see :hg:`help parents`).
6561
6573
6562 If the changeset is not a descendant or ancestor of the working
6574 If the changeset is not a descendant or ancestor of the working
6563 directory's parent, the update is aborted. With the -c/--check
6575 directory's parent, the update is aborted. With the -c/--check
6564 option, the working directory is checked for uncommitted changes; if
6576 option, the working directory is checked for uncommitted changes; if
6565 none are found, the working directory is updated to the specified
6577 none are found, the working directory is updated to the specified
6566 changeset.
6578 changeset.
6567
6579
6568 .. container:: verbose
6580 .. container:: verbose
6569
6581
6570 The following rules apply when the working directory contains
6582 The following rules apply when the working directory contains
6571 uncommitted changes:
6583 uncommitted changes:
6572
6584
6573 1. If neither -c/--check nor -C/--clean is specified, and if
6585 1. If neither -c/--check nor -C/--clean is specified, and if
6574 the requested changeset is an ancestor or descendant of
6586 the requested changeset is an ancestor or descendant of
6575 the working directory's parent, the uncommitted changes
6587 the working directory's parent, the uncommitted changes
6576 are merged into the requested changeset and the merged
6588 are merged into the requested changeset and the merged
6577 result is left uncommitted. If the requested changeset is
6589 result is left uncommitted. If the requested changeset is
6578 not an ancestor or descendant (that is, it is on another
6590 not an ancestor or descendant (that is, it is on another
6579 branch), the update is aborted and the uncommitted changes
6591 branch), the update is aborted and the uncommitted changes
6580 are preserved.
6592 are preserved.
6581
6593
6582 2. With the -c/--check option, the update is aborted and the
6594 2. With the -c/--check option, the update is aborted and the
6583 uncommitted changes are preserved.
6595 uncommitted changes are preserved.
6584
6596
6585 3. With the -C/--clean option, uncommitted changes are discarded and
6597 3. With the -C/--clean option, uncommitted changes are discarded and
6586 the working directory is updated to the requested changeset.
6598 the working directory is updated to the requested changeset.
6587
6599
6588 To cancel an uncommitted merge (and lose your changes), use
6600 To cancel an uncommitted merge (and lose your changes), use
6589 :hg:`update --clean .`.
6601 :hg:`update --clean .`.
6590
6602
6591 Use null as the changeset to remove the working directory (like
6603 Use null as the changeset to remove the working directory (like
6592 :hg:`clone -U`).
6604 :hg:`clone -U`).
6593
6605
6594 If you want to revert just one file to an older revision, use
6606 If you want to revert just one file to an older revision, use
6595 :hg:`revert [-r REV] NAME`.
6607 :hg:`revert [-r REV] NAME`.
6596
6608
6597 See :hg:`help dates` for a list of formats valid for -d/--date.
6609 See :hg:`help dates` for a list of formats valid for -d/--date.
6598
6610
6599 Returns 0 on success, 1 if there are unresolved files.
6611 Returns 0 on success, 1 if there are unresolved files.
6600 """
6612 """
6601 movemarkfrom = None
6613 movemarkfrom = None
6602 if rev and node:
6614 if rev and node:
6603 raise error.Abort(_("please specify just one revision"))
6615 raise error.Abort(_("please specify just one revision"))
6604
6616
6605 if rev is None or rev == '':
6617 if rev is None or rev == '':
6606 rev = node
6618 rev = node
6607
6619
6608 wlock = repo.wlock()
6620 wlock = repo.wlock()
6609 try:
6621 try:
6610 cmdutil.clearunfinished(repo)
6622 cmdutil.clearunfinished(repo)
6611
6623
6612 if date:
6624 if date:
6613 if rev is not None:
6625 if rev is not None:
6614 raise error.Abort(_("you can't specify a revision and a date"))
6626 raise error.Abort(_("you can't specify a revision and a date"))
6615 rev = cmdutil.finddate(ui, repo, date)
6627 rev = cmdutil.finddate(ui, repo, date)
6616
6628
6617 # if we defined a bookmark, we have to remember the original name
6629 # if we defined a bookmark, we have to remember the original name
6618 brev = rev
6630 brev = rev
6619 rev = scmutil.revsingle(repo, rev, rev).rev()
6631 rev = scmutil.revsingle(repo, rev, rev).rev()
6620
6632
6621 if check and clean:
6633 if check and clean:
6622 raise error.Abort(_("cannot specify both -c/--check and -C/--clean")
6634 raise error.Abort(_("cannot specify both -c/--check and -C/--clean")
6623 )
6635 )
6624
6636
6625 if check:
6637 if check:
6626 cmdutil.bailifchanged(repo, merge=False)
6638 cmdutil.bailifchanged(repo, merge=False)
6627 if rev is None:
6639 if rev is None:
6628 updata = destutil.destupdate(repo, clean=clean, check=check)
6640 updata = destutil.destupdate(repo, clean=clean, check=check)
6629 rev, movemarkfrom, brev = updata
6641 rev, movemarkfrom, brev = updata
6630
6642
6631 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
6643 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
6632
6644
6633 if clean:
6645 if clean:
6634 ret = hg.clean(repo, rev)
6646 ret = hg.clean(repo, rev)
6635 else:
6647 else:
6636 ret = hg.update(repo, rev)
6648 ret = hg.update(repo, rev)
6637
6649
6638 if not ret and movemarkfrom:
6650 if not ret and movemarkfrom:
6639 if movemarkfrom == repo['.'].node():
6651 if movemarkfrom == repo['.'].node():
6640 pass # no-op update
6652 pass # no-op update
6641 elif bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
6653 elif bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
6642 ui.status(_("updating bookmark %s\n") % repo._activebookmark)
6654 ui.status(_("updating bookmark %s\n") % repo._activebookmark)
6643 else:
6655 else:
6644 # this can happen with a non-linear update
6656 # this can happen with a non-linear update
6645 ui.status(_("(leaving bookmark %s)\n") %
6657 ui.status(_("(leaving bookmark %s)\n") %
6646 repo._activebookmark)
6658 repo._activebookmark)
6647 bookmarks.deactivate(repo)
6659 bookmarks.deactivate(repo)
6648 elif brev in repo._bookmarks:
6660 elif brev in repo._bookmarks:
6649 bookmarks.activate(repo, brev)
6661 bookmarks.activate(repo, brev)
6650 ui.status(_("(activating bookmark %s)\n") % brev)
6662 ui.status(_("(activating bookmark %s)\n") % brev)
6651 elif brev:
6663 elif brev:
6652 if repo._activebookmark:
6664 if repo._activebookmark:
6653 ui.status(_("(leaving bookmark %s)\n") %
6665 ui.status(_("(leaving bookmark %s)\n") %
6654 repo._activebookmark)
6666 repo._activebookmark)
6655 bookmarks.deactivate(repo)
6667 bookmarks.deactivate(repo)
6656 finally:
6668 finally:
6657 wlock.release()
6669 wlock.release()
6658
6670
6659 return ret
6671 return ret
6660
6672
6661 @command('verify', [])
6673 @command('verify', [])
6662 def verify(ui, repo):
6674 def verify(ui, repo):
6663 """verify the integrity of the repository
6675 """verify the integrity of the repository
6664
6676
6665 Verify the integrity of the current repository.
6677 Verify the integrity of the current repository.
6666
6678
6667 This will perform an extensive check of the repository's
6679 This will perform an extensive check of the repository's
6668 integrity, validating the hashes and checksums of each entry in
6680 integrity, validating the hashes and checksums of each entry in
6669 the changelog, manifest, and tracked files, as well as the
6681 the changelog, manifest, and tracked files, as well as the
6670 integrity of their crosslinks and indices.
6682 integrity of their crosslinks and indices.
6671
6683
6672 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
6684 Please see https://mercurial-scm.org/wiki/RepositoryCorruption
6673 for more information about recovery from corruption of the
6685 for more information about recovery from corruption of the
6674 repository.
6686 repository.
6675
6687
6676 Returns 0 on success, 1 if errors are encountered.
6688 Returns 0 on success, 1 if errors are encountered.
6677 """
6689 """
6678 return hg.verify(repo)
6690 return hg.verify(repo)
6679
6691
6680 @command('version', [], norepo=True)
6692 @command('version', [], norepo=True)
6681 def version_(ui):
6693 def version_(ui):
6682 """output version and copyright information"""
6694 """output version and copyright information"""
6683 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6695 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6684 % util.version())
6696 % util.version())
6685 ui.status(_(
6697 ui.status(_(
6686 "(see https://mercurial-scm.org for more information)\n"
6698 "(see https://mercurial-scm.org for more information)\n"
6687 "\nCopyright (C) 2005-2015 Matt Mackall and others\n"
6699 "\nCopyright (C) 2005-2015 Matt Mackall and others\n"
6688 "This is free software; see the source for copying conditions. "
6700 "This is free software; see the source for copying conditions. "
6689 "There is NO\nwarranty; "
6701 "There is NO\nwarranty; "
6690 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6702 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6691 ))
6703 ))
6692
6704
6693 ui.note(_("\nEnabled extensions:\n\n"))
6705 ui.note(_("\nEnabled extensions:\n\n"))
6694 if ui.verbose:
6706 if ui.verbose:
6695 # format names and versions into columns
6707 # format names and versions into columns
6696 names = []
6708 names = []
6697 vers = []
6709 vers = []
6698 for name, module in extensions.extensions():
6710 for name, module in extensions.extensions():
6699 names.append(name)
6711 names.append(name)
6700 vers.append(extensions.moduleversion(module))
6712 vers.append(extensions.moduleversion(module))
6701 if names:
6713 if names:
6702 maxnamelen = max(len(n) for n in names)
6714 maxnamelen = max(len(n) for n in names)
6703 for i, name in enumerate(names):
6715 for i, name in enumerate(names):
6704 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
6716 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
@@ -1,697 +1,717 b''
1 Setting up test
1 Setting up test
2
2
3 $ hg init test
3 $ hg init test
4 $ cd test
4 $ cd test
5 $ echo 0 > afile
5 $ echo 0 > afile
6 $ hg add afile
6 $ hg add afile
7 $ hg commit -m "0.0"
7 $ hg commit -m "0.0"
8 $ echo 1 >> afile
8 $ echo 1 >> afile
9 $ hg commit -m "0.1"
9 $ hg commit -m "0.1"
10 $ echo 2 >> afile
10 $ echo 2 >> afile
11 $ hg commit -m "0.2"
11 $ hg commit -m "0.2"
12 $ echo 3 >> afile
12 $ echo 3 >> afile
13 $ hg commit -m "0.3"
13 $ hg commit -m "0.3"
14 $ hg update -C 0
14 $ hg update -C 0
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 $ echo 1 >> afile
16 $ echo 1 >> afile
17 $ hg commit -m "1.1"
17 $ hg commit -m "1.1"
18 created new head
18 created new head
19 $ echo 2 >> afile
19 $ echo 2 >> afile
20 $ hg commit -m "1.2"
20 $ hg commit -m "1.2"
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"
24 $ hg commit -m "1.3"
25 $ hg mv afile adifferentfile
25 $ hg mv afile adifferentfile
26 $ hg commit -m "1.3m"
26 $ hg commit -m "1.3m"
27 $ hg update -C 3
27 $ hg update -C 3
28 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
28 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
29 $ hg mv afile anotherfile
29 $ hg mv afile anotherfile
30 $ hg commit -m "0.3m"
30 $ hg commit -m "0.3m"
31 $ hg verify
31 $ hg verify
32 checking changesets
32 checking changesets
33 checking manifests
33 checking manifests
34 crosschecking files in changesets and manifests
34 crosschecking files in changesets and manifests
35 checking files
35 checking files
36 4 files, 9 changesets, 7 total revisions
36 4 files, 9 changesets, 7 total revisions
37 $ cd ..
37 $ cd ..
38 $ hg init empty
38 $ hg init empty
39
39
40 Bundle and phase
40 Bundle and phase
41
41
42 $ hg -R test phase --force --secret 0
42 $ hg -R test phase --force --secret 0
43 $ hg -R test bundle phase.hg empty
43 $ hg -R test bundle phase.hg empty
44 searching for changes
44 searching for changes
45 no changes found (ignored 9 secret changesets)
45 no changes found (ignored 9 secret changesets)
46 [1]
46 [1]
47 $ hg -R test phase --draft -r 'head()'
47 $ hg -R test phase --draft -r 'head()'
48
48
49 Bundle --all
49 Bundle --all
50
50
51 $ hg -R test bundle --all all.hg
51 $ hg -R test bundle --all all.hg
52 9 changesets found
52 9 changesets found
53
53
54 Bundle test to full.hg
54 Bundle test to full.hg
55
55
56 $ hg -R test bundle full.hg empty
56 $ hg -R test bundle full.hg empty
57 searching for changes
57 searching for changes
58 9 changesets found
58 9 changesets found
59
59
60 Unbundle full.hg in test
60 Unbundle full.hg in test
61
61
62 $ hg -R test unbundle full.hg
62 $ hg -R test unbundle full.hg
63 adding changesets
63 adding changesets
64 adding manifests
64 adding manifests
65 adding file changes
65 adding file changes
66 added 0 changesets with 0 changes to 4 files
66 added 0 changesets with 0 changes to 4 files
67 (run 'hg update' to get a working copy)
67 (run 'hg update' to get a working copy)
68
68
69 Verify empty
69 Verify empty
70
70
71 $ hg -R empty heads
71 $ hg -R empty heads
72 [1]
72 [1]
73 $ hg -R empty verify
73 $ hg -R empty verify
74 checking changesets
74 checking changesets
75 checking manifests
75 checking manifests
76 crosschecking files in changesets and manifests
76 crosschecking files in changesets and manifests
77 checking files
77 checking files
78 0 files, 0 changesets, 0 total revisions
78 0 files, 0 changesets, 0 total revisions
79
79
80 Pull full.hg into test (using --cwd)
80 Pull full.hg into test (using --cwd)
81
81
82 $ hg --cwd test pull ../full.hg
82 $ hg --cwd test pull ../full.hg
83 pulling from ../full.hg
83 pulling from ../full.hg
84 searching for changes
84 searching for changes
85 no changes found
85 no changes found
86
86
87 Verify that there are no leaked temporary files after pull (issue2797)
87 Verify that there are no leaked temporary files after pull (issue2797)
88
88
89 $ ls test/.hg | grep .hg10un
89 $ ls test/.hg | grep .hg10un
90 [1]
90 [1]
91
91
92 Pull full.hg into empty (using --cwd)
92 Pull full.hg into empty (using --cwd)
93
93
94 $ hg --cwd empty pull ../full.hg
94 $ hg --cwd empty pull ../full.hg
95 pulling from ../full.hg
95 pulling from ../full.hg
96 requesting all changes
96 requesting all changes
97 adding changesets
97 adding changesets
98 adding manifests
98 adding manifests
99 adding file changes
99 adding file changes
100 added 9 changesets with 7 changes to 4 files (+1 heads)
100 added 9 changesets with 7 changes to 4 files (+1 heads)
101 (run 'hg heads' to see heads, 'hg merge' to merge)
101 (run 'hg heads' to see heads, 'hg merge' to merge)
102
102
103 Rollback empty
103 Rollback empty
104
104
105 $ hg -R empty rollback
105 $ hg -R empty rollback
106 repository tip rolled back to revision -1 (undo pull)
106 repository tip rolled back to revision -1 (undo pull)
107
107
108 Pull full.hg into empty again (using --cwd)
108 Pull full.hg into empty again (using --cwd)
109
109
110 $ hg --cwd empty pull ../full.hg
110 $ hg --cwd empty pull ../full.hg
111 pulling from ../full.hg
111 pulling from ../full.hg
112 requesting all changes
112 requesting all changes
113 adding changesets
113 adding changesets
114 adding manifests
114 adding manifests
115 adding file changes
115 adding file changes
116 added 9 changesets with 7 changes to 4 files (+1 heads)
116 added 9 changesets with 7 changes to 4 files (+1 heads)
117 (run 'hg heads' to see heads, 'hg merge' to merge)
117 (run 'hg heads' to see heads, 'hg merge' to merge)
118
118
119 Pull full.hg into test (using -R)
119 Pull full.hg into test (using -R)
120
120
121 $ hg -R test pull full.hg
121 $ hg -R test pull full.hg
122 pulling from full.hg
122 pulling from full.hg
123 searching for changes
123 searching for changes
124 no changes found
124 no changes found
125
125
126 Pull full.hg into empty (using -R)
126 Pull full.hg into empty (using -R)
127
127
128 $ hg -R empty pull full.hg
128 $ hg -R empty pull full.hg
129 pulling from full.hg
129 pulling from full.hg
130 searching for changes
130 searching for changes
131 no changes found
131 no changes found
132
132
133 Rollback empty
133 Rollback empty
134
134
135 $ hg -R empty rollback
135 $ hg -R empty rollback
136 repository tip rolled back to revision -1 (undo pull)
136 repository tip rolled back to revision -1 (undo pull)
137
137
138 Pull full.hg into empty again (using -R)
138 Pull full.hg into empty again (using -R)
139
139
140 $ hg -R empty pull full.hg
140 $ hg -R empty pull full.hg
141 pulling from full.hg
141 pulling from full.hg
142 requesting all changes
142 requesting all changes
143 adding changesets
143 adding changesets
144 adding manifests
144 adding manifests
145 adding file changes
145 adding file changes
146 added 9 changesets with 7 changes to 4 files (+1 heads)
146 added 9 changesets with 7 changes to 4 files (+1 heads)
147 (run 'hg heads' to see heads, 'hg merge' to merge)
147 (run 'hg heads' to see heads, 'hg merge' to merge)
148
148
149 Log -R full.hg in fresh empty
149 Log -R full.hg in fresh empty
150
150
151 $ rm -r empty
151 $ rm -r empty
152 $ hg init empty
152 $ hg init empty
153 $ cd empty
153 $ cd empty
154 $ hg -R bundle://../full.hg log
154 $ hg -R bundle://../full.hg log
155 changeset: 8:aa35859c02ea
155 changeset: 8:aa35859c02ea
156 tag: tip
156 tag: tip
157 parent: 3:eebf5a27f8ca
157 parent: 3:eebf5a27f8ca
158 user: test
158 user: test
159 date: Thu Jan 01 00:00:00 1970 +0000
159 date: Thu Jan 01 00:00:00 1970 +0000
160 summary: 0.3m
160 summary: 0.3m
161
161
162 changeset: 7:a6a34bfa0076
162 changeset: 7:a6a34bfa0076
163 user: test
163 user: test
164 date: Thu Jan 01 00:00:00 1970 +0000
164 date: Thu Jan 01 00:00:00 1970 +0000
165 summary: 1.3m
165 summary: 1.3m
166
166
167 changeset: 6:7373c1169842
167 changeset: 6:7373c1169842
168 user: test
168 user: test
169 date: Thu Jan 01 00:00:00 1970 +0000
169 date: Thu Jan 01 00:00:00 1970 +0000
170 summary: 1.3
170 summary: 1.3
171
171
172 changeset: 5:1bb50a9436a7
172 changeset: 5:1bb50a9436a7
173 user: test
173 user: test
174 date: Thu Jan 01 00:00:00 1970 +0000
174 date: Thu Jan 01 00:00:00 1970 +0000
175 summary: 1.2
175 summary: 1.2
176
176
177 changeset: 4:095197eb4973
177 changeset: 4:095197eb4973
178 parent: 0:f9ee2f85a263
178 parent: 0:f9ee2f85a263
179 user: test
179 user: test
180 date: Thu Jan 01 00:00:00 1970 +0000
180 date: Thu Jan 01 00:00:00 1970 +0000
181 summary: 1.1
181 summary: 1.1
182
182
183 changeset: 3:eebf5a27f8ca
183 changeset: 3:eebf5a27f8ca
184 user: test
184 user: test
185 date: Thu Jan 01 00:00:00 1970 +0000
185 date: Thu Jan 01 00:00:00 1970 +0000
186 summary: 0.3
186 summary: 0.3
187
187
188 changeset: 2:e38ba6f5b7e0
188 changeset: 2:e38ba6f5b7e0
189 user: test
189 user: test
190 date: Thu Jan 01 00:00:00 1970 +0000
190 date: Thu Jan 01 00:00:00 1970 +0000
191 summary: 0.2
191 summary: 0.2
192
192
193 changeset: 1:34c2bf6b0626
193 changeset: 1:34c2bf6b0626
194 user: test
194 user: test
195 date: Thu Jan 01 00:00:00 1970 +0000
195 date: Thu Jan 01 00:00:00 1970 +0000
196 summary: 0.1
196 summary: 0.1
197
197
198 changeset: 0:f9ee2f85a263
198 changeset: 0:f9ee2f85a263
199 user: test
199 user: test
200 date: Thu Jan 01 00:00:00 1970 +0000
200 date: Thu Jan 01 00:00:00 1970 +0000
201 summary: 0.0
201 summary: 0.0
202
202
203 Make sure bundlerepo doesn't leak tempfiles (issue2491)
203 Make sure bundlerepo doesn't leak tempfiles (issue2491)
204
204
205 $ ls .hg
205 $ ls .hg
206 00changelog.i
206 00changelog.i
207 cache
207 cache
208 requires
208 requires
209 store
209 store
210
210
211 Pull ../full.hg into empty (with hook)
211 Pull ../full.hg into empty (with hook)
212
212
213 $ echo "[hooks]" >> .hg/hgrc
213 $ echo "[hooks]" >> .hg/hgrc
214 $ echo "changegroup = printenv.py changegroup" >> .hg/hgrc
214 $ echo "changegroup = printenv.py changegroup" >> .hg/hgrc
215
215
216 doesn't work (yet ?)
216 doesn't work (yet ?)
217
217
218 hg -R bundle://../full.hg verify
218 hg -R bundle://../full.hg verify
219
219
220 $ hg pull bundle://../full.hg
220 $ hg pull bundle://../full.hg
221 pulling from bundle:../full.hg
221 pulling from bundle:../full.hg
222 requesting all changes
222 requesting all changes
223 adding changesets
223 adding changesets
224 adding manifests
224 adding manifests
225 adding file changes
225 adding file changes
226 added 9 changesets with 7 changes to 4 files (+1 heads)
226 added 9 changesets with 7 changes to 4 files (+1 heads)
227 changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=bundle:../full.hg (glob)
227 changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=bundle:../full.hg (glob)
228 (run 'hg heads' to see heads, 'hg merge' to merge)
228 (run 'hg heads' to see heads, 'hg merge' to merge)
229
229
230 Rollback empty
230 Rollback empty
231
231
232 $ hg rollback
232 $ hg rollback
233 repository tip rolled back to revision -1 (undo pull)
233 repository tip rolled back to revision -1 (undo pull)
234 $ cd ..
234 $ cd ..
235
235
236 Log -R bundle:empty+full.hg
236 Log -R bundle:empty+full.hg
237
237
238 $ hg -R bundle:empty+full.hg log --template="{rev} "; echo ""
238 $ hg -R bundle:empty+full.hg log --template="{rev} "; echo ""
239 8 7 6 5 4 3 2 1 0
239 8 7 6 5 4 3 2 1 0
240
240
241 Pull full.hg into empty again (using -R; with hook)
241 Pull full.hg into empty again (using -R; with hook)
242
242
243 $ hg -R empty pull full.hg
243 $ hg -R empty pull full.hg
244 pulling from full.hg
244 pulling from full.hg
245 requesting all changes
245 requesting all changes
246 adding changesets
246 adding changesets
247 adding manifests
247 adding manifests
248 adding file changes
248 adding file changes
249 added 9 changesets with 7 changes to 4 files (+1 heads)
249 added 9 changesets with 7 changes to 4 files (+1 heads)
250 changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=bundle:empty+full.hg (glob)
250 changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_TXNID=TXN:* HG_URL=bundle:empty+full.hg (glob)
251 (run 'hg heads' to see heads, 'hg merge' to merge)
251 (run 'hg heads' to see heads, 'hg merge' to merge)
252
252
253 Cannot produce streaming clone bundles with "hg bundle"
253 Cannot produce streaming clone bundles with "hg bundle"
254
254
255 $ hg -R test bundle -t packed1 packed.hg
255 $ hg -R test bundle -t packed1 packed.hg
256 abort: packed bundles cannot be produced by "hg bundle"
256 abort: packed bundles cannot be produced by "hg bundle"
257 (use "hg debugcreatestreamclonebundle")
257 (use "hg debugcreatestreamclonebundle")
258 [255]
258 [255]
259
259
260 packed1 is produced properly
260 packed1 is produced properly
261
261
262 $ hg -R test debugcreatestreamclonebundle packed.hg
262 $ hg -R test debugcreatestreamclonebundle packed.hg
263 writing 2608 bytes for 6 files
263 writing 2608 bytes for 6 files
264 bundle requirements: revlogv1
264 bundle requirements: revlogv1
265
265
266 $ f -B 64 --size --sha1 --hexdump packed.hg
266 $ f -B 64 --size --sha1 --hexdump packed.hg
267 packed.hg: size=2758, sha1=864c1c7b490bac9f2950ef5a660668378ac0524e
267 packed.hg: size=2758, sha1=864c1c7b490bac9f2950ef5a660668378ac0524e
268 0000: 48 47 53 31 55 4e 00 00 00 00 00 00 00 06 00 00 |HGS1UN..........|
268 0000: 48 47 53 31 55 4e 00 00 00 00 00 00 00 06 00 00 |HGS1UN..........|
269 0010: 00 00 00 00 0a 30 00 09 72 65 76 6c 6f 67 76 31 |.....0..revlogv1|
269 0010: 00 00 00 00 0a 30 00 09 72 65 76 6c 6f 67 76 31 |.....0..revlogv1|
270 0020: 00 64 61 74 61 2f 61 64 69 66 66 65 72 65 6e 74 |.data/adifferent|
270 0020: 00 64 61 74 61 2f 61 64 69 66 66 65 72 65 6e 74 |.data/adifferent|
271 0030: 66 69 6c 65 2e 69 00 31 33 39 0a 00 01 00 01 00 |file.i.139......|
271 0030: 66 69 6c 65 2e 69 00 31 33 39 0a 00 01 00 01 00 |file.i.139......|
272
272
273 generaldelta requirement is listed in stream clone bundles
273 generaldelta requirement is listed in stream clone bundles
274
274
275 $ hg --config format.generaldelta=true init testgd
275 $ hg --config format.generaldelta=true init testgd
276 $ cd testgd
276 $ cd testgd
277 $ touch foo
277 $ touch foo
278 $ hg -q commit -A -m initial
278 $ hg -q commit -A -m initial
279 $ cd ..
279 $ cd ..
280 $ hg -R testgd debugcreatestreamclonebundle packedgd.hg
280 $ hg -R testgd debugcreatestreamclonebundle packedgd.hg
281 writing 301 bytes for 3 files
281 writing 301 bytes for 3 files
282 bundle requirements: generaldelta, revlogv1
282 bundle requirements: generaldelta, revlogv1
283
283
284 $ f -B 64 --size --sha1 --hexdump packedgd.hg
284 $ f -B 64 --size --sha1 --hexdump packedgd.hg
285 packedgd.hg: size=396, sha1=981f9e589799335304a5a9a44caa3623a48d2a9f
285 packedgd.hg: size=396, sha1=981f9e589799335304a5a9a44caa3623a48d2a9f
286 0000: 48 47 53 31 55 4e 00 00 00 00 00 00 00 03 00 00 |HGS1UN..........|
286 0000: 48 47 53 31 55 4e 00 00 00 00 00 00 00 03 00 00 |HGS1UN..........|
287 0010: 00 00 00 00 01 2d 00 16 67 65 6e 65 72 61 6c 64 |.....-..generald|
287 0010: 00 00 00 00 01 2d 00 16 67 65 6e 65 72 61 6c 64 |.....-..generald|
288 0020: 65 6c 74 61 2c 72 65 76 6c 6f 67 76 31 00 64 61 |elta,revlogv1.da|
288 0020: 65 6c 74 61 2c 72 65 76 6c 6f 67 76 31 00 64 61 |elta,revlogv1.da|
289 0030: 74 61 2f 66 6f 6f 2e 69 00 36 34 0a 00 03 00 01 |ta/foo.i.64.....|
289 0030: 74 61 2f 66 6f 6f 2e 69 00 36 34 0a 00 03 00 01 |ta/foo.i.64.....|
290
290
291 Unpacking packed1 bundles with "hg unbundle" isn't allowed
292
293 $ hg init packed
294 $ hg -R packed unbundle packed.hg
295 abort: packed bundles cannot be applied with "hg unbundle"
296 (use "hg debugapplystreamclonebundle")
297 [255]
298
299 packed1 can be consumed from debug command
300
301 $ hg -R packed debugapplystreamclonebundle packed.hg
302 6 files to transfer, 2.55 KB of data
303 transferred 2.55 KB in *.* seconds (*) (glob)
304
305 Does not work on non-empty repo
306
307 $ hg -R packed debugapplystreamclonebundle packed.hg
308 abort: cannot apply stream clone bundle on non-empty repo
309 [255]
310
291 Create partial clones
311 Create partial clones
292
312
293 $ rm -r empty
313 $ rm -r empty
294 $ hg init empty
314 $ hg init empty
295 $ hg clone -r 3 test partial
315 $ hg clone -r 3 test partial
296 adding changesets
316 adding changesets
297 adding manifests
317 adding manifests
298 adding file changes
318 adding file changes
299 added 4 changesets with 4 changes to 1 files
319 added 4 changesets with 4 changes to 1 files
300 updating to branch default
320 updating to branch default
301 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
321 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
302 $ hg clone partial partial2
322 $ hg clone partial partial2
303 updating to branch default
323 updating to branch default
304 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
324 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
305 $ cd partial
325 $ cd partial
306
326
307 Log -R full.hg in partial
327 Log -R full.hg in partial
308
328
309 $ hg -R bundle://../full.hg log -T phases
329 $ hg -R bundle://../full.hg log -T phases
310 changeset: 8:aa35859c02ea
330 changeset: 8:aa35859c02ea
311 tag: tip
331 tag: tip
312 phase: draft
332 phase: draft
313 parent: 3:eebf5a27f8ca
333 parent: 3:eebf5a27f8ca
314 user: test
334 user: test
315 date: Thu Jan 01 00:00:00 1970 +0000
335 date: Thu Jan 01 00:00:00 1970 +0000
316 summary: 0.3m
336 summary: 0.3m
317
337
318 changeset: 7:a6a34bfa0076
338 changeset: 7:a6a34bfa0076
319 phase: draft
339 phase: draft
320 user: test
340 user: test
321 date: Thu Jan 01 00:00:00 1970 +0000
341 date: Thu Jan 01 00:00:00 1970 +0000
322 summary: 1.3m
342 summary: 1.3m
323
343
324 changeset: 6:7373c1169842
344 changeset: 6:7373c1169842
325 phase: draft
345 phase: draft
326 user: test
346 user: test
327 date: Thu Jan 01 00:00:00 1970 +0000
347 date: Thu Jan 01 00:00:00 1970 +0000
328 summary: 1.3
348 summary: 1.3
329
349
330 changeset: 5:1bb50a9436a7
350 changeset: 5:1bb50a9436a7
331 phase: draft
351 phase: draft
332 user: test
352 user: test
333 date: Thu Jan 01 00:00:00 1970 +0000
353 date: Thu Jan 01 00:00:00 1970 +0000
334 summary: 1.2
354 summary: 1.2
335
355
336 changeset: 4:095197eb4973
356 changeset: 4:095197eb4973
337 phase: draft
357 phase: draft
338 parent: 0:f9ee2f85a263
358 parent: 0:f9ee2f85a263
339 user: test
359 user: test
340 date: Thu Jan 01 00:00:00 1970 +0000
360 date: Thu Jan 01 00:00:00 1970 +0000
341 summary: 1.1
361 summary: 1.1
342
362
343 changeset: 3:eebf5a27f8ca
363 changeset: 3:eebf5a27f8ca
344 phase: public
364 phase: public
345 user: test
365 user: test
346 date: Thu Jan 01 00:00:00 1970 +0000
366 date: Thu Jan 01 00:00:00 1970 +0000
347 summary: 0.3
367 summary: 0.3
348
368
349 changeset: 2:e38ba6f5b7e0
369 changeset: 2:e38ba6f5b7e0
350 phase: public
370 phase: public
351 user: test
371 user: test
352 date: Thu Jan 01 00:00:00 1970 +0000
372 date: Thu Jan 01 00:00:00 1970 +0000
353 summary: 0.2
373 summary: 0.2
354
374
355 changeset: 1:34c2bf6b0626
375 changeset: 1:34c2bf6b0626
356 phase: public
376 phase: public
357 user: test
377 user: test
358 date: Thu Jan 01 00:00:00 1970 +0000
378 date: Thu Jan 01 00:00:00 1970 +0000
359 summary: 0.1
379 summary: 0.1
360
380
361 changeset: 0:f9ee2f85a263
381 changeset: 0:f9ee2f85a263
362 phase: public
382 phase: public
363 user: test
383 user: test
364 date: Thu Jan 01 00:00:00 1970 +0000
384 date: Thu Jan 01 00:00:00 1970 +0000
365 summary: 0.0
385 summary: 0.0
366
386
367
387
368 Incoming full.hg in partial
388 Incoming full.hg in partial
369
389
370 $ hg incoming bundle://../full.hg
390 $ hg incoming bundle://../full.hg
371 comparing with bundle:../full.hg
391 comparing with bundle:../full.hg
372 searching for changes
392 searching for changes
373 changeset: 4:095197eb4973
393 changeset: 4:095197eb4973
374 parent: 0:f9ee2f85a263
394 parent: 0:f9ee2f85a263
375 user: test
395 user: test
376 date: Thu Jan 01 00:00:00 1970 +0000
396 date: Thu Jan 01 00:00:00 1970 +0000
377 summary: 1.1
397 summary: 1.1
378
398
379 changeset: 5:1bb50a9436a7
399 changeset: 5:1bb50a9436a7
380 user: test
400 user: test
381 date: Thu Jan 01 00:00:00 1970 +0000
401 date: Thu Jan 01 00:00:00 1970 +0000
382 summary: 1.2
402 summary: 1.2
383
403
384 changeset: 6:7373c1169842
404 changeset: 6:7373c1169842
385 user: test
405 user: test
386 date: Thu Jan 01 00:00:00 1970 +0000
406 date: Thu Jan 01 00:00:00 1970 +0000
387 summary: 1.3
407 summary: 1.3
388
408
389 changeset: 7:a6a34bfa0076
409 changeset: 7:a6a34bfa0076
390 user: test
410 user: test
391 date: Thu Jan 01 00:00:00 1970 +0000
411 date: Thu Jan 01 00:00:00 1970 +0000
392 summary: 1.3m
412 summary: 1.3m
393
413
394 changeset: 8:aa35859c02ea
414 changeset: 8:aa35859c02ea
395 tag: tip
415 tag: tip
396 parent: 3:eebf5a27f8ca
416 parent: 3:eebf5a27f8ca
397 user: test
417 user: test
398 date: Thu Jan 01 00:00:00 1970 +0000
418 date: Thu Jan 01 00:00:00 1970 +0000
399 summary: 0.3m
419 summary: 0.3m
400
420
401
421
402 Outgoing -R full.hg vs partial2 in partial
422 Outgoing -R full.hg vs partial2 in partial
403
423
404 $ hg -R bundle://../full.hg outgoing ../partial2
424 $ hg -R bundle://../full.hg outgoing ../partial2
405 comparing with ../partial2
425 comparing with ../partial2
406 searching for changes
426 searching for changes
407 changeset: 4:095197eb4973
427 changeset: 4:095197eb4973
408 parent: 0:f9ee2f85a263
428 parent: 0:f9ee2f85a263
409 user: test
429 user: test
410 date: Thu Jan 01 00:00:00 1970 +0000
430 date: Thu Jan 01 00:00:00 1970 +0000
411 summary: 1.1
431 summary: 1.1
412
432
413 changeset: 5:1bb50a9436a7
433 changeset: 5:1bb50a9436a7
414 user: test
434 user: test
415 date: Thu Jan 01 00:00:00 1970 +0000
435 date: Thu Jan 01 00:00:00 1970 +0000
416 summary: 1.2
436 summary: 1.2
417
437
418 changeset: 6:7373c1169842
438 changeset: 6:7373c1169842
419 user: test
439 user: test
420 date: Thu Jan 01 00:00:00 1970 +0000
440 date: Thu Jan 01 00:00:00 1970 +0000
421 summary: 1.3
441 summary: 1.3
422
442
423 changeset: 7:a6a34bfa0076
443 changeset: 7:a6a34bfa0076
424 user: test
444 user: test
425 date: Thu Jan 01 00:00:00 1970 +0000
445 date: Thu Jan 01 00:00:00 1970 +0000
426 summary: 1.3m
446 summary: 1.3m
427
447
428 changeset: 8:aa35859c02ea
448 changeset: 8:aa35859c02ea
429 tag: tip
449 tag: tip
430 parent: 3:eebf5a27f8ca
450 parent: 3:eebf5a27f8ca
431 user: test
451 user: test
432 date: Thu Jan 01 00:00:00 1970 +0000
452 date: Thu Jan 01 00:00:00 1970 +0000
433 summary: 0.3m
453 summary: 0.3m
434
454
435
455
436 Outgoing -R does-not-exist.hg vs partial2 in partial
456 Outgoing -R does-not-exist.hg vs partial2 in partial
437
457
438 $ hg -R bundle://../does-not-exist.hg outgoing ../partial2
458 $ hg -R bundle://../does-not-exist.hg outgoing ../partial2
439 abort: *../does-not-exist.hg* (glob)
459 abort: *../does-not-exist.hg* (glob)
440 [255]
460 [255]
441 $ cd ..
461 $ cd ..
442
462
443 hide outer repo
463 hide outer repo
444 $ hg init
464 $ hg init
445
465
446 Direct clone from bundle (all-history)
466 Direct clone from bundle (all-history)
447
467
448 $ hg clone full.hg full-clone
468 $ hg clone full.hg full-clone
449 requesting all changes
469 requesting all changes
450 adding changesets
470 adding changesets
451 adding manifests
471 adding manifests
452 adding file changes
472 adding file changes
453 added 9 changesets with 7 changes to 4 files (+1 heads)
473 added 9 changesets with 7 changes to 4 files (+1 heads)
454 updating to branch default
474 updating to branch default
455 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
475 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
456 $ hg -R full-clone heads
476 $ hg -R full-clone heads
457 changeset: 8:aa35859c02ea
477 changeset: 8:aa35859c02ea
458 tag: tip
478 tag: tip
459 parent: 3:eebf5a27f8ca
479 parent: 3:eebf5a27f8ca
460 user: test
480 user: test
461 date: Thu Jan 01 00:00:00 1970 +0000
481 date: Thu Jan 01 00:00:00 1970 +0000
462 summary: 0.3m
482 summary: 0.3m
463
483
464 changeset: 7:a6a34bfa0076
484 changeset: 7:a6a34bfa0076
465 user: test
485 user: test
466 date: Thu Jan 01 00:00:00 1970 +0000
486 date: Thu Jan 01 00:00:00 1970 +0000
467 summary: 1.3m
487 summary: 1.3m
468
488
469 $ rm -r full-clone
489 $ rm -r full-clone
470
490
471 When cloning from a non-copiable repository into '', do not
491 When cloning from a non-copiable repository into '', do not
472 recurse infinitely (issue2528)
492 recurse infinitely (issue2528)
473
493
474 $ hg clone full.hg ''
494 $ hg clone full.hg ''
475 abort: empty destination path is not valid
495 abort: empty destination path is not valid
476 [255]
496 [255]
477
497
478 test for https://bz.mercurial-scm.org/216
498 test for https://bz.mercurial-scm.org/216
479
499
480 Unbundle incremental bundles into fresh empty in one go
500 Unbundle incremental bundles into fresh empty in one go
481
501
482 $ rm -r empty
502 $ rm -r empty
483 $ hg init empty
503 $ hg init empty
484 $ hg -R test bundle --base null -r 0 ../0.hg
504 $ hg -R test bundle --base null -r 0 ../0.hg
485 1 changesets found
505 1 changesets found
486 $ hg -R test bundle --base 0 -r 1 ../1.hg
506 $ hg -R test bundle --base 0 -r 1 ../1.hg
487 1 changesets found
507 1 changesets found
488 $ hg -R empty unbundle -u ../0.hg ../1.hg
508 $ hg -R empty unbundle -u ../0.hg ../1.hg
489 adding changesets
509 adding changesets
490 adding manifests
510 adding manifests
491 adding file changes
511 adding file changes
492 added 1 changesets with 1 changes to 1 files
512 added 1 changesets with 1 changes to 1 files
493 adding changesets
513 adding changesets
494 adding manifests
514 adding manifests
495 adding file changes
515 adding file changes
496 added 1 changesets with 1 changes to 1 files
516 added 1 changesets with 1 changes to 1 files
497 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
517 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
498
518
499 View full contents of the bundle
519 View full contents of the bundle
500 $ hg -R test bundle --base null -r 3 ../partial.hg
520 $ hg -R test bundle --base null -r 3 ../partial.hg
501 4 changesets found
521 4 changesets found
502 $ cd test
522 $ cd test
503 $ hg -R ../../partial.hg log -r "bundle()"
523 $ hg -R ../../partial.hg log -r "bundle()"
504 changeset: 0:f9ee2f85a263
524 changeset: 0:f9ee2f85a263
505 user: test
525 user: test
506 date: Thu Jan 01 00:00:00 1970 +0000
526 date: Thu Jan 01 00:00:00 1970 +0000
507 summary: 0.0
527 summary: 0.0
508
528
509 changeset: 1:34c2bf6b0626
529 changeset: 1:34c2bf6b0626
510 user: test
530 user: test
511 date: Thu Jan 01 00:00:00 1970 +0000
531 date: Thu Jan 01 00:00:00 1970 +0000
512 summary: 0.1
532 summary: 0.1
513
533
514 changeset: 2:e38ba6f5b7e0
534 changeset: 2:e38ba6f5b7e0
515 user: test
535 user: test
516 date: Thu Jan 01 00:00:00 1970 +0000
536 date: Thu Jan 01 00:00:00 1970 +0000
517 summary: 0.2
537 summary: 0.2
518
538
519 changeset: 3:eebf5a27f8ca
539 changeset: 3:eebf5a27f8ca
520 user: test
540 user: test
521 date: Thu Jan 01 00:00:00 1970 +0000
541 date: Thu Jan 01 00:00:00 1970 +0000
522 summary: 0.3
542 summary: 0.3
523
543
524 $ cd ..
544 $ cd ..
525
545
526 test for 540d1059c802
546 test for 540d1059c802
527
547
528 test for 540d1059c802
548 test for 540d1059c802
529
549
530 $ hg init orig
550 $ hg init orig
531 $ cd orig
551 $ cd orig
532 $ echo foo > foo
552 $ echo foo > foo
533 $ hg add foo
553 $ hg add foo
534 $ hg ci -m 'add foo'
554 $ hg ci -m 'add foo'
535
555
536 $ hg clone . ../copy
556 $ hg clone . ../copy
537 updating to branch default
557 updating to branch default
538 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
558 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
539 $ hg tag foo
559 $ hg tag foo
540
560
541 $ cd ../copy
561 $ cd ../copy
542 $ echo >> foo
562 $ echo >> foo
543 $ hg ci -m 'change foo'
563 $ hg ci -m 'change foo'
544 $ hg bundle ../bundle.hg ../orig
564 $ hg bundle ../bundle.hg ../orig
545 searching for changes
565 searching for changes
546 1 changesets found
566 1 changesets found
547
567
548 $ cd ../orig
568 $ cd ../orig
549 $ hg incoming ../bundle.hg
569 $ hg incoming ../bundle.hg
550 comparing with ../bundle.hg
570 comparing with ../bundle.hg
551 searching for changes
571 searching for changes
552 changeset: 2:ed1b79f46b9a
572 changeset: 2:ed1b79f46b9a
553 tag: tip
573 tag: tip
554 parent: 0:bbd179dfa0a7
574 parent: 0:bbd179dfa0a7
555 user: test
575 user: test
556 date: Thu Jan 01 00:00:00 1970 +0000
576 date: Thu Jan 01 00:00:00 1970 +0000
557 summary: change foo
577 summary: change foo
558
578
559 $ cd ..
579 $ cd ..
560
580
561 test bundle with # in the filename (issue2154):
581 test bundle with # in the filename (issue2154):
562
582
563 $ cp bundle.hg 'test#bundle.hg'
583 $ cp bundle.hg 'test#bundle.hg'
564 $ cd orig
584 $ cd orig
565 $ hg incoming '../test#bundle.hg'
585 $ hg incoming '../test#bundle.hg'
566 comparing with ../test
586 comparing with ../test
567 abort: unknown revision 'bundle.hg'!
587 abort: unknown revision 'bundle.hg'!
568 [255]
588 [255]
569
589
570 note that percent encoding is not handled:
590 note that percent encoding is not handled:
571
591
572 $ hg incoming ../test%23bundle.hg
592 $ hg incoming ../test%23bundle.hg
573 abort: repository ../test%23bundle.hg not found!
593 abort: repository ../test%23bundle.hg not found!
574 [255]
594 [255]
575 $ cd ..
595 $ cd ..
576
596
577 test to bundle revisions on the newly created branch (issue3828):
597 test to bundle revisions on the newly created branch (issue3828):
578
598
579 $ hg -q clone -U test test-clone
599 $ hg -q clone -U test test-clone
580 $ cd test
600 $ cd test
581
601
582 $ hg -q branch foo
602 $ hg -q branch foo
583 $ hg commit -m "create foo branch"
603 $ hg commit -m "create foo branch"
584 $ hg -q outgoing ../test-clone
604 $ hg -q outgoing ../test-clone
585 9:b4f5acb1ee27
605 9:b4f5acb1ee27
586 $ hg -q bundle --branch foo foo.hg ../test-clone
606 $ hg -q bundle --branch foo foo.hg ../test-clone
587 $ hg -R foo.hg -q log -r "bundle()"
607 $ hg -R foo.hg -q log -r "bundle()"
588 9:b4f5acb1ee27
608 9:b4f5acb1ee27
589
609
590 $ cd ..
610 $ cd ..
591
611
592 test for https://bz.mercurial-scm.org/1144
612 test for https://bz.mercurial-scm.org/1144
593
613
594 test that verify bundle does not traceback
614 test that verify bundle does not traceback
595
615
596 partial history bundle, fails w/ unknown parent
616 partial history bundle, fails w/ unknown parent
597
617
598 $ hg -R bundle.hg verify
618 $ hg -R bundle.hg verify
599 abort: 00changelog.i@bbd179dfa0a7: unknown parent!
619 abort: 00changelog.i@bbd179dfa0a7: unknown parent!
600 [255]
620 [255]
601
621
602 full history bundle, refuses to verify non-local repo
622 full history bundle, refuses to verify non-local repo
603
623
604 $ hg -R all.hg verify
624 $ hg -R all.hg verify
605 abort: cannot verify bundle or remote repos
625 abort: cannot verify bundle or remote repos
606 [255]
626 [255]
607
627
608 but, regular verify must continue to work
628 but, regular verify must continue to work
609
629
610 $ hg -R orig verify
630 $ hg -R orig verify
611 checking changesets
631 checking changesets
612 checking manifests
632 checking manifests
613 crosschecking files in changesets and manifests
633 crosschecking files in changesets and manifests
614 checking files
634 checking files
615 2 files, 2 changesets, 2 total revisions
635 2 files, 2 changesets, 2 total revisions
616
636
617 diff against bundle
637 diff against bundle
618
638
619 $ hg init b
639 $ hg init b
620 $ cd b
640 $ cd b
621 $ hg -R ../all.hg diff -r tip
641 $ hg -R ../all.hg diff -r tip
622 diff -r aa35859c02ea anotherfile
642 diff -r aa35859c02ea anotherfile
623 --- a/anotherfile Thu Jan 01 00:00:00 1970 +0000
643 --- a/anotherfile Thu Jan 01 00:00:00 1970 +0000
624 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
644 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
625 @@ -1,4 +0,0 @@
645 @@ -1,4 +0,0 @@
626 -0
646 -0
627 -1
647 -1
628 -2
648 -2
629 -3
649 -3
630 $ cd ..
650 $ cd ..
631
651
632 bundle single branch
652 bundle single branch
633
653
634 $ hg init branchy
654 $ hg init branchy
635 $ cd branchy
655 $ cd branchy
636 $ echo a >a
656 $ echo a >a
637 $ echo x >x
657 $ echo x >x
638 $ hg ci -Ama
658 $ hg ci -Ama
639 adding a
659 adding a
640 adding x
660 adding x
641 $ echo c >c
661 $ echo c >c
642 $ echo xx >x
662 $ echo xx >x
643 $ hg ci -Amc
663 $ hg ci -Amc
644 adding c
664 adding c
645 $ echo c1 >c1
665 $ echo c1 >c1
646 $ hg ci -Amc1
666 $ hg ci -Amc1
647 adding c1
667 adding c1
648 $ hg up 0
668 $ hg up 0
649 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
669 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
650 $ echo b >b
670 $ echo b >b
651 $ hg ci -Amb
671 $ hg ci -Amb
652 adding b
672 adding b
653 created new head
673 created new head
654 $ echo b1 >b1
674 $ echo b1 >b1
655 $ echo xx >x
675 $ echo xx >x
656 $ hg ci -Amb1
676 $ hg ci -Amb1
657 adding b1
677 adding b1
658 $ hg clone -q -r2 . part
678 $ hg clone -q -r2 . part
659
679
660 == bundling via incoming
680 == bundling via incoming
661
681
662 $ hg in -R part --bundle incoming.hg --template "{node}\n" .
682 $ hg in -R part --bundle incoming.hg --template "{node}\n" .
663 comparing with .
683 comparing with .
664 searching for changes
684 searching for changes
665 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
685 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
666 057f4db07f61970e1c11e83be79e9d08adc4dc31
686 057f4db07f61970e1c11e83be79e9d08adc4dc31
667
687
668 == bundling
688 == bundling
669
689
670 $ hg bundle bundle.hg part --debug --config progress.debug=true
690 $ hg bundle bundle.hg part --debug --config progress.debug=true
671 query 1; heads
691 query 1; heads
672 searching for changes
692 searching for changes
673 all remote heads known locally
693 all remote heads known locally
674 2 changesets found
694 2 changesets found
675 list of changesets:
695 list of changesets:
676 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
696 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
677 057f4db07f61970e1c11e83be79e9d08adc4dc31
697 057f4db07f61970e1c11e83be79e9d08adc4dc31
678 bundling: 1/2 changesets (50.00%)
698 bundling: 1/2 changesets (50.00%)
679 bundling: 2/2 changesets (100.00%)
699 bundling: 2/2 changesets (100.00%)
680 bundling: 1/2 manifests (50.00%)
700 bundling: 1/2 manifests (50.00%)
681 bundling: 2/2 manifests (100.00%)
701 bundling: 2/2 manifests (100.00%)
682 bundling: b 1/3 files (33.33%)
702 bundling: b 1/3 files (33.33%)
683 bundling: b1 2/3 files (66.67%)
703 bundling: b1 2/3 files (66.67%)
684 bundling: x 3/3 files (100.00%)
704 bundling: x 3/3 files (100.00%)
685
705
686 == Test for issue3441
706 == Test for issue3441
687
707
688 $ hg clone -q -r0 . part2
708 $ hg clone -q -r0 . part2
689 $ hg -q -R part2 pull bundle.hg
709 $ hg -q -R part2 pull bundle.hg
690 $ hg -R part2 verify
710 $ hg -R part2 verify
691 checking changesets
711 checking changesets
692 checking manifests
712 checking manifests
693 crosschecking files in changesets and manifests
713 crosschecking files in changesets and manifests
694 checking files
714 checking files
695 4 files, 3 changesets, 5 total revisions
715 4 files, 3 changesets, 5 total revisions
696
716
697 $ cd ..
717 $ cd ..
@@ -1,346 +1,348 b''
1 Show all commands except debug commands
1 Show all commands except debug commands
2 $ hg debugcomplete
2 $ hg debugcomplete
3 add
3 add
4 addremove
4 addremove
5 annotate
5 annotate
6 archive
6 archive
7 backout
7 backout
8 bisect
8 bisect
9 bookmarks
9 bookmarks
10 branch
10 branch
11 branches
11 branches
12 bundle
12 bundle
13 cat
13 cat
14 clone
14 clone
15 commit
15 commit
16 config
16 config
17 copy
17 copy
18 diff
18 diff
19 export
19 export
20 files
20 files
21 forget
21 forget
22 graft
22 graft
23 grep
23 grep
24 heads
24 heads
25 help
25 help
26 identify
26 identify
27 import
27 import
28 incoming
28 incoming
29 init
29 init
30 locate
30 locate
31 log
31 log
32 manifest
32 manifest
33 merge
33 merge
34 outgoing
34 outgoing
35 parents
35 parents
36 paths
36 paths
37 phase
37 phase
38 pull
38 pull
39 push
39 push
40 recover
40 recover
41 remove
41 remove
42 rename
42 rename
43 resolve
43 resolve
44 revert
44 revert
45 rollback
45 rollback
46 root
46 root
47 serve
47 serve
48 status
48 status
49 summary
49 summary
50 tag
50 tag
51 tags
51 tags
52 tip
52 tip
53 unbundle
53 unbundle
54 update
54 update
55 verify
55 verify
56 version
56 version
57
57
58 Show all commands that start with "a"
58 Show all commands that start with "a"
59 $ hg debugcomplete a
59 $ hg debugcomplete a
60 add
60 add
61 addremove
61 addremove
62 annotate
62 annotate
63 archive
63 archive
64
64
65 Do not show debug commands if there are other candidates
65 Do not show debug commands if there are other candidates
66 $ hg debugcomplete d
66 $ hg debugcomplete d
67 diff
67 diff
68
68
69 Show debug commands if there are no other candidates
69 Show debug commands if there are no other candidates
70 $ hg debugcomplete debug
70 $ hg debugcomplete debug
71 debugancestor
71 debugancestor
72 debugapplystreamclonebundle
72 debugbuilddag
73 debugbuilddag
73 debugbundle
74 debugbundle
74 debugcheckstate
75 debugcheckstate
75 debugcommands
76 debugcommands
76 debugcomplete
77 debugcomplete
77 debugconfig
78 debugconfig
78 debugcreatestreamclonebundle
79 debugcreatestreamclonebundle
79 debugdag
80 debugdag
80 debugdata
81 debugdata
81 debugdate
82 debugdate
82 debugdirstate
83 debugdirstate
83 debugdiscovery
84 debugdiscovery
84 debugextensions
85 debugextensions
85 debugfileset
86 debugfileset
86 debugfsinfo
87 debugfsinfo
87 debuggetbundle
88 debuggetbundle
88 debugignore
89 debugignore
89 debugindex
90 debugindex
90 debugindexdot
91 debugindexdot
91 debuginstall
92 debuginstall
92 debugknown
93 debugknown
93 debuglabelcomplete
94 debuglabelcomplete
94 debuglocks
95 debuglocks
95 debugmergestate
96 debugmergestate
96 debugnamecomplete
97 debugnamecomplete
97 debugobsolete
98 debugobsolete
98 debugpathcomplete
99 debugpathcomplete
99 debugpushkey
100 debugpushkey
100 debugpvec
101 debugpvec
101 debugrebuilddirstate
102 debugrebuilddirstate
102 debugrebuildfncache
103 debugrebuildfncache
103 debugrename
104 debugrename
104 debugrevlog
105 debugrevlog
105 debugrevspec
106 debugrevspec
106 debugsetparents
107 debugsetparents
107 debugsub
108 debugsub
108 debugsuccessorssets
109 debugsuccessorssets
109 debugwalk
110 debugwalk
110 debugwireargs
111 debugwireargs
111
112
112 Do not show the alias of a debug command if there are other candidates
113 Do not show the alias of a debug command if there are other candidates
113 (this should hide rawcommit)
114 (this should hide rawcommit)
114 $ hg debugcomplete r
115 $ hg debugcomplete r
115 recover
116 recover
116 remove
117 remove
117 rename
118 rename
118 resolve
119 resolve
119 revert
120 revert
120 rollback
121 rollback
121 root
122 root
122 Show the alias of a debug command if there are no other candidates
123 Show the alias of a debug command if there are no other candidates
123 $ hg debugcomplete rawc
124 $ hg debugcomplete rawc
124
125
125
126
126 Show the global options
127 Show the global options
127 $ hg debugcomplete --options | sort
128 $ hg debugcomplete --options | sort
128 --config
129 --config
129 --cwd
130 --cwd
130 --debug
131 --debug
131 --debugger
132 --debugger
132 --encoding
133 --encoding
133 --encodingmode
134 --encodingmode
134 --help
135 --help
135 --hidden
136 --hidden
136 --noninteractive
137 --noninteractive
137 --profile
138 --profile
138 --quiet
139 --quiet
139 --repository
140 --repository
140 --time
141 --time
141 --traceback
142 --traceback
142 --verbose
143 --verbose
143 --version
144 --version
144 -R
145 -R
145 -h
146 -h
146 -q
147 -q
147 -v
148 -v
148 -y
149 -y
149
150
150 Show the options for the "serve" command
151 Show the options for the "serve" command
151 $ hg debugcomplete --options serve | sort
152 $ hg debugcomplete --options serve | sort
152 --accesslog
153 --accesslog
153 --address
154 --address
154 --certificate
155 --certificate
155 --cmdserver
156 --cmdserver
156 --config
157 --config
157 --cwd
158 --cwd
158 --daemon
159 --daemon
159 --daemon-pipefds
160 --daemon-pipefds
160 --debug
161 --debug
161 --debugger
162 --debugger
162 --encoding
163 --encoding
163 --encodingmode
164 --encodingmode
164 --errorlog
165 --errorlog
165 --help
166 --help
166 --hidden
167 --hidden
167 --ipv6
168 --ipv6
168 --name
169 --name
169 --noninteractive
170 --noninteractive
170 --pid-file
171 --pid-file
171 --port
172 --port
172 --prefix
173 --prefix
173 --profile
174 --profile
174 --quiet
175 --quiet
175 --repository
176 --repository
176 --stdio
177 --stdio
177 --style
178 --style
178 --templates
179 --templates
179 --time
180 --time
180 --traceback
181 --traceback
181 --verbose
182 --verbose
182 --version
183 --version
183 --web-conf
184 --web-conf
184 -6
185 -6
185 -A
186 -A
186 -E
187 -E
187 -R
188 -R
188 -a
189 -a
189 -d
190 -d
190 -h
191 -h
191 -n
192 -n
192 -p
193 -p
193 -q
194 -q
194 -t
195 -t
195 -v
196 -v
196 -y
197 -y
197
198
198 Show an error if we use --options with an ambiguous abbreviation
199 Show an error if we use --options with an ambiguous abbreviation
199 $ hg debugcomplete --options s
200 $ hg debugcomplete --options s
200 hg: command 's' is ambiguous:
201 hg: command 's' is ambiguous:
201 serve showconfig status summary
202 serve showconfig status summary
202 [255]
203 [255]
203
204
204 Show all commands + options
205 Show all commands + options
205 $ hg debugcommands
206 $ hg debugcommands
206 add: include, exclude, subrepos, dry-run
207 add: include, exclude, subrepos, dry-run
207 annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude, template
208 annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude, template
208 clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
209 clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
209 commit: addremove, close-branch, amend, secret, edit, interactive, include, exclude, message, logfile, date, user, subrepos
210 commit: addremove, close-branch, amend, secret, edit, interactive, include, exclude, message, logfile, date, user, subrepos
210 diff: rev, change, text, git, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, root, include, exclude, subrepos
211 diff: rev, change, text, git, nodates, noprefix, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, root, include, exclude, subrepos
211 export: output, switch-parent, rev, text, git, nodates
212 export: output, switch-parent, rev, text, git, nodates
212 forget: include, exclude
213 forget: include, exclude
213 init: ssh, remotecmd, insecure
214 init: ssh, remotecmd, insecure
214 log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude
215 log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude
215 merge: force, rev, preview, tool
216 merge: force, rev, preview, tool
216 pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure
217 pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure
217 push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure
218 push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure
218 remove: after, force, subrepos, include, exclude
219 remove: after, force, subrepos, include, exclude
219 serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate
220 serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate
220 status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos, template
221 status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos, template
221 summary: remote
222 summary: remote
222 update: clean, check, date, rev, tool
223 update: clean, check, date, rev, tool
223 addremove: similarity, subrepos, include, exclude, dry-run
224 addremove: similarity, subrepos, include, exclude, dry-run
224 archive: no-decode, prefix, rev, type, subrepos, include, exclude
225 archive: no-decode, prefix, rev, type, subrepos, include, exclude
225 backout: merge, commit, parent, rev, edit, tool, include, exclude, message, logfile, date, user
226 backout: merge, commit, parent, rev, edit, tool, include, exclude, message, logfile, date, user
226 bisect: reset, good, bad, skip, extend, command, noupdate
227 bisect: reset, good, bad, skip, extend, command, noupdate
227 bookmarks: force, rev, delete, rename, inactive, template
228 bookmarks: force, rev, delete, rename, inactive, template
228 branch: force, clean
229 branch: force, clean
229 branches: active, closed, template
230 branches: active, closed, template
230 bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure
231 bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure
231 cat: output, rev, decode, include, exclude
232 cat: output, rev, decode, include, exclude
232 config: untrusted, edit, local, global
233 config: untrusted, edit, local, global
233 copy: after, force, include, exclude, dry-run
234 copy: after, force, include, exclude, dry-run
234 debugancestor:
235 debugancestor:
236 debugapplystreamclonebundle:
235 debugbuilddag: mergeable-file, overwritten-file, new-file
237 debugbuilddag: mergeable-file, overwritten-file, new-file
236 debugbundle: all
238 debugbundle: all
237 debugcheckstate:
239 debugcheckstate:
238 debugcommands:
240 debugcommands:
239 debugcomplete: options
241 debugcomplete: options
240 debugcreatestreamclonebundle:
242 debugcreatestreamclonebundle:
241 debugdag: tags, branches, dots, spaces
243 debugdag: tags, branches, dots, spaces
242 debugdata: changelog, manifest, dir
244 debugdata: changelog, manifest, dir
243 debugdate: extended
245 debugdate: extended
244 debugdirstate: nodates, datesort
246 debugdirstate: nodates, datesort
245 debugdiscovery: old, nonheads, ssh, remotecmd, insecure
247 debugdiscovery: old, nonheads, ssh, remotecmd, insecure
246 debugextensions: template
248 debugextensions: template
247 debugfileset: rev
249 debugfileset: rev
248 debugfsinfo:
250 debugfsinfo:
249 debuggetbundle: head, common, type
251 debuggetbundle: head, common, type
250 debugignore:
252 debugignore:
251 debugindex: changelog, manifest, dir, format
253 debugindex: changelog, manifest, dir, format
252 debugindexdot:
254 debugindexdot:
253 debuginstall:
255 debuginstall:
254 debugknown:
256 debugknown:
255 debuglabelcomplete:
257 debuglabelcomplete:
256 debuglocks: force-lock, force-wlock
258 debuglocks: force-lock, force-wlock
257 debugmergestate:
259 debugmergestate:
258 debugnamecomplete:
260 debugnamecomplete:
259 debugobsolete: flags, record-parents, rev, date, user
261 debugobsolete: flags, record-parents, rev, date, user
260 debugpathcomplete: full, normal, added, removed
262 debugpathcomplete: full, normal, added, removed
261 debugpushkey:
263 debugpushkey:
262 debugpvec:
264 debugpvec:
263 debugrebuilddirstate: rev, minimal
265 debugrebuilddirstate: rev, minimal
264 debugrebuildfncache:
266 debugrebuildfncache:
265 debugrename: rev
267 debugrename: rev
266 debugrevlog: changelog, manifest, dir, dump
268 debugrevlog: changelog, manifest, dir, dump
267 debugrevspec: optimize
269 debugrevspec: optimize
268 debugsetparents:
270 debugsetparents:
269 debugsub: rev
271 debugsub: rev
270 debugsuccessorssets:
272 debugsuccessorssets:
271 debugwalk: include, exclude
273 debugwalk: include, exclude
272 debugwireargs: three, four, five, ssh, remotecmd, insecure
274 debugwireargs: three, four, five, ssh, remotecmd, insecure
273 files: rev, print0, include, exclude, template, subrepos
275 files: rev, print0, include, exclude, template, subrepos
274 graft: rev, continue, edit, log, force, currentdate, currentuser, date, user, tool, dry-run
276 graft: rev, continue, edit, log, force, currentdate, currentuser, date, user, tool, dry-run
275 grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
277 grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
276 heads: rev, topo, active, closed, style, template
278 heads: rev, topo, active, closed, style, template
277 help: extension, command, keyword
279 help: extension, command, keyword
278 identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure
280 identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure
279 import: strip, base, edit, force, no-commit, bypass, partial, exact, prefix, import-branch, message, logfile, date, user, similarity
281 import: strip, base, edit, force, no-commit, bypass, partial, exact, prefix, import-branch, message, logfile, date, user, similarity
280 incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
282 incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
281 locate: rev, print0, fullpath, include, exclude
283 locate: rev, print0, fullpath, include, exclude
282 manifest: rev, all, template
284 manifest: rev, all, template
283 outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
285 outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
284 parents: rev, style, template
286 parents: rev, style, template
285 paths:
287 paths:
286 phase: public, draft, secret, force, rev
288 phase: public, draft, secret, force, rev
287 recover:
289 recover:
288 rename: after, force, include, exclude, dry-run
290 rename: after, force, include, exclude, dry-run
289 resolve: all, list, mark, unmark, no-status, tool, include, exclude, template
291 resolve: all, list, mark, unmark, no-status, tool, include, exclude, template
290 revert: all, date, rev, no-backup, interactive, include, exclude, dry-run
292 revert: all, date, rev, no-backup, interactive, include, exclude, dry-run
291 rollback: dry-run, force
293 rollback: dry-run, force
292 root:
294 root:
293 tag: force, local, rev, remove, edit, message, date, user
295 tag: force, local, rev, remove, edit, message, date, user
294 tags: template
296 tags: template
295 tip: patch, git, style, template
297 tip: patch, git, style, template
296 unbundle: update
298 unbundle: update
297 verify:
299 verify:
298 version:
300 version:
299
301
300 $ hg init a
302 $ hg init a
301 $ cd a
303 $ cd a
302 $ echo fee > fee
304 $ echo fee > fee
303 $ hg ci -q -Amfee
305 $ hg ci -q -Amfee
304 $ hg tag fee
306 $ hg tag fee
305 $ mkdir fie
307 $ mkdir fie
306 $ echo dead > fie/dead
308 $ echo dead > fie/dead
307 $ echo live > fie/live
309 $ echo live > fie/live
308 $ hg bookmark fo
310 $ hg bookmark fo
309 $ hg branch -q fie
311 $ hg branch -q fie
310 $ hg ci -q -Amfie
312 $ hg ci -q -Amfie
311 $ echo fo > fo
313 $ echo fo > fo
312 $ hg branch -qf default
314 $ hg branch -qf default
313 $ hg ci -q -Amfo
315 $ hg ci -q -Amfo
314 $ echo Fum > Fum
316 $ echo Fum > Fum
315 $ hg ci -q -AmFum
317 $ hg ci -q -AmFum
316 $ hg bookmark Fum
318 $ hg bookmark Fum
317
319
318 Test debugpathcomplete
320 Test debugpathcomplete
319
321
320 $ hg debugpathcomplete f
322 $ hg debugpathcomplete f
321 fee
323 fee
322 fie
324 fie
323 fo
325 fo
324 $ hg debugpathcomplete -f f
326 $ hg debugpathcomplete -f f
325 fee
327 fee
326 fie/dead
328 fie/dead
327 fie/live
329 fie/live
328 fo
330 fo
329
331
330 $ hg rm Fum
332 $ hg rm Fum
331 $ hg debugpathcomplete -r F
333 $ hg debugpathcomplete -r F
332 Fum
334 Fum
333
335
334 Test debugnamecomplete
336 Test debugnamecomplete
335
337
336 $ hg debugnamecomplete
338 $ hg debugnamecomplete
337 Fum
339 Fum
338 default
340 default
339 fee
341 fee
340 fie
342 fie
341 fo
343 fo
342 tip
344 tip
343 $ hg debugnamecomplete f
345 $ hg debugnamecomplete f
344 fee
346 fee
345 fie
347 fie
346 fo
348 fo
@@ -1,2384 +1,2387 b''
1 Short help:
1 Short help:
2
2
3 $ hg
3 $ hg
4 Mercurial Distributed SCM
4 Mercurial Distributed SCM
5
5
6 basic commands:
6 basic commands:
7
7
8 add add the specified files on the next commit
8 add add the specified files on the next commit
9 annotate show changeset information by line for each file
9 annotate show changeset information by line for each file
10 clone make a copy of an existing repository
10 clone make a copy of an existing repository
11 commit commit the specified files or all outstanding changes
11 commit commit the specified files or all outstanding changes
12 diff diff repository (or selected files)
12 diff diff repository (or selected files)
13 export dump the header and diffs for one or more changesets
13 export dump the header and diffs for one or more changesets
14 forget forget the specified files on the next commit
14 forget forget the specified files on the next commit
15 init create a new repository in the given directory
15 init create a new repository in the given directory
16 log show revision history of entire repository or files
16 log show revision history of entire repository or files
17 merge merge another revision into working directory
17 merge merge another revision into working directory
18 pull pull changes from the specified source
18 pull pull changes from the specified source
19 push push changes to the specified destination
19 push push changes to the specified destination
20 remove remove the specified files on the next commit
20 remove remove the specified files on the next commit
21 serve start stand-alone webserver
21 serve start stand-alone webserver
22 status show changed files in the working directory
22 status show changed files in the working directory
23 summary summarize working directory state
23 summary summarize working directory state
24 update update working directory (or switch revisions)
24 update update working directory (or switch revisions)
25
25
26 (use "hg help" for the full list of commands or "hg -v" for details)
26 (use "hg help" for the full list of commands or "hg -v" for details)
27
27
28 $ hg -q
28 $ hg -q
29 add add the specified files on the next commit
29 add add the specified files on the next commit
30 annotate show changeset information by line for each file
30 annotate show changeset information by line for each file
31 clone make a copy of an existing repository
31 clone make a copy of an existing repository
32 commit commit the specified files or all outstanding changes
32 commit commit the specified files or all outstanding changes
33 diff diff repository (or selected files)
33 diff diff repository (or selected files)
34 export dump the header and diffs for one or more changesets
34 export dump the header and diffs for one or more changesets
35 forget forget the specified files on the next commit
35 forget forget the specified files on the next commit
36 init create a new repository in the given directory
36 init create a new repository in the given directory
37 log show revision history of entire repository or files
37 log show revision history of entire repository or files
38 merge merge another revision into working directory
38 merge merge another revision into working directory
39 pull pull changes from the specified source
39 pull pull changes from the specified source
40 push push changes to the specified destination
40 push push changes to the specified destination
41 remove remove the specified files on the next commit
41 remove remove the specified files on the next commit
42 serve start stand-alone webserver
42 serve start stand-alone webserver
43 status show changed files in the working directory
43 status show changed files in the working directory
44 summary summarize working directory state
44 summary summarize working directory state
45 update update working directory (or switch revisions)
45 update update working directory (or switch revisions)
46
46
47 $ hg help
47 $ hg help
48 Mercurial Distributed SCM
48 Mercurial Distributed SCM
49
49
50 list of commands:
50 list of commands:
51
51
52 add add the specified files on the next commit
52 add add the specified files on the next commit
53 addremove add all new files, delete all missing files
53 addremove add all new files, delete all missing files
54 annotate show changeset information by line for each file
54 annotate show changeset information by line for each file
55 archive create an unversioned archive of a repository revision
55 archive create an unversioned archive of a repository revision
56 backout reverse effect of earlier changeset
56 backout reverse effect of earlier changeset
57 bisect subdivision search of changesets
57 bisect subdivision search of changesets
58 bookmarks create a new bookmark or list existing bookmarks
58 bookmarks create a new bookmark or list existing bookmarks
59 branch set or show the current branch name
59 branch set or show the current branch name
60 branches list repository named branches
60 branches list repository named branches
61 bundle create a changegroup file
61 bundle create a changegroup file
62 cat output the current or given revision of files
62 cat output the current or given revision of files
63 clone make a copy of an existing repository
63 clone make a copy of an existing repository
64 commit commit the specified files or all outstanding changes
64 commit commit the specified files or all outstanding changes
65 config show combined config settings from all hgrc files
65 config show combined config settings from all hgrc files
66 copy mark files as copied for the next commit
66 copy mark files as copied for the next commit
67 diff diff repository (or selected files)
67 diff diff repository (or selected files)
68 export dump the header and diffs for one or more changesets
68 export dump the header and diffs for one or more changesets
69 files list tracked files
69 files list tracked files
70 forget forget the specified files on the next commit
70 forget forget the specified files on the next commit
71 graft copy changes from other branches onto the current branch
71 graft copy changes from other branches onto the current branch
72 grep search for a pattern in specified files and revisions
72 grep search for a pattern in specified files and revisions
73 heads show branch heads
73 heads show branch heads
74 help show help for a given topic or a help overview
74 help show help for a given topic or a help overview
75 identify identify the working directory or specified revision
75 identify identify the working directory or specified revision
76 import import an ordered set of patches
76 import import an ordered set of patches
77 incoming show new changesets found in source
77 incoming show new changesets found in source
78 init create a new repository in the given directory
78 init create a new repository in the given directory
79 log show revision history of entire repository or files
79 log show revision history of entire repository or files
80 manifest output the current or given revision of the project manifest
80 manifest output the current or given revision of the project manifest
81 merge merge another revision into working directory
81 merge merge another revision into working directory
82 outgoing show changesets not found in the destination
82 outgoing show changesets not found in the destination
83 paths show aliases for remote repositories
83 paths show aliases for remote repositories
84 phase set or show the current phase name
84 phase set or show the current phase name
85 pull pull changes from the specified source
85 pull pull changes from the specified source
86 push push changes to the specified destination
86 push push changes to the specified destination
87 recover roll back an interrupted transaction
87 recover roll back an interrupted transaction
88 remove remove the specified files on the next commit
88 remove remove the specified files on the next commit
89 rename rename files; equivalent of copy + remove
89 rename rename files; equivalent of copy + remove
90 resolve redo merges or set/view the merge status of files
90 resolve redo merges or set/view the merge status of files
91 revert restore files to their checkout state
91 revert restore files to their checkout state
92 root print the root (top) of the current working directory
92 root print the root (top) of the current working directory
93 serve start stand-alone webserver
93 serve start stand-alone webserver
94 status show changed files in the working directory
94 status show changed files in the working directory
95 summary summarize working directory state
95 summary summarize working directory state
96 tag add one or more tags for the current or given revision
96 tag add one or more tags for the current or given revision
97 tags list repository tags
97 tags list repository tags
98 unbundle apply one or more changegroup files
98 unbundle apply one or more changegroup files
99 update update working directory (or switch revisions)
99 update update working directory (or switch revisions)
100 verify verify the integrity of the repository
100 verify verify the integrity of the repository
101 version output version and copyright information
101 version output version and copyright information
102
102
103 additional help topics:
103 additional help topics:
104
104
105 config Configuration Files
105 config Configuration Files
106 dates Date Formats
106 dates Date Formats
107 diffs Diff Formats
107 diffs Diff Formats
108 environment Environment Variables
108 environment Environment Variables
109 extensions Using Additional Features
109 extensions Using Additional Features
110 filesets Specifying File Sets
110 filesets Specifying File Sets
111 glossary Glossary
111 glossary Glossary
112 hgignore Syntax for Mercurial Ignore Files
112 hgignore Syntax for Mercurial Ignore Files
113 hgweb Configuring hgweb
113 hgweb Configuring hgweb
114 merge-tools Merge Tools
114 merge-tools Merge Tools
115 multirevs Specifying Multiple Revisions
115 multirevs Specifying Multiple Revisions
116 patterns File Name Patterns
116 patterns File Name Patterns
117 phases Working with Phases
117 phases Working with Phases
118 revisions Specifying Single Revisions
118 revisions Specifying Single Revisions
119 revsets Specifying Revision Sets
119 revsets Specifying Revision Sets
120 scripting Using Mercurial from scripts and automation
120 scripting Using Mercurial from scripts and automation
121 subrepos Subrepositories
121 subrepos Subrepositories
122 templating Template Usage
122 templating Template Usage
123 urls URL Paths
123 urls URL Paths
124
124
125 (use "hg help -v" to show built-in aliases and global options)
125 (use "hg help -v" to show built-in aliases and global options)
126
126
127 $ hg -q help
127 $ hg -q help
128 add add the specified files on the next commit
128 add add the specified files on the next commit
129 addremove add all new files, delete all missing files
129 addremove add all new files, delete all missing files
130 annotate show changeset information by line for each file
130 annotate show changeset information by line for each file
131 archive create an unversioned archive of a repository revision
131 archive create an unversioned archive of a repository revision
132 backout reverse effect of earlier changeset
132 backout reverse effect of earlier changeset
133 bisect subdivision search of changesets
133 bisect subdivision search of changesets
134 bookmarks create a new bookmark or list existing bookmarks
134 bookmarks create a new bookmark or list existing bookmarks
135 branch set or show the current branch name
135 branch set or show the current branch name
136 branches list repository named branches
136 branches list repository named branches
137 bundle create a changegroup file
137 bundle create a changegroup file
138 cat output the current or given revision of files
138 cat output the current or given revision of files
139 clone make a copy of an existing repository
139 clone make a copy of an existing repository
140 commit commit the specified files or all outstanding changes
140 commit commit the specified files or all outstanding changes
141 config show combined config settings from all hgrc files
141 config show combined config settings from all hgrc files
142 copy mark files as copied for the next commit
142 copy mark files as copied for the next commit
143 diff diff repository (or selected files)
143 diff diff repository (or selected files)
144 export dump the header and diffs for one or more changesets
144 export dump the header and diffs for one or more changesets
145 files list tracked files
145 files list tracked files
146 forget forget the specified files on the next commit
146 forget forget the specified files on the next commit
147 graft copy changes from other branches onto the current branch
147 graft copy changes from other branches onto the current branch
148 grep search for a pattern in specified files and revisions
148 grep search for a pattern in specified files and revisions
149 heads show branch heads
149 heads show branch heads
150 help show help for a given topic or a help overview
150 help show help for a given topic or a help overview
151 identify identify the working directory or specified revision
151 identify identify the working directory or specified revision
152 import import an ordered set of patches
152 import import an ordered set of patches
153 incoming show new changesets found in source
153 incoming show new changesets found in source
154 init create a new repository in the given directory
154 init create a new repository in the given directory
155 log show revision history of entire repository or files
155 log show revision history of entire repository or files
156 manifest output the current or given revision of the project manifest
156 manifest output the current or given revision of the project manifest
157 merge merge another revision into working directory
157 merge merge another revision into working directory
158 outgoing show changesets not found in the destination
158 outgoing show changesets not found in the destination
159 paths show aliases for remote repositories
159 paths show aliases for remote repositories
160 phase set or show the current phase name
160 phase set or show the current phase name
161 pull pull changes from the specified source
161 pull pull changes from the specified source
162 push push changes to the specified destination
162 push push changes to the specified destination
163 recover roll back an interrupted transaction
163 recover roll back an interrupted transaction
164 remove remove the specified files on the next commit
164 remove remove the specified files on the next commit
165 rename rename files; equivalent of copy + remove
165 rename rename files; equivalent of copy + remove
166 resolve redo merges or set/view the merge status of files
166 resolve redo merges or set/view the merge status of files
167 revert restore files to their checkout state
167 revert restore files to their checkout state
168 root print the root (top) of the current working directory
168 root print the root (top) of the current working directory
169 serve start stand-alone webserver
169 serve start stand-alone webserver
170 status show changed files in the working directory
170 status show changed files in the working directory
171 summary summarize working directory state
171 summary summarize working directory state
172 tag add one or more tags for the current or given revision
172 tag add one or more tags for the current or given revision
173 tags list repository tags
173 tags list repository tags
174 unbundle apply one or more changegroup files
174 unbundle apply one or more changegroup files
175 update update working directory (or switch revisions)
175 update update working directory (or switch revisions)
176 verify verify the integrity of the repository
176 verify verify the integrity of the repository
177 version output version and copyright information
177 version output version and copyright information
178
178
179 additional help topics:
179 additional help topics:
180
180
181 config Configuration Files
181 config Configuration Files
182 dates Date Formats
182 dates Date Formats
183 diffs Diff Formats
183 diffs Diff Formats
184 environment Environment Variables
184 environment Environment Variables
185 extensions Using Additional Features
185 extensions Using Additional Features
186 filesets Specifying File Sets
186 filesets Specifying File Sets
187 glossary Glossary
187 glossary Glossary
188 hgignore Syntax for Mercurial Ignore Files
188 hgignore Syntax for Mercurial Ignore Files
189 hgweb Configuring hgweb
189 hgweb Configuring hgweb
190 merge-tools Merge Tools
190 merge-tools Merge Tools
191 multirevs Specifying Multiple Revisions
191 multirevs Specifying Multiple Revisions
192 patterns File Name Patterns
192 patterns File Name Patterns
193 phases Working with Phases
193 phases Working with Phases
194 revisions Specifying Single Revisions
194 revisions Specifying Single Revisions
195 revsets Specifying Revision Sets
195 revsets Specifying Revision Sets
196 scripting Using Mercurial from scripts and automation
196 scripting Using Mercurial from scripts and automation
197 subrepos Subrepositories
197 subrepos Subrepositories
198 templating Template Usage
198 templating Template Usage
199 urls URL Paths
199 urls URL Paths
200
200
201 Test extension help:
201 Test extension help:
202 $ hg help extensions --config extensions.rebase= --config extensions.children=
202 $ hg help extensions --config extensions.rebase= --config extensions.children=
203 Using Additional Features
203 Using Additional Features
204 """""""""""""""""""""""""
204 """""""""""""""""""""""""
205
205
206 Mercurial has the ability to add new features through the use of
206 Mercurial has the ability to add new features through the use of
207 extensions. Extensions may add new commands, add options to existing
207 extensions. Extensions may add new commands, add options to existing
208 commands, change the default behavior of commands, or implement hooks.
208 commands, change the default behavior of commands, or implement hooks.
209
209
210 To enable the "foo" extension, either shipped with Mercurial or in the
210 To enable the "foo" extension, either shipped with Mercurial or in the
211 Python search path, create an entry for it in your configuration file,
211 Python search path, create an entry for it in your configuration file,
212 like this:
212 like this:
213
213
214 [extensions]
214 [extensions]
215 foo =
215 foo =
216
216
217 You may also specify the full path to an extension:
217 You may also specify the full path to an extension:
218
218
219 [extensions]
219 [extensions]
220 myfeature = ~/.hgext/myfeature.py
220 myfeature = ~/.hgext/myfeature.py
221
221
222 See "hg help config" for more information on configuration files.
222 See "hg help config" for more information on configuration files.
223
223
224 Extensions are not loaded by default for a variety of reasons: they can
224 Extensions are not loaded by default for a variety of reasons: they can
225 increase startup overhead; they may be meant for advanced usage only; they
225 increase startup overhead; they may be meant for advanced usage only; they
226 may provide potentially dangerous abilities (such as letting you destroy
226 may provide potentially dangerous abilities (such as letting you destroy
227 or modify history); they might not be ready for prime time; or they may
227 or modify history); they might not be ready for prime time; or they may
228 alter some usual behaviors of stock Mercurial. It is thus up to the user
228 alter some usual behaviors of stock Mercurial. It is thus up to the user
229 to activate extensions as needed.
229 to activate extensions as needed.
230
230
231 To explicitly disable an extension enabled in a configuration file of
231 To explicitly disable an extension enabled in a configuration file of
232 broader scope, prepend its path with !:
232 broader scope, prepend its path with !:
233
233
234 [extensions]
234 [extensions]
235 # disabling extension bar residing in /path/to/extension/bar.py
235 # disabling extension bar residing in /path/to/extension/bar.py
236 bar = !/path/to/extension/bar.py
236 bar = !/path/to/extension/bar.py
237 # ditto, but no path was supplied for extension baz
237 # ditto, but no path was supplied for extension baz
238 baz = !
238 baz = !
239
239
240 enabled extensions:
240 enabled extensions:
241
241
242 children command to display child changesets (DEPRECATED)
242 children command to display child changesets (DEPRECATED)
243 rebase command to move sets of revisions to a different ancestor
243 rebase command to move sets of revisions to a different ancestor
244
244
245 disabled extensions:
245 disabled extensions:
246
246
247 acl hooks for controlling repository access
247 acl hooks for controlling repository access
248 blackbox log repository events to a blackbox for debugging
248 blackbox log repository events to a blackbox for debugging
249 bugzilla hooks for integrating with the Bugzilla bug tracker
249 bugzilla hooks for integrating with the Bugzilla bug tracker
250 censor erase file content at a given revision
250 censor erase file content at a given revision
251 churn command to display statistics about repository history
251 churn command to display statistics about repository history
252 clonebundles server side extension to advertise pre-generated bundles to
252 clonebundles server side extension to advertise pre-generated bundles to
253 seed clones.
253 seed clones.
254 color colorize output from some commands
254 color colorize output from some commands
255 convert import revisions from foreign VCS repositories into
255 convert import revisions from foreign VCS repositories into
256 Mercurial
256 Mercurial
257 eol automatically manage newlines in repository files
257 eol automatically manage newlines in repository files
258 extdiff command to allow external programs to compare revisions
258 extdiff command to allow external programs to compare revisions
259 factotum http authentication with factotum
259 factotum http authentication with factotum
260 gpg commands to sign and verify changesets
260 gpg commands to sign and verify changesets
261 hgcia hooks for integrating with the CIA.vc notification service
261 hgcia hooks for integrating with the CIA.vc notification service
262 hgk browse the repository in a graphical way
262 hgk browse the repository in a graphical way
263 highlight syntax highlighting for hgweb (requires Pygments)
263 highlight syntax highlighting for hgweb (requires Pygments)
264 histedit interactive history editing
264 histedit interactive history editing
265 keyword expand keywords in tracked files
265 keyword expand keywords in tracked files
266 largefiles track large binary files
266 largefiles track large binary files
267 mq manage a stack of patches
267 mq manage a stack of patches
268 notify hooks for sending email push notifications
268 notify hooks for sending email push notifications
269 pager browse command output with an external pager
269 pager browse command output with an external pager
270 patchbomb command to send changesets as (a series of) patch emails
270 patchbomb command to send changesets as (a series of) patch emails
271 purge command to delete untracked files from the working
271 purge command to delete untracked files from the working
272 directory
272 directory
273 record commands to interactively select changes for
273 record commands to interactively select changes for
274 commit/qrefresh
274 commit/qrefresh
275 relink recreates hardlinks between repository clones
275 relink recreates hardlinks between repository clones
276 schemes extend schemes with shortcuts to repository swarms
276 schemes extend schemes with shortcuts to repository swarms
277 share share a common history between several working directories
277 share share a common history between several working directories
278 shelve save and restore changes to the working directory
278 shelve save and restore changes to the working directory
279 strip strip changesets and their descendants from history
279 strip strip changesets and their descendants from history
280 transplant command to transplant changesets from another branch
280 transplant command to transplant changesets from another branch
281 win32mbcs allow the use of MBCS paths with problematic encodings
281 win32mbcs allow the use of MBCS paths with problematic encodings
282 zeroconf discover and advertise repositories on the local network
282 zeroconf discover and advertise repositories on the local network
283
283
284 Verify that extension keywords appear in help templates
284 Verify that extension keywords appear in help templates
285
285
286 $ hg help --config extensions.transplant= templating|grep transplant > /dev/null
286 $ hg help --config extensions.transplant= templating|grep transplant > /dev/null
287
287
288 Test short command list with verbose option
288 Test short command list with verbose option
289
289
290 $ hg -v help shortlist
290 $ hg -v help shortlist
291 Mercurial Distributed SCM
291 Mercurial Distributed SCM
292
292
293 basic commands:
293 basic commands:
294
294
295 add add the specified files on the next commit
295 add add the specified files on the next commit
296 annotate, blame
296 annotate, blame
297 show changeset information by line for each file
297 show changeset information by line for each file
298 clone make a copy of an existing repository
298 clone make a copy of an existing repository
299 commit, ci commit the specified files or all outstanding changes
299 commit, ci commit the specified files or all outstanding changes
300 diff diff repository (or selected files)
300 diff diff repository (or selected files)
301 export dump the header and diffs for one or more changesets
301 export dump the header and diffs for one or more changesets
302 forget forget the specified files on the next commit
302 forget forget the specified files on the next commit
303 init create a new repository in the given directory
303 init create a new repository in the given directory
304 log, history show revision history of entire repository or files
304 log, history show revision history of entire repository or files
305 merge merge another revision into working directory
305 merge merge another revision into working directory
306 pull pull changes from the specified source
306 pull pull changes from the specified source
307 push push changes to the specified destination
307 push push changes to the specified destination
308 remove, rm remove the specified files on the next commit
308 remove, rm remove the specified files on the next commit
309 serve start stand-alone webserver
309 serve start stand-alone webserver
310 status, st show changed files in the working directory
310 status, st show changed files in the working directory
311 summary, sum summarize working directory state
311 summary, sum summarize working directory state
312 update, up, checkout, co
312 update, up, checkout, co
313 update working directory (or switch revisions)
313 update working directory (or switch revisions)
314
314
315 global options ([+] can be repeated):
315 global options ([+] can be repeated):
316
316
317 -R --repository REPO repository root directory or name of overlay bundle
317 -R --repository REPO repository root directory or name of overlay bundle
318 file
318 file
319 --cwd DIR change working directory
319 --cwd DIR change working directory
320 -y --noninteractive do not prompt, automatically pick the first choice for
320 -y --noninteractive do not prompt, automatically pick the first choice for
321 all prompts
321 all prompts
322 -q --quiet suppress output
322 -q --quiet suppress output
323 -v --verbose enable additional output
323 -v --verbose enable additional output
324 --config CONFIG [+] set/override config option (use 'section.name=value')
324 --config CONFIG [+] set/override config option (use 'section.name=value')
325 --debug enable debugging output
325 --debug enable debugging output
326 --debugger start debugger
326 --debugger start debugger
327 --encoding ENCODE set the charset encoding (default: ascii)
327 --encoding ENCODE set the charset encoding (default: ascii)
328 --encodingmode MODE set the charset encoding mode (default: strict)
328 --encodingmode MODE set the charset encoding mode (default: strict)
329 --traceback always print a traceback on exception
329 --traceback always print a traceback on exception
330 --time time how long the command takes
330 --time time how long the command takes
331 --profile print command execution profile
331 --profile print command execution profile
332 --version output version information and exit
332 --version output version information and exit
333 -h --help display help and exit
333 -h --help display help and exit
334 --hidden consider hidden changesets
334 --hidden consider hidden changesets
335
335
336 (use "hg help" for the full list of commands)
336 (use "hg help" for the full list of commands)
337
337
338 $ hg add -h
338 $ hg add -h
339 hg add [OPTION]... [FILE]...
339 hg add [OPTION]... [FILE]...
340
340
341 add the specified files on the next commit
341 add the specified files on the next commit
342
342
343 Schedule files to be version controlled and added to the repository.
343 Schedule files to be version controlled and added to the repository.
344
344
345 The files will be added to the repository at the next commit. To undo an
345 The files will be added to the repository at the next commit. To undo an
346 add before that, see "hg forget".
346 add before that, see "hg forget".
347
347
348 If no names are given, add all files to the repository.
348 If no names are given, add all files to the repository.
349
349
350 Returns 0 if all files are successfully added.
350 Returns 0 if all files are successfully added.
351
351
352 options ([+] can be repeated):
352 options ([+] can be repeated):
353
353
354 -I --include PATTERN [+] include names matching the given patterns
354 -I --include PATTERN [+] include names matching the given patterns
355 -X --exclude PATTERN [+] exclude names matching the given patterns
355 -X --exclude PATTERN [+] exclude names matching the given patterns
356 -S --subrepos recurse into subrepositories
356 -S --subrepos recurse into subrepositories
357 -n --dry-run do not perform actions, just print output
357 -n --dry-run do not perform actions, just print output
358
358
359 (some details hidden, use --verbose to show complete help)
359 (some details hidden, use --verbose to show complete help)
360
360
361 Verbose help for add
361 Verbose help for add
362
362
363 $ hg add -hv
363 $ hg add -hv
364 hg add [OPTION]... [FILE]...
364 hg add [OPTION]... [FILE]...
365
365
366 add the specified files on the next commit
366 add the specified files on the next commit
367
367
368 Schedule files to be version controlled and added to the repository.
368 Schedule files to be version controlled and added to the repository.
369
369
370 The files will be added to the repository at the next commit. To undo an
370 The files will be added to the repository at the next commit. To undo an
371 add before that, see "hg forget".
371 add before that, see "hg forget".
372
372
373 If no names are given, add all files to the repository.
373 If no names are given, add all files to the repository.
374
374
375 An example showing how new (unknown) files are added automatically by "hg
375 An example showing how new (unknown) files are added automatically by "hg
376 add":
376 add":
377
377
378 $ ls
378 $ ls
379 foo.c
379 foo.c
380 $ hg status
380 $ hg status
381 ? foo.c
381 ? foo.c
382 $ hg add
382 $ hg add
383 adding foo.c
383 adding foo.c
384 $ hg status
384 $ hg status
385 A foo.c
385 A foo.c
386
386
387 Returns 0 if all files are successfully added.
387 Returns 0 if all files are successfully added.
388
388
389 options ([+] can be repeated):
389 options ([+] can be repeated):
390
390
391 -I --include PATTERN [+] include names matching the given patterns
391 -I --include PATTERN [+] include names matching the given patterns
392 -X --exclude PATTERN [+] exclude names matching the given patterns
392 -X --exclude PATTERN [+] exclude names matching the given patterns
393 -S --subrepos recurse into subrepositories
393 -S --subrepos recurse into subrepositories
394 -n --dry-run do not perform actions, just print output
394 -n --dry-run do not perform actions, just print output
395
395
396 global options ([+] can be repeated):
396 global options ([+] can be repeated):
397
397
398 -R --repository REPO repository root directory or name of overlay bundle
398 -R --repository REPO repository root directory or name of overlay bundle
399 file
399 file
400 --cwd DIR change working directory
400 --cwd DIR change working directory
401 -y --noninteractive do not prompt, automatically pick the first choice for
401 -y --noninteractive do not prompt, automatically pick the first choice for
402 all prompts
402 all prompts
403 -q --quiet suppress output
403 -q --quiet suppress output
404 -v --verbose enable additional output
404 -v --verbose enable additional output
405 --config CONFIG [+] set/override config option (use 'section.name=value')
405 --config CONFIG [+] set/override config option (use 'section.name=value')
406 --debug enable debugging output
406 --debug enable debugging output
407 --debugger start debugger
407 --debugger start debugger
408 --encoding ENCODE set the charset encoding (default: ascii)
408 --encoding ENCODE set the charset encoding (default: ascii)
409 --encodingmode MODE set the charset encoding mode (default: strict)
409 --encodingmode MODE set the charset encoding mode (default: strict)
410 --traceback always print a traceback on exception
410 --traceback always print a traceback on exception
411 --time time how long the command takes
411 --time time how long the command takes
412 --profile print command execution profile
412 --profile print command execution profile
413 --version output version information and exit
413 --version output version information and exit
414 -h --help display help and exit
414 -h --help display help and exit
415 --hidden consider hidden changesets
415 --hidden consider hidden changesets
416
416
417 Test help option with version option
417 Test help option with version option
418
418
419 $ hg add -h --version
419 $ hg add -h --version
420 Mercurial Distributed SCM (version *) (glob)
420 Mercurial Distributed SCM (version *) (glob)
421 (see https://mercurial-scm.org for more information)
421 (see https://mercurial-scm.org for more information)
422
422
423 Copyright (C) 2005-2015 Matt Mackall and others
423 Copyright (C) 2005-2015 Matt Mackall and others
424 This is free software; see the source for copying conditions. There is NO
424 This is free software; see the source for copying conditions. There is NO
425 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
425 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
426
426
427 $ hg add --skjdfks
427 $ hg add --skjdfks
428 hg add: option --skjdfks not recognized
428 hg add: option --skjdfks not recognized
429 hg add [OPTION]... [FILE]...
429 hg add [OPTION]... [FILE]...
430
430
431 add the specified files on the next commit
431 add the specified files on the next commit
432
432
433 options ([+] can be repeated):
433 options ([+] can be repeated):
434
434
435 -I --include PATTERN [+] include names matching the given patterns
435 -I --include PATTERN [+] include names matching the given patterns
436 -X --exclude PATTERN [+] exclude names matching the given patterns
436 -X --exclude PATTERN [+] exclude names matching the given patterns
437 -S --subrepos recurse into subrepositories
437 -S --subrepos recurse into subrepositories
438 -n --dry-run do not perform actions, just print output
438 -n --dry-run do not perform actions, just print output
439
439
440 (use "hg add -h" to show more help)
440 (use "hg add -h" to show more help)
441 [255]
441 [255]
442
442
443 Test ambiguous command help
443 Test ambiguous command help
444
444
445 $ hg help ad
445 $ hg help ad
446 list of commands:
446 list of commands:
447
447
448 add add the specified files on the next commit
448 add add the specified files on the next commit
449 addremove add all new files, delete all missing files
449 addremove add all new files, delete all missing files
450
450
451 (use "hg help -v ad" to show built-in aliases and global options)
451 (use "hg help -v ad" to show built-in aliases and global options)
452
452
453 Test command without options
453 Test command without options
454
454
455 $ hg help verify
455 $ hg help verify
456 hg verify
456 hg verify
457
457
458 verify the integrity of the repository
458 verify the integrity of the repository
459
459
460 Verify the integrity of the current repository.
460 Verify the integrity of the current repository.
461
461
462 This will perform an extensive check of the repository's integrity,
462 This will perform an extensive check of the repository's integrity,
463 validating the hashes and checksums of each entry in the changelog,
463 validating the hashes and checksums of each entry in the changelog,
464 manifest, and tracked files, as well as the integrity of their crosslinks
464 manifest, and tracked files, as well as the integrity of their crosslinks
465 and indices.
465 and indices.
466
466
467 Please see https://mercurial-scm.org/wiki/RepositoryCorruption for more
467 Please see https://mercurial-scm.org/wiki/RepositoryCorruption for more
468 information about recovery from corruption of the repository.
468 information about recovery from corruption of the repository.
469
469
470 Returns 0 on success, 1 if errors are encountered.
470 Returns 0 on success, 1 if errors are encountered.
471
471
472 (some details hidden, use --verbose to show complete help)
472 (some details hidden, use --verbose to show complete help)
473
473
474 $ hg help diff
474 $ hg help diff
475 hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
475 hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
476
476
477 diff repository (or selected files)
477 diff repository (or selected files)
478
478
479 Show differences between revisions for the specified files.
479 Show differences between revisions for the specified files.
480
480
481 Differences between files are shown using the unified diff format.
481 Differences between files are shown using the unified diff format.
482
482
483 Note:
483 Note:
484 diff may generate unexpected results for merges, as it will default to
484 diff may generate unexpected results for merges, as it will default to
485 comparing against the working directory's first parent changeset if no
485 comparing against the working directory's first parent changeset if no
486 revisions are specified.
486 revisions are specified.
487
487
488 When two revision arguments are given, then changes are shown between
488 When two revision arguments are given, then changes are shown between
489 those revisions. If only one revision is specified then that revision is
489 those revisions. If only one revision is specified then that revision is
490 compared to the working directory, and, when no revisions are specified,
490 compared to the working directory, and, when no revisions are specified,
491 the working directory files are compared to its parent.
491 the working directory files are compared to its parent.
492
492
493 Alternatively you can specify -c/--change with a revision to see the
493 Alternatively you can specify -c/--change with a revision to see the
494 changes in that changeset relative to its first parent.
494 changes in that changeset relative to its first parent.
495
495
496 Without the -a/--text option, diff will avoid generating diffs of files it
496 Without the -a/--text option, diff will avoid generating diffs of files it
497 detects as binary. With -a, diff will generate a diff anyway, probably
497 detects as binary. With -a, diff will generate a diff anyway, probably
498 with undesirable results.
498 with undesirable results.
499
499
500 Use the -g/--git option to generate diffs in the git extended diff format.
500 Use the -g/--git option to generate diffs in the git extended diff format.
501 For more information, read "hg help diffs".
501 For more information, read "hg help diffs".
502
502
503 Returns 0 on success.
503 Returns 0 on success.
504
504
505 options ([+] can be repeated):
505 options ([+] can be repeated):
506
506
507 -r --rev REV [+] revision
507 -r --rev REV [+] revision
508 -c --change REV change made by revision
508 -c --change REV change made by revision
509 -a --text treat all files as text
509 -a --text treat all files as text
510 -g --git use git extended diff format
510 -g --git use git extended diff format
511 --nodates omit dates from diff headers
511 --nodates omit dates from diff headers
512 --noprefix omit a/ and b/ prefixes from filenames
512 --noprefix omit a/ and b/ prefixes from filenames
513 -p --show-function show which function each change is in
513 -p --show-function show which function each change is in
514 --reverse produce a diff that undoes the changes
514 --reverse produce a diff that undoes the changes
515 -w --ignore-all-space ignore white space when comparing lines
515 -w --ignore-all-space ignore white space when comparing lines
516 -b --ignore-space-change ignore changes in the amount of white space
516 -b --ignore-space-change ignore changes in the amount of white space
517 -B --ignore-blank-lines ignore changes whose lines are all blank
517 -B --ignore-blank-lines ignore changes whose lines are all blank
518 -U --unified NUM number of lines of context to show
518 -U --unified NUM number of lines of context to show
519 --stat output diffstat-style summary of changes
519 --stat output diffstat-style summary of changes
520 --root DIR produce diffs relative to subdirectory
520 --root DIR produce diffs relative to subdirectory
521 -I --include PATTERN [+] include names matching the given patterns
521 -I --include PATTERN [+] include names matching the given patterns
522 -X --exclude PATTERN [+] exclude names matching the given patterns
522 -X --exclude PATTERN [+] exclude names matching the given patterns
523 -S --subrepos recurse into subrepositories
523 -S --subrepos recurse into subrepositories
524
524
525 (some details hidden, use --verbose to show complete help)
525 (some details hidden, use --verbose to show complete help)
526
526
527 $ hg help status
527 $ hg help status
528 hg status [OPTION]... [FILE]...
528 hg status [OPTION]... [FILE]...
529
529
530 aliases: st
530 aliases: st
531
531
532 show changed files in the working directory
532 show changed files in the working directory
533
533
534 Show status of files in the repository. If names are given, only files
534 Show status of files in the repository. If names are given, only files
535 that match are shown. Files that are clean or ignored or the source of a
535 that match are shown. Files that are clean or ignored or the source of a
536 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
536 copy/move operation, are not listed unless -c/--clean, -i/--ignored,
537 -C/--copies or -A/--all are given. Unless options described with "show
537 -C/--copies or -A/--all are given. Unless options described with "show
538 only ..." are given, the options -mardu are used.
538 only ..." are given, the options -mardu are used.
539
539
540 Option -q/--quiet hides untracked (unknown and ignored) files unless
540 Option -q/--quiet hides untracked (unknown and ignored) files unless
541 explicitly requested with -u/--unknown or -i/--ignored.
541 explicitly requested with -u/--unknown or -i/--ignored.
542
542
543 Note:
543 Note:
544 status may appear to disagree with diff if permissions have changed or
544 status may appear to disagree with diff if permissions have changed or
545 a merge has occurred. The standard diff format does not report
545 a merge has occurred. The standard diff format does not report
546 permission changes and diff only reports changes relative to one merge
546 permission changes and diff only reports changes relative to one merge
547 parent.
547 parent.
548
548
549 If one revision is given, it is used as the base revision. If two
549 If one revision is given, it is used as the base revision. If two
550 revisions are given, the differences between them are shown. The --change
550 revisions are given, the differences between them are shown. The --change
551 option can also be used as a shortcut to list the changed files of a
551 option can also be used as a shortcut to list the changed files of a
552 revision from its first parent.
552 revision from its first parent.
553
553
554 The codes used to show the status of files are:
554 The codes used to show the status of files are:
555
555
556 M = modified
556 M = modified
557 A = added
557 A = added
558 R = removed
558 R = removed
559 C = clean
559 C = clean
560 ! = missing (deleted by non-hg command, but still tracked)
560 ! = missing (deleted by non-hg command, but still tracked)
561 ? = not tracked
561 ? = not tracked
562 I = ignored
562 I = ignored
563 = origin of the previous file (with --copies)
563 = origin of the previous file (with --copies)
564
564
565 Returns 0 on success.
565 Returns 0 on success.
566
566
567 options ([+] can be repeated):
567 options ([+] can be repeated):
568
568
569 -A --all show status of all files
569 -A --all show status of all files
570 -m --modified show only modified files
570 -m --modified show only modified files
571 -a --added show only added files
571 -a --added show only added files
572 -r --removed show only removed files
572 -r --removed show only removed files
573 -d --deleted show only deleted (but tracked) files
573 -d --deleted show only deleted (but tracked) files
574 -c --clean show only files without changes
574 -c --clean show only files without changes
575 -u --unknown show only unknown (not tracked) files
575 -u --unknown show only unknown (not tracked) files
576 -i --ignored show only ignored files
576 -i --ignored show only ignored files
577 -n --no-status hide status prefix
577 -n --no-status hide status prefix
578 -C --copies show source of copied files
578 -C --copies show source of copied files
579 -0 --print0 end filenames with NUL, for use with xargs
579 -0 --print0 end filenames with NUL, for use with xargs
580 --rev REV [+] show difference from revision
580 --rev REV [+] show difference from revision
581 --change REV list the changed files of a revision
581 --change REV list the changed files of a revision
582 -I --include PATTERN [+] include names matching the given patterns
582 -I --include PATTERN [+] include names matching the given patterns
583 -X --exclude PATTERN [+] exclude names matching the given patterns
583 -X --exclude PATTERN [+] exclude names matching the given patterns
584 -S --subrepos recurse into subrepositories
584 -S --subrepos recurse into subrepositories
585
585
586 (some details hidden, use --verbose to show complete help)
586 (some details hidden, use --verbose to show complete help)
587
587
588 $ hg -q help status
588 $ hg -q help status
589 hg status [OPTION]... [FILE]...
589 hg status [OPTION]... [FILE]...
590
590
591 show changed files in the working directory
591 show changed files in the working directory
592
592
593 $ hg help foo
593 $ hg help foo
594 abort: no such help topic: foo
594 abort: no such help topic: foo
595 (try "hg help --keyword foo")
595 (try "hg help --keyword foo")
596 [255]
596 [255]
597
597
598 $ hg skjdfks
598 $ hg skjdfks
599 hg: unknown command 'skjdfks'
599 hg: unknown command 'skjdfks'
600 Mercurial Distributed SCM
600 Mercurial Distributed SCM
601
601
602 basic commands:
602 basic commands:
603
603
604 add add the specified files on the next commit
604 add add the specified files on the next commit
605 annotate show changeset information by line for each file
605 annotate show changeset information by line for each file
606 clone make a copy of an existing repository
606 clone make a copy of an existing repository
607 commit commit the specified files or all outstanding changes
607 commit commit the specified files or all outstanding changes
608 diff diff repository (or selected files)
608 diff diff repository (or selected files)
609 export dump the header and diffs for one or more changesets
609 export dump the header and diffs for one or more changesets
610 forget forget the specified files on the next commit
610 forget forget the specified files on the next commit
611 init create a new repository in the given directory
611 init create a new repository in the given directory
612 log show revision history of entire repository or files
612 log show revision history of entire repository or files
613 merge merge another revision into working directory
613 merge merge another revision into working directory
614 pull pull changes from the specified source
614 pull pull changes from the specified source
615 push push changes to the specified destination
615 push push changes to the specified destination
616 remove remove the specified files on the next commit
616 remove remove the specified files on the next commit
617 serve start stand-alone webserver
617 serve start stand-alone webserver
618 status show changed files in the working directory
618 status show changed files in the working directory
619 summary summarize working directory state
619 summary summarize working directory state
620 update update working directory (or switch revisions)
620 update update working directory (or switch revisions)
621
621
622 (use "hg help" for the full list of commands or "hg -v" for details)
622 (use "hg help" for the full list of commands or "hg -v" for details)
623 [255]
623 [255]
624
624
625
625
626 Make sure that we don't run afoul of the help system thinking that
626 Make sure that we don't run afoul of the help system thinking that
627 this is a section and erroring out weirdly.
627 this is a section and erroring out weirdly.
628
628
629 $ hg .log
629 $ hg .log
630 hg: unknown command '.log'
630 hg: unknown command '.log'
631 (did you mean one of log?)
631 (did you mean one of log?)
632 [255]
632 [255]
633
633
634 $ hg log.
634 $ hg log.
635 hg: unknown command 'log.'
635 hg: unknown command 'log.'
636 (did you mean one of log?)
636 (did you mean one of log?)
637 [255]
637 [255]
638 $ hg pu.lh
638 $ hg pu.lh
639 hg: unknown command 'pu.lh'
639 hg: unknown command 'pu.lh'
640 (did you mean one of pull, push?)
640 (did you mean one of pull, push?)
641 [255]
641 [255]
642
642
643 $ cat > helpext.py <<EOF
643 $ cat > helpext.py <<EOF
644 > import os
644 > import os
645 > from mercurial import cmdutil, commands
645 > from mercurial import cmdutil, commands
646 >
646 >
647 > cmdtable = {}
647 > cmdtable = {}
648 > command = cmdutil.command(cmdtable)
648 > command = cmdutil.command(cmdtable)
649 >
649 >
650 > @command('nohelp',
650 > @command('nohelp',
651 > [('', 'longdesc', 3, 'x'*90),
651 > [('', 'longdesc', 3, 'x'*90),
652 > ('n', '', None, 'normal desc'),
652 > ('n', '', None, 'normal desc'),
653 > ('', 'newline', '', 'line1\nline2')],
653 > ('', 'newline', '', 'line1\nline2')],
654 > 'hg nohelp',
654 > 'hg nohelp',
655 > norepo=True)
655 > norepo=True)
656 > @command('debugoptDEP', [('', 'dopt', None, 'option is (DEPRECATED)')])
656 > @command('debugoptDEP', [('', 'dopt', None, 'option is (DEPRECATED)')])
657 > @command('debugoptEXP', [('', 'eopt', None, 'option is (EXPERIMENTAL)')])
657 > @command('debugoptEXP', [('', 'eopt', None, 'option is (EXPERIMENTAL)')])
658 > def nohelp(ui, *args, **kwargs):
658 > def nohelp(ui, *args, **kwargs):
659 > pass
659 > pass
660 >
660 >
661 > EOF
661 > EOF
662 $ echo '[extensions]' >> $HGRCPATH
662 $ echo '[extensions]' >> $HGRCPATH
663 $ echo "helpext = `pwd`/helpext.py" >> $HGRCPATH
663 $ echo "helpext = `pwd`/helpext.py" >> $HGRCPATH
664
664
665 Test command with no help text
665 Test command with no help text
666
666
667 $ hg help nohelp
667 $ hg help nohelp
668 hg nohelp
668 hg nohelp
669
669
670 (no help text available)
670 (no help text available)
671
671
672 options:
672 options:
673
673
674 --longdesc VALUE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
674 --longdesc VALUE xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
675 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (default: 3)
675 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (default: 3)
676 -n -- normal desc
676 -n -- normal desc
677 --newline VALUE line1 line2
677 --newline VALUE line1 line2
678
678
679 (some details hidden, use --verbose to show complete help)
679 (some details hidden, use --verbose to show complete help)
680
680
681 $ hg help -k nohelp
681 $ hg help -k nohelp
682 Commands:
682 Commands:
683
683
684 nohelp hg nohelp
684 nohelp hg nohelp
685
685
686 Extension Commands:
686 Extension Commands:
687
687
688 nohelp (no help text available)
688 nohelp (no help text available)
689
689
690 Test that default list of commands omits extension commands
690 Test that default list of commands omits extension commands
691
691
692 $ hg help
692 $ hg help
693 Mercurial Distributed SCM
693 Mercurial Distributed SCM
694
694
695 list of commands:
695 list of commands:
696
696
697 add add the specified files on the next commit
697 add add the specified files on the next commit
698 addremove add all new files, delete all missing files
698 addremove add all new files, delete all missing files
699 annotate show changeset information by line for each file
699 annotate show changeset information by line for each file
700 archive create an unversioned archive of a repository revision
700 archive create an unversioned archive of a repository revision
701 backout reverse effect of earlier changeset
701 backout reverse effect of earlier changeset
702 bisect subdivision search of changesets
702 bisect subdivision search of changesets
703 bookmarks create a new bookmark or list existing bookmarks
703 bookmarks create a new bookmark or list existing bookmarks
704 branch set or show the current branch name
704 branch set or show the current branch name
705 branches list repository named branches
705 branches list repository named branches
706 bundle create a changegroup file
706 bundle create a changegroup file
707 cat output the current or given revision of files
707 cat output the current or given revision of files
708 clone make a copy of an existing repository
708 clone make a copy of an existing repository
709 commit commit the specified files or all outstanding changes
709 commit commit the specified files or all outstanding changes
710 config show combined config settings from all hgrc files
710 config show combined config settings from all hgrc files
711 copy mark files as copied for the next commit
711 copy mark files as copied for the next commit
712 diff diff repository (or selected files)
712 diff diff repository (or selected files)
713 export dump the header and diffs for one or more changesets
713 export dump the header and diffs for one or more changesets
714 files list tracked files
714 files list tracked files
715 forget forget the specified files on the next commit
715 forget forget the specified files on the next commit
716 graft copy changes from other branches onto the current branch
716 graft copy changes from other branches onto the current branch
717 grep search for a pattern in specified files and revisions
717 grep search for a pattern in specified files and revisions
718 heads show branch heads
718 heads show branch heads
719 help show help for a given topic or a help overview
719 help show help for a given topic or a help overview
720 identify identify the working directory or specified revision
720 identify identify the working directory or specified revision
721 import import an ordered set of patches
721 import import an ordered set of patches
722 incoming show new changesets found in source
722 incoming show new changesets found in source
723 init create a new repository in the given directory
723 init create a new repository in the given directory
724 log show revision history of entire repository or files
724 log show revision history of entire repository or files
725 manifest output the current or given revision of the project manifest
725 manifest output the current or given revision of the project manifest
726 merge merge another revision into working directory
726 merge merge another revision into working directory
727 outgoing show changesets not found in the destination
727 outgoing show changesets not found in the destination
728 paths show aliases for remote repositories
728 paths show aliases for remote repositories
729 phase set or show the current phase name
729 phase set or show the current phase name
730 pull pull changes from the specified source
730 pull pull changes from the specified source
731 push push changes to the specified destination
731 push push changes to the specified destination
732 recover roll back an interrupted transaction
732 recover roll back an interrupted transaction
733 remove remove the specified files on the next commit
733 remove remove the specified files on the next commit
734 rename rename files; equivalent of copy + remove
734 rename rename files; equivalent of copy + remove
735 resolve redo merges or set/view the merge status of files
735 resolve redo merges or set/view the merge status of files
736 revert restore files to their checkout state
736 revert restore files to their checkout state
737 root print the root (top) of the current working directory
737 root print the root (top) of the current working directory
738 serve start stand-alone webserver
738 serve start stand-alone webserver
739 status show changed files in the working directory
739 status show changed files in the working directory
740 summary summarize working directory state
740 summary summarize working directory state
741 tag add one or more tags for the current or given revision
741 tag add one or more tags for the current or given revision
742 tags list repository tags
742 tags list repository tags
743 unbundle apply one or more changegroup files
743 unbundle apply one or more changegroup files
744 update update working directory (or switch revisions)
744 update update working directory (or switch revisions)
745 verify verify the integrity of the repository
745 verify verify the integrity of the repository
746 version output version and copyright information
746 version output version and copyright information
747
747
748 enabled extensions:
748 enabled extensions:
749
749
750 helpext (no help text available)
750 helpext (no help text available)
751
751
752 additional help topics:
752 additional help topics:
753
753
754 config Configuration Files
754 config Configuration Files
755 dates Date Formats
755 dates Date Formats
756 diffs Diff Formats
756 diffs Diff Formats
757 environment Environment Variables
757 environment Environment Variables
758 extensions Using Additional Features
758 extensions Using Additional Features
759 filesets Specifying File Sets
759 filesets Specifying File Sets
760 glossary Glossary
760 glossary Glossary
761 hgignore Syntax for Mercurial Ignore Files
761 hgignore Syntax for Mercurial Ignore Files
762 hgweb Configuring hgweb
762 hgweb Configuring hgweb
763 merge-tools Merge Tools
763 merge-tools Merge Tools
764 multirevs Specifying Multiple Revisions
764 multirevs Specifying Multiple Revisions
765 patterns File Name Patterns
765 patterns File Name Patterns
766 phases Working with Phases
766 phases Working with Phases
767 revisions Specifying Single Revisions
767 revisions Specifying Single Revisions
768 revsets Specifying Revision Sets
768 revsets Specifying Revision Sets
769 scripting Using Mercurial from scripts and automation
769 scripting Using Mercurial from scripts and automation
770 subrepos Subrepositories
770 subrepos Subrepositories
771 templating Template Usage
771 templating Template Usage
772 urls URL Paths
772 urls URL Paths
773
773
774 (use "hg help -v" to show built-in aliases and global options)
774 (use "hg help -v" to show built-in aliases and global options)
775
775
776
776
777 Test list of internal help commands
777 Test list of internal help commands
778
778
779 $ hg help debug
779 $ hg help debug
780 debug commands (internal and unsupported):
780 debug commands (internal and unsupported):
781
781
782 debugancestor
782 debugancestor
783 find the ancestor revision of two revisions in a given index
783 find the ancestor revision of two revisions in a given index
784 debugapplystreamclonebundle
785 apply a stream clone bundle file
784 debugbuilddag
786 debugbuilddag
785 builds a repo with a given DAG from scratch in the current
787 builds a repo with a given DAG from scratch in the current
786 empty repo
788 empty repo
787 debugbundle lists the contents of a bundle
789 debugbundle lists the contents of a bundle
788 debugcheckstate
790 debugcheckstate
789 validate the correctness of the current dirstate
791 validate the correctness of the current dirstate
790 debugcommands
792 debugcommands
791 list all available commands and options
793 list all available commands and options
792 debugcomplete
794 debugcomplete
793 returns the completion list associated with the given command
795 returns the completion list associated with the given command
794 debugcreatestreamclonebundle
796 debugcreatestreamclonebundle
795 create a stream clone bundle file
797 create a stream clone bundle file
796 debugdag format the changelog or an index DAG as a concise textual
798 debugdag format the changelog or an index DAG as a concise textual
797 description
799 description
798 debugdata dump the contents of a data file revision
800 debugdata dump the contents of a data file revision
799 debugdate parse and display a date
801 debugdate parse and display a date
800 debugdirstate
802 debugdirstate
801 show the contents of the current dirstate
803 show the contents of the current dirstate
802 debugdiscovery
804 debugdiscovery
803 runs the changeset discovery protocol in isolation
805 runs the changeset discovery protocol in isolation
804 debugextensions
806 debugextensions
805 show information about active extensions
807 show information about active extensions
806 debugfileset parse and apply a fileset specification
808 debugfileset parse and apply a fileset specification
807 debugfsinfo show information detected about current filesystem
809 debugfsinfo show information detected about current filesystem
808 debuggetbundle
810 debuggetbundle
809 retrieves a bundle from a repo
811 retrieves a bundle from a repo
810 debugignore display the combined ignore pattern
812 debugignore display the combined ignore pattern
811 debugindex dump the contents of an index file
813 debugindex dump the contents of an index file
812 debugindexdot
814 debugindexdot
813 dump an index DAG as a graphviz dot file
815 dump an index DAG as a graphviz dot file
814 debuginstall test Mercurial installation
816 debuginstall test Mercurial installation
815 debugknown test whether node ids are known to a repo
817 debugknown test whether node ids are known to a repo
816 debuglocks show or modify state of locks
818 debuglocks show or modify state of locks
817 debugmergestate
819 debugmergestate
818 print merge state
820 print merge state
819 debugnamecomplete
821 debugnamecomplete
820 complete "names" - tags, open branch names, bookmark names
822 complete "names" - tags, open branch names, bookmark names
821 debugobsolete
823 debugobsolete
822 create arbitrary obsolete marker
824 create arbitrary obsolete marker
823 debugoptDEP (no help text available)
825 debugoptDEP (no help text available)
824 debugoptEXP (no help text available)
826 debugoptEXP (no help text available)
825 debugpathcomplete
827 debugpathcomplete
826 complete part or all of a tracked path
828 complete part or all of a tracked path
827 debugpushkey access the pushkey key/value protocol
829 debugpushkey access the pushkey key/value protocol
828 debugpvec (no help text available)
830 debugpvec (no help text available)
829 debugrebuilddirstate
831 debugrebuilddirstate
830 rebuild the dirstate as it would look like for the given
832 rebuild the dirstate as it would look like for the given
831 revision
833 revision
832 debugrebuildfncache
834 debugrebuildfncache
833 rebuild the fncache file
835 rebuild the fncache file
834 debugrename dump rename information
836 debugrename dump rename information
835 debugrevlog show data and statistics about a revlog
837 debugrevlog show data and statistics about a revlog
836 debugrevspec parse and apply a revision specification
838 debugrevspec parse and apply a revision specification
837 debugsetparents
839 debugsetparents
838 manually set the parents of the current working directory
840 manually set the parents of the current working directory
839 debugsub (no help text available)
841 debugsub (no help text available)
840 debugsuccessorssets
842 debugsuccessorssets
841 show set of successors for revision
843 show set of successors for revision
842 debugwalk show how files match on given patterns
844 debugwalk show how files match on given patterns
843 debugwireargs
845 debugwireargs
844 (no help text available)
846 (no help text available)
845
847
846 (use "hg help -v debug" to show built-in aliases and global options)
848 (use "hg help -v debug" to show built-in aliases and global options)
847
849
848
850
849 Test list of commands with command with no help text
851 Test list of commands with command with no help text
850
852
851 $ hg help helpext
853 $ hg help helpext
852 helpext extension - no help text available
854 helpext extension - no help text available
853
855
854 list of commands:
856 list of commands:
855
857
856 nohelp (no help text available)
858 nohelp (no help text available)
857
859
858 (use "hg help -v helpext" to show built-in aliases and global options)
860 (use "hg help -v helpext" to show built-in aliases and global options)
859
861
860
862
861 test deprecated and experimental options are hidden in command help
863 test deprecated and experimental options are hidden in command help
862 $ hg help debugoptDEP
864 $ hg help debugoptDEP
863 hg debugoptDEP
865 hg debugoptDEP
864
866
865 (no help text available)
867 (no help text available)
866
868
867 options:
869 options:
868
870
869 (some details hidden, use --verbose to show complete help)
871 (some details hidden, use --verbose to show complete help)
870
872
871 $ hg help debugoptEXP
873 $ hg help debugoptEXP
872 hg debugoptEXP
874 hg debugoptEXP
873
875
874 (no help text available)
876 (no help text available)
875
877
876 options:
878 options:
877
879
878 (some details hidden, use --verbose to show complete help)
880 (some details hidden, use --verbose to show complete help)
879
881
880 test deprecated and experimental options is shown with -v
882 test deprecated and experimental options is shown with -v
881 $ hg help -v debugoptDEP | grep dopt
883 $ hg help -v debugoptDEP | grep dopt
882 --dopt option is (DEPRECATED)
884 --dopt option is (DEPRECATED)
883 $ hg help -v debugoptEXP | grep eopt
885 $ hg help -v debugoptEXP | grep eopt
884 --eopt option is (EXPERIMENTAL)
886 --eopt option is (EXPERIMENTAL)
885
887
886 #if gettext
888 #if gettext
887 test deprecated option is hidden with translation with untranslated description
889 test deprecated option is hidden with translation with untranslated description
888 (use many globy for not failing on changed transaction)
890 (use many globy for not failing on changed transaction)
889 $ LANGUAGE=sv hg help debugoptDEP
891 $ LANGUAGE=sv hg help debugoptDEP
890 hg debugoptDEP
892 hg debugoptDEP
891
893
892 (*) (glob)
894 (*) (glob)
893
895
894 options:
896 options:
895
897
896 (some details hidden, use --verbose to show complete help)
898 (some details hidden, use --verbose to show complete help)
897 #endif
899 #endif
898
900
899 Test commands that collide with topics (issue4240)
901 Test commands that collide with topics (issue4240)
900
902
901 $ hg config -hq
903 $ hg config -hq
902 hg config [-u] [NAME]...
904 hg config [-u] [NAME]...
903
905
904 show combined config settings from all hgrc files
906 show combined config settings from all hgrc files
905 $ hg showconfig -hq
907 $ hg showconfig -hq
906 hg config [-u] [NAME]...
908 hg config [-u] [NAME]...
907
909
908 show combined config settings from all hgrc files
910 show combined config settings from all hgrc files
909
911
910 Test a help topic
912 Test a help topic
911
913
912 $ hg help revs
914 $ hg help revs
913 Specifying Single Revisions
915 Specifying Single Revisions
914 """""""""""""""""""""""""""
916 """""""""""""""""""""""""""
915
917
916 Mercurial supports several ways to specify individual revisions.
918 Mercurial supports several ways to specify individual revisions.
917
919
918 A plain integer is treated as a revision number. Negative integers are
920 A plain integer is treated as a revision number. Negative integers are
919 treated as sequential offsets from the tip, with -1 denoting the tip, -2
921 treated as sequential offsets from the tip, with -1 denoting the tip, -2
920 denoting the revision prior to the tip, and so forth.
922 denoting the revision prior to the tip, and so forth.
921
923
922 A 40-digit hexadecimal string is treated as a unique revision identifier.
924 A 40-digit hexadecimal string is treated as a unique revision identifier.
923
925
924 A hexadecimal string less than 40 characters long is treated as a unique
926 A hexadecimal string less than 40 characters long is treated as a unique
925 revision identifier and is referred to as a short-form identifier. A
927 revision identifier and is referred to as a short-form identifier. A
926 short-form identifier is only valid if it is the prefix of exactly one
928 short-form identifier is only valid if it is the prefix of exactly one
927 full-length identifier.
929 full-length identifier.
928
930
929 Any other string is treated as a bookmark, tag, or branch name. A bookmark
931 Any other string is treated as a bookmark, tag, or branch name. A bookmark
930 is a movable pointer to a revision. A tag is a permanent name associated
932 is a movable pointer to a revision. A tag is a permanent name associated
931 with a revision. A branch name denotes the tipmost open branch head of
933 with a revision. A branch name denotes the tipmost open branch head of
932 that branch - or if they are all closed, the tipmost closed head of the
934 that branch - or if they are all closed, the tipmost closed head of the
933 branch. Bookmark, tag, and branch names must not contain the ":"
935 branch. Bookmark, tag, and branch names must not contain the ":"
934 character.
936 character.
935
937
936 The reserved name "tip" always identifies the most recent revision.
938 The reserved name "tip" always identifies the most recent revision.
937
939
938 The reserved name "null" indicates the null revision. This is the revision
940 The reserved name "null" indicates the null revision. This is the revision
939 of an empty repository, and the parent of revision 0.
941 of an empty repository, and the parent of revision 0.
940
942
941 The reserved name "." indicates the working directory parent. If no
943 The reserved name "." indicates the working directory parent. If no
942 working directory is checked out, it is equivalent to null. If an
944 working directory is checked out, it is equivalent to null. If an
943 uncommitted merge is in progress, "." is the revision of the first parent.
945 uncommitted merge is in progress, "." is the revision of the first parent.
944
946
945 Test repeated config section name
947 Test repeated config section name
946
948
947 $ hg help config.host
949 $ hg help config.host
948 "http_proxy.host"
950 "http_proxy.host"
949 Host name and (optional) port of the proxy server, for example
951 Host name and (optional) port of the proxy server, for example
950 "myproxy:8000".
952 "myproxy:8000".
951
953
952 "smtp.host"
954 "smtp.host"
953 Host name of mail server, e.g. "mail.example.com".
955 Host name of mail server, e.g. "mail.example.com".
954
956
955 Unrelated trailing paragraphs shouldn't be included
957 Unrelated trailing paragraphs shouldn't be included
956
958
957 $ hg help config.extramsg | grep '^$'
959 $ hg help config.extramsg | grep '^$'
958
960
959
961
960 Test capitalized section name
962 Test capitalized section name
961
963
962 $ hg help scripting.HGPLAIN > /dev/null
964 $ hg help scripting.HGPLAIN > /dev/null
963
965
964 Help subsection:
966 Help subsection:
965
967
966 $ hg help config.charsets |grep "Email example:" > /dev/null
968 $ hg help config.charsets |grep "Email example:" > /dev/null
967 [1]
969 [1]
968
970
969 Show nested definitions
971 Show nested definitions
970 ("profiling.type"[break]"ls"[break]"stat"[break])
972 ("profiling.type"[break]"ls"[break]"stat"[break])
971
973
972 $ hg help config.type | egrep '^$'|wc -l
974 $ hg help config.type | egrep '^$'|wc -l
973 \s*3 (re)
975 \s*3 (re)
974
976
975 Last item in help config.*:
977 Last item in help config.*:
976
978
977 $ hg help config.`hg help config|grep '^ "'| \
979 $ hg help config.`hg help config|grep '^ "'| \
978 > tail -1|sed 's![ "]*!!g'`| \
980 > tail -1|sed 's![ "]*!!g'`| \
979 > grep "hg help -c config" > /dev/null
981 > grep "hg help -c config" > /dev/null
980 [1]
982 [1]
981
983
982 note to use help -c for general hg help config:
984 note to use help -c for general hg help config:
983
985
984 $ hg help config |grep "hg help -c config" > /dev/null
986 $ hg help config |grep "hg help -c config" > /dev/null
985
987
986 Test templating help
988 Test templating help
987
989
988 $ hg help templating | egrep '(desc|diffstat|firstline|nonempty) '
990 $ hg help templating | egrep '(desc|diffstat|firstline|nonempty) '
989 desc String. The text of the changeset description.
991 desc String. The text of the changeset description.
990 diffstat String. Statistics of changes with the following format:
992 diffstat String. Statistics of changes with the following format:
991 firstline Any text. Returns the first line of text.
993 firstline Any text. Returns the first line of text.
992 nonempty Any text. Returns '(none)' if the string is empty.
994 nonempty Any text. Returns '(none)' if the string is empty.
993
995
994 Test deprecated items
996 Test deprecated items
995
997
996 $ hg help -v templating | grep currentbookmark
998 $ hg help -v templating | grep currentbookmark
997 currentbookmark
999 currentbookmark
998 $ hg help templating | (grep currentbookmark || true)
1000 $ hg help templating | (grep currentbookmark || true)
999
1001
1000 Test help hooks
1002 Test help hooks
1001
1003
1002 $ cat > helphook1.py <<EOF
1004 $ cat > helphook1.py <<EOF
1003 > from mercurial import help
1005 > from mercurial import help
1004 >
1006 >
1005 > def rewrite(ui, topic, doc):
1007 > def rewrite(ui, topic, doc):
1006 > return doc + '\nhelphook1\n'
1008 > return doc + '\nhelphook1\n'
1007 >
1009 >
1008 > def extsetup(ui):
1010 > def extsetup(ui):
1009 > help.addtopichook('revsets', rewrite)
1011 > help.addtopichook('revsets', rewrite)
1010 > EOF
1012 > EOF
1011 $ cat > helphook2.py <<EOF
1013 $ cat > helphook2.py <<EOF
1012 > from mercurial import help
1014 > from mercurial import help
1013 >
1015 >
1014 > def rewrite(ui, topic, doc):
1016 > def rewrite(ui, topic, doc):
1015 > return doc + '\nhelphook2\n'
1017 > return doc + '\nhelphook2\n'
1016 >
1018 >
1017 > def extsetup(ui):
1019 > def extsetup(ui):
1018 > help.addtopichook('revsets', rewrite)
1020 > help.addtopichook('revsets', rewrite)
1019 > EOF
1021 > EOF
1020 $ echo '[extensions]' >> $HGRCPATH
1022 $ echo '[extensions]' >> $HGRCPATH
1021 $ echo "helphook1 = `pwd`/helphook1.py" >> $HGRCPATH
1023 $ echo "helphook1 = `pwd`/helphook1.py" >> $HGRCPATH
1022 $ echo "helphook2 = `pwd`/helphook2.py" >> $HGRCPATH
1024 $ echo "helphook2 = `pwd`/helphook2.py" >> $HGRCPATH
1023 $ hg help revsets | grep helphook
1025 $ hg help revsets | grep helphook
1024 helphook1
1026 helphook1
1025 helphook2
1027 helphook2
1026
1028
1027 Test -e / -c / -k combinations
1029 Test -e / -c / -k combinations
1028
1030
1029 $ hg help -c progress
1031 $ hg help -c progress
1030 abort: no such help topic: progress
1032 abort: no such help topic: progress
1031 (try "hg help --keyword progress")
1033 (try "hg help --keyword progress")
1032 [255]
1034 [255]
1033 $ hg help -e progress |head -1
1035 $ hg help -e progress |head -1
1034 progress extension - show progress bars for some actions (DEPRECATED)
1036 progress extension - show progress bars for some actions (DEPRECATED)
1035 $ hg help -c -k dates |egrep '^(Topics|Extensions|Commands):'
1037 $ hg help -c -k dates |egrep '^(Topics|Extensions|Commands):'
1036 Commands:
1038 Commands:
1037 $ hg help -e -k a |egrep '^(Topics|Extensions|Commands):'
1039 $ hg help -e -k a |egrep '^(Topics|Extensions|Commands):'
1038 Extensions:
1040 Extensions:
1039 $ hg help -e -c -k date |egrep '^(Topics|Extensions|Commands):'
1041 $ hg help -e -c -k date |egrep '^(Topics|Extensions|Commands):'
1040 Extensions:
1042 Extensions:
1041 Commands:
1043 Commands:
1042 $ hg help -c commit > /dev/null
1044 $ hg help -c commit > /dev/null
1043 $ hg help -e -c commit > /dev/null
1045 $ hg help -e -c commit > /dev/null
1044 $ hg help -e commit > /dev/null
1046 $ hg help -e commit > /dev/null
1045 abort: no such help topic: commit
1047 abort: no such help topic: commit
1046 (try "hg help --keyword commit")
1048 (try "hg help --keyword commit")
1047 [255]
1049 [255]
1048
1050
1049 Test keyword search help
1051 Test keyword search help
1050
1052
1051 $ cat > prefixedname.py <<EOF
1053 $ cat > prefixedname.py <<EOF
1052 > '''matched against word "clone"
1054 > '''matched against word "clone"
1053 > '''
1055 > '''
1054 > EOF
1056 > EOF
1055 $ echo '[extensions]' >> $HGRCPATH
1057 $ echo '[extensions]' >> $HGRCPATH
1056 $ echo "dot.dot.prefixedname = `pwd`/prefixedname.py" >> $HGRCPATH
1058 $ echo "dot.dot.prefixedname = `pwd`/prefixedname.py" >> $HGRCPATH
1057 $ hg help -k clone
1059 $ hg help -k clone
1058 Topics:
1060 Topics:
1059
1061
1060 config Configuration Files
1062 config Configuration Files
1061 extensions Using Additional Features
1063 extensions Using Additional Features
1062 glossary Glossary
1064 glossary Glossary
1063 phases Working with Phases
1065 phases Working with Phases
1064 subrepos Subrepositories
1066 subrepos Subrepositories
1065 urls URL Paths
1067 urls URL Paths
1066
1068
1067 Commands:
1069 Commands:
1068
1070
1069 bookmarks create a new bookmark or list existing bookmarks
1071 bookmarks create a new bookmark or list existing bookmarks
1070 clone make a copy of an existing repository
1072 clone make a copy of an existing repository
1073 debugapplystreamclonebundle apply a stream clone bundle file
1071 debugcreatestreamclonebundle create a stream clone bundle file
1074 debugcreatestreamclonebundle create a stream clone bundle file
1072 paths show aliases for remote repositories
1075 paths show aliases for remote repositories
1073 update update working directory (or switch revisions)
1076 update update working directory (or switch revisions)
1074
1077
1075 Extensions:
1078 Extensions:
1076
1079
1077 clonebundles server side extension to advertise pre-generated bundles to seed
1080 clonebundles server side extension to advertise pre-generated bundles to seed
1078 clones.
1081 clones.
1079 prefixedname matched against word "clone"
1082 prefixedname matched against word "clone"
1080 relink recreates hardlinks between repository clones
1083 relink recreates hardlinks between repository clones
1081
1084
1082 Extension Commands:
1085 Extension Commands:
1083
1086
1084 qclone clone main and patch repository at same time
1087 qclone clone main and patch repository at same time
1085
1088
1086 Test unfound topic
1089 Test unfound topic
1087
1090
1088 $ hg help nonexistingtopicthatwillneverexisteverever
1091 $ hg help nonexistingtopicthatwillneverexisteverever
1089 abort: no such help topic: nonexistingtopicthatwillneverexisteverever
1092 abort: no such help topic: nonexistingtopicthatwillneverexisteverever
1090 (try "hg help --keyword nonexistingtopicthatwillneverexisteverever")
1093 (try "hg help --keyword nonexistingtopicthatwillneverexisteverever")
1091 [255]
1094 [255]
1092
1095
1093 Test unfound keyword
1096 Test unfound keyword
1094
1097
1095 $ hg help --keyword nonexistingwordthatwillneverexisteverever
1098 $ hg help --keyword nonexistingwordthatwillneverexisteverever
1096 abort: no matches
1099 abort: no matches
1097 (try "hg help" for a list of topics)
1100 (try "hg help" for a list of topics)
1098 [255]
1101 [255]
1099
1102
1100 Test omit indicating for help
1103 Test omit indicating for help
1101
1104
1102 $ cat > addverboseitems.py <<EOF
1105 $ cat > addverboseitems.py <<EOF
1103 > '''extension to test omit indicating.
1106 > '''extension to test omit indicating.
1104 >
1107 >
1105 > This paragraph is never omitted (for extension)
1108 > This paragraph is never omitted (for extension)
1106 >
1109 >
1107 > .. container:: verbose
1110 > .. container:: verbose
1108 >
1111 >
1109 > This paragraph is omitted,
1112 > This paragraph is omitted,
1110 > if :hg:\`help\` is invoked without \`\`-v\`\` (for extension)
1113 > if :hg:\`help\` is invoked without \`\`-v\`\` (for extension)
1111 >
1114 >
1112 > This paragraph is never omitted, too (for extension)
1115 > This paragraph is never omitted, too (for extension)
1113 > '''
1116 > '''
1114 >
1117 >
1115 > from mercurial import help, commands
1118 > from mercurial import help, commands
1116 > testtopic = """This paragraph is never omitted (for topic).
1119 > testtopic = """This paragraph is never omitted (for topic).
1117 >
1120 >
1118 > .. container:: verbose
1121 > .. container:: verbose
1119 >
1122 >
1120 > This paragraph is omitted,
1123 > This paragraph is omitted,
1121 > if :hg:\`help\` is invoked without \`\`-v\`\` (for topic)
1124 > if :hg:\`help\` is invoked without \`\`-v\`\` (for topic)
1122 >
1125 >
1123 > This paragraph is never omitted, too (for topic)
1126 > This paragraph is never omitted, too (for topic)
1124 > """
1127 > """
1125 > def extsetup(ui):
1128 > def extsetup(ui):
1126 > help.helptable.append((["topic-containing-verbose"],
1129 > help.helptable.append((["topic-containing-verbose"],
1127 > "This is the topic to test omit indicating.",
1130 > "This is the topic to test omit indicating.",
1128 > lambda ui: testtopic))
1131 > lambda ui: testtopic))
1129 > EOF
1132 > EOF
1130 $ echo '[extensions]' >> $HGRCPATH
1133 $ echo '[extensions]' >> $HGRCPATH
1131 $ echo "addverboseitems = `pwd`/addverboseitems.py" >> $HGRCPATH
1134 $ echo "addverboseitems = `pwd`/addverboseitems.py" >> $HGRCPATH
1132 $ hg help addverboseitems
1135 $ hg help addverboseitems
1133 addverboseitems extension - extension to test omit indicating.
1136 addverboseitems extension - extension to test omit indicating.
1134
1137
1135 This paragraph is never omitted (for extension)
1138 This paragraph is never omitted (for extension)
1136
1139
1137 This paragraph is never omitted, too (for extension)
1140 This paragraph is never omitted, too (for extension)
1138
1141
1139 (some details hidden, use --verbose to show complete help)
1142 (some details hidden, use --verbose to show complete help)
1140
1143
1141 no commands defined
1144 no commands defined
1142 $ hg help -v addverboseitems
1145 $ hg help -v addverboseitems
1143 addverboseitems extension - extension to test omit indicating.
1146 addverboseitems extension - extension to test omit indicating.
1144
1147
1145 This paragraph is never omitted (for extension)
1148 This paragraph is never omitted (for extension)
1146
1149
1147 This paragraph is omitted, if "hg help" is invoked without "-v" (for
1150 This paragraph is omitted, if "hg help" is invoked without "-v" (for
1148 extension)
1151 extension)
1149
1152
1150 This paragraph is never omitted, too (for extension)
1153 This paragraph is never omitted, too (for extension)
1151
1154
1152 no commands defined
1155 no commands defined
1153 $ hg help topic-containing-verbose
1156 $ hg help topic-containing-verbose
1154 This is the topic to test omit indicating.
1157 This is the topic to test omit indicating.
1155 """"""""""""""""""""""""""""""""""""""""""
1158 """"""""""""""""""""""""""""""""""""""""""
1156
1159
1157 This paragraph is never omitted (for topic).
1160 This paragraph is never omitted (for topic).
1158
1161
1159 This paragraph is never omitted, too (for topic)
1162 This paragraph is never omitted, too (for topic)
1160
1163
1161 (some details hidden, use --verbose to show complete help)
1164 (some details hidden, use --verbose to show complete help)
1162 $ hg help -v topic-containing-verbose
1165 $ hg help -v topic-containing-verbose
1163 This is the topic to test omit indicating.
1166 This is the topic to test omit indicating.
1164 """"""""""""""""""""""""""""""""""""""""""
1167 """"""""""""""""""""""""""""""""""""""""""
1165
1168
1166 This paragraph is never omitted (for topic).
1169 This paragraph is never omitted (for topic).
1167
1170
1168 This paragraph is omitted, if "hg help" is invoked without "-v" (for
1171 This paragraph is omitted, if "hg help" is invoked without "-v" (for
1169 topic)
1172 topic)
1170
1173
1171 This paragraph is never omitted, too (for topic)
1174 This paragraph is never omitted, too (for topic)
1172
1175
1173 Test section lookup
1176 Test section lookup
1174
1177
1175 $ hg help revset.merge
1178 $ hg help revset.merge
1176 "merge()"
1179 "merge()"
1177 Changeset is a merge changeset.
1180 Changeset is a merge changeset.
1178
1181
1179 $ hg help glossary.dag
1182 $ hg help glossary.dag
1180 DAG
1183 DAG
1181 The repository of changesets of a distributed version control system
1184 The repository of changesets of a distributed version control system
1182 (DVCS) can be described as a directed acyclic graph (DAG), consisting
1185 (DVCS) can be described as a directed acyclic graph (DAG), consisting
1183 of nodes and edges, where nodes correspond to changesets and edges
1186 of nodes and edges, where nodes correspond to changesets and edges
1184 imply a parent -> child relation. This graph can be visualized by
1187 imply a parent -> child relation. This graph can be visualized by
1185 graphical tools such as "hg log --graph". In Mercurial, the DAG is
1188 graphical tools such as "hg log --graph". In Mercurial, the DAG is
1186 limited by the requirement for children to have at most two parents.
1189 limited by the requirement for children to have at most two parents.
1187
1190
1188
1191
1189 $ hg help hgrc.paths
1192 $ hg help hgrc.paths
1190 "paths"
1193 "paths"
1191 -------
1194 -------
1192
1195
1193 Assigns symbolic names to repositories. The left side is the symbolic
1196 Assigns symbolic names to repositories. The left side is the symbolic
1194 name, and the right gives the directory or URL that is the location of the
1197 name, and the right gives the directory or URL that is the location of the
1195 repository. Default paths can be declared by setting the following
1198 repository. Default paths can be declared by setting the following
1196 entries.
1199 entries.
1197
1200
1198 "default"
1201 "default"
1199 Directory or URL to use when pulling if no source is specified.
1202 Directory or URL to use when pulling if no source is specified.
1200 (default: repository from which the current repository was cloned)
1203 (default: repository from which the current repository was cloned)
1201
1204
1202 "default-push"
1205 "default-push"
1203 Optional. Directory or URL to use when pushing if no destination is
1206 Optional. Directory or URL to use when pushing if no destination is
1204 specified.
1207 specified.
1205
1208
1206 Custom paths can be defined by assigning the path to a name that later can
1209 Custom paths can be defined by assigning the path to a name that later can
1207 be used from the command line. Example:
1210 be used from the command line. Example:
1208
1211
1209 [paths]
1212 [paths]
1210 my_path = http://example.com/path
1213 my_path = http://example.com/path
1211
1214
1212 To push to the path defined in "my_path" run the command:
1215 To push to the path defined in "my_path" run the command:
1213
1216
1214 hg push my_path
1217 hg push my_path
1215
1218
1216 $ hg help glossary.mcguffin
1219 $ hg help glossary.mcguffin
1217 abort: help section not found
1220 abort: help section not found
1218 [255]
1221 [255]
1219
1222
1220 $ hg help glossary.mc.guffin
1223 $ hg help glossary.mc.guffin
1221 abort: help section not found
1224 abort: help section not found
1222 [255]
1225 [255]
1223
1226
1224 $ hg help template.files
1227 $ hg help template.files
1225 files List of strings. All files modified, added, or removed by
1228 files List of strings. All files modified, added, or removed by
1226 this changeset.
1229 this changeset.
1227
1230
1228 Test dynamic list of merge tools only shows up once
1231 Test dynamic list of merge tools only shows up once
1229 $ hg help merge-tools
1232 $ hg help merge-tools
1230 Merge Tools
1233 Merge Tools
1231 """""""""""
1234 """""""""""
1232
1235
1233 To merge files Mercurial uses merge tools.
1236 To merge files Mercurial uses merge tools.
1234
1237
1235 A merge tool combines two different versions of a file into a merged file.
1238 A merge tool combines two different versions of a file into a merged file.
1236 Merge tools are given the two files and the greatest common ancestor of
1239 Merge tools are given the two files and the greatest common ancestor of
1237 the two file versions, so they can determine the changes made on both
1240 the two file versions, so they can determine the changes made on both
1238 branches.
1241 branches.
1239
1242
1240 Merge tools are used both for "hg resolve", "hg merge", "hg update", "hg
1243 Merge tools are used both for "hg resolve", "hg merge", "hg update", "hg
1241 backout" and in several extensions.
1244 backout" and in several extensions.
1242
1245
1243 Usually, the merge tool tries to automatically reconcile the files by
1246 Usually, the merge tool tries to automatically reconcile the files by
1244 combining all non-overlapping changes that occurred separately in the two
1247 combining all non-overlapping changes that occurred separately in the two
1245 different evolutions of the same initial base file. Furthermore, some
1248 different evolutions of the same initial base file. Furthermore, some
1246 interactive merge programs make it easier to manually resolve conflicting
1249 interactive merge programs make it easier to manually resolve conflicting
1247 merges, either in a graphical way, or by inserting some conflict markers.
1250 merges, either in a graphical way, or by inserting some conflict markers.
1248 Mercurial does not include any interactive merge programs but relies on
1251 Mercurial does not include any interactive merge programs but relies on
1249 external tools for that.
1252 external tools for that.
1250
1253
1251 Available merge tools
1254 Available merge tools
1252 =====================
1255 =====================
1253
1256
1254 External merge tools and their properties are configured in the merge-
1257 External merge tools and their properties are configured in the merge-
1255 tools configuration section - see hgrc(5) - but they can often just be
1258 tools configuration section - see hgrc(5) - but they can often just be
1256 named by their executable.
1259 named by their executable.
1257
1260
1258 A merge tool is generally usable if its executable can be found on the
1261 A merge tool is generally usable if its executable can be found on the
1259 system and if it can handle the merge. The executable is found if it is an
1262 system and if it can handle the merge. The executable is found if it is an
1260 absolute or relative executable path or the name of an application in the
1263 absolute or relative executable path or the name of an application in the
1261 executable search path. The tool is assumed to be able to handle the merge
1264 executable search path. The tool is assumed to be able to handle the merge
1262 if it can handle symlinks if the file is a symlink, if it can handle
1265 if it can handle symlinks if the file is a symlink, if it can handle
1263 binary files if the file is binary, and if a GUI is available if the tool
1266 binary files if the file is binary, and if a GUI is available if the tool
1264 requires a GUI.
1267 requires a GUI.
1265
1268
1266 There are some internal merge tools which can be used. The internal merge
1269 There are some internal merge tools which can be used. The internal merge
1267 tools are:
1270 tools are:
1268
1271
1269 ":dump"
1272 ":dump"
1270 Creates three versions of the files to merge, containing the contents of
1273 Creates three versions of the files to merge, containing the contents of
1271 local, other and base. These files can then be used to perform a merge
1274 local, other and base. These files can then be used to perform a merge
1272 manually. If the file to be merged is named "a.txt", these files will
1275 manually. If the file to be merged is named "a.txt", these files will
1273 accordingly be named "a.txt.local", "a.txt.other" and "a.txt.base" and
1276 accordingly be named "a.txt.local", "a.txt.other" and "a.txt.base" and
1274 they will be placed in the same directory as "a.txt".
1277 they will be placed in the same directory as "a.txt".
1275
1278
1276 ":fail"
1279 ":fail"
1277 Rather than attempting to merge files that were modified on both
1280 Rather than attempting to merge files that were modified on both
1278 branches, it marks them as unresolved. The resolve command must be used
1281 branches, it marks them as unresolved. The resolve command must be used
1279 to resolve these conflicts.
1282 to resolve these conflicts.
1280
1283
1281 ":local"
1284 ":local"
1282 Uses the local version of files as the merged version.
1285 Uses the local version of files as the merged version.
1283
1286
1284 ":merge"
1287 ":merge"
1285 Uses the internal non-interactive simple merge algorithm for merging
1288 Uses the internal non-interactive simple merge algorithm for merging
1286 files. It will fail if there are any conflicts and leave markers in the
1289 files. It will fail if there are any conflicts and leave markers in the
1287 partially merged file. Markers will have two sections, one for each side
1290 partially merged file. Markers will have two sections, one for each side
1288 of merge.
1291 of merge.
1289
1292
1290 ":merge-local"
1293 ":merge-local"
1291 Like :merge, but resolve all conflicts non-interactively in favor of the
1294 Like :merge, but resolve all conflicts non-interactively in favor of the
1292 local changes.
1295 local changes.
1293
1296
1294 ":merge-other"
1297 ":merge-other"
1295 Like :merge, but resolve all conflicts non-interactively in favor of the
1298 Like :merge, but resolve all conflicts non-interactively in favor of the
1296 other changes.
1299 other changes.
1297
1300
1298 ":merge3"
1301 ":merge3"
1299 Uses the internal non-interactive simple merge algorithm for merging
1302 Uses the internal non-interactive simple merge algorithm for merging
1300 files. It will fail if there are any conflicts and leave markers in the
1303 files. It will fail if there are any conflicts and leave markers in the
1301 partially merged file. Marker will have three sections, one from each
1304 partially merged file. Marker will have three sections, one from each
1302 side of the merge and one for the base content.
1305 side of the merge and one for the base content.
1303
1306
1304 ":other"
1307 ":other"
1305 Uses the other version of files as the merged version.
1308 Uses the other version of files as the merged version.
1306
1309
1307 ":prompt"
1310 ":prompt"
1308 Asks the user which of the local or the other version to keep as the
1311 Asks the user which of the local or the other version to keep as the
1309 merged version.
1312 merged version.
1310
1313
1311 ":tagmerge"
1314 ":tagmerge"
1312 Uses the internal tag merge algorithm (experimental).
1315 Uses the internal tag merge algorithm (experimental).
1313
1316
1314 ":union"
1317 ":union"
1315 Uses the internal non-interactive simple merge algorithm for merging
1318 Uses the internal non-interactive simple merge algorithm for merging
1316 files. It will use both left and right sides for conflict regions. No
1319 files. It will use both left and right sides for conflict regions. No
1317 markers are inserted.
1320 markers are inserted.
1318
1321
1319 Internal tools are always available and do not require a GUI but will by
1322 Internal tools are always available and do not require a GUI but will by
1320 default not handle symlinks or binary files.
1323 default not handle symlinks or binary files.
1321
1324
1322 Choosing a merge tool
1325 Choosing a merge tool
1323 =====================
1326 =====================
1324
1327
1325 Mercurial uses these rules when deciding which merge tool to use:
1328 Mercurial uses these rules when deciding which merge tool to use:
1326
1329
1327 1. If a tool has been specified with the --tool option to merge or
1330 1. If a tool has been specified with the --tool option to merge or
1328 resolve, it is used. If it is the name of a tool in the merge-tools
1331 resolve, it is used. If it is the name of a tool in the merge-tools
1329 configuration, its configuration is used. Otherwise the specified tool
1332 configuration, its configuration is used. Otherwise the specified tool
1330 must be executable by the shell.
1333 must be executable by the shell.
1331 2. If the "HGMERGE" environment variable is present, its value is used and
1334 2. If the "HGMERGE" environment variable is present, its value is used and
1332 must be executable by the shell.
1335 must be executable by the shell.
1333 3. If the filename of the file to be merged matches any of the patterns in
1336 3. If the filename of the file to be merged matches any of the patterns in
1334 the merge-patterns configuration section, the first usable merge tool
1337 the merge-patterns configuration section, the first usable merge tool
1335 corresponding to a matching pattern is used. Here, binary capabilities
1338 corresponding to a matching pattern is used. Here, binary capabilities
1336 of the merge tool are not considered.
1339 of the merge tool are not considered.
1337 4. If ui.merge is set it will be considered next. If the value is not the
1340 4. If ui.merge is set it will be considered next. If the value is not the
1338 name of a configured tool, the specified value is used and must be
1341 name of a configured tool, the specified value is used and must be
1339 executable by the shell. Otherwise the named tool is used if it is
1342 executable by the shell. Otherwise the named tool is used if it is
1340 usable.
1343 usable.
1341 5. If any usable merge tools are present in the merge-tools configuration
1344 5. If any usable merge tools are present in the merge-tools configuration
1342 section, the one with the highest priority is used.
1345 section, the one with the highest priority is used.
1343 6. If a program named "hgmerge" can be found on the system, it is used -
1346 6. If a program named "hgmerge" can be found on the system, it is used -
1344 but it will by default not be used for symlinks and binary files.
1347 but it will by default not be used for symlinks and binary files.
1345 7. If the file to be merged is not binary and is not a symlink, then
1348 7. If the file to be merged is not binary and is not a symlink, then
1346 internal ":merge" is used.
1349 internal ":merge" is used.
1347 8. The merge of the file fails and must be resolved before commit.
1350 8. The merge of the file fails and must be resolved before commit.
1348
1351
1349 Note:
1352 Note:
1350 After selecting a merge program, Mercurial will by default attempt to
1353 After selecting a merge program, Mercurial will by default attempt to
1351 merge the files using a simple merge algorithm first. Only if it
1354 merge the files using a simple merge algorithm first. Only if it
1352 doesn't succeed because of conflicting changes Mercurial will actually
1355 doesn't succeed because of conflicting changes Mercurial will actually
1353 execute the merge program. Whether to use the simple merge algorithm
1356 execute the merge program. Whether to use the simple merge algorithm
1354 first can be controlled by the premerge setting of the merge tool.
1357 first can be controlled by the premerge setting of the merge tool.
1355 Premerge is enabled by default unless the file is binary or a symlink.
1358 Premerge is enabled by default unless the file is binary or a symlink.
1356
1359
1357 See the merge-tools and ui sections of hgrc(5) for details on the
1360 See the merge-tools and ui sections of hgrc(5) for details on the
1358 configuration of merge tools.
1361 configuration of merge tools.
1359
1362
1360 Test usage of section marks in help documents
1363 Test usage of section marks in help documents
1361
1364
1362 $ cd "$TESTDIR"/../doc
1365 $ cd "$TESTDIR"/../doc
1363 $ python check-seclevel.py
1366 $ python check-seclevel.py
1364 $ cd $TESTTMP
1367 $ cd $TESTTMP
1365
1368
1366 #if serve
1369 #if serve
1367
1370
1368 Test the help pages in hgweb.
1371 Test the help pages in hgweb.
1369
1372
1370 Dish up an empty repo; serve it cold.
1373 Dish up an empty repo; serve it cold.
1371
1374
1372 $ hg init "$TESTTMP/test"
1375 $ hg init "$TESTTMP/test"
1373 $ hg serve -R "$TESTTMP/test" -n test -p $HGPORT -d --pid-file=hg.pid
1376 $ hg serve -R "$TESTTMP/test" -n test -p $HGPORT -d --pid-file=hg.pid
1374 $ cat hg.pid >> $DAEMON_PIDS
1377 $ cat hg.pid >> $DAEMON_PIDS
1375
1378
1376 $ get-with-headers.py 127.0.0.1:$HGPORT "help"
1379 $ get-with-headers.py 127.0.0.1:$HGPORT "help"
1377 200 Script output follows
1380 200 Script output follows
1378
1381
1379 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1382 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1380 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1383 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1381 <head>
1384 <head>
1382 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1385 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1383 <meta name="robots" content="index, nofollow" />
1386 <meta name="robots" content="index, nofollow" />
1384 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1387 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1385 <script type="text/javascript" src="/static/mercurial.js"></script>
1388 <script type="text/javascript" src="/static/mercurial.js"></script>
1386
1389
1387 <title>Help: Index</title>
1390 <title>Help: Index</title>
1388 </head>
1391 </head>
1389 <body>
1392 <body>
1390
1393
1391 <div class="container">
1394 <div class="container">
1392 <div class="menu">
1395 <div class="menu">
1393 <div class="logo">
1396 <div class="logo">
1394 <a href="https://mercurial-scm.org/">
1397 <a href="https://mercurial-scm.org/">
1395 <img src="/static/hglogo.png" alt="mercurial" /></a>
1398 <img src="/static/hglogo.png" alt="mercurial" /></a>
1396 </div>
1399 </div>
1397 <ul>
1400 <ul>
1398 <li><a href="/shortlog">log</a></li>
1401 <li><a href="/shortlog">log</a></li>
1399 <li><a href="/graph">graph</a></li>
1402 <li><a href="/graph">graph</a></li>
1400 <li><a href="/tags">tags</a></li>
1403 <li><a href="/tags">tags</a></li>
1401 <li><a href="/bookmarks">bookmarks</a></li>
1404 <li><a href="/bookmarks">bookmarks</a></li>
1402 <li><a href="/branches">branches</a></li>
1405 <li><a href="/branches">branches</a></li>
1403 </ul>
1406 </ul>
1404 <ul>
1407 <ul>
1405 <li class="active">help</li>
1408 <li class="active">help</li>
1406 </ul>
1409 </ul>
1407 </div>
1410 </div>
1408
1411
1409 <div class="main">
1412 <div class="main">
1410 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1413 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1411 <form class="search" action="/log">
1414 <form class="search" action="/log">
1412
1415
1413 <p><input name="rev" id="search1" type="text" size="30" /></p>
1416 <p><input name="rev" id="search1" type="text" size="30" /></p>
1414 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
1417 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
1415 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
1418 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
1416 </form>
1419 </form>
1417 <table class="bigtable">
1420 <table class="bigtable">
1418 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
1421 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
1419
1422
1420 <tr><td>
1423 <tr><td>
1421 <a href="/help/config">
1424 <a href="/help/config">
1422 config
1425 config
1423 </a>
1426 </a>
1424 </td><td>
1427 </td><td>
1425 Configuration Files
1428 Configuration Files
1426 </td></tr>
1429 </td></tr>
1427 <tr><td>
1430 <tr><td>
1428 <a href="/help/dates">
1431 <a href="/help/dates">
1429 dates
1432 dates
1430 </a>
1433 </a>
1431 </td><td>
1434 </td><td>
1432 Date Formats
1435 Date Formats
1433 </td></tr>
1436 </td></tr>
1434 <tr><td>
1437 <tr><td>
1435 <a href="/help/diffs">
1438 <a href="/help/diffs">
1436 diffs
1439 diffs
1437 </a>
1440 </a>
1438 </td><td>
1441 </td><td>
1439 Diff Formats
1442 Diff Formats
1440 </td></tr>
1443 </td></tr>
1441 <tr><td>
1444 <tr><td>
1442 <a href="/help/environment">
1445 <a href="/help/environment">
1443 environment
1446 environment
1444 </a>
1447 </a>
1445 </td><td>
1448 </td><td>
1446 Environment Variables
1449 Environment Variables
1447 </td></tr>
1450 </td></tr>
1448 <tr><td>
1451 <tr><td>
1449 <a href="/help/extensions">
1452 <a href="/help/extensions">
1450 extensions
1453 extensions
1451 </a>
1454 </a>
1452 </td><td>
1455 </td><td>
1453 Using Additional Features
1456 Using Additional Features
1454 </td></tr>
1457 </td></tr>
1455 <tr><td>
1458 <tr><td>
1456 <a href="/help/filesets">
1459 <a href="/help/filesets">
1457 filesets
1460 filesets
1458 </a>
1461 </a>
1459 </td><td>
1462 </td><td>
1460 Specifying File Sets
1463 Specifying File Sets
1461 </td></tr>
1464 </td></tr>
1462 <tr><td>
1465 <tr><td>
1463 <a href="/help/glossary">
1466 <a href="/help/glossary">
1464 glossary
1467 glossary
1465 </a>
1468 </a>
1466 </td><td>
1469 </td><td>
1467 Glossary
1470 Glossary
1468 </td></tr>
1471 </td></tr>
1469 <tr><td>
1472 <tr><td>
1470 <a href="/help/hgignore">
1473 <a href="/help/hgignore">
1471 hgignore
1474 hgignore
1472 </a>
1475 </a>
1473 </td><td>
1476 </td><td>
1474 Syntax for Mercurial Ignore Files
1477 Syntax for Mercurial Ignore Files
1475 </td></tr>
1478 </td></tr>
1476 <tr><td>
1479 <tr><td>
1477 <a href="/help/hgweb">
1480 <a href="/help/hgweb">
1478 hgweb
1481 hgweb
1479 </a>
1482 </a>
1480 </td><td>
1483 </td><td>
1481 Configuring hgweb
1484 Configuring hgweb
1482 </td></tr>
1485 </td></tr>
1483 <tr><td>
1486 <tr><td>
1484 <a href="/help/merge-tools">
1487 <a href="/help/merge-tools">
1485 merge-tools
1488 merge-tools
1486 </a>
1489 </a>
1487 </td><td>
1490 </td><td>
1488 Merge Tools
1491 Merge Tools
1489 </td></tr>
1492 </td></tr>
1490 <tr><td>
1493 <tr><td>
1491 <a href="/help/multirevs">
1494 <a href="/help/multirevs">
1492 multirevs
1495 multirevs
1493 </a>
1496 </a>
1494 </td><td>
1497 </td><td>
1495 Specifying Multiple Revisions
1498 Specifying Multiple Revisions
1496 </td></tr>
1499 </td></tr>
1497 <tr><td>
1500 <tr><td>
1498 <a href="/help/patterns">
1501 <a href="/help/patterns">
1499 patterns
1502 patterns
1500 </a>
1503 </a>
1501 </td><td>
1504 </td><td>
1502 File Name Patterns
1505 File Name Patterns
1503 </td></tr>
1506 </td></tr>
1504 <tr><td>
1507 <tr><td>
1505 <a href="/help/phases">
1508 <a href="/help/phases">
1506 phases
1509 phases
1507 </a>
1510 </a>
1508 </td><td>
1511 </td><td>
1509 Working with Phases
1512 Working with Phases
1510 </td></tr>
1513 </td></tr>
1511 <tr><td>
1514 <tr><td>
1512 <a href="/help/revisions">
1515 <a href="/help/revisions">
1513 revisions
1516 revisions
1514 </a>
1517 </a>
1515 </td><td>
1518 </td><td>
1516 Specifying Single Revisions
1519 Specifying Single Revisions
1517 </td></tr>
1520 </td></tr>
1518 <tr><td>
1521 <tr><td>
1519 <a href="/help/revsets">
1522 <a href="/help/revsets">
1520 revsets
1523 revsets
1521 </a>
1524 </a>
1522 </td><td>
1525 </td><td>
1523 Specifying Revision Sets
1526 Specifying Revision Sets
1524 </td></tr>
1527 </td></tr>
1525 <tr><td>
1528 <tr><td>
1526 <a href="/help/scripting">
1529 <a href="/help/scripting">
1527 scripting
1530 scripting
1528 </a>
1531 </a>
1529 </td><td>
1532 </td><td>
1530 Using Mercurial from scripts and automation
1533 Using Mercurial from scripts and automation
1531 </td></tr>
1534 </td></tr>
1532 <tr><td>
1535 <tr><td>
1533 <a href="/help/subrepos">
1536 <a href="/help/subrepos">
1534 subrepos
1537 subrepos
1535 </a>
1538 </a>
1536 </td><td>
1539 </td><td>
1537 Subrepositories
1540 Subrepositories
1538 </td></tr>
1541 </td></tr>
1539 <tr><td>
1542 <tr><td>
1540 <a href="/help/templating">
1543 <a href="/help/templating">
1541 templating
1544 templating
1542 </a>
1545 </a>
1543 </td><td>
1546 </td><td>
1544 Template Usage
1547 Template Usage
1545 </td></tr>
1548 </td></tr>
1546 <tr><td>
1549 <tr><td>
1547 <a href="/help/urls">
1550 <a href="/help/urls">
1548 urls
1551 urls
1549 </a>
1552 </a>
1550 </td><td>
1553 </td><td>
1551 URL Paths
1554 URL Paths
1552 </td></tr>
1555 </td></tr>
1553 <tr><td>
1556 <tr><td>
1554 <a href="/help/topic-containing-verbose">
1557 <a href="/help/topic-containing-verbose">
1555 topic-containing-verbose
1558 topic-containing-verbose
1556 </a>
1559 </a>
1557 </td><td>
1560 </td><td>
1558 This is the topic to test omit indicating.
1561 This is the topic to test omit indicating.
1559 </td></tr>
1562 </td></tr>
1560
1563
1561 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
1564 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
1562
1565
1563 <tr><td>
1566 <tr><td>
1564 <a href="/help/add">
1567 <a href="/help/add">
1565 add
1568 add
1566 </a>
1569 </a>
1567 </td><td>
1570 </td><td>
1568 add the specified files on the next commit
1571 add the specified files on the next commit
1569 </td></tr>
1572 </td></tr>
1570 <tr><td>
1573 <tr><td>
1571 <a href="/help/annotate">
1574 <a href="/help/annotate">
1572 annotate
1575 annotate
1573 </a>
1576 </a>
1574 </td><td>
1577 </td><td>
1575 show changeset information by line for each file
1578 show changeset information by line for each file
1576 </td></tr>
1579 </td></tr>
1577 <tr><td>
1580 <tr><td>
1578 <a href="/help/clone">
1581 <a href="/help/clone">
1579 clone
1582 clone
1580 </a>
1583 </a>
1581 </td><td>
1584 </td><td>
1582 make a copy of an existing repository
1585 make a copy of an existing repository
1583 </td></tr>
1586 </td></tr>
1584 <tr><td>
1587 <tr><td>
1585 <a href="/help/commit">
1588 <a href="/help/commit">
1586 commit
1589 commit
1587 </a>
1590 </a>
1588 </td><td>
1591 </td><td>
1589 commit the specified files or all outstanding changes
1592 commit the specified files or all outstanding changes
1590 </td></tr>
1593 </td></tr>
1591 <tr><td>
1594 <tr><td>
1592 <a href="/help/diff">
1595 <a href="/help/diff">
1593 diff
1596 diff
1594 </a>
1597 </a>
1595 </td><td>
1598 </td><td>
1596 diff repository (or selected files)
1599 diff repository (or selected files)
1597 </td></tr>
1600 </td></tr>
1598 <tr><td>
1601 <tr><td>
1599 <a href="/help/export">
1602 <a href="/help/export">
1600 export
1603 export
1601 </a>
1604 </a>
1602 </td><td>
1605 </td><td>
1603 dump the header and diffs for one or more changesets
1606 dump the header and diffs for one or more changesets
1604 </td></tr>
1607 </td></tr>
1605 <tr><td>
1608 <tr><td>
1606 <a href="/help/forget">
1609 <a href="/help/forget">
1607 forget
1610 forget
1608 </a>
1611 </a>
1609 </td><td>
1612 </td><td>
1610 forget the specified files on the next commit
1613 forget the specified files on the next commit
1611 </td></tr>
1614 </td></tr>
1612 <tr><td>
1615 <tr><td>
1613 <a href="/help/init">
1616 <a href="/help/init">
1614 init
1617 init
1615 </a>
1618 </a>
1616 </td><td>
1619 </td><td>
1617 create a new repository in the given directory
1620 create a new repository in the given directory
1618 </td></tr>
1621 </td></tr>
1619 <tr><td>
1622 <tr><td>
1620 <a href="/help/log">
1623 <a href="/help/log">
1621 log
1624 log
1622 </a>
1625 </a>
1623 </td><td>
1626 </td><td>
1624 show revision history of entire repository or files
1627 show revision history of entire repository or files
1625 </td></tr>
1628 </td></tr>
1626 <tr><td>
1629 <tr><td>
1627 <a href="/help/merge">
1630 <a href="/help/merge">
1628 merge
1631 merge
1629 </a>
1632 </a>
1630 </td><td>
1633 </td><td>
1631 merge another revision into working directory
1634 merge another revision into working directory
1632 </td></tr>
1635 </td></tr>
1633 <tr><td>
1636 <tr><td>
1634 <a href="/help/pull">
1637 <a href="/help/pull">
1635 pull
1638 pull
1636 </a>
1639 </a>
1637 </td><td>
1640 </td><td>
1638 pull changes from the specified source
1641 pull changes from the specified source
1639 </td></tr>
1642 </td></tr>
1640 <tr><td>
1643 <tr><td>
1641 <a href="/help/push">
1644 <a href="/help/push">
1642 push
1645 push
1643 </a>
1646 </a>
1644 </td><td>
1647 </td><td>
1645 push changes to the specified destination
1648 push changes to the specified destination
1646 </td></tr>
1649 </td></tr>
1647 <tr><td>
1650 <tr><td>
1648 <a href="/help/remove">
1651 <a href="/help/remove">
1649 remove
1652 remove
1650 </a>
1653 </a>
1651 </td><td>
1654 </td><td>
1652 remove the specified files on the next commit
1655 remove the specified files on the next commit
1653 </td></tr>
1656 </td></tr>
1654 <tr><td>
1657 <tr><td>
1655 <a href="/help/serve">
1658 <a href="/help/serve">
1656 serve
1659 serve
1657 </a>
1660 </a>
1658 </td><td>
1661 </td><td>
1659 start stand-alone webserver
1662 start stand-alone webserver
1660 </td></tr>
1663 </td></tr>
1661 <tr><td>
1664 <tr><td>
1662 <a href="/help/status">
1665 <a href="/help/status">
1663 status
1666 status
1664 </a>
1667 </a>
1665 </td><td>
1668 </td><td>
1666 show changed files in the working directory
1669 show changed files in the working directory
1667 </td></tr>
1670 </td></tr>
1668 <tr><td>
1671 <tr><td>
1669 <a href="/help/summary">
1672 <a href="/help/summary">
1670 summary
1673 summary
1671 </a>
1674 </a>
1672 </td><td>
1675 </td><td>
1673 summarize working directory state
1676 summarize working directory state
1674 </td></tr>
1677 </td></tr>
1675 <tr><td>
1678 <tr><td>
1676 <a href="/help/update">
1679 <a href="/help/update">
1677 update
1680 update
1678 </a>
1681 </a>
1679 </td><td>
1682 </td><td>
1680 update working directory (or switch revisions)
1683 update working directory (or switch revisions)
1681 </td></tr>
1684 </td></tr>
1682
1685
1683 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
1686 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
1684
1687
1685 <tr><td>
1688 <tr><td>
1686 <a href="/help/addremove">
1689 <a href="/help/addremove">
1687 addremove
1690 addremove
1688 </a>
1691 </a>
1689 </td><td>
1692 </td><td>
1690 add all new files, delete all missing files
1693 add all new files, delete all missing files
1691 </td></tr>
1694 </td></tr>
1692 <tr><td>
1695 <tr><td>
1693 <a href="/help/archive">
1696 <a href="/help/archive">
1694 archive
1697 archive
1695 </a>
1698 </a>
1696 </td><td>
1699 </td><td>
1697 create an unversioned archive of a repository revision
1700 create an unversioned archive of a repository revision
1698 </td></tr>
1701 </td></tr>
1699 <tr><td>
1702 <tr><td>
1700 <a href="/help/backout">
1703 <a href="/help/backout">
1701 backout
1704 backout
1702 </a>
1705 </a>
1703 </td><td>
1706 </td><td>
1704 reverse effect of earlier changeset
1707 reverse effect of earlier changeset
1705 </td></tr>
1708 </td></tr>
1706 <tr><td>
1709 <tr><td>
1707 <a href="/help/bisect">
1710 <a href="/help/bisect">
1708 bisect
1711 bisect
1709 </a>
1712 </a>
1710 </td><td>
1713 </td><td>
1711 subdivision search of changesets
1714 subdivision search of changesets
1712 </td></tr>
1715 </td></tr>
1713 <tr><td>
1716 <tr><td>
1714 <a href="/help/bookmarks">
1717 <a href="/help/bookmarks">
1715 bookmarks
1718 bookmarks
1716 </a>
1719 </a>
1717 </td><td>
1720 </td><td>
1718 create a new bookmark or list existing bookmarks
1721 create a new bookmark or list existing bookmarks
1719 </td></tr>
1722 </td></tr>
1720 <tr><td>
1723 <tr><td>
1721 <a href="/help/branch">
1724 <a href="/help/branch">
1722 branch
1725 branch
1723 </a>
1726 </a>
1724 </td><td>
1727 </td><td>
1725 set or show the current branch name
1728 set or show the current branch name
1726 </td></tr>
1729 </td></tr>
1727 <tr><td>
1730 <tr><td>
1728 <a href="/help/branches">
1731 <a href="/help/branches">
1729 branches
1732 branches
1730 </a>
1733 </a>
1731 </td><td>
1734 </td><td>
1732 list repository named branches
1735 list repository named branches
1733 </td></tr>
1736 </td></tr>
1734 <tr><td>
1737 <tr><td>
1735 <a href="/help/bundle">
1738 <a href="/help/bundle">
1736 bundle
1739 bundle
1737 </a>
1740 </a>
1738 </td><td>
1741 </td><td>
1739 create a changegroup file
1742 create a changegroup file
1740 </td></tr>
1743 </td></tr>
1741 <tr><td>
1744 <tr><td>
1742 <a href="/help/cat">
1745 <a href="/help/cat">
1743 cat
1746 cat
1744 </a>
1747 </a>
1745 </td><td>
1748 </td><td>
1746 output the current or given revision of files
1749 output the current or given revision of files
1747 </td></tr>
1750 </td></tr>
1748 <tr><td>
1751 <tr><td>
1749 <a href="/help/config">
1752 <a href="/help/config">
1750 config
1753 config
1751 </a>
1754 </a>
1752 </td><td>
1755 </td><td>
1753 show combined config settings from all hgrc files
1756 show combined config settings from all hgrc files
1754 </td></tr>
1757 </td></tr>
1755 <tr><td>
1758 <tr><td>
1756 <a href="/help/copy">
1759 <a href="/help/copy">
1757 copy
1760 copy
1758 </a>
1761 </a>
1759 </td><td>
1762 </td><td>
1760 mark files as copied for the next commit
1763 mark files as copied for the next commit
1761 </td></tr>
1764 </td></tr>
1762 <tr><td>
1765 <tr><td>
1763 <a href="/help/files">
1766 <a href="/help/files">
1764 files
1767 files
1765 </a>
1768 </a>
1766 </td><td>
1769 </td><td>
1767 list tracked files
1770 list tracked files
1768 </td></tr>
1771 </td></tr>
1769 <tr><td>
1772 <tr><td>
1770 <a href="/help/graft">
1773 <a href="/help/graft">
1771 graft
1774 graft
1772 </a>
1775 </a>
1773 </td><td>
1776 </td><td>
1774 copy changes from other branches onto the current branch
1777 copy changes from other branches onto the current branch
1775 </td></tr>
1778 </td></tr>
1776 <tr><td>
1779 <tr><td>
1777 <a href="/help/grep">
1780 <a href="/help/grep">
1778 grep
1781 grep
1779 </a>
1782 </a>
1780 </td><td>
1783 </td><td>
1781 search for a pattern in specified files and revisions
1784 search for a pattern in specified files and revisions
1782 </td></tr>
1785 </td></tr>
1783 <tr><td>
1786 <tr><td>
1784 <a href="/help/heads">
1787 <a href="/help/heads">
1785 heads
1788 heads
1786 </a>
1789 </a>
1787 </td><td>
1790 </td><td>
1788 show branch heads
1791 show branch heads
1789 </td></tr>
1792 </td></tr>
1790 <tr><td>
1793 <tr><td>
1791 <a href="/help/help">
1794 <a href="/help/help">
1792 help
1795 help
1793 </a>
1796 </a>
1794 </td><td>
1797 </td><td>
1795 show help for a given topic or a help overview
1798 show help for a given topic or a help overview
1796 </td></tr>
1799 </td></tr>
1797 <tr><td>
1800 <tr><td>
1798 <a href="/help/identify">
1801 <a href="/help/identify">
1799 identify
1802 identify
1800 </a>
1803 </a>
1801 </td><td>
1804 </td><td>
1802 identify the working directory or specified revision
1805 identify the working directory or specified revision
1803 </td></tr>
1806 </td></tr>
1804 <tr><td>
1807 <tr><td>
1805 <a href="/help/import">
1808 <a href="/help/import">
1806 import
1809 import
1807 </a>
1810 </a>
1808 </td><td>
1811 </td><td>
1809 import an ordered set of patches
1812 import an ordered set of patches
1810 </td></tr>
1813 </td></tr>
1811 <tr><td>
1814 <tr><td>
1812 <a href="/help/incoming">
1815 <a href="/help/incoming">
1813 incoming
1816 incoming
1814 </a>
1817 </a>
1815 </td><td>
1818 </td><td>
1816 show new changesets found in source
1819 show new changesets found in source
1817 </td></tr>
1820 </td></tr>
1818 <tr><td>
1821 <tr><td>
1819 <a href="/help/manifest">
1822 <a href="/help/manifest">
1820 manifest
1823 manifest
1821 </a>
1824 </a>
1822 </td><td>
1825 </td><td>
1823 output the current or given revision of the project manifest
1826 output the current or given revision of the project manifest
1824 </td></tr>
1827 </td></tr>
1825 <tr><td>
1828 <tr><td>
1826 <a href="/help/nohelp">
1829 <a href="/help/nohelp">
1827 nohelp
1830 nohelp
1828 </a>
1831 </a>
1829 </td><td>
1832 </td><td>
1830 (no help text available)
1833 (no help text available)
1831 </td></tr>
1834 </td></tr>
1832 <tr><td>
1835 <tr><td>
1833 <a href="/help/outgoing">
1836 <a href="/help/outgoing">
1834 outgoing
1837 outgoing
1835 </a>
1838 </a>
1836 </td><td>
1839 </td><td>
1837 show changesets not found in the destination
1840 show changesets not found in the destination
1838 </td></tr>
1841 </td></tr>
1839 <tr><td>
1842 <tr><td>
1840 <a href="/help/paths">
1843 <a href="/help/paths">
1841 paths
1844 paths
1842 </a>
1845 </a>
1843 </td><td>
1846 </td><td>
1844 show aliases for remote repositories
1847 show aliases for remote repositories
1845 </td></tr>
1848 </td></tr>
1846 <tr><td>
1849 <tr><td>
1847 <a href="/help/phase">
1850 <a href="/help/phase">
1848 phase
1851 phase
1849 </a>
1852 </a>
1850 </td><td>
1853 </td><td>
1851 set or show the current phase name
1854 set or show the current phase name
1852 </td></tr>
1855 </td></tr>
1853 <tr><td>
1856 <tr><td>
1854 <a href="/help/recover">
1857 <a href="/help/recover">
1855 recover
1858 recover
1856 </a>
1859 </a>
1857 </td><td>
1860 </td><td>
1858 roll back an interrupted transaction
1861 roll back an interrupted transaction
1859 </td></tr>
1862 </td></tr>
1860 <tr><td>
1863 <tr><td>
1861 <a href="/help/rename">
1864 <a href="/help/rename">
1862 rename
1865 rename
1863 </a>
1866 </a>
1864 </td><td>
1867 </td><td>
1865 rename files; equivalent of copy + remove
1868 rename files; equivalent of copy + remove
1866 </td></tr>
1869 </td></tr>
1867 <tr><td>
1870 <tr><td>
1868 <a href="/help/resolve">
1871 <a href="/help/resolve">
1869 resolve
1872 resolve
1870 </a>
1873 </a>
1871 </td><td>
1874 </td><td>
1872 redo merges or set/view the merge status of files
1875 redo merges or set/view the merge status of files
1873 </td></tr>
1876 </td></tr>
1874 <tr><td>
1877 <tr><td>
1875 <a href="/help/revert">
1878 <a href="/help/revert">
1876 revert
1879 revert
1877 </a>
1880 </a>
1878 </td><td>
1881 </td><td>
1879 restore files to their checkout state
1882 restore files to their checkout state
1880 </td></tr>
1883 </td></tr>
1881 <tr><td>
1884 <tr><td>
1882 <a href="/help/root">
1885 <a href="/help/root">
1883 root
1886 root
1884 </a>
1887 </a>
1885 </td><td>
1888 </td><td>
1886 print the root (top) of the current working directory
1889 print the root (top) of the current working directory
1887 </td></tr>
1890 </td></tr>
1888 <tr><td>
1891 <tr><td>
1889 <a href="/help/tag">
1892 <a href="/help/tag">
1890 tag
1893 tag
1891 </a>
1894 </a>
1892 </td><td>
1895 </td><td>
1893 add one or more tags for the current or given revision
1896 add one or more tags for the current or given revision
1894 </td></tr>
1897 </td></tr>
1895 <tr><td>
1898 <tr><td>
1896 <a href="/help/tags">
1899 <a href="/help/tags">
1897 tags
1900 tags
1898 </a>
1901 </a>
1899 </td><td>
1902 </td><td>
1900 list repository tags
1903 list repository tags
1901 </td></tr>
1904 </td></tr>
1902 <tr><td>
1905 <tr><td>
1903 <a href="/help/unbundle">
1906 <a href="/help/unbundle">
1904 unbundle
1907 unbundle
1905 </a>
1908 </a>
1906 </td><td>
1909 </td><td>
1907 apply one or more changegroup files
1910 apply one or more changegroup files
1908 </td></tr>
1911 </td></tr>
1909 <tr><td>
1912 <tr><td>
1910 <a href="/help/verify">
1913 <a href="/help/verify">
1911 verify
1914 verify
1912 </a>
1915 </a>
1913 </td><td>
1916 </td><td>
1914 verify the integrity of the repository
1917 verify the integrity of the repository
1915 </td></tr>
1918 </td></tr>
1916 <tr><td>
1919 <tr><td>
1917 <a href="/help/version">
1920 <a href="/help/version">
1918 version
1921 version
1919 </a>
1922 </a>
1920 </td><td>
1923 </td><td>
1921 output version and copyright information
1924 output version and copyright information
1922 </td></tr>
1925 </td></tr>
1923 </table>
1926 </table>
1924 </div>
1927 </div>
1925 </div>
1928 </div>
1926
1929
1927 <script type="text/javascript">process_dates()</script>
1930 <script type="text/javascript">process_dates()</script>
1928
1931
1929
1932
1930 </body>
1933 </body>
1931 </html>
1934 </html>
1932
1935
1933
1936
1934 $ get-with-headers.py 127.0.0.1:$HGPORT "help/add"
1937 $ get-with-headers.py 127.0.0.1:$HGPORT "help/add"
1935 200 Script output follows
1938 200 Script output follows
1936
1939
1937 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1940 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1938 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1941 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1939 <head>
1942 <head>
1940 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1943 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1941 <meta name="robots" content="index, nofollow" />
1944 <meta name="robots" content="index, nofollow" />
1942 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1945 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1943 <script type="text/javascript" src="/static/mercurial.js"></script>
1946 <script type="text/javascript" src="/static/mercurial.js"></script>
1944
1947
1945 <title>Help: add</title>
1948 <title>Help: add</title>
1946 </head>
1949 </head>
1947 <body>
1950 <body>
1948
1951
1949 <div class="container">
1952 <div class="container">
1950 <div class="menu">
1953 <div class="menu">
1951 <div class="logo">
1954 <div class="logo">
1952 <a href="https://mercurial-scm.org/">
1955 <a href="https://mercurial-scm.org/">
1953 <img src="/static/hglogo.png" alt="mercurial" /></a>
1956 <img src="/static/hglogo.png" alt="mercurial" /></a>
1954 </div>
1957 </div>
1955 <ul>
1958 <ul>
1956 <li><a href="/shortlog">log</a></li>
1959 <li><a href="/shortlog">log</a></li>
1957 <li><a href="/graph">graph</a></li>
1960 <li><a href="/graph">graph</a></li>
1958 <li><a href="/tags">tags</a></li>
1961 <li><a href="/tags">tags</a></li>
1959 <li><a href="/bookmarks">bookmarks</a></li>
1962 <li><a href="/bookmarks">bookmarks</a></li>
1960 <li><a href="/branches">branches</a></li>
1963 <li><a href="/branches">branches</a></li>
1961 </ul>
1964 </ul>
1962 <ul>
1965 <ul>
1963 <li class="active"><a href="/help">help</a></li>
1966 <li class="active"><a href="/help">help</a></li>
1964 </ul>
1967 </ul>
1965 </div>
1968 </div>
1966
1969
1967 <div class="main">
1970 <div class="main">
1968 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1971 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1969 <h3>Help: add</h3>
1972 <h3>Help: add</h3>
1970
1973
1971 <form class="search" action="/log">
1974 <form class="search" action="/log">
1972
1975
1973 <p><input name="rev" id="search1" type="text" size="30" /></p>
1976 <p><input name="rev" id="search1" type="text" size="30" /></p>
1974 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
1977 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
1975 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
1978 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
1976 </form>
1979 </form>
1977 <div id="doc">
1980 <div id="doc">
1978 <p>
1981 <p>
1979 hg add [OPTION]... [FILE]...
1982 hg add [OPTION]... [FILE]...
1980 </p>
1983 </p>
1981 <p>
1984 <p>
1982 add the specified files on the next commit
1985 add the specified files on the next commit
1983 </p>
1986 </p>
1984 <p>
1987 <p>
1985 Schedule files to be version controlled and added to the
1988 Schedule files to be version controlled and added to the
1986 repository.
1989 repository.
1987 </p>
1990 </p>
1988 <p>
1991 <p>
1989 The files will be added to the repository at the next commit. To
1992 The files will be added to the repository at the next commit. To
1990 undo an add before that, see &quot;hg forget&quot;.
1993 undo an add before that, see &quot;hg forget&quot;.
1991 </p>
1994 </p>
1992 <p>
1995 <p>
1993 If no names are given, add all files to the repository.
1996 If no names are given, add all files to the repository.
1994 </p>
1997 </p>
1995 <p>
1998 <p>
1996 An example showing how new (unknown) files are added
1999 An example showing how new (unknown) files are added
1997 automatically by &quot;hg add&quot;:
2000 automatically by &quot;hg add&quot;:
1998 </p>
2001 </p>
1999 <pre>
2002 <pre>
2000 \$ ls (re)
2003 \$ ls (re)
2001 foo.c
2004 foo.c
2002 \$ hg status (re)
2005 \$ hg status (re)
2003 ? foo.c
2006 ? foo.c
2004 \$ hg add (re)
2007 \$ hg add (re)
2005 adding foo.c
2008 adding foo.c
2006 \$ hg status (re)
2009 \$ hg status (re)
2007 A foo.c
2010 A foo.c
2008 </pre>
2011 </pre>
2009 <p>
2012 <p>
2010 Returns 0 if all files are successfully added.
2013 Returns 0 if all files are successfully added.
2011 </p>
2014 </p>
2012 <p>
2015 <p>
2013 options ([+] can be repeated):
2016 options ([+] can be repeated):
2014 </p>
2017 </p>
2015 <table>
2018 <table>
2016 <tr><td>-I</td>
2019 <tr><td>-I</td>
2017 <td>--include PATTERN [+]</td>
2020 <td>--include PATTERN [+]</td>
2018 <td>include names matching the given patterns</td></tr>
2021 <td>include names matching the given patterns</td></tr>
2019 <tr><td>-X</td>
2022 <tr><td>-X</td>
2020 <td>--exclude PATTERN [+]</td>
2023 <td>--exclude PATTERN [+]</td>
2021 <td>exclude names matching the given patterns</td></tr>
2024 <td>exclude names matching the given patterns</td></tr>
2022 <tr><td>-S</td>
2025 <tr><td>-S</td>
2023 <td>--subrepos</td>
2026 <td>--subrepos</td>
2024 <td>recurse into subrepositories</td></tr>
2027 <td>recurse into subrepositories</td></tr>
2025 <tr><td>-n</td>
2028 <tr><td>-n</td>
2026 <td>--dry-run</td>
2029 <td>--dry-run</td>
2027 <td>do not perform actions, just print output</td></tr>
2030 <td>do not perform actions, just print output</td></tr>
2028 </table>
2031 </table>
2029 <p>
2032 <p>
2030 global options ([+] can be repeated):
2033 global options ([+] can be repeated):
2031 </p>
2034 </p>
2032 <table>
2035 <table>
2033 <tr><td>-R</td>
2036 <tr><td>-R</td>
2034 <td>--repository REPO</td>
2037 <td>--repository REPO</td>
2035 <td>repository root directory or name of overlay bundle file</td></tr>
2038 <td>repository root directory or name of overlay bundle file</td></tr>
2036 <tr><td></td>
2039 <tr><td></td>
2037 <td>--cwd DIR</td>
2040 <td>--cwd DIR</td>
2038 <td>change working directory</td></tr>
2041 <td>change working directory</td></tr>
2039 <tr><td>-y</td>
2042 <tr><td>-y</td>
2040 <td>--noninteractive</td>
2043 <td>--noninteractive</td>
2041 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2044 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2042 <tr><td>-q</td>
2045 <tr><td>-q</td>
2043 <td>--quiet</td>
2046 <td>--quiet</td>
2044 <td>suppress output</td></tr>
2047 <td>suppress output</td></tr>
2045 <tr><td>-v</td>
2048 <tr><td>-v</td>
2046 <td>--verbose</td>
2049 <td>--verbose</td>
2047 <td>enable additional output</td></tr>
2050 <td>enable additional output</td></tr>
2048 <tr><td></td>
2051 <tr><td></td>
2049 <td>--config CONFIG [+]</td>
2052 <td>--config CONFIG [+]</td>
2050 <td>set/override config option (use 'section.name=value')</td></tr>
2053 <td>set/override config option (use 'section.name=value')</td></tr>
2051 <tr><td></td>
2054 <tr><td></td>
2052 <td>--debug</td>
2055 <td>--debug</td>
2053 <td>enable debugging output</td></tr>
2056 <td>enable debugging output</td></tr>
2054 <tr><td></td>
2057 <tr><td></td>
2055 <td>--debugger</td>
2058 <td>--debugger</td>
2056 <td>start debugger</td></tr>
2059 <td>start debugger</td></tr>
2057 <tr><td></td>
2060 <tr><td></td>
2058 <td>--encoding ENCODE</td>
2061 <td>--encoding ENCODE</td>
2059 <td>set the charset encoding (default: ascii)</td></tr>
2062 <td>set the charset encoding (default: ascii)</td></tr>
2060 <tr><td></td>
2063 <tr><td></td>
2061 <td>--encodingmode MODE</td>
2064 <td>--encodingmode MODE</td>
2062 <td>set the charset encoding mode (default: strict)</td></tr>
2065 <td>set the charset encoding mode (default: strict)</td></tr>
2063 <tr><td></td>
2066 <tr><td></td>
2064 <td>--traceback</td>
2067 <td>--traceback</td>
2065 <td>always print a traceback on exception</td></tr>
2068 <td>always print a traceback on exception</td></tr>
2066 <tr><td></td>
2069 <tr><td></td>
2067 <td>--time</td>
2070 <td>--time</td>
2068 <td>time how long the command takes</td></tr>
2071 <td>time how long the command takes</td></tr>
2069 <tr><td></td>
2072 <tr><td></td>
2070 <td>--profile</td>
2073 <td>--profile</td>
2071 <td>print command execution profile</td></tr>
2074 <td>print command execution profile</td></tr>
2072 <tr><td></td>
2075 <tr><td></td>
2073 <td>--version</td>
2076 <td>--version</td>
2074 <td>output version information and exit</td></tr>
2077 <td>output version information and exit</td></tr>
2075 <tr><td>-h</td>
2078 <tr><td>-h</td>
2076 <td>--help</td>
2079 <td>--help</td>
2077 <td>display help and exit</td></tr>
2080 <td>display help and exit</td></tr>
2078 <tr><td></td>
2081 <tr><td></td>
2079 <td>--hidden</td>
2082 <td>--hidden</td>
2080 <td>consider hidden changesets</td></tr>
2083 <td>consider hidden changesets</td></tr>
2081 </table>
2084 </table>
2082
2085
2083 </div>
2086 </div>
2084 </div>
2087 </div>
2085 </div>
2088 </div>
2086
2089
2087 <script type="text/javascript">process_dates()</script>
2090 <script type="text/javascript">process_dates()</script>
2088
2091
2089
2092
2090 </body>
2093 </body>
2091 </html>
2094 </html>
2092
2095
2093
2096
2094 $ get-with-headers.py 127.0.0.1:$HGPORT "help/remove"
2097 $ get-with-headers.py 127.0.0.1:$HGPORT "help/remove"
2095 200 Script output follows
2098 200 Script output follows
2096
2099
2097 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2100 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2098 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2101 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2099 <head>
2102 <head>
2100 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2103 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2101 <meta name="robots" content="index, nofollow" />
2104 <meta name="robots" content="index, nofollow" />
2102 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2105 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2103 <script type="text/javascript" src="/static/mercurial.js"></script>
2106 <script type="text/javascript" src="/static/mercurial.js"></script>
2104
2107
2105 <title>Help: remove</title>
2108 <title>Help: remove</title>
2106 </head>
2109 </head>
2107 <body>
2110 <body>
2108
2111
2109 <div class="container">
2112 <div class="container">
2110 <div class="menu">
2113 <div class="menu">
2111 <div class="logo">
2114 <div class="logo">
2112 <a href="https://mercurial-scm.org/">
2115 <a href="https://mercurial-scm.org/">
2113 <img src="/static/hglogo.png" alt="mercurial" /></a>
2116 <img src="/static/hglogo.png" alt="mercurial" /></a>
2114 </div>
2117 </div>
2115 <ul>
2118 <ul>
2116 <li><a href="/shortlog">log</a></li>
2119 <li><a href="/shortlog">log</a></li>
2117 <li><a href="/graph">graph</a></li>
2120 <li><a href="/graph">graph</a></li>
2118 <li><a href="/tags">tags</a></li>
2121 <li><a href="/tags">tags</a></li>
2119 <li><a href="/bookmarks">bookmarks</a></li>
2122 <li><a href="/bookmarks">bookmarks</a></li>
2120 <li><a href="/branches">branches</a></li>
2123 <li><a href="/branches">branches</a></li>
2121 </ul>
2124 </ul>
2122 <ul>
2125 <ul>
2123 <li class="active"><a href="/help">help</a></li>
2126 <li class="active"><a href="/help">help</a></li>
2124 </ul>
2127 </ul>
2125 </div>
2128 </div>
2126
2129
2127 <div class="main">
2130 <div class="main">
2128 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2131 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2129 <h3>Help: remove</h3>
2132 <h3>Help: remove</h3>
2130
2133
2131 <form class="search" action="/log">
2134 <form class="search" action="/log">
2132
2135
2133 <p><input name="rev" id="search1" type="text" size="30" /></p>
2136 <p><input name="rev" id="search1" type="text" size="30" /></p>
2134 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2137 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2135 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2138 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2136 </form>
2139 </form>
2137 <div id="doc">
2140 <div id="doc">
2138 <p>
2141 <p>
2139 hg remove [OPTION]... FILE...
2142 hg remove [OPTION]... FILE...
2140 </p>
2143 </p>
2141 <p>
2144 <p>
2142 aliases: rm
2145 aliases: rm
2143 </p>
2146 </p>
2144 <p>
2147 <p>
2145 remove the specified files on the next commit
2148 remove the specified files on the next commit
2146 </p>
2149 </p>
2147 <p>
2150 <p>
2148 Schedule the indicated files for removal from the current branch.
2151 Schedule the indicated files for removal from the current branch.
2149 </p>
2152 </p>
2150 <p>
2153 <p>
2151 This command schedules the files to be removed at the next commit.
2154 This command schedules the files to be removed at the next commit.
2152 To undo a remove before that, see &quot;hg revert&quot;. To undo added
2155 To undo a remove before that, see &quot;hg revert&quot;. To undo added
2153 files, see &quot;hg forget&quot;.
2156 files, see &quot;hg forget&quot;.
2154 </p>
2157 </p>
2155 <p>
2158 <p>
2156 -A/--after can be used to remove only files that have already
2159 -A/--after can be used to remove only files that have already
2157 been deleted, -f/--force can be used to force deletion, and -Af
2160 been deleted, -f/--force can be used to force deletion, and -Af
2158 can be used to remove files from the next revision without
2161 can be used to remove files from the next revision without
2159 deleting them from the working directory.
2162 deleting them from the working directory.
2160 </p>
2163 </p>
2161 <p>
2164 <p>
2162 The following table details the behavior of remove for different
2165 The following table details the behavior of remove for different
2163 file states (columns) and option combinations (rows). The file
2166 file states (columns) and option combinations (rows). The file
2164 states are Added [A], Clean [C], Modified [M] and Missing [!]
2167 states are Added [A], Clean [C], Modified [M] and Missing [!]
2165 (as reported by &quot;hg status&quot;). The actions are Warn, Remove
2168 (as reported by &quot;hg status&quot;). The actions are Warn, Remove
2166 (from branch) and Delete (from disk):
2169 (from branch) and Delete (from disk):
2167 </p>
2170 </p>
2168 <table>
2171 <table>
2169 <tr><td>opt/state</td>
2172 <tr><td>opt/state</td>
2170 <td>A</td>
2173 <td>A</td>
2171 <td>C</td>
2174 <td>C</td>
2172 <td>M</td>
2175 <td>M</td>
2173 <td>!</td></tr>
2176 <td>!</td></tr>
2174 <tr><td>none</td>
2177 <tr><td>none</td>
2175 <td>W</td>
2178 <td>W</td>
2176 <td>RD</td>
2179 <td>RD</td>
2177 <td>W</td>
2180 <td>W</td>
2178 <td>R</td></tr>
2181 <td>R</td></tr>
2179 <tr><td>-f</td>
2182 <tr><td>-f</td>
2180 <td>R</td>
2183 <td>R</td>
2181 <td>RD</td>
2184 <td>RD</td>
2182 <td>RD</td>
2185 <td>RD</td>
2183 <td>R</td></tr>
2186 <td>R</td></tr>
2184 <tr><td>-A</td>
2187 <tr><td>-A</td>
2185 <td>W</td>
2188 <td>W</td>
2186 <td>W</td>
2189 <td>W</td>
2187 <td>W</td>
2190 <td>W</td>
2188 <td>R</td></tr>
2191 <td>R</td></tr>
2189 <tr><td>-Af</td>
2192 <tr><td>-Af</td>
2190 <td>R</td>
2193 <td>R</td>
2191 <td>R</td>
2194 <td>R</td>
2192 <td>R</td>
2195 <td>R</td>
2193 <td>R</td></tr>
2196 <td>R</td></tr>
2194 </table>
2197 </table>
2195 <p>
2198 <p>
2196 Note that remove never deletes files in Added [A] state from the
2199 Note that remove never deletes files in Added [A] state from the
2197 working directory, not even if option --force is specified.
2200 working directory, not even if option --force is specified.
2198 </p>
2201 </p>
2199 <p>
2202 <p>
2200 Returns 0 on success, 1 if any warnings encountered.
2203 Returns 0 on success, 1 if any warnings encountered.
2201 </p>
2204 </p>
2202 <p>
2205 <p>
2203 options ([+] can be repeated):
2206 options ([+] can be repeated):
2204 </p>
2207 </p>
2205 <table>
2208 <table>
2206 <tr><td>-A</td>
2209 <tr><td>-A</td>
2207 <td>--after</td>
2210 <td>--after</td>
2208 <td>record delete for missing files</td></tr>
2211 <td>record delete for missing files</td></tr>
2209 <tr><td>-f</td>
2212 <tr><td>-f</td>
2210 <td>--force</td>
2213 <td>--force</td>
2211 <td>remove (and delete) file even if added or modified</td></tr>
2214 <td>remove (and delete) file even if added or modified</td></tr>
2212 <tr><td>-S</td>
2215 <tr><td>-S</td>
2213 <td>--subrepos</td>
2216 <td>--subrepos</td>
2214 <td>recurse into subrepositories</td></tr>
2217 <td>recurse into subrepositories</td></tr>
2215 <tr><td>-I</td>
2218 <tr><td>-I</td>
2216 <td>--include PATTERN [+]</td>
2219 <td>--include PATTERN [+]</td>
2217 <td>include names matching the given patterns</td></tr>
2220 <td>include names matching the given patterns</td></tr>
2218 <tr><td>-X</td>
2221 <tr><td>-X</td>
2219 <td>--exclude PATTERN [+]</td>
2222 <td>--exclude PATTERN [+]</td>
2220 <td>exclude names matching the given patterns</td></tr>
2223 <td>exclude names matching the given patterns</td></tr>
2221 </table>
2224 </table>
2222 <p>
2225 <p>
2223 global options ([+] can be repeated):
2226 global options ([+] can be repeated):
2224 </p>
2227 </p>
2225 <table>
2228 <table>
2226 <tr><td>-R</td>
2229 <tr><td>-R</td>
2227 <td>--repository REPO</td>
2230 <td>--repository REPO</td>
2228 <td>repository root directory or name of overlay bundle file</td></tr>
2231 <td>repository root directory or name of overlay bundle file</td></tr>
2229 <tr><td></td>
2232 <tr><td></td>
2230 <td>--cwd DIR</td>
2233 <td>--cwd DIR</td>
2231 <td>change working directory</td></tr>
2234 <td>change working directory</td></tr>
2232 <tr><td>-y</td>
2235 <tr><td>-y</td>
2233 <td>--noninteractive</td>
2236 <td>--noninteractive</td>
2234 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2237 <td>do not prompt, automatically pick the first choice for all prompts</td></tr>
2235 <tr><td>-q</td>
2238 <tr><td>-q</td>
2236 <td>--quiet</td>
2239 <td>--quiet</td>
2237 <td>suppress output</td></tr>
2240 <td>suppress output</td></tr>
2238 <tr><td>-v</td>
2241 <tr><td>-v</td>
2239 <td>--verbose</td>
2242 <td>--verbose</td>
2240 <td>enable additional output</td></tr>
2243 <td>enable additional output</td></tr>
2241 <tr><td></td>
2244 <tr><td></td>
2242 <td>--config CONFIG [+]</td>
2245 <td>--config CONFIG [+]</td>
2243 <td>set/override config option (use 'section.name=value')</td></tr>
2246 <td>set/override config option (use 'section.name=value')</td></tr>
2244 <tr><td></td>
2247 <tr><td></td>
2245 <td>--debug</td>
2248 <td>--debug</td>
2246 <td>enable debugging output</td></tr>
2249 <td>enable debugging output</td></tr>
2247 <tr><td></td>
2250 <tr><td></td>
2248 <td>--debugger</td>
2251 <td>--debugger</td>
2249 <td>start debugger</td></tr>
2252 <td>start debugger</td></tr>
2250 <tr><td></td>
2253 <tr><td></td>
2251 <td>--encoding ENCODE</td>
2254 <td>--encoding ENCODE</td>
2252 <td>set the charset encoding (default: ascii)</td></tr>
2255 <td>set the charset encoding (default: ascii)</td></tr>
2253 <tr><td></td>
2256 <tr><td></td>
2254 <td>--encodingmode MODE</td>
2257 <td>--encodingmode MODE</td>
2255 <td>set the charset encoding mode (default: strict)</td></tr>
2258 <td>set the charset encoding mode (default: strict)</td></tr>
2256 <tr><td></td>
2259 <tr><td></td>
2257 <td>--traceback</td>
2260 <td>--traceback</td>
2258 <td>always print a traceback on exception</td></tr>
2261 <td>always print a traceback on exception</td></tr>
2259 <tr><td></td>
2262 <tr><td></td>
2260 <td>--time</td>
2263 <td>--time</td>
2261 <td>time how long the command takes</td></tr>
2264 <td>time how long the command takes</td></tr>
2262 <tr><td></td>
2265 <tr><td></td>
2263 <td>--profile</td>
2266 <td>--profile</td>
2264 <td>print command execution profile</td></tr>
2267 <td>print command execution profile</td></tr>
2265 <tr><td></td>
2268 <tr><td></td>
2266 <td>--version</td>
2269 <td>--version</td>
2267 <td>output version information and exit</td></tr>
2270 <td>output version information and exit</td></tr>
2268 <tr><td>-h</td>
2271 <tr><td>-h</td>
2269 <td>--help</td>
2272 <td>--help</td>
2270 <td>display help and exit</td></tr>
2273 <td>display help and exit</td></tr>
2271 <tr><td></td>
2274 <tr><td></td>
2272 <td>--hidden</td>
2275 <td>--hidden</td>
2273 <td>consider hidden changesets</td></tr>
2276 <td>consider hidden changesets</td></tr>
2274 </table>
2277 </table>
2275
2278
2276 </div>
2279 </div>
2277 </div>
2280 </div>
2278 </div>
2281 </div>
2279
2282
2280 <script type="text/javascript">process_dates()</script>
2283 <script type="text/javascript">process_dates()</script>
2281
2284
2282
2285
2283 </body>
2286 </body>
2284 </html>
2287 </html>
2285
2288
2286
2289
2287 $ get-with-headers.py 127.0.0.1:$HGPORT "help/revisions"
2290 $ get-with-headers.py 127.0.0.1:$HGPORT "help/revisions"
2288 200 Script output follows
2291 200 Script output follows
2289
2292
2290 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2293 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2291 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2294 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
2292 <head>
2295 <head>
2293 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2296 <link rel="icon" href="/static/hgicon.png" type="image/png" />
2294 <meta name="robots" content="index, nofollow" />
2297 <meta name="robots" content="index, nofollow" />
2295 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2298 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
2296 <script type="text/javascript" src="/static/mercurial.js"></script>
2299 <script type="text/javascript" src="/static/mercurial.js"></script>
2297
2300
2298 <title>Help: revisions</title>
2301 <title>Help: revisions</title>
2299 </head>
2302 </head>
2300 <body>
2303 <body>
2301
2304
2302 <div class="container">
2305 <div class="container">
2303 <div class="menu">
2306 <div class="menu">
2304 <div class="logo">
2307 <div class="logo">
2305 <a href="https://mercurial-scm.org/">
2308 <a href="https://mercurial-scm.org/">
2306 <img src="/static/hglogo.png" alt="mercurial" /></a>
2309 <img src="/static/hglogo.png" alt="mercurial" /></a>
2307 </div>
2310 </div>
2308 <ul>
2311 <ul>
2309 <li><a href="/shortlog">log</a></li>
2312 <li><a href="/shortlog">log</a></li>
2310 <li><a href="/graph">graph</a></li>
2313 <li><a href="/graph">graph</a></li>
2311 <li><a href="/tags">tags</a></li>
2314 <li><a href="/tags">tags</a></li>
2312 <li><a href="/bookmarks">bookmarks</a></li>
2315 <li><a href="/bookmarks">bookmarks</a></li>
2313 <li><a href="/branches">branches</a></li>
2316 <li><a href="/branches">branches</a></li>
2314 </ul>
2317 </ul>
2315 <ul>
2318 <ul>
2316 <li class="active"><a href="/help">help</a></li>
2319 <li class="active"><a href="/help">help</a></li>
2317 </ul>
2320 </ul>
2318 </div>
2321 </div>
2319
2322
2320 <div class="main">
2323 <div class="main">
2321 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2324 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
2322 <h3>Help: revisions</h3>
2325 <h3>Help: revisions</h3>
2323
2326
2324 <form class="search" action="/log">
2327 <form class="search" action="/log">
2325
2328
2326 <p><input name="rev" id="search1" type="text" size="30" /></p>
2329 <p><input name="rev" id="search1" type="text" size="30" /></p>
2327 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2330 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
2328 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2331 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
2329 </form>
2332 </form>
2330 <div id="doc">
2333 <div id="doc">
2331 <h1>Specifying Single Revisions</h1>
2334 <h1>Specifying Single Revisions</h1>
2332 <p>
2335 <p>
2333 Mercurial supports several ways to specify individual revisions.
2336 Mercurial supports several ways to specify individual revisions.
2334 </p>
2337 </p>
2335 <p>
2338 <p>
2336 A plain integer is treated as a revision number. Negative integers are
2339 A plain integer is treated as a revision number. Negative integers are
2337 treated as sequential offsets from the tip, with -1 denoting the tip,
2340 treated as sequential offsets from the tip, with -1 denoting the tip,
2338 -2 denoting the revision prior to the tip, and so forth.
2341 -2 denoting the revision prior to the tip, and so forth.
2339 </p>
2342 </p>
2340 <p>
2343 <p>
2341 A 40-digit hexadecimal string is treated as a unique revision
2344 A 40-digit hexadecimal string is treated as a unique revision
2342 identifier.
2345 identifier.
2343 </p>
2346 </p>
2344 <p>
2347 <p>
2345 A hexadecimal string less than 40 characters long is treated as a
2348 A hexadecimal string less than 40 characters long is treated as a
2346 unique revision identifier and is referred to as a short-form
2349 unique revision identifier and is referred to as a short-form
2347 identifier. A short-form identifier is only valid if it is the prefix
2350 identifier. A short-form identifier is only valid if it is the prefix
2348 of exactly one full-length identifier.
2351 of exactly one full-length identifier.
2349 </p>
2352 </p>
2350 <p>
2353 <p>
2351 Any other string is treated as a bookmark, tag, or branch name. A
2354 Any other string is treated as a bookmark, tag, or branch name. A
2352 bookmark is a movable pointer to a revision. A tag is a permanent name
2355 bookmark is a movable pointer to a revision. A tag is a permanent name
2353 associated with a revision. A branch name denotes the tipmost open branch head
2356 associated with a revision. A branch name denotes the tipmost open branch head
2354 of that branch - or if they are all closed, the tipmost closed head of the
2357 of that branch - or if they are all closed, the tipmost closed head of the
2355 branch. Bookmark, tag, and branch names must not contain the &quot;:&quot; character.
2358 branch. Bookmark, tag, and branch names must not contain the &quot;:&quot; character.
2356 </p>
2359 </p>
2357 <p>
2360 <p>
2358 The reserved name &quot;tip&quot; always identifies the most recent revision.
2361 The reserved name &quot;tip&quot; always identifies the most recent revision.
2359 </p>
2362 </p>
2360 <p>
2363 <p>
2361 The reserved name &quot;null&quot; indicates the null revision. This is the
2364 The reserved name &quot;null&quot; indicates the null revision. This is the
2362 revision of an empty repository, and the parent of revision 0.
2365 revision of an empty repository, and the parent of revision 0.
2363 </p>
2366 </p>
2364 <p>
2367 <p>
2365 The reserved name &quot;.&quot; indicates the working directory parent. If no
2368 The reserved name &quot;.&quot; indicates the working directory parent. If no
2366 working directory is checked out, it is equivalent to null. If an
2369 working directory is checked out, it is equivalent to null. If an
2367 uncommitted merge is in progress, &quot;.&quot; is the revision of the first
2370 uncommitted merge is in progress, &quot;.&quot; is the revision of the first
2368 parent.
2371 parent.
2369 </p>
2372 </p>
2370
2373
2371 </div>
2374 </div>
2372 </div>
2375 </div>
2373 </div>
2376 </div>
2374
2377
2375 <script type="text/javascript">process_dates()</script>
2378 <script type="text/javascript">process_dates()</script>
2376
2379
2377
2380
2378 </body>
2381 </body>
2379 </html>
2382 </html>
2380
2383
2381
2384
2382 $ killdaemons.py
2385 $ killdaemons.py
2383
2386
2384 #endif
2387 #endif
General Comments 0
You need to be logged in to leave comments. Login now