##// END OF EJS Templates
log: make -fr show complete history from the given revs...
Durham Goode -
r24189:8b4b9ee6 default
parent child Browse files
Show More
@@ -1,6329 +1,6333 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, commandserver
16 import sshserver, hgweb, commandserver
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
22 import random
23 import setdiscovery, treediscovery, dagutil, pvec, localrepo
23 import setdiscovery, treediscovery, dagutil, pvec, localrepo
24 import phases, obsolete, exchange, bundle2
24 import phases, obsolete, exchange, bundle2
25 import ui as uimod
25 import ui as uimod
26
26
27 table = {}
27 table = {}
28
28
29 command = cmdutil.command(table)
29 command = cmdutil.command(table)
30
30
31 # Space delimited list of commands that don't require local repositories.
31 # Space delimited list of commands that don't require local repositories.
32 # This should be populated by passing norepo=True into the @command decorator.
32 # This should be populated by passing norepo=True into the @command decorator.
33 norepo = ''
33 norepo = ''
34 # Space delimited list of commands that optionally require local repositories.
34 # Space delimited list of commands that optionally require local repositories.
35 # This should be populated by passing optionalrepo=True into the @command
35 # This should be populated by passing optionalrepo=True into the @command
36 # decorator.
36 # decorator.
37 optionalrepo = ''
37 optionalrepo = ''
38 # Space delimited list of commands that will examine arguments looking for
38 # Space delimited list of commands that will examine arguments looking for
39 # a repository. This should be populated by passing inferrepo=True into the
39 # a repository. This should be populated by passing inferrepo=True into the
40 # @command decorator.
40 # @command decorator.
41 inferrepo = ''
41 inferrepo = ''
42
42
43 # common command options
43 # common command options
44
44
45 globalopts = [
45 globalopts = [
46 ('R', 'repository', '',
46 ('R', 'repository', '',
47 _('repository root directory or name of overlay bundle file'),
47 _('repository root directory or name of overlay bundle file'),
48 _('REPO')),
48 _('REPO')),
49 ('', 'cwd', '',
49 ('', 'cwd', '',
50 _('change working directory'), _('DIR')),
50 _('change working directory'), _('DIR')),
51 ('y', 'noninteractive', None,
51 ('y', 'noninteractive', None,
52 _('do not prompt, automatically pick the first choice for all prompts')),
52 _('do not prompt, automatically pick the first choice for all prompts')),
53 ('q', 'quiet', None, _('suppress output')),
53 ('q', 'quiet', None, _('suppress output')),
54 ('v', 'verbose', None, _('enable additional output')),
54 ('v', 'verbose', None, _('enable additional output')),
55 ('', 'config', [],
55 ('', 'config', [],
56 _('set/override config option (use \'section.name=value\')'),
56 _('set/override config option (use \'section.name=value\')'),
57 _('CONFIG')),
57 _('CONFIG')),
58 ('', 'debug', None, _('enable debugging output')),
58 ('', 'debug', None, _('enable debugging output')),
59 ('', 'debugger', None, _('start debugger')),
59 ('', 'debugger', None, _('start debugger')),
60 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
60 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
61 _('ENCODE')),
61 _('ENCODE')),
62 ('', 'encodingmode', encoding.encodingmode,
62 ('', 'encodingmode', encoding.encodingmode,
63 _('set the charset encoding mode'), _('MODE')),
63 _('set the charset encoding mode'), _('MODE')),
64 ('', 'traceback', None, _('always print a traceback on exception')),
64 ('', 'traceback', None, _('always print a traceback on exception')),
65 ('', 'time', None, _('time how long the command takes')),
65 ('', 'time', None, _('time how long the command takes')),
66 ('', 'profile', None, _('print command execution profile')),
66 ('', 'profile', None, _('print command execution profile')),
67 ('', 'version', None, _('output version information and exit')),
67 ('', 'version', None, _('output version information and exit')),
68 ('h', 'help', None, _('display help and exit')),
68 ('h', 'help', None, _('display help and exit')),
69 ('', 'hidden', False, _('consider hidden changesets')),
69 ('', 'hidden', False, _('consider hidden changesets')),
70 ]
70 ]
71
71
72 dryrunopts = [('n', 'dry-run', None,
72 dryrunopts = [('n', 'dry-run', None,
73 _('do not perform actions, just print output'))]
73 _('do not perform actions, just print output'))]
74
74
75 remoteopts = [
75 remoteopts = [
76 ('e', 'ssh', '',
76 ('e', 'ssh', '',
77 _('specify ssh command to use'), _('CMD')),
77 _('specify ssh command to use'), _('CMD')),
78 ('', 'remotecmd', '',
78 ('', 'remotecmd', '',
79 _('specify hg command to run on the remote side'), _('CMD')),
79 _('specify hg command to run on the remote side'), _('CMD')),
80 ('', 'insecure', None,
80 ('', 'insecure', None,
81 _('do not verify server certificate (ignoring web.cacerts config)')),
81 _('do not verify server certificate (ignoring web.cacerts config)')),
82 ]
82 ]
83
83
84 walkopts = [
84 walkopts = [
85 ('I', 'include', [],
85 ('I', 'include', [],
86 _('include names matching the given patterns'), _('PATTERN')),
86 _('include names matching the given patterns'), _('PATTERN')),
87 ('X', 'exclude', [],
87 ('X', 'exclude', [],
88 _('exclude names matching the given patterns'), _('PATTERN')),
88 _('exclude names matching the given patterns'), _('PATTERN')),
89 ]
89 ]
90
90
91 commitopts = [
91 commitopts = [
92 ('m', 'message', '',
92 ('m', 'message', '',
93 _('use text as commit message'), _('TEXT')),
93 _('use text as commit message'), _('TEXT')),
94 ('l', 'logfile', '',
94 ('l', 'logfile', '',
95 _('read commit message from file'), _('FILE')),
95 _('read commit message from file'), _('FILE')),
96 ]
96 ]
97
97
98 commitopts2 = [
98 commitopts2 = [
99 ('d', 'date', '',
99 ('d', 'date', '',
100 _('record the specified date as commit date'), _('DATE')),
100 _('record the specified date as commit date'), _('DATE')),
101 ('u', 'user', '',
101 ('u', 'user', '',
102 _('record the specified user as committer'), _('USER')),
102 _('record the specified user as committer'), _('USER')),
103 ]
103 ]
104
104
105 # hidden for now
105 # hidden for now
106 formatteropts = [
106 formatteropts = [
107 ('T', 'template', '',
107 ('T', 'template', '',
108 _('display with template (DEPRECATED)'), _('TEMPLATE')),
108 _('display with template (DEPRECATED)'), _('TEMPLATE')),
109 ]
109 ]
110
110
111 templateopts = [
111 templateopts = [
112 ('', 'style', '',
112 ('', 'style', '',
113 _('display using template map file (DEPRECATED)'), _('STYLE')),
113 _('display using template map file (DEPRECATED)'), _('STYLE')),
114 ('T', 'template', '',
114 ('T', 'template', '',
115 _('display with template'), _('TEMPLATE')),
115 _('display with template'), _('TEMPLATE')),
116 ]
116 ]
117
117
118 logopts = [
118 logopts = [
119 ('p', 'patch', None, _('show patch')),
119 ('p', 'patch', None, _('show patch')),
120 ('g', 'git', None, _('use git extended diff format')),
120 ('g', 'git', None, _('use git extended diff format')),
121 ('l', 'limit', '',
121 ('l', 'limit', '',
122 _('limit number of changes displayed'), _('NUM')),
122 _('limit number of changes displayed'), _('NUM')),
123 ('M', 'no-merges', None, _('do not show merges')),
123 ('M', 'no-merges', None, _('do not show merges')),
124 ('', 'stat', None, _('output diffstat-style summary of changes')),
124 ('', 'stat', None, _('output diffstat-style summary of changes')),
125 ('G', 'graph', None, _("show the revision DAG")),
125 ('G', 'graph', None, _("show the revision DAG")),
126 ] + templateopts
126 ] + templateopts
127
127
128 diffopts = [
128 diffopts = [
129 ('a', 'text', None, _('treat all files as text')),
129 ('a', 'text', None, _('treat all files as text')),
130 ('g', 'git', None, _('use git extended diff format')),
130 ('g', 'git', None, _('use git extended diff format')),
131 ('', 'nodates', None, _('omit dates from diff headers'))
131 ('', 'nodates', None, _('omit dates from diff headers'))
132 ]
132 ]
133
133
134 diffwsopts = [
134 diffwsopts = [
135 ('w', 'ignore-all-space', None,
135 ('w', 'ignore-all-space', None,
136 _('ignore white space when comparing lines')),
136 _('ignore white space when comparing lines')),
137 ('b', 'ignore-space-change', None,
137 ('b', 'ignore-space-change', None,
138 _('ignore changes in the amount of white space')),
138 _('ignore changes in the amount of white space')),
139 ('B', 'ignore-blank-lines', None,
139 ('B', 'ignore-blank-lines', None,
140 _('ignore changes whose lines are all blank')),
140 _('ignore changes whose lines are all blank')),
141 ]
141 ]
142
142
143 diffopts2 = [
143 diffopts2 = [
144 ('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
144 ('', 'noprefix', None, _('omit a/ and b/ prefixes from filenames')),
145 ('p', 'show-function', None, _('show which function each change is in')),
145 ('p', 'show-function', None, _('show which function each change is in')),
146 ('', 'reverse', None, _('produce a diff that undoes the changes')),
146 ('', 'reverse', None, _('produce a diff that undoes the changes')),
147 ] + diffwsopts + [
147 ] + diffwsopts + [
148 ('U', 'unified', '',
148 ('U', 'unified', '',
149 _('number of lines of context to show'), _('NUM')),
149 _('number of lines of context to show'), _('NUM')),
150 ('', 'stat', None, _('output diffstat-style summary of changes')),
150 ('', 'stat', None, _('output diffstat-style summary of changes')),
151 ]
151 ]
152
152
153 mergetoolopts = [
153 mergetoolopts = [
154 ('t', 'tool', '', _('specify merge tool')),
154 ('t', 'tool', '', _('specify merge tool')),
155 ]
155 ]
156
156
157 similarityopts = [
157 similarityopts = [
158 ('s', 'similarity', '',
158 ('s', 'similarity', '',
159 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
159 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
160 ]
160 ]
161
161
162 subrepoopts = [
162 subrepoopts = [
163 ('S', 'subrepos', None,
163 ('S', 'subrepos', None,
164 _('recurse into subrepositories'))
164 _('recurse into subrepositories'))
165 ]
165 ]
166
166
167 # Commands start here, listed alphabetically
167 # Commands start here, listed alphabetically
168
168
169 @command('^add',
169 @command('^add',
170 walkopts + subrepoopts + dryrunopts,
170 walkopts + subrepoopts + dryrunopts,
171 _('[OPTION]... [FILE]...'),
171 _('[OPTION]... [FILE]...'),
172 inferrepo=True)
172 inferrepo=True)
173 def add(ui, repo, *pats, **opts):
173 def add(ui, repo, *pats, **opts):
174 """add the specified files on the next commit
174 """add the specified files on the next commit
175
175
176 Schedule files to be version controlled and added to the
176 Schedule files to be version controlled and added to the
177 repository.
177 repository.
178
178
179 The files will be added to the repository at the next commit. To
179 The files will be added to the repository at the next commit. To
180 undo an add before that, see :hg:`forget`.
180 undo an add before that, see :hg:`forget`.
181
181
182 If no names are given, add all files to the repository.
182 If no names are given, add all files to the repository.
183
183
184 .. container:: verbose
184 .. container:: verbose
185
185
186 An example showing how new (unknown) files are added
186 An example showing how new (unknown) files are added
187 automatically by :hg:`add`::
187 automatically by :hg:`add`::
188
188
189 $ ls
189 $ ls
190 foo.c
190 foo.c
191 $ hg status
191 $ hg status
192 ? foo.c
192 ? foo.c
193 $ hg add
193 $ hg add
194 adding foo.c
194 adding foo.c
195 $ hg status
195 $ hg status
196 A foo.c
196 A foo.c
197
197
198 Returns 0 if all files are successfully added.
198 Returns 0 if all files are successfully added.
199 """
199 """
200
200
201 m = scmutil.match(repo[None], pats, opts)
201 m = scmutil.match(repo[None], pats, opts)
202 rejected = cmdutil.add(ui, repo, m, "", False, **opts)
202 rejected = cmdutil.add(ui, repo, m, "", False, **opts)
203 return rejected and 1 or 0
203 return rejected and 1 or 0
204
204
205 @command('addremove',
205 @command('addremove',
206 similarityopts + subrepoopts + walkopts + dryrunopts,
206 similarityopts + subrepoopts + walkopts + dryrunopts,
207 _('[OPTION]... [FILE]...'),
207 _('[OPTION]... [FILE]...'),
208 inferrepo=True)
208 inferrepo=True)
209 def addremove(ui, repo, *pats, **opts):
209 def addremove(ui, repo, *pats, **opts):
210 """add all new files, delete all missing files
210 """add all new files, delete all missing files
211
211
212 Add all new files and remove all missing files from the
212 Add all new files and remove all missing files from the
213 repository.
213 repository.
214
214
215 New files are ignored if they match any of the patterns in
215 New files are ignored if they match any of the patterns in
216 ``.hgignore``. As with add, these changes take effect at the next
216 ``.hgignore``. As with add, these changes take effect at the next
217 commit.
217 commit.
218
218
219 Use the -s/--similarity option to detect renamed files. This
219 Use the -s/--similarity option to detect renamed files. This
220 option takes a percentage between 0 (disabled) and 100 (files must
220 option takes a percentage between 0 (disabled) and 100 (files must
221 be identical) as its parameter. With a parameter greater than 0,
221 be identical) as its parameter. With a parameter greater than 0,
222 this compares every removed file with every added file and records
222 this compares every removed file with every added file and records
223 those similar enough as renames. Detecting renamed files this way
223 those similar enough as renames. Detecting renamed files this way
224 can be expensive. After using this option, :hg:`status -C` can be
224 can be expensive. After using this option, :hg:`status -C` can be
225 used to check which files were identified as moved or renamed. If
225 used to check which files were identified as moved or renamed. If
226 not specified, -s/--similarity defaults to 100 and only renames of
226 not specified, -s/--similarity defaults to 100 and only renames of
227 identical files are detected.
227 identical files are detected.
228
228
229 Returns 0 if all files are successfully added.
229 Returns 0 if all files are successfully added.
230 """
230 """
231 try:
231 try:
232 sim = float(opts.get('similarity') or 100)
232 sim = float(opts.get('similarity') or 100)
233 except ValueError:
233 except ValueError:
234 raise util.Abort(_('similarity must be a number'))
234 raise util.Abort(_('similarity must be a number'))
235 if sim < 0 or sim > 100:
235 if sim < 0 or sim > 100:
236 raise util.Abort(_('similarity must be between 0 and 100'))
236 raise util.Abort(_('similarity must be between 0 and 100'))
237 matcher = scmutil.match(repo[None], pats, opts)
237 matcher = scmutil.match(repo[None], pats, opts)
238 return scmutil.addremove(repo, matcher, "", opts, similarity=sim / 100.0)
238 return scmutil.addremove(repo, matcher, "", opts, similarity=sim / 100.0)
239
239
240 @command('^annotate|blame',
240 @command('^annotate|blame',
241 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
241 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
242 ('', 'follow', None,
242 ('', 'follow', None,
243 _('follow copies/renames and list the filename (DEPRECATED)')),
243 _('follow copies/renames and list the filename (DEPRECATED)')),
244 ('', 'no-follow', None, _("don't follow copies and renames")),
244 ('', 'no-follow', None, _("don't follow copies and renames")),
245 ('a', 'text', None, _('treat all files as text')),
245 ('a', 'text', None, _('treat all files as text')),
246 ('u', 'user', None, _('list the author (long with -v)')),
246 ('u', 'user', None, _('list the author (long with -v)')),
247 ('f', 'file', None, _('list the filename')),
247 ('f', 'file', None, _('list the filename')),
248 ('d', 'date', None, _('list the date (short with -q)')),
248 ('d', 'date', None, _('list the date (short with -q)')),
249 ('n', 'number', None, _('list the revision number (default)')),
249 ('n', 'number', None, _('list the revision number (default)')),
250 ('c', 'changeset', None, _('list the changeset')),
250 ('c', 'changeset', None, _('list the changeset')),
251 ('l', 'line-number', None, _('show line number at the first appearance'))
251 ('l', 'line-number', None, _('show line number at the first appearance'))
252 ] + diffwsopts + walkopts + formatteropts,
252 ] + diffwsopts + walkopts + formatteropts,
253 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
253 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
254 inferrepo=True)
254 inferrepo=True)
255 def annotate(ui, repo, *pats, **opts):
255 def annotate(ui, repo, *pats, **opts):
256 """show changeset information by line for each file
256 """show changeset information by line for each file
257
257
258 List changes in files, showing the revision id responsible for
258 List changes in files, showing the revision id responsible for
259 each line
259 each line
260
260
261 This command is useful for discovering when a change was made and
261 This command is useful for discovering when a change was made and
262 by whom.
262 by whom.
263
263
264 Without the -a/--text option, annotate will avoid processing files
264 Without the -a/--text option, annotate will avoid processing files
265 it detects as binary. With -a, annotate will annotate the file
265 it detects as binary. With -a, annotate will annotate the file
266 anyway, although the results will probably be neither useful
266 anyway, although the results will probably be neither useful
267 nor desirable.
267 nor desirable.
268
268
269 Returns 0 on success.
269 Returns 0 on success.
270 """
270 """
271 if not pats:
271 if not pats:
272 raise util.Abort(_('at least one filename or pattern is required'))
272 raise util.Abort(_('at least one filename or pattern is required'))
273
273
274 if opts.get('follow'):
274 if opts.get('follow'):
275 # --follow is deprecated and now just an alias for -f/--file
275 # --follow is deprecated and now just an alias for -f/--file
276 # to mimic the behavior of Mercurial before version 1.5
276 # to mimic the behavior of Mercurial before version 1.5
277 opts['file'] = True
277 opts['file'] = True
278
278
279 fm = ui.formatter('annotate', opts)
279 fm = ui.formatter('annotate', opts)
280 datefunc = ui.quiet and util.shortdate or util.datestr
280 datefunc = ui.quiet and util.shortdate or util.datestr
281 hexfn = fm.hexfunc
281 hexfn = fm.hexfunc
282
282
283 opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser),
283 opmap = [('user', ' ', lambda x: x[0].user(), ui.shortuser),
284 ('number', ' ', lambda x: x[0].rev(), str),
284 ('number', ' ', lambda x: x[0].rev(), str),
285 ('changeset', ' ', lambda x: hexfn(x[0].node()), str),
285 ('changeset', ' ', lambda x: hexfn(x[0].node()), str),
286 ('date', ' ', lambda x: x[0].date(), util.cachefunc(datefunc)),
286 ('date', ' ', lambda x: x[0].date(), util.cachefunc(datefunc)),
287 ('file', ' ', lambda x: x[0].path(), str),
287 ('file', ' ', lambda x: x[0].path(), str),
288 ('line_number', ':', lambda x: x[1], str),
288 ('line_number', ':', lambda x: x[1], str),
289 ]
289 ]
290 fieldnamemap = {'number': 'rev', 'changeset': 'node'}
290 fieldnamemap = {'number': 'rev', 'changeset': 'node'}
291
291
292 if (not opts.get('user') and not opts.get('changeset')
292 if (not opts.get('user') and not opts.get('changeset')
293 and not opts.get('date') and not opts.get('file')):
293 and not opts.get('date') and not opts.get('file')):
294 opts['number'] = True
294 opts['number'] = True
295
295
296 linenumber = opts.get('line_number') is not None
296 linenumber = opts.get('line_number') is not None
297 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
297 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
298 raise util.Abort(_('at least one of -n/-c is required for -l'))
298 raise util.Abort(_('at least one of -n/-c is required for -l'))
299
299
300 if fm:
300 if fm:
301 def makefunc(get, fmt):
301 def makefunc(get, fmt):
302 return get
302 return get
303 else:
303 else:
304 def makefunc(get, fmt):
304 def makefunc(get, fmt):
305 return lambda x: fmt(get(x))
305 return lambda x: fmt(get(x))
306 funcmap = [(makefunc(get, fmt), sep) for op, sep, get, fmt in opmap
306 funcmap = [(makefunc(get, fmt), sep) for op, sep, get, fmt in opmap
307 if opts.get(op)]
307 if opts.get(op)]
308 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
308 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
309 fields = ' '.join(fieldnamemap.get(op, op) for op, sep, get, fmt in opmap
309 fields = ' '.join(fieldnamemap.get(op, op) for op, sep, get, fmt in opmap
310 if opts.get(op))
310 if opts.get(op))
311
311
312 def bad(x, y):
312 def bad(x, y):
313 raise util.Abort("%s: %s" % (x, y))
313 raise util.Abort("%s: %s" % (x, y))
314
314
315 ctx = scmutil.revsingle(repo, opts.get('rev'))
315 ctx = scmutil.revsingle(repo, opts.get('rev'))
316 m = scmutil.match(ctx, pats, opts)
316 m = scmutil.match(ctx, pats, opts)
317 m.bad = bad
317 m.bad = bad
318 follow = not opts.get('no_follow')
318 follow = not opts.get('no_follow')
319 diffopts = patch.difffeatureopts(ui, opts, section='annotate',
319 diffopts = patch.difffeatureopts(ui, opts, section='annotate',
320 whitespace=True)
320 whitespace=True)
321 for abs in ctx.walk(m):
321 for abs in ctx.walk(m):
322 fctx = ctx[abs]
322 fctx = ctx[abs]
323 if not opts.get('text') and util.binary(fctx.data()):
323 if not opts.get('text') and util.binary(fctx.data()):
324 fm.plain(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
324 fm.plain(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
325 continue
325 continue
326
326
327 lines = fctx.annotate(follow=follow, linenumber=linenumber,
327 lines = fctx.annotate(follow=follow, linenumber=linenumber,
328 diffopts=diffopts)
328 diffopts=diffopts)
329 formats = []
329 formats = []
330 pieces = []
330 pieces = []
331
331
332 for f, sep in funcmap:
332 for f, sep in funcmap:
333 l = [f(n) for n, dummy in lines]
333 l = [f(n) for n, dummy in lines]
334 if l:
334 if l:
335 if fm:
335 if fm:
336 formats.append(['%s' for x in l])
336 formats.append(['%s' for x in l])
337 else:
337 else:
338 sizes = [encoding.colwidth(x) for x in l]
338 sizes = [encoding.colwidth(x) for x in l]
339 ml = max(sizes)
339 ml = max(sizes)
340 formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes])
340 formats.append([sep + ' ' * (ml - w) + '%s' for w in sizes])
341 pieces.append(l)
341 pieces.append(l)
342
342
343 for f, p, l in zip(zip(*formats), zip(*pieces), lines):
343 for f, p, l in zip(zip(*formats), zip(*pieces), lines):
344 fm.startitem()
344 fm.startitem()
345 fm.write(fields, "".join(f), *p)
345 fm.write(fields, "".join(f), *p)
346 fm.write('line', ": %s", l[1])
346 fm.write('line', ": %s", l[1])
347
347
348 if lines and not lines[-1][1].endswith('\n'):
348 if lines and not lines[-1][1].endswith('\n'):
349 fm.plain('\n')
349 fm.plain('\n')
350
350
351 fm.end()
351 fm.end()
352
352
353 @command('archive',
353 @command('archive',
354 [('', 'no-decode', None, _('do not pass files through decoders')),
354 [('', 'no-decode', None, _('do not pass files through decoders')),
355 ('p', 'prefix', '', _('directory prefix for files in archive'),
355 ('p', 'prefix', '', _('directory prefix for files in archive'),
356 _('PREFIX')),
356 _('PREFIX')),
357 ('r', 'rev', '', _('revision to distribute'), _('REV')),
357 ('r', 'rev', '', _('revision to distribute'), _('REV')),
358 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
358 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
359 ] + subrepoopts + walkopts,
359 ] + subrepoopts + walkopts,
360 _('[OPTION]... DEST'))
360 _('[OPTION]... DEST'))
361 def archive(ui, repo, dest, **opts):
361 def archive(ui, repo, dest, **opts):
362 '''create an unversioned archive of a repository revision
362 '''create an unversioned archive of a repository revision
363
363
364 By default, the revision used is the parent of the working
364 By default, the revision used is the parent of the working
365 directory; use -r/--rev to specify a different revision.
365 directory; use -r/--rev to specify a different revision.
366
366
367 The archive type is automatically detected based on file
367 The archive type is automatically detected based on file
368 extension (or override using -t/--type).
368 extension (or override using -t/--type).
369
369
370 .. container:: verbose
370 .. container:: verbose
371
371
372 Examples:
372 Examples:
373
373
374 - create a zip file containing the 1.0 release::
374 - create a zip file containing the 1.0 release::
375
375
376 hg archive -r 1.0 project-1.0.zip
376 hg archive -r 1.0 project-1.0.zip
377
377
378 - create a tarball excluding .hg files::
378 - create a tarball excluding .hg files::
379
379
380 hg archive project.tar.gz -X ".hg*"
380 hg archive project.tar.gz -X ".hg*"
381
381
382 Valid types are:
382 Valid types are:
383
383
384 :``files``: a directory full of files (default)
384 :``files``: a directory full of files (default)
385 :``tar``: tar archive, uncompressed
385 :``tar``: tar archive, uncompressed
386 :``tbz2``: tar archive, compressed using bzip2
386 :``tbz2``: tar archive, compressed using bzip2
387 :``tgz``: tar archive, compressed using gzip
387 :``tgz``: tar archive, compressed using gzip
388 :``uzip``: zip archive, uncompressed
388 :``uzip``: zip archive, uncompressed
389 :``zip``: zip archive, compressed using deflate
389 :``zip``: zip archive, compressed using deflate
390
390
391 The exact name of the destination archive or directory is given
391 The exact name of the destination archive or directory is given
392 using a format string; see :hg:`help export` for details.
392 using a format string; see :hg:`help export` for details.
393
393
394 Each member added to an archive file has a directory prefix
394 Each member added to an archive file has a directory prefix
395 prepended. Use -p/--prefix to specify a format string for the
395 prepended. Use -p/--prefix to specify a format string for the
396 prefix. The default is the basename of the archive, with suffixes
396 prefix. The default is the basename of the archive, with suffixes
397 removed.
397 removed.
398
398
399 Returns 0 on success.
399 Returns 0 on success.
400 '''
400 '''
401
401
402 ctx = scmutil.revsingle(repo, opts.get('rev'))
402 ctx = scmutil.revsingle(repo, opts.get('rev'))
403 if not ctx:
403 if not ctx:
404 raise util.Abort(_('no working directory: please specify a revision'))
404 raise util.Abort(_('no working directory: please specify a revision'))
405 node = ctx.node()
405 node = ctx.node()
406 dest = cmdutil.makefilename(repo, dest, node)
406 dest = cmdutil.makefilename(repo, dest, node)
407 if os.path.realpath(dest) == repo.root:
407 if os.path.realpath(dest) == repo.root:
408 raise util.Abort(_('repository root cannot be destination'))
408 raise util.Abort(_('repository root cannot be destination'))
409
409
410 kind = opts.get('type') or archival.guesskind(dest) or 'files'
410 kind = opts.get('type') or archival.guesskind(dest) or 'files'
411 prefix = opts.get('prefix')
411 prefix = opts.get('prefix')
412
412
413 if dest == '-':
413 if dest == '-':
414 if kind == 'files':
414 if kind == 'files':
415 raise util.Abort(_('cannot archive plain files to stdout'))
415 raise util.Abort(_('cannot archive plain files to stdout'))
416 dest = cmdutil.makefileobj(repo, dest)
416 dest = cmdutil.makefileobj(repo, dest)
417 if not prefix:
417 if not prefix:
418 prefix = os.path.basename(repo.root) + '-%h'
418 prefix = os.path.basename(repo.root) + '-%h'
419
419
420 prefix = cmdutil.makefilename(repo, prefix, node)
420 prefix = cmdutil.makefilename(repo, prefix, node)
421 matchfn = scmutil.match(ctx, [], opts)
421 matchfn = scmutil.match(ctx, [], opts)
422 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
422 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
423 matchfn, prefix, subrepos=opts.get('subrepos'))
423 matchfn, prefix, subrepos=opts.get('subrepos'))
424
424
425 @command('backout',
425 @command('backout',
426 [('', 'merge', None, _('merge with old dirstate parent after backout')),
426 [('', 'merge', None, _('merge with old dirstate parent after backout')),
427 ('', 'commit', None, _('commit if no conflicts were encountered')),
427 ('', 'commit', None, _('commit if no conflicts were encountered')),
428 ('', 'parent', '',
428 ('', 'parent', '',
429 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
429 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
430 ('r', 'rev', '', _('revision to backout'), _('REV')),
430 ('r', 'rev', '', _('revision to backout'), _('REV')),
431 ('e', 'edit', False, _('invoke editor on commit messages')),
431 ('e', 'edit', False, _('invoke editor on commit messages')),
432 ] + mergetoolopts + walkopts + commitopts + commitopts2,
432 ] + mergetoolopts + walkopts + commitopts + commitopts2,
433 _('[OPTION]... [-r] REV'))
433 _('[OPTION]... [-r] REV'))
434 def backout(ui, repo, node=None, rev=None, commit=False, **opts):
434 def backout(ui, repo, node=None, rev=None, commit=False, **opts):
435 '''reverse effect of earlier changeset
435 '''reverse effect of earlier changeset
436
436
437 Prepare a new changeset with the effect of REV undone in the
437 Prepare a new changeset with the effect of REV undone in the
438 current working directory.
438 current working directory.
439
439
440 If REV is the parent of the working directory, then this new changeset
440 If REV is the parent of the working directory, then this new changeset
441 is committed automatically. Otherwise, hg needs to merge the
441 is committed automatically. Otherwise, hg needs to merge the
442 changes and the merged result is left uncommitted.
442 changes and the merged result is left uncommitted.
443
443
444 .. note::
444 .. note::
445
445
446 backout cannot be used to fix either an unwanted or
446 backout cannot be used to fix either an unwanted or
447 incorrect merge.
447 incorrect merge.
448
448
449 .. container:: verbose
449 .. container:: verbose
450
450
451 By default, the pending changeset will have one parent,
451 By default, the pending changeset will have one parent,
452 maintaining a linear history. With --merge, the pending
452 maintaining a linear history. With --merge, the pending
453 changeset will instead have two parents: the old parent of the
453 changeset will instead have two parents: the old parent of the
454 working directory and a new child of REV that simply undoes REV.
454 working directory and a new child of REV that simply undoes REV.
455
455
456 Before version 1.7, the behavior without --merge was equivalent
456 Before version 1.7, the behavior without --merge was equivalent
457 to specifying --merge followed by :hg:`update --clean .` to
457 to specifying --merge followed by :hg:`update --clean .` to
458 cancel the merge and leave the child of REV as a head to be
458 cancel the merge and leave the child of REV as a head to be
459 merged separately.
459 merged separately.
460
460
461 See :hg:`help dates` for a list of formats valid for -d/--date.
461 See :hg:`help dates` for a list of formats valid for -d/--date.
462
462
463 Returns 0 on success, 1 if nothing to backout or there are unresolved
463 Returns 0 on success, 1 if nothing to backout or there are unresolved
464 files.
464 files.
465 '''
465 '''
466 if rev and node:
466 if rev and node:
467 raise util.Abort(_("please specify just one revision"))
467 raise util.Abort(_("please specify just one revision"))
468
468
469 if not rev:
469 if not rev:
470 rev = node
470 rev = node
471
471
472 if not rev:
472 if not rev:
473 raise util.Abort(_("please specify a revision to backout"))
473 raise util.Abort(_("please specify a revision to backout"))
474
474
475 date = opts.get('date')
475 date = opts.get('date')
476 if date:
476 if date:
477 opts['date'] = util.parsedate(date)
477 opts['date'] = util.parsedate(date)
478
478
479 cmdutil.checkunfinished(repo)
479 cmdutil.checkunfinished(repo)
480 cmdutil.bailifchanged(repo)
480 cmdutil.bailifchanged(repo)
481 node = scmutil.revsingle(repo, rev).node()
481 node = scmutil.revsingle(repo, rev).node()
482
482
483 op1, op2 = repo.dirstate.parents()
483 op1, op2 = repo.dirstate.parents()
484 if not repo.changelog.isancestor(node, op1):
484 if not repo.changelog.isancestor(node, op1):
485 raise util.Abort(_('cannot backout change that is not an ancestor'))
485 raise util.Abort(_('cannot backout change that is not an ancestor'))
486
486
487 p1, p2 = repo.changelog.parents(node)
487 p1, p2 = repo.changelog.parents(node)
488 if p1 == nullid:
488 if p1 == nullid:
489 raise util.Abort(_('cannot backout a change with no parents'))
489 raise util.Abort(_('cannot backout a change with no parents'))
490 if p2 != nullid:
490 if p2 != nullid:
491 if not opts.get('parent'):
491 if not opts.get('parent'):
492 raise util.Abort(_('cannot backout a merge changeset'))
492 raise util.Abort(_('cannot backout a merge changeset'))
493 p = repo.lookup(opts['parent'])
493 p = repo.lookup(opts['parent'])
494 if p not in (p1, p2):
494 if p not in (p1, p2):
495 raise util.Abort(_('%s is not a parent of %s') %
495 raise util.Abort(_('%s is not a parent of %s') %
496 (short(p), short(node)))
496 (short(p), short(node)))
497 parent = p
497 parent = p
498 else:
498 else:
499 if opts.get('parent'):
499 if opts.get('parent'):
500 raise util.Abort(_('cannot use --parent on non-merge changeset'))
500 raise util.Abort(_('cannot use --parent on non-merge changeset'))
501 parent = p1
501 parent = p1
502
502
503 # the backout should appear on the same branch
503 # the backout should appear on the same branch
504 wlock = repo.wlock()
504 wlock = repo.wlock()
505 try:
505 try:
506 branch = repo.dirstate.branch()
506 branch = repo.dirstate.branch()
507 bheads = repo.branchheads(branch)
507 bheads = repo.branchheads(branch)
508 rctx = scmutil.revsingle(repo, hex(parent))
508 rctx = scmutil.revsingle(repo, hex(parent))
509 if not opts.get('merge') and op1 != node:
509 if not opts.get('merge') and op1 != node:
510 try:
510 try:
511 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
511 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
512 'backout')
512 'backout')
513 repo.dirstate.beginparentchange()
513 repo.dirstate.beginparentchange()
514 stats = mergemod.update(repo, parent, True, True, False,
514 stats = mergemod.update(repo, parent, True, True, False,
515 node, False)
515 node, False)
516 repo.setparents(op1, op2)
516 repo.setparents(op1, op2)
517 repo.dirstate.endparentchange()
517 repo.dirstate.endparentchange()
518 hg._showstats(repo, stats)
518 hg._showstats(repo, stats)
519 if stats[3]:
519 if stats[3]:
520 repo.ui.status(_("use 'hg resolve' to retry unresolved "
520 repo.ui.status(_("use 'hg resolve' to retry unresolved "
521 "file merges\n"))
521 "file merges\n"))
522 return 1
522 return 1
523 elif not commit:
523 elif not commit:
524 msg = _("changeset %s backed out, "
524 msg = _("changeset %s backed out, "
525 "don't forget to commit.\n")
525 "don't forget to commit.\n")
526 ui.status(msg % short(node))
526 ui.status(msg % short(node))
527 return 0
527 return 0
528 finally:
528 finally:
529 ui.setconfig('ui', 'forcemerge', '', '')
529 ui.setconfig('ui', 'forcemerge', '', '')
530 else:
530 else:
531 hg.clean(repo, node, show_stats=False)
531 hg.clean(repo, node, show_stats=False)
532 repo.dirstate.setbranch(branch)
532 repo.dirstate.setbranch(branch)
533 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
533 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
534
534
535
535
536 def commitfunc(ui, repo, message, match, opts):
536 def commitfunc(ui, repo, message, match, opts):
537 editform = 'backout'
537 editform = 'backout'
538 e = cmdutil.getcommiteditor(editform=editform, **opts)
538 e = cmdutil.getcommiteditor(editform=editform, **opts)
539 if not message:
539 if not message:
540 # we don't translate commit messages
540 # we don't translate commit messages
541 message = "Backed out changeset %s" % short(node)
541 message = "Backed out changeset %s" % short(node)
542 e = cmdutil.getcommiteditor(edit=True, editform=editform)
542 e = cmdutil.getcommiteditor(edit=True, editform=editform)
543 return repo.commit(message, opts.get('user'), opts.get('date'),
543 return repo.commit(message, opts.get('user'), opts.get('date'),
544 match, editor=e)
544 match, editor=e)
545 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
545 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
546 if not newnode:
546 if not newnode:
547 ui.status(_("nothing changed\n"))
547 ui.status(_("nothing changed\n"))
548 return 1
548 return 1
549 cmdutil.commitstatus(repo, newnode, branch, bheads)
549 cmdutil.commitstatus(repo, newnode, branch, bheads)
550
550
551 def nice(node):
551 def nice(node):
552 return '%d:%s' % (repo.changelog.rev(node), short(node))
552 return '%d:%s' % (repo.changelog.rev(node), short(node))
553 ui.status(_('changeset %s backs out changeset %s\n') %
553 ui.status(_('changeset %s backs out changeset %s\n') %
554 (nice(repo.changelog.tip()), nice(node)))
554 (nice(repo.changelog.tip()), nice(node)))
555 if opts.get('merge') and op1 != node:
555 if opts.get('merge') and op1 != node:
556 hg.clean(repo, op1, show_stats=False)
556 hg.clean(repo, op1, show_stats=False)
557 ui.status(_('merging with changeset %s\n')
557 ui.status(_('merging with changeset %s\n')
558 % nice(repo.changelog.tip()))
558 % nice(repo.changelog.tip()))
559 try:
559 try:
560 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
560 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
561 'backout')
561 'backout')
562 return hg.merge(repo, hex(repo.changelog.tip()))
562 return hg.merge(repo, hex(repo.changelog.tip()))
563 finally:
563 finally:
564 ui.setconfig('ui', 'forcemerge', '', '')
564 ui.setconfig('ui', 'forcemerge', '', '')
565 finally:
565 finally:
566 wlock.release()
566 wlock.release()
567 return 0
567 return 0
568
568
569 @command('bisect',
569 @command('bisect',
570 [('r', 'reset', False, _('reset bisect state')),
570 [('r', 'reset', False, _('reset bisect state')),
571 ('g', 'good', False, _('mark changeset good')),
571 ('g', 'good', False, _('mark changeset good')),
572 ('b', 'bad', False, _('mark changeset bad')),
572 ('b', 'bad', False, _('mark changeset bad')),
573 ('s', 'skip', False, _('skip testing changeset')),
573 ('s', 'skip', False, _('skip testing changeset')),
574 ('e', 'extend', False, _('extend the bisect range')),
574 ('e', 'extend', False, _('extend the bisect range')),
575 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
575 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
576 ('U', 'noupdate', False, _('do not update to target'))],
576 ('U', 'noupdate', False, _('do not update to target'))],
577 _("[-gbsr] [-U] [-c CMD] [REV]"))
577 _("[-gbsr] [-U] [-c CMD] [REV]"))
578 def bisect(ui, repo, rev=None, extra=None, command=None,
578 def bisect(ui, repo, rev=None, extra=None, command=None,
579 reset=None, good=None, bad=None, skip=None, extend=None,
579 reset=None, good=None, bad=None, skip=None, extend=None,
580 noupdate=None):
580 noupdate=None):
581 """subdivision search of changesets
581 """subdivision search of changesets
582
582
583 This command helps to find changesets which introduce problems. To
583 This command helps to find changesets which introduce problems. To
584 use, mark the earliest changeset you know exhibits the problem as
584 use, mark the earliest changeset you know exhibits the problem as
585 bad, then mark the latest changeset which is free from the problem
585 bad, then mark the latest changeset which is free from the problem
586 as good. Bisect will update your working directory to a revision
586 as good. Bisect will update your working directory to a revision
587 for testing (unless the -U/--noupdate option is specified). Once
587 for testing (unless the -U/--noupdate option is specified). Once
588 you have performed tests, mark the working directory as good or
588 you have performed tests, mark the working directory as good or
589 bad, and bisect will either update to another candidate changeset
589 bad, and bisect will either update to another candidate changeset
590 or announce that it has found the bad revision.
590 or announce that it has found the bad revision.
591
591
592 As a shortcut, you can also use the revision argument to mark a
592 As a shortcut, you can also use the revision argument to mark a
593 revision as good or bad without checking it out first.
593 revision as good or bad without checking it out first.
594
594
595 If you supply a command, it will be used for automatic bisection.
595 If you supply a command, it will be used for automatic bisection.
596 The environment variable HG_NODE will contain the ID of the
596 The environment variable HG_NODE will contain the ID of the
597 changeset being tested. The exit status of the command will be
597 changeset being tested. The exit status of the command will be
598 used to mark revisions as good or bad: status 0 means good, 125
598 used to mark revisions as good or bad: status 0 means good, 125
599 means to skip the revision, 127 (command not found) will abort the
599 means to skip the revision, 127 (command not found) will abort the
600 bisection, and any other non-zero exit status means the revision
600 bisection, and any other non-zero exit status means the revision
601 is bad.
601 is bad.
602
602
603 .. container:: verbose
603 .. container:: verbose
604
604
605 Some examples:
605 Some examples:
606
606
607 - start a bisection with known bad revision 34, and good revision 12::
607 - start a bisection with known bad revision 34, and good revision 12::
608
608
609 hg bisect --bad 34
609 hg bisect --bad 34
610 hg bisect --good 12
610 hg bisect --good 12
611
611
612 - advance the current bisection by marking current revision as good or
612 - advance the current bisection by marking current revision as good or
613 bad::
613 bad::
614
614
615 hg bisect --good
615 hg bisect --good
616 hg bisect --bad
616 hg bisect --bad
617
617
618 - mark the current revision, or a known revision, to be skipped (e.g. if
618 - mark the current revision, or a known revision, to be skipped (e.g. if
619 that revision is not usable because of another issue)::
619 that revision is not usable because of another issue)::
620
620
621 hg bisect --skip
621 hg bisect --skip
622 hg bisect --skip 23
622 hg bisect --skip 23
623
623
624 - skip all revisions that do not touch directories ``foo`` or ``bar``::
624 - skip all revisions that do not touch directories ``foo`` or ``bar``::
625
625
626 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
626 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
627
627
628 - forget the current bisection::
628 - forget the current bisection::
629
629
630 hg bisect --reset
630 hg bisect --reset
631
631
632 - use 'make && make tests' to automatically find the first broken
632 - use 'make && make tests' to automatically find the first broken
633 revision::
633 revision::
634
634
635 hg bisect --reset
635 hg bisect --reset
636 hg bisect --bad 34
636 hg bisect --bad 34
637 hg bisect --good 12
637 hg bisect --good 12
638 hg bisect --command "make && make tests"
638 hg bisect --command "make && make tests"
639
639
640 - see all changesets whose states are already known in the current
640 - see all changesets whose states are already known in the current
641 bisection::
641 bisection::
642
642
643 hg log -r "bisect(pruned)"
643 hg log -r "bisect(pruned)"
644
644
645 - see the changeset currently being bisected (especially useful
645 - see the changeset currently being bisected (especially useful
646 if running with -U/--noupdate)::
646 if running with -U/--noupdate)::
647
647
648 hg log -r "bisect(current)"
648 hg log -r "bisect(current)"
649
649
650 - see all changesets that took part in the current bisection::
650 - see all changesets that took part in the current bisection::
651
651
652 hg log -r "bisect(range)"
652 hg log -r "bisect(range)"
653
653
654 - you can even get a nice graph::
654 - you can even get a nice graph::
655
655
656 hg log --graph -r "bisect(range)"
656 hg log --graph -r "bisect(range)"
657
657
658 See :hg:`help revsets` for more about the `bisect()` keyword.
658 See :hg:`help revsets` for more about the `bisect()` keyword.
659
659
660 Returns 0 on success.
660 Returns 0 on success.
661 """
661 """
662 def extendbisectrange(nodes, good):
662 def extendbisectrange(nodes, good):
663 # bisect is incomplete when it ends on a merge node and
663 # bisect is incomplete when it ends on a merge node and
664 # one of the parent was not checked.
664 # one of the parent was not checked.
665 parents = repo[nodes[0]].parents()
665 parents = repo[nodes[0]].parents()
666 if len(parents) > 1:
666 if len(parents) > 1:
667 side = good and state['bad'] or state['good']
667 side = good and state['bad'] or state['good']
668 num = len(set(i.node() for i in parents) & set(side))
668 num = len(set(i.node() for i in parents) & set(side))
669 if num == 1:
669 if num == 1:
670 return parents[0].ancestor(parents[1])
670 return parents[0].ancestor(parents[1])
671 return None
671 return None
672
672
673 def print_result(nodes, good):
673 def print_result(nodes, good):
674 displayer = cmdutil.show_changeset(ui, repo, {})
674 displayer = cmdutil.show_changeset(ui, repo, {})
675 if len(nodes) == 1:
675 if len(nodes) == 1:
676 # narrowed it down to a single revision
676 # narrowed it down to a single revision
677 if good:
677 if good:
678 ui.write(_("The first good revision is:\n"))
678 ui.write(_("The first good revision is:\n"))
679 else:
679 else:
680 ui.write(_("The first bad revision is:\n"))
680 ui.write(_("The first bad revision is:\n"))
681 displayer.show(repo[nodes[0]])
681 displayer.show(repo[nodes[0]])
682 extendnode = extendbisectrange(nodes, good)
682 extendnode = extendbisectrange(nodes, good)
683 if extendnode is not None:
683 if extendnode is not None:
684 ui.write(_('Not all ancestors of this changeset have been'
684 ui.write(_('Not all ancestors of this changeset have been'
685 ' checked.\nUse bisect --extend to continue the '
685 ' checked.\nUse bisect --extend to continue the '
686 'bisection from\nthe common ancestor, %s.\n')
686 'bisection from\nthe common ancestor, %s.\n')
687 % extendnode)
687 % extendnode)
688 else:
688 else:
689 # multiple possible revisions
689 # multiple possible revisions
690 if good:
690 if good:
691 ui.write(_("Due to skipped revisions, the first "
691 ui.write(_("Due to skipped revisions, the first "
692 "good revision could be any of:\n"))
692 "good revision could be any of:\n"))
693 else:
693 else:
694 ui.write(_("Due to skipped revisions, the first "
694 ui.write(_("Due to skipped revisions, the first "
695 "bad revision could be any of:\n"))
695 "bad revision could be any of:\n"))
696 for n in nodes:
696 for n in nodes:
697 displayer.show(repo[n])
697 displayer.show(repo[n])
698 displayer.close()
698 displayer.close()
699
699
700 def check_state(state, interactive=True):
700 def check_state(state, interactive=True):
701 if not state['good'] or not state['bad']:
701 if not state['good'] or not state['bad']:
702 if (good or bad or skip or reset) and interactive:
702 if (good or bad or skip or reset) and interactive:
703 return
703 return
704 if not state['good']:
704 if not state['good']:
705 raise util.Abort(_('cannot bisect (no known good revisions)'))
705 raise util.Abort(_('cannot bisect (no known good revisions)'))
706 else:
706 else:
707 raise util.Abort(_('cannot bisect (no known bad revisions)'))
707 raise util.Abort(_('cannot bisect (no known bad revisions)'))
708 return True
708 return True
709
709
710 # backward compatibility
710 # backward compatibility
711 if rev in "good bad reset init".split():
711 if rev in "good bad reset init".split():
712 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
712 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
713 cmd, rev, extra = rev, extra, None
713 cmd, rev, extra = rev, extra, None
714 if cmd == "good":
714 if cmd == "good":
715 good = True
715 good = True
716 elif cmd == "bad":
716 elif cmd == "bad":
717 bad = True
717 bad = True
718 else:
718 else:
719 reset = True
719 reset = True
720 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
720 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
721 raise util.Abort(_('incompatible arguments'))
721 raise util.Abort(_('incompatible arguments'))
722
722
723 cmdutil.checkunfinished(repo)
723 cmdutil.checkunfinished(repo)
724
724
725 if reset:
725 if reset:
726 p = repo.join("bisect.state")
726 p = repo.join("bisect.state")
727 if os.path.exists(p):
727 if os.path.exists(p):
728 os.unlink(p)
728 os.unlink(p)
729 return
729 return
730
730
731 state = hbisect.load_state(repo)
731 state = hbisect.load_state(repo)
732
732
733 if command:
733 if command:
734 changesets = 1
734 changesets = 1
735 if noupdate:
735 if noupdate:
736 try:
736 try:
737 node = state['current'][0]
737 node = state['current'][0]
738 except LookupError:
738 except LookupError:
739 raise util.Abort(_('current bisect revision is unknown - '
739 raise util.Abort(_('current bisect revision is unknown - '
740 'start a new bisect to fix'))
740 'start a new bisect to fix'))
741 else:
741 else:
742 node, p2 = repo.dirstate.parents()
742 node, p2 = repo.dirstate.parents()
743 if p2 != nullid:
743 if p2 != nullid:
744 raise util.Abort(_('current bisect revision is a merge'))
744 raise util.Abort(_('current bisect revision is a merge'))
745 try:
745 try:
746 while changesets:
746 while changesets:
747 # update state
747 # update state
748 state['current'] = [node]
748 state['current'] = [node]
749 hbisect.save_state(repo, state)
749 hbisect.save_state(repo, state)
750 status = ui.system(command, environ={'HG_NODE': hex(node)})
750 status = ui.system(command, environ={'HG_NODE': hex(node)})
751 if status == 125:
751 if status == 125:
752 transition = "skip"
752 transition = "skip"
753 elif status == 0:
753 elif status == 0:
754 transition = "good"
754 transition = "good"
755 # status < 0 means process was killed
755 # status < 0 means process was killed
756 elif status == 127:
756 elif status == 127:
757 raise util.Abort(_("failed to execute %s") % command)
757 raise util.Abort(_("failed to execute %s") % command)
758 elif status < 0:
758 elif status < 0:
759 raise util.Abort(_("%s killed") % command)
759 raise util.Abort(_("%s killed") % command)
760 else:
760 else:
761 transition = "bad"
761 transition = "bad"
762 ctx = scmutil.revsingle(repo, rev, node)
762 ctx = scmutil.revsingle(repo, rev, node)
763 rev = None # clear for future iterations
763 rev = None # clear for future iterations
764 state[transition].append(ctx.node())
764 state[transition].append(ctx.node())
765 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
765 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
766 check_state(state, interactive=False)
766 check_state(state, interactive=False)
767 # bisect
767 # bisect
768 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
768 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
769 # update to next check
769 # update to next check
770 node = nodes[0]
770 node = nodes[0]
771 if not noupdate:
771 if not noupdate:
772 cmdutil.bailifchanged(repo)
772 cmdutil.bailifchanged(repo)
773 hg.clean(repo, node, show_stats=False)
773 hg.clean(repo, node, show_stats=False)
774 finally:
774 finally:
775 state['current'] = [node]
775 state['current'] = [node]
776 hbisect.save_state(repo, state)
776 hbisect.save_state(repo, state)
777 print_result(nodes, bgood)
777 print_result(nodes, bgood)
778 return
778 return
779
779
780 # update state
780 # update state
781
781
782 if rev:
782 if rev:
783 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
783 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
784 else:
784 else:
785 nodes = [repo.lookup('.')]
785 nodes = [repo.lookup('.')]
786
786
787 if good or bad or skip:
787 if good or bad or skip:
788 if good:
788 if good:
789 state['good'] += nodes
789 state['good'] += nodes
790 elif bad:
790 elif bad:
791 state['bad'] += nodes
791 state['bad'] += nodes
792 elif skip:
792 elif skip:
793 state['skip'] += nodes
793 state['skip'] += nodes
794 hbisect.save_state(repo, state)
794 hbisect.save_state(repo, state)
795
795
796 if not check_state(state):
796 if not check_state(state):
797 return
797 return
798
798
799 # actually bisect
799 # actually bisect
800 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
800 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
801 if extend:
801 if extend:
802 if not changesets:
802 if not changesets:
803 extendnode = extendbisectrange(nodes, good)
803 extendnode = extendbisectrange(nodes, good)
804 if extendnode is not None:
804 if extendnode is not None:
805 ui.write(_("Extending search to changeset %d:%s\n")
805 ui.write(_("Extending search to changeset %d:%s\n")
806 % (extendnode.rev(), extendnode))
806 % (extendnode.rev(), extendnode))
807 state['current'] = [extendnode.node()]
807 state['current'] = [extendnode.node()]
808 hbisect.save_state(repo, state)
808 hbisect.save_state(repo, state)
809 if noupdate:
809 if noupdate:
810 return
810 return
811 cmdutil.bailifchanged(repo)
811 cmdutil.bailifchanged(repo)
812 return hg.clean(repo, extendnode.node())
812 return hg.clean(repo, extendnode.node())
813 raise util.Abort(_("nothing to extend"))
813 raise util.Abort(_("nothing to extend"))
814
814
815 if changesets == 0:
815 if changesets == 0:
816 print_result(nodes, good)
816 print_result(nodes, good)
817 else:
817 else:
818 assert len(nodes) == 1 # only a single node can be tested next
818 assert len(nodes) == 1 # only a single node can be tested next
819 node = nodes[0]
819 node = nodes[0]
820 # compute the approximate number of remaining tests
820 # compute the approximate number of remaining tests
821 tests, size = 0, 2
821 tests, size = 0, 2
822 while size <= changesets:
822 while size <= changesets:
823 tests, size = tests + 1, size * 2
823 tests, size = tests + 1, size * 2
824 rev = repo.changelog.rev(node)
824 rev = repo.changelog.rev(node)
825 ui.write(_("Testing changeset %d:%s "
825 ui.write(_("Testing changeset %d:%s "
826 "(%d changesets remaining, ~%d tests)\n")
826 "(%d changesets remaining, ~%d tests)\n")
827 % (rev, short(node), changesets, tests))
827 % (rev, short(node), changesets, tests))
828 state['current'] = [node]
828 state['current'] = [node]
829 hbisect.save_state(repo, state)
829 hbisect.save_state(repo, state)
830 if not noupdate:
830 if not noupdate:
831 cmdutil.bailifchanged(repo)
831 cmdutil.bailifchanged(repo)
832 return hg.clean(repo, node)
832 return hg.clean(repo, node)
833
833
834 @command('bookmarks|bookmark',
834 @command('bookmarks|bookmark',
835 [('f', 'force', False, _('force')),
835 [('f', 'force', False, _('force')),
836 ('r', 'rev', '', _('revision'), _('REV')),
836 ('r', 'rev', '', _('revision'), _('REV')),
837 ('d', 'delete', False, _('delete a given bookmark')),
837 ('d', 'delete', False, _('delete a given bookmark')),
838 ('m', 'rename', '', _('rename a given bookmark'), _('NAME')),
838 ('m', 'rename', '', _('rename a given bookmark'), _('NAME')),
839 ('i', 'inactive', False, _('mark a bookmark inactive')),
839 ('i', 'inactive', False, _('mark a bookmark inactive')),
840 ] + formatteropts,
840 ] + formatteropts,
841 _('hg bookmarks [OPTIONS]... [NAME]...'))
841 _('hg bookmarks [OPTIONS]... [NAME]...'))
842 def bookmark(ui, repo, *names, **opts):
842 def bookmark(ui, repo, *names, **opts):
843 '''create a new bookmark or list existing bookmarks
843 '''create a new bookmark or list existing bookmarks
844
844
845 Bookmarks are labels on changesets to help track lines of development.
845 Bookmarks are labels on changesets to help track lines of development.
846 Bookmarks are unversioned and can be moved, renamed and deleted.
846 Bookmarks are unversioned and can be moved, renamed and deleted.
847 Deleting or moving a bookmark has no effect on the associated changesets.
847 Deleting or moving a bookmark has no effect on the associated changesets.
848
848
849 Creating or updating to a bookmark causes it to be marked as 'active'.
849 Creating or updating to a bookmark causes it to be marked as 'active'.
850 The active bookmark is indicated with a '*'.
850 The active bookmark is indicated with a '*'.
851 When a commit is made, the active bookmark will advance to the new commit.
851 When a commit is made, the active bookmark will advance to the new commit.
852 A plain :hg:`update` will also advance an active bookmark, if possible.
852 A plain :hg:`update` will also advance an active bookmark, if possible.
853 Updating away from a bookmark will cause it to be deactivated.
853 Updating away from a bookmark will cause it to be deactivated.
854
854
855 Bookmarks can be pushed and pulled between repositories (see
855 Bookmarks can be pushed and pulled between repositories (see
856 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
856 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
857 diverged, a new 'divergent bookmark' of the form 'name@path' will
857 diverged, a new 'divergent bookmark' of the form 'name@path' will
858 be created. Using :hg:`merge` will resolve the divergence.
858 be created. Using :hg:`merge` will resolve the divergence.
859
859
860 A bookmark named '@' has the special property that :hg:`clone` will
860 A bookmark named '@' has the special property that :hg:`clone` will
861 check it out by default if it exists.
861 check it out by default if it exists.
862
862
863 .. container:: verbose
863 .. container:: verbose
864
864
865 Examples:
865 Examples:
866
866
867 - create an active bookmark for a new line of development::
867 - create an active bookmark for a new line of development::
868
868
869 hg book new-feature
869 hg book new-feature
870
870
871 - create an inactive bookmark as a place marker::
871 - create an inactive bookmark as a place marker::
872
872
873 hg book -i reviewed
873 hg book -i reviewed
874
874
875 - create an inactive bookmark on another changeset::
875 - create an inactive bookmark on another changeset::
876
876
877 hg book -r .^ tested
877 hg book -r .^ tested
878
878
879 - move the '@' bookmark from another branch::
879 - move the '@' bookmark from another branch::
880
880
881 hg book -f @
881 hg book -f @
882 '''
882 '''
883 force = opts.get('force')
883 force = opts.get('force')
884 rev = opts.get('rev')
884 rev = opts.get('rev')
885 delete = opts.get('delete')
885 delete = opts.get('delete')
886 rename = opts.get('rename')
886 rename = opts.get('rename')
887 inactive = opts.get('inactive')
887 inactive = opts.get('inactive')
888
888
889 def checkformat(mark):
889 def checkformat(mark):
890 mark = mark.strip()
890 mark = mark.strip()
891 if not mark:
891 if not mark:
892 raise util.Abort(_("bookmark names cannot consist entirely of "
892 raise util.Abort(_("bookmark names cannot consist entirely of "
893 "whitespace"))
893 "whitespace"))
894 scmutil.checknewlabel(repo, mark, 'bookmark')
894 scmutil.checknewlabel(repo, mark, 'bookmark')
895 return mark
895 return mark
896
896
897 def checkconflict(repo, mark, cur, force=False, target=None):
897 def checkconflict(repo, mark, cur, force=False, target=None):
898 if mark in marks and not force:
898 if mark in marks and not force:
899 if target:
899 if target:
900 if marks[mark] == target and target == cur:
900 if marks[mark] == target and target == cur:
901 # re-activating a bookmark
901 # re-activating a bookmark
902 return
902 return
903 anc = repo.changelog.ancestors([repo[target].rev()])
903 anc = repo.changelog.ancestors([repo[target].rev()])
904 bmctx = repo[marks[mark]]
904 bmctx = repo[marks[mark]]
905 divs = [repo[b].node() for b in marks
905 divs = [repo[b].node() for b in marks
906 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
906 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
907
907
908 # allow resolving a single divergent bookmark even if moving
908 # allow resolving a single divergent bookmark even if moving
909 # the bookmark across branches when a revision is specified
909 # the bookmark across branches when a revision is specified
910 # that contains a divergent bookmark
910 # that contains a divergent bookmark
911 if bmctx.rev() not in anc and target in divs:
911 if bmctx.rev() not in anc and target in divs:
912 bookmarks.deletedivergent(repo, [target], mark)
912 bookmarks.deletedivergent(repo, [target], mark)
913 return
913 return
914
914
915 deletefrom = [b for b in divs
915 deletefrom = [b for b in divs
916 if repo[b].rev() in anc or b == target]
916 if repo[b].rev() in anc or b == target]
917 bookmarks.deletedivergent(repo, deletefrom, mark)
917 bookmarks.deletedivergent(repo, deletefrom, mark)
918 if bookmarks.validdest(repo, bmctx, repo[target]):
918 if bookmarks.validdest(repo, bmctx, repo[target]):
919 ui.status(_("moving bookmark '%s' forward from %s\n") %
919 ui.status(_("moving bookmark '%s' forward from %s\n") %
920 (mark, short(bmctx.node())))
920 (mark, short(bmctx.node())))
921 return
921 return
922 raise util.Abort(_("bookmark '%s' already exists "
922 raise util.Abort(_("bookmark '%s' already exists "
923 "(use -f to force)") % mark)
923 "(use -f to force)") % mark)
924 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
924 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
925 and not force):
925 and not force):
926 raise util.Abort(
926 raise util.Abort(
927 _("a bookmark cannot have the name of an existing branch"))
927 _("a bookmark cannot have the name of an existing branch"))
928
928
929 if delete and rename:
929 if delete and rename:
930 raise util.Abort(_("--delete and --rename are incompatible"))
930 raise util.Abort(_("--delete and --rename are incompatible"))
931 if delete and rev:
931 if delete and rev:
932 raise util.Abort(_("--rev is incompatible with --delete"))
932 raise util.Abort(_("--rev is incompatible with --delete"))
933 if rename and rev:
933 if rename and rev:
934 raise util.Abort(_("--rev is incompatible with --rename"))
934 raise util.Abort(_("--rev is incompatible with --rename"))
935 if not names and (delete or rev):
935 if not names and (delete or rev):
936 raise util.Abort(_("bookmark name required"))
936 raise util.Abort(_("bookmark name required"))
937
937
938 if delete or rename or names or inactive:
938 if delete or rename or names or inactive:
939 wlock = repo.wlock()
939 wlock = repo.wlock()
940 try:
940 try:
941 cur = repo.changectx('.').node()
941 cur = repo.changectx('.').node()
942 marks = repo._bookmarks
942 marks = repo._bookmarks
943 if delete:
943 if delete:
944 for mark in names:
944 for mark in names:
945 if mark not in marks:
945 if mark not in marks:
946 raise util.Abort(_("bookmark '%s' does not exist") %
946 raise util.Abort(_("bookmark '%s' does not exist") %
947 mark)
947 mark)
948 if mark == repo._bookmarkcurrent:
948 if mark == repo._bookmarkcurrent:
949 bookmarks.unsetcurrent(repo)
949 bookmarks.unsetcurrent(repo)
950 del marks[mark]
950 del marks[mark]
951 marks.write()
951 marks.write()
952
952
953 elif rename:
953 elif rename:
954 if not names:
954 if not names:
955 raise util.Abort(_("new bookmark name required"))
955 raise util.Abort(_("new bookmark name required"))
956 elif len(names) > 1:
956 elif len(names) > 1:
957 raise util.Abort(_("only one new bookmark name allowed"))
957 raise util.Abort(_("only one new bookmark name allowed"))
958 mark = checkformat(names[0])
958 mark = checkformat(names[0])
959 if rename not in marks:
959 if rename not in marks:
960 raise util.Abort(_("bookmark '%s' does not exist") % rename)
960 raise util.Abort(_("bookmark '%s' does not exist") % rename)
961 checkconflict(repo, mark, cur, force)
961 checkconflict(repo, mark, cur, force)
962 marks[mark] = marks[rename]
962 marks[mark] = marks[rename]
963 if repo._bookmarkcurrent == rename and not inactive:
963 if repo._bookmarkcurrent == rename and not inactive:
964 bookmarks.setcurrent(repo, mark)
964 bookmarks.setcurrent(repo, mark)
965 del marks[rename]
965 del marks[rename]
966 marks.write()
966 marks.write()
967
967
968 elif names:
968 elif names:
969 newact = None
969 newact = None
970 for mark in names:
970 for mark in names:
971 mark = checkformat(mark)
971 mark = checkformat(mark)
972 if newact is None:
972 if newact is None:
973 newact = mark
973 newact = mark
974 if inactive and mark == repo._bookmarkcurrent:
974 if inactive and mark == repo._bookmarkcurrent:
975 bookmarks.unsetcurrent(repo)
975 bookmarks.unsetcurrent(repo)
976 return
976 return
977 tgt = cur
977 tgt = cur
978 if rev:
978 if rev:
979 tgt = scmutil.revsingle(repo, rev).node()
979 tgt = scmutil.revsingle(repo, rev).node()
980 checkconflict(repo, mark, cur, force, tgt)
980 checkconflict(repo, mark, cur, force, tgt)
981 marks[mark] = tgt
981 marks[mark] = tgt
982 if not inactive and cur == marks[newact] and not rev:
982 if not inactive and cur == marks[newact] and not rev:
983 bookmarks.setcurrent(repo, newact)
983 bookmarks.setcurrent(repo, newact)
984 elif cur != tgt and newact == repo._bookmarkcurrent:
984 elif cur != tgt and newact == repo._bookmarkcurrent:
985 bookmarks.unsetcurrent(repo)
985 bookmarks.unsetcurrent(repo)
986 marks.write()
986 marks.write()
987
987
988 elif inactive:
988 elif inactive:
989 if len(marks) == 0:
989 if len(marks) == 0:
990 ui.status(_("no bookmarks set\n"))
990 ui.status(_("no bookmarks set\n"))
991 elif not repo._bookmarkcurrent:
991 elif not repo._bookmarkcurrent:
992 ui.status(_("no active bookmark\n"))
992 ui.status(_("no active bookmark\n"))
993 else:
993 else:
994 bookmarks.unsetcurrent(repo)
994 bookmarks.unsetcurrent(repo)
995 finally:
995 finally:
996 wlock.release()
996 wlock.release()
997 else: # show bookmarks
997 else: # show bookmarks
998 fm = ui.formatter('bookmarks', opts)
998 fm = ui.formatter('bookmarks', opts)
999 hexfn = fm.hexfunc
999 hexfn = fm.hexfunc
1000 marks = repo._bookmarks
1000 marks = repo._bookmarks
1001 if len(marks) == 0 and not fm:
1001 if len(marks) == 0 and not fm:
1002 ui.status(_("no bookmarks set\n"))
1002 ui.status(_("no bookmarks set\n"))
1003 for bmark, n in sorted(marks.iteritems()):
1003 for bmark, n in sorted(marks.iteritems()):
1004 current = repo._bookmarkcurrent
1004 current = repo._bookmarkcurrent
1005 if bmark == current:
1005 if bmark == current:
1006 prefix, label = '*', 'bookmarks.current'
1006 prefix, label = '*', 'bookmarks.current'
1007 else:
1007 else:
1008 prefix, label = ' ', ''
1008 prefix, label = ' ', ''
1009
1009
1010 fm.startitem()
1010 fm.startitem()
1011 if not ui.quiet:
1011 if not ui.quiet:
1012 fm.plain(' %s ' % prefix, label=label)
1012 fm.plain(' %s ' % prefix, label=label)
1013 fm.write('bookmark', '%s', bmark, label=label)
1013 fm.write('bookmark', '%s', bmark, label=label)
1014 pad = " " * (25 - encoding.colwidth(bmark))
1014 pad = " " * (25 - encoding.colwidth(bmark))
1015 fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s',
1015 fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s',
1016 repo.changelog.rev(n), hexfn(n), label=label)
1016 repo.changelog.rev(n), hexfn(n), label=label)
1017 fm.data(active=(bmark == current))
1017 fm.data(active=(bmark == current))
1018 fm.plain('\n')
1018 fm.plain('\n')
1019 fm.end()
1019 fm.end()
1020
1020
1021 @command('branch',
1021 @command('branch',
1022 [('f', 'force', None,
1022 [('f', 'force', None,
1023 _('set branch name even if it shadows an existing branch')),
1023 _('set branch name even if it shadows an existing branch')),
1024 ('C', 'clean', None, _('reset branch name to parent branch name'))],
1024 ('C', 'clean', None, _('reset branch name to parent branch name'))],
1025 _('[-fC] [NAME]'))
1025 _('[-fC] [NAME]'))
1026 def branch(ui, repo, label=None, **opts):
1026 def branch(ui, repo, label=None, **opts):
1027 """set or show the current branch name
1027 """set or show the current branch name
1028
1028
1029 .. note::
1029 .. note::
1030
1030
1031 Branch names are permanent and global. Use :hg:`bookmark` to create a
1031 Branch names are permanent and global. Use :hg:`bookmark` to create a
1032 light-weight bookmark instead. See :hg:`help glossary` for more
1032 light-weight bookmark instead. See :hg:`help glossary` for more
1033 information about named branches and bookmarks.
1033 information about named branches and bookmarks.
1034
1034
1035 With no argument, show the current branch name. With one argument,
1035 With no argument, show the current branch name. With one argument,
1036 set the working directory branch name (the branch will not exist
1036 set the working directory branch name (the branch will not exist
1037 in the repository until the next commit). Standard practice
1037 in the repository until the next commit). Standard practice
1038 recommends that primary development take place on the 'default'
1038 recommends that primary development take place on the 'default'
1039 branch.
1039 branch.
1040
1040
1041 Unless -f/--force is specified, branch will not let you set a
1041 Unless -f/--force is specified, branch will not let you set a
1042 branch name that already exists.
1042 branch name that already exists.
1043
1043
1044 Use -C/--clean to reset the working directory branch to that of
1044 Use -C/--clean to reset the working directory branch to that of
1045 the parent of the working directory, negating a previous branch
1045 the parent of the working directory, negating a previous branch
1046 change.
1046 change.
1047
1047
1048 Use the command :hg:`update` to switch to an existing branch. Use
1048 Use the command :hg:`update` to switch to an existing branch. Use
1049 :hg:`commit --close-branch` to mark this branch as closed.
1049 :hg:`commit --close-branch` to mark this branch as closed.
1050
1050
1051 Returns 0 on success.
1051 Returns 0 on success.
1052 """
1052 """
1053 if label:
1053 if label:
1054 label = label.strip()
1054 label = label.strip()
1055
1055
1056 if not opts.get('clean') and not label:
1056 if not opts.get('clean') and not label:
1057 ui.write("%s\n" % repo.dirstate.branch())
1057 ui.write("%s\n" % repo.dirstate.branch())
1058 return
1058 return
1059
1059
1060 wlock = repo.wlock()
1060 wlock = repo.wlock()
1061 try:
1061 try:
1062 if opts.get('clean'):
1062 if opts.get('clean'):
1063 label = repo[None].p1().branch()
1063 label = repo[None].p1().branch()
1064 repo.dirstate.setbranch(label)
1064 repo.dirstate.setbranch(label)
1065 ui.status(_('reset working directory to branch %s\n') % label)
1065 ui.status(_('reset working directory to branch %s\n') % label)
1066 elif label:
1066 elif label:
1067 if not opts.get('force') and label in repo.branchmap():
1067 if not opts.get('force') and label in repo.branchmap():
1068 if label not in [p.branch() for p in repo.parents()]:
1068 if label not in [p.branch() for p in repo.parents()]:
1069 raise util.Abort(_('a branch of the same name already'
1069 raise util.Abort(_('a branch of the same name already'
1070 ' exists'),
1070 ' exists'),
1071 # i18n: "it" refers to an existing branch
1071 # i18n: "it" refers to an existing branch
1072 hint=_("use 'hg update' to switch to it"))
1072 hint=_("use 'hg update' to switch to it"))
1073 scmutil.checknewlabel(repo, label, 'branch')
1073 scmutil.checknewlabel(repo, label, 'branch')
1074 repo.dirstate.setbranch(label)
1074 repo.dirstate.setbranch(label)
1075 ui.status(_('marked working directory as branch %s\n') % label)
1075 ui.status(_('marked working directory as branch %s\n') % label)
1076 ui.status(_('(branches are permanent and global, '
1076 ui.status(_('(branches are permanent and global, '
1077 'did you want a bookmark?)\n'))
1077 'did you want a bookmark?)\n'))
1078 finally:
1078 finally:
1079 wlock.release()
1079 wlock.release()
1080
1080
1081 @command('branches',
1081 @command('branches',
1082 [('a', 'active', False,
1082 [('a', 'active', False,
1083 _('show only branches that have unmerged heads (DEPRECATED)')),
1083 _('show only branches that have unmerged heads (DEPRECATED)')),
1084 ('c', 'closed', False, _('show normal and closed branches')),
1084 ('c', 'closed', False, _('show normal and closed branches')),
1085 ] + formatteropts,
1085 ] + formatteropts,
1086 _('[-ac]'))
1086 _('[-ac]'))
1087 def branches(ui, repo, active=False, closed=False, **opts):
1087 def branches(ui, repo, active=False, closed=False, **opts):
1088 """list repository named branches
1088 """list repository named branches
1089
1089
1090 List the repository's named branches, indicating which ones are
1090 List the repository's named branches, indicating which ones are
1091 inactive. If -c/--closed is specified, also list branches which have
1091 inactive. If -c/--closed is specified, also list branches which have
1092 been marked closed (see :hg:`commit --close-branch`).
1092 been marked closed (see :hg:`commit --close-branch`).
1093
1093
1094 Use the command :hg:`update` to switch to an existing branch.
1094 Use the command :hg:`update` to switch to an existing branch.
1095
1095
1096 Returns 0.
1096 Returns 0.
1097 """
1097 """
1098
1098
1099 fm = ui.formatter('branches', opts)
1099 fm = ui.formatter('branches', opts)
1100 hexfunc = fm.hexfunc
1100 hexfunc = fm.hexfunc
1101
1101
1102 allheads = set(repo.heads())
1102 allheads = set(repo.heads())
1103 branches = []
1103 branches = []
1104 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1104 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1105 isactive = not isclosed and bool(set(heads) & allheads)
1105 isactive = not isclosed and bool(set(heads) & allheads)
1106 branches.append((tag, repo[tip], isactive, not isclosed))
1106 branches.append((tag, repo[tip], isactive, not isclosed))
1107 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1107 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1108 reverse=True)
1108 reverse=True)
1109
1109
1110 for tag, ctx, isactive, isopen in branches:
1110 for tag, ctx, isactive, isopen in branches:
1111 if active and not isactive:
1111 if active and not isactive:
1112 continue
1112 continue
1113 if isactive:
1113 if isactive:
1114 label = 'branches.active'
1114 label = 'branches.active'
1115 notice = ''
1115 notice = ''
1116 elif not isopen:
1116 elif not isopen:
1117 if not closed:
1117 if not closed:
1118 continue
1118 continue
1119 label = 'branches.closed'
1119 label = 'branches.closed'
1120 notice = _(' (closed)')
1120 notice = _(' (closed)')
1121 else:
1121 else:
1122 label = 'branches.inactive'
1122 label = 'branches.inactive'
1123 notice = _(' (inactive)')
1123 notice = _(' (inactive)')
1124 current = (tag == repo.dirstate.branch())
1124 current = (tag == repo.dirstate.branch())
1125 if current:
1125 if current:
1126 label = 'branches.current'
1126 label = 'branches.current'
1127
1127
1128 fm.startitem()
1128 fm.startitem()
1129 fm.write('branch', '%s', tag, label=label)
1129 fm.write('branch', '%s', tag, label=label)
1130 rev = ctx.rev()
1130 rev = ctx.rev()
1131 padsize = max(31 - len(str(rev)) - encoding.colwidth(tag), 0)
1131 padsize = max(31 - len(str(rev)) - encoding.colwidth(tag), 0)
1132 fmt = ' ' * padsize + ' %d:%s'
1132 fmt = ' ' * padsize + ' %d:%s'
1133 fm.condwrite(not ui.quiet, 'rev node', fmt, rev, hexfunc(ctx.node()),
1133 fm.condwrite(not ui.quiet, 'rev node', fmt, rev, hexfunc(ctx.node()),
1134 label='log.changeset changeset.%s' % ctx.phasestr())
1134 label='log.changeset changeset.%s' % ctx.phasestr())
1135 fm.data(active=isactive, closed=not isopen, current=current)
1135 fm.data(active=isactive, closed=not isopen, current=current)
1136 if not ui.quiet:
1136 if not ui.quiet:
1137 fm.plain(notice)
1137 fm.plain(notice)
1138 fm.plain('\n')
1138 fm.plain('\n')
1139 fm.end()
1139 fm.end()
1140
1140
1141 @command('bundle',
1141 @command('bundle',
1142 [('f', 'force', None, _('run even when the destination is unrelated')),
1142 [('f', 'force', None, _('run even when the destination is unrelated')),
1143 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1143 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1144 _('REV')),
1144 _('REV')),
1145 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1145 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1146 _('BRANCH')),
1146 _('BRANCH')),
1147 ('', 'base', [],
1147 ('', 'base', [],
1148 _('a base changeset assumed to be available at the destination'),
1148 _('a base changeset assumed to be available at the destination'),
1149 _('REV')),
1149 _('REV')),
1150 ('a', 'all', None, _('bundle all changesets in the repository')),
1150 ('a', 'all', None, _('bundle all changesets in the repository')),
1151 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1151 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1152 ] + remoteopts,
1152 ] + remoteopts,
1153 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1153 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1154 def bundle(ui, repo, fname, dest=None, **opts):
1154 def bundle(ui, repo, fname, dest=None, **opts):
1155 """create a changegroup file
1155 """create a changegroup file
1156
1156
1157 Generate a compressed changegroup file collecting changesets not
1157 Generate a compressed changegroup file collecting changesets not
1158 known to be in another repository.
1158 known to be in another repository.
1159
1159
1160 If you omit the destination repository, then hg assumes the
1160 If you omit the destination repository, then hg assumes the
1161 destination will have all the nodes you specify with --base
1161 destination will have all the nodes you specify with --base
1162 parameters. To create a bundle containing all changesets, use
1162 parameters. To create a bundle containing all changesets, use
1163 -a/--all (or --base null).
1163 -a/--all (or --base null).
1164
1164
1165 You can change compression method with the -t/--type option.
1165 You can change compression method with the -t/--type option.
1166 The available compression methods are: none, bzip2, and
1166 The available compression methods are: none, bzip2, and
1167 gzip (by default, bundles are compressed using bzip2).
1167 gzip (by default, bundles are compressed using bzip2).
1168
1168
1169 The bundle file can then be transferred using conventional means
1169 The bundle file can then be transferred using conventional means
1170 and applied to another repository with the unbundle or pull
1170 and applied to another repository with the unbundle or pull
1171 command. This is useful when direct push and pull are not
1171 command. This is useful when direct push and pull are not
1172 available or when exporting an entire repository is undesirable.
1172 available or when exporting an entire repository is undesirable.
1173
1173
1174 Applying bundles preserves all changeset contents including
1174 Applying bundles preserves all changeset contents including
1175 permissions, copy/rename information, and revision history.
1175 permissions, copy/rename information, and revision history.
1176
1176
1177 Returns 0 on success, 1 if no changes found.
1177 Returns 0 on success, 1 if no changes found.
1178 """
1178 """
1179 revs = None
1179 revs = None
1180 if 'rev' in opts:
1180 if 'rev' in opts:
1181 revs = scmutil.revrange(repo, opts['rev'])
1181 revs = scmutil.revrange(repo, opts['rev'])
1182
1182
1183 bundletype = opts.get('type', 'bzip2').lower()
1183 bundletype = opts.get('type', 'bzip2').lower()
1184 btypes = {'none': 'HG10UN',
1184 btypes = {'none': 'HG10UN',
1185 'bzip2': 'HG10BZ',
1185 'bzip2': 'HG10BZ',
1186 'gzip': 'HG10GZ',
1186 'gzip': 'HG10GZ',
1187 'bundle2': 'HG2Y'}
1187 'bundle2': 'HG2Y'}
1188 bundletype = btypes.get(bundletype)
1188 bundletype = btypes.get(bundletype)
1189 if bundletype not in changegroup.bundletypes:
1189 if bundletype not in changegroup.bundletypes:
1190 raise util.Abort(_('unknown bundle type specified with --type'))
1190 raise util.Abort(_('unknown bundle type specified with --type'))
1191
1191
1192 if opts.get('all'):
1192 if opts.get('all'):
1193 base = ['null']
1193 base = ['null']
1194 else:
1194 else:
1195 base = scmutil.revrange(repo, opts.get('base'))
1195 base = scmutil.revrange(repo, opts.get('base'))
1196 # TODO: get desired bundlecaps from command line.
1196 # TODO: get desired bundlecaps from command line.
1197 bundlecaps = None
1197 bundlecaps = None
1198 if base:
1198 if base:
1199 if dest:
1199 if dest:
1200 raise util.Abort(_("--base is incompatible with specifying "
1200 raise util.Abort(_("--base is incompatible with specifying "
1201 "a destination"))
1201 "a destination"))
1202 common = [repo.lookup(rev) for rev in base]
1202 common = [repo.lookup(rev) for rev in base]
1203 heads = revs and map(repo.lookup, revs) or revs
1203 heads = revs and map(repo.lookup, revs) or revs
1204 cg = changegroup.getchangegroup(repo, 'bundle', heads=heads,
1204 cg = changegroup.getchangegroup(repo, 'bundle', heads=heads,
1205 common=common, bundlecaps=bundlecaps)
1205 common=common, bundlecaps=bundlecaps)
1206 outgoing = None
1206 outgoing = None
1207 else:
1207 else:
1208 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1208 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1209 dest, branches = hg.parseurl(dest, opts.get('branch'))
1209 dest, branches = hg.parseurl(dest, opts.get('branch'))
1210 other = hg.peer(repo, opts, dest)
1210 other = hg.peer(repo, opts, dest)
1211 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1211 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1212 heads = revs and map(repo.lookup, revs) or revs
1212 heads = revs and map(repo.lookup, revs) or revs
1213 outgoing = discovery.findcommonoutgoing(repo, other,
1213 outgoing = discovery.findcommonoutgoing(repo, other,
1214 onlyheads=heads,
1214 onlyheads=heads,
1215 force=opts.get('force'),
1215 force=opts.get('force'),
1216 portable=True)
1216 portable=True)
1217 cg = changegroup.getlocalchangegroup(repo, 'bundle', outgoing,
1217 cg = changegroup.getlocalchangegroup(repo, 'bundle', outgoing,
1218 bundlecaps)
1218 bundlecaps)
1219 if not cg:
1219 if not cg:
1220 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1220 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1221 return 1
1221 return 1
1222
1222
1223 changegroup.writebundle(ui, cg, fname, bundletype)
1223 changegroup.writebundle(ui, cg, fname, bundletype)
1224
1224
1225 @command('cat',
1225 @command('cat',
1226 [('o', 'output', '',
1226 [('o', 'output', '',
1227 _('print output to file with formatted name'), _('FORMAT')),
1227 _('print output to file with formatted name'), _('FORMAT')),
1228 ('r', 'rev', '', _('print the given revision'), _('REV')),
1228 ('r', 'rev', '', _('print the given revision'), _('REV')),
1229 ('', 'decode', None, _('apply any matching decode filter')),
1229 ('', 'decode', None, _('apply any matching decode filter')),
1230 ] + walkopts,
1230 ] + walkopts,
1231 _('[OPTION]... FILE...'),
1231 _('[OPTION]... FILE...'),
1232 inferrepo=True)
1232 inferrepo=True)
1233 def cat(ui, repo, file1, *pats, **opts):
1233 def cat(ui, repo, file1, *pats, **opts):
1234 """output the current or given revision of files
1234 """output the current or given revision of files
1235
1235
1236 Print the specified files as they were at the given revision. If
1236 Print the specified files as they were at the given revision. If
1237 no revision is given, the parent of the working directory is used.
1237 no revision is given, the parent of the working directory is used.
1238
1238
1239 Output may be to a file, in which case the name of the file is
1239 Output may be to a file, in which case the name of the file is
1240 given using a format string. The formatting rules as follows:
1240 given using a format string. The formatting rules as follows:
1241
1241
1242 :``%%``: literal "%" character
1242 :``%%``: literal "%" character
1243 :``%s``: basename of file being printed
1243 :``%s``: basename of file being printed
1244 :``%d``: dirname of file being printed, or '.' if in repository root
1244 :``%d``: dirname of file being printed, or '.' if in repository root
1245 :``%p``: root-relative path name of file being printed
1245 :``%p``: root-relative path name of file being printed
1246 :``%H``: changeset hash (40 hexadecimal digits)
1246 :``%H``: changeset hash (40 hexadecimal digits)
1247 :``%R``: changeset revision number
1247 :``%R``: changeset revision number
1248 :``%h``: short-form changeset hash (12 hexadecimal digits)
1248 :``%h``: short-form changeset hash (12 hexadecimal digits)
1249 :``%r``: zero-padded changeset revision number
1249 :``%r``: zero-padded changeset revision number
1250 :``%b``: basename of the exporting repository
1250 :``%b``: basename of the exporting repository
1251
1251
1252 Returns 0 on success.
1252 Returns 0 on success.
1253 """
1253 """
1254 ctx = scmutil.revsingle(repo, opts.get('rev'))
1254 ctx = scmutil.revsingle(repo, opts.get('rev'))
1255 m = scmutil.match(ctx, (file1,) + pats, opts)
1255 m = scmutil.match(ctx, (file1,) + pats, opts)
1256
1256
1257 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1257 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1258
1258
1259 @command('^clone',
1259 @command('^clone',
1260 [('U', 'noupdate', None,
1260 [('U', 'noupdate', None,
1261 _('the clone will include an empty working copy (only a repository)')),
1261 _('the clone will include an empty working copy (only a repository)')),
1262 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1262 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1263 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1263 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1264 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1264 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1265 ('', 'pull', None, _('use pull protocol to copy metadata')),
1265 ('', 'pull', None, _('use pull protocol to copy metadata')),
1266 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1266 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1267 ] + remoteopts,
1267 ] + remoteopts,
1268 _('[OPTION]... SOURCE [DEST]'),
1268 _('[OPTION]... SOURCE [DEST]'),
1269 norepo=True)
1269 norepo=True)
1270 def clone(ui, source, dest=None, **opts):
1270 def clone(ui, source, dest=None, **opts):
1271 """make a copy of an existing repository
1271 """make a copy of an existing repository
1272
1272
1273 Create a copy of an existing repository in a new directory.
1273 Create a copy of an existing repository in a new directory.
1274
1274
1275 If no destination directory name is specified, it defaults to the
1275 If no destination directory name is specified, it defaults to the
1276 basename of the source.
1276 basename of the source.
1277
1277
1278 The location of the source is added to the new repository's
1278 The location of the source is added to the new repository's
1279 ``.hg/hgrc`` file, as the default to be used for future pulls.
1279 ``.hg/hgrc`` file, as the default to be used for future pulls.
1280
1280
1281 Only local paths and ``ssh://`` URLs are supported as
1281 Only local paths and ``ssh://`` URLs are supported as
1282 destinations. For ``ssh://`` destinations, no working directory or
1282 destinations. For ``ssh://`` destinations, no working directory or
1283 ``.hg/hgrc`` will be created on the remote side.
1283 ``.hg/hgrc`` will be created on the remote side.
1284
1284
1285 To pull only a subset of changesets, specify one or more revisions
1285 To pull only a subset of changesets, specify one or more revisions
1286 identifiers with -r/--rev or branches with -b/--branch. The
1286 identifiers with -r/--rev or branches with -b/--branch. The
1287 resulting clone will contain only the specified changesets and
1287 resulting clone will contain only the specified changesets and
1288 their ancestors. These options (or 'clone src#rev dest') imply
1288 their ancestors. These options (or 'clone src#rev dest') imply
1289 --pull, even for local source repositories. Note that specifying a
1289 --pull, even for local source repositories. Note that specifying a
1290 tag will include the tagged changeset but not the changeset
1290 tag will include the tagged changeset but not the changeset
1291 containing the tag.
1291 containing the tag.
1292
1292
1293 If the source repository has a bookmark called '@' set, that
1293 If the source repository has a bookmark called '@' set, that
1294 revision will be checked out in the new repository by default.
1294 revision will be checked out in the new repository by default.
1295
1295
1296 To check out a particular version, use -u/--update, or
1296 To check out a particular version, use -u/--update, or
1297 -U/--noupdate to create a clone with no working directory.
1297 -U/--noupdate to create a clone with no working directory.
1298
1298
1299 .. container:: verbose
1299 .. container:: verbose
1300
1300
1301 For efficiency, hardlinks are used for cloning whenever the
1301 For efficiency, hardlinks are used for cloning whenever the
1302 source and destination are on the same filesystem (note this
1302 source and destination are on the same filesystem (note this
1303 applies only to the repository data, not to the working
1303 applies only to the repository data, not to the working
1304 directory). Some filesystems, such as AFS, implement hardlinking
1304 directory). Some filesystems, such as AFS, implement hardlinking
1305 incorrectly, but do not report errors. In these cases, use the
1305 incorrectly, but do not report errors. In these cases, use the
1306 --pull option to avoid hardlinking.
1306 --pull option to avoid hardlinking.
1307
1307
1308 In some cases, you can clone repositories and the working
1308 In some cases, you can clone repositories and the working
1309 directory using full hardlinks with ::
1309 directory using full hardlinks with ::
1310
1310
1311 $ cp -al REPO REPOCLONE
1311 $ cp -al REPO REPOCLONE
1312
1312
1313 This is the fastest way to clone, but it is not always safe. The
1313 This is the fastest way to clone, but it is not always safe. The
1314 operation is not atomic (making sure REPO is not modified during
1314 operation is not atomic (making sure REPO is not modified during
1315 the operation is up to you) and you have to make sure your
1315 the operation is up to you) and you have to make sure your
1316 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1316 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1317 so). Also, this is not compatible with certain extensions that
1317 so). Also, this is not compatible with certain extensions that
1318 place their metadata under the .hg directory, such as mq.
1318 place their metadata under the .hg directory, such as mq.
1319
1319
1320 Mercurial will update the working directory to the first applicable
1320 Mercurial will update the working directory to the first applicable
1321 revision from this list:
1321 revision from this list:
1322
1322
1323 a) null if -U or the source repository has no changesets
1323 a) null if -U or the source repository has no changesets
1324 b) if -u . and the source repository is local, the first parent of
1324 b) if -u . and the source repository is local, the first parent of
1325 the source repository's working directory
1325 the source repository's working directory
1326 c) the changeset specified with -u (if a branch name, this means the
1326 c) the changeset specified with -u (if a branch name, this means the
1327 latest head of that branch)
1327 latest head of that branch)
1328 d) the changeset specified with -r
1328 d) the changeset specified with -r
1329 e) the tipmost head specified with -b
1329 e) the tipmost head specified with -b
1330 f) the tipmost head specified with the url#branch source syntax
1330 f) the tipmost head specified with the url#branch source syntax
1331 g) the revision marked with the '@' bookmark, if present
1331 g) the revision marked with the '@' bookmark, if present
1332 h) the tipmost head of the default branch
1332 h) the tipmost head of the default branch
1333 i) tip
1333 i) tip
1334
1334
1335 Examples:
1335 Examples:
1336
1336
1337 - clone a remote repository to a new directory named hg/::
1337 - clone a remote repository to a new directory named hg/::
1338
1338
1339 hg clone http://selenic.com/hg
1339 hg clone http://selenic.com/hg
1340
1340
1341 - create a lightweight local clone::
1341 - create a lightweight local clone::
1342
1342
1343 hg clone project/ project-feature/
1343 hg clone project/ project-feature/
1344
1344
1345 - clone from an absolute path on an ssh server (note double-slash)::
1345 - clone from an absolute path on an ssh server (note double-slash)::
1346
1346
1347 hg clone ssh://user@server//home/projects/alpha/
1347 hg clone ssh://user@server//home/projects/alpha/
1348
1348
1349 - do a high-speed clone over a LAN while checking out a
1349 - do a high-speed clone over a LAN while checking out a
1350 specified version::
1350 specified version::
1351
1351
1352 hg clone --uncompressed http://server/repo -u 1.5
1352 hg clone --uncompressed http://server/repo -u 1.5
1353
1353
1354 - create a repository without changesets after a particular revision::
1354 - create a repository without changesets after a particular revision::
1355
1355
1356 hg clone -r 04e544 experimental/ good/
1356 hg clone -r 04e544 experimental/ good/
1357
1357
1358 - clone (and track) a particular named branch::
1358 - clone (and track) a particular named branch::
1359
1359
1360 hg clone http://selenic.com/hg#stable
1360 hg clone http://selenic.com/hg#stable
1361
1361
1362 See :hg:`help urls` for details on specifying URLs.
1362 See :hg:`help urls` for details on specifying URLs.
1363
1363
1364 Returns 0 on success.
1364 Returns 0 on success.
1365 """
1365 """
1366 if opts.get('noupdate') and opts.get('updaterev'):
1366 if opts.get('noupdate') and opts.get('updaterev'):
1367 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
1367 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
1368
1368
1369 r = hg.clone(ui, opts, source, dest,
1369 r = hg.clone(ui, opts, source, dest,
1370 pull=opts.get('pull'),
1370 pull=opts.get('pull'),
1371 stream=opts.get('uncompressed'),
1371 stream=opts.get('uncompressed'),
1372 rev=opts.get('rev'),
1372 rev=opts.get('rev'),
1373 update=opts.get('updaterev') or not opts.get('noupdate'),
1373 update=opts.get('updaterev') or not opts.get('noupdate'),
1374 branch=opts.get('branch'))
1374 branch=opts.get('branch'))
1375
1375
1376 return r is None
1376 return r is None
1377
1377
1378 @command('^commit|ci',
1378 @command('^commit|ci',
1379 [('A', 'addremove', None,
1379 [('A', 'addremove', None,
1380 _('mark new/missing files as added/removed before committing')),
1380 _('mark new/missing files as added/removed before committing')),
1381 ('', 'close-branch', None,
1381 ('', 'close-branch', None,
1382 _('mark a branch as closed, hiding it from the branch list')),
1382 _('mark a branch as closed, hiding it from the branch list')),
1383 ('', 'amend', None, _('amend the parent of the working dir')),
1383 ('', 'amend', None, _('amend the parent of the working dir')),
1384 ('s', 'secret', None, _('use the secret phase for committing')),
1384 ('s', 'secret', None, _('use the secret phase for committing')),
1385 ('e', 'edit', None, _('invoke editor on commit messages')),
1385 ('e', 'edit', None, _('invoke editor on commit messages')),
1386 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1386 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1387 _('[OPTION]... [FILE]...'),
1387 _('[OPTION]... [FILE]...'),
1388 inferrepo=True)
1388 inferrepo=True)
1389 def commit(ui, repo, *pats, **opts):
1389 def commit(ui, repo, *pats, **opts):
1390 """commit the specified files or all outstanding changes
1390 """commit the specified files or all outstanding changes
1391
1391
1392 Commit changes to the given files into the repository. Unlike a
1392 Commit changes to the given files into the repository. Unlike a
1393 centralized SCM, this operation is a local operation. See
1393 centralized SCM, this operation is a local operation. See
1394 :hg:`push` for a way to actively distribute your changes.
1394 :hg:`push` for a way to actively distribute your changes.
1395
1395
1396 If a list of files is omitted, all changes reported by :hg:`status`
1396 If a list of files is omitted, all changes reported by :hg:`status`
1397 will be committed.
1397 will be committed.
1398
1398
1399 If you are committing the result of a merge, do not provide any
1399 If you are committing the result of a merge, do not provide any
1400 filenames or -I/-X filters.
1400 filenames or -I/-X filters.
1401
1401
1402 If no commit message is specified, Mercurial starts your
1402 If no commit message is specified, Mercurial starts your
1403 configured editor where you can enter a message. In case your
1403 configured editor where you can enter a message. In case your
1404 commit fails, you will find a backup of your message in
1404 commit fails, you will find a backup of your message in
1405 ``.hg/last-message.txt``.
1405 ``.hg/last-message.txt``.
1406
1406
1407 The --amend flag can be used to amend the parent of the
1407 The --amend flag can be used to amend the parent of the
1408 working directory with a new commit that contains the changes
1408 working directory with a new commit that contains the changes
1409 in the parent in addition to those currently reported by :hg:`status`,
1409 in the parent in addition to those currently reported by :hg:`status`,
1410 if there are any. The old commit is stored in a backup bundle in
1410 if there are any. The old commit is stored in a backup bundle in
1411 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1411 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1412 on how to restore it).
1412 on how to restore it).
1413
1413
1414 Message, user and date are taken from the amended commit unless
1414 Message, user and date are taken from the amended commit unless
1415 specified. When a message isn't specified on the command line,
1415 specified. When a message isn't specified on the command line,
1416 the editor will open with the message of the amended commit.
1416 the editor will open with the message of the amended commit.
1417
1417
1418 It is not possible to amend public changesets (see :hg:`help phases`)
1418 It is not possible to amend public changesets (see :hg:`help phases`)
1419 or changesets that have children.
1419 or changesets that have children.
1420
1420
1421 See :hg:`help dates` for a list of formats valid for -d/--date.
1421 See :hg:`help dates` for a list of formats valid for -d/--date.
1422
1422
1423 Returns 0 on success, 1 if nothing changed.
1423 Returns 0 on success, 1 if nothing changed.
1424 """
1424 """
1425 if opts.get('subrepos'):
1425 if opts.get('subrepos'):
1426 if opts.get('amend'):
1426 if opts.get('amend'):
1427 raise util.Abort(_('cannot amend with --subrepos'))
1427 raise util.Abort(_('cannot amend with --subrepos'))
1428 # Let --subrepos on the command line override config setting.
1428 # Let --subrepos on the command line override config setting.
1429 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1429 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1430
1430
1431 cmdutil.checkunfinished(repo, commit=True)
1431 cmdutil.checkunfinished(repo, commit=True)
1432
1432
1433 branch = repo[None].branch()
1433 branch = repo[None].branch()
1434 bheads = repo.branchheads(branch)
1434 bheads = repo.branchheads(branch)
1435
1435
1436 extra = {}
1436 extra = {}
1437 if opts.get('close_branch'):
1437 if opts.get('close_branch'):
1438 extra['close'] = 1
1438 extra['close'] = 1
1439
1439
1440 if not bheads:
1440 if not bheads:
1441 raise util.Abort(_('can only close branch heads'))
1441 raise util.Abort(_('can only close branch heads'))
1442 elif opts.get('amend'):
1442 elif opts.get('amend'):
1443 if repo.parents()[0].p1().branch() != branch and \
1443 if repo.parents()[0].p1().branch() != branch and \
1444 repo.parents()[0].p2().branch() != branch:
1444 repo.parents()[0].p2().branch() != branch:
1445 raise util.Abort(_('can only close branch heads'))
1445 raise util.Abort(_('can only close branch heads'))
1446
1446
1447 if opts.get('amend'):
1447 if opts.get('amend'):
1448 if ui.configbool('ui', 'commitsubrepos'):
1448 if ui.configbool('ui', 'commitsubrepos'):
1449 raise util.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1449 raise util.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1450
1450
1451 old = repo['.']
1451 old = repo['.']
1452 if not old.mutable():
1452 if not old.mutable():
1453 raise util.Abort(_('cannot amend public changesets'))
1453 raise util.Abort(_('cannot amend public changesets'))
1454 if len(repo[None].parents()) > 1:
1454 if len(repo[None].parents()) > 1:
1455 raise util.Abort(_('cannot amend while merging'))
1455 raise util.Abort(_('cannot amend while merging'))
1456 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
1456 allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
1457 if not allowunstable and old.children():
1457 if not allowunstable and old.children():
1458 raise util.Abort(_('cannot amend changeset with children'))
1458 raise util.Abort(_('cannot amend changeset with children'))
1459
1459
1460 # commitfunc is used only for temporary amend commit by cmdutil.amend
1460 # commitfunc is used only for temporary amend commit by cmdutil.amend
1461 def commitfunc(ui, repo, message, match, opts):
1461 def commitfunc(ui, repo, message, match, opts):
1462 return repo.commit(message,
1462 return repo.commit(message,
1463 opts.get('user') or old.user(),
1463 opts.get('user') or old.user(),
1464 opts.get('date') or old.date(),
1464 opts.get('date') or old.date(),
1465 match,
1465 match,
1466 extra=extra)
1466 extra=extra)
1467
1467
1468 current = repo._bookmarkcurrent
1468 current = repo._bookmarkcurrent
1469 marks = old.bookmarks()
1469 marks = old.bookmarks()
1470 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1470 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1471 if node == old.node():
1471 if node == old.node():
1472 ui.status(_("nothing changed\n"))
1472 ui.status(_("nothing changed\n"))
1473 return 1
1473 return 1
1474 elif marks:
1474 elif marks:
1475 ui.debug('moving bookmarks %r from %s to %s\n' %
1475 ui.debug('moving bookmarks %r from %s to %s\n' %
1476 (marks, old.hex(), hex(node)))
1476 (marks, old.hex(), hex(node)))
1477 newmarks = repo._bookmarks
1477 newmarks = repo._bookmarks
1478 for bm in marks:
1478 for bm in marks:
1479 newmarks[bm] = node
1479 newmarks[bm] = node
1480 if bm == current:
1480 if bm == current:
1481 bookmarks.setcurrent(repo, bm)
1481 bookmarks.setcurrent(repo, bm)
1482 newmarks.write()
1482 newmarks.write()
1483 else:
1483 else:
1484 def commitfunc(ui, repo, message, match, opts):
1484 def commitfunc(ui, repo, message, match, opts):
1485 backup = ui.backupconfig('phases', 'new-commit')
1485 backup = ui.backupconfig('phases', 'new-commit')
1486 baseui = repo.baseui
1486 baseui = repo.baseui
1487 basebackup = baseui.backupconfig('phases', 'new-commit')
1487 basebackup = baseui.backupconfig('phases', 'new-commit')
1488 try:
1488 try:
1489 if opts.get('secret'):
1489 if opts.get('secret'):
1490 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1490 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1491 # Propagate to subrepos
1491 # Propagate to subrepos
1492 baseui.setconfig('phases', 'new-commit', 'secret', 'commit')
1492 baseui.setconfig('phases', 'new-commit', 'secret', 'commit')
1493
1493
1494 editform = cmdutil.mergeeditform(repo[None], 'commit.normal')
1494 editform = cmdutil.mergeeditform(repo[None], 'commit.normal')
1495 editor = cmdutil.getcommiteditor(editform=editform, **opts)
1495 editor = cmdutil.getcommiteditor(editform=editform, **opts)
1496 return repo.commit(message, opts.get('user'), opts.get('date'),
1496 return repo.commit(message, opts.get('user'), opts.get('date'),
1497 match,
1497 match,
1498 editor=editor,
1498 editor=editor,
1499 extra=extra)
1499 extra=extra)
1500 finally:
1500 finally:
1501 ui.restoreconfig(backup)
1501 ui.restoreconfig(backup)
1502 repo.baseui.restoreconfig(basebackup)
1502 repo.baseui.restoreconfig(basebackup)
1503
1503
1504
1504
1505 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1505 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1506
1506
1507 if not node:
1507 if not node:
1508 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1508 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1509 if stat[3]:
1509 if stat[3]:
1510 ui.status(_("nothing changed (%d missing files, see "
1510 ui.status(_("nothing changed (%d missing files, see "
1511 "'hg status')\n") % len(stat[3]))
1511 "'hg status')\n") % len(stat[3]))
1512 else:
1512 else:
1513 ui.status(_("nothing changed\n"))
1513 ui.status(_("nothing changed\n"))
1514 return 1
1514 return 1
1515
1515
1516 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1516 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1517
1517
1518 @command('config|showconfig|debugconfig',
1518 @command('config|showconfig|debugconfig',
1519 [('u', 'untrusted', None, _('show untrusted configuration options')),
1519 [('u', 'untrusted', None, _('show untrusted configuration options')),
1520 ('e', 'edit', None, _('edit user config')),
1520 ('e', 'edit', None, _('edit user config')),
1521 ('l', 'local', None, _('edit repository config')),
1521 ('l', 'local', None, _('edit repository config')),
1522 ('g', 'global', None, _('edit global config'))],
1522 ('g', 'global', None, _('edit global config'))],
1523 _('[-u] [NAME]...'),
1523 _('[-u] [NAME]...'),
1524 optionalrepo=True)
1524 optionalrepo=True)
1525 def config(ui, repo, *values, **opts):
1525 def config(ui, repo, *values, **opts):
1526 """show combined config settings from all hgrc files
1526 """show combined config settings from all hgrc files
1527
1527
1528 With no arguments, print names and values of all config items.
1528 With no arguments, print names and values of all config items.
1529
1529
1530 With one argument of the form section.name, print just the value
1530 With one argument of the form section.name, print just the value
1531 of that config item.
1531 of that config item.
1532
1532
1533 With multiple arguments, print names and values of all config
1533 With multiple arguments, print names and values of all config
1534 items with matching section names.
1534 items with matching section names.
1535
1535
1536 With --edit, start an editor on the user-level config file. With
1536 With --edit, start an editor on the user-level config file. With
1537 --global, edit the system-wide config file. With --local, edit the
1537 --global, edit the system-wide config file. With --local, edit the
1538 repository-level config file.
1538 repository-level config file.
1539
1539
1540 With --debug, the source (filename and line number) is printed
1540 With --debug, the source (filename and line number) is printed
1541 for each config item.
1541 for each config item.
1542
1542
1543 See :hg:`help config` for more information about config files.
1543 See :hg:`help config` for more information about config files.
1544
1544
1545 Returns 0 on success, 1 if NAME does not exist.
1545 Returns 0 on success, 1 if NAME does not exist.
1546
1546
1547 """
1547 """
1548
1548
1549 if opts.get('edit') or opts.get('local') or opts.get('global'):
1549 if opts.get('edit') or opts.get('local') or opts.get('global'):
1550 if opts.get('local') and opts.get('global'):
1550 if opts.get('local') and opts.get('global'):
1551 raise util.Abort(_("can't use --local and --global together"))
1551 raise util.Abort(_("can't use --local and --global together"))
1552
1552
1553 if opts.get('local'):
1553 if opts.get('local'):
1554 if not repo:
1554 if not repo:
1555 raise util.Abort(_("can't use --local outside a repository"))
1555 raise util.Abort(_("can't use --local outside a repository"))
1556 paths = [repo.join('hgrc')]
1556 paths = [repo.join('hgrc')]
1557 elif opts.get('global'):
1557 elif opts.get('global'):
1558 paths = scmutil.systemrcpath()
1558 paths = scmutil.systemrcpath()
1559 else:
1559 else:
1560 paths = scmutil.userrcpath()
1560 paths = scmutil.userrcpath()
1561
1561
1562 for f in paths:
1562 for f in paths:
1563 if os.path.exists(f):
1563 if os.path.exists(f):
1564 break
1564 break
1565 else:
1565 else:
1566 if opts.get('global'):
1566 if opts.get('global'):
1567 samplehgrc = uimod.samplehgrcs['global']
1567 samplehgrc = uimod.samplehgrcs['global']
1568 elif opts.get('local'):
1568 elif opts.get('local'):
1569 samplehgrc = uimod.samplehgrcs['local']
1569 samplehgrc = uimod.samplehgrcs['local']
1570 else:
1570 else:
1571 samplehgrc = uimod.samplehgrcs['user']
1571 samplehgrc = uimod.samplehgrcs['user']
1572
1572
1573 f = paths[0]
1573 f = paths[0]
1574 fp = open(f, "w")
1574 fp = open(f, "w")
1575 fp.write(samplehgrc)
1575 fp.write(samplehgrc)
1576 fp.close()
1576 fp.close()
1577
1577
1578 editor = ui.geteditor()
1578 editor = ui.geteditor()
1579 ui.system("%s \"%s\"" % (editor, f),
1579 ui.system("%s \"%s\"" % (editor, f),
1580 onerr=util.Abort, errprefix=_("edit failed"))
1580 onerr=util.Abort, errprefix=_("edit failed"))
1581 return
1581 return
1582
1582
1583 for f in scmutil.rcpath():
1583 for f in scmutil.rcpath():
1584 ui.debug('read config from: %s\n' % f)
1584 ui.debug('read config from: %s\n' % f)
1585 untrusted = bool(opts.get('untrusted'))
1585 untrusted = bool(opts.get('untrusted'))
1586 if values:
1586 if values:
1587 sections = [v for v in values if '.' not in v]
1587 sections = [v for v in values if '.' not in v]
1588 items = [v for v in values if '.' in v]
1588 items = [v for v in values if '.' in v]
1589 if len(items) > 1 or items and sections:
1589 if len(items) > 1 or items and sections:
1590 raise util.Abort(_('only one config item permitted'))
1590 raise util.Abort(_('only one config item permitted'))
1591 matched = False
1591 matched = False
1592 for section, name, value in ui.walkconfig(untrusted=untrusted):
1592 for section, name, value in ui.walkconfig(untrusted=untrusted):
1593 value = str(value).replace('\n', '\\n')
1593 value = str(value).replace('\n', '\\n')
1594 sectname = section + '.' + name
1594 sectname = section + '.' + name
1595 if values:
1595 if values:
1596 for v in values:
1596 for v in values:
1597 if v == section:
1597 if v == section:
1598 ui.debug('%s: ' %
1598 ui.debug('%s: ' %
1599 ui.configsource(section, name, untrusted))
1599 ui.configsource(section, name, untrusted))
1600 ui.write('%s=%s\n' % (sectname, value))
1600 ui.write('%s=%s\n' % (sectname, value))
1601 matched = True
1601 matched = True
1602 elif v == sectname:
1602 elif v == sectname:
1603 ui.debug('%s: ' %
1603 ui.debug('%s: ' %
1604 ui.configsource(section, name, untrusted))
1604 ui.configsource(section, name, untrusted))
1605 ui.write(value, '\n')
1605 ui.write(value, '\n')
1606 matched = True
1606 matched = True
1607 else:
1607 else:
1608 ui.debug('%s: ' %
1608 ui.debug('%s: ' %
1609 ui.configsource(section, name, untrusted))
1609 ui.configsource(section, name, untrusted))
1610 ui.write('%s=%s\n' % (sectname, value))
1610 ui.write('%s=%s\n' % (sectname, value))
1611 matched = True
1611 matched = True
1612 if matched:
1612 if matched:
1613 return 0
1613 return 0
1614 return 1
1614 return 1
1615
1615
1616 @command('copy|cp',
1616 @command('copy|cp',
1617 [('A', 'after', None, _('record a copy that has already occurred')),
1617 [('A', 'after', None, _('record a copy that has already occurred')),
1618 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1618 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1619 ] + walkopts + dryrunopts,
1619 ] + walkopts + dryrunopts,
1620 _('[OPTION]... [SOURCE]... DEST'))
1620 _('[OPTION]... [SOURCE]... DEST'))
1621 def copy(ui, repo, *pats, **opts):
1621 def copy(ui, repo, *pats, **opts):
1622 """mark files as copied for the next commit
1622 """mark files as copied for the next commit
1623
1623
1624 Mark dest as having copies of source files. If dest is a
1624 Mark dest as having copies of source files. If dest is a
1625 directory, copies are put in that directory. If dest is a file,
1625 directory, copies are put in that directory. If dest is a file,
1626 the source must be a single file.
1626 the source must be a single file.
1627
1627
1628 By default, this command copies the contents of files as they
1628 By default, this command copies the contents of files as they
1629 exist in the working directory. If invoked with -A/--after, the
1629 exist in the working directory. If invoked with -A/--after, the
1630 operation is recorded, but no copying is performed.
1630 operation is recorded, but no copying is performed.
1631
1631
1632 This command takes effect with the next commit. To undo a copy
1632 This command takes effect with the next commit. To undo a copy
1633 before that, see :hg:`revert`.
1633 before that, see :hg:`revert`.
1634
1634
1635 Returns 0 on success, 1 if errors are encountered.
1635 Returns 0 on success, 1 if errors are encountered.
1636 """
1636 """
1637 wlock = repo.wlock(False)
1637 wlock = repo.wlock(False)
1638 try:
1638 try:
1639 return cmdutil.copy(ui, repo, pats, opts)
1639 return cmdutil.copy(ui, repo, pats, opts)
1640 finally:
1640 finally:
1641 wlock.release()
1641 wlock.release()
1642
1642
1643 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1643 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1644 def debugancestor(ui, repo, *args):
1644 def debugancestor(ui, repo, *args):
1645 """find the ancestor revision of two revisions in a given index"""
1645 """find the ancestor revision of two revisions in a given index"""
1646 if len(args) == 3:
1646 if len(args) == 3:
1647 index, rev1, rev2 = args
1647 index, rev1, rev2 = args
1648 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1648 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1649 lookup = r.lookup
1649 lookup = r.lookup
1650 elif len(args) == 2:
1650 elif len(args) == 2:
1651 if not repo:
1651 if not repo:
1652 raise util.Abort(_("there is no Mercurial repository here "
1652 raise util.Abort(_("there is no Mercurial repository here "
1653 "(.hg not found)"))
1653 "(.hg not found)"))
1654 rev1, rev2 = args
1654 rev1, rev2 = args
1655 r = repo.changelog
1655 r = repo.changelog
1656 lookup = repo.lookup
1656 lookup = repo.lookup
1657 else:
1657 else:
1658 raise util.Abort(_('either two or three arguments required'))
1658 raise util.Abort(_('either two or three arguments required'))
1659 a = r.ancestor(lookup(rev1), lookup(rev2))
1659 a = r.ancestor(lookup(rev1), lookup(rev2))
1660 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1660 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1661
1661
1662 @command('debugbuilddag',
1662 @command('debugbuilddag',
1663 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1663 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1664 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1664 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1665 ('n', 'new-file', None, _('add new file at each rev'))],
1665 ('n', 'new-file', None, _('add new file at each rev'))],
1666 _('[OPTION]... [TEXT]'))
1666 _('[OPTION]... [TEXT]'))
1667 def debugbuilddag(ui, repo, text=None,
1667 def debugbuilddag(ui, repo, text=None,
1668 mergeable_file=False,
1668 mergeable_file=False,
1669 overwritten_file=False,
1669 overwritten_file=False,
1670 new_file=False):
1670 new_file=False):
1671 """builds a repo with a given DAG from scratch in the current empty repo
1671 """builds a repo with a given DAG from scratch in the current empty repo
1672
1672
1673 The description of the DAG is read from stdin if not given on the
1673 The description of the DAG is read from stdin if not given on the
1674 command line.
1674 command line.
1675
1675
1676 Elements:
1676 Elements:
1677
1677
1678 - "+n" is a linear run of n nodes based on the current default parent
1678 - "+n" is a linear run of n nodes based on the current default parent
1679 - "." is a single node based on the current default parent
1679 - "." is a single node based on the current default parent
1680 - "$" resets the default parent to null (implied at the start);
1680 - "$" resets the default parent to null (implied at the start);
1681 otherwise the default parent is always the last node created
1681 otherwise the default parent is always the last node created
1682 - "<p" sets the default parent to the backref p
1682 - "<p" sets the default parent to the backref p
1683 - "*p" is a fork at parent p, which is a backref
1683 - "*p" is a fork at parent p, which is a backref
1684 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1684 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1685 - "/p2" is a merge of the preceding node and p2
1685 - "/p2" is a merge of the preceding node and p2
1686 - ":tag" defines a local tag for the preceding node
1686 - ":tag" defines a local tag for the preceding node
1687 - "@branch" sets the named branch for subsequent nodes
1687 - "@branch" sets the named branch for subsequent nodes
1688 - "#...\\n" is a comment up to the end of the line
1688 - "#...\\n" is a comment up to the end of the line
1689
1689
1690 Whitespace between the above elements is ignored.
1690 Whitespace between the above elements is ignored.
1691
1691
1692 A backref is either
1692 A backref is either
1693
1693
1694 - a number n, which references the node curr-n, where curr is the current
1694 - a number n, which references the node curr-n, where curr is the current
1695 node, or
1695 node, or
1696 - the name of a local tag you placed earlier using ":tag", or
1696 - the name of a local tag you placed earlier using ":tag", or
1697 - empty to denote the default parent.
1697 - empty to denote the default parent.
1698
1698
1699 All string valued-elements are either strictly alphanumeric, or must
1699 All string valued-elements are either strictly alphanumeric, or must
1700 be enclosed in double quotes ("..."), with "\\" as escape character.
1700 be enclosed in double quotes ("..."), with "\\" as escape character.
1701 """
1701 """
1702
1702
1703 if text is None:
1703 if text is None:
1704 ui.status(_("reading DAG from stdin\n"))
1704 ui.status(_("reading DAG from stdin\n"))
1705 text = ui.fin.read()
1705 text = ui.fin.read()
1706
1706
1707 cl = repo.changelog
1707 cl = repo.changelog
1708 if len(cl) > 0:
1708 if len(cl) > 0:
1709 raise util.Abort(_('repository is not empty'))
1709 raise util.Abort(_('repository is not empty'))
1710
1710
1711 # determine number of revs in DAG
1711 # determine number of revs in DAG
1712 total = 0
1712 total = 0
1713 for type, data in dagparser.parsedag(text):
1713 for type, data in dagparser.parsedag(text):
1714 if type == 'n':
1714 if type == 'n':
1715 total += 1
1715 total += 1
1716
1716
1717 if mergeable_file:
1717 if mergeable_file:
1718 linesperrev = 2
1718 linesperrev = 2
1719 # make a file with k lines per rev
1719 # make a file with k lines per rev
1720 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1720 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1721 initialmergedlines.append("")
1721 initialmergedlines.append("")
1722
1722
1723 tags = []
1723 tags = []
1724
1724
1725 lock = tr = None
1725 lock = tr = None
1726 try:
1726 try:
1727 lock = repo.lock()
1727 lock = repo.lock()
1728 tr = repo.transaction("builddag")
1728 tr = repo.transaction("builddag")
1729
1729
1730 at = -1
1730 at = -1
1731 atbranch = 'default'
1731 atbranch = 'default'
1732 nodeids = []
1732 nodeids = []
1733 id = 0
1733 id = 0
1734 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1734 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1735 for type, data in dagparser.parsedag(text):
1735 for type, data in dagparser.parsedag(text):
1736 if type == 'n':
1736 if type == 'n':
1737 ui.note(('node %s\n' % str(data)))
1737 ui.note(('node %s\n' % str(data)))
1738 id, ps = data
1738 id, ps = data
1739
1739
1740 files = []
1740 files = []
1741 fctxs = {}
1741 fctxs = {}
1742
1742
1743 p2 = None
1743 p2 = None
1744 if mergeable_file:
1744 if mergeable_file:
1745 fn = "mf"
1745 fn = "mf"
1746 p1 = repo[ps[0]]
1746 p1 = repo[ps[0]]
1747 if len(ps) > 1:
1747 if len(ps) > 1:
1748 p2 = repo[ps[1]]
1748 p2 = repo[ps[1]]
1749 pa = p1.ancestor(p2)
1749 pa = p1.ancestor(p2)
1750 base, local, other = [x[fn].data() for x in (pa, p1,
1750 base, local, other = [x[fn].data() for x in (pa, p1,
1751 p2)]
1751 p2)]
1752 m3 = simplemerge.Merge3Text(base, local, other)
1752 m3 = simplemerge.Merge3Text(base, local, other)
1753 ml = [l.strip() for l in m3.merge_lines()]
1753 ml = [l.strip() for l in m3.merge_lines()]
1754 ml.append("")
1754 ml.append("")
1755 elif at > 0:
1755 elif at > 0:
1756 ml = p1[fn].data().split("\n")
1756 ml = p1[fn].data().split("\n")
1757 else:
1757 else:
1758 ml = initialmergedlines
1758 ml = initialmergedlines
1759 ml[id * linesperrev] += " r%i" % id
1759 ml[id * linesperrev] += " r%i" % id
1760 mergedtext = "\n".join(ml)
1760 mergedtext = "\n".join(ml)
1761 files.append(fn)
1761 files.append(fn)
1762 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1762 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1763
1763
1764 if overwritten_file:
1764 if overwritten_file:
1765 fn = "of"
1765 fn = "of"
1766 files.append(fn)
1766 files.append(fn)
1767 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1767 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1768
1768
1769 if new_file:
1769 if new_file:
1770 fn = "nf%i" % id
1770 fn = "nf%i" % id
1771 files.append(fn)
1771 files.append(fn)
1772 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1772 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1773 if len(ps) > 1:
1773 if len(ps) > 1:
1774 if not p2:
1774 if not p2:
1775 p2 = repo[ps[1]]
1775 p2 = repo[ps[1]]
1776 for fn in p2:
1776 for fn in p2:
1777 if fn.startswith("nf"):
1777 if fn.startswith("nf"):
1778 files.append(fn)
1778 files.append(fn)
1779 fctxs[fn] = p2[fn]
1779 fctxs[fn] = p2[fn]
1780
1780
1781 def fctxfn(repo, cx, path):
1781 def fctxfn(repo, cx, path):
1782 return fctxs.get(path)
1782 return fctxs.get(path)
1783
1783
1784 if len(ps) == 0 or ps[0] < 0:
1784 if len(ps) == 0 or ps[0] < 0:
1785 pars = [None, None]
1785 pars = [None, None]
1786 elif len(ps) == 1:
1786 elif len(ps) == 1:
1787 pars = [nodeids[ps[0]], None]
1787 pars = [nodeids[ps[0]], None]
1788 else:
1788 else:
1789 pars = [nodeids[p] for p in ps]
1789 pars = [nodeids[p] for p in ps]
1790 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1790 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1791 date=(id, 0),
1791 date=(id, 0),
1792 user="debugbuilddag",
1792 user="debugbuilddag",
1793 extra={'branch': atbranch})
1793 extra={'branch': atbranch})
1794 nodeid = repo.commitctx(cx)
1794 nodeid = repo.commitctx(cx)
1795 nodeids.append(nodeid)
1795 nodeids.append(nodeid)
1796 at = id
1796 at = id
1797 elif type == 'l':
1797 elif type == 'l':
1798 id, name = data
1798 id, name = data
1799 ui.note(('tag %s\n' % name))
1799 ui.note(('tag %s\n' % name))
1800 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1800 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1801 elif type == 'a':
1801 elif type == 'a':
1802 ui.note(('branch %s\n' % data))
1802 ui.note(('branch %s\n' % data))
1803 atbranch = data
1803 atbranch = data
1804 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1804 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1805 tr.close()
1805 tr.close()
1806
1806
1807 if tags:
1807 if tags:
1808 repo.vfs.write("localtags", "".join(tags))
1808 repo.vfs.write("localtags", "".join(tags))
1809 finally:
1809 finally:
1810 ui.progress(_('building'), None)
1810 ui.progress(_('building'), None)
1811 release(tr, lock)
1811 release(tr, lock)
1812
1812
1813 @command('debugbundle',
1813 @command('debugbundle',
1814 [('a', 'all', None, _('show all details'))],
1814 [('a', 'all', None, _('show all details'))],
1815 _('FILE'),
1815 _('FILE'),
1816 norepo=True)
1816 norepo=True)
1817 def debugbundle(ui, bundlepath, all=None, **opts):
1817 def debugbundle(ui, bundlepath, all=None, **opts):
1818 """lists the contents of a bundle"""
1818 """lists the contents of a bundle"""
1819 f = hg.openpath(ui, bundlepath)
1819 f = hg.openpath(ui, bundlepath)
1820 try:
1820 try:
1821 gen = exchange.readbundle(ui, f, bundlepath)
1821 gen = exchange.readbundle(ui, f, bundlepath)
1822 if isinstance(gen, bundle2.unbundle20):
1822 if isinstance(gen, bundle2.unbundle20):
1823 return _debugbundle2(ui, gen, all=all, **opts)
1823 return _debugbundle2(ui, gen, all=all, **opts)
1824 if all:
1824 if all:
1825 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1825 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1826
1826
1827 def showchunks(named):
1827 def showchunks(named):
1828 ui.write("\n%s\n" % named)
1828 ui.write("\n%s\n" % named)
1829 chain = None
1829 chain = None
1830 while True:
1830 while True:
1831 chunkdata = gen.deltachunk(chain)
1831 chunkdata = gen.deltachunk(chain)
1832 if not chunkdata:
1832 if not chunkdata:
1833 break
1833 break
1834 node = chunkdata['node']
1834 node = chunkdata['node']
1835 p1 = chunkdata['p1']
1835 p1 = chunkdata['p1']
1836 p2 = chunkdata['p2']
1836 p2 = chunkdata['p2']
1837 cs = chunkdata['cs']
1837 cs = chunkdata['cs']
1838 deltabase = chunkdata['deltabase']
1838 deltabase = chunkdata['deltabase']
1839 delta = chunkdata['delta']
1839 delta = chunkdata['delta']
1840 ui.write("%s %s %s %s %s %s\n" %
1840 ui.write("%s %s %s %s %s %s\n" %
1841 (hex(node), hex(p1), hex(p2),
1841 (hex(node), hex(p1), hex(p2),
1842 hex(cs), hex(deltabase), len(delta)))
1842 hex(cs), hex(deltabase), len(delta)))
1843 chain = node
1843 chain = node
1844
1844
1845 chunkdata = gen.changelogheader()
1845 chunkdata = gen.changelogheader()
1846 showchunks("changelog")
1846 showchunks("changelog")
1847 chunkdata = gen.manifestheader()
1847 chunkdata = gen.manifestheader()
1848 showchunks("manifest")
1848 showchunks("manifest")
1849 while True:
1849 while True:
1850 chunkdata = gen.filelogheader()
1850 chunkdata = gen.filelogheader()
1851 if not chunkdata:
1851 if not chunkdata:
1852 break
1852 break
1853 fname = chunkdata['filename']
1853 fname = chunkdata['filename']
1854 showchunks(fname)
1854 showchunks(fname)
1855 else:
1855 else:
1856 if isinstance(gen, bundle2.unbundle20):
1856 if isinstance(gen, bundle2.unbundle20):
1857 raise util.Abort(_('use debugbundle2 for this file'))
1857 raise util.Abort(_('use debugbundle2 for this file'))
1858 chunkdata = gen.changelogheader()
1858 chunkdata = gen.changelogheader()
1859 chain = None
1859 chain = None
1860 while True:
1860 while True:
1861 chunkdata = gen.deltachunk(chain)
1861 chunkdata = gen.deltachunk(chain)
1862 if not chunkdata:
1862 if not chunkdata:
1863 break
1863 break
1864 node = chunkdata['node']
1864 node = chunkdata['node']
1865 ui.write("%s\n" % hex(node))
1865 ui.write("%s\n" % hex(node))
1866 chain = node
1866 chain = node
1867 finally:
1867 finally:
1868 f.close()
1868 f.close()
1869
1869
1870 def _debugbundle2(ui, gen, **opts):
1870 def _debugbundle2(ui, gen, **opts):
1871 """lists the contents of a bundle2"""
1871 """lists the contents of a bundle2"""
1872 if not isinstance(gen, bundle2.unbundle20):
1872 if not isinstance(gen, bundle2.unbundle20):
1873 raise util.Abort(_('not a bundle2 file'))
1873 raise util.Abort(_('not a bundle2 file'))
1874 ui.write(('Stream params: %s\n' % repr(gen.params)))
1874 ui.write(('Stream params: %s\n' % repr(gen.params)))
1875 for part in gen.iterparts():
1875 for part in gen.iterparts():
1876 ui.write('%s -- %r\n' % (part.type, repr(part.params)))
1876 ui.write('%s -- %r\n' % (part.type, repr(part.params)))
1877 if part.type == 'b2x:changegroup':
1877 if part.type == 'b2x:changegroup':
1878 version = part.params.get('version', '01')
1878 version = part.params.get('version', '01')
1879 cg = changegroup.packermap[version][1](part, 'UN')
1879 cg = changegroup.packermap[version][1](part, 'UN')
1880 chunkdata = cg.changelogheader()
1880 chunkdata = cg.changelogheader()
1881 chain = None
1881 chain = None
1882 while True:
1882 while True:
1883 chunkdata = cg.deltachunk(chain)
1883 chunkdata = cg.deltachunk(chain)
1884 if not chunkdata:
1884 if not chunkdata:
1885 break
1885 break
1886 node = chunkdata['node']
1886 node = chunkdata['node']
1887 ui.write(" %s\n" % hex(node))
1887 ui.write(" %s\n" % hex(node))
1888 chain = node
1888 chain = node
1889
1889
1890 @command('debugcheckstate', [], '')
1890 @command('debugcheckstate', [], '')
1891 def debugcheckstate(ui, repo):
1891 def debugcheckstate(ui, repo):
1892 """validate the correctness of the current dirstate"""
1892 """validate the correctness of the current dirstate"""
1893 parent1, parent2 = repo.dirstate.parents()
1893 parent1, parent2 = repo.dirstate.parents()
1894 m1 = repo[parent1].manifest()
1894 m1 = repo[parent1].manifest()
1895 m2 = repo[parent2].manifest()
1895 m2 = repo[parent2].manifest()
1896 errors = 0
1896 errors = 0
1897 for f in repo.dirstate:
1897 for f in repo.dirstate:
1898 state = repo.dirstate[f]
1898 state = repo.dirstate[f]
1899 if state in "nr" and f not in m1:
1899 if state in "nr" and f not in m1:
1900 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1900 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1901 errors += 1
1901 errors += 1
1902 if state in "a" and f in m1:
1902 if state in "a" and f in m1:
1903 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1903 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1904 errors += 1
1904 errors += 1
1905 if state in "m" and f not in m1 and f not in m2:
1905 if state in "m" and f not in m1 and f not in m2:
1906 ui.warn(_("%s in state %s, but not in either manifest\n") %
1906 ui.warn(_("%s in state %s, but not in either manifest\n") %
1907 (f, state))
1907 (f, state))
1908 errors += 1
1908 errors += 1
1909 for f in m1:
1909 for f in m1:
1910 state = repo.dirstate[f]
1910 state = repo.dirstate[f]
1911 if state not in "nrm":
1911 if state not in "nrm":
1912 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1912 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1913 errors += 1
1913 errors += 1
1914 if errors:
1914 if errors:
1915 error = _(".hg/dirstate inconsistent with current parent's manifest")
1915 error = _(".hg/dirstate inconsistent with current parent's manifest")
1916 raise util.Abort(error)
1916 raise util.Abort(error)
1917
1917
1918 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
1918 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
1919 def debugcommands(ui, cmd='', *args):
1919 def debugcommands(ui, cmd='', *args):
1920 """list all available commands and options"""
1920 """list all available commands and options"""
1921 for cmd, vals in sorted(table.iteritems()):
1921 for cmd, vals in sorted(table.iteritems()):
1922 cmd = cmd.split('|')[0].strip('^')
1922 cmd = cmd.split('|')[0].strip('^')
1923 opts = ', '.join([i[1] for i in vals[1]])
1923 opts = ', '.join([i[1] for i in vals[1]])
1924 ui.write('%s: %s\n' % (cmd, opts))
1924 ui.write('%s: %s\n' % (cmd, opts))
1925
1925
1926 @command('debugcomplete',
1926 @command('debugcomplete',
1927 [('o', 'options', None, _('show the command options'))],
1927 [('o', 'options', None, _('show the command options'))],
1928 _('[-o] CMD'),
1928 _('[-o] CMD'),
1929 norepo=True)
1929 norepo=True)
1930 def debugcomplete(ui, cmd='', **opts):
1930 def debugcomplete(ui, cmd='', **opts):
1931 """returns the completion list associated with the given command"""
1931 """returns the completion list associated with the given command"""
1932
1932
1933 if opts.get('options'):
1933 if opts.get('options'):
1934 options = []
1934 options = []
1935 otables = [globalopts]
1935 otables = [globalopts]
1936 if cmd:
1936 if cmd:
1937 aliases, entry = cmdutil.findcmd(cmd, table, False)
1937 aliases, entry = cmdutil.findcmd(cmd, table, False)
1938 otables.append(entry[1])
1938 otables.append(entry[1])
1939 for t in otables:
1939 for t in otables:
1940 for o in t:
1940 for o in t:
1941 if "(DEPRECATED)" in o[3]:
1941 if "(DEPRECATED)" in o[3]:
1942 continue
1942 continue
1943 if o[0]:
1943 if o[0]:
1944 options.append('-%s' % o[0])
1944 options.append('-%s' % o[0])
1945 options.append('--%s' % o[1])
1945 options.append('--%s' % o[1])
1946 ui.write("%s\n" % "\n".join(options))
1946 ui.write("%s\n" % "\n".join(options))
1947 return
1947 return
1948
1948
1949 cmdlist = cmdutil.findpossible(cmd, table)
1949 cmdlist = cmdutil.findpossible(cmd, table)
1950 if ui.verbose:
1950 if ui.verbose:
1951 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1951 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1952 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1952 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1953
1953
1954 @command('debugdag',
1954 @command('debugdag',
1955 [('t', 'tags', None, _('use tags as labels')),
1955 [('t', 'tags', None, _('use tags as labels')),
1956 ('b', 'branches', None, _('annotate with branch names')),
1956 ('b', 'branches', None, _('annotate with branch names')),
1957 ('', 'dots', None, _('use dots for runs')),
1957 ('', 'dots', None, _('use dots for runs')),
1958 ('s', 'spaces', None, _('separate elements by spaces'))],
1958 ('s', 'spaces', None, _('separate elements by spaces'))],
1959 _('[OPTION]... [FILE [REV]...]'),
1959 _('[OPTION]... [FILE [REV]...]'),
1960 optionalrepo=True)
1960 optionalrepo=True)
1961 def debugdag(ui, repo, file_=None, *revs, **opts):
1961 def debugdag(ui, repo, file_=None, *revs, **opts):
1962 """format the changelog or an index DAG as a concise textual description
1962 """format the changelog or an index DAG as a concise textual description
1963
1963
1964 If you pass a revlog index, the revlog's DAG is emitted. If you list
1964 If you pass a revlog index, the revlog's DAG is emitted. If you list
1965 revision numbers, they get labeled in the output as rN.
1965 revision numbers, they get labeled in the output as rN.
1966
1966
1967 Otherwise, the changelog DAG of the current repo is emitted.
1967 Otherwise, the changelog DAG of the current repo is emitted.
1968 """
1968 """
1969 spaces = opts.get('spaces')
1969 spaces = opts.get('spaces')
1970 dots = opts.get('dots')
1970 dots = opts.get('dots')
1971 if file_:
1971 if file_:
1972 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
1972 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
1973 revs = set((int(r) for r in revs))
1973 revs = set((int(r) for r in revs))
1974 def events():
1974 def events():
1975 for r in rlog:
1975 for r in rlog:
1976 yield 'n', (r, list(p for p in rlog.parentrevs(r)
1976 yield 'n', (r, list(p for p in rlog.parentrevs(r)
1977 if p != -1))
1977 if p != -1))
1978 if r in revs:
1978 if r in revs:
1979 yield 'l', (r, "r%i" % r)
1979 yield 'l', (r, "r%i" % r)
1980 elif repo:
1980 elif repo:
1981 cl = repo.changelog
1981 cl = repo.changelog
1982 tags = opts.get('tags')
1982 tags = opts.get('tags')
1983 branches = opts.get('branches')
1983 branches = opts.get('branches')
1984 if tags:
1984 if tags:
1985 labels = {}
1985 labels = {}
1986 for l, n in repo.tags().items():
1986 for l, n in repo.tags().items():
1987 labels.setdefault(cl.rev(n), []).append(l)
1987 labels.setdefault(cl.rev(n), []).append(l)
1988 def events():
1988 def events():
1989 b = "default"
1989 b = "default"
1990 for r in cl:
1990 for r in cl:
1991 if branches:
1991 if branches:
1992 newb = cl.read(cl.node(r))[5]['branch']
1992 newb = cl.read(cl.node(r))[5]['branch']
1993 if newb != b:
1993 if newb != b:
1994 yield 'a', newb
1994 yield 'a', newb
1995 b = newb
1995 b = newb
1996 yield 'n', (r, list(p for p in cl.parentrevs(r)
1996 yield 'n', (r, list(p for p in cl.parentrevs(r)
1997 if p != -1))
1997 if p != -1))
1998 if tags:
1998 if tags:
1999 ls = labels.get(r)
1999 ls = labels.get(r)
2000 if ls:
2000 if ls:
2001 for l in ls:
2001 for l in ls:
2002 yield 'l', (r, l)
2002 yield 'l', (r, l)
2003 else:
2003 else:
2004 raise util.Abort(_('need repo for changelog dag'))
2004 raise util.Abort(_('need repo for changelog dag'))
2005
2005
2006 for line in dagparser.dagtextlines(events(),
2006 for line in dagparser.dagtextlines(events(),
2007 addspaces=spaces,
2007 addspaces=spaces,
2008 wraplabels=True,
2008 wraplabels=True,
2009 wrapannotations=True,
2009 wrapannotations=True,
2010 wrapnonlinear=dots,
2010 wrapnonlinear=dots,
2011 usedots=dots,
2011 usedots=dots,
2012 maxlinewidth=70):
2012 maxlinewidth=70):
2013 ui.write(line)
2013 ui.write(line)
2014 ui.write("\n")
2014 ui.write("\n")
2015
2015
2016 @command('debugdata',
2016 @command('debugdata',
2017 [('c', 'changelog', False, _('open changelog')),
2017 [('c', 'changelog', False, _('open changelog')),
2018 ('m', 'manifest', False, _('open manifest'))],
2018 ('m', 'manifest', False, _('open manifest'))],
2019 _('-c|-m|FILE REV'))
2019 _('-c|-m|FILE REV'))
2020 def debugdata(ui, repo, file_, rev=None, **opts):
2020 def debugdata(ui, repo, file_, rev=None, **opts):
2021 """dump the contents of a data file revision"""
2021 """dump the contents of a data file revision"""
2022 if opts.get('changelog') or opts.get('manifest'):
2022 if opts.get('changelog') or opts.get('manifest'):
2023 file_, rev = None, file_
2023 file_, rev = None, file_
2024 elif rev is None:
2024 elif rev is None:
2025 raise error.CommandError('debugdata', _('invalid arguments'))
2025 raise error.CommandError('debugdata', _('invalid arguments'))
2026 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
2026 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
2027 try:
2027 try:
2028 ui.write(r.revision(r.lookup(rev)))
2028 ui.write(r.revision(r.lookup(rev)))
2029 except KeyError:
2029 except KeyError:
2030 raise util.Abort(_('invalid revision identifier %s') % rev)
2030 raise util.Abort(_('invalid revision identifier %s') % rev)
2031
2031
2032 @command('debugdate',
2032 @command('debugdate',
2033 [('e', 'extended', None, _('try extended date formats'))],
2033 [('e', 'extended', None, _('try extended date formats'))],
2034 _('[-e] DATE [RANGE]'),
2034 _('[-e] DATE [RANGE]'),
2035 norepo=True, optionalrepo=True)
2035 norepo=True, optionalrepo=True)
2036 def debugdate(ui, date, range=None, **opts):
2036 def debugdate(ui, date, range=None, **opts):
2037 """parse and display a date"""
2037 """parse and display a date"""
2038 if opts["extended"]:
2038 if opts["extended"]:
2039 d = util.parsedate(date, util.extendeddateformats)
2039 d = util.parsedate(date, util.extendeddateformats)
2040 else:
2040 else:
2041 d = util.parsedate(date)
2041 d = util.parsedate(date)
2042 ui.write(("internal: %s %s\n") % d)
2042 ui.write(("internal: %s %s\n") % d)
2043 ui.write(("standard: %s\n") % util.datestr(d))
2043 ui.write(("standard: %s\n") % util.datestr(d))
2044 if range:
2044 if range:
2045 m = util.matchdate(range)
2045 m = util.matchdate(range)
2046 ui.write(("match: %s\n") % m(d[0]))
2046 ui.write(("match: %s\n") % m(d[0]))
2047
2047
2048 @command('debugdiscovery',
2048 @command('debugdiscovery',
2049 [('', 'old', None, _('use old-style discovery')),
2049 [('', 'old', None, _('use old-style discovery')),
2050 ('', 'nonheads', None,
2050 ('', 'nonheads', None,
2051 _('use old-style discovery with non-heads included')),
2051 _('use old-style discovery with non-heads included')),
2052 ] + remoteopts,
2052 ] + remoteopts,
2053 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
2053 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
2054 def debugdiscovery(ui, repo, remoteurl="default", **opts):
2054 def debugdiscovery(ui, repo, remoteurl="default", **opts):
2055 """runs the changeset discovery protocol in isolation"""
2055 """runs the changeset discovery protocol in isolation"""
2056 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
2056 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
2057 opts.get('branch'))
2057 opts.get('branch'))
2058 remote = hg.peer(repo, opts, remoteurl)
2058 remote = hg.peer(repo, opts, remoteurl)
2059 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
2059 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
2060
2060
2061 # make sure tests are repeatable
2061 # make sure tests are repeatable
2062 random.seed(12323)
2062 random.seed(12323)
2063
2063
2064 def doit(localheads, remoteheads, remote=remote):
2064 def doit(localheads, remoteheads, remote=remote):
2065 if opts.get('old'):
2065 if opts.get('old'):
2066 if localheads:
2066 if localheads:
2067 raise util.Abort('cannot use localheads with old style '
2067 raise util.Abort('cannot use localheads with old style '
2068 'discovery')
2068 'discovery')
2069 if not util.safehasattr(remote, 'branches'):
2069 if not util.safehasattr(remote, 'branches'):
2070 # enable in-client legacy support
2070 # enable in-client legacy support
2071 remote = localrepo.locallegacypeer(remote.local())
2071 remote = localrepo.locallegacypeer(remote.local())
2072 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2072 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2073 force=True)
2073 force=True)
2074 common = set(common)
2074 common = set(common)
2075 if not opts.get('nonheads'):
2075 if not opts.get('nonheads'):
2076 ui.write(("unpruned common: %s\n") %
2076 ui.write(("unpruned common: %s\n") %
2077 " ".join(sorted(short(n) for n in common)))
2077 " ".join(sorted(short(n) for n in common)))
2078 dag = dagutil.revlogdag(repo.changelog)
2078 dag = dagutil.revlogdag(repo.changelog)
2079 all = dag.ancestorset(dag.internalizeall(common))
2079 all = dag.ancestorset(dag.internalizeall(common))
2080 common = dag.externalizeall(dag.headsetofconnecteds(all))
2080 common = dag.externalizeall(dag.headsetofconnecteds(all))
2081 else:
2081 else:
2082 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2082 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2083 common = set(common)
2083 common = set(common)
2084 rheads = set(hds)
2084 rheads = set(hds)
2085 lheads = set(repo.heads())
2085 lheads = set(repo.heads())
2086 ui.write(("common heads: %s\n") %
2086 ui.write(("common heads: %s\n") %
2087 " ".join(sorted(short(n) for n in common)))
2087 " ".join(sorted(short(n) for n in common)))
2088 if lheads <= common:
2088 if lheads <= common:
2089 ui.write(("local is subset\n"))
2089 ui.write(("local is subset\n"))
2090 elif rheads <= common:
2090 elif rheads <= common:
2091 ui.write(("remote is subset\n"))
2091 ui.write(("remote is subset\n"))
2092
2092
2093 serverlogs = opts.get('serverlog')
2093 serverlogs = opts.get('serverlog')
2094 if serverlogs:
2094 if serverlogs:
2095 for filename in serverlogs:
2095 for filename in serverlogs:
2096 logfile = open(filename, 'r')
2096 logfile = open(filename, 'r')
2097 try:
2097 try:
2098 line = logfile.readline()
2098 line = logfile.readline()
2099 while line:
2099 while line:
2100 parts = line.strip().split(';')
2100 parts = line.strip().split(';')
2101 op = parts[1]
2101 op = parts[1]
2102 if op == 'cg':
2102 if op == 'cg':
2103 pass
2103 pass
2104 elif op == 'cgss':
2104 elif op == 'cgss':
2105 doit(parts[2].split(' '), parts[3].split(' '))
2105 doit(parts[2].split(' '), parts[3].split(' '))
2106 elif op == 'unb':
2106 elif op == 'unb':
2107 doit(parts[3].split(' '), parts[2].split(' '))
2107 doit(parts[3].split(' '), parts[2].split(' '))
2108 line = logfile.readline()
2108 line = logfile.readline()
2109 finally:
2109 finally:
2110 logfile.close()
2110 logfile.close()
2111
2111
2112 else:
2112 else:
2113 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2113 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2114 opts.get('remote_head'))
2114 opts.get('remote_head'))
2115 localrevs = opts.get('local_head')
2115 localrevs = opts.get('local_head')
2116 doit(localrevs, remoterevs)
2116 doit(localrevs, remoterevs)
2117
2117
2118 @command('debugfileset',
2118 @command('debugfileset',
2119 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2119 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2120 _('[-r REV] FILESPEC'))
2120 _('[-r REV] FILESPEC'))
2121 def debugfileset(ui, repo, expr, **opts):
2121 def debugfileset(ui, repo, expr, **opts):
2122 '''parse and apply a fileset specification'''
2122 '''parse and apply a fileset specification'''
2123 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2123 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2124 if ui.verbose:
2124 if ui.verbose:
2125 tree = fileset.parse(expr)[0]
2125 tree = fileset.parse(expr)[0]
2126 ui.note(tree, "\n")
2126 ui.note(tree, "\n")
2127
2127
2128 for f in ctx.getfileset(expr):
2128 for f in ctx.getfileset(expr):
2129 ui.write("%s\n" % f)
2129 ui.write("%s\n" % f)
2130
2130
2131 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2131 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2132 def debugfsinfo(ui, path="."):
2132 def debugfsinfo(ui, path="."):
2133 """show information detected about current filesystem"""
2133 """show information detected about current filesystem"""
2134 util.writefile('.debugfsinfo', '')
2134 util.writefile('.debugfsinfo', '')
2135 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2135 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2136 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2136 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2137 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2137 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2138 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2138 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2139 and 'yes' or 'no'))
2139 and 'yes' or 'no'))
2140 os.unlink('.debugfsinfo')
2140 os.unlink('.debugfsinfo')
2141
2141
2142 @command('debuggetbundle',
2142 @command('debuggetbundle',
2143 [('H', 'head', [], _('id of head node'), _('ID')),
2143 [('H', 'head', [], _('id of head node'), _('ID')),
2144 ('C', 'common', [], _('id of common node'), _('ID')),
2144 ('C', 'common', [], _('id of common node'), _('ID')),
2145 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2145 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2146 _('REPO FILE [-H|-C ID]...'),
2146 _('REPO FILE [-H|-C ID]...'),
2147 norepo=True)
2147 norepo=True)
2148 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2148 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2149 """retrieves a bundle from a repo
2149 """retrieves a bundle from a repo
2150
2150
2151 Every ID must be a full-length hex node id string. Saves the bundle to the
2151 Every ID must be a full-length hex node id string. Saves the bundle to the
2152 given file.
2152 given file.
2153 """
2153 """
2154 repo = hg.peer(ui, opts, repopath)
2154 repo = hg.peer(ui, opts, repopath)
2155 if not repo.capable('getbundle'):
2155 if not repo.capable('getbundle'):
2156 raise util.Abort("getbundle() not supported by target repository")
2156 raise util.Abort("getbundle() not supported by target repository")
2157 args = {}
2157 args = {}
2158 if common:
2158 if common:
2159 args['common'] = [bin(s) for s in common]
2159 args['common'] = [bin(s) for s in common]
2160 if head:
2160 if head:
2161 args['heads'] = [bin(s) for s in head]
2161 args['heads'] = [bin(s) for s in head]
2162 # TODO: get desired bundlecaps from command line.
2162 # TODO: get desired bundlecaps from command line.
2163 args['bundlecaps'] = None
2163 args['bundlecaps'] = None
2164 bundle = repo.getbundle('debug', **args)
2164 bundle = repo.getbundle('debug', **args)
2165
2165
2166 bundletype = opts.get('type', 'bzip2').lower()
2166 bundletype = opts.get('type', 'bzip2').lower()
2167 btypes = {'none': 'HG10UN',
2167 btypes = {'none': 'HG10UN',
2168 'bzip2': 'HG10BZ',
2168 'bzip2': 'HG10BZ',
2169 'gzip': 'HG10GZ',
2169 'gzip': 'HG10GZ',
2170 'bundle2': 'HG2Y'}
2170 'bundle2': 'HG2Y'}
2171 bundletype = btypes.get(bundletype)
2171 bundletype = btypes.get(bundletype)
2172 if bundletype not in changegroup.bundletypes:
2172 if bundletype not in changegroup.bundletypes:
2173 raise util.Abort(_('unknown bundle type specified with --type'))
2173 raise util.Abort(_('unknown bundle type specified with --type'))
2174 changegroup.writebundle(ui, bundle, bundlepath, bundletype)
2174 changegroup.writebundle(ui, bundle, bundlepath, bundletype)
2175
2175
2176 @command('debugignore', [], '')
2176 @command('debugignore', [], '')
2177 def debugignore(ui, repo, *values, **opts):
2177 def debugignore(ui, repo, *values, **opts):
2178 """display the combined ignore pattern"""
2178 """display the combined ignore pattern"""
2179 ignore = repo.dirstate._ignore
2179 ignore = repo.dirstate._ignore
2180 includepat = getattr(ignore, 'includepat', None)
2180 includepat = getattr(ignore, 'includepat', None)
2181 if includepat is not None:
2181 if includepat is not None:
2182 ui.write("%s\n" % includepat)
2182 ui.write("%s\n" % includepat)
2183 else:
2183 else:
2184 raise util.Abort(_("no ignore patterns found"))
2184 raise util.Abort(_("no ignore patterns found"))
2185
2185
2186 @command('debugindex',
2186 @command('debugindex',
2187 [('c', 'changelog', False, _('open changelog')),
2187 [('c', 'changelog', False, _('open changelog')),
2188 ('m', 'manifest', False, _('open manifest')),
2188 ('m', 'manifest', False, _('open manifest')),
2189 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2189 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2190 _('[-f FORMAT] -c|-m|FILE'),
2190 _('[-f FORMAT] -c|-m|FILE'),
2191 optionalrepo=True)
2191 optionalrepo=True)
2192 def debugindex(ui, repo, file_=None, **opts):
2192 def debugindex(ui, repo, file_=None, **opts):
2193 """dump the contents of an index file"""
2193 """dump the contents of an index file"""
2194 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2194 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2195 format = opts.get('format', 0)
2195 format = opts.get('format', 0)
2196 if format not in (0, 1):
2196 if format not in (0, 1):
2197 raise util.Abort(_("unknown format %d") % format)
2197 raise util.Abort(_("unknown format %d") % format)
2198
2198
2199 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2199 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2200 if generaldelta:
2200 if generaldelta:
2201 basehdr = ' delta'
2201 basehdr = ' delta'
2202 else:
2202 else:
2203 basehdr = ' base'
2203 basehdr = ' base'
2204
2204
2205 if ui.debugflag:
2205 if ui.debugflag:
2206 shortfn = hex
2206 shortfn = hex
2207 else:
2207 else:
2208 shortfn = short
2208 shortfn = short
2209
2209
2210 # There might not be anything in r, so have a sane default
2210 # There might not be anything in r, so have a sane default
2211 idlen = 12
2211 idlen = 12
2212 for i in r:
2212 for i in r:
2213 idlen = len(shortfn(r.node(i)))
2213 idlen = len(shortfn(r.node(i)))
2214 break
2214 break
2215
2215
2216 if format == 0:
2216 if format == 0:
2217 ui.write(" rev offset length " + basehdr + " linkrev"
2217 ui.write(" rev offset length " + basehdr + " linkrev"
2218 " %s %s p2\n" % ("nodeid".ljust(idlen), "p1".ljust(idlen)))
2218 " %s %s p2\n" % ("nodeid".ljust(idlen), "p1".ljust(idlen)))
2219 elif format == 1:
2219 elif format == 1:
2220 ui.write(" rev flag offset length"
2220 ui.write(" rev flag offset length"
2221 " size " + basehdr + " link p1 p2"
2221 " size " + basehdr + " link p1 p2"
2222 " %s\n" % "nodeid".rjust(idlen))
2222 " %s\n" % "nodeid".rjust(idlen))
2223
2223
2224 for i in r:
2224 for i in r:
2225 node = r.node(i)
2225 node = r.node(i)
2226 if generaldelta:
2226 if generaldelta:
2227 base = r.deltaparent(i)
2227 base = r.deltaparent(i)
2228 else:
2228 else:
2229 base = r.chainbase(i)
2229 base = r.chainbase(i)
2230 if format == 0:
2230 if format == 0:
2231 try:
2231 try:
2232 pp = r.parents(node)
2232 pp = r.parents(node)
2233 except Exception:
2233 except Exception:
2234 pp = [nullid, nullid]
2234 pp = [nullid, nullid]
2235 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2235 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2236 i, r.start(i), r.length(i), base, r.linkrev(i),
2236 i, r.start(i), r.length(i), base, r.linkrev(i),
2237 shortfn(node), shortfn(pp[0]), shortfn(pp[1])))
2237 shortfn(node), shortfn(pp[0]), shortfn(pp[1])))
2238 elif format == 1:
2238 elif format == 1:
2239 pr = r.parentrevs(i)
2239 pr = r.parentrevs(i)
2240 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2240 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2241 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2241 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2242 base, r.linkrev(i), pr[0], pr[1], shortfn(node)))
2242 base, r.linkrev(i), pr[0], pr[1], shortfn(node)))
2243
2243
2244 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2244 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2245 def debugindexdot(ui, repo, file_):
2245 def debugindexdot(ui, repo, file_):
2246 """dump an index DAG as a graphviz dot file"""
2246 """dump an index DAG as a graphviz dot file"""
2247 r = None
2247 r = None
2248 if repo:
2248 if repo:
2249 filelog = repo.file(file_)
2249 filelog = repo.file(file_)
2250 if len(filelog):
2250 if len(filelog):
2251 r = filelog
2251 r = filelog
2252 if not r:
2252 if not r:
2253 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2253 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2254 ui.write(("digraph G {\n"))
2254 ui.write(("digraph G {\n"))
2255 for i in r:
2255 for i in r:
2256 node = r.node(i)
2256 node = r.node(i)
2257 pp = r.parents(node)
2257 pp = r.parents(node)
2258 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2258 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2259 if pp[1] != nullid:
2259 if pp[1] != nullid:
2260 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2260 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2261 ui.write("}\n")
2261 ui.write("}\n")
2262
2262
2263 @command('debuginstall', [], '', norepo=True)
2263 @command('debuginstall', [], '', norepo=True)
2264 def debuginstall(ui):
2264 def debuginstall(ui):
2265 '''test Mercurial installation
2265 '''test Mercurial installation
2266
2266
2267 Returns 0 on success.
2267 Returns 0 on success.
2268 '''
2268 '''
2269
2269
2270 def writetemp(contents):
2270 def writetemp(contents):
2271 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2271 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2272 f = os.fdopen(fd, "wb")
2272 f = os.fdopen(fd, "wb")
2273 f.write(contents)
2273 f.write(contents)
2274 f.close()
2274 f.close()
2275 return name
2275 return name
2276
2276
2277 problems = 0
2277 problems = 0
2278
2278
2279 # encoding
2279 # encoding
2280 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2280 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2281 try:
2281 try:
2282 encoding.fromlocal("test")
2282 encoding.fromlocal("test")
2283 except util.Abort, inst:
2283 except util.Abort, inst:
2284 ui.write(" %s\n" % inst)
2284 ui.write(" %s\n" % inst)
2285 ui.write(_(" (check that your locale is properly set)\n"))
2285 ui.write(_(" (check that your locale is properly set)\n"))
2286 problems += 1
2286 problems += 1
2287
2287
2288 # Python
2288 # Python
2289 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2289 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2290 ui.status(_("checking Python version (%s)\n")
2290 ui.status(_("checking Python version (%s)\n")
2291 % ("%s.%s.%s" % sys.version_info[:3]))
2291 % ("%s.%s.%s" % sys.version_info[:3]))
2292 ui.status(_("checking Python lib (%s)...\n")
2292 ui.status(_("checking Python lib (%s)...\n")
2293 % os.path.dirname(os.__file__))
2293 % os.path.dirname(os.__file__))
2294
2294
2295 # compiled modules
2295 # compiled modules
2296 ui.status(_("checking installed modules (%s)...\n")
2296 ui.status(_("checking installed modules (%s)...\n")
2297 % os.path.dirname(__file__))
2297 % os.path.dirname(__file__))
2298 try:
2298 try:
2299 import bdiff, mpatch, base85, osutil
2299 import bdiff, mpatch, base85, osutil
2300 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2300 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2301 except Exception, inst:
2301 except Exception, inst:
2302 ui.write(" %s\n" % inst)
2302 ui.write(" %s\n" % inst)
2303 ui.write(_(" One or more extensions could not be found"))
2303 ui.write(_(" One or more extensions could not be found"))
2304 ui.write(_(" (check that you compiled the extensions)\n"))
2304 ui.write(_(" (check that you compiled the extensions)\n"))
2305 problems += 1
2305 problems += 1
2306
2306
2307 # templates
2307 # templates
2308 import templater
2308 import templater
2309 p = templater.templatepaths()
2309 p = templater.templatepaths()
2310 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2310 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2311 if p:
2311 if p:
2312 m = templater.templatepath("map-cmdline.default")
2312 m = templater.templatepath("map-cmdline.default")
2313 if m:
2313 if m:
2314 # template found, check if it is working
2314 # template found, check if it is working
2315 try:
2315 try:
2316 templater.templater(m)
2316 templater.templater(m)
2317 except Exception, inst:
2317 except Exception, inst:
2318 ui.write(" %s\n" % inst)
2318 ui.write(" %s\n" % inst)
2319 p = None
2319 p = None
2320 else:
2320 else:
2321 ui.write(_(" template 'default' not found\n"))
2321 ui.write(_(" template 'default' not found\n"))
2322 p = None
2322 p = None
2323 else:
2323 else:
2324 ui.write(_(" no template directories found\n"))
2324 ui.write(_(" no template directories found\n"))
2325 if not p:
2325 if not p:
2326 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2326 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2327 problems += 1
2327 problems += 1
2328
2328
2329 # editor
2329 # editor
2330 ui.status(_("checking commit editor...\n"))
2330 ui.status(_("checking commit editor...\n"))
2331 editor = ui.geteditor()
2331 editor = ui.geteditor()
2332 cmdpath = util.findexe(shlex.split(editor)[0])
2332 cmdpath = util.findexe(shlex.split(editor)[0])
2333 if not cmdpath:
2333 if not cmdpath:
2334 if editor == 'vi':
2334 if editor == 'vi':
2335 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2335 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2336 ui.write(_(" (specify a commit editor in your configuration"
2336 ui.write(_(" (specify a commit editor in your configuration"
2337 " file)\n"))
2337 " file)\n"))
2338 else:
2338 else:
2339 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2339 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2340 ui.write(_(" (specify a commit editor in your configuration"
2340 ui.write(_(" (specify a commit editor in your configuration"
2341 " file)\n"))
2341 " file)\n"))
2342 problems += 1
2342 problems += 1
2343
2343
2344 # check username
2344 # check username
2345 ui.status(_("checking username...\n"))
2345 ui.status(_("checking username...\n"))
2346 try:
2346 try:
2347 ui.username()
2347 ui.username()
2348 except util.Abort, e:
2348 except util.Abort, e:
2349 ui.write(" %s\n" % e)
2349 ui.write(" %s\n" % e)
2350 ui.write(_(" (specify a username in your configuration file)\n"))
2350 ui.write(_(" (specify a username in your configuration file)\n"))
2351 problems += 1
2351 problems += 1
2352
2352
2353 if not problems:
2353 if not problems:
2354 ui.status(_("no problems detected\n"))
2354 ui.status(_("no problems detected\n"))
2355 else:
2355 else:
2356 ui.write(_("%s problems detected,"
2356 ui.write(_("%s problems detected,"
2357 " please check your install!\n") % problems)
2357 " please check your install!\n") % problems)
2358
2358
2359 return problems
2359 return problems
2360
2360
2361 @command('debugknown', [], _('REPO ID...'), norepo=True)
2361 @command('debugknown', [], _('REPO ID...'), norepo=True)
2362 def debugknown(ui, repopath, *ids, **opts):
2362 def debugknown(ui, repopath, *ids, **opts):
2363 """test whether node ids are known to a repo
2363 """test whether node ids are known to a repo
2364
2364
2365 Every ID must be a full-length hex node id string. Returns a list of 0s
2365 Every ID must be a full-length hex node id string. Returns a list of 0s
2366 and 1s indicating unknown/known.
2366 and 1s indicating unknown/known.
2367 """
2367 """
2368 repo = hg.peer(ui, opts, repopath)
2368 repo = hg.peer(ui, opts, repopath)
2369 if not repo.capable('known'):
2369 if not repo.capable('known'):
2370 raise util.Abort("known() not supported by target repository")
2370 raise util.Abort("known() not supported by target repository")
2371 flags = repo.known([bin(s) for s in ids])
2371 flags = repo.known([bin(s) for s in ids])
2372 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2372 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2373
2373
2374 @command('debuglabelcomplete', [], _('LABEL...'))
2374 @command('debuglabelcomplete', [], _('LABEL...'))
2375 def debuglabelcomplete(ui, repo, *args):
2375 def debuglabelcomplete(ui, repo, *args):
2376 '''backwards compatibility with old bash completion scripts (DEPRECATED)'''
2376 '''backwards compatibility with old bash completion scripts (DEPRECATED)'''
2377 debugnamecomplete(ui, repo, *args)
2377 debugnamecomplete(ui, repo, *args)
2378
2378
2379 @command('debugnamecomplete', [], _('NAME...'))
2379 @command('debugnamecomplete', [], _('NAME...'))
2380 def debugnamecomplete(ui, repo, *args):
2380 def debugnamecomplete(ui, repo, *args):
2381 '''complete "names" - tags, open branch names, bookmark names'''
2381 '''complete "names" - tags, open branch names, bookmark names'''
2382
2382
2383 names = set()
2383 names = set()
2384 # since we previously only listed open branches, we will handle that
2384 # since we previously only listed open branches, we will handle that
2385 # specially (after this for loop)
2385 # specially (after this for loop)
2386 for name, ns in repo.names.iteritems():
2386 for name, ns in repo.names.iteritems():
2387 if name != 'branches':
2387 if name != 'branches':
2388 names.update(ns.listnames(repo))
2388 names.update(ns.listnames(repo))
2389 names.update(tag for (tag, heads, tip, closed)
2389 names.update(tag for (tag, heads, tip, closed)
2390 in repo.branchmap().iterbranches() if not closed)
2390 in repo.branchmap().iterbranches() if not closed)
2391 completions = set()
2391 completions = set()
2392 if not args:
2392 if not args:
2393 args = ['']
2393 args = ['']
2394 for a in args:
2394 for a in args:
2395 completions.update(n for n in names if n.startswith(a))
2395 completions.update(n for n in names if n.startswith(a))
2396 ui.write('\n'.join(sorted(completions)))
2396 ui.write('\n'.join(sorted(completions)))
2397 ui.write('\n')
2397 ui.write('\n')
2398
2398
2399 @command('debuglocks',
2399 @command('debuglocks',
2400 [('L', 'force-lock', None, _('free the store lock (DANGEROUS)')),
2400 [('L', 'force-lock', None, _('free the store lock (DANGEROUS)')),
2401 ('W', 'force-wlock', None,
2401 ('W', 'force-wlock', None,
2402 _('free the working state lock (DANGEROUS)'))],
2402 _('free the working state lock (DANGEROUS)'))],
2403 _('[OPTION]...'))
2403 _('[OPTION]...'))
2404 def debuglocks(ui, repo, **opts):
2404 def debuglocks(ui, repo, **opts):
2405 """show or modify state of locks
2405 """show or modify state of locks
2406
2406
2407 By default, this command will show which locks are held. This
2407 By default, this command will show which locks are held. This
2408 includes the user and process holding the lock, the amount of time
2408 includes the user and process holding the lock, the amount of time
2409 the lock has been held, and the machine name where the process is
2409 the lock has been held, and the machine name where the process is
2410 running if it's not local.
2410 running if it's not local.
2411
2411
2412 Locks protect the integrity of Mercurial's data, so should be
2412 Locks protect the integrity of Mercurial's data, so should be
2413 treated with care. System crashes or other interruptions may cause
2413 treated with care. System crashes or other interruptions may cause
2414 locks to not be properly released, though Mercurial will usually
2414 locks to not be properly released, though Mercurial will usually
2415 detect and remove such stale locks automatically.
2415 detect and remove such stale locks automatically.
2416
2416
2417 However, detecting stale locks may not always be possible (for
2417 However, detecting stale locks may not always be possible (for
2418 instance, on a shared filesystem). Removing locks may also be
2418 instance, on a shared filesystem). Removing locks may also be
2419 blocked by filesystem permissions.
2419 blocked by filesystem permissions.
2420
2420
2421 Returns 0 if no locks are held.
2421 Returns 0 if no locks are held.
2422
2422
2423 """
2423 """
2424
2424
2425 if opts.get('force_lock'):
2425 if opts.get('force_lock'):
2426 repo.svfs.unlink('lock')
2426 repo.svfs.unlink('lock')
2427 if opts.get('force_wlock'):
2427 if opts.get('force_wlock'):
2428 repo.vfs.unlink('wlock')
2428 repo.vfs.unlink('wlock')
2429 if opts.get('force_lock') or opts.get('force_lock'):
2429 if opts.get('force_lock') or opts.get('force_lock'):
2430 return 0
2430 return 0
2431
2431
2432 now = time.time()
2432 now = time.time()
2433 held = 0
2433 held = 0
2434
2434
2435 def report(vfs, name, method):
2435 def report(vfs, name, method):
2436 # this causes stale locks to get reaped for more accurate reporting
2436 # this causes stale locks to get reaped for more accurate reporting
2437 try:
2437 try:
2438 l = method(False)
2438 l = method(False)
2439 except error.LockHeld:
2439 except error.LockHeld:
2440 l = None
2440 l = None
2441
2441
2442 if l:
2442 if l:
2443 l.release()
2443 l.release()
2444 else:
2444 else:
2445 try:
2445 try:
2446 stat = repo.svfs.lstat(name)
2446 stat = repo.svfs.lstat(name)
2447 age = now - stat.st_mtime
2447 age = now - stat.st_mtime
2448 user = util.username(stat.st_uid)
2448 user = util.username(stat.st_uid)
2449 locker = vfs.readlock(name)
2449 locker = vfs.readlock(name)
2450 if ":" in locker:
2450 if ":" in locker:
2451 host, pid = locker.split(':')
2451 host, pid = locker.split(':')
2452 if host == socket.gethostname():
2452 if host == socket.gethostname():
2453 locker = 'user %s, process %s' % (user, pid)
2453 locker = 'user %s, process %s' % (user, pid)
2454 else:
2454 else:
2455 locker = 'user %s, process %s, host %s' \
2455 locker = 'user %s, process %s, host %s' \
2456 % (user, pid, host)
2456 % (user, pid, host)
2457 ui.write("%-6s %s (%ds)\n" % (name + ":", locker, age))
2457 ui.write("%-6s %s (%ds)\n" % (name + ":", locker, age))
2458 return 1
2458 return 1
2459 except OSError, e:
2459 except OSError, e:
2460 if e.errno != errno.ENOENT:
2460 if e.errno != errno.ENOENT:
2461 raise
2461 raise
2462
2462
2463 ui.write("%-6s free\n" % (name + ":"))
2463 ui.write("%-6s free\n" % (name + ":"))
2464 return 0
2464 return 0
2465
2465
2466 held += report(repo.svfs, "lock", repo.lock)
2466 held += report(repo.svfs, "lock", repo.lock)
2467 held += report(repo.vfs, "wlock", repo.wlock)
2467 held += report(repo.vfs, "wlock", repo.wlock)
2468
2468
2469 return held
2469 return held
2470
2470
2471 @command('debugobsolete',
2471 @command('debugobsolete',
2472 [('', 'flags', 0, _('markers flag')),
2472 [('', 'flags', 0, _('markers flag')),
2473 ('', 'record-parents', False,
2473 ('', 'record-parents', False,
2474 _('record parent information for the precursor')),
2474 _('record parent information for the precursor')),
2475 ('r', 'rev', [], _('display markers relevant to REV')),
2475 ('r', 'rev', [], _('display markers relevant to REV')),
2476 ] + commitopts2,
2476 ] + commitopts2,
2477 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2477 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2478 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2478 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2479 """create arbitrary obsolete marker
2479 """create arbitrary obsolete marker
2480
2480
2481 With no arguments, displays the list of obsolescence markers."""
2481 With no arguments, displays the list of obsolescence markers."""
2482
2482
2483 def parsenodeid(s):
2483 def parsenodeid(s):
2484 try:
2484 try:
2485 # We do not use revsingle/revrange functions here to accept
2485 # We do not use revsingle/revrange functions here to accept
2486 # arbitrary node identifiers, possibly not present in the
2486 # arbitrary node identifiers, possibly not present in the
2487 # local repository.
2487 # local repository.
2488 n = bin(s)
2488 n = bin(s)
2489 if len(n) != len(nullid):
2489 if len(n) != len(nullid):
2490 raise TypeError()
2490 raise TypeError()
2491 return n
2491 return n
2492 except TypeError:
2492 except TypeError:
2493 raise util.Abort('changeset references must be full hexadecimal '
2493 raise util.Abort('changeset references must be full hexadecimal '
2494 'node identifiers')
2494 'node identifiers')
2495
2495
2496 if precursor is not None:
2496 if precursor is not None:
2497 if opts['rev']:
2497 if opts['rev']:
2498 raise util.Abort('cannot select revision when creating marker')
2498 raise util.Abort('cannot select revision when creating marker')
2499 metadata = {}
2499 metadata = {}
2500 metadata['user'] = opts['user'] or ui.username()
2500 metadata['user'] = opts['user'] or ui.username()
2501 succs = tuple(parsenodeid(succ) for succ in successors)
2501 succs = tuple(parsenodeid(succ) for succ in successors)
2502 l = repo.lock()
2502 l = repo.lock()
2503 try:
2503 try:
2504 tr = repo.transaction('debugobsolete')
2504 tr = repo.transaction('debugobsolete')
2505 try:
2505 try:
2506 try:
2506 try:
2507 date = opts.get('date')
2507 date = opts.get('date')
2508 if date:
2508 if date:
2509 date = util.parsedate(date)
2509 date = util.parsedate(date)
2510 else:
2510 else:
2511 date = None
2511 date = None
2512 prec = parsenodeid(precursor)
2512 prec = parsenodeid(precursor)
2513 parents = None
2513 parents = None
2514 if opts['record_parents']:
2514 if opts['record_parents']:
2515 if prec not in repo.unfiltered():
2515 if prec not in repo.unfiltered():
2516 raise util.Abort('cannot used --record-parents on '
2516 raise util.Abort('cannot used --record-parents on '
2517 'unknown changesets')
2517 'unknown changesets')
2518 parents = repo.unfiltered()[prec].parents()
2518 parents = repo.unfiltered()[prec].parents()
2519 parents = tuple(p.node() for p in parents)
2519 parents = tuple(p.node() for p in parents)
2520 repo.obsstore.create(tr, prec, succs, opts['flags'],
2520 repo.obsstore.create(tr, prec, succs, opts['flags'],
2521 parents=parents, date=date,
2521 parents=parents, date=date,
2522 metadata=metadata)
2522 metadata=metadata)
2523 tr.close()
2523 tr.close()
2524 except ValueError, exc:
2524 except ValueError, exc:
2525 raise util.Abort(_('bad obsmarker input: %s') % exc)
2525 raise util.Abort(_('bad obsmarker input: %s') % exc)
2526 finally:
2526 finally:
2527 tr.release()
2527 tr.release()
2528 finally:
2528 finally:
2529 l.release()
2529 l.release()
2530 else:
2530 else:
2531 if opts['rev']:
2531 if opts['rev']:
2532 revs = scmutil.revrange(repo, opts['rev'])
2532 revs = scmutil.revrange(repo, opts['rev'])
2533 nodes = [repo[r].node() for r in revs]
2533 nodes = [repo[r].node() for r in revs]
2534 markers = list(obsolete.getmarkers(repo, nodes=nodes))
2534 markers = list(obsolete.getmarkers(repo, nodes=nodes))
2535 markers.sort(key=lambda x: x._data)
2535 markers.sort(key=lambda x: x._data)
2536 else:
2536 else:
2537 markers = obsolete.getmarkers(repo)
2537 markers = obsolete.getmarkers(repo)
2538
2538
2539 for m in markers:
2539 for m in markers:
2540 cmdutil.showmarker(ui, m)
2540 cmdutil.showmarker(ui, m)
2541
2541
2542 @command('debugpathcomplete',
2542 @command('debugpathcomplete',
2543 [('f', 'full', None, _('complete an entire path')),
2543 [('f', 'full', None, _('complete an entire path')),
2544 ('n', 'normal', None, _('show only normal files')),
2544 ('n', 'normal', None, _('show only normal files')),
2545 ('a', 'added', None, _('show only added files')),
2545 ('a', 'added', None, _('show only added files')),
2546 ('r', 'removed', None, _('show only removed files'))],
2546 ('r', 'removed', None, _('show only removed files'))],
2547 _('FILESPEC...'))
2547 _('FILESPEC...'))
2548 def debugpathcomplete(ui, repo, *specs, **opts):
2548 def debugpathcomplete(ui, repo, *specs, **opts):
2549 '''complete part or all of a tracked path
2549 '''complete part or all of a tracked path
2550
2550
2551 This command supports shells that offer path name completion. It
2551 This command supports shells that offer path name completion. It
2552 currently completes only files already known to the dirstate.
2552 currently completes only files already known to the dirstate.
2553
2553
2554 Completion extends only to the next path segment unless
2554 Completion extends only to the next path segment unless
2555 --full is specified, in which case entire paths are used.'''
2555 --full is specified, in which case entire paths are used.'''
2556
2556
2557 def complete(path, acceptable):
2557 def complete(path, acceptable):
2558 dirstate = repo.dirstate
2558 dirstate = repo.dirstate
2559 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2559 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2560 rootdir = repo.root + os.sep
2560 rootdir = repo.root + os.sep
2561 if spec != repo.root and not spec.startswith(rootdir):
2561 if spec != repo.root and not spec.startswith(rootdir):
2562 return [], []
2562 return [], []
2563 if os.path.isdir(spec):
2563 if os.path.isdir(spec):
2564 spec += '/'
2564 spec += '/'
2565 spec = spec[len(rootdir):]
2565 spec = spec[len(rootdir):]
2566 fixpaths = os.sep != '/'
2566 fixpaths = os.sep != '/'
2567 if fixpaths:
2567 if fixpaths:
2568 spec = spec.replace(os.sep, '/')
2568 spec = spec.replace(os.sep, '/')
2569 speclen = len(spec)
2569 speclen = len(spec)
2570 fullpaths = opts['full']
2570 fullpaths = opts['full']
2571 files, dirs = set(), set()
2571 files, dirs = set(), set()
2572 adddir, addfile = dirs.add, files.add
2572 adddir, addfile = dirs.add, files.add
2573 for f, st in dirstate.iteritems():
2573 for f, st in dirstate.iteritems():
2574 if f.startswith(spec) and st[0] in acceptable:
2574 if f.startswith(spec) and st[0] in acceptable:
2575 if fixpaths:
2575 if fixpaths:
2576 f = f.replace('/', os.sep)
2576 f = f.replace('/', os.sep)
2577 if fullpaths:
2577 if fullpaths:
2578 addfile(f)
2578 addfile(f)
2579 continue
2579 continue
2580 s = f.find(os.sep, speclen)
2580 s = f.find(os.sep, speclen)
2581 if s >= 0:
2581 if s >= 0:
2582 adddir(f[:s])
2582 adddir(f[:s])
2583 else:
2583 else:
2584 addfile(f)
2584 addfile(f)
2585 return files, dirs
2585 return files, dirs
2586
2586
2587 acceptable = ''
2587 acceptable = ''
2588 if opts['normal']:
2588 if opts['normal']:
2589 acceptable += 'nm'
2589 acceptable += 'nm'
2590 if opts['added']:
2590 if opts['added']:
2591 acceptable += 'a'
2591 acceptable += 'a'
2592 if opts['removed']:
2592 if opts['removed']:
2593 acceptable += 'r'
2593 acceptable += 'r'
2594 cwd = repo.getcwd()
2594 cwd = repo.getcwd()
2595 if not specs:
2595 if not specs:
2596 specs = ['.']
2596 specs = ['.']
2597
2597
2598 files, dirs = set(), set()
2598 files, dirs = set(), set()
2599 for spec in specs:
2599 for spec in specs:
2600 f, d = complete(spec, acceptable or 'nmar')
2600 f, d = complete(spec, acceptable or 'nmar')
2601 files.update(f)
2601 files.update(f)
2602 dirs.update(d)
2602 dirs.update(d)
2603 files.update(dirs)
2603 files.update(dirs)
2604 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2604 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2605 ui.write('\n')
2605 ui.write('\n')
2606
2606
2607 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2607 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2608 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2608 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2609 '''access the pushkey key/value protocol
2609 '''access the pushkey key/value protocol
2610
2610
2611 With two args, list the keys in the given namespace.
2611 With two args, list the keys in the given namespace.
2612
2612
2613 With five args, set a key to new if it currently is set to old.
2613 With five args, set a key to new if it currently is set to old.
2614 Reports success or failure.
2614 Reports success or failure.
2615 '''
2615 '''
2616
2616
2617 target = hg.peer(ui, {}, repopath)
2617 target = hg.peer(ui, {}, repopath)
2618 if keyinfo:
2618 if keyinfo:
2619 key, old, new = keyinfo
2619 key, old, new = keyinfo
2620 r = target.pushkey(namespace, key, old, new)
2620 r = target.pushkey(namespace, key, old, new)
2621 ui.status(str(r) + '\n')
2621 ui.status(str(r) + '\n')
2622 return not r
2622 return not r
2623 else:
2623 else:
2624 for k, v in sorted(target.listkeys(namespace).iteritems()):
2624 for k, v in sorted(target.listkeys(namespace).iteritems()):
2625 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2625 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2626 v.encode('string-escape')))
2626 v.encode('string-escape')))
2627
2627
2628 @command('debugpvec', [], _('A B'))
2628 @command('debugpvec', [], _('A B'))
2629 def debugpvec(ui, repo, a, b=None):
2629 def debugpvec(ui, repo, a, b=None):
2630 ca = scmutil.revsingle(repo, a)
2630 ca = scmutil.revsingle(repo, a)
2631 cb = scmutil.revsingle(repo, b)
2631 cb = scmutil.revsingle(repo, b)
2632 pa = pvec.ctxpvec(ca)
2632 pa = pvec.ctxpvec(ca)
2633 pb = pvec.ctxpvec(cb)
2633 pb = pvec.ctxpvec(cb)
2634 if pa == pb:
2634 if pa == pb:
2635 rel = "="
2635 rel = "="
2636 elif pa > pb:
2636 elif pa > pb:
2637 rel = ">"
2637 rel = ">"
2638 elif pa < pb:
2638 elif pa < pb:
2639 rel = "<"
2639 rel = "<"
2640 elif pa | pb:
2640 elif pa | pb:
2641 rel = "|"
2641 rel = "|"
2642 ui.write(_("a: %s\n") % pa)
2642 ui.write(_("a: %s\n") % pa)
2643 ui.write(_("b: %s\n") % pb)
2643 ui.write(_("b: %s\n") % pb)
2644 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2644 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2645 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2645 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2646 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2646 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2647 pa.distance(pb), rel))
2647 pa.distance(pb), rel))
2648
2648
2649 @command('debugrebuilddirstate|debugrebuildstate',
2649 @command('debugrebuilddirstate|debugrebuildstate',
2650 [('r', 'rev', '', _('revision to rebuild to'), _('REV'))],
2650 [('r', 'rev', '', _('revision to rebuild to'), _('REV'))],
2651 _('[-r REV]'))
2651 _('[-r REV]'))
2652 def debugrebuilddirstate(ui, repo, rev):
2652 def debugrebuilddirstate(ui, repo, rev):
2653 """rebuild the dirstate as it would look like for the given revision
2653 """rebuild the dirstate as it would look like for the given revision
2654
2654
2655 If no revision is specified the first current parent will be used.
2655 If no revision is specified the first current parent will be used.
2656
2656
2657 The dirstate will be set to the files of the given revision.
2657 The dirstate will be set to the files of the given revision.
2658 The actual working directory content or existing dirstate
2658 The actual working directory content or existing dirstate
2659 information such as adds or removes is not considered.
2659 information such as adds or removes is not considered.
2660
2660
2661 One use of this command is to make the next :hg:`status` invocation
2661 One use of this command is to make the next :hg:`status` invocation
2662 check the actual file content.
2662 check the actual file content.
2663 """
2663 """
2664 ctx = scmutil.revsingle(repo, rev)
2664 ctx = scmutil.revsingle(repo, rev)
2665 wlock = repo.wlock()
2665 wlock = repo.wlock()
2666 try:
2666 try:
2667 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
2667 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
2668 finally:
2668 finally:
2669 wlock.release()
2669 wlock.release()
2670
2670
2671 @command('debugrename',
2671 @command('debugrename',
2672 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2672 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2673 _('[-r REV] FILE'))
2673 _('[-r REV] FILE'))
2674 def debugrename(ui, repo, file1, *pats, **opts):
2674 def debugrename(ui, repo, file1, *pats, **opts):
2675 """dump rename information"""
2675 """dump rename information"""
2676
2676
2677 ctx = scmutil.revsingle(repo, opts.get('rev'))
2677 ctx = scmutil.revsingle(repo, opts.get('rev'))
2678 m = scmutil.match(ctx, (file1,) + pats, opts)
2678 m = scmutil.match(ctx, (file1,) + pats, opts)
2679 for abs in ctx.walk(m):
2679 for abs in ctx.walk(m):
2680 fctx = ctx[abs]
2680 fctx = ctx[abs]
2681 o = fctx.filelog().renamed(fctx.filenode())
2681 o = fctx.filelog().renamed(fctx.filenode())
2682 rel = m.rel(abs)
2682 rel = m.rel(abs)
2683 if o:
2683 if o:
2684 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2684 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2685 else:
2685 else:
2686 ui.write(_("%s not renamed\n") % rel)
2686 ui.write(_("%s not renamed\n") % rel)
2687
2687
2688 @command('debugrevlog',
2688 @command('debugrevlog',
2689 [('c', 'changelog', False, _('open changelog')),
2689 [('c', 'changelog', False, _('open changelog')),
2690 ('m', 'manifest', False, _('open manifest')),
2690 ('m', 'manifest', False, _('open manifest')),
2691 ('d', 'dump', False, _('dump index data'))],
2691 ('d', 'dump', False, _('dump index data'))],
2692 _('-c|-m|FILE'),
2692 _('-c|-m|FILE'),
2693 optionalrepo=True)
2693 optionalrepo=True)
2694 def debugrevlog(ui, repo, file_=None, **opts):
2694 def debugrevlog(ui, repo, file_=None, **opts):
2695 """show data and statistics about a revlog"""
2695 """show data and statistics about a revlog"""
2696 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2696 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2697
2697
2698 if opts.get("dump"):
2698 if opts.get("dump"):
2699 numrevs = len(r)
2699 numrevs = len(r)
2700 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2700 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2701 " rawsize totalsize compression heads chainlen\n")
2701 " rawsize totalsize compression heads chainlen\n")
2702 ts = 0
2702 ts = 0
2703 heads = set()
2703 heads = set()
2704
2704
2705 for rev in xrange(numrevs):
2705 for rev in xrange(numrevs):
2706 dbase = r.deltaparent(rev)
2706 dbase = r.deltaparent(rev)
2707 if dbase == -1:
2707 if dbase == -1:
2708 dbase = rev
2708 dbase = rev
2709 cbase = r.chainbase(rev)
2709 cbase = r.chainbase(rev)
2710 clen = r.chainlen(rev)
2710 clen = r.chainlen(rev)
2711 p1, p2 = r.parentrevs(rev)
2711 p1, p2 = r.parentrevs(rev)
2712 rs = r.rawsize(rev)
2712 rs = r.rawsize(rev)
2713 ts = ts + rs
2713 ts = ts + rs
2714 heads -= set(r.parentrevs(rev))
2714 heads -= set(r.parentrevs(rev))
2715 heads.add(rev)
2715 heads.add(rev)
2716 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
2716 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d "
2717 "%11d %5d %8d\n" %
2717 "%11d %5d %8d\n" %
2718 (rev, p1, p2, r.start(rev), r.end(rev),
2718 (rev, p1, p2, r.start(rev), r.end(rev),
2719 r.start(dbase), r.start(cbase),
2719 r.start(dbase), r.start(cbase),
2720 r.start(p1), r.start(p2),
2720 r.start(p1), r.start(p2),
2721 rs, ts, ts / r.end(rev), len(heads), clen))
2721 rs, ts, ts / r.end(rev), len(heads), clen))
2722 return 0
2722 return 0
2723
2723
2724 v = r.version
2724 v = r.version
2725 format = v & 0xFFFF
2725 format = v & 0xFFFF
2726 flags = []
2726 flags = []
2727 gdelta = False
2727 gdelta = False
2728 if v & revlog.REVLOGNGINLINEDATA:
2728 if v & revlog.REVLOGNGINLINEDATA:
2729 flags.append('inline')
2729 flags.append('inline')
2730 if v & revlog.REVLOGGENERALDELTA:
2730 if v & revlog.REVLOGGENERALDELTA:
2731 gdelta = True
2731 gdelta = True
2732 flags.append('generaldelta')
2732 flags.append('generaldelta')
2733 if not flags:
2733 if not flags:
2734 flags = ['(none)']
2734 flags = ['(none)']
2735
2735
2736 nummerges = 0
2736 nummerges = 0
2737 numfull = 0
2737 numfull = 0
2738 numprev = 0
2738 numprev = 0
2739 nump1 = 0
2739 nump1 = 0
2740 nump2 = 0
2740 nump2 = 0
2741 numother = 0
2741 numother = 0
2742 nump1prev = 0
2742 nump1prev = 0
2743 nump2prev = 0
2743 nump2prev = 0
2744 chainlengths = []
2744 chainlengths = []
2745
2745
2746 datasize = [None, 0, 0L]
2746 datasize = [None, 0, 0L]
2747 fullsize = [None, 0, 0L]
2747 fullsize = [None, 0, 0L]
2748 deltasize = [None, 0, 0L]
2748 deltasize = [None, 0, 0L]
2749
2749
2750 def addsize(size, l):
2750 def addsize(size, l):
2751 if l[0] is None or size < l[0]:
2751 if l[0] is None or size < l[0]:
2752 l[0] = size
2752 l[0] = size
2753 if size > l[1]:
2753 if size > l[1]:
2754 l[1] = size
2754 l[1] = size
2755 l[2] += size
2755 l[2] += size
2756
2756
2757 numrevs = len(r)
2757 numrevs = len(r)
2758 for rev in xrange(numrevs):
2758 for rev in xrange(numrevs):
2759 p1, p2 = r.parentrevs(rev)
2759 p1, p2 = r.parentrevs(rev)
2760 delta = r.deltaparent(rev)
2760 delta = r.deltaparent(rev)
2761 if format > 0:
2761 if format > 0:
2762 addsize(r.rawsize(rev), datasize)
2762 addsize(r.rawsize(rev), datasize)
2763 if p2 != nullrev:
2763 if p2 != nullrev:
2764 nummerges += 1
2764 nummerges += 1
2765 size = r.length(rev)
2765 size = r.length(rev)
2766 if delta == nullrev:
2766 if delta == nullrev:
2767 chainlengths.append(0)
2767 chainlengths.append(0)
2768 numfull += 1
2768 numfull += 1
2769 addsize(size, fullsize)
2769 addsize(size, fullsize)
2770 else:
2770 else:
2771 chainlengths.append(chainlengths[delta] + 1)
2771 chainlengths.append(chainlengths[delta] + 1)
2772 addsize(size, deltasize)
2772 addsize(size, deltasize)
2773 if delta == rev - 1:
2773 if delta == rev - 1:
2774 numprev += 1
2774 numprev += 1
2775 if delta == p1:
2775 if delta == p1:
2776 nump1prev += 1
2776 nump1prev += 1
2777 elif delta == p2:
2777 elif delta == p2:
2778 nump2prev += 1
2778 nump2prev += 1
2779 elif delta == p1:
2779 elif delta == p1:
2780 nump1 += 1
2780 nump1 += 1
2781 elif delta == p2:
2781 elif delta == p2:
2782 nump2 += 1
2782 nump2 += 1
2783 elif delta != nullrev:
2783 elif delta != nullrev:
2784 numother += 1
2784 numother += 1
2785
2785
2786 # Adjust size min value for empty cases
2786 # Adjust size min value for empty cases
2787 for size in (datasize, fullsize, deltasize):
2787 for size in (datasize, fullsize, deltasize):
2788 if size[0] is None:
2788 if size[0] is None:
2789 size[0] = 0
2789 size[0] = 0
2790
2790
2791 numdeltas = numrevs - numfull
2791 numdeltas = numrevs - numfull
2792 numoprev = numprev - nump1prev - nump2prev
2792 numoprev = numprev - nump1prev - nump2prev
2793 totalrawsize = datasize[2]
2793 totalrawsize = datasize[2]
2794 datasize[2] /= numrevs
2794 datasize[2] /= numrevs
2795 fulltotal = fullsize[2]
2795 fulltotal = fullsize[2]
2796 fullsize[2] /= numfull
2796 fullsize[2] /= numfull
2797 deltatotal = deltasize[2]
2797 deltatotal = deltasize[2]
2798 if numrevs - numfull > 0:
2798 if numrevs - numfull > 0:
2799 deltasize[2] /= numrevs - numfull
2799 deltasize[2] /= numrevs - numfull
2800 totalsize = fulltotal + deltatotal
2800 totalsize = fulltotal + deltatotal
2801 avgchainlen = sum(chainlengths) / numrevs
2801 avgchainlen = sum(chainlengths) / numrevs
2802 compratio = totalrawsize / totalsize
2802 compratio = totalrawsize / totalsize
2803
2803
2804 basedfmtstr = '%%%dd\n'
2804 basedfmtstr = '%%%dd\n'
2805 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
2805 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
2806
2806
2807 def dfmtstr(max):
2807 def dfmtstr(max):
2808 return basedfmtstr % len(str(max))
2808 return basedfmtstr % len(str(max))
2809 def pcfmtstr(max, padding=0):
2809 def pcfmtstr(max, padding=0):
2810 return basepcfmtstr % (len(str(max)), ' ' * padding)
2810 return basepcfmtstr % (len(str(max)), ' ' * padding)
2811
2811
2812 def pcfmt(value, total):
2812 def pcfmt(value, total):
2813 return (value, 100 * float(value) / total)
2813 return (value, 100 * float(value) / total)
2814
2814
2815 ui.write(('format : %d\n') % format)
2815 ui.write(('format : %d\n') % format)
2816 ui.write(('flags : %s\n') % ', '.join(flags))
2816 ui.write(('flags : %s\n') % ', '.join(flags))
2817
2817
2818 ui.write('\n')
2818 ui.write('\n')
2819 fmt = pcfmtstr(totalsize)
2819 fmt = pcfmtstr(totalsize)
2820 fmt2 = dfmtstr(totalsize)
2820 fmt2 = dfmtstr(totalsize)
2821 ui.write(('revisions : ') + fmt2 % numrevs)
2821 ui.write(('revisions : ') + fmt2 % numrevs)
2822 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
2822 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
2823 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
2823 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
2824 ui.write(('revisions : ') + fmt2 % numrevs)
2824 ui.write(('revisions : ') + fmt2 % numrevs)
2825 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
2825 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
2826 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
2826 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
2827 ui.write(('revision size : ') + fmt2 % totalsize)
2827 ui.write(('revision size : ') + fmt2 % totalsize)
2828 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
2828 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
2829 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
2829 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
2830
2830
2831 ui.write('\n')
2831 ui.write('\n')
2832 fmt = dfmtstr(max(avgchainlen, compratio))
2832 fmt = dfmtstr(max(avgchainlen, compratio))
2833 ui.write(('avg chain length : ') + fmt % avgchainlen)
2833 ui.write(('avg chain length : ') + fmt % avgchainlen)
2834 ui.write(('compression ratio : ') + fmt % compratio)
2834 ui.write(('compression ratio : ') + fmt % compratio)
2835
2835
2836 if format > 0:
2836 if format > 0:
2837 ui.write('\n')
2837 ui.write('\n')
2838 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
2838 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
2839 % tuple(datasize))
2839 % tuple(datasize))
2840 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
2840 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
2841 % tuple(fullsize))
2841 % tuple(fullsize))
2842 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
2842 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
2843 % tuple(deltasize))
2843 % tuple(deltasize))
2844
2844
2845 if numdeltas > 0:
2845 if numdeltas > 0:
2846 ui.write('\n')
2846 ui.write('\n')
2847 fmt = pcfmtstr(numdeltas)
2847 fmt = pcfmtstr(numdeltas)
2848 fmt2 = pcfmtstr(numdeltas, 4)
2848 fmt2 = pcfmtstr(numdeltas, 4)
2849 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
2849 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
2850 if numprev > 0:
2850 if numprev > 0:
2851 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
2851 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
2852 numprev))
2852 numprev))
2853 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
2853 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
2854 numprev))
2854 numprev))
2855 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
2855 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
2856 numprev))
2856 numprev))
2857 if gdelta:
2857 if gdelta:
2858 ui.write(('deltas against p1 : ')
2858 ui.write(('deltas against p1 : ')
2859 + fmt % pcfmt(nump1, numdeltas))
2859 + fmt % pcfmt(nump1, numdeltas))
2860 ui.write(('deltas against p2 : ')
2860 ui.write(('deltas against p2 : ')
2861 + fmt % pcfmt(nump2, numdeltas))
2861 + fmt % pcfmt(nump2, numdeltas))
2862 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
2862 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
2863 numdeltas))
2863 numdeltas))
2864
2864
2865 @command('debugrevspec',
2865 @command('debugrevspec',
2866 [('', 'optimize', None, _('print parsed tree after optimizing'))],
2866 [('', 'optimize', None, _('print parsed tree after optimizing'))],
2867 ('REVSPEC'))
2867 ('REVSPEC'))
2868 def debugrevspec(ui, repo, expr, **opts):
2868 def debugrevspec(ui, repo, expr, **opts):
2869 """parse and apply a revision specification
2869 """parse and apply a revision specification
2870
2870
2871 Use --verbose to print the parsed tree before and after aliases
2871 Use --verbose to print the parsed tree before and after aliases
2872 expansion.
2872 expansion.
2873 """
2873 """
2874 if ui.verbose:
2874 if ui.verbose:
2875 tree = revset.parse(expr)[0]
2875 tree = revset.parse(expr)[0]
2876 ui.note(revset.prettyformat(tree), "\n")
2876 ui.note(revset.prettyformat(tree), "\n")
2877 newtree = revset.findaliases(ui, tree)
2877 newtree = revset.findaliases(ui, tree)
2878 if newtree != tree:
2878 if newtree != tree:
2879 ui.note(revset.prettyformat(newtree), "\n")
2879 ui.note(revset.prettyformat(newtree), "\n")
2880 tree = newtree
2880 tree = newtree
2881 newtree = revset.foldconcat(tree)
2881 newtree = revset.foldconcat(tree)
2882 if newtree != tree:
2882 if newtree != tree:
2883 ui.note(revset.prettyformat(newtree), "\n")
2883 ui.note(revset.prettyformat(newtree), "\n")
2884 if opts["optimize"]:
2884 if opts["optimize"]:
2885 weight, optimizedtree = revset.optimize(newtree, True)
2885 weight, optimizedtree = revset.optimize(newtree, True)
2886 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
2886 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
2887 func = revset.match(ui, expr)
2887 func = revset.match(ui, expr)
2888 for c in func(repo):
2888 for c in func(repo):
2889 ui.write("%s\n" % c)
2889 ui.write("%s\n" % c)
2890
2890
2891 @command('debugsetparents', [], _('REV1 [REV2]'))
2891 @command('debugsetparents', [], _('REV1 [REV2]'))
2892 def debugsetparents(ui, repo, rev1, rev2=None):
2892 def debugsetparents(ui, repo, rev1, rev2=None):
2893 """manually set the parents of the current working directory
2893 """manually set the parents of the current working directory
2894
2894
2895 This is useful for writing repository conversion tools, but should
2895 This is useful for writing repository conversion tools, but should
2896 be used with care. For example, neither the working copy nor the dirstate
2896 be used with care. For example, neither the working copy nor the dirstate
2897 is updated, so file status may be incorrect after running this command.
2897 is updated, so file status may be incorrect after running this command.
2898
2898
2899 Returns 0 on success.
2899 Returns 0 on success.
2900 """
2900 """
2901
2901
2902 r1 = scmutil.revsingle(repo, rev1).node()
2902 r1 = scmutil.revsingle(repo, rev1).node()
2903 r2 = scmutil.revsingle(repo, rev2, 'null').node()
2903 r2 = scmutil.revsingle(repo, rev2, 'null').node()
2904
2904
2905 wlock = repo.wlock()
2905 wlock = repo.wlock()
2906 try:
2906 try:
2907 repo.dirstate.beginparentchange()
2907 repo.dirstate.beginparentchange()
2908 repo.setparents(r1, r2)
2908 repo.setparents(r1, r2)
2909 repo.dirstate.endparentchange()
2909 repo.dirstate.endparentchange()
2910 finally:
2910 finally:
2911 wlock.release()
2911 wlock.release()
2912
2912
2913 @command('debugdirstate|debugstate',
2913 @command('debugdirstate|debugstate',
2914 [('', 'nodates', None, _('do not display the saved mtime')),
2914 [('', 'nodates', None, _('do not display the saved mtime')),
2915 ('', 'datesort', None, _('sort by saved mtime'))],
2915 ('', 'datesort', None, _('sort by saved mtime'))],
2916 _('[OPTION]...'))
2916 _('[OPTION]...'))
2917 def debugstate(ui, repo, nodates=None, datesort=None):
2917 def debugstate(ui, repo, nodates=None, datesort=None):
2918 """show the contents of the current dirstate"""
2918 """show the contents of the current dirstate"""
2919 timestr = ""
2919 timestr = ""
2920 if datesort:
2920 if datesort:
2921 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
2921 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
2922 else:
2922 else:
2923 keyfunc = None # sort by filename
2923 keyfunc = None # sort by filename
2924 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
2924 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
2925 if ent[3] == -1:
2925 if ent[3] == -1:
2926 timestr = 'unset '
2926 timestr = 'unset '
2927 elif nodates:
2927 elif nodates:
2928 timestr = 'set '
2928 timestr = 'set '
2929 else:
2929 else:
2930 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
2930 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
2931 time.localtime(ent[3]))
2931 time.localtime(ent[3]))
2932 if ent[1] & 020000:
2932 if ent[1] & 020000:
2933 mode = 'lnk'
2933 mode = 'lnk'
2934 else:
2934 else:
2935 mode = '%3o' % (ent[1] & 0777 & ~util.umask)
2935 mode = '%3o' % (ent[1] & 0777 & ~util.umask)
2936 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
2936 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
2937 for f in repo.dirstate.copies():
2937 for f in repo.dirstate.copies():
2938 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
2938 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
2939
2939
2940 @command('debugsub',
2940 @command('debugsub',
2941 [('r', 'rev', '',
2941 [('r', 'rev', '',
2942 _('revision to check'), _('REV'))],
2942 _('revision to check'), _('REV'))],
2943 _('[-r REV] [REV]'))
2943 _('[-r REV] [REV]'))
2944 def debugsub(ui, repo, rev=None):
2944 def debugsub(ui, repo, rev=None):
2945 ctx = scmutil.revsingle(repo, rev, None)
2945 ctx = scmutil.revsingle(repo, rev, None)
2946 for k, v in sorted(ctx.substate.items()):
2946 for k, v in sorted(ctx.substate.items()):
2947 ui.write(('path %s\n') % k)
2947 ui.write(('path %s\n') % k)
2948 ui.write((' source %s\n') % v[0])
2948 ui.write((' source %s\n') % v[0])
2949 ui.write((' revision %s\n') % v[1])
2949 ui.write((' revision %s\n') % v[1])
2950
2950
2951 @command('debugsuccessorssets',
2951 @command('debugsuccessorssets',
2952 [],
2952 [],
2953 _('[REV]'))
2953 _('[REV]'))
2954 def debugsuccessorssets(ui, repo, *revs):
2954 def debugsuccessorssets(ui, repo, *revs):
2955 """show set of successors for revision
2955 """show set of successors for revision
2956
2956
2957 A successors set of changeset A is a consistent group of revisions that
2957 A successors set of changeset A is a consistent group of revisions that
2958 succeed A. It contains non-obsolete changesets only.
2958 succeed A. It contains non-obsolete changesets only.
2959
2959
2960 In most cases a changeset A has a single successors set containing a single
2960 In most cases a changeset A has a single successors set containing a single
2961 successor (changeset A replaced by A').
2961 successor (changeset A replaced by A').
2962
2962
2963 A changeset that is made obsolete with no successors are called "pruned".
2963 A changeset that is made obsolete with no successors are called "pruned".
2964 Such changesets have no successors sets at all.
2964 Such changesets have no successors sets at all.
2965
2965
2966 A changeset that has been "split" will have a successors set containing
2966 A changeset that has been "split" will have a successors set containing
2967 more than one successor.
2967 more than one successor.
2968
2968
2969 A changeset that has been rewritten in multiple different ways is called
2969 A changeset that has been rewritten in multiple different ways is called
2970 "divergent". Such changesets have multiple successor sets (each of which
2970 "divergent". Such changesets have multiple successor sets (each of which
2971 may also be split, i.e. have multiple successors).
2971 may also be split, i.e. have multiple successors).
2972
2972
2973 Results are displayed as follows::
2973 Results are displayed as follows::
2974
2974
2975 <rev1>
2975 <rev1>
2976 <successors-1A>
2976 <successors-1A>
2977 <rev2>
2977 <rev2>
2978 <successors-2A>
2978 <successors-2A>
2979 <successors-2B1> <successors-2B2> <successors-2B3>
2979 <successors-2B1> <successors-2B2> <successors-2B3>
2980
2980
2981 Here rev2 has two possible (i.e. divergent) successors sets. The first
2981 Here rev2 has two possible (i.e. divergent) successors sets. The first
2982 holds one element, whereas the second holds three (i.e. the changeset has
2982 holds one element, whereas the second holds three (i.e. the changeset has
2983 been split).
2983 been split).
2984 """
2984 """
2985 # passed to successorssets caching computation from one call to another
2985 # passed to successorssets caching computation from one call to another
2986 cache = {}
2986 cache = {}
2987 ctx2str = str
2987 ctx2str = str
2988 node2str = short
2988 node2str = short
2989 if ui.debug():
2989 if ui.debug():
2990 def ctx2str(ctx):
2990 def ctx2str(ctx):
2991 return ctx.hex()
2991 return ctx.hex()
2992 node2str = hex
2992 node2str = hex
2993 for rev in scmutil.revrange(repo, revs):
2993 for rev in scmutil.revrange(repo, revs):
2994 ctx = repo[rev]
2994 ctx = repo[rev]
2995 ui.write('%s\n'% ctx2str(ctx))
2995 ui.write('%s\n'% ctx2str(ctx))
2996 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
2996 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
2997 if succsset:
2997 if succsset:
2998 ui.write(' ')
2998 ui.write(' ')
2999 ui.write(node2str(succsset[0]))
2999 ui.write(node2str(succsset[0]))
3000 for node in succsset[1:]:
3000 for node in succsset[1:]:
3001 ui.write(' ')
3001 ui.write(' ')
3002 ui.write(node2str(node))
3002 ui.write(node2str(node))
3003 ui.write('\n')
3003 ui.write('\n')
3004
3004
3005 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
3005 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
3006 def debugwalk(ui, repo, *pats, **opts):
3006 def debugwalk(ui, repo, *pats, **opts):
3007 """show how files match on given patterns"""
3007 """show how files match on given patterns"""
3008 m = scmutil.match(repo[None], pats, opts)
3008 m = scmutil.match(repo[None], pats, opts)
3009 items = list(repo.walk(m))
3009 items = list(repo.walk(m))
3010 if not items:
3010 if not items:
3011 return
3011 return
3012 f = lambda fn: fn
3012 f = lambda fn: fn
3013 if ui.configbool('ui', 'slash') and os.sep != '/':
3013 if ui.configbool('ui', 'slash') and os.sep != '/':
3014 f = lambda fn: util.normpath(fn)
3014 f = lambda fn: util.normpath(fn)
3015 fmt = 'f %%-%ds %%-%ds %%s' % (
3015 fmt = 'f %%-%ds %%-%ds %%s' % (
3016 max([len(abs) for abs in items]),
3016 max([len(abs) for abs in items]),
3017 max([len(m.rel(abs)) for abs in items]))
3017 max([len(m.rel(abs)) for abs in items]))
3018 for abs in items:
3018 for abs in items:
3019 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
3019 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
3020 ui.write("%s\n" % line.rstrip())
3020 ui.write("%s\n" % line.rstrip())
3021
3021
3022 @command('debugwireargs',
3022 @command('debugwireargs',
3023 [('', 'three', '', 'three'),
3023 [('', 'three', '', 'three'),
3024 ('', 'four', '', 'four'),
3024 ('', 'four', '', 'four'),
3025 ('', 'five', '', 'five'),
3025 ('', 'five', '', 'five'),
3026 ] + remoteopts,
3026 ] + remoteopts,
3027 _('REPO [OPTIONS]... [ONE [TWO]]'),
3027 _('REPO [OPTIONS]... [ONE [TWO]]'),
3028 norepo=True)
3028 norepo=True)
3029 def debugwireargs(ui, repopath, *vals, **opts):
3029 def debugwireargs(ui, repopath, *vals, **opts):
3030 repo = hg.peer(ui, opts, repopath)
3030 repo = hg.peer(ui, opts, repopath)
3031 for opt in remoteopts:
3031 for opt in remoteopts:
3032 del opts[opt[1]]
3032 del opts[opt[1]]
3033 args = {}
3033 args = {}
3034 for k, v in opts.iteritems():
3034 for k, v in opts.iteritems():
3035 if v:
3035 if v:
3036 args[k] = v
3036 args[k] = v
3037 # run twice to check that we don't mess up the stream for the next command
3037 # run twice to check that we don't mess up the stream for the next command
3038 res1 = repo.debugwireargs(*vals, **args)
3038 res1 = repo.debugwireargs(*vals, **args)
3039 res2 = repo.debugwireargs(*vals, **args)
3039 res2 = repo.debugwireargs(*vals, **args)
3040 ui.write("%s\n" % res1)
3040 ui.write("%s\n" % res1)
3041 if res1 != res2:
3041 if res1 != res2:
3042 ui.warn("%s\n" % res2)
3042 ui.warn("%s\n" % res2)
3043
3043
3044 @command('^diff',
3044 @command('^diff',
3045 [('r', 'rev', [], _('revision'), _('REV')),
3045 [('r', 'rev', [], _('revision'), _('REV')),
3046 ('c', 'change', '', _('change made by revision'), _('REV'))
3046 ('c', 'change', '', _('change made by revision'), _('REV'))
3047 ] + diffopts + diffopts2 + walkopts + subrepoopts,
3047 ] + diffopts + diffopts2 + walkopts + subrepoopts,
3048 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
3048 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
3049 inferrepo=True)
3049 inferrepo=True)
3050 def diff(ui, repo, *pats, **opts):
3050 def diff(ui, repo, *pats, **opts):
3051 """diff repository (or selected files)
3051 """diff repository (or selected files)
3052
3052
3053 Show differences between revisions for the specified files.
3053 Show differences between revisions for the specified files.
3054
3054
3055 Differences between files are shown using the unified diff format.
3055 Differences between files are shown using the unified diff format.
3056
3056
3057 .. note::
3057 .. note::
3058
3058
3059 diff may generate unexpected results for merges, as it will
3059 diff may generate unexpected results for merges, as it will
3060 default to comparing against the working directory's first
3060 default to comparing against the working directory's first
3061 parent changeset if no revisions are specified.
3061 parent changeset if no revisions are specified.
3062
3062
3063 When two revision arguments are given, then changes are shown
3063 When two revision arguments are given, then changes are shown
3064 between those revisions. If only one revision is specified then
3064 between those revisions. If only one revision is specified then
3065 that revision is compared to the working directory, and, when no
3065 that revision is compared to the working directory, and, when no
3066 revisions are specified, the working directory files are compared
3066 revisions are specified, the working directory files are compared
3067 to its parent.
3067 to its parent.
3068
3068
3069 Alternatively you can specify -c/--change with a revision to see
3069 Alternatively you can specify -c/--change with a revision to see
3070 the changes in that changeset relative to its first parent.
3070 the changes in that changeset relative to its first parent.
3071
3071
3072 Without the -a/--text option, diff will avoid generating diffs of
3072 Without the -a/--text option, diff will avoid generating diffs of
3073 files it detects as binary. With -a, diff will generate a diff
3073 files it detects as binary. With -a, diff will generate a diff
3074 anyway, probably with undesirable results.
3074 anyway, probably with undesirable results.
3075
3075
3076 Use the -g/--git option to generate diffs in the git extended diff
3076 Use the -g/--git option to generate diffs in the git extended diff
3077 format. For more information, read :hg:`help diffs`.
3077 format. For more information, read :hg:`help diffs`.
3078
3078
3079 .. container:: verbose
3079 .. container:: verbose
3080
3080
3081 Examples:
3081 Examples:
3082
3082
3083 - compare a file in the current working directory to its parent::
3083 - compare a file in the current working directory to its parent::
3084
3084
3085 hg diff foo.c
3085 hg diff foo.c
3086
3086
3087 - compare two historical versions of a directory, with rename info::
3087 - compare two historical versions of a directory, with rename info::
3088
3088
3089 hg diff --git -r 1.0:1.2 lib/
3089 hg diff --git -r 1.0:1.2 lib/
3090
3090
3091 - get change stats relative to the last change on some date::
3091 - get change stats relative to the last change on some date::
3092
3092
3093 hg diff --stat -r "date('may 2')"
3093 hg diff --stat -r "date('may 2')"
3094
3094
3095 - diff all newly-added files that contain a keyword::
3095 - diff all newly-added files that contain a keyword::
3096
3096
3097 hg diff "set:added() and grep(GNU)"
3097 hg diff "set:added() and grep(GNU)"
3098
3098
3099 - compare a revision and its parents::
3099 - compare a revision and its parents::
3100
3100
3101 hg diff -c 9353 # compare against first parent
3101 hg diff -c 9353 # compare against first parent
3102 hg diff -r 9353^:9353 # same using revset syntax
3102 hg diff -r 9353^:9353 # same using revset syntax
3103 hg diff -r 9353^2:9353 # compare against the second parent
3103 hg diff -r 9353^2:9353 # compare against the second parent
3104
3104
3105 Returns 0 on success.
3105 Returns 0 on success.
3106 """
3106 """
3107
3107
3108 revs = opts.get('rev')
3108 revs = opts.get('rev')
3109 change = opts.get('change')
3109 change = opts.get('change')
3110 stat = opts.get('stat')
3110 stat = opts.get('stat')
3111 reverse = opts.get('reverse')
3111 reverse = opts.get('reverse')
3112
3112
3113 if revs and change:
3113 if revs and change:
3114 msg = _('cannot specify --rev and --change at the same time')
3114 msg = _('cannot specify --rev and --change at the same time')
3115 raise util.Abort(msg)
3115 raise util.Abort(msg)
3116 elif change:
3116 elif change:
3117 node2 = scmutil.revsingle(repo, change, None).node()
3117 node2 = scmutil.revsingle(repo, change, None).node()
3118 node1 = repo[node2].p1().node()
3118 node1 = repo[node2].p1().node()
3119 else:
3119 else:
3120 node1, node2 = scmutil.revpair(repo, revs)
3120 node1, node2 = scmutil.revpair(repo, revs)
3121
3121
3122 if reverse:
3122 if reverse:
3123 node1, node2 = node2, node1
3123 node1, node2 = node2, node1
3124
3124
3125 diffopts = patch.diffallopts(ui, opts)
3125 diffopts = patch.diffallopts(ui, opts)
3126 m = scmutil.match(repo[node2], pats, opts)
3126 m = scmutil.match(repo[node2], pats, opts)
3127 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
3127 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
3128 listsubrepos=opts.get('subrepos'))
3128 listsubrepos=opts.get('subrepos'))
3129
3129
3130 @command('^export',
3130 @command('^export',
3131 [('o', 'output', '',
3131 [('o', 'output', '',
3132 _('print output to file with formatted name'), _('FORMAT')),
3132 _('print output to file with formatted name'), _('FORMAT')),
3133 ('', 'switch-parent', None, _('diff against the second parent')),
3133 ('', 'switch-parent', None, _('diff against the second parent')),
3134 ('r', 'rev', [], _('revisions to export'), _('REV')),
3134 ('r', 'rev', [], _('revisions to export'), _('REV')),
3135 ] + diffopts,
3135 ] + diffopts,
3136 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
3136 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
3137 def export(ui, repo, *changesets, **opts):
3137 def export(ui, repo, *changesets, **opts):
3138 """dump the header and diffs for one or more changesets
3138 """dump the header and diffs for one or more changesets
3139
3139
3140 Print the changeset header and diffs for one or more revisions.
3140 Print the changeset header and diffs for one or more revisions.
3141 If no revision is given, the parent of the working directory is used.
3141 If no revision is given, the parent of the working directory is used.
3142
3142
3143 The information shown in the changeset header is: author, date,
3143 The information shown in the changeset header is: author, date,
3144 branch name (if non-default), changeset hash, parent(s) and commit
3144 branch name (if non-default), changeset hash, parent(s) and commit
3145 comment.
3145 comment.
3146
3146
3147 .. note::
3147 .. note::
3148
3148
3149 export may generate unexpected diff output for merge
3149 export may generate unexpected diff output for merge
3150 changesets, as it will compare the merge changeset against its
3150 changesets, as it will compare the merge changeset against its
3151 first parent only.
3151 first parent only.
3152
3152
3153 Output may be to a file, in which case the name of the file is
3153 Output may be to a file, in which case the name of the file is
3154 given using a format string. The formatting rules are as follows:
3154 given using a format string. The formatting rules are as follows:
3155
3155
3156 :``%%``: literal "%" character
3156 :``%%``: literal "%" character
3157 :``%H``: changeset hash (40 hexadecimal digits)
3157 :``%H``: changeset hash (40 hexadecimal digits)
3158 :``%N``: number of patches being generated
3158 :``%N``: number of patches being generated
3159 :``%R``: changeset revision number
3159 :``%R``: changeset revision number
3160 :``%b``: basename of the exporting repository
3160 :``%b``: basename of the exporting repository
3161 :``%h``: short-form changeset hash (12 hexadecimal digits)
3161 :``%h``: short-form changeset hash (12 hexadecimal digits)
3162 :``%m``: first line of the commit message (only alphanumeric characters)
3162 :``%m``: first line of the commit message (only alphanumeric characters)
3163 :``%n``: zero-padded sequence number, starting at 1
3163 :``%n``: zero-padded sequence number, starting at 1
3164 :``%r``: zero-padded changeset revision number
3164 :``%r``: zero-padded changeset revision number
3165
3165
3166 Without the -a/--text option, export will avoid generating diffs
3166 Without the -a/--text option, export will avoid generating diffs
3167 of files it detects as binary. With -a, export will generate a
3167 of files it detects as binary. With -a, export will generate a
3168 diff anyway, probably with undesirable results.
3168 diff anyway, probably with undesirable results.
3169
3169
3170 Use the -g/--git option to generate diffs in the git extended diff
3170 Use the -g/--git option to generate diffs in the git extended diff
3171 format. See :hg:`help diffs` for more information.
3171 format. See :hg:`help diffs` for more information.
3172
3172
3173 With the --switch-parent option, the diff will be against the
3173 With the --switch-parent option, the diff will be against the
3174 second parent. It can be useful to review a merge.
3174 second parent. It can be useful to review a merge.
3175
3175
3176 .. container:: verbose
3176 .. container:: verbose
3177
3177
3178 Examples:
3178 Examples:
3179
3179
3180 - use export and import to transplant a bugfix to the current
3180 - use export and import to transplant a bugfix to the current
3181 branch::
3181 branch::
3182
3182
3183 hg export -r 9353 | hg import -
3183 hg export -r 9353 | hg import -
3184
3184
3185 - export all the changesets between two revisions to a file with
3185 - export all the changesets between two revisions to a file with
3186 rename information::
3186 rename information::
3187
3187
3188 hg export --git -r 123:150 > changes.txt
3188 hg export --git -r 123:150 > changes.txt
3189
3189
3190 - split outgoing changes into a series of patches with
3190 - split outgoing changes into a series of patches with
3191 descriptive names::
3191 descriptive names::
3192
3192
3193 hg export -r "outgoing()" -o "%n-%m.patch"
3193 hg export -r "outgoing()" -o "%n-%m.patch"
3194
3194
3195 Returns 0 on success.
3195 Returns 0 on success.
3196 """
3196 """
3197 changesets += tuple(opts.get('rev', []))
3197 changesets += tuple(opts.get('rev', []))
3198 if not changesets:
3198 if not changesets:
3199 changesets = ['.']
3199 changesets = ['.']
3200 revs = scmutil.revrange(repo, changesets)
3200 revs = scmutil.revrange(repo, changesets)
3201 if not revs:
3201 if not revs:
3202 raise util.Abort(_("export requires at least one changeset"))
3202 raise util.Abort(_("export requires at least one changeset"))
3203 if len(revs) > 1:
3203 if len(revs) > 1:
3204 ui.note(_('exporting patches:\n'))
3204 ui.note(_('exporting patches:\n'))
3205 else:
3205 else:
3206 ui.note(_('exporting patch:\n'))
3206 ui.note(_('exporting patch:\n'))
3207 cmdutil.export(repo, revs, template=opts.get('output'),
3207 cmdutil.export(repo, revs, template=opts.get('output'),
3208 switch_parent=opts.get('switch_parent'),
3208 switch_parent=opts.get('switch_parent'),
3209 opts=patch.diffallopts(ui, opts))
3209 opts=patch.diffallopts(ui, opts))
3210
3210
3211 @command('files',
3211 @command('files',
3212 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
3212 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
3213 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
3213 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
3214 ] + walkopts + formatteropts,
3214 ] + walkopts + formatteropts,
3215 _('[OPTION]... [PATTERN]...'))
3215 _('[OPTION]... [PATTERN]...'))
3216 def files(ui, repo, *pats, **opts):
3216 def files(ui, repo, *pats, **opts):
3217 """list tracked files
3217 """list tracked files
3218
3218
3219 Print files under Mercurial control in the working directory or
3219 Print files under Mercurial control in the working directory or
3220 specified revision whose names match the given patterns (excluding
3220 specified revision whose names match the given patterns (excluding
3221 removed files).
3221 removed files).
3222
3222
3223 If no patterns are given to match, this command prints the names
3223 If no patterns are given to match, this command prints the names
3224 of all files under Mercurial control in the working copy.
3224 of all files under Mercurial control in the working copy.
3225
3225
3226 .. container:: verbose
3226 .. container:: verbose
3227
3227
3228 Examples:
3228 Examples:
3229
3229
3230 - list all files under the current directory::
3230 - list all files under the current directory::
3231
3231
3232 hg files .
3232 hg files .
3233
3233
3234 - shows sizes and flags for current revision::
3234 - shows sizes and flags for current revision::
3235
3235
3236 hg files -vr .
3236 hg files -vr .
3237
3237
3238 - list all files named README::
3238 - list all files named README::
3239
3239
3240 hg files -I "**/README"
3240 hg files -I "**/README"
3241
3241
3242 - list all binary files::
3242 - list all binary files::
3243
3243
3244 hg files "set:binary()"
3244 hg files "set:binary()"
3245
3245
3246 - find files containing a regular expression::
3246 - find files containing a regular expression::
3247
3247
3248 hg files "set:grep('bob')"
3248 hg files "set:grep('bob')"
3249
3249
3250 - search tracked file contents with xargs and grep::
3250 - search tracked file contents with xargs and grep::
3251
3251
3252 hg files -0 | xargs -0 grep foo
3252 hg files -0 | xargs -0 grep foo
3253
3253
3254 See :hg:`help patterns` and :hg:`help filesets` for more information
3254 See :hg:`help patterns` and :hg:`help filesets` for more information
3255 on specifying file patterns.
3255 on specifying file patterns.
3256
3256
3257 Returns 0 if a match is found, 1 otherwise.
3257 Returns 0 if a match is found, 1 otherwise.
3258
3258
3259 """
3259 """
3260 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
3260 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
3261 rev = ctx.rev()
3261 rev = ctx.rev()
3262 ret = 1
3262 ret = 1
3263
3263
3264 end = '\n'
3264 end = '\n'
3265 if opts.get('print0'):
3265 if opts.get('print0'):
3266 end = '\0'
3266 end = '\0'
3267 fm = ui.formatter('files', opts)
3267 fm = ui.formatter('files', opts)
3268 fmt = '%s' + end
3268 fmt = '%s' + end
3269
3269
3270 m = scmutil.match(ctx, pats, opts)
3270 m = scmutil.match(ctx, pats, opts)
3271 ds = repo.dirstate
3271 ds = repo.dirstate
3272 for f in ctx.matches(m):
3272 for f in ctx.matches(m):
3273 if rev is None and ds[f] == 'r':
3273 if rev is None and ds[f] == 'r':
3274 continue
3274 continue
3275 fm.startitem()
3275 fm.startitem()
3276 if ui.verbose:
3276 if ui.verbose:
3277 fc = ctx[f]
3277 fc = ctx[f]
3278 fm.write('size flags', '% 10d % 1s ', fc.size(), fc.flags())
3278 fm.write('size flags', '% 10d % 1s ', fc.size(), fc.flags())
3279 fm.data(abspath=f)
3279 fm.data(abspath=f)
3280 fm.write('path', fmt, m.rel(f))
3280 fm.write('path', fmt, m.rel(f))
3281 ret = 0
3281 ret = 0
3282
3282
3283 fm.end()
3283 fm.end()
3284
3284
3285 return ret
3285 return ret
3286
3286
3287 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3287 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3288 def forget(ui, repo, *pats, **opts):
3288 def forget(ui, repo, *pats, **opts):
3289 """forget the specified files on the next commit
3289 """forget the specified files on the next commit
3290
3290
3291 Mark the specified files so they will no longer be tracked
3291 Mark the specified files so they will no longer be tracked
3292 after the next commit.
3292 after the next commit.
3293
3293
3294 This only removes files from the current branch, not from the
3294 This only removes files from the current branch, not from the
3295 entire project history, and it does not delete them from the
3295 entire project history, and it does not delete them from the
3296 working directory.
3296 working directory.
3297
3297
3298 To undo a forget before the next commit, see :hg:`add`.
3298 To undo a forget before the next commit, see :hg:`add`.
3299
3299
3300 .. container:: verbose
3300 .. container:: verbose
3301
3301
3302 Examples:
3302 Examples:
3303
3303
3304 - forget newly-added binary files::
3304 - forget newly-added binary files::
3305
3305
3306 hg forget "set:added() and binary()"
3306 hg forget "set:added() and binary()"
3307
3307
3308 - forget files that would be excluded by .hgignore::
3308 - forget files that would be excluded by .hgignore::
3309
3309
3310 hg forget "set:hgignore()"
3310 hg forget "set:hgignore()"
3311
3311
3312 Returns 0 on success.
3312 Returns 0 on success.
3313 """
3313 """
3314
3314
3315 if not pats:
3315 if not pats:
3316 raise util.Abort(_('no files specified'))
3316 raise util.Abort(_('no files specified'))
3317
3317
3318 m = scmutil.match(repo[None], pats, opts)
3318 m = scmutil.match(repo[None], pats, opts)
3319 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3319 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3320 return rejected and 1 or 0
3320 return rejected and 1 or 0
3321
3321
3322 @command(
3322 @command(
3323 'graft',
3323 'graft',
3324 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3324 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3325 ('c', 'continue', False, _('resume interrupted graft')),
3325 ('c', 'continue', False, _('resume interrupted graft')),
3326 ('e', 'edit', False, _('invoke editor on commit messages')),
3326 ('e', 'edit', False, _('invoke editor on commit messages')),
3327 ('', 'log', None, _('append graft info to log message')),
3327 ('', 'log', None, _('append graft info to log message')),
3328 ('f', 'force', False, _('force graft')),
3328 ('f', 'force', False, _('force graft')),
3329 ('D', 'currentdate', False,
3329 ('D', 'currentdate', False,
3330 _('record the current date as commit date')),
3330 _('record the current date as commit date')),
3331 ('U', 'currentuser', False,
3331 ('U', 'currentuser', False,
3332 _('record the current user as committer'), _('DATE'))]
3332 _('record the current user as committer'), _('DATE'))]
3333 + commitopts2 + mergetoolopts + dryrunopts,
3333 + commitopts2 + mergetoolopts + dryrunopts,
3334 _('[OPTION]... [-r] REV...'))
3334 _('[OPTION]... [-r] REV...'))
3335 def graft(ui, repo, *revs, **opts):
3335 def graft(ui, repo, *revs, **opts):
3336 '''copy changes from other branches onto the current branch
3336 '''copy changes from other branches onto the current branch
3337
3337
3338 This command uses Mercurial's merge logic to copy individual
3338 This command uses Mercurial's merge logic to copy individual
3339 changes from other branches without merging branches in the
3339 changes from other branches without merging branches in the
3340 history graph. This is sometimes known as 'backporting' or
3340 history graph. This is sometimes known as 'backporting' or
3341 'cherry-picking'. By default, graft will copy user, date, and
3341 'cherry-picking'. By default, graft will copy user, date, and
3342 description from the source changesets.
3342 description from the source changesets.
3343
3343
3344 Changesets that are ancestors of the current revision, that have
3344 Changesets that are ancestors of the current revision, that have
3345 already been grafted, or that are merges will be skipped.
3345 already been grafted, or that are merges will be skipped.
3346
3346
3347 If --log is specified, log messages will have a comment appended
3347 If --log is specified, log messages will have a comment appended
3348 of the form::
3348 of the form::
3349
3349
3350 (grafted from CHANGESETHASH)
3350 (grafted from CHANGESETHASH)
3351
3351
3352 If --force is specified, revisions will be grafted even if they
3352 If --force is specified, revisions will be grafted even if they
3353 are already ancestors of or have been grafted to the destination.
3353 are already ancestors of or have been grafted to the destination.
3354 This is useful when the revisions have since been backed out.
3354 This is useful when the revisions have since been backed out.
3355
3355
3356 If a graft merge results in conflicts, the graft process is
3356 If a graft merge results in conflicts, the graft process is
3357 interrupted so that the current merge can be manually resolved.
3357 interrupted so that the current merge can be manually resolved.
3358 Once all conflicts are addressed, the graft process can be
3358 Once all conflicts are addressed, the graft process can be
3359 continued with the -c/--continue option.
3359 continued with the -c/--continue option.
3360
3360
3361 .. note::
3361 .. note::
3362
3362
3363 The -c/--continue option does not reapply earlier options, except
3363 The -c/--continue option does not reapply earlier options, except
3364 for --force.
3364 for --force.
3365
3365
3366 .. container:: verbose
3366 .. container:: verbose
3367
3367
3368 Examples:
3368 Examples:
3369
3369
3370 - copy a single change to the stable branch and edit its description::
3370 - copy a single change to the stable branch and edit its description::
3371
3371
3372 hg update stable
3372 hg update stable
3373 hg graft --edit 9393
3373 hg graft --edit 9393
3374
3374
3375 - graft a range of changesets with one exception, updating dates::
3375 - graft a range of changesets with one exception, updating dates::
3376
3376
3377 hg graft -D "2085::2093 and not 2091"
3377 hg graft -D "2085::2093 and not 2091"
3378
3378
3379 - continue a graft after resolving conflicts::
3379 - continue a graft after resolving conflicts::
3380
3380
3381 hg graft -c
3381 hg graft -c
3382
3382
3383 - show the source of a grafted changeset::
3383 - show the source of a grafted changeset::
3384
3384
3385 hg log --debug -r .
3385 hg log --debug -r .
3386
3386
3387 See :hg:`help revisions` and :hg:`help revsets` for more about
3387 See :hg:`help revisions` and :hg:`help revsets` for more about
3388 specifying revisions.
3388 specifying revisions.
3389
3389
3390 Returns 0 on successful completion.
3390 Returns 0 on successful completion.
3391 '''
3391 '''
3392
3392
3393 revs = list(revs)
3393 revs = list(revs)
3394 revs.extend(opts['rev'])
3394 revs.extend(opts['rev'])
3395
3395
3396 if not opts.get('user') and opts.get('currentuser'):
3396 if not opts.get('user') and opts.get('currentuser'):
3397 opts['user'] = ui.username()
3397 opts['user'] = ui.username()
3398 if not opts.get('date') and opts.get('currentdate'):
3398 if not opts.get('date') and opts.get('currentdate'):
3399 opts['date'] = "%d %d" % util.makedate()
3399 opts['date'] = "%d %d" % util.makedate()
3400
3400
3401 editor = cmdutil.getcommiteditor(editform='graft', **opts)
3401 editor = cmdutil.getcommiteditor(editform='graft', **opts)
3402
3402
3403 cont = False
3403 cont = False
3404 if opts['continue']:
3404 if opts['continue']:
3405 cont = True
3405 cont = True
3406 if revs:
3406 if revs:
3407 raise util.Abort(_("can't specify --continue and revisions"))
3407 raise util.Abort(_("can't specify --continue and revisions"))
3408 # read in unfinished revisions
3408 # read in unfinished revisions
3409 try:
3409 try:
3410 nodes = repo.vfs.read('graftstate').splitlines()
3410 nodes = repo.vfs.read('graftstate').splitlines()
3411 revs = [repo[node].rev() for node in nodes]
3411 revs = [repo[node].rev() for node in nodes]
3412 except IOError, inst:
3412 except IOError, inst:
3413 if inst.errno != errno.ENOENT:
3413 if inst.errno != errno.ENOENT:
3414 raise
3414 raise
3415 raise util.Abort(_("no graft state found, can't continue"))
3415 raise util.Abort(_("no graft state found, can't continue"))
3416 else:
3416 else:
3417 cmdutil.checkunfinished(repo)
3417 cmdutil.checkunfinished(repo)
3418 cmdutil.bailifchanged(repo)
3418 cmdutil.bailifchanged(repo)
3419 if not revs:
3419 if not revs:
3420 raise util.Abort(_('no revisions specified'))
3420 raise util.Abort(_('no revisions specified'))
3421 revs = scmutil.revrange(repo, revs)
3421 revs = scmutil.revrange(repo, revs)
3422
3422
3423 skipped = set()
3423 skipped = set()
3424 # check for merges
3424 # check for merges
3425 for rev in repo.revs('%ld and merge()', revs):
3425 for rev in repo.revs('%ld and merge()', revs):
3426 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3426 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3427 skipped.add(rev)
3427 skipped.add(rev)
3428 revs = [r for r in revs if r not in skipped]
3428 revs = [r for r in revs if r not in skipped]
3429 if not revs:
3429 if not revs:
3430 return -1
3430 return -1
3431
3431
3432 # Don't check in the --continue case, in effect retaining --force across
3432 # Don't check in the --continue case, in effect retaining --force across
3433 # --continues. That's because without --force, any revisions we decided to
3433 # --continues. That's because without --force, any revisions we decided to
3434 # skip would have been filtered out here, so they wouldn't have made their
3434 # skip would have been filtered out here, so they wouldn't have made their
3435 # way to the graftstate. With --force, any revisions we would have otherwise
3435 # way to the graftstate. With --force, any revisions we would have otherwise
3436 # skipped would not have been filtered out, and if they hadn't been applied
3436 # skipped would not have been filtered out, and if they hadn't been applied
3437 # already, they'd have been in the graftstate.
3437 # already, they'd have been in the graftstate.
3438 if not (cont or opts.get('force')):
3438 if not (cont or opts.get('force')):
3439 # check for ancestors of dest branch
3439 # check for ancestors of dest branch
3440 crev = repo['.'].rev()
3440 crev = repo['.'].rev()
3441 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3441 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3442 # Cannot use x.remove(y) on smart set, this has to be a list.
3442 # Cannot use x.remove(y) on smart set, this has to be a list.
3443 # XXX make this lazy in the future
3443 # XXX make this lazy in the future
3444 revs = list(revs)
3444 revs = list(revs)
3445 # don't mutate while iterating, create a copy
3445 # don't mutate while iterating, create a copy
3446 for rev in list(revs):
3446 for rev in list(revs):
3447 if rev in ancestors:
3447 if rev in ancestors:
3448 ui.warn(_('skipping ancestor revision %d:%s\n') %
3448 ui.warn(_('skipping ancestor revision %d:%s\n') %
3449 (rev, repo[rev]))
3449 (rev, repo[rev]))
3450 # XXX remove on list is slow
3450 # XXX remove on list is slow
3451 revs.remove(rev)
3451 revs.remove(rev)
3452 if not revs:
3452 if not revs:
3453 return -1
3453 return -1
3454
3454
3455 # analyze revs for earlier grafts
3455 # analyze revs for earlier grafts
3456 ids = {}
3456 ids = {}
3457 for ctx in repo.set("%ld", revs):
3457 for ctx in repo.set("%ld", revs):
3458 ids[ctx.hex()] = ctx.rev()
3458 ids[ctx.hex()] = ctx.rev()
3459 n = ctx.extra().get('source')
3459 n = ctx.extra().get('source')
3460 if n:
3460 if n:
3461 ids[n] = ctx.rev()
3461 ids[n] = ctx.rev()
3462
3462
3463 # check ancestors for earlier grafts
3463 # check ancestors for earlier grafts
3464 ui.debug('scanning for duplicate grafts\n')
3464 ui.debug('scanning for duplicate grafts\n')
3465
3465
3466 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3466 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3467 ctx = repo[rev]
3467 ctx = repo[rev]
3468 n = ctx.extra().get('source')
3468 n = ctx.extra().get('source')
3469 if n in ids:
3469 if n in ids:
3470 try:
3470 try:
3471 r = repo[n].rev()
3471 r = repo[n].rev()
3472 except error.RepoLookupError:
3472 except error.RepoLookupError:
3473 r = None
3473 r = None
3474 if r in revs:
3474 if r in revs:
3475 ui.warn(_('skipping revision %d:%s '
3475 ui.warn(_('skipping revision %d:%s '
3476 '(already grafted to %d:%s)\n')
3476 '(already grafted to %d:%s)\n')
3477 % (r, repo[r], rev, ctx))
3477 % (r, repo[r], rev, ctx))
3478 revs.remove(r)
3478 revs.remove(r)
3479 elif ids[n] in revs:
3479 elif ids[n] in revs:
3480 if r is None:
3480 if r is None:
3481 ui.warn(_('skipping already grafted revision %d:%s '
3481 ui.warn(_('skipping already grafted revision %d:%s '
3482 '(%d:%s also has unknown origin %s)\n')
3482 '(%d:%s also has unknown origin %s)\n')
3483 % (ids[n], repo[ids[n]], rev, ctx, n[:12]))
3483 % (ids[n], repo[ids[n]], rev, ctx, n[:12]))
3484 else:
3484 else:
3485 ui.warn(_('skipping already grafted revision %d:%s '
3485 ui.warn(_('skipping already grafted revision %d:%s '
3486 '(%d:%s also has origin %d:%s)\n')
3486 '(%d:%s also has origin %d:%s)\n')
3487 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12]))
3487 % (ids[n], repo[ids[n]], rev, ctx, r, n[:12]))
3488 revs.remove(ids[n])
3488 revs.remove(ids[n])
3489 elif ctx.hex() in ids:
3489 elif ctx.hex() in ids:
3490 r = ids[ctx.hex()]
3490 r = ids[ctx.hex()]
3491 ui.warn(_('skipping already grafted revision %d:%s '
3491 ui.warn(_('skipping already grafted revision %d:%s '
3492 '(was grafted from %d:%s)\n') %
3492 '(was grafted from %d:%s)\n') %
3493 (r, repo[r], rev, ctx))
3493 (r, repo[r], rev, ctx))
3494 revs.remove(r)
3494 revs.remove(r)
3495 if not revs:
3495 if not revs:
3496 return -1
3496 return -1
3497
3497
3498 wlock = repo.wlock()
3498 wlock = repo.wlock()
3499 try:
3499 try:
3500 for pos, ctx in enumerate(repo.set("%ld", revs)):
3500 for pos, ctx in enumerate(repo.set("%ld", revs)):
3501 desc = '%d:%s "%s"' % (ctx.rev(), ctx,
3501 desc = '%d:%s "%s"' % (ctx.rev(), ctx,
3502 ctx.description().split('\n', 1)[0])
3502 ctx.description().split('\n', 1)[0])
3503 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3503 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node())
3504 if names:
3504 if names:
3505 desc += ' (%s)' % ' '.join(names)
3505 desc += ' (%s)' % ' '.join(names)
3506 ui.status(_('grafting %s\n') % desc)
3506 ui.status(_('grafting %s\n') % desc)
3507 if opts.get('dry_run'):
3507 if opts.get('dry_run'):
3508 continue
3508 continue
3509
3509
3510 source = ctx.extra().get('source')
3510 source = ctx.extra().get('source')
3511 if not source:
3511 if not source:
3512 source = ctx.hex()
3512 source = ctx.hex()
3513 extra = {'source': source}
3513 extra = {'source': source}
3514 user = ctx.user()
3514 user = ctx.user()
3515 if opts.get('user'):
3515 if opts.get('user'):
3516 user = opts['user']
3516 user = opts['user']
3517 date = ctx.date()
3517 date = ctx.date()
3518 if opts.get('date'):
3518 if opts.get('date'):
3519 date = opts['date']
3519 date = opts['date']
3520 message = ctx.description()
3520 message = ctx.description()
3521 if opts.get('log'):
3521 if opts.get('log'):
3522 message += '\n(grafted from %s)' % ctx.hex()
3522 message += '\n(grafted from %s)' % ctx.hex()
3523
3523
3524 # we don't merge the first commit when continuing
3524 # we don't merge the first commit when continuing
3525 if not cont:
3525 if not cont:
3526 # perform the graft merge with p1(rev) as 'ancestor'
3526 # perform the graft merge with p1(rev) as 'ancestor'
3527 try:
3527 try:
3528 # ui.forcemerge is an internal variable, do not document
3528 # ui.forcemerge is an internal variable, do not document
3529 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3529 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3530 'graft')
3530 'graft')
3531 stats = mergemod.graft(repo, ctx, ctx.p1(),
3531 stats = mergemod.graft(repo, ctx, ctx.p1(),
3532 ['local', 'graft'])
3532 ['local', 'graft'])
3533 finally:
3533 finally:
3534 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3534 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3535 # report any conflicts
3535 # report any conflicts
3536 if stats and stats[3] > 0:
3536 if stats and stats[3] > 0:
3537 # write out state for --continue
3537 # write out state for --continue
3538 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3538 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3539 repo.vfs.write('graftstate', ''.join(nodelines))
3539 repo.vfs.write('graftstate', ''.join(nodelines))
3540 raise util.Abort(
3540 raise util.Abort(
3541 _("unresolved conflicts, can't continue"),
3541 _("unresolved conflicts, can't continue"),
3542 hint=_('use hg resolve and hg graft --continue'))
3542 hint=_('use hg resolve and hg graft --continue'))
3543 else:
3543 else:
3544 cont = False
3544 cont = False
3545
3545
3546 # commit
3546 # commit
3547 node = repo.commit(text=message, user=user,
3547 node = repo.commit(text=message, user=user,
3548 date=date, extra=extra, editor=editor)
3548 date=date, extra=extra, editor=editor)
3549 if node is None:
3549 if node is None:
3550 ui.warn(
3550 ui.warn(
3551 _('note: graft of %d:%s created no changes to commit\n') %
3551 _('note: graft of %d:%s created no changes to commit\n') %
3552 (ctx.rev(), ctx))
3552 (ctx.rev(), ctx))
3553 finally:
3553 finally:
3554 wlock.release()
3554 wlock.release()
3555
3555
3556 # remove state when we complete successfully
3556 # remove state when we complete successfully
3557 if not opts.get('dry_run'):
3557 if not opts.get('dry_run'):
3558 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3558 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3559
3559
3560 return 0
3560 return 0
3561
3561
3562 @command('grep',
3562 @command('grep',
3563 [('0', 'print0', None, _('end fields with NUL')),
3563 [('0', 'print0', None, _('end fields with NUL')),
3564 ('', 'all', None, _('print all revisions that match')),
3564 ('', 'all', None, _('print all revisions that match')),
3565 ('a', 'text', None, _('treat all files as text')),
3565 ('a', 'text', None, _('treat all files as text')),
3566 ('f', 'follow', None,
3566 ('f', 'follow', None,
3567 _('follow changeset history,'
3567 _('follow changeset history,'
3568 ' or file history across copies and renames')),
3568 ' or file history across copies and renames')),
3569 ('i', 'ignore-case', None, _('ignore case when matching')),
3569 ('i', 'ignore-case', None, _('ignore case when matching')),
3570 ('l', 'files-with-matches', None,
3570 ('l', 'files-with-matches', None,
3571 _('print only filenames and revisions that match')),
3571 _('print only filenames and revisions that match')),
3572 ('n', 'line-number', None, _('print matching line numbers')),
3572 ('n', 'line-number', None, _('print matching line numbers')),
3573 ('r', 'rev', [],
3573 ('r', 'rev', [],
3574 _('only search files changed within revision range'), _('REV')),
3574 _('only search files changed within revision range'), _('REV')),
3575 ('u', 'user', None, _('list the author (long with -v)')),
3575 ('u', 'user', None, _('list the author (long with -v)')),
3576 ('d', 'date', None, _('list the date (short with -q)')),
3576 ('d', 'date', None, _('list the date (short with -q)')),
3577 ] + walkopts,
3577 ] + walkopts,
3578 _('[OPTION]... PATTERN [FILE]...'),
3578 _('[OPTION]... PATTERN [FILE]...'),
3579 inferrepo=True)
3579 inferrepo=True)
3580 def grep(ui, repo, pattern, *pats, **opts):
3580 def grep(ui, repo, pattern, *pats, **opts):
3581 """search for a pattern in specified files and revisions
3581 """search for a pattern in specified files and revisions
3582
3582
3583 Search revisions of files for a regular expression.
3583 Search revisions of files for a regular expression.
3584
3584
3585 This command behaves differently than Unix grep. It only accepts
3585 This command behaves differently than Unix grep. It only accepts
3586 Python/Perl regexps. It searches repository history, not the
3586 Python/Perl regexps. It searches repository history, not the
3587 working directory. It always prints the revision number in which a
3587 working directory. It always prints the revision number in which a
3588 match appears.
3588 match appears.
3589
3589
3590 By default, grep only prints output for the first revision of a
3590 By default, grep only prints output for the first revision of a
3591 file in which it finds a match. To get it to print every revision
3591 file in which it finds a match. To get it to print every revision
3592 that contains a change in match status ("-" for a match that
3592 that contains a change in match status ("-" for a match that
3593 becomes a non-match, or "+" for a non-match that becomes a match),
3593 becomes a non-match, or "+" for a non-match that becomes a match),
3594 use the --all flag.
3594 use the --all flag.
3595
3595
3596 Returns 0 if a match is found, 1 otherwise.
3596 Returns 0 if a match is found, 1 otherwise.
3597 """
3597 """
3598 reflags = re.M
3598 reflags = re.M
3599 if opts.get('ignore_case'):
3599 if opts.get('ignore_case'):
3600 reflags |= re.I
3600 reflags |= re.I
3601 try:
3601 try:
3602 regexp = util.re.compile(pattern, reflags)
3602 regexp = util.re.compile(pattern, reflags)
3603 except re.error, inst:
3603 except re.error, inst:
3604 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3604 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3605 return 1
3605 return 1
3606 sep, eol = ':', '\n'
3606 sep, eol = ':', '\n'
3607 if opts.get('print0'):
3607 if opts.get('print0'):
3608 sep = eol = '\0'
3608 sep = eol = '\0'
3609
3609
3610 getfile = util.lrucachefunc(repo.file)
3610 getfile = util.lrucachefunc(repo.file)
3611
3611
3612 def matchlines(body):
3612 def matchlines(body):
3613 begin = 0
3613 begin = 0
3614 linenum = 0
3614 linenum = 0
3615 while begin < len(body):
3615 while begin < len(body):
3616 match = regexp.search(body, begin)
3616 match = regexp.search(body, begin)
3617 if not match:
3617 if not match:
3618 break
3618 break
3619 mstart, mend = match.span()
3619 mstart, mend = match.span()
3620 linenum += body.count('\n', begin, mstart) + 1
3620 linenum += body.count('\n', begin, mstart) + 1
3621 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3621 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3622 begin = body.find('\n', mend) + 1 or len(body) + 1
3622 begin = body.find('\n', mend) + 1 or len(body) + 1
3623 lend = begin - 1
3623 lend = begin - 1
3624 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3624 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3625
3625
3626 class linestate(object):
3626 class linestate(object):
3627 def __init__(self, line, linenum, colstart, colend):
3627 def __init__(self, line, linenum, colstart, colend):
3628 self.line = line
3628 self.line = line
3629 self.linenum = linenum
3629 self.linenum = linenum
3630 self.colstart = colstart
3630 self.colstart = colstart
3631 self.colend = colend
3631 self.colend = colend
3632
3632
3633 def __hash__(self):
3633 def __hash__(self):
3634 return hash((self.linenum, self.line))
3634 return hash((self.linenum, self.line))
3635
3635
3636 def __eq__(self, other):
3636 def __eq__(self, other):
3637 return self.line == other.line
3637 return self.line == other.line
3638
3638
3639 def __iter__(self):
3639 def __iter__(self):
3640 yield (self.line[:self.colstart], '')
3640 yield (self.line[:self.colstart], '')
3641 yield (self.line[self.colstart:self.colend], 'grep.match')
3641 yield (self.line[self.colstart:self.colend], 'grep.match')
3642 rest = self.line[self.colend:]
3642 rest = self.line[self.colend:]
3643 while rest != '':
3643 while rest != '':
3644 match = regexp.search(rest)
3644 match = regexp.search(rest)
3645 if not match:
3645 if not match:
3646 yield (rest, '')
3646 yield (rest, '')
3647 break
3647 break
3648 mstart, mend = match.span()
3648 mstart, mend = match.span()
3649 yield (rest[:mstart], '')
3649 yield (rest[:mstart], '')
3650 yield (rest[mstart:mend], 'grep.match')
3650 yield (rest[mstart:mend], 'grep.match')
3651 rest = rest[mend:]
3651 rest = rest[mend:]
3652
3652
3653 matches = {}
3653 matches = {}
3654 copies = {}
3654 copies = {}
3655 def grepbody(fn, rev, body):
3655 def grepbody(fn, rev, body):
3656 matches[rev].setdefault(fn, [])
3656 matches[rev].setdefault(fn, [])
3657 m = matches[rev][fn]
3657 m = matches[rev][fn]
3658 for lnum, cstart, cend, line in matchlines(body):
3658 for lnum, cstart, cend, line in matchlines(body):
3659 s = linestate(line, lnum, cstart, cend)
3659 s = linestate(line, lnum, cstart, cend)
3660 m.append(s)
3660 m.append(s)
3661
3661
3662 def difflinestates(a, b):
3662 def difflinestates(a, b):
3663 sm = difflib.SequenceMatcher(None, a, b)
3663 sm = difflib.SequenceMatcher(None, a, b)
3664 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3664 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3665 if tag == 'insert':
3665 if tag == 'insert':
3666 for i in xrange(blo, bhi):
3666 for i in xrange(blo, bhi):
3667 yield ('+', b[i])
3667 yield ('+', b[i])
3668 elif tag == 'delete':
3668 elif tag == 'delete':
3669 for i in xrange(alo, ahi):
3669 for i in xrange(alo, ahi):
3670 yield ('-', a[i])
3670 yield ('-', a[i])
3671 elif tag == 'replace':
3671 elif tag == 'replace':
3672 for i in xrange(alo, ahi):
3672 for i in xrange(alo, ahi):
3673 yield ('-', a[i])
3673 yield ('-', a[i])
3674 for i in xrange(blo, bhi):
3674 for i in xrange(blo, bhi):
3675 yield ('+', b[i])
3675 yield ('+', b[i])
3676
3676
3677 def display(fn, ctx, pstates, states):
3677 def display(fn, ctx, pstates, states):
3678 rev = ctx.rev()
3678 rev = ctx.rev()
3679 datefunc = ui.quiet and util.shortdate or util.datestr
3679 datefunc = ui.quiet and util.shortdate or util.datestr
3680 found = False
3680 found = False
3681 @util.cachefunc
3681 @util.cachefunc
3682 def binary():
3682 def binary():
3683 flog = getfile(fn)
3683 flog = getfile(fn)
3684 return util.binary(flog.read(ctx.filenode(fn)))
3684 return util.binary(flog.read(ctx.filenode(fn)))
3685
3685
3686 if opts.get('all'):
3686 if opts.get('all'):
3687 iter = difflinestates(pstates, states)
3687 iter = difflinestates(pstates, states)
3688 else:
3688 else:
3689 iter = [('', l) for l in states]
3689 iter = [('', l) for l in states]
3690 for change, l in iter:
3690 for change, l in iter:
3691 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3691 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3692
3692
3693 if opts.get('line_number'):
3693 if opts.get('line_number'):
3694 cols.append((str(l.linenum), 'grep.linenumber'))
3694 cols.append((str(l.linenum), 'grep.linenumber'))
3695 if opts.get('all'):
3695 if opts.get('all'):
3696 cols.append((change, 'grep.change'))
3696 cols.append((change, 'grep.change'))
3697 if opts.get('user'):
3697 if opts.get('user'):
3698 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3698 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3699 if opts.get('date'):
3699 if opts.get('date'):
3700 cols.append((datefunc(ctx.date()), 'grep.date'))
3700 cols.append((datefunc(ctx.date()), 'grep.date'))
3701 for col, label in cols[:-1]:
3701 for col, label in cols[:-1]:
3702 ui.write(col, label=label)
3702 ui.write(col, label=label)
3703 ui.write(sep, label='grep.sep')
3703 ui.write(sep, label='grep.sep')
3704 ui.write(cols[-1][0], label=cols[-1][1])
3704 ui.write(cols[-1][0], label=cols[-1][1])
3705 if not opts.get('files_with_matches'):
3705 if not opts.get('files_with_matches'):
3706 ui.write(sep, label='grep.sep')
3706 ui.write(sep, label='grep.sep')
3707 if not opts.get('text') and binary():
3707 if not opts.get('text') and binary():
3708 ui.write(" Binary file matches")
3708 ui.write(" Binary file matches")
3709 else:
3709 else:
3710 for s, label in l:
3710 for s, label in l:
3711 ui.write(s, label=label)
3711 ui.write(s, label=label)
3712 ui.write(eol)
3712 ui.write(eol)
3713 found = True
3713 found = True
3714 if opts.get('files_with_matches'):
3714 if opts.get('files_with_matches'):
3715 break
3715 break
3716 return found
3716 return found
3717
3717
3718 skip = {}
3718 skip = {}
3719 revfiles = {}
3719 revfiles = {}
3720 matchfn = scmutil.match(repo[None], pats, opts)
3720 matchfn = scmutil.match(repo[None], pats, opts)
3721 found = False
3721 found = False
3722 follow = opts.get('follow')
3722 follow = opts.get('follow')
3723
3723
3724 def prep(ctx, fns):
3724 def prep(ctx, fns):
3725 rev = ctx.rev()
3725 rev = ctx.rev()
3726 pctx = ctx.p1()
3726 pctx = ctx.p1()
3727 parent = pctx.rev()
3727 parent = pctx.rev()
3728 matches.setdefault(rev, {})
3728 matches.setdefault(rev, {})
3729 matches.setdefault(parent, {})
3729 matches.setdefault(parent, {})
3730 files = revfiles.setdefault(rev, [])
3730 files = revfiles.setdefault(rev, [])
3731 for fn in fns:
3731 for fn in fns:
3732 flog = getfile(fn)
3732 flog = getfile(fn)
3733 try:
3733 try:
3734 fnode = ctx.filenode(fn)
3734 fnode = ctx.filenode(fn)
3735 except error.LookupError:
3735 except error.LookupError:
3736 continue
3736 continue
3737
3737
3738 copied = flog.renamed(fnode)
3738 copied = flog.renamed(fnode)
3739 copy = follow and copied and copied[0]
3739 copy = follow and copied and copied[0]
3740 if copy:
3740 if copy:
3741 copies.setdefault(rev, {})[fn] = copy
3741 copies.setdefault(rev, {})[fn] = copy
3742 if fn in skip:
3742 if fn in skip:
3743 if copy:
3743 if copy:
3744 skip[copy] = True
3744 skip[copy] = True
3745 continue
3745 continue
3746 files.append(fn)
3746 files.append(fn)
3747
3747
3748 if fn not in matches[rev]:
3748 if fn not in matches[rev]:
3749 grepbody(fn, rev, flog.read(fnode))
3749 grepbody(fn, rev, flog.read(fnode))
3750
3750
3751 pfn = copy or fn
3751 pfn = copy or fn
3752 if pfn not in matches[parent]:
3752 if pfn not in matches[parent]:
3753 try:
3753 try:
3754 fnode = pctx.filenode(pfn)
3754 fnode = pctx.filenode(pfn)
3755 grepbody(pfn, parent, flog.read(fnode))
3755 grepbody(pfn, parent, flog.read(fnode))
3756 except error.LookupError:
3756 except error.LookupError:
3757 pass
3757 pass
3758
3758
3759 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3759 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3760 rev = ctx.rev()
3760 rev = ctx.rev()
3761 parent = ctx.p1().rev()
3761 parent = ctx.p1().rev()
3762 for fn in sorted(revfiles.get(rev, [])):
3762 for fn in sorted(revfiles.get(rev, [])):
3763 states = matches[rev][fn]
3763 states = matches[rev][fn]
3764 copy = copies.get(rev, {}).get(fn)
3764 copy = copies.get(rev, {}).get(fn)
3765 if fn in skip:
3765 if fn in skip:
3766 if copy:
3766 if copy:
3767 skip[copy] = True
3767 skip[copy] = True
3768 continue
3768 continue
3769 pstates = matches.get(parent, {}).get(copy or fn, [])
3769 pstates = matches.get(parent, {}).get(copy or fn, [])
3770 if pstates or states:
3770 if pstates or states:
3771 r = display(fn, ctx, pstates, states)
3771 r = display(fn, ctx, pstates, states)
3772 found = found or r
3772 found = found or r
3773 if r and not opts.get('all'):
3773 if r and not opts.get('all'):
3774 skip[fn] = True
3774 skip[fn] = True
3775 if copy:
3775 if copy:
3776 skip[copy] = True
3776 skip[copy] = True
3777 del matches[rev]
3777 del matches[rev]
3778 del revfiles[rev]
3778 del revfiles[rev]
3779
3779
3780 return not found
3780 return not found
3781
3781
3782 @command('heads',
3782 @command('heads',
3783 [('r', 'rev', '',
3783 [('r', 'rev', '',
3784 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
3784 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
3785 ('t', 'topo', False, _('show topological heads only')),
3785 ('t', 'topo', False, _('show topological heads only')),
3786 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
3786 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
3787 ('c', 'closed', False, _('show normal and closed branch heads')),
3787 ('c', 'closed', False, _('show normal and closed branch heads')),
3788 ] + templateopts,
3788 ] + templateopts,
3789 _('[-ct] [-r STARTREV] [REV]...'))
3789 _('[-ct] [-r STARTREV] [REV]...'))
3790 def heads(ui, repo, *branchrevs, **opts):
3790 def heads(ui, repo, *branchrevs, **opts):
3791 """show branch heads
3791 """show branch heads
3792
3792
3793 With no arguments, show all open branch heads in the repository.
3793 With no arguments, show all open branch heads in the repository.
3794 Branch heads are changesets that have no descendants on the
3794 Branch heads are changesets that have no descendants on the
3795 same branch. They are where development generally takes place and
3795 same branch. They are where development generally takes place and
3796 are the usual targets for update and merge operations.
3796 are the usual targets for update and merge operations.
3797
3797
3798 If one or more REVs are given, only open branch heads on the
3798 If one or more REVs are given, only open branch heads on the
3799 branches associated with the specified changesets are shown. This
3799 branches associated with the specified changesets are shown. This
3800 means that you can use :hg:`heads .` to see the heads on the
3800 means that you can use :hg:`heads .` to see the heads on the
3801 currently checked-out branch.
3801 currently checked-out branch.
3802
3802
3803 If -c/--closed is specified, also show branch heads marked closed
3803 If -c/--closed is specified, also show branch heads marked closed
3804 (see :hg:`commit --close-branch`).
3804 (see :hg:`commit --close-branch`).
3805
3805
3806 If STARTREV is specified, only those heads that are descendants of
3806 If STARTREV is specified, only those heads that are descendants of
3807 STARTREV will be displayed.
3807 STARTREV will be displayed.
3808
3808
3809 If -t/--topo is specified, named branch mechanics will be ignored and only
3809 If -t/--topo is specified, named branch mechanics will be ignored and only
3810 topological heads (changesets with no children) will be shown.
3810 topological heads (changesets with no children) will be shown.
3811
3811
3812 Returns 0 if matching heads are found, 1 if not.
3812 Returns 0 if matching heads are found, 1 if not.
3813 """
3813 """
3814
3814
3815 start = None
3815 start = None
3816 if 'rev' in opts:
3816 if 'rev' in opts:
3817 start = scmutil.revsingle(repo, opts['rev'], None).node()
3817 start = scmutil.revsingle(repo, opts['rev'], None).node()
3818
3818
3819 if opts.get('topo'):
3819 if opts.get('topo'):
3820 heads = [repo[h] for h in repo.heads(start)]
3820 heads = [repo[h] for h in repo.heads(start)]
3821 else:
3821 else:
3822 heads = []
3822 heads = []
3823 for branch in repo.branchmap():
3823 for branch in repo.branchmap():
3824 heads += repo.branchheads(branch, start, opts.get('closed'))
3824 heads += repo.branchheads(branch, start, opts.get('closed'))
3825 heads = [repo[h] for h in heads]
3825 heads = [repo[h] for h in heads]
3826
3826
3827 if branchrevs:
3827 if branchrevs:
3828 branches = set(repo[br].branch() for br in branchrevs)
3828 branches = set(repo[br].branch() for br in branchrevs)
3829 heads = [h for h in heads if h.branch() in branches]
3829 heads = [h for h in heads if h.branch() in branches]
3830
3830
3831 if opts.get('active') and branchrevs:
3831 if opts.get('active') and branchrevs:
3832 dagheads = repo.heads(start)
3832 dagheads = repo.heads(start)
3833 heads = [h for h in heads if h.node() in dagheads]
3833 heads = [h for h in heads if h.node() in dagheads]
3834
3834
3835 if branchrevs:
3835 if branchrevs:
3836 haveheads = set(h.branch() for h in heads)
3836 haveheads = set(h.branch() for h in heads)
3837 if branches - haveheads:
3837 if branches - haveheads:
3838 headless = ', '.join(b for b in branches - haveheads)
3838 headless = ', '.join(b for b in branches - haveheads)
3839 msg = _('no open branch heads found on branches %s')
3839 msg = _('no open branch heads found on branches %s')
3840 if opts.get('rev'):
3840 if opts.get('rev'):
3841 msg += _(' (started at %s)') % opts['rev']
3841 msg += _(' (started at %s)') % opts['rev']
3842 ui.warn((msg + '\n') % headless)
3842 ui.warn((msg + '\n') % headless)
3843
3843
3844 if not heads:
3844 if not heads:
3845 return 1
3845 return 1
3846
3846
3847 heads = sorted(heads, key=lambda x: -x.rev())
3847 heads = sorted(heads, key=lambda x: -x.rev())
3848 displayer = cmdutil.show_changeset(ui, repo, opts)
3848 displayer = cmdutil.show_changeset(ui, repo, opts)
3849 for ctx in heads:
3849 for ctx in heads:
3850 displayer.show(ctx)
3850 displayer.show(ctx)
3851 displayer.close()
3851 displayer.close()
3852
3852
3853 @command('help',
3853 @command('help',
3854 [('e', 'extension', None, _('show only help for extensions')),
3854 [('e', 'extension', None, _('show only help for extensions')),
3855 ('c', 'command', None, _('show only help for commands')),
3855 ('c', 'command', None, _('show only help for commands')),
3856 ('k', 'keyword', '', _('show topics matching keyword')),
3856 ('k', 'keyword', '', _('show topics matching keyword')),
3857 ],
3857 ],
3858 _('[-ec] [TOPIC]'),
3858 _('[-ec] [TOPIC]'),
3859 norepo=True)
3859 norepo=True)
3860 def help_(ui, name=None, **opts):
3860 def help_(ui, name=None, **opts):
3861 """show help for a given topic or a help overview
3861 """show help for a given topic or a help overview
3862
3862
3863 With no arguments, print a list of commands with short help messages.
3863 With no arguments, print a list of commands with short help messages.
3864
3864
3865 Given a topic, extension, or command name, print help for that
3865 Given a topic, extension, or command name, print help for that
3866 topic.
3866 topic.
3867
3867
3868 Returns 0 if successful.
3868 Returns 0 if successful.
3869 """
3869 """
3870
3870
3871 textwidth = min(ui.termwidth(), 80) - 2
3871 textwidth = min(ui.termwidth(), 80) - 2
3872
3872
3873 keep = []
3873 keep = []
3874 if ui.verbose:
3874 if ui.verbose:
3875 keep.append('verbose')
3875 keep.append('verbose')
3876 if sys.platform.startswith('win'):
3876 if sys.platform.startswith('win'):
3877 keep.append('windows')
3877 keep.append('windows')
3878 elif sys.platform == 'OpenVMS':
3878 elif sys.platform == 'OpenVMS':
3879 keep.append('vms')
3879 keep.append('vms')
3880 elif sys.platform == 'plan9':
3880 elif sys.platform == 'plan9':
3881 keep.append('plan9')
3881 keep.append('plan9')
3882 else:
3882 else:
3883 keep.append('unix')
3883 keep.append('unix')
3884 keep.append(sys.platform.lower())
3884 keep.append(sys.platform.lower())
3885
3885
3886 section = None
3886 section = None
3887 if name and '.' in name:
3887 if name and '.' in name:
3888 name, section = name.split('.', 1)
3888 name, section = name.split('.', 1)
3889
3889
3890 text = help.help_(ui, name, **opts)
3890 text = help.help_(ui, name, **opts)
3891
3891
3892 formatted, pruned = minirst.format(text, textwidth, keep=keep,
3892 formatted, pruned = minirst.format(text, textwidth, keep=keep,
3893 section=section)
3893 section=section)
3894 if section and not formatted:
3894 if section and not formatted:
3895 raise util.Abort(_("help section not found"))
3895 raise util.Abort(_("help section not found"))
3896
3896
3897 if 'verbose' in pruned:
3897 if 'verbose' in pruned:
3898 keep.append('omitted')
3898 keep.append('omitted')
3899 else:
3899 else:
3900 keep.append('notomitted')
3900 keep.append('notomitted')
3901 formatted, pruned = minirst.format(text, textwidth, keep=keep,
3901 formatted, pruned = minirst.format(text, textwidth, keep=keep,
3902 section=section)
3902 section=section)
3903 ui.write(formatted)
3903 ui.write(formatted)
3904
3904
3905
3905
3906 @command('identify|id',
3906 @command('identify|id',
3907 [('r', 'rev', '',
3907 [('r', 'rev', '',
3908 _('identify the specified revision'), _('REV')),
3908 _('identify the specified revision'), _('REV')),
3909 ('n', 'num', None, _('show local revision number')),
3909 ('n', 'num', None, _('show local revision number')),
3910 ('i', 'id', None, _('show global revision id')),
3910 ('i', 'id', None, _('show global revision id')),
3911 ('b', 'branch', None, _('show branch')),
3911 ('b', 'branch', None, _('show branch')),
3912 ('t', 'tags', None, _('show tags')),
3912 ('t', 'tags', None, _('show tags')),
3913 ('B', 'bookmarks', None, _('show bookmarks')),
3913 ('B', 'bookmarks', None, _('show bookmarks')),
3914 ] + remoteopts,
3914 ] + remoteopts,
3915 _('[-nibtB] [-r REV] [SOURCE]'),
3915 _('[-nibtB] [-r REV] [SOURCE]'),
3916 optionalrepo=True)
3916 optionalrepo=True)
3917 def identify(ui, repo, source=None, rev=None,
3917 def identify(ui, repo, source=None, rev=None,
3918 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
3918 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
3919 """identify the working copy or specified revision
3919 """identify the working copy or specified revision
3920
3920
3921 Print a summary identifying the repository state at REV using one or
3921 Print a summary identifying the repository state at REV using one or
3922 two parent hash identifiers, followed by a "+" if the working
3922 two parent hash identifiers, followed by a "+" if the working
3923 directory has uncommitted changes, the branch name (if not default),
3923 directory has uncommitted changes, the branch name (if not default),
3924 a list of tags, and a list of bookmarks.
3924 a list of tags, and a list of bookmarks.
3925
3925
3926 When REV is not given, print a summary of the current state of the
3926 When REV is not given, print a summary of the current state of the
3927 repository.
3927 repository.
3928
3928
3929 Specifying a path to a repository root or Mercurial bundle will
3929 Specifying a path to a repository root or Mercurial bundle will
3930 cause lookup to operate on that repository/bundle.
3930 cause lookup to operate on that repository/bundle.
3931
3931
3932 .. container:: verbose
3932 .. container:: verbose
3933
3933
3934 Examples:
3934 Examples:
3935
3935
3936 - generate a build identifier for the working directory::
3936 - generate a build identifier for the working directory::
3937
3937
3938 hg id --id > build-id.dat
3938 hg id --id > build-id.dat
3939
3939
3940 - find the revision corresponding to a tag::
3940 - find the revision corresponding to a tag::
3941
3941
3942 hg id -n -r 1.3
3942 hg id -n -r 1.3
3943
3943
3944 - check the most recent revision of a remote repository::
3944 - check the most recent revision of a remote repository::
3945
3945
3946 hg id -r tip http://selenic.com/hg/
3946 hg id -r tip http://selenic.com/hg/
3947
3947
3948 Returns 0 if successful.
3948 Returns 0 if successful.
3949 """
3949 """
3950
3950
3951 if not repo and not source:
3951 if not repo and not source:
3952 raise util.Abort(_("there is no Mercurial repository here "
3952 raise util.Abort(_("there is no Mercurial repository here "
3953 "(.hg not found)"))
3953 "(.hg not found)"))
3954
3954
3955 hexfunc = ui.debugflag and hex or short
3955 hexfunc = ui.debugflag and hex or short
3956 default = not (num or id or branch or tags or bookmarks)
3956 default = not (num or id or branch or tags or bookmarks)
3957 output = []
3957 output = []
3958 revs = []
3958 revs = []
3959
3959
3960 if source:
3960 if source:
3961 source, branches = hg.parseurl(ui.expandpath(source))
3961 source, branches = hg.parseurl(ui.expandpath(source))
3962 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3962 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3963 repo = peer.local()
3963 repo = peer.local()
3964 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3964 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3965
3965
3966 if not repo:
3966 if not repo:
3967 if num or branch or tags:
3967 if num or branch or tags:
3968 raise util.Abort(
3968 raise util.Abort(
3969 _("can't query remote revision number, branch, or tags"))
3969 _("can't query remote revision number, branch, or tags"))
3970 if not rev and revs:
3970 if not rev and revs:
3971 rev = revs[0]
3971 rev = revs[0]
3972 if not rev:
3972 if not rev:
3973 rev = "tip"
3973 rev = "tip"
3974
3974
3975 remoterev = peer.lookup(rev)
3975 remoterev = peer.lookup(rev)
3976 if default or id:
3976 if default or id:
3977 output = [hexfunc(remoterev)]
3977 output = [hexfunc(remoterev)]
3978
3978
3979 def getbms():
3979 def getbms():
3980 bms = []
3980 bms = []
3981
3981
3982 if 'bookmarks' in peer.listkeys('namespaces'):
3982 if 'bookmarks' in peer.listkeys('namespaces'):
3983 hexremoterev = hex(remoterev)
3983 hexremoterev = hex(remoterev)
3984 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
3984 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
3985 if bmr == hexremoterev]
3985 if bmr == hexremoterev]
3986
3986
3987 return sorted(bms)
3987 return sorted(bms)
3988
3988
3989 if bookmarks:
3989 if bookmarks:
3990 output.extend(getbms())
3990 output.extend(getbms())
3991 elif default and not ui.quiet:
3991 elif default and not ui.quiet:
3992 # multiple bookmarks for a single parent separated by '/'
3992 # multiple bookmarks for a single parent separated by '/'
3993 bm = '/'.join(getbms())
3993 bm = '/'.join(getbms())
3994 if bm:
3994 if bm:
3995 output.append(bm)
3995 output.append(bm)
3996 else:
3996 else:
3997 if not rev:
3997 if not rev:
3998 ctx = repo[None]
3998 ctx = repo[None]
3999 parents = ctx.parents()
3999 parents = ctx.parents()
4000 changed = ""
4000 changed = ""
4001 if default or id or num:
4001 if default or id or num:
4002 if (util.any(repo.status())
4002 if (util.any(repo.status())
4003 or util.any(ctx.sub(s).dirty() for s in ctx.substate)):
4003 or util.any(ctx.sub(s).dirty() for s in ctx.substate)):
4004 changed = '+'
4004 changed = '+'
4005 if default or id:
4005 if default or id:
4006 output = ["%s%s" %
4006 output = ["%s%s" %
4007 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
4007 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
4008 if num:
4008 if num:
4009 output.append("%s%s" %
4009 output.append("%s%s" %
4010 ('+'.join([str(p.rev()) for p in parents]), changed))
4010 ('+'.join([str(p.rev()) for p in parents]), changed))
4011 else:
4011 else:
4012 ctx = scmutil.revsingle(repo, rev)
4012 ctx = scmutil.revsingle(repo, rev)
4013 if default or id:
4013 if default or id:
4014 output = [hexfunc(ctx.node())]
4014 output = [hexfunc(ctx.node())]
4015 if num:
4015 if num:
4016 output.append(str(ctx.rev()))
4016 output.append(str(ctx.rev()))
4017
4017
4018 if default and not ui.quiet:
4018 if default and not ui.quiet:
4019 b = ctx.branch()
4019 b = ctx.branch()
4020 if b != 'default':
4020 if b != 'default':
4021 output.append("(%s)" % b)
4021 output.append("(%s)" % b)
4022
4022
4023 # multiple tags for a single parent separated by '/'
4023 # multiple tags for a single parent separated by '/'
4024 t = '/'.join(ctx.tags())
4024 t = '/'.join(ctx.tags())
4025 if t:
4025 if t:
4026 output.append(t)
4026 output.append(t)
4027
4027
4028 # multiple bookmarks for a single parent separated by '/'
4028 # multiple bookmarks for a single parent separated by '/'
4029 bm = '/'.join(ctx.bookmarks())
4029 bm = '/'.join(ctx.bookmarks())
4030 if bm:
4030 if bm:
4031 output.append(bm)
4031 output.append(bm)
4032 else:
4032 else:
4033 if branch:
4033 if branch:
4034 output.append(ctx.branch())
4034 output.append(ctx.branch())
4035
4035
4036 if tags:
4036 if tags:
4037 output.extend(ctx.tags())
4037 output.extend(ctx.tags())
4038
4038
4039 if bookmarks:
4039 if bookmarks:
4040 output.extend(ctx.bookmarks())
4040 output.extend(ctx.bookmarks())
4041
4041
4042 ui.write("%s\n" % ' '.join(output))
4042 ui.write("%s\n" % ' '.join(output))
4043
4043
4044 @command('import|patch',
4044 @command('import|patch',
4045 [('p', 'strip', 1,
4045 [('p', 'strip', 1,
4046 _('directory strip option for patch. This has the same '
4046 _('directory strip option for patch. This has the same '
4047 'meaning as the corresponding patch option'), _('NUM')),
4047 'meaning as the corresponding patch option'), _('NUM')),
4048 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
4048 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
4049 ('e', 'edit', False, _('invoke editor on commit messages')),
4049 ('e', 'edit', False, _('invoke editor on commit messages')),
4050 ('f', 'force', None,
4050 ('f', 'force', None,
4051 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
4051 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
4052 ('', 'no-commit', None,
4052 ('', 'no-commit', None,
4053 _("don't commit, just update the working directory")),
4053 _("don't commit, just update the working directory")),
4054 ('', 'bypass', None,
4054 ('', 'bypass', None,
4055 _("apply patch without touching the working directory")),
4055 _("apply patch without touching the working directory")),
4056 ('', 'partial', None,
4056 ('', 'partial', None,
4057 _('commit even if some hunks fail')),
4057 _('commit even if some hunks fail')),
4058 ('', 'exact', None,
4058 ('', 'exact', None,
4059 _('apply patch to the nodes from which it was generated')),
4059 _('apply patch to the nodes from which it was generated')),
4060 ('', 'import-branch', None,
4060 ('', 'import-branch', None,
4061 _('use any branch information in patch (implied by --exact)'))] +
4061 _('use any branch information in patch (implied by --exact)'))] +
4062 commitopts + commitopts2 + similarityopts,
4062 commitopts + commitopts2 + similarityopts,
4063 _('[OPTION]... PATCH...'))
4063 _('[OPTION]... PATCH...'))
4064 def import_(ui, repo, patch1=None, *patches, **opts):
4064 def import_(ui, repo, patch1=None, *patches, **opts):
4065 """import an ordered set of patches
4065 """import an ordered set of patches
4066
4066
4067 Import a list of patches and commit them individually (unless
4067 Import a list of patches and commit them individually (unless
4068 --no-commit is specified).
4068 --no-commit is specified).
4069
4069
4070 Because import first applies changes to the working directory,
4070 Because import first applies changes to the working directory,
4071 import will abort if there are outstanding changes.
4071 import will abort if there are outstanding changes.
4072
4072
4073 You can import a patch straight from a mail message. Even patches
4073 You can import a patch straight from a mail message. Even patches
4074 as attachments work (to use the body part, it must have type
4074 as attachments work (to use the body part, it must have type
4075 text/plain or text/x-patch). From and Subject headers of email
4075 text/plain or text/x-patch). From and Subject headers of email
4076 message are used as default committer and commit message. All
4076 message are used as default committer and commit message. All
4077 text/plain body parts before first diff are added to commit
4077 text/plain body parts before first diff are added to commit
4078 message.
4078 message.
4079
4079
4080 If the imported patch was generated by :hg:`export`, user and
4080 If the imported patch was generated by :hg:`export`, user and
4081 description from patch override values from message headers and
4081 description from patch override values from message headers and
4082 body. Values given on command line with -m/--message and -u/--user
4082 body. Values given on command line with -m/--message and -u/--user
4083 override these.
4083 override these.
4084
4084
4085 If --exact is specified, import will set the working directory to
4085 If --exact is specified, import will set the working directory to
4086 the parent of each patch before applying it, and will abort if the
4086 the parent of each patch before applying it, and will abort if the
4087 resulting changeset has a different ID than the one recorded in
4087 resulting changeset has a different ID than the one recorded in
4088 the patch. This may happen due to character set problems or other
4088 the patch. This may happen due to character set problems or other
4089 deficiencies in the text patch format.
4089 deficiencies in the text patch format.
4090
4090
4091 Use --bypass to apply and commit patches directly to the
4091 Use --bypass to apply and commit patches directly to the
4092 repository, not touching the working directory. Without --exact,
4092 repository, not touching the working directory. Without --exact,
4093 patches will be applied on top of the working directory parent
4093 patches will be applied on top of the working directory parent
4094 revision.
4094 revision.
4095
4095
4096 With -s/--similarity, hg will attempt to discover renames and
4096 With -s/--similarity, hg will attempt to discover renames and
4097 copies in the patch in the same way as :hg:`addremove`.
4097 copies in the patch in the same way as :hg:`addremove`.
4098
4098
4099 Use --partial to ensure a changeset will be created from the patch
4099 Use --partial to ensure a changeset will be created from the patch
4100 even if some hunks fail to apply. Hunks that fail to apply will be
4100 even if some hunks fail to apply. Hunks that fail to apply will be
4101 written to a <target-file>.rej file. Conflicts can then be resolved
4101 written to a <target-file>.rej file. Conflicts can then be resolved
4102 by hand before :hg:`commit --amend` is run to update the created
4102 by hand before :hg:`commit --amend` is run to update the created
4103 changeset. This flag exists to let people import patches that
4103 changeset. This flag exists to let people import patches that
4104 partially apply without losing the associated metadata (author,
4104 partially apply without losing the associated metadata (author,
4105 date, description, ...). Note that when none of the hunk applies
4105 date, description, ...). Note that when none of the hunk applies
4106 cleanly, :hg:`import --partial` will create an empty changeset,
4106 cleanly, :hg:`import --partial` will create an empty changeset,
4107 importing only the patch metadata.
4107 importing only the patch metadata.
4108
4108
4109 To read a patch from standard input, use "-" as the patch name. If
4109 To read a patch from standard input, use "-" as the patch name. If
4110 a URL is specified, the patch will be downloaded from it.
4110 a URL is specified, the patch will be downloaded from it.
4111 See :hg:`help dates` for a list of formats valid for -d/--date.
4111 See :hg:`help dates` for a list of formats valid for -d/--date.
4112
4112
4113 .. container:: verbose
4113 .. container:: verbose
4114
4114
4115 Examples:
4115 Examples:
4116
4116
4117 - import a traditional patch from a website and detect renames::
4117 - import a traditional patch from a website and detect renames::
4118
4118
4119 hg import -s 80 http://example.com/bugfix.patch
4119 hg import -s 80 http://example.com/bugfix.patch
4120
4120
4121 - import a changeset from an hgweb server::
4121 - import a changeset from an hgweb server::
4122
4122
4123 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
4123 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
4124
4124
4125 - import all the patches in an Unix-style mbox::
4125 - import all the patches in an Unix-style mbox::
4126
4126
4127 hg import incoming-patches.mbox
4127 hg import incoming-patches.mbox
4128
4128
4129 - attempt to exactly restore an exported changeset (not always
4129 - attempt to exactly restore an exported changeset (not always
4130 possible)::
4130 possible)::
4131
4131
4132 hg import --exact proposed-fix.patch
4132 hg import --exact proposed-fix.patch
4133
4133
4134 Returns 0 on success, 1 on partial success (see --partial).
4134 Returns 0 on success, 1 on partial success (see --partial).
4135 """
4135 """
4136
4136
4137 if not patch1:
4137 if not patch1:
4138 raise util.Abort(_('need at least one patch to import'))
4138 raise util.Abort(_('need at least one patch to import'))
4139
4139
4140 patches = (patch1,) + patches
4140 patches = (patch1,) + patches
4141
4141
4142 date = opts.get('date')
4142 date = opts.get('date')
4143 if date:
4143 if date:
4144 opts['date'] = util.parsedate(date)
4144 opts['date'] = util.parsedate(date)
4145
4145
4146 update = not opts.get('bypass')
4146 update = not opts.get('bypass')
4147 if not update and opts.get('no_commit'):
4147 if not update and opts.get('no_commit'):
4148 raise util.Abort(_('cannot use --no-commit with --bypass'))
4148 raise util.Abort(_('cannot use --no-commit with --bypass'))
4149 try:
4149 try:
4150 sim = float(opts.get('similarity') or 0)
4150 sim = float(opts.get('similarity') or 0)
4151 except ValueError:
4151 except ValueError:
4152 raise util.Abort(_('similarity must be a number'))
4152 raise util.Abort(_('similarity must be a number'))
4153 if sim < 0 or sim > 100:
4153 if sim < 0 or sim > 100:
4154 raise util.Abort(_('similarity must be between 0 and 100'))
4154 raise util.Abort(_('similarity must be between 0 and 100'))
4155 if sim and not update:
4155 if sim and not update:
4156 raise util.Abort(_('cannot use --similarity with --bypass'))
4156 raise util.Abort(_('cannot use --similarity with --bypass'))
4157 if opts.get('exact') and opts.get('edit'):
4157 if opts.get('exact') and opts.get('edit'):
4158 raise util.Abort(_('cannot use --exact with --edit'))
4158 raise util.Abort(_('cannot use --exact with --edit'))
4159
4159
4160 if update:
4160 if update:
4161 cmdutil.checkunfinished(repo)
4161 cmdutil.checkunfinished(repo)
4162 if (opts.get('exact') or not opts.get('force')) and update:
4162 if (opts.get('exact') or not opts.get('force')) and update:
4163 cmdutil.bailifchanged(repo)
4163 cmdutil.bailifchanged(repo)
4164
4164
4165 base = opts["base"]
4165 base = opts["base"]
4166 wlock = lock = tr = None
4166 wlock = lock = tr = None
4167 msgs = []
4167 msgs = []
4168 ret = 0
4168 ret = 0
4169
4169
4170
4170
4171 try:
4171 try:
4172 try:
4172 try:
4173 wlock = repo.wlock()
4173 wlock = repo.wlock()
4174 repo.dirstate.beginparentchange()
4174 repo.dirstate.beginparentchange()
4175 if not opts.get('no_commit'):
4175 if not opts.get('no_commit'):
4176 lock = repo.lock()
4176 lock = repo.lock()
4177 tr = repo.transaction('import')
4177 tr = repo.transaction('import')
4178 parents = repo.parents()
4178 parents = repo.parents()
4179 for patchurl in patches:
4179 for patchurl in patches:
4180 if patchurl == '-':
4180 if patchurl == '-':
4181 ui.status(_('applying patch from stdin\n'))
4181 ui.status(_('applying patch from stdin\n'))
4182 patchfile = ui.fin
4182 patchfile = ui.fin
4183 patchurl = 'stdin' # for error message
4183 patchurl = 'stdin' # for error message
4184 else:
4184 else:
4185 patchurl = os.path.join(base, patchurl)
4185 patchurl = os.path.join(base, patchurl)
4186 ui.status(_('applying %s\n') % patchurl)
4186 ui.status(_('applying %s\n') % patchurl)
4187 patchfile = hg.openpath(ui, patchurl)
4187 patchfile = hg.openpath(ui, patchurl)
4188
4188
4189 haspatch = False
4189 haspatch = False
4190 for hunk in patch.split(patchfile):
4190 for hunk in patch.split(patchfile):
4191 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
4191 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
4192 parents, opts,
4192 parents, opts,
4193 msgs, hg.clean)
4193 msgs, hg.clean)
4194 if msg:
4194 if msg:
4195 haspatch = True
4195 haspatch = True
4196 ui.note(msg + '\n')
4196 ui.note(msg + '\n')
4197 if update or opts.get('exact'):
4197 if update or opts.get('exact'):
4198 parents = repo.parents()
4198 parents = repo.parents()
4199 else:
4199 else:
4200 parents = [repo[node]]
4200 parents = [repo[node]]
4201 if rej:
4201 if rej:
4202 ui.write_err(_("patch applied partially\n"))
4202 ui.write_err(_("patch applied partially\n"))
4203 ui.write_err(_("(fix the .rej files and run "
4203 ui.write_err(_("(fix the .rej files and run "
4204 "`hg commit --amend`)\n"))
4204 "`hg commit --amend`)\n"))
4205 ret = 1
4205 ret = 1
4206 break
4206 break
4207
4207
4208 if not haspatch:
4208 if not haspatch:
4209 raise util.Abort(_('%s: no diffs found') % patchurl)
4209 raise util.Abort(_('%s: no diffs found') % patchurl)
4210
4210
4211 if tr:
4211 if tr:
4212 tr.close()
4212 tr.close()
4213 if msgs:
4213 if msgs:
4214 repo.savecommitmessage('\n* * *\n'.join(msgs))
4214 repo.savecommitmessage('\n* * *\n'.join(msgs))
4215 repo.dirstate.endparentchange()
4215 repo.dirstate.endparentchange()
4216 return ret
4216 return ret
4217 except: # re-raises
4217 except: # re-raises
4218 # wlock.release() indirectly calls dirstate.write(): since
4218 # wlock.release() indirectly calls dirstate.write(): since
4219 # we're crashing, we do not want to change the working dir
4219 # we're crashing, we do not want to change the working dir
4220 # parent after all, so make sure it writes nothing
4220 # parent after all, so make sure it writes nothing
4221 repo.dirstate.invalidate()
4221 repo.dirstate.invalidate()
4222 raise
4222 raise
4223 finally:
4223 finally:
4224 if tr:
4224 if tr:
4225 tr.release()
4225 tr.release()
4226 release(lock, wlock)
4226 release(lock, wlock)
4227
4227
4228 @command('incoming|in',
4228 @command('incoming|in',
4229 [('f', 'force', None,
4229 [('f', 'force', None,
4230 _('run even if remote repository is unrelated')),
4230 _('run even if remote repository is unrelated')),
4231 ('n', 'newest-first', None, _('show newest record first')),
4231 ('n', 'newest-first', None, _('show newest record first')),
4232 ('', 'bundle', '',
4232 ('', 'bundle', '',
4233 _('file to store the bundles into'), _('FILE')),
4233 _('file to store the bundles into'), _('FILE')),
4234 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4234 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4235 ('B', 'bookmarks', False, _("compare bookmarks")),
4235 ('B', 'bookmarks', False, _("compare bookmarks")),
4236 ('b', 'branch', [],
4236 ('b', 'branch', [],
4237 _('a specific branch you would like to pull'), _('BRANCH')),
4237 _('a specific branch you would like to pull'), _('BRANCH')),
4238 ] + logopts + remoteopts + subrepoopts,
4238 ] + logopts + remoteopts + subrepoopts,
4239 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
4239 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
4240 def incoming(ui, repo, source="default", **opts):
4240 def incoming(ui, repo, source="default", **opts):
4241 """show new changesets found in source
4241 """show new changesets found in source
4242
4242
4243 Show new changesets found in the specified path/URL or the default
4243 Show new changesets found in the specified path/URL or the default
4244 pull location. These are the changesets that would have been pulled
4244 pull location. These are the changesets that would have been pulled
4245 if a pull at the time you issued this command.
4245 if a pull at the time you issued this command.
4246
4246
4247 For remote repository, using --bundle avoids downloading the
4247 For remote repository, using --bundle avoids downloading the
4248 changesets twice if the incoming is followed by a pull.
4248 changesets twice if the incoming is followed by a pull.
4249
4249
4250 See pull for valid source format details.
4250 See pull for valid source format details.
4251
4251
4252 .. container:: verbose
4252 .. container:: verbose
4253
4253
4254 Examples:
4254 Examples:
4255
4255
4256 - show incoming changes with patches and full description::
4256 - show incoming changes with patches and full description::
4257
4257
4258 hg incoming -vp
4258 hg incoming -vp
4259
4259
4260 - show incoming changes excluding merges, store a bundle::
4260 - show incoming changes excluding merges, store a bundle::
4261
4261
4262 hg in -vpM --bundle incoming.hg
4262 hg in -vpM --bundle incoming.hg
4263 hg pull incoming.hg
4263 hg pull incoming.hg
4264
4264
4265 - briefly list changes inside a bundle::
4265 - briefly list changes inside a bundle::
4266
4266
4267 hg in changes.hg -T "{desc|firstline}\\n"
4267 hg in changes.hg -T "{desc|firstline}\\n"
4268
4268
4269 Returns 0 if there are incoming changes, 1 otherwise.
4269 Returns 0 if there are incoming changes, 1 otherwise.
4270 """
4270 """
4271 if opts.get('graph'):
4271 if opts.get('graph'):
4272 cmdutil.checkunsupportedgraphflags([], opts)
4272 cmdutil.checkunsupportedgraphflags([], opts)
4273 def display(other, chlist, displayer):
4273 def display(other, chlist, displayer):
4274 revdag = cmdutil.graphrevs(other, chlist, opts)
4274 revdag = cmdutil.graphrevs(other, chlist, opts)
4275 showparents = [ctx.node() for ctx in repo[None].parents()]
4275 showparents = [ctx.node() for ctx in repo[None].parents()]
4276 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4276 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4277 graphmod.asciiedges)
4277 graphmod.asciiedges)
4278
4278
4279 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4279 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
4280 return 0
4280 return 0
4281
4281
4282 if opts.get('bundle') and opts.get('subrepos'):
4282 if opts.get('bundle') and opts.get('subrepos'):
4283 raise util.Abort(_('cannot combine --bundle and --subrepos'))
4283 raise util.Abort(_('cannot combine --bundle and --subrepos'))
4284
4284
4285 if opts.get('bookmarks'):
4285 if opts.get('bookmarks'):
4286 source, branches = hg.parseurl(ui.expandpath(source),
4286 source, branches = hg.parseurl(ui.expandpath(source),
4287 opts.get('branch'))
4287 opts.get('branch'))
4288 other = hg.peer(repo, opts, source)
4288 other = hg.peer(repo, opts, source)
4289 if 'bookmarks' not in other.listkeys('namespaces'):
4289 if 'bookmarks' not in other.listkeys('namespaces'):
4290 ui.warn(_("remote doesn't support bookmarks\n"))
4290 ui.warn(_("remote doesn't support bookmarks\n"))
4291 return 0
4291 return 0
4292 ui.status(_('comparing with %s\n') % util.hidepassword(source))
4292 ui.status(_('comparing with %s\n') % util.hidepassword(source))
4293 return bookmarks.diff(ui, repo, other)
4293 return bookmarks.diff(ui, repo, other)
4294
4294
4295 repo._subtoppath = ui.expandpath(source)
4295 repo._subtoppath = ui.expandpath(source)
4296 try:
4296 try:
4297 return hg.incoming(ui, repo, source, opts)
4297 return hg.incoming(ui, repo, source, opts)
4298 finally:
4298 finally:
4299 del repo._subtoppath
4299 del repo._subtoppath
4300
4300
4301
4301
4302 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
4302 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
4303 norepo=True)
4303 norepo=True)
4304 def init(ui, dest=".", **opts):
4304 def init(ui, dest=".", **opts):
4305 """create a new repository in the given directory
4305 """create a new repository in the given directory
4306
4306
4307 Initialize a new repository in the given directory. If the given
4307 Initialize a new repository in the given directory. If the given
4308 directory does not exist, it will be created.
4308 directory does not exist, it will be created.
4309
4309
4310 If no directory is given, the current directory is used.
4310 If no directory is given, the current directory is used.
4311
4311
4312 It is possible to specify an ``ssh://`` URL as the destination.
4312 It is possible to specify an ``ssh://`` URL as the destination.
4313 See :hg:`help urls` for more information.
4313 See :hg:`help urls` for more information.
4314
4314
4315 Returns 0 on success.
4315 Returns 0 on success.
4316 """
4316 """
4317 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4317 hg.peer(ui, opts, ui.expandpath(dest), create=True)
4318
4318
4319 @command('locate',
4319 @command('locate',
4320 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
4320 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
4321 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4321 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4322 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4322 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4323 ] + walkopts,
4323 ] + walkopts,
4324 _('[OPTION]... [PATTERN]...'))
4324 _('[OPTION]... [PATTERN]...'))
4325 def locate(ui, repo, *pats, **opts):
4325 def locate(ui, repo, *pats, **opts):
4326 """locate files matching specific patterns (DEPRECATED)
4326 """locate files matching specific patterns (DEPRECATED)
4327
4327
4328 Print files under Mercurial control in the working directory whose
4328 Print files under Mercurial control in the working directory whose
4329 names match the given patterns.
4329 names match the given patterns.
4330
4330
4331 By default, this command searches all directories in the working
4331 By default, this command searches all directories in the working
4332 directory. To search just the current directory and its
4332 directory. To search just the current directory and its
4333 subdirectories, use "--include .".
4333 subdirectories, use "--include .".
4334
4334
4335 If no patterns are given to match, this command prints the names
4335 If no patterns are given to match, this command prints the names
4336 of all files under Mercurial control in the working directory.
4336 of all files under Mercurial control in the working directory.
4337
4337
4338 If you want to feed the output of this command into the "xargs"
4338 If you want to feed the output of this command into the "xargs"
4339 command, use the -0 option to both this command and "xargs". This
4339 command, use the -0 option to both this command and "xargs". This
4340 will avoid the problem of "xargs" treating single filenames that
4340 will avoid the problem of "xargs" treating single filenames that
4341 contain whitespace as multiple filenames.
4341 contain whitespace as multiple filenames.
4342
4342
4343 See :hg:`help files` for a more versatile command.
4343 See :hg:`help files` for a more versatile command.
4344
4344
4345 Returns 0 if a match is found, 1 otherwise.
4345 Returns 0 if a match is found, 1 otherwise.
4346 """
4346 """
4347 end = opts.get('print0') and '\0' or '\n'
4347 end = opts.get('print0') and '\0' or '\n'
4348 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4348 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4349
4349
4350 ret = 1
4350 ret = 1
4351 ctx = repo[rev]
4351 ctx = repo[rev]
4352 m = scmutil.match(ctx, pats, opts, default='relglob')
4352 m = scmutil.match(ctx, pats, opts, default='relglob')
4353 m.bad = lambda x, y: False
4353 m.bad = lambda x, y: False
4354
4354
4355 for abs in ctx.matches(m):
4355 for abs in ctx.matches(m):
4356 if opts.get('fullpath'):
4356 if opts.get('fullpath'):
4357 ui.write(repo.wjoin(abs), end)
4357 ui.write(repo.wjoin(abs), end)
4358 else:
4358 else:
4359 ui.write(((pats and m.rel(abs)) or abs), end)
4359 ui.write(((pats and m.rel(abs)) or abs), end)
4360 ret = 0
4360 ret = 0
4361
4361
4362 return ret
4362 return ret
4363
4363
4364 @command('^log|history',
4364 @command('^log|history',
4365 [('f', 'follow', None,
4365 [('f', 'follow', None,
4366 _('follow changeset history, or file history across copies and renames')),
4366 _('follow changeset history, or file history across copies and renames')),
4367 ('', 'follow-first', None,
4367 ('', 'follow-first', None,
4368 _('only follow the first parent of merge changesets (DEPRECATED)')),
4368 _('only follow the first parent of merge changesets (DEPRECATED)')),
4369 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4369 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4370 ('C', 'copies', None, _('show copied files')),
4370 ('C', 'copies', None, _('show copied files')),
4371 ('k', 'keyword', [],
4371 ('k', 'keyword', [],
4372 _('do case-insensitive search for a given text'), _('TEXT')),
4372 _('do case-insensitive search for a given text'), _('TEXT')),
4373 ('r', 'rev', [], _('show the specified revision or revset'), _('REV')),
4373 ('r', 'rev', [], _('show the specified revision or revset'), _('REV')),
4374 ('', 'removed', None, _('include revisions where files were removed')),
4374 ('', 'removed', None, _('include revisions where files were removed')),
4375 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4375 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4376 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4376 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4377 ('', 'only-branch', [],
4377 ('', 'only-branch', [],
4378 _('show only changesets within the given named branch (DEPRECATED)'),
4378 _('show only changesets within the given named branch (DEPRECATED)'),
4379 _('BRANCH')),
4379 _('BRANCH')),
4380 ('b', 'branch', [],
4380 ('b', 'branch', [],
4381 _('show changesets within the given named branch'), _('BRANCH')),
4381 _('show changesets within the given named branch'), _('BRANCH')),
4382 ('P', 'prune', [],
4382 ('P', 'prune', [],
4383 _('do not display revision or any of its ancestors'), _('REV')),
4383 _('do not display revision or any of its ancestors'), _('REV')),
4384 ] + logopts + walkopts,
4384 ] + logopts + walkopts,
4385 _('[OPTION]... [FILE]'),
4385 _('[OPTION]... [FILE]'),
4386 inferrepo=True)
4386 inferrepo=True)
4387 def log(ui, repo, *pats, **opts):
4387 def log(ui, repo, *pats, **opts):
4388 """show revision history of entire repository or files
4388 """show revision history of entire repository or files
4389
4389
4390 Print the revision history of the specified files or the entire
4390 Print the revision history of the specified files or the entire
4391 project.
4391 project.
4392
4392
4393 If no revision range is specified, the default is ``tip:0`` unless
4393 If no revision range is specified, the default is ``tip:0`` unless
4394 --follow is set, in which case the working directory parent is
4394 --follow is set, in which case the working directory parent is
4395 used as the starting revision.
4395 used as the starting revision.
4396
4396
4397 File history is shown without following rename or copy history of
4397 File history is shown without following rename or copy history of
4398 files. Use -f/--follow with a filename to follow history across
4398 files. Use -f/--follow with a filename to follow history across
4399 renames and copies. --follow without a filename will only show
4399 renames and copies. --follow without a filename will only show
4400 ancestors or descendants of the starting revision.
4400 ancestors or descendants of the starting revision.
4401
4401
4402 By default this command prints revision number and changeset id,
4402 By default this command prints revision number and changeset id,
4403 tags, non-trivial parents, user, date and time, and a summary for
4403 tags, non-trivial parents, user, date and time, and a summary for
4404 each commit. When the -v/--verbose switch is used, the list of
4404 each commit. When the -v/--verbose switch is used, the list of
4405 changed files and full commit message are shown.
4405 changed files and full commit message are shown.
4406
4406
4407 With --graph the revisions are shown as an ASCII art DAG with the most
4407 With --graph the revisions are shown as an ASCII art DAG with the most
4408 recent changeset at the top.
4408 recent changeset at the top.
4409 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4409 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4410 and '+' represents a fork where the changeset from the lines below is a
4410 and '+' represents a fork where the changeset from the lines below is a
4411 parent of the 'o' merge on the same line.
4411 parent of the 'o' merge on the same line.
4412
4412
4413 .. note::
4413 .. note::
4414
4414
4415 log -p/--patch may generate unexpected diff output for merge
4415 log -p/--patch may generate unexpected diff output for merge
4416 changesets, as it will only compare the merge changeset against
4416 changesets, as it will only compare the merge changeset against
4417 its first parent. Also, only files different from BOTH parents
4417 its first parent. Also, only files different from BOTH parents
4418 will appear in files:.
4418 will appear in files:.
4419
4419
4420 .. note::
4420 .. note::
4421
4421
4422 for performance reasons, log FILE may omit duplicate changes
4422 for performance reasons, log FILE may omit duplicate changes
4423 made on branches and will not show removals or mode changes. To
4423 made on branches and will not show removals or mode changes. To
4424 see all such changes, use the --removed switch.
4424 see all such changes, use the --removed switch.
4425
4425
4426 .. container:: verbose
4426 .. container:: verbose
4427
4427
4428 Some examples:
4428 Some examples:
4429
4429
4430 - changesets with full descriptions and file lists::
4430 - changesets with full descriptions and file lists::
4431
4431
4432 hg log -v
4432 hg log -v
4433
4433
4434 - changesets ancestral to the working directory::
4434 - changesets ancestral to the working directory::
4435
4435
4436 hg log -f
4436 hg log -f
4437
4437
4438 - last 10 commits on the current branch::
4438 - last 10 commits on the current branch::
4439
4439
4440 hg log -l 10 -b .
4440 hg log -l 10 -b .
4441
4441
4442 - changesets showing all modifications of a file, including removals::
4442 - changesets showing all modifications of a file, including removals::
4443
4443
4444 hg log --removed file.c
4444 hg log --removed file.c
4445
4445
4446 - all changesets that touch a directory, with diffs, excluding merges::
4446 - all changesets that touch a directory, with diffs, excluding merges::
4447
4447
4448 hg log -Mp lib/
4448 hg log -Mp lib/
4449
4449
4450 - all revision numbers that match a keyword::
4450 - all revision numbers that match a keyword::
4451
4451
4452 hg log -k bug --template "{rev}\\n"
4452 hg log -k bug --template "{rev}\\n"
4453
4453
4454 - list available log templates::
4454 - list available log templates::
4455
4455
4456 hg log -T list
4456 hg log -T list
4457
4457
4458 - check if a given changeset is included in a tagged release::
4458 - check if a given changeset is included in a tagged release::
4459
4459
4460 hg log -r "a21ccf and ancestor(1.9)"
4460 hg log -r "a21ccf and ancestor(1.9)"
4461
4461
4462 - find all changesets by some user in a date range::
4462 - find all changesets by some user in a date range::
4463
4463
4464 hg log -k alice -d "may 2008 to jul 2008"
4464 hg log -k alice -d "may 2008 to jul 2008"
4465
4465
4466 - summary of all changesets after the last tag::
4466 - summary of all changesets after the last tag::
4467
4467
4468 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4468 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4469
4469
4470 See :hg:`help dates` for a list of formats valid for -d/--date.
4470 See :hg:`help dates` for a list of formats valid for -d/--date.
4471
4471
4472 See :hg:`help revisions` and :hg:`help revsets` for more about
4472 See :hg:`help revisions` and :hg:`help revsets` for more about
4473 specifying revisions.
4473 specifying revisions.
4474
4474
4475 See :hg:`help templates` for more about pre-packaged styles and
4475 See :hg:`help templates` for more about pre-packaged styles and
4476 specifying custom templates.
4476 specifying custom templates.
4477
4477
4478 Returns 0 on success.
4478 Returns 0 on success.
4479
4479
4480 """
4480 """
4481 if opts.get('follow') and opts.get('rev'):
4482 opts['rev'] = [revset.formatspec('reverse(::%lr)', opts.get('rev'))]
4483 del opts['follow']
4484
4481 if opts.get('graph'):
4485 if opts.get('graph'):
4482 return cmdutil.graphlog(ui, repo, *pats, **opts)
4486 return cmdutil.graphlog(ui, repo, *pats, **opts)
4483
4487
4484 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4488 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4485 limit = cmdutil.loglimit(opts)
4489 limit = cmdutil.loglimit(opts)
4486 count = 0
4490 count = 0
4487
4491
4488 getrenamed = None
4492 getrenamed = None
4489 if opts.get('copies'):
4493 if opts.get('copies'):
4490 endrev = None
4494 endrev = None
4491 if opts.get('rev'):
4495 if opts.get('rev'):
4492 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4496 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4493 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4497 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4494
4498
4495 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4499 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4496 for rev in revs:
4500 for rev in revs:
4497 if count == limit:
4501 if count == limit:
4498 break
4502 break
4499 ctx = repo[rev]
4503 ctx = repo[rev]
4500 copies = None
4504 copies = None
4501 if getrenamed is not None and rev:
4505 if getrenamed is not None and rev:
4502 copies = []
4506 copies = []
4503 for fn in ctx.files():
4507 for fn in ctx.files():
4504 rename = getrenamed(fn, rev)
4508 rename = getrenamed(fn, rev)
4505 if rename:
4509 if rename:
4506 copies.append((fn, rename[0]))
4510 copies.append((fn, rename[0]))
4507 revmatchfn = filematcher and filematcher(ctx.rev()) or None
4511 revmatchfn = filematcher and filematcher(ctx.rev()) or None
4508 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4512 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4509 if displayer.flush(rev):
4513 if displayer.flush(rev):
4510 count += 1
4514 count += 1
4511
4515
4512 displayer.close()
4516 displayer.close()
4513
4517
4514 @command('manifest',
4518 @command('manifest',
4515 [('r', 'rev', '', _('revision to display'), _('REV')),
4519 [('r', 'rev', '', _('revision to display'), _('REV')),
4516 ('', 'all', False, _("list files from all revisions"))]
4520 ('', 'all', False, _("list files from all revisions"))]
4517 + formatteropts,
4521 + formatteropts,
4518 _('[-r REV]'))
4522 _('[-r REV]'))
4519 def manifest(ui, repo, node=None, rev=None, **opts):
4523 def manifest(ui, repo, node=None, rev=None, **opts):
4520 """output the current or given revision of the project manifest
4524 """output the current or given revision of the project manifest
4521
4525
4522 Print a list of version controlled files for the given revision.
4526 Print a list of version controlled files for the given revision.
4523 If no revision is given, the first parent of the working directory
4527 If no revision is given, the first parent of the working directory
4524 is used, or the null revision if no revision is checked out.
4528 is used, or the null revision if no revision is checked out.
4525
4529
4526 With -v, print file permissions, symlink and executable bits.
4530 With -v, print file permissions, symlink and executable bits.
4527 With --debug, print file revision hashes.
4531 With --debug, print file revision hashes.
4528
4532
4529 If option --all is specified, the list of all files from all revisions
4533 If option --all is specified, the list of all files from all revisions
4530 is printed. This includes deleted and renamed files.
4534 is printed. This includes deleted and renamed files.
4531
4535
4532 Returns 0 on success.
4536 Returns 0 on success.
4533 """
4537 """
4534
4538
4535 fm = ui.formatter('manifest', opts)
4539 fm = ui.formatter('manifest', opts)
4536
4540
4537 if opts.get('all'):
4541 if opts.get('all'):
4538 if rev or node:
4542 if rev or node:
4539 raise util.Abort(_("can't specify a revision with --all"))
4543 raise util.Abort(_("can't specify a revision with --all"))
4540
4544
4541 res = []
4545 res = []
4542 prefix = "data/"
4546 prefix = "data/"
4543 suffix = ".i"
4547 suffix = ".i"
4544 plen = len(prefix)
4548 plen = len(prefix)
4545 slen = len(suffix)
4549 slen = len(suffix)
4546 lock = repo.lock()
4550 lock = repo.lock()
4547 try:
4551 try:
4548 for fn, b, size in repo.store.datafiles():
4552 for fn, b, size in repo.store.datafiles():
4549 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4553 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4550 res.append(fn[plen:-slen])
4554 res.append(fn[plen:-slen])
4551 finally:
4555 finally:
4552 lock.release()
4556 lock.release()
4553 for f in res:
4557 for f in res:
4554 fm.startitem()
4558 fm.startitem()
4555 fm.write("path", '%s\n', f)
4559 fm.write("path", '%s\n', f)
4556 fm.end()
4560 fm.end()
4557 return
4561 return
4558
4562
4559 if rev and node:
4563 if rev and node:
4560 raise util.Abort(_("please specify just one revision"))
4564 raise util.Abort(_("please specify just one revision"))
4561
4565
4562 if not node:
4566 if not node:
4563 node = rev
4567 node = rev
4564
4568
4565 char = {'l': '@', 'x': '*', '': ''}
4569 char = {'l': '@', 'x': '*', '': ''}
4566 mode = {'l': '644', 'x': '755', '': '644'}
4570 mode = {'l': '644', 'x': '755', '': '644'}
4567 ctx = scmutil.revsingle(repo, node)
4571 ctx = scmutil.revsingle(repo, node)
4568 mf = ctx.manifest()
4572 mf = ctx.manifest()
4569 for f in ctx:
4573 for f in ctx:
4570 fm.startitem()
4574 fm.startitem()
4571 fl = ctx[f].flags()
4575 fl = ctx[f].flags()
4572 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4576 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4573 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4577 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4574 fm.write('path', '%s\n', f)
4578 fm.write('path', '%s\n', f)
4575 fm.end()
4579 fm.end()
4576
4580
4577 @command('^merge',
4581 @command('^merge',
4578 [('f', 'force', None,
4582 [('f', 'force', None,
4579 _('force a merge including outstanding changes (DEPRECATED)')),
4583 _('force a merge including outstanding changes (DEPRECATED)')),
4580 ('r', 'rev', '', _('revision to merge'), _('REV')),
4584 ('r', 'rev', '', _('revision to merge'), _('REV')),
4581 ('P', 'preview', None,
4585 ('P', 'preview', None,
4582 _('review revisions to merge (no merge is performed)'))
4586 _('review revisions to merge (no merge is performed)'))
4583 ] + mergetoolopts,
4587 ] + mergetoolopts,
4584 _('[-P] [-f] [[-r] REV]'))
4588 _('[-P] [-f] [[-r] REV]'))
4585 def merge(ui, repo, node=None, **opts):
4589 def merge(ui, repo, node=None, **opts):
4586 """merge another revision into working directory
4590 """merge another revision into working directory
4587
4591
4588 The current working directory is updated with all changes made in
4592 The current working directory is updated with all changes made in
4589 the requested revision since the last common predecessor revision.
4593 the requested revision since the last common predecessor revision.
4590
4594
4591 Files that changed between either parent are marked as changed for
4595 Files that changed between either parent are marked as changed for
4592 the next commit and a commit must be performed before any further
4596 the next commit and a commit must be performed before any further
4593 updates to the repository are allowed. The next commit will have
4597 updates to the repository are allowed. The next commit will have
4594 two parents.
4598 two parents.
4595
4599
4596 ``--tool`` can be used to specify the merge tool used for file
4600 ``--tool`` can be used to specify the merge tool used for file
4597 merges. It overrides the HGMERGE environment variable and your
4601 merges. It overrides the HGMERGE environment variable and your
4598 configuration files. See :hg:`help merge-tools` for options.
4602 configuration files. See :hg:`help merge-tools` for options.
4599
4603
4600 If no revision is specified, the working directory's parent is a
4604 If no revision is specified, the working directory's parent is a
4601 head revision, and the current branch contains exactly one other
4605 head revision, and the current branch contains exactly one other
4602 head, the other head is merged with by default. Otherwise, an
4606 head, the other head is merged with by default. Otherwise, an
4603 explicit revision with which to merge with must be provided.
4607 explicit revision with which to merge with must be provided.
4604
4608
4605 :hg:`resolve` must be used to resolve unresolved files.
4609 :hg:`resolve` must be used to resolve unresolved files.
4606
4610
4607 To undo an uncommitted merge, use :hg:`update --clean .` which
4611 To undo an uncommitted merge, use :hg:`update --clean .` which
4608 will check out a clean copy of the original merge parent, losing
4612 will check out a clean copy of the original merge parent, losing
4609 all changes.
4613 all changes.
4610
4614
4611 Returns 0 on success, 1 if there are unresolved files.
4615 Returns 0 on success, 1 if there are unresolved files.
4612 """
4616 """
4613
4617
4614 if opts.get('rev') and node:
4618 if opts.get('rev') and node:
4615 raise util.Abort(_("please specify just one revision"))
4619 raise util.Abort(_("please specify just one revision"))
4616 if not node:
4620 if not node:
4617 node = opts.get('rev')
4621 node = opts.get('rev')
4618
4622
4619 if node:
4623 if node:
4620 node = scmutil.revsingle(repo, node).node()
4624 node = scmutil.revsingle(repo, node).node()
4621
4625
4622 if not node and repo._bookmarkcurrent:
4626 if not node and repo._bookmarkcurrent:
4623 bmheads = repo.bookmarkheads(repo._bookmarkcurrent)
4627 bmheads = repo.bookmarkheads(repo._bookmarkcurrent)
4624 curhead = repo[repo._bookmarkcurrent].node()
4628 curhead = repo[repo._bookmarkcurrent].node()
4625 if len(bmheads) == 2:
4629 if len(bmheads) == 2:
4626 if curhead == bmheads[0]:
4630 if curhead == bmheads[0]:
4627 node = bmheads[1]
4631 node = bmheads[1]
4628 else:
4632 else:
4629 node = bmheads[0]
4633 node = bmheads[0]
4630 elif len(bmheads) > 2:
4634 elif len(bmheads) > 2:
4631 raise util.Abort(_("multiple matching bookmarks to merge - "
4635 raise util.Abort(_("multiple matching bookmarks to merge - "
4632 "please merge with an explicit rev or bookmark"),
4636 "please merge with an explicit rev or bookmark"),
4633 hint=_("run 'hg heads' to see all heads"))
4637 hint=_("run 'hg heads' to see all heads"))
4634 elif len(bmheads) <= 1:
4638 elif len(bmheads) <= 1:
4635 raise util.Abort(_("no matching bookmark to merge - "
4639 raise util.Abort(_("no matching bookmark to merge - "
4636 "please merge with an explicit rev or bookmark"),
4640 "please merge with an explicit rev or bookmark"),
4637 hint=_("run 'hg heads' to see all heads"))
4641 hint=_("run 'hg heads' to see all heads"))
4638
4642
4639 if not node and not repo._bookmarkcurrent:
4643 if not node and not repo._bookmarkcurrent:
4640 branch = repo[None].branch()
4644 branch = repo[None].branch()
4641 bheads = repo.branchheads(branch)
4645 bheads = repo.branchheads(branch)
4642 nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
4646 nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
4643
4647
4644 if len(nbhs) > 2:
4648 if len(nbhs) > 2:
4645 raise util.Abort(_("branch '%s' has %d heads - "
4649 raise util.Abort(_("branch '%s' has %d heads - "
4646 "please merge with an explicit rev")
4650 "please merge with an explicit rev")
4647 % (branch, len(bheads)),
4651 % (branch, len(bheads)),
4648 hint=_("run 'hg heads .' to see heads"))
4652 hint=_("run 'hg heads .' to see heads"))
4649
4653
4650 parent = repo.dirstate.p1()
4654 parent = repo.dirstate.p1()
4651 if len(nbhs) <= 1:
4655 if len(nbhs) <= 1:
4652 if len(bheads) > 1:
4656 if len(bheads) > 1:
4653 raise util.Abort(_("heads are bookmarked - "
4657 raise util.Abort(_("heads are bookmarked - "
4654 "please merge with an explicit rev"),
4658 "please merge with an explicit rev"),
4655 hint=_("run 'hg heads' to see all heads"))
4659 hint=_("run 'hg heads' to see all heads"))
4656 if len(repo.heads()) > 1:
4660 if len(repo.heads()) > 1:
4657 raise util.Abort(_("branch '%s' has one head - "
4661 raise util.Abort(_("branch '%s' has one head - "
4658 "please merge with an explicit rev")
4662 "please merge with an explicit rev")
4659 % branch,
4663 % branch,
4660 hint=_("run 'hg heads' to see all heads"))
4664 hint=_("run 'hg heads' to see all heads"))
4661 msg, hint = _('nothing to merge'), None
4665 msg, hint = _('nothing to merge'), None
4662 if parent != repo.lookup(branch):
4666 if parent != repo.lookup(branch):
4663 hint = _("use 'hg update' instead")
4667 hint = _("use 'hg update' instead")
4664 raise util.Abort(msg, hint=hint)
4668 raise util.Abort(msg, hint=hint)
4665
4669
4666 if parent not in bheads:
4670 if parent not in bheads:
4667 raise util.Abort(_('working directory not at a head revision'),
4671 raise util.Abort(_('working directory not at a head revision'),
4668 hint=_("use 'hg update' or merge with an "
4672 hint=_("use 'hg update' or merge with an "
4669 "explicit revision"))
4673 "explicit revision"))
4670 if parent == nbhs[0]:
4674 if parent == nbhs[0]:
4671 node = nbhs[-1]
4675 node = nbhs[-1]
4672 else:
4676 else:
4673 node = nbhs[0]
4677 node = nbhs[0]
4674
4678
4675 if opts.get('preview'):
4679 if opts.get('preview'):
4676 # find nodes that are ancestors of p2 but not of p1
4680 # find nodes that are ancestors of p2 but not of p1
4677 p1 = repo.lookup('.')
4681 p1 = repo.lookup('.')
4678 p2 = repo.lookup(node)
4682 p2 = repo.lookup(node)
4679 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4683 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4680
4684
4681 displayer = cmdutil.show_changeset(ui, repo, opts)
4685 displayer = cmdutil.show_changeset(ui, repo, opts)
4682 for node in nodes:
4686 for node in nodes:
4683 displayer.show(repo[node])
4687 displayer.show(repo[node])
4684 displayer.close()
4688 displayer.close()
4685 return 0
4689 return 0
4686
4690
4687 try:
4691 try:
4688 # ui.forcemerge is an internal variable, do not document
4692 # ui.forcemerge is an internal variable, do not document
4689 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4693 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4690 return hg.merge(repo, node, force=opts.get('force'))
4694 return hg.merge(repo, node, force=opts.get('force'))
4691 finally:
4695 finally:
4692 ui.setconfig('ui', 'forcemerge', '', 'merge')
4696 ui.setconfig('ui', 'forcemerge', '', 'merge')
4693
4697
4694 @command('outgoing|out',
4698 @command('outgoing|out',
4695 [('f', 'force', None, _('run even when the destination is unrelated')),
4699 [('f', 'force', None, _('run even when the destination is unrelated')),
4696 ('r', 'rev', [],
4700 ('r', 'rev', [],
4697 _('a changeset intended to be included in the destination'), _('REV')),
4701 _('a changeset intended to be included in the destination'), _('REV')),
4698 ('n', 'newest-first', None, _('show newest record first')),
4702 ('n', 'newest-first', None, _('show newest record first')),
4699 ('B', 'bookmarks', False, _('compare bookmarks')),
4703 ('B', 'bookmarks', False, _('compare bookmarks')),
4700 ('b', 'branch', [], _('a specific branch you would like to push'),
4704 ('b', 'branch', [], _('a specific branch you would like to push'),
4701 _('BRANCH')),
4705 _('BRANCH')),
4702 ] + logopts + remoteopts + subrepoopts,
4706 ] + logopts + remoteopts + subrepoopts,
4703 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4707 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4704 def outgoing(ui, repo, dest=None, **opts):
4708 def outgoing(ui, repo, dest=None, **opts):
4705 """show changesets not found in the destination
4709 """show changesets not found in the destination
4706
4710
4707 Show changesets not found in the specified destination repository
4711 Show changesets not found in the specified destination repository
4708 or the default push location. These are the changesets that would
4712 or the default push location. These are the changesets that would
4709 be pushed if a push was requested.
4713 be pushed if a push was requested.
4710
4714
4711 See pull for details of valid destination formats.
4715 See pull for details of valid destination formats.
4712
4716
4713 Returns 0 if there are outgoing changes, 1 otherwise.
4717 Returns 0 if there are outgoing changes, 1 otherwise.
4714 """
4718 """
4715 if opts.get('graph'):
4719 if opts.get('graph'):
4716 cmdutil.checkunsupportedgraphflags([], opts)
4720 cmdutil.checkunsupportedgraphflags([], opts)
4717 o, other = hg._outgoing(ui, repo, dest, opts)
4721 o, other = hg._outgoing(ui, repo, dest, opts)
4718 if not o:
4722 if not o:
4719 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4723 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4720 return
4724 return
4721
4725
4722 revdag = cmdutil.graphrevs(repo, o, opts)
4726 revdag = cmdutil.graphrevs(repo, o, opts)
4723 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4727 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4724 showparents = [ctx.node() for ctx in repo[None].parents()]
4728 showparents = [ctx.node() for ctx in repo[None].parents()]
4725 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4729 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4726 graphmod.asciiedges)
4730 graphmod.asciiedges)
4727 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4731 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4728 return 0
4732 return 0
4729
4733
4730 if opts.get('bookmarks'):
4734 if opts.get('bookmarks'):
4731 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4735 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4732 dest, branches = hg.parseurl(dest, opts.get('branch'))
4736 dest, branches = hg.parseurl(dest, opts.get('branch'))
4733 other = hg.peer(repo, opts, dest)
4737 other = hg.peer(repo, opts, dest)
4734 if 'bookmarks' not in other.listkeys('namespaces'):
4738 if 'bookmarks' not in other.listkeys('namespaces'):
4735 ui.warn(_("remote doesn't support bookmarks\n"))
4739 ui.warn(_("remote doesn't support bookmarks\n"))
4736 return 0
4740 return 0
4737 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
4741 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
4738 return bookmarks.diff(ui, other, repo)
4742 return bookmarks.diff(ui, other, repo)
4739
4743
4740 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
4744 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
4741 try:
4745 try:
4742 return hg.outgoing(ui, repo, dest, opts)
4746 return hg.outgoing(ui, repo, dest, opts)
4743 finally:
4747 finally:
4744 del repo._subtoppath
4748 del repo._subtoppath
4745
4749
4746 @command('parents',
4750 @command('parents',
4747 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
4751 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
4748 ] + templateopts,
4752 ] + templateopts,
4749 _('[-r REV] [FILE]'),
4753 _('[-r REV] [FILE]'),
4750 inferrepo=True)
4754 inferrepo=True)
4751 def parents(ui, repo, file_=None, **opts):
4755 def parents(ui, repo, file_=None, **opts):
4752 """show the parents of the working directory or revision (DEPRECATED)
4756 """show the parents of the working directory or revision (DEPRECATED)
4753
4757
4754 Print the working directory's parent revisions. If a revision is
4758 Print the working directory's parent revisions. If a revision is
4755 given via -r/--rev, the parent of that revision will be printed.
4759 given via -r/--rev, the parent of that revision will be printed.
4756 If a file argument is given, the revision in which the file was
4760 If a file argument is given, the revision in which the file was
4757 last changed (before the working directory revision or the
4761 last changed (before the working directory revision or the
4758 argument to --rev if given) is printed.
4762 argument to --rev if given) is printed.
4759
4763
4760 See :hg:`summary` and :hg:`help revsets` for related information.
4764 See :hg:`summary` and :hg:`help revsets` for related information.
4761
4765
4762 Returns 0 on success.
4766 Returns 0 on success.
4763 """
4767 """
4764
4768
4765 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
4769 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
4766
4770
4767 if file_:
4771 if file_:
4768 m = scmutil.match(ctx, (file_,), opts)
4772 m = scmutil.match(ctx, (file_,), opts)
4769 if m.anypats() or len(m.files()) != 1:
4773 if m.anypats() or len(m.files()) != 1:
4770 raise util.Abort(_('can only specify an explicit filename'))
4774 raise util.Abort(_('can only specify an explicit filename'))
4771 file_ = m.files()[0]
4775 file_ = m.files()[0]
4772 filenodes = []
4776 filenodes = []
4773 for cp in ctx.parents():
4777 for cp in ctx.parents():
4774 if not cp:
4778 if not cp:
4775 continue
4779 continue
4776 try:
4780 try:
4777 filenodes.append(cp.filenode(file_))
4781 filenodes.append(cp.filenode(file_))
4778 except error.LookupError:
4782 except error.LookupError:
4779 pass
4783 pass
4780 if not filenodes:
4784 if not filenodes:
4781 raise util.Abort(_("'%s' not found in manifest!") % file_)
4785 raise util.Abort(_("'%s' not found in manifest!") % file_)
4782 p = []
4786 p = []
4783 for fn in filenodes:
4787 for fn in filenodes:
4784 fctx = repo.filectx(file_, fileid=fn)
4788 fctx = repo.filectx(file_, fileid=fn)
4785 p.append(fctx.node())
4789 p.append(fctx.node())
4786 else:
4790 else:
4787 p = [cp.node() for cp in ctx.parents()]
4791 p = [cp.node() for cp in ctx.parents()]
4788
4792
4789 displayer = cmdutil.show_changeset(ui, repo, opts)
4793 displayer = cmdutil.show_changeset(ui, repo, opts)
4790 for n in p:
4794 for n in p:
4791 if n != nullid:
4795 if n != nullid:
4792 displayer.show(repo[n])
4796 displayer.show(repo[n])
4793 displayer.close()
4797 displayer.close()
4794
4798
4795 @command('paths', [], _('[NAME]'), optionalrepo=True)
4799 @command('paths', [], _('[NAME]'), optionalrepo=True)
4796 def paths(ui, repo, search=None):
4800 def paths(ui, repo, search=None):
4797 """show aliases for remote repositories
4801 """show aliases for remote repositories
4798
4802
4799 Show definition of symbolic path name NAME. If no name is given,
4803 Show definition of symbolic path name NAME. If no name is given,
4800 show definition of all available names.
4804 show definition of all available names.
4801
4805
4802 Option -q/--quiet suppresses all output when searching for NAME
4806 Option -q/--quiet suppresses all output when searching for NAME
4803 and shows only the path names when listing all definitions.
4807 and shows only the path names when listing all definitions.
4804
4808
4805 Path names are defined in the [paths] section of your
4809 Path names are defined in the [paths] section of your
4806 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
4810 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
4807 repository, ``.hg/hgrc`` is used, too.
4811 repository, ``.hg/hgrc`` is used, too.
4808
4812
4809 The path names ``default`` and ``default-push`` have a special
4813 The path names ``default`` and ``default-push`` have a special
4810 meaning. When performing a push or pull operation, they are used
4814 meaning. When performing a push or pull operation, they are used
4811 as fallbacks if no location is specified on the command-line.
4815 as fallbacks if no location is specified on the command-line.
4812 When ``default-push`` is set, it will be used for push and
4816 When ``default-push`` is set, it will be used for push and
4813 ``default`` will be used for pull; otherwise ``default`` is used
4817 ``default`` will be used for pull; otherwise ``default`` is used
4814 as the fallback for both. When cloning a repository, the clone
4818 as the fallback for both. When cloning a repository, the clone
4815 source is written as ``default`` in ``.hg/hgrc``. Note that
4819 source is written as ``default`` in ``.hg/hgrc``. Note that
4816 ``default`` and ``default-push`` apply to all inbound (e.g.
4820 ``default`` and ``default-push`` apply to all inbound (e.g.
4817 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
4821 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
4818 :hg:`bundle`) operations.
4822 :hg:`bundle`) operations.
4819
4823
4820 See :hg:`help urls` for more information.
4824 See :hg:`help urls` for more information.
4821
4825
4822 Returns 0 on success.
4826 Returns 0 on success.
4823 """
4827 """
4824 if search:
4828 if search:
4825 for name, path in ui.configitems("paths"):
4829 for name, path in ui.configitems("paths"):
4826 if name == search:
4830 if name == search:
4827 ui.status("%s\n" % util.hidepassword(path))
4831 ui.status("%s\n" % util.hidepassword(path))
4828 return
4832 return
4829 if not ui.quiet:
4833 if not ui.quiet:
4830 ui.warn(_("not found!\n"))
4834 ui.warn(_("not found!\n"))
4831 return 1
4835 return 1
4832 else:
4836 else:
4833 for name, path in ui.configitems("paths"):
4837 for name, path in ui.configitems("paths"):
4834 if ui.quiet:
4838 if ui.quiet:
4835 ui.write("%s\n" % name)
4839 ui.write("%s\n" % name)
4836 else:
4840 else:
4837 ui.write("%s = %s\n" % (name, util.hidepassword(path)))
4841 ui.write("%s = %s\n" % (name, util.hidepassword(path)))
4838
4842
4839 @command('phase',
4843 @command('phase',
4840 [('p', 'public', False, _('set changeset phase to public')),
4844 [('p', 'public', False, _('set changeset phase to public')),
4841 ('d', 'draft', False, _('set changeset phase to draft')),
4845 ('d', 'draft', False, _('set changeset phase to draft')),
4842 ('s', 'secret', False, _('set changeset phase to secret')),
4846 ('s', 'secret', False, _('set changeset phase to secret')),
4843 ('f', 'force', False, _('allow to move boundary backward')),
4847 ('f', 'force', False, _('allow to move boundary backward')),
4844 ('r', 'rev', [], _('target revision'), _('REV')),
4848 ('r', 'rev', [], _('target revision'), _('REV')),
4845 ],
4849 ],
4846 _('[-p|-d|-s] [-f] [-r] REV...'))
4850 _('[-p|-d|-s] [-f] [-r] REV...'))
4847 def phase(ui, repo, *revs, **opts):
4851 def phase(ui, repo, *revs, **opts):
4848 """set or show the current phase name
4852 """set or show the current phase name
4849
4853
4850 With no argument, show the phase name of specified revisions.
4854 With no argument, show the phase name of specified revisions.
4851
4855
4852 With one of -p/--public, -d/--draft or -s/--secret, change the
4856 With one of -p/--public, -d/--draft or -s/--secret, change the
4853 phase value of the specified revisions.
4857 phase value of the specified revisions.
4854
4858
4855 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
4859 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
4856 lower phase to an higher phase. Phases are ordered as follows::
4860 lower phase to an higher phase. Phases are ordered as follows::
4857
4861
4858 public < draft < secret
4862 public < draft < secret
4859
4863
4860 Returns 0 on success, 1 if no phases were changed or some could not
4864 Returns 0 on success, 1 if no phases were changed or some could not
4861 be changed.
4865 be changed.
4862 """
4866 """
4863 # search for a unique phase argument
4867 # search for a unique phase argument
4864 targetphase = None
4868 targetphase = None
4865 for idx, name in enumerate(phases.phasenames):
4869 for idx, name in enumerate(phases.phasenames):
4866 if opts[name]:
4870 if opts[name]:
4867 if targetphase is not None:
4871 if targetphase is not None:
4868 raise util.Abort(_('only one phase can be specified'))
4872 raise util.Abort(_('only one phase can be specified'))
4869 targetphase = idx
4873 targetphase = idx
4870
4874
4871 # look for specified revision
4875 # look for specified revision
4872 revs = list(revs)
4876 revs = list(revs)
4873 revs.extend(opts['rev'])
4877 revs.extend(opts['rev'])
4874 if not revs:
4878 if not revs:
4875 raise util.Abort(_('no revisions specified'))
4879 raise util.Abort(_('no revisions specified'))
4876
4880
4877 revs = scmutil.revrange(repo, revs)
4881 revs = scmutil.revrange(repo, revs)
4878
4882
4879 lock = None
4883 lock = None
4880 ret = 0
4884 ret = 0
4881 if targetphase is None:
4885 if targetphase is None:
4882 # display
4886 # display
4883 for r in revs:
4887 for r in revs:
4884 ctx = repo[r]
4888 ctx = repo[r]
4885 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
4889 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
4886 else:
4890 else:
4887 tr = None
4891 tr = None
4888 lock = repo.lock()
4892 lock = repo.lock()
4889 try:
4893 try:
4890 tr = repo.transaction("phase")
4894 tr = repo.transaction("phase")
4891 # set phase
4895 # set phase
4892 if not revs:
4896 if not revs:
4893 raise util.Abort(_('empty revision set'))
4897 raise util.Abort(_('empty revision set'))
4894 nodes = [repo[r].node() for r in revs]
4898 nodes = [repo[r].node() for r in revs]
4895 # moving revision from public to draft may hide them
4899 # moving revision from public to draft may hide them
4896 # We have to check result on an unfiltered repository
4900 # We have to check result on an unfiltered repository
4897 unfi = repo.unfiltered()
4901 unfi = repo.unfiltered()
4898 getphase = unfi._phasecache.phase
4902 getphase = unfi._phasecache.phase
4899 olddata = [getphase(unfi, r) for r in unfi]
4903 olddata = [getphase(unfi, r) for r in unfi]
4900 phases.advanceboundary(repo, tr, targetphase, nodes)
4904 phases.advanceboundary(repo, tr, targetphase, nodes)
4901 if opts['force']:
4905 if opts['force']:
4902 phases.retractboundary(repo, tr, targetphase, nodes)
4906 phases.retractboundary(repo, tr, targetphase, nodes)
4903 tr.close()
4907 tr.close()
4904 finally:
4908 finally:
4905 if tr is not None:
4909 if tr is not None:
4906 tr.release()
4910 tr.release()
4907 lock.release()
4911 lock.release()
4908 getphase = unfi._phasecache.phase
4912 getphase = unfi._phasecache.phase
4909 newdata = [getphase(unfi, r) for r in unfi]
4913 newdata = [getphase(unfi, r) for r in unfi]
4910 changes = sum(newdata[r] != olddata[r] for r in unfi)
4914 changes = sum(newdata[r] != olddata[r] for r in unfi)
4911 cl = unfi.changelog
4915 cl = unfi.changelog
4912 rejected = [n for n in nodes
4916 rejected = [n for n in nodes
4913 if newdata[cl.rev(n)] < targetphase]
4917 if newdata[cl.rev(n)] < targetphase]
4914 if rejected:
4918 if rejected:
4915 ui.warn(_('cannot move %i changesets to a higher '
4919 ui.warn(_('cannot move %i changesets to a higher '
4916 'phase, use --force\n') % len(rejected))
4920 'phase, use --force\n') % len(rejected))
4917 ret = 1
4921 ret = 1
4918 if changes:
4922 if changes:
4919 msg = _('phase changed for %i changesets\n') % changes
4923 msg = _('phase changed for %i changesets\n') % changes
4920 if ret:
4924 if ret:
4921 ui.status(msg)
4925 ui.status(msg)
4922 else:
4926 else:
4923 ui.note(msg)
4927 ui.note(msg)
4924 else:
4928 else:
4925 ui.warn(_('no phases changed\n'))
4929 ui.warn(_('no phases changed\n'))
4926 ret = 1
4930 ret = 1
4927 return ret
4931 return ret
4928
4932
4929 def postincoming(ui, repo, modheads, optupdate, checkout):
4933 def postincoming(ui, repo, modheads, optupdate, checkout):
4930 if modheads == 0:
4934 if modheads == 0:
4931 return
4935 return
4932 if optupdate:
4936 if optupdate:
4933 checkout, movemarkfrom = bookmarks.calculateupdate(ui, repo, checkout)
4937 checkout, movemarkfrom = bookmarks.calculateupdate(ui, repo, checkout)
4934 try:
4938 try:
4935 ret = hg.update(repo, checkout)
4939 ret = hg.update(repo, checkout)
4936 except util.Abort, inst:
4940 except util.Abort, inst:
4937 ui.warn(_("not updating: %s\n") % str(inst))
4941 ui.warn(_("not updating: %s\n") % str(inst))
4938 if inst.hint:
4942 if inst.hint:
4939 ui.warn(_("(%s)\n") % inst.hint)
4943 ui.warn(_("(%s)\n") % inst.hint)
4940 return 0
4944 return 0
4941 if not ret and not checkout:
4945 if not ret and not checkout:
4942 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
4946 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
4943 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
4947 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
4944 return ret
4948 return ret
4945 if modheads > 1:
4949 if modheads > 1:
4946 currentbranchheads = len(repo.branchheads())
4950 currentbranchheads = len(repo.branchheads())
4947 if currentbranchheads == modheads:
4951 if currentbranchheads == modheads:
4948 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
4952 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
4949 elif currentbranchheads > 1:
4953 elif currentbranchheads > 1:
4950 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
4954 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
4951 "merge)\n"))
4955 "merge)\n"))
4952 else:
4956 else:
4953 ui.status(_("(run 'hg heads' to see heads)\n"))
4957 ui.status(_("(run 'hg heads' to see heads)\n"))
4954 else:
4958 else:
4955 ui.status(_("(run 'hg update' to get a working copy)\n"))
4959 ui.status(_("(run 'hg update' to get a working copy)\n"))
4956
4960
4957 @command('^pull',
4961 @command('^pull',
4958 [('u', 'update', None,
4962 [('u', 'update', None,
4959 _('update to new branch head if changesets were pulled')),
4963 _('update to new branch head if changesets were pulled')),
4960 ('f', 'force', None, _('run even when remote repository is unrelated')),
4964 ('f', 'force', None, _('run even when remote repository is unrelated')),
4961 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4965 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4962 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
4966 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
4963 ('b', 'branch', [], _('a specific branch you would like to pull'),
4967 ('b', 'branch', [], _('a specific branch you would like to pull'),
4964 _('BRANCH')),
4968 _('BRANCH')),
4965 ] + remoteopts,
4969 ] + remoteopts,
4966 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
4970 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
4967 def pull(ui, repo, source="default", **opts):
4971 def pull(ui, repo, source="default", **opts):
4968 """pull changes from the specified source
4972 """pull changes from the specified source
4969
4973
4970 Pull changes from a remote repository to a local one.
4974 Pull changes from a remote repository to a local one.
4971
4975
4972 This finds all changes from the repository at the specified path
4976 This finds all changes from the repository at the specified path
4973 or URL and adds them to a local repository (the current one unless
4977 or URL and adds them to a local repository (the current one unless
4974 -R is specified). By default, this does not update the copy of the
4978 -R is specified). By default, this does not update the copy of the
4975 project in the working directory.
4979 project in the working directory.
4976
4980
4977 Use :hg:`incoming` if you want to see what would have been added
4981 Use :hg:`incoming` if you want to see what would have been added
4978 by a pull at the time you issued this command. If you then decide
4982 by a pull at the time you issued this command. If you then decide
4979 to add those changes to the repository, you should use :hg:`pull
4983 to add those changes to the repository, you should use :hg:`pull
4980 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
4984 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
4981
4985
4982 If SOURCE is omitted, the 'default' path will be used.
4986 If SOURCE is omitted, the 'default' path will be used.
4983 See :hg:`help urls` for more information.
4987 See :hg:`help urls` for more information.
4984
4988
4985 Returns 0 on success, 1 if an update had unresolved files.
4989 Returns 0 on success, 1 if an update had unresolved files.
4986 """
4990 """
4987 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
4991 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
4988 ui.status(_('pulling from %s\n') % util.hidepassword(source))
4992 ui.status(_('pulling from %s\n') % util.hidepassword(source))
4989 other = hg.peer(repo, opts, source)
4993 other = hg.peer(repo, opts, source)
4990 try:
4994 try:
4991 revs, checkout = hg.addbranchrevs(repo, other, branches,
4995 revs, checkout = hg.addbranchrevs(repo, other, branches,
4992 opts.get('rev'))
4996 opts.get('rev'))
4993
4997
4994 remotebookmarks = other.listkeys('bookmarks')
4998 remotebookmarks = other.listkeys('bookmarks')
4995
4999
4996 if opts.get('bookmark'):
5000 if opts.get('bookmark'):
4997 if not revs:
5001 if not revs:
4998 revs = []
5002 revs = []
4999 for b in opts['bookmark']:
5003 for b in opts['bookmark']:
5000 if b not in remotebookmarks:
5004 if b not in remotebookmarks:
5001 raise util.Abort(_('remote bookmark %s not found!') % b)
5005 raise util.Abort(_('remote bookmark %s not found!') % b)
5002 revs.append(remotebookmarks[b])
5006 revs.append(remotebookmarks[b])
5003
5007
5004 if revs:
5008 if revs:
5005 try:
5009 try:
5006 revs = [other.lookup(rev) for rev in revs]
5010 revs = [other.lookup(rev) for rev in revs]
5007 except error.CapabilityError:
5011 except error.CapabilityError:
5008 err = _("other repository doesn't support revision lookup, "
5012 err = _("other repository doesn't support revision lookup, "
5009 "so a rev cannot be specified.")
5013 "so a rev cannot be specified.")
5010 raise util.Abort(err)
5014 raise util.Abort(err)
5011
5015
5012 modheads = exchange.pull(repo, other, heads=revs,
5016 modheads = exchange.pull(repo, other, heads=revs,
5013 force=opts.get('force'),
5017 force=opts.get('force'),
5014 bookmarks=opts.get('bookmark', ())).cgresult
5018 bookmarks=opts.get('bookmark', ())).cgresult
5015 if checkout:
5019 if checkout:
5016 checkout = str(repo.changelog.rev(other.lookup(checkout)))
5020 checkout = str(repo.changelog.rev(other.lookup(checkout)))
5017 repo._subtoppath = source
5021 repo._subtoppath = source
5018 try:
5022 try:
5019 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
5023 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
5020
5024
5021 finally:
5025 finally:
5022 del repo._subtoppath
5026 del repo._subtoppath
5023
5027
5024 finally:
5028 finally:
5025 other.close()
5029 other.close()
5026 return ret
5030 return ret
5027
5031
5028 @command('^push',
5032 @command('^push',
5029 [('f', 'force', None, _('force push')),
5033 [('f', 'force', None, _('force push')),
5030 ('r', 'rev', [],
5034 ('r', 'rev', [],
5031 _('a changeset intended to be included in the destination'),
5035 _('a changeset intended to be included in the destination'),
5032 _('REV')),
5036 _('REV')),
5033 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
5037 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
5034 ('b', 'branch', [],
5038 ('b', 'branch', [],
5035 _('a specific branch you would like to push'), _('BRANCH')),
5039 _('a specific branch you would like to push'), _('BRANCH')),
5036 ('', 'new-branch', False, _('allow pushing a new branch')),
5040 ('', 'new-branch', False, _('allow pushing a new branch')),
5037 ] + remoteopts,
5041 ] + remoteopts,
5038 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
5042 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
5039 def push(ui, repo, dest=None, **opts):
5043 def push(ui, repo, dest=None, **opts):
5040 """push changes to the specified destination
5044 """push changes to the specified destination
5041
5045
5042 Push changesets from the local repository to the specified
5046 Push changesets from the local repository to the specified
5043 destination.
5047 destination.
5044
5048
5045 This operation is symmetrical to pull: it is identical to a pull
5049 This operation is symmetrical to pull: it is identical to a pull
5046 in the destination repository from the current one.
5050 in the destination repository from the current one.
5047
5051
5048 By default, push will not allow creation of new heads at the
5052 By default, push will not allow creation of new heads at the
5049 destination, since multiple heads would make it unclear which head
5053 destination, since multiple heads would make it unclear which head
5050 to use. In this situation, it is recommended to pull and merge
5054 to use. In this situation, it is recommended to pull and merge
5051 before pushing.
5055 before pushing.
5052
5056
5053 Use --new-branch if you want to allow push to create a new named
5057 Use --new-branch if you want to allow push to create a new named
5054 branch that is not present at the destination. This allows you to
5058 branch that is not present at the destination. This allows you to
5055 only create a new branch without forcing other changes.
5059 only create a new branch without forcing other changes.
5056
5060
5057 .. note::
5061 .. note::
5058
5062
5059 Extra care should be taken with the -f/--force option,
5063 Extra care should be taken with the -f/--force option,
5060 which will push all new heads on all branches, an action which will
5064 which will push all new heads on all branches, an action which will
5061 almost always cause confusion for collaborators.
5065 almost always cause confusion for collaborators.
5062
5066
5063 If -r/--rev is used, the specified revision and all its ancestors
5067 If -r/--rev is used, the specified revision and all its ancestors
5064 will be pushed to the remote repository.
5068 will be pushed to the remote repository.
5065
5069
5066 If -B/--bookmark is used, the specified bookmarked revision, its
5070 If -B/--bookmark is used, the specified bookmarked revision, its
5067 ancestors, and the bookmark will be pushed to the remote
5071 ancestors, and the bookmark will be pushed to the remote
5068 repository.
5072 repository.
5069
5073
5070 Please see :hg:`help urls` for important details about ``ssh://``
5074 Please see :hg:`help urls` for important details about ``ssh://``
5071 URLs. If DESTINATION is omitted, a default path will be used.
5075 URLs. If DESTINATION is omitted, a default path will be used.
5072
5076
5073 Returns 0 if push was successful, 1 if nothing to push.
5077 Returns 0 if push was successful, 1 if nothing to push.
5074 """
5078 """
5075
5079
5076 if opts.get('bookmark'):
5080 if opts.get('bookmark'):
5077 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
5081 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
5078 for b in opts['bookmark']:
5082 for b in opts['bookmark']:
5079 # translate -B options to -r so changesets get pushed
5083 # translate -B options to -r so changesets get pushed
5080 if b in repo._bookmarks:
5084 if b in repo._bookmarks:
5081 opts.setdefault('rev', []).append(b)
5085 opts.setdefault('rev', []).append(b)
5082 else:
5086 else:
5083 # if we try to push a deleted bookmark, translate it to null
5087 # if we try to push a deleted bookmark, translate it to null
5084 # this lets simultaneous -r, -b options continue working
5088 # this lets simultaneous -r, -b options continue working
5085 opts.setdefault('rev', []).append("null")
5089 opts.setdefault('rev', []).append("null")
5086
5090
5087 dest = ui.expandpath(dest or 'default-push', dest or 'default')
5091 dest = ui.expandpath(dest or 'default-push', dest or 'default')
5088 dest, branches = hg.parseurl(dest, opts.get('branch'))
5092 dest, branches = hg.parseurl(dest, opts.get('branch'))
5089 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
5093 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
5090 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
5094 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
5091 try:
5095 try:
5092 other = hg.peer(repo, opts, dest)
5096 other = hg.peer(repo, opts, dest)
5093 except error.RepoError:
5097 except error.RepoError:
5094 if dest == "default-push":
5098 if dest == "default-push":
5095 raise util.Abort(_("default repository not configured!"),
5099 raise util.Abort(_("default repository not configured!"),
5096 hint=_('see the "path" section in "hg help config"'))
5100 hint=_('see the "path" section in "hg help config"'))
5097 else:
5101 else:
5098 raise
5102 raise
5099
5103
5100 if revs:
5104 if revs:
5101 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
5105 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
5102
5106
5103 repo._subtoppath = dest
5107 repo._subtoppath = dest
5104 try:
5108 try:
5105 # push subrepos depth-first for coherent ordering
5109 # push subrepos depth-first for coherent ordering
5106 c = repo['']
5110 c = repo['']
5107 subs = c.substate # only repos that are committed
5111 subs = c.substate # only repos that are committed
5108 for s in sorted(subs):
5112 for s in sorted(subs):
5109 result = c.sub(s).push(opts)
5113 result = c.sub(s).push(opts)
5110 if result == 0:
5114 if result == 0:
5111 return not result
5115 return not result
5112 finally:
5116 finally:
5113 del repo._subtoppath
5117 del repo._subtoppath
5114 pushop = exchange.push(repo, other, opts.get('force'), revs=revs,
5118 pushop = exchange.push(repo, other, opts.get('force'), revs=revs,
5115 newbranch=opts.get('new_branch'),
5119 newbranch=opts.get('new_branch'),
5116 bookmarks=opts.get('bookmark', ()))
5120 bookmarks=opts.get('bookmark', ()))
5117
5121
5118 result = not pushop.cgresult
5122 result = not pushop.cgresult
5119
5123
5120 if pushop.bkresult is not None:
5124 if pushop.bkresult is not None:
5121 if pushop.bkresult == 2:
5125 if pushop.bkresult == 2:
5122 result = 2
5126 result = 2
5123 elif not result and pushop.bkresult:
5127 elif not result and pushop.bkresult:
5124 result = 2
5128 result = 2
5125
5129
5126 return result
5130 return result
5127
5131
5128 @command('recover', [])
5132 @command('recover', [])
5129 def recover(ui, repo):
5133 def recover(ui, repo):
5130 """roll back an interrupted transaction
5134 """roll back an interrupted transaction
5131
5135
5132 Recover from an interrupted commit or pull.
5136 Recover from an interrupted commit or pull.
5133
5137
5134 This command tries to fix the repository status after an
5138 This command tries to fix the repository status after an
5135 interrupted operation. It should only be necessary when Mercurial
5139 interrupted operation. It should only be necessary when Mercurial
5136 suggests it.
5140 suggests it.
5137
5141
5138 Returns 0 if successful, 1 if nothing to recover or verify fails.
5142 Returns 0 if successful, 1 if nothing to recover or verify fails.
5139 """
5143 """
5140 if repo.recover():
5144 if repo.recover():
5141 return hg.verify(repo)
5145 return hg.verify(repo)
5142 return 1
5146 return 1
5143
5147
5144 @command('^remove|rm',
5148 @command('^remove|rm',
5145 [('A', 'after', None, _('record delete for missing files')),
5149 [('A', 'after', None, _('record delete for missing files')),
5146 ('f', 'force', None,
5150 ('f', 'force', None,
5147 _('remove (and delete) file even if added or modified')),
5151 _('remove (and delete) file even if added or modified')),
5148 ] + subrepoopts + walkopts,
5152 ] + subrepoopts + walkopts,
5149 _('[OPTION]... FILE...'),
5153 _('[OPTION]... FILE...'),
5150 inferrepo=True)
5154 inferrepo=True)
5151 def remove(ui, repo, *pats, **opts):
5155 def remove(ui, repo, *pats, **opts):
5152 """remove the specified files on the next commit
5156 """remove the specified files on the next commit
5153
5157
5154 Schedule the indicated files for removal from the current branch.
5158 Schedule the indicated files for removal from the current branch.
5155
5159
5156 This command schedules the files to be removed at the next commit.
5160 This command schedules the files to be removed at the next commit.
5157 To undo a remove before that, see :hg:`revert`. To undo added
5161 To undo a remove before that, see :hg:`revert`. To undo added
5158 files, see :hg:`forget`.
5162 files, see :hg:`forget`.
5159
5163
5160 .. container:: verbose
5164 .. container:: verbose
5161
5165
5162 -A/--after can be used to remove only files that have already
5166 -A/--after can be used to remove only files that have already
5163 been deleted, -f/--force can be used to force deletion, and -Af
5167 been deleted, -f/--force can be used to force deletion, and -Af
5164 can be used to remove files from the next revision without
5168 can be used to remove files from the next revision without
5165 deleting them from the working directory.
5169 deleting them from the working directory.
5166
5170
5167 The following table details the behavior of remove for different
5171 The following table details the behavior of remove for different
5168 file states (columns) and option combinations (rows). The file
5172 file states (columns) and option combinations (rows). The file
5169 states are Added [A], Clean [C], Modified [M] and Missing [!]
5173 states are Added [A], Clean [C], Modified [M] and Missing [!]
5170 (as reported by :hg:`status`). The actions are Warn, Remove
5174 (as reported by :hg:`status`). The actions are Warn, Remove
5171 (from branch) and Delete (from disk):
5175 (from branch) and Delete (from disk):
5172
5176
5173 ========= == == == ==
5177 ========= == == == ==
5174 opt/state A C M !
5178 opt/state A C M !
5175 ========= == == == ==
5179 ========= == == == ==
5176 none W RD W R
5180 none W RD W R
5177 -f R RD RD R
5181 -f R RD RD R
5178 -A W W W R
5182 -A W W W R
5179 -Af R R R R
5183 -Af R R R R
5180 ========= == == == ==
5184 ========= == == == ==
5181
5185
5182 Note that remove never deletes files in Added [A] state from the
5186 Note that remove never deletes files in Added [A] state from the
5183 working directory, not even if option --force is specified.
5187 working directory, not even if option --force is specified.
5184
5188
5185 Returns 0 on success, 1 if any warnings encountered.
5189 Returns 0 on success, 1 if any warnings encountered.
5186 """
5190 """
5187
5191
5188 after, force = opts.get('after'), opts.get('force')
5192 after, force = opts.get('after'), opts.get('force')
5189 if not pats and not after:
5193 if not pats and not after:
5190 raise util.Abort(_('no files specified'))
5194 raise util.Abort(_('no files specified'))
5191
5195
5192 m = scmutil.match(repo[None], pats, opts)
5196 m = scmutil.match(repo[None], pats, opts)
5193 subrepos = opts.get('subrepos')
5197 subrepos = opts.get('subrepos')
5194 return cmdutil.remove(ui, repo, m, "", after, force, subrepos)
5198 return cmdutil.remove(ui, repo, m, "", after, force, subrepos)
5195
5199
5196 @command('rename|move|mv',
5200 @command('rename|move|mv',
5197 [('A', 'after', None, _('record a rename that has already occurred')),
5201 [('A', 'after', None, _('record a rename that has already occurred')),
5198 ('f', 'force', None, _('forcibly copy over an existing managed file')),
5202 ('f', 'force', None, _('forcibly copy over an existing managed file')),
5199 ] + walkopts + dryrunopts,
5203 ] + walkopts + dryrunopts,
5200 _('[OPTION]... SOURCE... DEST'))
5204 _('[OPTION]... SOURCE... DEST'))
5201 def rename(ui, repo, *pats, **opts):
5205 def rename(ui, repo, *pats, **opts):
5202 """rename files; equivalent of copy + remove
5206 """rename files; equivalent of copy + remove
5203
5207
5204 Mark dest as copies of sources; mark sources for deletion. If dest
5208 Mark dest as copies of sources; mark sources for deletion. If dest
5205 is a directory, copies are put in that directory. If dest is a
5209 is a directory, copies are put in that directory. If dest is a
5206 file, there can only be one source.
5210 file, there can only be one source.
5207
5211
5208 By default, this command copies the contents of files as they
5212 By default, this command copies the contents of files as they
5209 exist in the working directory. If invoked with -A/--after, the
5213 exist in the working directory. If invoked with -A/--after, the
5210 operation is recorded, but no copying is performed.
5214 operation is recorded, but no copying is performed.
5211
5215
5212 This command takes effect at the next commit. To undo a rename
5216 This command takes effect at the next commit. To undo a rename
5213 before that, see :hg:`revert`.
5217 before that, see :hg:`revert`.
5214
5218
5215 Returns 0 on success, 1 if errors are encountered.
5219 Returns 0 on success, 1 if errors are encountered.
5216 """
5220 """
5217 wlock = repo.wlock(False)
5221 wlock = repo.wlock(False)
5218 try:
5222 try:
5219 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5223 return cmdutil.copy(ui, repo, pats, opts, rename=True)
5220 finally:
5224 finally:
5221 wlock.release()
5225 wlock.release()
5222
5226
5223 @command('resolve',
5227 @command('resolve',
5224 [('a', 'all', None, _('select all unresolved files')),
5228 [('a', 'all', None, _('select all unresolved files')),
5225 ('l', 'list', None, _('list state of files needing merge')),
5229 ('l', 'list', None, _('list state of files needing merge')),
5226 ('m', 'mark', None, _('mark files as resolved')),
5230 ('m', 'mark', None, _('mark files as resolved')),
5227 ('u', 'unmark', None, _('mark files as unresolved')),
5231 ('u', 'unmark', None, _('mark files as unresolved')),
5228 ('n', 'no-status', None, _('hide status prefix'))]
5232 ('n', 'no-status', None, _('hide status prefix'))]
5229 + mergetoolopts + walkopts + formatteropts,
5233 + mergetoolopts + walkopts + formatteropts,
5230 _('[OPTION]... [FILE]...'),
5234 _('[OPTION]... [FILE]...'),
5231 inferrepo=True)
5235 inferrepo=True)
5232 def resolve(ui, repo, *pats, **opts):
5236 def resolve(ui, repo, *pats, **opts):
5233 """redo merges or set/view the merge status of files
5237 """redo merges or set/view the merge status of files
5234
5238
5235 Merges with unresolved conflicts are often the result of
5239 Merges with unresolved conflicts are often the result of
5236 non-interactive merging using the ``internal:merge`` configuration
5240 non-interactive merging using the ``internal:merge`` configuration
5237 setting, or a command-line merge tool like ``diff3``. The resolve
5241 setting, or a command-line merge tool like ``diff3``. The resolve
5238 command is used to manage the files involved in a merge, after
5242 command is used to manage the files involved in a merge, after
5239 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5243 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
5240 working directory must have two parents). See :hg:`help
5244 working directory must have two parents). See :hg:`help
5241 merge-tools` for information on configuring merge tools.
5245 merge-tools` for information on configuring merge tools.
5242
5246
5243 The resolve command can be used in the following ways:
5247 The resolve command can be used in the following ways:
5244
5248
5245 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
5249 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
5246 files, discarding any previous merge attempts. Re-merging is not
5250 files, discarding any previous merge attempts. Re-merging is not
5247 performed for files already marked as resolved. Use ``--all/-a``
5251 performed for files already marked as resolved. Use ``--all/-a``
5248 to select all unresolved files. ``--tool`` can be used to specify
5252 to select all unresolved files. ``--tool`` can be used to specify
5249 the merge tool used for the given files. It overrides the HGMERGE
5253 the merge tool used for the given files. It overrides the HGMERGE
5250 environment variable and your configuration files. Previous file
5254 environment variable and your configuration files. Previous file
5251 contents are saved with a ``.orig`` suffix.
5255 contents are saved with a ``.orig`` suffix.
5252
5256
5253 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5257 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
5254 (e.g. after having manually fixed-up the files). The default is
5258 (e.g. after having manually fixed-up the files). The default is
5255 to mark all unresolved files.
5259 to mark all unresolved files.
5256
5260
5257 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5261 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
5258 default is to mark all resolved files.
5262 default is to mark all resolved files.
5259
5263
5260 - :hg:`resolve -l`: list files which had or still have conflicts.
5264 - :hg:`resolve -l`: list files which had or still have conflicts.
5261 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5265 In the printed list, ``U`` = unresolved and ``R`` = resolved.
5262
5266
5263 Note that Mercurial will not let you commit files with unresolved
5267 Note that Mercurial will not let you commit files with unresolved
5264 merge conflicts. You must use :hg:`resolve -m ...` before you can
5268 merge conflicts. You must use :hg:`resolve -m ...` before you can
5265 commit after a conflicting merge.
5269 commit after a conflicting merge.
5266
5270
5267 Returns 0 on success, 1 if any files fail a resolve attempt.
5271 Returns 0 on success, 1 if any files fail a resolve attempt.
5268 """
5272 """
5269
5273
5270 all, mark, unmark, show, nostatus = \
5274 all, mark, unmark, show, nostatus = \
5271 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
5275 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
5272
5276
5273 if (show and (mark or unmark)) or (mark and unmark):
5277 if (show and (mark or unmark)) or (mark and unmark):
5274 raise util.Abort(_("too many options specified"))
5278 raise util.Abort(_("too many options specified"))
5275 if pats and all:
5279 if pats and all:
5276 raise util.Abort(_("can't specify --all and patterns"))
5280 raise util.Abort(_("can't specify --all and patterns"))
5277 if not (all or pats or show or mark or unmark):
5281 if not (all or pats or show or mark or unmark):
5278 raise util.Abort(_('no files or directories specified'),
5282 raise util.Abort(_('no files or directories specified'),
5279 hint=('use --all to remerge all files'))
5283 hint=('use --all to remerge all files'))
5280
5284
5281 if show:
5285 if show:
5282 fm = ui.formatter('resolve', opts)
5286 fm = ui.formatter('resolve', opts)
5283 ms = mergemod.mergestate(repo)
5287 ms = mergemod.mergestate(repo)
5284 m = scmutil.match(repo[None], pats, opts)
5288 m = scmutil.match(repo[None], pats, opts)
5285 for f in ms:
5289 for f in ms:
5286 if not m(f):
5290 if not m(f):
5287 continue
5291 continue
5288 l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved'}[ms[f]]
5292 l = 'resolve.' + {'u': 'unresolved', 'r': 'resolved'}[ms[f]]
5289 fm.startitem()
5293 fm.startitem()
5290 fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
5294 fm.condwrite(not nostatus, 'status', '%s ', ms[f].upper(), label=l)
5291 fm.write('path', '%s\n', f, label=l)
5295 fm.write('path', '%s\n', f, label=l)
5292 fm.end()
5296 fm.end()
5293 return 0
5297 return 0
5294
5298
5295 wlock = repo.wlock()
5299 wlock = repo.wlock()
5296 try:
5300 try:
5297 ms = mergemod.mergestate(repo)
5301 ms = mergemod.mergestate(repo)
5298
5302
5299 if not (ms.active() or repo.dirstate.p2() != nullid):
5303 if not (ms.active() or repo.dirstate.p2() != nullid):
5300 raise util.Abort(
5304 raise util.Abort(
5301 _('resolve command not applicable when not merging'))
5305 _('resolve command not applicable when not merging'))
5302
5306
5303 m = scmutil.match(repo[None], pats, opts)
5307 m = scmutil.match(repo[None], pats, opts)
5304 ret = 0
5308 ret = 0
5305 didwork = False
5309 didwork = False
5306
5310
5307 for f in ms:
5311 for f in ms:
5308 if not m(f):
5312 if not m(f):
5309 continue
5313 continue
5310
5314
5311 didwork = True
5315 didwork = True
5312
5316
5313 if mark:
5317 if mark:
5314 ms.mark(f, "r")
5318 ms.mark(f, "r")
5315 elif unmark:
5319 elif unmark:
5316 ms.mark(f, "u")
5320 ms.mark(f, "u")
5317 else:
5321 else:
5318 wctx = repo[None]
5322 wctx = repo[None]
5319
5323
5320 # backup pre-resolve (merge uses .orig for its own purposes)
5324 # backup pre-resolve (merge uses .orig for its own purposes)
5321 a = repo.wjoin(f)
5325 a = repo.wjoin(f)
5322 util.copyfile(a, a + ".resolve")
5326 util.copyfile(a, a + ".resolve")
5323
5327
5324 try:
5328 try:
5325 # resolve file
5329 # resolve file
5326 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5330 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5327 'resolve')
5331 'resolve')
5328 if ms.resolve(f, wctx):
5332 if ms.resolve(f, wctx):
5329 ret = 1
5333 ret = 1
5330 finally:
5334 finally:
5331 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5335 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5332 ms.commit()
5336 ms.commit()
5333
5337
5334 # replace filemerge's .orig file with our resolve file
5338 # replace filemerge's .orig file with our resolve file
5335 util.rename(a + ".resolve", a + ".orig")
5339 util.rename(a + ".resolve", a + ".orig")
5336
5340
5337 ms.commit()
5341 ms.commit()
5338
5342
5339 if not didwork and pats:
5343 if not didwork and pats:
5340 ui.warn(_("arguments do not match paths that need resolving\n"))
5344 ui.warn(_("arguments do not match paths that need resolving\n"))
5341
5345
5342 finally:
5346 finally:
5343 wlock.release()
5347 wlock.release()
5344
5348
5345 # Nudge users into finishing an unfinished operation
5349 # Nudge users into finishing an unfinished operation
5346 if not list(ms.unresolved()):
5350 if not list(ms.unresolved()):
5347 ui.status(_('(no more unresolved files)\n'))
5351 ui.status(_('(no more unresolved files)\n'))
5348
5352
5349 return ret
5353 return ret
5350
5354
5351 @command('revert',
5355 @command('revert',
5352 [('a', 'all', None, _('revert all changes when no arguments given')),
5356 [('a', 'all', None, _('revert all changes when no arguments given')),
5353 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5357 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5354 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5358 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5355 ('C', 'no-backup', None, _('do not save backup copies of files')),
5359 ('C', 'no-backup', None, _('do not save backup copies of files')),
5356 ] + walkopts + dryrunopts,
5360 ] + walkopts + dryrunopts,
5357 _('[OPTION]... [-r REV] [NAME]...'))
5361 _('[OPTION]... [-r REV] [NAME]...'))
5358 def revert(ui, repo, *pats, **opts):
5362 def revert(ui, repo, *pats, **opts):
5359 """restore files to their checkout state
5363 """restore files to their checkout state
5360
5364
5361 .. note::
5365 .. note::
5362
5366
5363 To check out earlier revisions, you should use :hg:`update REV`.
5367 To check out earlier revisions, you should use :hg:`update REV`.
5364 To cancel an uncommitted merge (and lose your changes),
5368 To cancel an uncommitted merge (and lose your changes),
5365 use :hg:`update --clean .`.
5369 use :hg:`update --clean .`.
5366
5370
5367 With no revision specified, revert the specified files or directories
5371 With no revision specified, revert the specified files or directories
5368 to the contents they had in the parent of the working directory.
5372 to the contents they had in the parent of the working directory.
5369 This restores the contents of files to an unmodified
5373 This restores the contents of files to an unmodified
5370 state and unschedules adds, removes, copies, and renames. If the
5374 state and unschedules adds, removes, copies, and renames. If the
5371 working directory has two parents, you must explicitly specify a
5375 working directory has two parents, you must explicitly specify a
5372 revision.
5376 revision.
5373
5377
5374 Using the -r/--rev or -d/--date options, revert the given files or
5378 Using the -r/--rev or -d/--date options, revert the given files or
5375 directories to their states as of a specific revision. Because
5379 directories to their states as of a specific revision. Because
5376 revert does not change the working directory parents, this will
5380 revert does not change the working directory parents, this will
5377 cause these files to appear modified. This can be helpful to "back
5381 cause these files to appear modified. This can be helpful to "back
5378 out" some or all of an earlier change. See :hg:`backout` for a
5382 out" some or all of an earlier change. See :hg:`backout` for a
5379 related method.
5383 related method.
5380
5384
5381 Modified files are saved with a .orig suffix before reverting.
5385 Modified files are saved with a .orig suffix before reverting.
5382 To disable these backups, use --no-backup.
5386 To disable these backups, use --no-backup.
5383
5387
5384 See :hg:`help dates` for a list of formats valid for -d/--date.
5388 See :hg:`help dates` for a list of formats valid for -d/--date.
5385
5389
5386 Returns 0 on success.
5390 Returns 0 on success.
5387 """
5391 """
5388
5392
5389 if opts.get("date"):
5393 if opts.get("date"):
5390 if opts.get("rev"):
5394 if opts.get("rev"):
5391 raise util.Abort(_("you can't specify a revision and a date"))
5395 raise util.Abort(_("you can't specify a revision and a date"))
5392 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5396 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5393
5397
5394 parent, p2 = repo.dirstate.parents()
5398 parent, p2 = repo.dirstate.parents()
5395 if not opts.get('rev') and p2 != nullid:
5399 if not opts.get('rev') and p2 != nullid:
5396 # revert after merge is a trap for new users (issue2915)
5400 # revert after merge is a trap for new users (issue2915)
5397 raise util.Abort(_('uncommitted merge with no revision specified'),
5401 raise util.Abort(_('uncommitted merge with no revision specified'),
5398 hint=_('use "hg update" or see "hg help revert"'))
5402 hint=_('use "hg update" or see "hg help revert"'))
5399
5403
5400 ctx = scmutil.revsingle(repo, opts.get('rev'))
5404 ctx = scmutil.revsingle(repo, opts.get('rev'))
5401
5405
5402 if not pats and not opts.get('all'):
5406 if not pats and not opts.get('all'):
5403 msg = _("no files or directories specified")
5407 msg = _("no files or directories specified")
5404 if p2 != nullid:
5408 if p2 != nullid:
5405 hint = _("uncommitted merge, use --all to discard all changes,"
5409 hint = _("uncommitted merge, use --all to discard all changes,"
5406 " or 'hg update -C .' to abort the merge")
5410 " or 'hg update -C .' to abort the merge")
5407 raise util.Abort(msg, hint=hint)
5411 raise util.Abort(msg, hint=hint)
5408 dirty = util.any(repo.status())
5412 dirty = util.any(repo.status())
5409 node = ctx.node()
5413 node = ctx.node()
5410 if node != parent:
5414 if node != parent:
5411 if dirty:
5415 if dirty:
5412 hint = _("uncommitted changes, use --all to discard all"
5416 hint = _("uncommitted changes, use --all to discard all"
5413 " changes, or 'hg update %s' to update") % ctx.rev()
5417 " changes, or 'hg update %s' to update") % ctx.rev()
5414 else:
5418 else:
5415 hint = _("use --all to revert all files,"
5419 hint = _("use --all to revert all files,"
5416 " or 'hg update %s' to update") % ctx.rev()
5420 " or 'hg update %s' to update") % ctx.rev()
5417 elif dirty:
5421 elif dirty:
5418 hint = _("uncommitted changes, use --all to discard all changes")
5422 hint = _("uncommitted changes, use --all to discard all changes")
5419 else:
5423 else:
5420 hint = _("use --all to revert all files")
5424 hint = _("use --all to revert all files")
5421 raise util.Abort(msg, hint=hint)
5425 raise util.Abort(msg, hint=hint)
5422
5426
5423 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5427 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5424
5428
5425 @command('rollback', dryrunopts +
5429 @command('rollback', dryrunopts +
5426 [('f', 'force', False, _('ignore safety measures'))])
5430 [('f', 'force', False, _('ignore safety measures'))])
5427 def rollback(ui, repo, **opts):
5431 def rollback(ui, repo, **opts):
5428 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5432 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5429
5433
5430 Please use :hg:`commit --amend` instead of rollback to correct
5434 Please use :hg:`commit --amend` instead of rollback to correct
5431 mistakes in the last commit.
5435 mistakes in the last commit.
5432
5436
5433 This command should be used with care. There is only one level of
5437 This command should be used with care. There is only one level of
5434 rollback, and there is no way to undo a rollback. It will also
5438 rollback, and there is no way to undo a rollback. It will also
5435 restore the dirstate at the time of the last transaction, losing
5439 restore the dirstate at the time of the last transaction, losing
5436 any dirstate changes since that time. This command does not alter
5440 any dirstate changes since that time. This command does not alter
5437 the working directory.
5441 the working directory.
5438
5442
5439 Transactions are used to encapsulate the effects of all commands
5443 Transactions are used to encapsulate the effects of all commands
5440 that create new changesets or propagate existing changesets into a
5444 that create new changesets or propagate existing changesets into a
5441 repository.
5445 repository.
5442
5446
5443 .. container:: verbose
5447 .. container:: verbose
5444
5448
5445 For example, the following commands are transactional, and their
5449 For example, the following commands are transactional, and their
5446 effects can be rolled back:
5450 effects can be rolled back:
5447
5451
5448 - commit
5452 - commit
5449 - import
5453 - import
5450 - pull
5454 - pull
5451 - push (with this repository as the destination)
5455 - push (with this repository as the destination)
5452 - unbundle
5456 - unbundle
5453
5457
5454 To avoid permanent data loss, rollback will refuse to rollback a
5458 To avoid permanent data loss, rollback will refuse to rollback a
5455 commit transaction if it isn't checked out. Use --force to
5459 commit transaction if it isn't checked out. Use --force to
5456 override this protection.
5460 override this protection.
5457
5461
5458 This command is not intended for use on public repositories. Once
5462 This command is not intended for use on public repositories. Once
5459 changes are visible for pull by other users, rolling a transaction
5463 changes are visible for pull by other users, rolling a transaction
5460 back locally is ineffective (someone else may already have pulled
5464 back locally is ineffective (someone else may already have pulled
5461 the changes). Furthermore, a race is possible with readers of the
5465 the changes). Furthermore, a race is possible with readers of the
5462 repository; for example an in-progress pull from the repository
5466 repository; for example an in-progress pull from the repository
5463 may fail if a rollback is performed.
5467 may fail if a rollback is performed.
5464
5468
5465 Returns 0 on success, 1 if no rollback data is available.
5469 Returns 0 on success, 1 if no rollback data is available.
5466 """
5470 """
5467 return repo.rollback(dryrun=opts.get('dry_run'),
5471 return repo.rollback(dryrun=opts.get('dry_run'),
5468 force=opts.get('force'))
5472 force=opts.get('force'))
5469
5473
5470 @command('root', [])
5474 @command('root', [])
5471 def root(ui, repo):
5475 def root(ui, repo):
5472 """print the root (top) of the current working directory
5476 """print the root (top) of the current working directory
5473
5477
5474 Print the root directory of the current repository.
5478 Print the root directory of the current repository.
5475
5479
5476 Returns 0 on success.
5480 Returns 0 on success.
5477 """
5481 """
5478 ui.write(repo.root + "\n")
5482 ui.write(repo.root + "\n")
5479
5483
5480 @command('^serve',
5484 @command('^serve',
5481 [('A', 'accesslog', '', _('name of access log file to write to'),
5485 [('A', 'accesslog', '', _('name of access log file to write to'),
5482 _('FILE')),
5486 _('FILE')),
5483 ('d', 'daemon', None, _('run server in background')),
5487 ('d', 'daemon', None, _('run server in background')),
5484 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('FILE')),
5488 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('FILE')),
5485 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5489 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5486 # use string type, then we can check if something was passed
5490 # use string type, then we can check if something was passed
5487 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5491 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5488 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5492 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5489 _('ADDR')),
5493 _('ADDR')),
5490 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5494 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5491 _('PREFIX')),
5495 _('PREFIX')),
5492 ('n', 'name', '',
5496 ('n', 'name', '',
5493 _('name to show in web pages (default: working directory)'), _('NAME')),
5497 _('name to show in web pages (default: working directory)'), _('NAME')),
5494 ('', 'web-conf', '',
5498 ('', 'web-conf', '',
5495 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5499 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5496 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5500 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5497 _('FILE')),
5501 _('FILE')),
5498 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5502 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5499 ('', 'stdio', None, _('for remote clients')),
5503 ('', 'stdio', None, _('for remote clients')),
5500 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5504 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5501 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5505 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5502 ('', 'style', '', _('template style to use'), _('STYLE')),
5506 ('', 'style', '', _('template style to use'), _('STYLE')),
5503 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5507 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5504 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5508 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5505 _('[OPTION]...'),
5509 _('[OPTION]...'),
5506 optionalrepo=True)
5510 optionalrepo=True)
5507 def serve(ui, repo, **opts):
5511 def serve(ui, repo, **opts):
5508 """start stand-alone webserver
5512 """start stand-alone webserver
5509
5513
5510 Start a local HTTP repository browser and pull server. You can use
5514 Start a local HTTP repository browser and pull server. You can use
5511 this for ad-hoc sharing and browsing of repositories. It is
5515 this for ad-hoc sharing and browsing of repositories. It is
5512 recommended to use a real web server to serve a repository for
5516 recommended to use a real web server to serve a repository for
5513 longer periods of time.
5517 longer periods of time.
5514
5518
5515 Please note that the server does not implement access control.
5519 Please note that the server does not implement access control.
5516 This means that, by default, anybody can read from the server and
5520 This means that, by default, anybody can read from the server and
5517 nobody can write to it by default. Set the ``web.allow_push``
5521 nobody can write to it by default. Set the ``web.allow_push``
5518 option to ``*`` to allow everybody to push to the server. You
5522 option to ``*`` to allow everybody to push to the server. You
5519 should use a real web server if you need to authenticate users.
5523 should use a real web server if you need to authenticate users.
5520
5524
5521 By default, the server logs accesses to stdout and errors to
5525 By default, the server logs accesses to stdout and errors to
5522 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5526 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5523 files.
5527 files.
5524
5528
5525 To have the server choose a free port number to listen on, specify
5529 To have the server choose a free port number to listen on, specify
5526 a port number of 0; in this case, the server will print the port
5530 a port number of 0; in this case, the server will print the port
5527 number it uses.
5531 number it uses.
5528
5532
5529 Returns 0 on success.
5533 Returns 0 on success.
5530 """
5534 """
5531
5535
5532 if opts["stdio"] and opts["cmdserver"]:
5536 if opts["stdio"] and opts["cmdserver"]:
5533 raise util.Abort(_("cannot use --stdio with --cmdserver"))
5537 raise util.Abort(_("cannot use --stdio with --cmdserver"))
5534
5538
5535 if opts["stdio"]:
5539 if opts["stdio"]:
5536 if repo is None:
5540 if repo is None:
5537 raise error.RepoError(_("there is no Mercurial repository here"
5541 raise error.RepoError(_("there is no Mercurial repository here"
5538 " (.hg not found)"))
5542 " (.hg not found)"))
5539 s = sshserver.sshserver(ui, repo)
5543 s = sshserver.sshserver(ui, repo)
5540 s.serve_forever()
5544 s.serve_forever()
5541
5545
5542 if opts["cmdserver"]:
5546 if opts["cmdserver"]:
5543 service = commandserver.createservice(ui, repo, opts)
5547 service = commandserver.createservice(ui, repo, opts)
5544 return cmdutil.service(opts, initfn=service.init, runfn=service.run)
5548 return cmdutil.service(opts, initfn=service.init, runfn=service.run)
5545
5549
5546 # this way we can check if something was given in the command-line
5550 # this way we can check if something was given in the command-line
5547 if opts.get('port'):
5551 if opts.get('port'):
5548 opts['port'] = util.getport(opts.get('port'))
5552 opts['port'] = util.getport(opts.get('port'))
5549
5553
5550 baseui = repo and repo.baseui or ui
5554 baseui = repo and repo.baseui or ui
5551 optlist = ("name templates style address port prefix ipv6"
5555 optlist = ("name templates style address port prefix ipv6"
5552 " accesslog errorlog certificate encoding")
5556 " accesslog errorlog certificate encoding")
5553 for o in optlist.split():
5557 for o in optlist.split():
5554 val = opts.get(o, '')
5558 val = opts.get(o, '')
5555 if val in (None, ''): # should check against default options instead
5559 if val in (None, ''): # should check against default options instead
5556 continue
5560 continue
5557 baseui.setconfig("web", o, val, 'serve')
5561 baseui.setconfig("web", o, val, 'serve')
5558 if repo and repo.ui != baseui:
5562 if repo and repo.ui != baseui:
5559 repo.ui.setconfig("web", o, val, 'serve')
5563 repo.ui.setconfig("web", o, val, 'serve')
5560
5564
5561 o = opts.get('web_conf') or opts.get('webdir_conf')
5565 o = opts.get('web_conf') or opts.get('webdir_conf')
5562 if not o:
5566 if not o:
5563 if not repo:
5567 if not repo:
5564 raise error.RepoError(_("there is no Mercurial repository"
5568 raise error.RepoError(_("there is no Mercurial repository"
5565 " here (.hg not found)"))
5569 " here (.hg not found)"))
5566 o = repo
5570 o = repo
5567
5571
5568 app = hgweb.hgweb(o, baseui=baseui)
5572 app = hgweb.hgweb(o, baseui=baseui)
5569 service = httpservice(ui, app, opts)
5573 service = httpservice(ui, app, opts)
5570 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5574 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5571
5575
5572 class httpservice(object):
5576 class httpservice(object):
5573 def __init__(self, ui, app, opts):
5577 def __init__(self, ui, app, opts):
5574 self.ui = ui
5578 self.ui = ui
5575 self.app = app
5579 self.app = app
5576 self.opts = opts
5580 self.opts = opts
5577
5581
5578 def init(self):
5582 def init(self):
5579 util.setsignalhandler()
5583 util.setsignalhandler()
5580 self.httpd = hgweb_server.create_server(self.ui, self.app)
5584 self.httpd = hgweb_server.create_server(self.ui, self.app)
5581
5585
5582 if self.opts['port'] and not self.ui.verbose:
5586 if self.opts['port'] and not self.ui.verbose:
5583 return
5587 return
5584
5588
5585 if self.httpd.prefix:
5589 if self.httpd.prefix:
5586 prefix = self.httpd.prefix.strip('/') + '/'
5590 prefix = self.httpd.prefix.strip('/') + '/'
5587 else:
5591 else:
5588 prefix = ''
5592 prefix = ''
5589
5593
5590 port = ':%d' % self.httpd.port
5594 port = ':%d' % self.httpd.port
5591 if port == ':80':
5595 if port == ':80':
5592 port = ''
5596 port = ''
5593
5597
5594 bindaddr = self.httpd.addr
5598 bindaddr = self.httpd.addr
5595 if bindaddr == '0.0.0.0':
5599 if bindaddr == '0.0.0.0':
5596 bindaddr = '*'
5600 bindaddr = '*'
5597 elif ':' in bindaddr: # IPv6
5601 elif ':' in bindaddr: # IPv6
5598 bindaddr = '[%s]' % bindaddr
5602 bindaddr = '[%s]' % bindaddr
5599
5603
5600 fqaddr = self.httpd.fqaddr
5604 fqaddr = self.httpd.fqaddr
5601 if ':' in fqaddr:
5605 if ':' in fqaddr:
5602 fqaddr = '[%s]' % fqaddr
5606 fqaddr = '[%s]' % fqaddr
5603 if self.opts['port']:
5607 if self.opts['port']:
5604 write = self.ui.status
5608 write = self.ui.status
5605 else:
5609 else:
5606 write = self.ui.write
5610 write = self.ui.write
5607 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5611 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5608 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5612 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5609 self.ui.flush() # avoid buffering of status message
5613 self.ui.flush() # avoid buffering of status message
5610
5614
5611 def run(self):
5615 def run(self):
5612 self.httpd.serve_forever()
5616 self.httpd.serve_forever()
5613
5617
5614
5618
5615 @command('^status|st',
5619 @command('^status|st',
5616 [('A', 'all', None, _('show status of all files')),
5620 [('A', 'all', None, _('show status of all files')),
5617 ('m', 'modified', None, _('show only modified files')),
5621 ('m', 'modified', None, _('show only modified files')),
5618 ('a', 'added', None, _('show only added files')),
5622 ('a', 'added', None, _('show only added files')),
5619 ('r', 'removed', None, _('show only removed files')),
5623 ('r', 'removed', None, _('show only removed files')),
5620 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5624 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5621 ('c', 'clean', None, _('show only files without changes')),
5625 ('c', 'clean', None, _('show only files without changes')),
5622 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5626 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5623 ('i', 'ignored', None, _('show only ignored files')),
5627 ('i', 'ignored', None, _('show only ignored files')),
5624 ('n', 'no-status', None, _('hide status prefix')),
5628 ('n', 'no-status', None, _('hide status prefix')),
5625 ('C', 'copies', None, _('show source of copied files')),
5629 ('C', 'copies', None, _('show source of copied files')),
5626 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5630 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5627 ('', 'rev', [], _('show difference from revision'), _('REV')),
5631 ('', 'rev', [], _('show difference from revision'), _('REV')),
5628 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5632 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5629 ] + walkopts + subrepoopts + formatteropts,
5633 ] + walkopts + subrepoopts + formatteropts,
5630 _('[OPTION]... [FILE]...'),
5634 _('[OPTION]... [FILE]...'),
5631 inferrepo=True)
5635 inferrepo=True)
5632 def status(ui, repo, *pats, **opts):
5636 def status(ui, repo, *pats, **opts):
5633 """show changed files in the working directory
5637 """show changed files in the working directory
5634
5638
5635 Show status of files in the repository. If names are given, only
5639 Show status of files in the repository. If names are given, only
5636 files that match are shown. Files that are clean or ignored or
5640 files that match are shown. Files that are clean or ignored or
5637 the source of a copy/move operation, are not listed unless
5641 the source of a copy/move operation, are not listed unless
5638 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5642 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5639 Unless options described with "show only ..." are given, the
5643 Unless options described with "show only ..." are given, the
5640 options -mardu are used.
5644 options -mardu are used.
5641
5645
5642 Option -q/--quiet hides untracked (unknown and ignored) files
5646 Option -q/--quiet hides untracked (unknown and ignored) files
5643 unless explicitly requested with -u/--unknown or -i/--ignored.
5647 unless explicitly requested with -u/--unknown or -i/--ignored.
5644
5648
5645 .. note::
5649 .. note::
5646
5650
5647 status may appear to disagree with diff if permissions have
5651 status may appear to disagree with diff if permissions have
5648 changed or a merge has occurred. The standard diff format does
5652 changed or a merge has occurred. The standard diff format does
5649 not report permission changes and diff only reports changes
5653 not report permission changes and diff only reports changes
5650 relative to one merge parent.
5654 relative to one merge parent.
5651
5655
5652 If one revision is given, it is used as the base revision.
5656 If one revision is given, it is used as the base revision.
5653 If two revisions are given, the differences between them are
5657 If two revisions are given, the differences between them are
5654 shown. The --change option can also be used as a shortcut to list
5658 shown. The --change option can also be used as a shortcut to list
5655 the changed files of a revision from its first parent.
5659 the changed files of a revision from its first parent.
5656
5660
5657 The codes used to show the status of files are::
5661 The codes used to show the status of files are::
5658
5662
5659 M = modified
5663 M = modified
5660 A = added
5664 A = added
5661 R = removed
5665 R = removed
5662 C = clean
5666 C = clean
5663 ! = missing (deleted by non-hg command, but still tracked)
5667 ! = missing (deleted by non-hg command, but still tracked)
5664 ? = not tracked
5668 ? = not tracked
5665 I = ignored
5669 I = ignored
5666 = origin of the previous file (with --copies)
5670 = origin of the previous file (with --copies)
5667
5671
5668 .. container:: verbose
5672 .. container:: verbose
5669
5673
5670 Examples:
5674 Examples:
5671
5675
5672 - show changes in the working directory relative to a
5676 - show changes in the working directory relative to a
5673 changeset::
5677 changeset::
5674
5678
5675 hg status --rev 9353
5679 hg status --rev 9353
5676
5680
5677 - show all changes including copies in an existing changeset::
5681 - show all changes including copies in an existing changeset::
5678
5682
5679 hg status --copies --change 9353
5683 hg status --copies --change 9353
5680
5684
5681 - get a NUL separated list of added files, suitable for xargs::
5685 - get a NUL separated list of added files, suitable for xargs::
5682
5686
5683 hg status -an0
5687 hg status -an0
5684
5688
5685 Returns 0 on success.
5689 Returns 0 on success.
5686 """
5690 """
5687
5691
5688 revs = opts.get('rev')
5692 revs = opts.get('rev')
5689 change = opts.get('change')
5693 change = opts.get('change')
5690
5694
5691 if revs and change:
5695 if revs and change:
5692 msg = _('cannot specify --rev and --change at the same time')
5696 msg = _('cannot specify --rev and --change at the same time')
5693 raise util.Abort(msg)
5697 raise util.Abort(msg)
5694 elif change:
5698 elif change:
5695 node2 = scmutil.revsingle(repo, change, None).node()
5699 node2 = scmutil.revsingle(repo, change, None).node()
5696 node1 = repo[node2].p1().node()
5700 node1 = repo[node2].p1().node()
5697 else:
5701 else:
5698 node1, node2 = scmutil.revpair(repo, revs)
5702 node1, node2 = scmutil.revpair(repo, revs)
5699
5703
5700 cwd = (pats and repo.getcwd()) or ''
5704 cwd = (pats and repo.getcwd()) or ''
5701 end = opts.get('print0') and '\0' or '\n'
5705 end = opts.get('print0') and '\0' or '\n'
5702 copy = {}
5706 copy = {}
5703 states = 'modified added removed deleted unknown ignored clean'.split()
5707 states = 'modified added removed deleted unknown ignored clean'.split()
5704 show = [k for k in states if opts.get(k)]
5708 show = [k for k in states if opts.get(k)]
5705 if opts.get('all'):
5709 if opts.get('all'):
5706 show += ui.quiet and (states[:4] + ['clean']) or states
5710 show += ui.quiet and (states[:4] + ['clean']) or states
5707 if not show:
5711 if not show:
5708 show = ui.quiet and states[:4] or states[:5]
5712 show = ui.quiet and states[:4] or states[:5]
5709
5713
5710 stat = repo.status(node1, node2, scmutil.match(repo[node2], pats, opts),
5714 stat = repo.status(node1, node2, scmutil.match(repo[node2], pats, opts),
5711 'ignored' in show, 'clean' in show, 'unknown' in show,
5715 'ignored' in show, 'clean' in show, 'unknown' in show,
5712 opts.get('subrepos'))
5716 opts.get('subrepos'))
5713 changestates = zip(states, 'MAR!?IC', stat)
5717 changestates = zip(states, 'MAR!?IC', stat)
5714
5718
5715 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
5719 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
5716 copy = copies.pathcopies(repo[node1], repo[node2])
5720 copy = copies.pathcopies(repo[node1], repo[node2])
5717
5721
5718 fm = ui.formatter('status', opts)
5722 fm = ui.formatter('status', opts)
5719 fmt = '%s' + end
5723 fmt = '%s' + end
5720 showchar = not opts.get('no_status')
5724 showchar = not opts.get('no_status')
5721
5725
5722 for state, char, files in changestates:
5726 for state, char, files in changestates:
5723 if state in show:
5727 if state in show:
5724 label = 'status.' + state
5728 label = 'status.' + state
5725 for f in files:
5729 for f in files:
5726 fm.startitem()
5730 fm.startitem()
5727 fm.condwrite(showchar, 'status', '%s ', char, label=label)
5731 fm.condwrite(showchar, 'status', '%s ', char, label=label)
5728 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
5732 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
5729 if f in copy:
5733 if f in copy:
5730 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
5734 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
5731 label='status.copied')
5735 label='status.copied')
5732 fm.end()
5736 fm.end()
5733
5737
5734 @command('^summary|sum',
5738 @command('^summary|sum',
5735 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
5739 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
5736 def summary(ui, repo, **opts):
5740 def summary(ui, repo, **opts):
5737 """summarize working directory state
5741 """summarize working directory state
5738
5742
5739 This generates a brief summary of the working directory state,
5743 This generates a brief summary of the working directory state,
5740 including parents, branch, commit status, and available updates.
5744 including parents, branch, commit status, and available updates.
5741
5745
5742 With the --remote option, this will check the default paths for
5746 With the --remote option, this will check the default paths for
5743 incoming and outgoing changes. This can be time-consuming.
5747 incoming and outgoing changes. This can be time-consuming.
5744
5748
5745 Returns 0 on success.
5749 Returns 0 on success.
5746 """
5750 """
5747
5751
5748 ctx = repo[None]
5752 ctx = repo[None]
5749 parents = ctx.parents()
5753 parents = ctx.parents()
5750 pnode = parents[0].node()
5754 pnode = parents[0].node()
5751 marks = []
5755 marks = []
5752
5756
5753 for p in parents:
5757 for p in parents:
5754 # label with log.changeset (instead of log.parent) since this
5758 # label with log.changeset (instead of log.parent) since this
5755 # shows a working directory parent *changeset*:
5759 # shows a working directory parent *changeset*:
5756 # i18n: column positioning for "hg summary"
5760 # i18n: column positioning for "hg summary"
5757 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
5761 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
5758 label='log.changeset changeset.%s' % p.phasestr())
5762 label='log.changeset changeset.%s' % p.phasestr())
5759 ui.write(' '.join(p.tags()), label='log.tag')
5763 ui.write(' '.join(p.tags()), label='log.tag')
5760 if p.bookmarks():
5764 if p.bookmarks():
5761 marks.extend(p.bookmarks())
5765 marks.extend(p.bookmarks())
5762 if p.rev() == -1:
5766 if p.rev() == -1:
5763 if not len(repo):
5767 if not len(repo):
5764 ui.write(_(' (empty repository)'))
5768 ui.write(_(' (empty repository)'))
5765 else:
5769 else:
5766 ui.write(_(' (no revision checked out)'))
5770 ui.write(_(' (no revision checked out)'))
5767 ui.write('\n')
5771 ui.write('\n')
5768 if p.description():
5772 if p.description():
5769 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
5773 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
5770 label='log.summary')
5774 label='log.summary')
5771
5775
5772 branch = ctx.branch()
5776 branch = ctx.branch()
5773 bheads = repo.branchheads(branch)
5777 bheads = repo.branchheads(branch)
5774 # i18n: column positioning for "hg summary"
5778 # i18n: column positioning for "hg summary"
5775 m = _('branch: %s\n') % branch
5779 m = _('branch: %s\n') % branch
5776 if branch != 'default':
5780 if branch != 'default':
5777 ui.write(m, label='log.branch')
5781 ui.write(m, label='log.branch')
5778 else:
5782 else:
5779 ui.status(m, label='log.branch')
5783 ui.status(m, label='log.branch')
5780
5784
5781 if marks:
5785 if marks:
5782 current = repo._bookmarkcurrent
5786 current = repo._bookmarkcurrent
5783 # i18n: column positioning for "hg summary"
5787 # i18n: column positioning for "hg summary"
5784 ui.write(_('bookmarks:'), label='log.bookmark')
5788 ui.write(_('bookmarks:'), label='log.bookmark')
5785 if current is not None:
5789 if current is not None:
5786 if current in marks:
5790 if current in marks:
5787 ui.write(' *' + current, label='bookmarks.current')
5791 ui.write(' *' + current, label='bookmarks.current')
5788 marks.remove(current)
5792 marks.remove(current)
5789 else:
5793 else:
5790 ui.write(' [%s]' % current, label='bookmarks.current')
5794 ui.write(' [%s]' % current, label='bookmarks.current')
5791 for m in marks:
5795 for m in marks:
5792 ui.write(' ' + m, label='log.bookmark')
5796 ui.write(' ' + m, label='log.bookmark')
5793 ui.write('\n', label='log.bookmark')
5797 ui.write('\n', label='log.bookmark')
5794
5798
5795 status = repo.status(unknown=True)
5799 status = repo.status(unknown=True)
5796
5800
5797 c = repo.dirstate.copies()
5801 c = repo.dirstate.copies()
5798 copied, renamed = [], []
5802 copied, renamed = [], []
5799 for d, s in c.iteritems():
5803 for d, s in c.iteritems():
5800 if s in status.removed:
5804 if s in status.removed:
5801 status.removed.remove(s)
5805 status.removed.remove(s)
5802 renamed.append(d)
5806 renamed.append(d)
5803 else:
5807 else:
5804 copied.append(d)
5808 copied.append(d)
5805 if d in status.added:
5809 if d in status.added:
5806 status.added.remove(d)
5810 status.added.remove(d)
5807
5811
5808 ms = mergemod.mergestate(repo)
5812 ms = mergemod.mergestate(repo)
5809 unresolved = [f for f in ms if ms[f] == 'u']
5813 unresolved = [f for f in ms if ms[f] == 'u']
5810
5814
5811 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
5815 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
5812
5816
5813 labels = [(ui.label(_('%d modified'), 'status.modified'), status.modified),
5817 labels = [(ui.label(_('%d modified'), 'status.modified'), status.modified),
5814 (ui.label(_('%d added'), 'status.added'), status.added),
5818 (ui.label(_('%d added'), 'status.added'), status.added),
5815 (ui.label(_('%d removed'), 'status.removed'), status.removed),
5819 (ui.label(_('%d removed'), 'status.removed'), status.removed),
5816 (ui.label(_('%d renamed'), 'status.copied'), renamed),
5820 (ui.label(_('%d renamed'), 'status.copied'), renamed),
5817 (ui.label(_('%d copied'), 'status.copied'), copied),
5821 (ui.label(_('%d copied'), 'status.copied'), copied),
5818 (ui.label(_('%d deleted'), 'status.deleted'), status.deleted),
5822 (ui.label(_('%d deleted'), 'status.deleted'), status.deleted),
5819 (ui.label(_('%d unknown'), 'status.unknown'), status.unknown),
5823 (ui.label(_('%d unknown'), 'status.unknown'), status.unknown),
5820 (ui.label(_('%d unresolved'), 'resolve.unresolved'), unresolved),
5824 (ui.label(_('%d unresolved'), 'resolve.unresolved'), unresolved),
5821 (ui.label(_('%d subrepos'), 'status.modified'), subs)]
5825 (ui.label(_('%d subrepos'), 'status.modified'), subs)]
5822 t = []
5826 t = []
5823 for l, s in labels:
5827 for l, s in labels:
5824 if s:
5828 if s:
5825 t.append(l % len(s))
5829 t.append(l % len(s))
5826
5830
5827 t = ', '.join(t)
5831 t = ', '.join(t)
5828 cleanworkdir = False
5832 cleanworkdir = False
5829
5833
5830 if repo.vfs.exists('updatestate'):
5834 if repo.vfs.exists('updatestate'):
5831 t += _(' (interrupted update)')
5835 t += _(' (interrupted update)')
5832 elif len(parents) > 1:
5836 elif len(parents) > 1:
5833 t += _(' (merge)')
5837 t += _(' (merge)')
5834 elif branch != parents[0].branch():
5838 elif branch != parents[0].branch():
5835 t += _(' (new branch)')
5839 t += _(' (new branch)')
5836 elif (parents[0].closesbranch() and
5840 elif (parents[0].closesbranch() and
5837 pnode in repo.branchheads(branch, closed=True)):
5841 pnode in repo.branchheads(branch, closed=True)):
5838 t += _(' (head closed)')
5842 t += _(' (head closed)')
5839 elif not (status.modified or status.added or status.removed or renamed or
5843 elif not (status.modified or status.added or status.removed or renamed or
5840 copied or subs):
5844 copied or subs):
5841 t += _(' (clean)')
5845 t += _(' (clean)')
5842 cleanworkdir = True
5846 cleanworkdir = True
5843 elif pnode not in bheads:
5847 elif pnode not in bheads:
5844 t += _(' (new branch head)')
5848 t += _(' (new branch head)')
5845
5849
5846 if cleanworkdir:
5850 if cleanworkdir:
5847 # i18n: column positioning for "hg summary"
5851 # i18n: column positioning for "hg summary"
5848 ui.status(_('commit: %s\n') % t.strip())
5852 ui.status(_('commit: %s\n') % t.strip())
5849 else:
5853 else:
5850 # i18n: column positioning for "hg summary"
5854 # i18n: column positioning for "hg summary"
5851 ui.write(_('commit: %s\n') % t.strip())
5855 ui.write(_('commit: %s\n') % t.strip())
5852
5856
5853 # all ancestors of branch heads - all ancestors of parent = new csets
5857 # all ancestors of branch heads - all ancestors of parent = new csets
5854 new = len(repo.changelog.findmissing([pctx.node() for pctx in parents],
5858 new = len(repo.changelog.findmissing([pctx.node() for pctx in parents],
5855 bheads))
5859 bheads))
5856
5860
5857 if new == 0:
5861 if new == 0:
5858 # i18n: column positioning for "hg summary"
5862 # i18n: column positioning for "hg summary"
5859 ui.status(_('update: (current)\n'))
5863 ui.status(_('update: (current)\n'))
5860 elif pnode not in bheads:
5864 elif pnode not in bheads:
5861 # i18n: column positioning for "hg summary"
5865 # i18n: column positioning for "hg summary"
5862 ui.write(_('update: %d new changesets (update)\n') % new)
5866 ui.write(_('update: %d new changesets (update)\n') % new)
5863 else:
5867 else:
5864 # i18n: column positioning for "hg summary"
5868 # i18n: column positioning for "hg summary"
5865 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
5869 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
5866 (new, len(bheads)))
5870 (new, len(bheads)))
5867
5871
5868 cmdutil.summaryhooks(ui, repo)
5872 cmdutil.summaryhooks(ui, repo)
5869
5873
5870 if opts.get('remote'):
5874 if opts.get('remote'):
5871 needsincoming, needsoutgoing = True, True
5875 needsincoming, needsoutgoing = True, True
5872 else:
5876 else:
5873 needsincoming, needsoutgoing = False, False
5877 needsincoming, needsoutgoing = False, False
5874 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
5878 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
5875 if i:
5879 if i:
5876 needsincoming = True
5880 needsincoming = True
5877 if o:
5881 if o:
5878 needsoutgoing = True
5882 needsoutgoing = True
5879 if not needsincoming and not needsoutgoing:
5883 if not needsincoming and not needsoutgoing:
5880 return
5884 return
5881
5885
5882 def getincoming():
5886 def getincoming():
5883 source, branches = hg.parseurl(ui.expandpath('default'))
5887 source, branches = hg.parseurl(ui.expandpath('default'))
5884 sbranch = branches[0]
5888 sbranch = branches[0]
5885 try:
5889 try:
5886 other = hg.peer(repo, {}, source)
5890 other = hg.peer(repo, {}, source)
5887 except error.RepoError:
5891 except error.RepoError:
5888 if opts.get('remote'):
5892 if opts.get('remote'):
5889 raise
5893 raise
5890 return source, sbranch, None, None, None
5894 return source, sbranch, None, None, None
5891 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
5895 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
5892 if revs:
5896 if revs:
5893 revs = [other.lookup(rev) for rev in revs]
5897 revs = [other.lookup(rev) for rev in revs]
5894 ui.debug('comparing with %s\n' % util.hidepassword(source))
5898 ui.debug('comparing with %s\n' % util.hidepassword(source))
5895 repo.ui.pushbuffer()
5899 repo.ui.pushbuffer()
5896 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
5900 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
5897 repo.ui.popbuffer()
5901 repo.ui.popbuffer()
5898 return source, sbranch, other, commoninc, commoninc[1]
5902 return source, sbranch, other, commoninc, commoninc[1]
5899
5903
5900 if needsincoming:
5904 if needsincoming:
5901 source, sbranch, sother, commoninc, incoming = getincoming()
5905 source, sbranch, sother, commoninc, incoming = getincoming()
5902 else:
5906 else:
5903 source = sbranch = sother = commoninc = incoming = None
5907 source = sbranch = sother = commoninc = incoming = None
5904
5908
5905 def getoutgoing():
5909 def getoutgoing():
5906 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
5910 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
5907 dbranch = branches[0]
5911 dbranch = branches[0]
5908 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
5912 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
5909 if source != dest:
5913 if source != dest:
5910 try:
5914 try:
5911 dother = hg.peer(repo, {}, dest)
5915 dother = hg.peer(repo, {}, dest)
5912 except error.RepoError:
5916 except error.RepoError:
5913 if opts.get('remote'):
5917 if opts.get('remote'):
5914 raise
5918 raise
5915 return dest, dbranch, None, None
5919 return dest, dbranch, None, None
5916 ui.debug('comparing with %s\n' % util.hidepassword(dest))
5920 ui.debug('comparing with %s\n' % util.hidepassword(dest))
5917 elif sother is None:
5921 elif sother is None:
5918 # there is no explicit destination peer, but source one is invalid
5922 # there is no explicit destination peer, but source one is invalid
5919 return dest, dbranch, None, None
5923 return dest, dbranch, None, None
5920 else:
5924 else:
5921 dother = sother
5925 dother = sother
5922 if (source != dest or (sbranch is not None and sbranch != dbranch)):
5926 if (source != dest or (sbranch is not None and sbranch != dbranch)):
5923 common = None
5927 common = None
5924 else:
5928 else:
5925 common = commoninc
5929 common = commoninc
5926 if revs:
5930 if revs:
5927 revs = [repo.lookup(rev) for rev in revs]
5931 revs = [repo.lookup(rev) for rev in revs]
5928 repo.ui.pushbuffer()
5932 repo.ui.pushbuffer()
5929 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
5933 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
5930 commoninc=common)
5934 commoninc=common)
5931 repo.ui.popbuffer()
5935 repo.ui.popbuffer()
5932 return dest, dbranch, dother, outgoing
5936 return dest, dbranch, dother, outgoing
5933
5937
5934 if needsoutgoing:
5938 if needsoutgoing:
5935 dest, dbranch, dother, outgoing = getoutgoing()
5939 dest, dbranch, dother, outgoing = getoutgoing()
5936 else:
5940 else:
5937 dest = dbranch = dother = outgoing = None
5941 dest = dbranch = dother = outgoing = None
5938
5942
5939 if opts.get('remote'):
5943 if opts.get('remote'):
5940 t = []
5944 t = []
5941 if incoming:
5945 if incoming:
5942 t.append(_('1 or more incoming'))
5946 t.append(_('1 or more incoming'))
5943 o = outgoing.missing
5947 o = outgoing.missing
5944 if o:
5948 if o:
5945 t.append(_('%d outgoing') % len(o))
5949 t.append(_('%d outgoing') % len(o))
5946 other = dother or sother
5950 other = dother or sother
5947 if 'bookmarks' in other.listkeys('namespaces'):
5951 if 'bookmarks' in other.listkeys('namespaces'):
5948 lmarks = repo.listkeys('bookmarks')
5952 lmarks = repo.listkeys('bookmarks')
5949 rmarks = other.listkeys('bookmarks')
5953 rmarks = other.listkeys('bookmarks')
5950 diff = set(rmarks) - set(lmarks)
5954 diff = set(rmarks) - set(lmarks)
5951 if len(diff) > 0:
5955 if len(diff) > 0:
5952 t.append(_('%d incoming bookmarks') % len(diff))
5956 t.append(_('%d incoming bookmarks') % len(diff))
5953 diff = set(lmarks) - set(rmarks)
5957 diff = set(lmarks) - set(rmarks)
5954 if len(diff) > 0:
5958 if len(diff) > 0:
5955 t.append(_('%d outgoing bookmarks') % len(diff))
5959 t.append(_('%d outgoing bookmarks') % len(diff))
5956
5960
5957 if t:
5961 if t:
5958 # i18n: column positioning for "hg summary"
5962 # i18n: column positioning for "hg summary"
5959 ui.write(_('remote: %s\n') % (', '.join(t)))
5963 ui.write(_('remote: %s\n') % (', '.join(t)))
5960 else:
5964 else:
5961 # i18n: column positioning for "hg summary"
5965 # i18n: column positioning for "hg summary"
5962 ui.status(_('remote: (synced)\n'))
5966 ui.status(_('remote: (synced)\n'))
5963
5967
5964 cmdutil.summaryremotehooks(ui, repo, opts,
5968 cmdutil.summaryremotehooks(ui, repo, opts,
5965 ((source, sbranch, sother, commoninc),
5969 ((source, sbranch, sother, commoninc),
5966 (dest, dbranch, dother, outgoing)))
5970 (dest, dbranch, dother, outgoing)))
5967
5971
5968 @command('tag',
5972 @command('tag',
5969 [('f', 'force', None, _('force tag')),
5973 [('f', 'force', None, _('force tag')),
5970 ('l', 'local', None, _('make the tag local')),
5974 ('l', 'local', None, _('make the tag local')),
5971 ('r', 'rev', '', _('revision to tag'), _('REV')),
5975 ('r', 'rev', '', _('revision to tag'), _('REV')),
5972 ('', 'remove', None, _('remove a tag')),
5976 ('', 'remove', None, _('remove a tag')),
5973 # -l/--local is already there, commitopts cannot be used
5977 # -l/--local is already there, commitopts cannot be used
5974 ('e', 'edit', None, _('invoke editor on commit messages')),
5978 ('e', 'edit', None, _('invoke editor on commit messages')),
5975 ('m', 'message', '', _('use text as commit message'), _('TEXT')),
5979 ('m', 'message', '', _('use text as commit message'), _('TEXT')),
5976 ] + commitopts2,
5980 ] + commitopts2,
5977 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
5981 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
5978 def tag(ui, repo, name1, *names, **opts):
5982 def tag(ui, repo, name1, *names, **opts):
5979 """add one or more tags for the current or given revision
5983 """add one or more tags for the current or given revision
5980
5984
5981 Name a particular revision using <name>.
5985 Name a particular revision using <name>.
5982
5986
5983 Tags are used to name particular revisions of the repository and are
5987 Tags are used to name particular revisions of the repository and are
5984 very useful to compare different revisions, to go back to significant
5988 very useful to compare different revisions, to go back to significant
5985 earlier versions or to mark branch points as releases, etc. Changing
5989 earlier versions or to mark branch points as releases, etc. Changing
5986 an existing tag is normally disallowed; use -f/--force to override.
5990 an existing tag is normally disallowed; use -f/--force to override.
5987
5991
5988 If no revision is given, the parent of the working directory is
5992 If no revision is given, the parent of the working directory is
5989 used.
5993 used.
5990
5994
5991 To facilitate version control, distribution, and merging of tags,
5995 To facilitate version control, distribution, and merging of tags,
5992 they are stored as a file named ".hgtags" which is managed similarly
5996 they are stored as a file named ".hgtags" which is managed similarly
5993 to other project files and can be hand-edited if necessary. This
5997 to other project files and can be hand-edited if necessary. This
5994 also means that tagging creates a new commit. The file
5998 also means that tagging creates a new commit. The file
5995 ".hg/localtags" is used for local tags (not shared among
5999 ".hg/localtags" is used for local tags (not shared among
5996 repositories).
6000 repositories).
5997
6001
5998 Tag commits are usually made at the head of a branch. If the parent
6002 Tag commits are usually made at the head of a branch. If the parent
5999 of the working directory is not a branch head, :hg:`tag` aborts; use
6003 of the working directory is not a branch head, :hg:`tag` aborts; use
6000 -f/--force to force the tag commit to be based on a non-head
6004 -f/--force to force the tag commit to be based on a non-head
6001 changeset.
6005 changeset.
6002
6006
6003 See :hg:`help dates` for a list of formats valid for -d/--date.
6007 See :hg:`help dates` for a list of formats valid for -d/--date.
6004
6008
6005 Since tag names have priority over branch names during revision
6009 Since tag names have priority over branch names during revision
6006 lookup, using an existing branch name as a tag name is discouraged.
6010 lookup, using an existing branch name as a tag name is discouraged.
6007
6011
6008 Returns 0 on success.
6012 Returns 0 on success.
6009 """
6013 """
6010 wlock = lock = None
6014 wlock = lock = None
6011 try:
6015 try:
6012 wlock = repo.wlock()
6016 wlock = repo.wlock()
6013 lock = repo.lock()
6017 lock = repo.lock()
6014 rev_ = "."
6018 rev_ = "."
6015 names = [t.strip() for t in (name1,) + names]
6019 names = [t.strip() for t in (name1,) + names]
6016 if len(names) != len(set(names)):
6020 if len(names) != len(set(names)):
6017 raise util.Abort(_('tag names must be unique'))
6021 raise util.Abort(_('tag names must be unique'))
6018 for n in names:
6022 for n in names:
6019 scmutil.checknewlabel(repo, n, 'tag')
6023 scmutil.checknewlabel(repo, n, 'tag')
6020 if not n:
6024 if not n:
6021 raise util.Abort(_('tag names cannot consist entirely of '
6025 raise util.Abort(_('tag names cannot consist entirely of '
6022 'whitespace'))
6026 'whitespace'))
6023 if opts.get('rev') and opts.get('remove'):
6027 if opts.get('rev') and opts.get('remove'):
6024 raise util.Abort(_("--rev and --remove are incompatible"))
6028 raise util.Abort(_("--rev and --remove are incompatible"))
6025 if opts.get('rev'):
6029 if opts.get('rev'):
6026 rev_ = opts['rev']
6030 rev_ = opts['rev']
6027 message = opts.get('message')
6031 message = opts.get('message')
6028 if opts.get('remove'):
6032 if opts.get('remove'):
6029 expectedtype = opts.get('local') and 'local' or 'global'
6033 expectedtype = opts.get('local') and 'local' or 'global'
6030 for n in names:
6034 for n in names:
6031 if not repo.tagtype(n):
6035 if not repo.tagtype(n):
6032 raise util.Abort(_("tag '%s' does not exist") % n)
6036 raise util.Abort(_("tag '%s' does not exist") % n)
6033 if repo.tagtype(n) != expectedtype:
6037 if repo.tagtype(n) != expectedtype:
6034 if expectedtype == 'global':
6038 if expectedtype == 'global':
6035 raise util.Abort(_("tag '%s' is not a global tag") % n)
6039 raise util.Abort(_("tag '%s' is not a global tag") % n)
6036 else:
6040 else:
6037 raise util.Abort(_("tag '%s' is not a local tag") % n)
6041 raise util.Abort(_("tag '%s' is not a local tag") % n)
6038 rev_ = nullid
6042 rev_ = nullid
6039 if not message:
6043 if not message:
6040 # we don't translate commit messages
6044 # we don't translate commit messages
6041 message = 'Removed tag %s' % ', '.join(names)
6045 message = 'Removed tag %s' % ', '.join(names)
6042 elif not opts.get('force'):
6046 elif not opts.get('force'):
6043 for n in names:
6047 for n in names:
6044 if n in repo.tags():
6048 if n in repo.tags():
6045 raise util.Abort(_("tag '%s' already exists "
6049 raise util.Abort(_("tag '%s' already exists "
6046 "(use -f to force)") % n)
6050 "(use -f to force)") % n)
6047 if not opts.get('local'):
6051 if not opts.get('local'):
6048 p1, p2 = repo.dirstate.parents()
6052 p1, p2 = repo.dirstate.parents()
6049 if p2 != nullid:
6053 if p2 != nullid:
6050 raise util.Abort(_('uncommitted merge'))
6054 raise util.Abort(_('uncommitted merge'))
6051 bheads = repo.branchheads()
6055 bheads = repo.branchheads()
6052 if not opts.get('force') and bheads and p1 not in bheads:
6056 if not opts.get('force') and bheads and p1 not in bheads:
6053 raise util.Abort(_('not at a branch head (use -f to force)'))
6057 raise util.Abort(_('not at a branch head (use -f to force)'))
6054 r = scmutil.revsingle(repo, rev_).node()
6058 r = scmutil.revsingle(repo, rev_).node()
6055
6059
6056 if not message:
6060 if not message:
6057 # we don't translate commit messages
6061 # we don't translate commit messages
6058 message = ('Added tag %s for changeset %s' %
6062 message = ('Added tag %s for changeset %s' %
6059 (', '.join(names), short(r)))
6063 (', '.join(names), short(r)))
6060
6064
6061 date = opts.get('date')
6065 date = opts.get('date')
6062 if date:
6066 if date:
6063 date = util.parsedate(date)
6067 date = util.parsedate(date)
6064
6068
6065 if opts.get('remove'):
6069 if opts.get('remove'):
6066 editform = 'tag.remove'
6070 editform = 'tag.remove'
6067 else:
6071 else:
6068 editform = 'tag.add'
6072 editform = 'tag.add'
6069 editor = cmdutil.getcommiteditor(editform=editform, **opts)
6073 editor = cmdutil.getcommiteditor(editform=editform, **opts)
6070
6074
6071 # don't allow tagging the null rev
6075 # don't allow tagging the null rev
6072 if (not opts.get('remove') and
6076 if (not opts.get('remove') and
6073 scmutil.revsingle(repo, rev_).rev() == nullrev):
6077 scmutil.revsingle(repo, rev_).rev() == nullrev):
6074 raise util.Abort(_("cannot tag null revision"))
6078 raise util.Abort(_("cannot tag null revision"))
6075
6079
6076 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
6080 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
6077 editor=editor)
6081 editor=editor)
6078 finally:
6082 finally:
6079 release(lock, wlock)
6083 release(lock, wlock)
6080
6084
6081 @command('tags', formatteropts, '')
6085 @command('tags', formatteropts, '')
6082 def tags(ui, repo, **opts):
6086 def tags(ui, repo, **opts):
6083 """list repository tags
6087 """list repository tags
6084
6088
6085 This lists both regular and local tags. When the -v/--verbose
6089 This lists both regular and local tags. When the -v/--verbose
6086 switch is used, a third column "local" is printed for local tags.
6090 switch is used, a third column "local" is printed for local tags.
6087
6091
6088 Returns 0 on success.
6092 Returns 0 on success.
6089 """
6093 """
6090
6094
6091 fm = ui.formatter('tags', opts)
6095 fm = ui.formatter('tags', opts)
6092 hexfunc = fm.hexfunc
6096 hexfunc = fm.hexfunc
6093 tagtype = ""
6097 tagtype = ""
6094
6098
6095 for t, n in reversed(repo.tagslist()):
6099 for t, n in reversed(repo.tagslist()):
6096 hn = hexfunc(n)
6100 hn = hexfunc(n)
6097 label = 'tags.normal'
6101 label = 'tags.normal'
6098 tagtype = ''
6102 tagtype = ''
6099 if repo.tagtype(t) == 'local':
6103 if repo.tagtype(t) == 'local':
6100 label = 'tags.local'
6104 label = 'tags.local'
6101 tagtype = 'local'
6105 tagtype = 'local'
6102
6106
6103 fm.startitem()
6107 fm.startitem()
6104 fm.write('tag', '%s', t, label=label)
6108 fm.write('tag', '%s', t, label=label)
6105 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
6109 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
6106 fm.condwrite(not ui.quiet, 'rev node', fmt,
6110 fm.condwrite(not ui.quiet, 'rev node', fmt,
6107 repo.changelog.rev(n), hn, label=label)
6111 repo.changelog.rev(n), hn, label=label)
6108 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
6112 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
6109 tagtype, label=label)
6113 tagtype, label=label)
6110 fm.plain('\n')
6114 fm.plain('\n')
6111 fm.end()
6115 fm.end()
6112
6116
6113 @command('tip',
6117 @command('tip',
6114 [('p', 'patch', None, _('show patch')),
6118 [('p', 'patch', None, _('show patch')),
6115 ('g', 'git', None, _('use git extended diff format')),
6119 ('g', 'git', None, _('use git extended diff format')),
6116 ] + templateopts,
6120 ] + templateopts,
6117 _('[-p] [-g]'))
6121 _('[-p] [-g]'))
6118 def tip(ui, repo, **opts):
6122 def tip(ui, repo, **opts):
6119 """show the tip revision (DEPRECATED)
6123 """show the tip revision (DEPRECATED)
6120
6124
6121 The tip revision (usually just called the tip) is the changeset
6125 The tip revision (usually just called the tip) is the changeset
6122 most recently added to the repository (and therefore the most
6126 most recently added to the repository (and therefore the most
6123 recently changed head).
6127 recently changed head).
6124
6128
6125 If you have just made a commit, that commit will be the tip. If
6129 If you have just made a commit, that commit will be the tip. If
6126 you have just pulled changes from another repository, the tip of
6130 you have just pulled changes from another repository, the tip of
6127 that repository becomes the current tip. The "tip" tag is special
6131 that repository becomes the current tip. The "tip" tag is special
6128 and cannot be renamed or assigned to a different changeset.
6132 and cannot be renamed or assigned to a different changeset.
6129
6133
6130 This command is deprecated, please use :hg:`heads` instead.
6134 This command is deprecated, please use :hg:`heads` instead.
6131
6135
6132 Returns 0 on success.
6136 Returns 0 on success.
6133 """
6137 """
6134 displayer = cmdutil.show_changeset(ui, repo, opts)
6138 displayer = cmdutil.show_changeset(ui, repo, opts)
6135 displayer.show(repo['tip'])
6139 displayer.show(repo['tip'])
6136 displayer.close()
6140 displayer.close()
6137
6141
6138 @command('unbundle',
6142 @command('unbundle',
6139 [('u', 'update', None,
6143 [('u', 'update', None,
6140 _('update to new branch head if changesets were unbundled'))],
6144 _('update to new branch head if changesets were unbundled'))],
6141 _('[-u] FILE...'))
6145 _('[-u] FILE...'))
6142 def unbundle(ui, repo, fname1, *fnames, **opts):
6146 def unbundle(ui, repo, fname1, *fnames, **opts):
6143 """apply one or more changegroup files
6147 """apply one or more changegroup files
6144
6148
6145 Apply one or more compressed changegroup files generated by the
6149 Apply one or more compressed changegroup files generated by the
6146 bundle command.
6150 bundle command.
6147
6151
6148 Returns 0 on success, 1 if an update has unresolved files.
6152 Returns 0 on success, 1 if an update has unresolved files.
6149 """
6153 """
6150 fnames = (fname1,) + fnames
6154 fnames = (fname1,) + fnames
6151
6155
6152 lock = repo.lock()
6156 lock = repo.lock()
6153 try:
6157 try:
6154 for fname in fnames:
6158 for fname in fnames:
6155 f = hg.openpath(ui, fname)
6159 f = hg.openpath(ui, fname)
6156 gen = exchange.readbundle(ui, f, fname)
6160 gen = exchange.readbundle(ui, f, fname)
6157 if isinstance(gen, bundle2.unbundle20):
6161 if isinstance(gen, bundle2.unbundle20):
6158 tr = repo.transaction('unbundle')
6162 tr = repo.transaction('unbundle')
6159 try:
6163 try:
6160 op = bundle2.processbundle(repo, gen, lambda: tr)
6164 op = bundle2.processbundle(repo, gen, lambda: tr)
6161 tr.close()
6165 tr.close()
6162 finally:
6166 finally:
6163 if tr:
6167 if tr:
6164 tr.release()
6168 tr.release()
6165 changes = [r.get('result', 0)
6169 changes = [r.get('result', 0)
6166 for r in op.records['changegroup']]
6170 for r in op.records['changegroup']]
6167 modheads = changegroup.combineresults(changes)
6171 modheads = changegroup.combineresults(changes)
6168 else:
6172 else:
6169 modheads = changegroup.addchangegroup(repo, gen, 'unbundle',
6173 modheads = changegroup.addchangegroup(repo, gen, 'unbundle',
6170 'bundle:' + fname)
6174 'bundle:' + fname)
6171 finally:
6175 finally:
6172 lock.release()
6176 lock.release()
6173
6177
6174 return postincoming(ui, repo, modheads, opts.get('update'), None)
6178 return postincoming(ui, repo, modheads, opts.get('update'), None)
6175
6179
6176 @command('^update|up|checkout|co',
6180 @command('^update|up|checkout|co',
6177 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
6181 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
6178 ('c', 'check', None,
6182 ('c', 'check', None,
6179 _('update across branches if no uncommitted changes')),
6183 _('update across branches if no uncommitted changes')),
6180 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
6184 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
6181 ('r', 'rev', '', _('revision'), _('REV'))
6185 ('r', 'rev', '', _('revision'), _('REV'))
6182 ] + mergetoolopts,
6186 ] + mergetoolopts,
6183 _('[-c] [-C] [-d DATE] [[-r] REV]'))
6187 _('[-c] [-C] [-d DATE] [[-r] REV]'))
6184 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
6188 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
6185 tool=None):
6189 tool=None):
6186 """update working directory (or switch revisions)
6190 """update working directory (or switch revisions)
6187
6191
6188 Update the repository's working directory to the specified
6192 Update the repository's working directory to the specified
6189 changeset. If no changeset is specified, update to the tip of the
6193 changeset. If no changeset is specified, update to the tip of the
6190 current named branch and move the current bookmark (see :hg:`help
6194 current named branch and move the current bookmark (see :hg:`help
6191 bookmarks`).
6195 bookmarks`).
6192
6196
6193 Update sets the working directory's parent revision to the specified
6197 Update sets the working directory's parent revision to the specified
6194 changeset (see :hg:`help parents`).
6198 changeset (see :hg:`help parents`).
6195
6199
6196 If the changeset is not a descendant or ancestor of the working
6200 If the changeset is not a descendant or ancestor of the working
6197 directory's parent, the update is aborted. With the -c/--check
6201 directory's parent, the update is aborted. With the -c/--check
6198 option, the working directory is checked for uncommitted changes; if
6202 option, the working directory is checked for uncommitted changes; if
6199 none are found, the working directory is updated to the specified
6203 none are found, the working directory is updated to the specified
6200 changeset.
6204 changeset.
6201
6205
6202 .. container:: verbose
6206 .. container:: verbose
6203
6207
6204 The following rules apply when the working directory contains
6208 The following rules apply when the working directory contains
6205 uncommitted changes:
6209 uncommitted changes:
6206
6210
6207 1. If neither -c/--check nor -C/--clean is specified, and if
6211 1. If neither -c/--check nor -C/--clean is specified, and if
6208 the requested changeset is an ancestor or descendant of
6212 the requested changeset is an ancestor or descendant of
6209 the working directory's parent, the uncommitted changes
6213 the working directory's parent, the uncommitted changes
6210 are merged into the requested changeset and the merged
6214 are merged into the requested changeset and the merged
6211 result is left uncommitted. If the requested changeset is
6215 result is left uncommitted. If the requested changeset is
6212 not an ancestor or descendant (that is, it is on another
6216 not an ancestor or descendant (that is, it is on another
6213 branch), the update is aborted and the uncommitted changes
6217 branch), the update is aborted and the uncommitted changes
6214 are preserved.
6218 are preserved.
6215
6219
6216 2. With the -c/--check option, the update is aborted and the
6220 2. With the -c/--check option, the update is aborted and the
6217 uncommitted changes are preserved.
6221 uncommitted changes are preserved.
6218
6222
6219 3. With the -C/--clean option, uncommitted changes are discarded and
6223 3. With the -C/--clean option, uncommitted changes are discarded and
6220 the working directory is updated to the requested changeset.
6224 the working directory is updated to the requested changeset.
6221
6225
6222 To cancel an uncommitted merge (and lose your changes), use
6226 To cancel an uncommitted merge (and lose your changes), use
6223 :hg:`update --clean .`.
6227 :hg:`update --clean .`.
6224
6228
6225 Use null as the changeset to remove the working directory (like
6229 Use null as the changeset to remove the working directory (like
6226 :hg:`clone -U`).
6230 :hg:`clone -U`).
6227
6231
6228 If you want to revert just one file to an older revision, use
6232 If you want to revert just one file to an older revision, use
6229 :hg:`revert [-r REV] NAME`.
6233 :hg:`revert [-r REV] NAME`.
6230
6234
6231 See :hg:`help dates` for a list of formats valid for -d/--date.
6235 See :hg:`help dates` for a list of formats valid for -d/--date.
6232
6236
6233 Returns 0 on success, 1 if there are unresolved files.
6237 Returns 0 on success, 1 if there are unresolved files.
6234 """
6238 """
6235 if rev and node:
6239 if rev and node:
6236 raise util.Abort(_("please specify just one revision"))
6240 raise util.Abort(_("please specify just one revision"))
6237
6241
6238 if rev is None or rev == '':
6242 if rev is None or rev == '':
6239 rev = node
6243 rev = node
6240
6244
6241 cmdutil.clearunfinished(repo)
6245 cmdutil.clearunfinished(repo)
6242
6246
6243 # with no argument, we also move the current bookmark, if any
6247 # with no argument, we also move the current bookmark, if any
6244 rev, movemarkfrom = bookmarks.calculateupdate(ui, repo, rev)
6248 rev, movemarkfrom = bookmarks.calculateupdate(ui, repo, rev)
6245
6249
6246 # if we defined a bookmark, we have to remember the original bookmark name
6250 # if we defined a bookmark, we have to remember the original bookmark name
6247 brev = rev
6251 brev = rev
6248 rev = scmutil.revsingle(repo, rev, rev).rev()
6252 rev = scmutil.revsingle(repo, rev, rev).rev()
6249
6253
6250 if check and clean:
6254 if check and clean:
6251 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
6255 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
6252
6256
6253 if date:
6257 if date:
6254 if rev is not None:
6258 if rev is not None:
6255 raise util.Abort(_("you can't specify a revision and a date"))
6259 raise util.Abort(_("you can't specify a revision and a date"))
6256 rev = cmdutil.finddate(ui, repo, date)
6260 rev = cmdutil.finddate(ui, repo, date)
6257
6261
6258 if check:
6262 if check:
6259 c = repo[None]
6263 c = repo[None]
6260 if c.dirty(merge=False, branch=False, missing=True):
6264 if c.dirty(merge=False, branch=False, missing=True):
6261 raise util.Abort(_("uncommitted changes"))
6265 raise util.Abort(_("uncommitted changes"))
6262 if rev is None:
6266 if rev is None:
6263 rev = repo[repo[None].branch()].rev()
6267 rev = repo[repo[None].branch()].rev()
6264
6268
6265 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
6269 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
6266
6270
6267 if clean:
6271 if clean:
6268 ret = hg.clean(repo, rev)
6272 ret = hg.clean(repo, rev)
6269 else:
6273 else:
6270 ret = hg.update(repo, rev)
6274 ret = hg.update(repo, rev)
6271
6275
6272 if not ret and movemarkfrom:
6276 if not ret and movemarkfrom:
6273 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
6277 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
6274 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
6278 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
6275 elif brev in repo._bookmarks:
6279 elif brev in repo._bookmarks:
6276 bookmarks.setcurrent(repo, brev)
6280 bookmarks.setcurrent(repo, brev)
6277 ui.status(_("(activating bookmark %s)\n") % brev)
6281 ui.status(_("(activating bookmark %s)\n") % brev)
6278 elif brev:
6282 elif brev:
6279 if repo._bookmarkcurrent:
6283 if repo._bookmarkcurrent:
6280 ui.status(_("(leaving bookmark %s)\n") %
6284 ui.status(_("(leaving bookmark %s)\n") %
6281 repo._bookmarkcurrent)
6285 repo._bookmarkcurrent)
6282 bookmarks.unsetcurrent(repo)
6286 bookmarks.unsetcurrent(repo)
6283
6287
6284 return ret
6288 return ret
6285
6289
6286 @command('verify', [])
6290 @command('verify', [])
6287 def verify(ui, repo):
6291 def verify(ui, repo):
6288 """verify the integrity of the repository
6292 """verify the integrity of the repository
6289
6293
6290 Verify the integrity of the current repository.
6294 Verify the integrity of the current repository.
6291
6295
6292 This will perform an extensive check of the repository's
6296 This will perform an extensive check of the repository's
6293 integrity, validating the hashes and checksums of each entry in
6297 integrity, validating the hashes and checksums of each entry in
6294 the changelog, manifest, and tracked files, as well as the
6298 the changelog, manifest, and tracked files, as well as the
6295 integrity of their crosslinks and indices.
6299 integrity of their crosslinks and indices.
6296
6300
6297 Please see http://mercurial.selenic.com/wiki/RepositoryCorruption
6301 Please see http://mercurial.selenic.com/wiki/RepositoryCorruption
6298 for more information about recovery from corruption of the
6302 for more information about recovery from corruption of the
6299 repository.
6303 repository.
6300
6304
6301 Returns 0 on success, 1 if errors are encountered.
6305 Returns 0 on success, 1 if errors are encountered.
6302 """
6306 """
6303 return hg.verify(repo)
6307 return hg.verify(repo)
6304
6308
6305 @command('version', [], norepo=True)
6309 @command('version', [], norepo=True)
6306 def version_(ui):
6310 def version_(ui):
6307 """output version and copyright information"""
6311 """output version and copyright information"""
6308 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6312 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6309 % util.version())
6313 % util.version())
6310 ui.status(_(
6314 ui.status(_(
6311 "(see http://mercurial.selenic.com for more information)\n"
6315 "(see http://mercurial.selenic.com for more information)\n"
6312 "\nCopyright (C) 2005-2014 Matt Mackall and others\n"
6316 "\nCopyright (C) 2005-2014 Matt Mackall and others\n"
6313 "This is free software; see the source for copying conditions. "
6317 "This is free software; see the source for copying conditions. "
6314 "There is NO\nwarranty; "
6318 "There is NO\nwarranty; "
6315 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6319 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6316 ))
6320 ))
6317
6321
6318 ui.note(_("\nEnabled extensions:\n\n"))
6322 ui.note(_("\nEnabled extensions:\n\n"))
6319 if ui.verbose:
6323 if ui.verbose:
6320 # format names and versions into columns
6324 # format names and versions into columns
6321 names = []
6325 names = []
6322 vers = []
6326 vers = []
6323 for name, module in extensions.extensions():
6327 for name, module in extensions.extensions():
6324 names.append(name)
6328 names.append(name)
6325 vers.append(extensions.moduleversion(module))
6329 vers.append(extensions.moduleversion(module))
6326 if names:
6330 if names:
6327 maxnamelen = max(len(n) for n in names)
6331 maxnamelen = max(len(n) for n in names)
6328 for i, name in enumerate(names):
6332 for i, name in enumerate(names):
6329 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
6333 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
@@ -1,2367 +1,2360 b''
1 @ (34) head
1 @ (34) head
2 |
2 |
3 | o (33) head
3 | o (33) head
4 | |
4 | |
5 o | (32) expand
5 o | (32) expand
6 |\ \
6 |\ \
7 | o \ (31) expand
7 | o \ (31) expand
8 | |\ \
8 | |\ \
9 | | o \ (30) expand
9 | | o \ (30) expand
10 | | |\ \
10 | | |\ \
11 | | | o | (29) regular commit
11 | | | o | (29) regular commit
12 | | | | |
12 | | | | |
13 | | o | | (28) merge zero known
13 | | o | | (28) merge zero known
14 | | |\ \ \
14 | | |\ \ \
15 o | | | | | (27) collapse
15 o | | | | | (27) collapse
16 |/ / / / /
16 |/ / / / /
17 | | o---+ (26) merge one known; far right
17 | | o---+ (26) merge one known; far right
18 | | | | |
18 | | | | |
19 +---o | | (25) merge one known; far left
19 +---o | | (25) merge one known; far left
20 | | | | |
20 | | | | |
21 | | o | | (24) merge one known; immediate right
21 | | o | | (24) merge one known; immediate right
22 | | |\| |
22 | | |\| |
23 | | o | | (23) merge one known; immediate left
23 | | o | | (23) merge one known; immediate left
24 | |/| | |
24 | |/| | |
25 +---o---+ (22) merge two known; one far left, one far right
25 +---o---+ (22) merge two known; one far left, one far right
26 | | / /
26 | | / /
27 o | | | (21) expand
27 o | | | (21) expand
28 |\ \ \ \
28 |\ \ \ \
29 | o---+-+ (20) merge two known; two far right
29 | o---+-+ (20) merge two known; two far right
30 | / / /
30 | / / /
31 o | | | (19) expand
31 o | | | (19) expand
32 |\ \ \ \
32 |\ \ \ \
33 +---+---o (18) merge two known; two far left
33 +---+---o (18) merge two known; two far left
34 | | | |
34 | | | |
35 | o | | (17) expand
35 | o | | (17) expand
36 | |\ \ \
36 | |\ \ \
37 | | o---+ (16) merge two known; one immediate right, one near right
37 | | o---+ (16) merge two known; one immediate right, one near right
38 | | |/ /
38 | | |/ /
39 o | | | (15) expand
39 o | | | (15) expand
40 |\ \ \ \
40 |\ \ \ \
41 | o-----+ (14) merge two known; one immediate right, one far right
41 | o-----+ (14) merge two known; one immediate right, one far right
42 | |/ / /
42 | |/ / /
43 o | | | (13) expand
43 o | | | (13) expand
44 |\ \ \ \
44 |\ \ \ \
45 +---o | | (12) merge two known; one immediate right, one far left
45 +---o | | (12) merge two known; one immediate right, one far left
46 | | |/ /
46 | | |/ /
47 | o | | (11) expand
47 | o | | (11) expand
48 | |\ \ \
48 | |\ \ \
49 | | o---+ (10) merge two known; one immediate left, one near right
49 | | o---+ (10) merge two known; one immediate left, one near right
50 | |/ / /
50 | |/ / /
51 o | | | (9) expand
51 o | | | (9) expand
52 |\ \ \ \
52 |\ \ \ \
53 | o-----+ (8) merge two known; one immediate left, one far right
53 | o-----+ (8) merge two known; one immediate left, one far right
54 |/ / / /
54 |/ / / /
55 o | | | (7) expand
55 o | | | (7) expand
56 |\ \ \ \
56 |\ \ \ \
57 +---o | | (6) merge two known; one immediate left, one far left
57 +---o | | (6) merge two known; one immediate left, one far left
58 | |/ / /
58 | |/ / /
59 | o | | (5) expand
59 | o | | (5) expand
60 | |\ \ \
60 | |\ \ \
61 | | o | | (4) merge two known; one immediate left, one immediate right
61 | | o | | (4) merge two known; one immediate left, one immediate right
62 | |/|/ /
62 | |/|/ /
63 | o / / (3) collapse
63 | o / / (3) collapse
64 |/ / /
64 |/ / /
65 o / / (2) collapse
65 o / / (2) collapse
66 |/ /
66 |/ /
67 o / (1) collapse
67 o / (1) collapse
68 |/
68 |/
69 o (0) root
69 o (0) root
70
70
71
71
72 $ commit()
72 $ commit()
73 > {
73 > {
74 > rev=$1
74 > rev=$1
75 > msg=$2
75 > msg=$2
76 > shift 2
76 > shift 2
77 > if [ "$#" -gt 0 ]; then
77 > if [ "$#" -gt 0 ]; then
78 > hg debugsetparents "$@"
78 > hg debugsetparents "$@"
79 > fi
79 > fi
80 > echo $rev > a
80 > echo $rev > a
81 > hg commit -Aqd "$rev 0" -m "($rev) $msg"
81 > hg commit -Aqd "$rev 0" -m "($rev) $msg"
82 > }
82 > }
83
83
84 $ cat > printrevset.py <<EOF
84 $ cat > printrevset.py <<EOF
85 > from mercurial import extensions, revset, commands, cmdutil
85 > from mercurial import extensions, revset, commands, cmdutil
86 >
86 >
87 > def uisetup(ui):
87 > def uisetup(ui):
88 > def printrevset(orig, ui, repo, *pats, **opts):
88 > def printrevset(orig, ui, repo, *pats, **opts):
89 > if opts.get('print_revset'):
89 > if opts.get('print_revset'):
90 > expr = cmdutil.getgraphlogrevs(repo, pats, opts)[1]
90 > expr = cmdutil.getgraphlogrevs(repo, pats, opts)[1]
91 > if expr:
91 > if expr:
92 > tree = revset.parse(expr)[0]
92 > tree = revset.parse(expr)[0]
93 > else:
93 > else:
94 > tree = []
94 > tree = []
95 > ui.write('%r\n' % (opts.get('rev', []),))
95 > ui.write('%r\n' % (opts.get('rev', []),))
96 > ui.write(revset.prettyformat(tree) + '\n')
96 > ui.write(revset.prettyformat(tree) + '\n')
97 > return 0
97 > return 0
98 > return orig(ui, repo, *pats, **opts)
98 > return orig(ui, repo, *pats, **opts)
99 > entry = extensions.wrapcommand(commands.table, 'log', printrevset)
99 > entry = extensions.wrapcommand(commands.table, 'log', printrevset)
100 > entry[1].append(('', 'print-revset', False,
100 > entry[1].append(('', 'print-revset', False,
101 > 'print generated revset and exit (DEPRECATED)'))
101 > 'print generated revset and exit (DEPRECATED)'))
102 > EOF
102 > EOF
103
103
104 $ echo "[extensions]" >> $HGRCPATH
104 $ echo "[extensions]" >> $HGRCPATH
105 $ echo "printrevset=`pwd`/printrevset.py" >> $HGRCPATH
105 $ echo "printrevset=`pwd`/printrevset.py" >> $HGRCPATH
106
106
107 $ hg init repo
107 $ hg init repo
108 $ cd repo
108 $ cd repo
109
109
110 Empty repo:
110 Empty repo:
111
111
112 $ hg log -G
112 $ hg log -G
113
113
114
114
115 Building DAG:
115 Building DAG:
116
116
117 $ commit 0 "root"
117 $ commit 0 "root"
118 $ commit 1 "collapse" 0
118 $ commit 1 "collapse" 0
119 $ commit 2 "collapse" 1
119 $ commit 2 "collapse" 1
120 $ commit 3 "collapse" 2
120 $ commit 3 "collapse" 2
121 $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
121 $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
122 $ commit 5 "expand" 3 4
122 $ commit 5 "expand" 3 4
123 $ commit 6 "merge two known; one immediate left, one far left" 2 5
123 $ commit 6 "merge two known; one immediate left, one far left" 2 5
124 $ commit 7 "expand" 2 5
124 $ commit 7 "expand" 2 5
125 $ commit 8 "merge two known; one immediate left, one far right" 0 7
125 $ commit 8 "merge two known; one immediate left, one far right" 0 7
126 $ commit 9 "expand" 7 8
126 $ commit 9 "expand" 7 8
127 $ commit 10 "merge two known; one immediate left, one near right" 0 6
127 $ commit 10 "merge two known; one immediate left, one near right" 0 6
128 $ commit 11 "expand" 6 10
128 $ commit 11 "expand" 6 10
129 $ commit 12 "merge two known; one immediate right, one far left" 1 9
129 $ commit 12 "merge two known; one immediate right, one far left" 1 9
130 $ commit 13 "expand" 9 11
130 $ commit 13 "expand" 9 11
131 $ commit 14 "merge two known; one immediate right, one far right" 0 12
131 $ commit 14 "merge two known; one immediate right, one far right" 0 12
132 $ commit 15 "expand" 13 14
132 $ commit 15 "expand" 13 14
133 $ commit 16 "merge two known; one immediate right, one near right" 0 1
133 $ commit 16 "merge two known; one immediate right, one near right" 0 1
134 $ commit 17 "expand" 12 16
134 $ commit 17 "expand" 12 16
135 $ commit 18 "merge two known; two far left" 1 15
135 $ commit 18 "merge two known; two far left" 1 15
136 $ commit 19 "expand" 15 17
136 $ commit 19 "expand" 15 17
137 $ commit 20 "merge two known; two far right" 0 18
137 $ commit 20 "merge two known; two far right" 0 18
138 $ commit 21 "expand" 19 20
138 $ commit 21 "expand" 19 20
139 $ commit 22 "merge two known; one far left, one far right" 18 21
139 $ commit 22 "merge two known; one far left, one far right" 18 21
140 $ commit 23 "merge one known; immediate left" 1 22
140 $ commit 23 "merge one known; immediate left" 1 22
141 $ commit 24 "merge one known; immediate right" 0 23
141 $ commit 24 "merge one known; immediate right" 0 23
142 $ commit 25 "merge one known; far left" 21 24
142 $ commit 25 "merge one known; far left" 21 24
143 $ commit 26 "merge one known; far right" 18 25
143 $ commit 26 "merge one known; far right" 18 25
144 $ commit 27 "collapse" 21
144 $ commit 27 "collapse" 21
145 $ commit 28 "merge zero known" 1 26
145 $ commit 28 "merge zero known" 1 26
146 $ commit 29 "regular commit" 0
146 $ commit 29 "regular commit" 0
147 $ commit 30 "expand" 28 29
147 $ commit 30 "expand" 28 29
148 $ commit 31 "expand" 21 30
148 $ commit 31 "expand" 21 30
149 $ commit 32 "expand" 27 31
149 $ commit 32 "expand" 27 31
150 $ commit 33 "head" 18
150 $ commit 33 "head" 18
151 $ commit 34 "head" 32
151 $ commit 34 "head" 32
152
152
153
153
154 $ hg log -G -q
154 $ hg log -G -q
155 @ 34:fea3ac5810e0
155 @ 34:fea3ac5810e0
156 |
156 |
157 | o 33:68608f5145f9
157 | o 33:68608f5145f9
158 | |
158 | |
159 o | 32:d06dffa21a31
159 o | 32:d06dffa21a31
160 |\ \
160 |\ \
161 | o \ 31:621d83e11f67
161 | o \ 31:621d83e11f67
162 | |\ \
162 | |\ \
163 | | o \ 30:6e11cd4b648f
163 | | o \ 30:6e11cd4b648f
164 | | |\ \
164 | | |\ \
165 | | | o | 29:cd9bb2be7593
165 | | | o | 29:cd9bb2be7593
166 | | | | |
166 | | | | |
167 | | o | | 28:44ecd0b9ae99
167 | | o | | 28:44ecd0b9ae99
168 | | |\ \ \
168 | | |\ \ \
169 o | | | | | 27:886ed638191b
169 o | | | | | 27:886ed638191b
170 |/ / / / /
170 |/ / / / /
171 | | o---+ 26:7f25b6c2f0b9
171 | | o---+ 26:7f25b6c2f0b9
172 | | | | |
172 | | | | |
173 +---o | | 25:91da8ed57247
173 +---o | | 25:91da8ed57247
174 | | | | |
174 | | | | |
175 | | o | | 24:a9c19a3d96b7
175 | | o | | 24:a9c19a3d96b7
176 | | |\| |
176 | | |\| |
177 | | o | | 23:a01cddf0766d
177 | | o | | 23:a01cddf0766d
178 | |/| | |
178 | |/| | |
179 +---o---+ 22:e0d9cccacb5d
179 +---o---+ 22:e0d9cccacb5d
180 | | / /
180 | | / /
181 o | | | 21:d42a756af44d
181 o | | | 21:d42a756af44d
182 |\ \ \ \
182 |\ \ \ \
183 | o---+-+ 20:d30ed6450e32
183 | o---+-+ 20:d30ed6450e32
184 | / / /
184 | / / /
185 o | | | 19:31ddc2c1573b
185 o | | | 19:31ddc2c1573b
186 |\ \ \ \
186 |\ \ \ \
187 +---+---o 18:1aa84d96232a
187 +---+---o 18:1aa84d96232a
188 | | | |
188 | | | |
189 | o | | 17:44765d7c06e0
189 | o | | 17:44765d7c06e0
190 | |\ \ \
190 | |\ \ \
191 | | o---+ 16:3677d192927d
191 | | o---+ 16:3677d192927d
192 | | |/ /
192 | | |/ /
193 o | | | 15:1dda3f72782d
193 o | | | 15:1dda3f72782d
194 |\ \ \ \
194 |\ \ \ \
195 | o-----+ 14:8eac370358ef
195 | o-----+ 14:8eac370358ef
196 | |/ / /
196 | |/ / /
197 o | | | 13:22d8966a97e3
197 o | | | 13:22d8966a97e3
198 |\ \ \ \
198 |\ \ \ \
199 +---o | | 12:86b91144a6e9
199 +---o | | 12:86b91144a6e9
200 | | |/ /
200 | | |/ /
201 | o | | 11:832d76e6bdf2
201 | o | | 11:832d76e6bdf2
202 | |\ \ \
202 | |\ \ \
203 | | o---+ 10:74c64d036d72
203 | | o---+ 10:74c64d036d72
204 | |/ / /
204 | |/ / /
205 o | | | 9:7010c0af0a35
205 o | | | 9:7010c0af0a35
206 |\ \ \ \
206 |\ \ \ \
207 | o-----+ 8:7a0b11f71937
207 | o-----+ 8:7a0b11f71937
208 |/ / / /
208 |/ / / /
209 o | | | 7:b632bb1b1224
209 o | | | 7:b632bb1b1224
210 |\ \ \ \
210 |\ \ \ \
211 +---o | | 6:b105a072e251
211 +---o | | 6:b105a072e251
212 | |/ / /
212 | |/ / /
213 | o | | 5:4409d547b708
213 | o | | 5:4409d547b708
214 | |\ \ \
214 | |\ \ \
215 | | o | | 4:26a8bac39d9f
215 | | o | | 4:26a8bac39d9f
216 | |/|/ /
216 | |/|/ /
217 | o / / 3:27eef8ed80b4
217 | o / / 3:27eef8ed80b4
218 |/ / /
218 |/ / /
219 o / / 2:3d9a33b8d1e1
219 o / / 2:3d9a33b8d1e1
220 |/ /
220 |/ /
221 o / 1:6db2ef61d156
221 o / 1:6db2ef61d156
222 |/
222 |/
223 o 0:e6eb3150255d
223 o 0:e6eb3150255d
224
224
225
225
226 $ hg log -G
226 $ hg log -G
227 @ changeset: 34:fea3ac5810e0
227 @ changeset: 34:fea3ac5810e0
228 | tag: tip
228 | tag: tip
229 | parent: 32:d06dffa21a31
229 | parent: 32:d06dffa21a31
230 | user: test
230 | user: test
231 | date: Thu Jan 01 00:00:34 1970 +0000
231 | date: Thu Jan 01 00:00:34 1970 +0000
232 | summary: (34) head
232 | summary: (34) head
233 |
233 |
234 | o changeset: 33:68608f5145f9
234 | o changeset: 33:68608f5145f9
235 | | parent: 18:1aa84d96232a
235 | | parent: 18:1aa84d96232a
236 | | user: test
236 | | user: test
237 | | date: Thu Jan 01 00:00:33 1970 +0000
237 | | date: Thu Jan 01 00:00:33 1970 +0000
238 | | summary: (33) head
238 | | summary: (33) head
239 | |
239 | |
240 o | changeset: 32:d06dffa21a31
240 o | changeset: 32:d06dffa21a31
241 |\ \ parent: 27:886ed638191b
241 |\ \ parent: 27:886ed638191b
242 | | | parent: 31:621d83e11f67
242 | | | parent: 31:621d83e11f67
243 | | | user: test
243 | | | user: test
244 | | | date: Thu Jan 01 00:00:32 1970 +0000
244 | | | date: Thu Jan 01 00:00:32 1970 +0000
245 | | | summary: (32) expand
245 | | | summary: (32) expand
246 | | |
246 | | |
247 | o | changeset: 31:621d83e11f67
247 | o | changeset: 31:621d83e11f67
248 | |\ \ parent: 21:d42a756af44d
248 | |\ \ parent: 21:d42a756af44d
249 | | | | parent: 30:6e11cd4b648f
249 | | | | parent: 30:6e11cd4b648f
250 | | | | user: test
250 | | | | user: test
251 | | | | date: Thu Jan 01 00:00:31 1970 +0000
251 | | | | date: Thu Jan 01 00:00:31 1970 +0000
252 | | | | summary: (31) expand
252 | | | | summary: (31) expand
253 | | | |
253 | | | |
254 | | o | changeset: 30:6e11cd4b648f
254 | | o | changeset: 30:6e11cd4b648f
255 | | |\ \ parent: 28:44ecd0b9ae99
255 | | |\ \ parent: 28:44ecd0b9ae99
256 | | | | | parent: 29:cd9bb2be7593
256 | | | | | parent: 29:cd9bb2be7593
257 | | | | | user: test
257 | | | | | user: test
258 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
258 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
259 | | | | | summary: (30) expand
259 | | | | | summary: (30) expand
260 | | | | |
260 | | | | |
261 | | | o | changeset: 29:cd9bb2be7593
261 | | | o | changeset: 29:cd9bb2be7593
262 | | | | | parent: 0:e6eb3150255d
262 | | | | | parent: 0:e6eb3150255d
263 | | | | | user: test
263 | | | | | user: test
264 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
264 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
265 | | | | | summary: (29) regular commit
265 | | | | | summary: (29) regular commit
266 | | | | |
266 | | | | |
267 | | o | | changeset: 28:44ecd0b9ae99
267 | | o | | changeset: 28:44ecd0b9ae99
268 | | |\ \ \ parent: 1:6db2ef61d156
268 | | |\ \ \ parent: 1:6db2ef61d156
269 | | | | | | parent: 26:7f25b6c2f0b9
269 | | | | | | parent: 26:7f25b6c2f0b9
270 | | | | | | user: test
270 | | | | | | user: test
271 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
271 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
272 | | | | | | summary: (28) merge zero known
272 | | | | | | summary: (28) merge zero known
273 | | | | | |
273 | | | | | |
274 o | | | | | changeset: 27:886ed638191b
274 o | | | | | changeset: 27:886ed638191b
275 |/ / / / / parent: 21:d42a756af44d
275 |/ / / / / parent: 21:d42a756af44d
276 | | | | | user: test
276 | | | | | user: test
277 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
277 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
278 | | | | | summary: (27) collapse
278 | | | | | summary: (27) collapse
279 | | | | |
279 | | | | |
280 | | o---+ changeset: 26:7f25b6c2f0b9
280 | | o---+ changeset: 26:7f25b6c2f0b9
281 | | | | | parent: 18:1aa84d96232a
281 | | | | | parent: 18:1aa84d96232a
282 | | | | | parent: 25:91da8ed57247
282 | | | | | parent: 25:91da8ed57247
283 | | | | | user: test
283 | | | | | user: test
284 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
284 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
285 | | | | | summary: (26) merge one known; far right
285 | | | | | summary: (26) merge one known; far right
286 | | | | |
286 | | | | |
287 +---o | | changeset: 25:91da8ed57247
287 +---o | | changeset: 25:91da8ed57247
288 | | | | | parent: 21:d42a756af44d
288 | | | | | parent: 21:d42a756af44d
289 | | | | | parent: 24:a9c19a3d96b7
289 | | | | | parent: 24:a9c19a3d96b7
290 | | | | | user: test
290 | | | | | user: test
291 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
291 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
292 | | | | | summary: (25) merge one known; far left
292 | | | | | summary: (25) merge one known; far left
293 | | | | |
293 | | | | |
294 | | o | | changeset: 24:a9c19a3d96b7
294 | | o | | changeset: 24:a9c19a3d96b7
295 | | |\| | parent: 0:e6eb3150255d
295 | | |\| | parent: 0:e6eb3150255d
296 | | | | | parent: 23:a01cddf0766d
296 | | | | | parent: 23:a01cddf0766d
297 | | | | | user: test
297 | | | | | user: test
298 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
298 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
299 | | | | | summary: (24) merge one known; immediate right
299 | | | | | summary: (24) merge one known; immediate right
300 | | | | |
300 | | | | |
301 | | o | | changeset: 23:a01cddf0766d
301 | | o | | changeset: 23:a01cddf0766d
302 | |/| | | parent: 1:6db2ef61d156
302 | |/| | | parent: 1:6db2ef61d156
303 | | | | | parent: 22:e0d9cccacb5d
303 | | | | | parent: 22:e0d9cccacb5d
304 | | | | | user: test
304 | | | | | user: test
305 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
305 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
306 | | | | | summary: (23) merge one known; immediate left
306 | | | | | summary: (23) merge one known; immediate left
307 | | | | |
307 | | | | |
308 +---o---+ changeset: 22:e0d9cccacb5d
308 +---o---+ changeset: 22:e0d9cccacb5d
309 | | | | parent: 18:1aa84d96232a
309 | | | | parent: 18:1aa84d96232a
310 | | / / parent: 21:d42a756af44d
310 | | / / parent: 21:d42a756af44d
311 | | | | user: test
311 | | | | user: test
312 | | | | date: Thu Jan 01 00:00:22 1970 +0000
312 | | | | date: Thu Jan 01 00:00:22 1970 +0000
313 | | | | summary: (22) merge two known; one far left, one far right
313 | | | | summary: (22) merge two known; one far left, one far right
314 | | | |
314 | | | |
315 o | | | changeset: 21:d42a756af44d
315 o | | | changeset: 21:d42a756af44d
316 |\ \ \ \ parent: 19:31ddc2c1573b
316 |\ \ \ \ parent: 19:31ddc2c1573b
317 | | | | | parent: 20:d30ed6450e32
317 | | | | | parent: 20:d30ed6450e32
318 | | | | | user: test
318 | | | | | user: test
319 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
319 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
320 | | | | | summary: (21) expand
320 | | | | | summary: (21) expand
321 | | | | |
321 | | | | |
322 | o---+-+ changeset: 20:d30ed6450e32
322 | o---+-+ changeset: 20:d30ed6450e32
323 | | | | parent: 0:e6eb3150255d
323 | | | | parent: 0:e6eb3150255d
324 | / / / parent: 18:1aa84d96232a
324 | / / / parent: 18:1aa84d96232a
325 | | | | user: test
325 | | | | user: test
326 | | | | date: Thu Jan 01 00:00:20 1970 +0000
326 | | | | date: Thu Jan 01 00:00:20 1970 +0000
327 | | | | summary: (20) merge two known; two far right
327 | | | | summary: (20) merge two known; two far right
328 | | | |
328 | | | |
329 o | | | changeset: 19:31ddc2c1573b
329 o | | | changeset: 19:31ddc2c1573b
330 |\ \ \ \ parent: 15:1dda3f72782d
330 |\ \ \ \ parent: 15:1dda3f72782d
331 | | | | | parent: 17:44765d7c06e0
331 | | | | | parent: 17:44765d7c06e0
332 | | | | | user: test
332 | | | | | user: test
333 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
333 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
334 | | | | | summary: (19) expand
334 | | | | | summary: (19) expand
335 | | | | |
335 | | | | |
336 +---+---o changeset: 18:1aa84d96232a
336 +---+---o changeset: 18:1aa84d96232a
337 | | | | parent: 1:6db2ef61d156
337 | | | | parent: 1:6db2ef61d156
338 | | | | parent: 15:1dda3f72782d
338 | | | | parent: 15:1dda3f72782d
339 | | | | user: test
339 | | | | user: test
340 | | | | date: Thu Jan 01 00:00:18 1970 +0000
340 | | | | date: Thu Jan 01 00:00:18 1970 +0000
341 | | | | summary: (18) merge two known; two far left
341 | | | | summary: (18) merge two known; two far left
342 | | | |
342 | | | |
343 | o | | changeset: 17:44765d7c06e0
343 | o | | changeset: 17:44765d7c06e0
344 | |\ \ \ parent: 12:86b91144a6e9
344 | |\ \ \ parent: 12:86b91144a6e9
345 | | | | | parent: 16:3677d192927d
345 | | | | | parent: 16:3677d192927d
346 | | | | | user: test
346 | | | | | user: test
347 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
347 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
348 | | | | | summary: (17) expand
348 | | | | | summary: (17) expand
349 | | | | |
349 | | | | |
350 | | o---+ changeset: 16:3677d192927d
350 | | o---+ changeset: 16:3677d192927d
351 | | | | | parent: 0:e6eb3150255d
351 | | | | | parent: 0:e6eb3150255d
352 | | |/ / parent: 1:6db2ef61d156
352 | | |/ / parent: 1:6db2ef61d156
353 | | | | user: test
353 | | | | user: test
354 | | | | date: Thu Jan 01 00:00:16 1970 +0000
354 | | | | date: Thu Jan 01 00:00:16 1970 +0000
355 | | | | summary: (16) merge two known; one immediate right, one near right
355 | | | | summary: (16) merge two known; one immediate right, one near right
356 | | | |
356 | | | |
357 o | | | changeset: 15:1dda3f72782d
357 o | | | changeset: 15:1dda3f72782d
358 |\ \ \ \ parent: 13:22d8966a97e3
358 |\ \ \ \ parent: 13:22d8966a97e3
359 | | | | | parent: 14:8eac370358ef
359 | | | | | parent: 14:8eac370358ef
360 | | | | | user: test
360 | | | | | user: test
361 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
361 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
362 | | | | | summary: (15) expand
362 | | | | | summary: (15) expand
363 | | | | |
363 | | | | |
364 | o-----+ changeset: 14:8eac370358ef
364 | o-----+ changeset: 14:8eac370358ef
365 | | | | | parent: 0:e6eb3150255d
365 | | | | | parent: 0:e6eb3150255d
366 | |/ / / parent: 12:86b91144a6e9
366 | |/ / / parent: 12:86b91144a6e9
367 | | | | user: test
367 | | | | user: test
368 | | | | date: Thu Jan 01 00:00:14 1970 +0000
368 | | | | date: Thu Jan 01 00:00:14 1970 +0000
369 | | | | summary: (14) merge two known; one immediate right, one far right
369 | | | | summary: (14) merge two known; one immediate right, one far right
370 | | | |
370 | | | |
371 o | | | changeset: 13:22d8966a97e3
371 o | | | changeset: 13:22d8966a97e3
372 |\ \ \ \ parent: 9:7010c0af0a35
372 |\ \ \ \ parent: 9:7010c0af0a35
373 | | | | | parent: 11:832d76e6bdf2
373 | | | | | parent: 11:832d76e6bdf2
374 | | | | | user: test
374 | | | | | user: test
375 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
375 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
376 | | | | | summary: (13) expand
376 | | | | | summary: (13) expand
377 | | | | |
377 | | | | |
378 +---o | | changeset: 12:86b91144a6e9
378 +---o | | changeset: 12:86b91144a6e9
379 | | |/ / parent: 1:6db2ef61d156
379 | | |/ / parent: 1:6db2ef61d156
380 | | | | parent: 9:7010c0af0a35
380 | | | | parent: 9:7010c0af0a35
381 | | | | user: test
381 | | | | user: test
382 | | | | date: Thu Jan 01 00:00:12 1970 +0000
382 | | | | date: Thu Jan 01 00:00:12 1970 +0000
383 | | | | summary: (12) merge two known; one immediate right, one far left
383 | | | | summary: (12) merge two known; one immediate right, one far left
384 | | | |
384 | | | |
385 | o | | changeset: 11:832d76e6bdf2
385 | o | | changeset: 11:832d76e6bdf2
386 | |\ \ \ parent: 6:b105a072e251
386 | |\ \ \ parent: 6:b105a072e251
387 | | | | | parent: 10:74c64d036d72
387 | | | | | parent: 10:74c64d036d72
388 | | | | | user: test
388 | | | | | user: test
389 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
389 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
390 | | | | | summary: (11) expand
390 | | | | | summary: (11) expand
391 | | | | |
391 | | | | |
392 | | o---+ changeset: 10:74c64d036d72
392 | | o---+ changeset: 10:74c64d036d72
393 | | | | | parent: 0:e6eb3150255d
393 | | | | | parent: 0:e6eb3150255d
394 | |/ / / parent: 6:b105a072e251
394 | |/ / / parent: 6:b105a072e251
395 | | | | user: test
395 | | | | user: test
396 | | | | date: Thu Jan 01 00:00:10 1970 +0000
396 | | | | date: Thu Jan 01 00:00:10 1970 +0000
397 | | | | summary: (10) merge two known; one immediate left, one near right
397 | | | | summary: (10) merge two known; one immediate left, one near right
398 | | | |
398 | | | |
399 o | | | changeset: 9:7010c0af0a35
399 o | | | changeset: 9:7010c0af0a35
400 |\ \ \ \ parent: 7:b632bb1b1224
400 |\ \ \ \ parent: 7:b632bb1b1224
401 | | | | | parent: 8:7a0b11f71937
401 | | | | | parent: 8:7a0b11f71937
402 | | | | | user: test
402 | | | | | user: test
403 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
403 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
404 | | | | | summary: (9) expand
404 | | | | | summary: (9) expand
405 | | | | |
405 | | | | |
406 | o-----+ changeset: 8:7a0b11f71937
406 | o-----+ changeset: 8:7a0b11f71937
407 | | | | | parent: 0:e6eb3150255d
407 | | | | | parent: 0:e6eb3150255d
408 |/ / / / parent: 7:b632bb1b1224
408 |/ / / / parent: 7:b632bb1b1224
409 | | | | user: test
409 | | | | user: test
410 | | | | date: Thu Jan 01 00:00:08 1970 +0000
410 | | | | date: Thu Jan 01 00:00:08 1970 +0000
411 | | | | summary: (8) merge two known; one immediate left, one far right
411 | | | | summary: (8) merge two known; one immediate left, one far right
412 | | | |
412 | | | |
413 o | | | changeset: 7:b632bb1b1224
413 o | | | changeset: 7:b632bb1b1224
414 |\ \ \ \ parent: 2:3d9a33b8d1e1
414 |\ \ \ \ parent: 2:3d9a33b8d1e1
415 | | | | | parent: 5:4409d547b708
415 | | | | | parent: 5:4409d547b708
416 | | | | | user: test
416 | | | | | user: test
417 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
417 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
418 | | | | | summary: (7) expand
418 | | | | | summary: (7) expand
419 | | | | |
419 | | | | |
420 +---o | | changeset: 6:b105a072e251
420 +---o | | changeset: 6:b105a072e251
421 | |/ / / parent: 2:3d9a33b8d1e1
421 | |/ / / parent: 2:3d9a33b8d1e1
422 | | | | parent: 5:4409d547b708
422 | | | | parent: 5:4409d547b708
423 | | | | user: test
423 | | | | user: test
424 | | | | date: Thu Jan 01 00:00:06 1970 +0000
424 | | | | date: Thu Jan 01 00:00:06 1970 +0000
425 | | | | summary: (6) merge two known; one immediate left, one far left
425 | | | | summary: (6) merge two known; one immediate left, one far left
426 | | | |
426 | | | |
427 | o | | changeset: 5:4409d547b708
427 | o | | changeset: 5:4409d547b708
428 | |\ \ \ parent: 3:27eef8ed80b4
428 | |\ \ \ parent: 3:27eef8ed80b4
429 | | | | | parent: 4:26a8bac39d9f
429 | | | | | parent: 4:26a8bac39d9f
430 | | | | | user: test
430 | | | | | user: test
431 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
431 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
432 | | | | | summary: (5) expand
432 | | | | | summary: (5) expand
433 | | | | |
433 | | | | |
434 | | o | | changeset: 4:26a8bac39d9f
434 | | o | | changeset: 4:26a8bac39d9f
435 | |/|/ / parent: 1:6db2ef61d156
435 | |/|/ / parent: 1:6db2ef61d156
436 | | | | parent: 3:27eef8ed80b4
436 | | | | parent: 3:27eef8ed80b4
437 | | | | user: test
437 | | | | user: test
438 | | | | date: Thu Jan 01 00:00:04 1970 +0000
438 | | | | date: Thu Jan 01 00:00:04 1970 +0000
439 | | | | summary: (4) merge two known; one immediate left, one immediate right
439 | | | | summary: (4) merge two known; one immediate left, one immediate right
440 | | | |
440 | | | |
441 | o | | changeset: 3:27eef8ed80b4
441 | o | | changeset: 3:27eef8ed80b4
442 |/ / / user: test
442 |/ / / user: test
443 | | | date: Thu Jan 01 00:00:03 1970 +0000
443 | | | date: Thu Jan 01 00:00:03 1970 +0000
444 | | | summary: (3) collapse
444 | | | summary: (3) collapse
445 | | |
445 | | |
446 o | | changeset: 2:3d9a33b8d1e1
446 o | | changeset: 2:3d9a33b8d1e1
447 |/ / user: test
447 |/ / user: test
448 | | date: Thu Jan 01 00:00:02 1970 +0000
448 | | date: Thu Jan 01 00:00:02 1970 +0000
449 | | summary: (2) collapse
449 | | summary: (2) collapse
450 | |
450 | |
451 o | changeset: 1:6db2ef61d156
451 o | changeset: 1:6db2ef61d156
452 |/ user: test
452 |/ user: test
453 | date: Thu Jan 01 00:00:01 1970 +0000
453 | date: Thu Jan 01 00:00:01 1970 +0000
454 | summary: (1) collapse
454 | summary: (1) collapse
455 |
455 |
456 o changeset: 0:e6eb3150255d
456 o changeset: 0:e6eb3150255d
457 user: test
457 user: test
458 date: Thu Jan 01 00:00:00 1970 +0000
458 date: Thu Jan 01 00:00:00 1970 +0000
459 summary: (0) root
459 summary: (0) root
460
460
461
461
462 File glog:
462 File glog:
463 $ hg log -G a
463 $ hg log -G a
464 @ changeset: 34:fea3ac5810e0
464 @ changeset: 34:fea3ac5810e0
465 | tag: tip
465 | tag: tip
466 | parent: 32:d06dffa21a31
466 | parent: 32:d06dffa21a31
467 | user: test
467 | user: test
468 | date: Thu Jan 01 00:00:34 1970 +0000
468 | date: Thu Jan 01 00:00:34 1970 +0000
469 | summary: (34) head
469 | summary: (34) head
470 |
470 |
471 | o changeset: 33:68608f5145f9
471 | o changeset: 33:68608f5145f9
472 | | parent: 18:1aa84d96232a
472 | | parent: 18:1aa84d96232a
473 | | user: test
473 | | user: test
474 | | date: Thu Jan 01 00:00:33 1970 +0000
474 | | date: Thu Jan 01 00:00:33 1970 +0000
475 | | summary: (33) head
475 | | summary: (33) head
476 | |
476 | |
477 o | changeset: 32:d06dffa21a31
477 o | changeset: 32:d06dffa21a31
478 |\ \ parent: 27:886ed638191b
478 |\ \ parent: 27:886ed638191b
479 | | | parent: 31:621d83e11f67
479 | | | parent: 31:621d83e11f67
480 | | | user: test
480 | | | user: test
481 | | | date: Thu Jan 01 00:00:32 1970 +0000
481 | | | date: Thu Jan 01 00:00:32 1970 +0000
482 | | | summary: (32) expand
482 | | | summary: (32) expand
483 | | |
483 | | |
484 | o | changeset: 31:621d83e11f67
484 | o | changeset: 31:621d83e11f67
485 | |\ \ parent: 21:d42a756af44d
485 | |\ \ parent: 21:d42a756af44d
486 | | | | parent: 30:6e11cd4b648f
486 | | | | parent: 30:6e11cd4b648f
487 | | | | user: test
487 | | | | user: test
488 | | | | date: Thu Jan 01 00:00:31 1970 +0000
488 | | | | date: Thu Jan 01 00:00:31 1970 +0000
489 | | | | summary: (31) expand
489 | | | | summary: (31) expand
490 | | | |
490 | | | |
491 | | o | changeset: 30:6e11cd4b648f
491 | | o | changeset: 30:6e11cd4b648f
492 | | |\ \ parent: 28:44ecd0b9ae99
492 | | |\ \ parent: 28:44ecd0b9ae99
493 | | | | | parent: 29:cd9bb2be7593
493 | | | | | parent: 29:cd9bb2be7593
494 | | | | | user: test
494 | | | | | user: test
495 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
495 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
496 | | | | | summary: (30) expand
496 | | | | | summary: (30) expand
497 | | | | |
497 | | | | |
498 | | | o | changeset: 29:cd9bb2be7593
498 | | | o | changeset: 29:cd9bb2be7593
499 | | | | | parent: 0:e6eb3150255d
499 | | | | | parent: 0:e6eb3150255d
500 | | | | | user: test
500 | | | | | user: test
501 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
501 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
502 | | | | | summary: (29) regular commit
502 | | | | | summary: (29) regular commit
503 | | | | |
503 | | | | |
504 | | o | | changeset: 28:44ecd0b9ae99
504 | | o | | changeset: 28:44ecd0b9ae99
505 | | |\ \ \ parent: 1:6db2ef61d156
505 | | |\ \ \ parent: 1:6db2ef61d156
506 | | | | | | parent: 26:7f25b6c2f0b9
506 | | | | | | parent: 26:7f25b6c2f0b9
507 | | | | | | user: test
507 | | | | | | user: test
508 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
508 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
509 | | | | | | summary: (28) merge zero known
509 | | | | | | summary: (28) merge zero known
510 | | | | | |
510 | | | | | |
511 o | | | | | changeset: 27:886ed638191b
511 o | | | | | changeset: 27:886ed638191b
512 |/ / / / / parent: 21:d42a756af44d
512 |/ / / / / parent: 21:d42a756af44d
513 | | | | | user: test
513 | | | | | user: test
514 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
514 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
515 | | | | | summary: (27) collapse
515 | | | | | summary: (27) collapse
516 | | | | |
516 | | | | |
517 | | o---+ changeset: 26:7f25b6c2f0b9
517 | | o---+ changeset: 26:7f25b6c2f0b9
518 | | | | | parent: 18:1aa84d96232a
518 | | | | | parent: 18:1aa84d96232a
519 | | | | | parent: 25:91da8ed57247
519 | | | | | parent: 25:91da8ed57247
520 | | | | | user: test
520 | | | | | user: test
521 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
521 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
522 | | | | | summary: (26) merge one known; far right
522 | | | | | summary: (26) merge one known; far right
523 | | | | |
523 | | | | |
524 +---o | | changeset: 25:91da8ed57247
524 +---o | | changeset: 25:91da8ed57247
525 | | | | | parent: 21:d42a756af44d
525 | | | | | parent: 21:d42a756af44d
526 | | | | | parent: 24:a9c19a3d96b7
526 | | | | | parent: 24:a9c19a3d96b7
527 | | | | | user: test
527 | | | | | user: test
528 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
528 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
529 | | | | | summary: (25) merge one known; far left
529 | | | | | summary: (25) merge one known; far left
530 | | | | |
530 | | | | |
531 | | o | | changeset: 24:a9c19a3d96b7
531 | | o | | changeset: 24:a9c19a3d96b7
532 | | |\| | parent: 0:e6eb3150255d
532 | | |\| | parent: 0:e6eb3150255d
533 | | | | | parent: 23:a01cddf0766d
533 | | | | | parent: 23:a01cddf0766d
534 | | | | | user: test
534 | | | | | user: test
535 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
535 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
536 | | | | | summary: (24) merge one known; immediate right
536 | | | | | summary: (24) merge one known; immediate right
537 | | | | |
537 | | | | |
538 | | o | | changeset: 23:a01cddf0766d
538 | | o | | changeset: 23:a01cddf0766d
539 | |/| | | parent: 1:6db2ef61d156
539 | |/| | | parent: 1:6db2ef61d156
540 | | | | | parent: 22:e0d9cccacb5d
540 | | | | | parent: 22:e0d9cccacb5d
541 | | | | | user: test
541 | | | | | user: test
542 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
542 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
543 | | | | | summary: (23) merge one known; immediate left
543 | | | | | summary: (23) merge one known; immediate left
544 | | | | |
544 | | | | |
545 +---o---+ changeset: 22:e0d9cccacb5d
545 +---o---+ changeset: 22:e0d9cccacb5d
546 | | | | parent: 18:1aa84d96232a
546 | | | | parent: 18:1aa84d96232a
547 | | / / parent: 21:d42a756af44d
547 | | / / parent: 21:d42a756af44d
548 | | | | user: test
548 | | | | user: test
549 | | | | date: Thu Jan 01 00:00:22 1970 +0000
549 | | | | date: Thu Jan 01 00:00:22 1970 +0000
550 | | | | summary: (22) merge two known; one far left, one far right
550 | | | | summary: (22) merge two known; one far left, one far right
551 | | | |
551 | | | |
552 o | | | changeset: 21:d42a756af44d
552 o | | | changeset: 21:d42a756af44d
553 |\ \ \ \ parent: 19:31ddc2c1573b
553 |\ \ \ \ parent: 19:31ddc2c1573b
554 | | | | | parent: 20:d30ed6450e32
554 | | | | | parent: 20:d30ed6450e32
555 | | | | | user: test
555 | | | | | user: test
556 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
556 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
557 | | | | | summary: (21) expand
557 | | | | | summary: (21) expand
558 | | | | |
558 | | | | |
559 | o---+-+ changeset: 20:d30ed6450e32
559 | o---+-+ changeset: 20:d30ed6450e32
560 | | | | parent: 0:e6eb3150255d
560 | | | | parent: 0:e6eb3150255d
561 | / / / parent: 18:1aa84d96232a
561 | / / / parent: 18:1aa84d96232a
562 | | | | user: test
562 | | | | user: test
563 | | | | date: Thu Jan 01 00:00:20 1970 +0000
563 | | | | date: Thu Jan 01 00:00:20 1970 +0000
564 | | | | summary: (20) merge two known; two far right
564 | | | | summary: (20) merge two known; two far right
565 | | | |
565 | | | |
566 o | | | changeset: 19:31ddc2c1573b
566 o | | | changeset: 19:31ddc2c1573b
567 |\ \ \ \ parent: 15:1dda3f72782d
567 |\ \ \ \ parent: 15:1dda3f72782d
568 | | | | | parent: 17:44765d7c06e0
568 | | | | | parent: 17:44765d7c06e0
569 | | | | | user: test
569 | | | | | user: test
570 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
570 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
571 | | | | | summary: (19) expand
571 | | | | | summary: (19) expand
572 | | | | |
572 | | | | |
573 +---+---o changeset: 18:1aa84d96232a
573 +---+---o changeset: 18:1aa84d96232a
574 | | | | parent: 1:6db2ef61d156
574 | | | | parent: 1:6db2ef61d156
575 | | | | parent: 15:1dda3f72782d
575 | | | | parent: 15:1dda3f72782d
576 | | | | user: test
576 | | | | user: test
577 | | | | date: Thu Jan 01 00:00:18 1970 +0000
577 | | | | date: Thu Jan 01 00:00:18 1970 +0000
578 | | | | summary: (18) merge two known; two far left
578 | | | | summary: (18) merge two known; two far left
579 | | | |
579 | | | |
580 | o | | changeset: 17:44765d7c06e0
580 | o | | changeset: 17:44765d7c06e0
581 | |\ \ \ parent: 12:86b91144a6e9
581 | |\ \ \ parent: 12:86b91144a6e9
582 | | | | | parent: 16:3677d192927d
582 | | | | | parent: 16:3677d192927d
583 | | | | | user: test
583 | | | | | user: test
584 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
584 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
585 | | | | | summary: (17) expand
585 | | | | | summary: (17) expand
586 | | | | |
586 | | | | |
587 | | o---+ changeset: 16:3677d192927d
587 | | o---+ changeset: 16:3677d192927d
588 | | | | | parent: 0:e6eb3150255d
588 | | | | | parent: 0:e6eb3150255d
589 | | |/ / parent: 1:6db2ef61d156
589 | | |/ / parent: 1:6db2ef61d156
590 | | | | user: test
590 | | | | user: test
591 | | | | date: Thu Jan 01 00:00:16 1970 +0000
591 | | | | date: Thu Jan 01 00:00:16 1970 +0000
592 | | | | summary: (16) merge two known; one immediate right, one near right
592 | | | | summary: (16) merge two known; one immediate right, one near right
593 | | | |
593 | | | |
594 o | | | changeset: 15:1dda3f72782d
594 o | | | changeset: 15:1dda3f72782d
595 |\ \ \ \ parent: 13:22d8966a97e3
595 |\ \ \ \ parent: 13:22d8966a97e3
596 | | | | | parent: 14:8eac370358ef
596 | | | | | parent: 14:8eac370358ef
597 | | | | | user: test
597 | | | | | user: test
598 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
598 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
599 | | | | | summary: (15) expand
599 | | | | | summary: (15) expand
600 | | | | |
600 | | | | |
601 | o-----+ changeset: 14:8eac370358ef
601 | o-----+ changeset: 14:8eac370358ef
602 | | | | | parent: 0:e6eb3150255d
602 | | | | | parent: 0:e6eb3150255d
603 | |/ / / parent: 12:86b91144a6e9
603 | |/ / / parent: 12:86b91144a6e9
604 | | | | user: test
604 | | | | user: test
605 | | | | date: Thu Jan 01 00:00:14 1970 +0000
605 | | | | date: Thu Jan 01 00:00:14 1970 +0000
606 | | | | summary: (14) merge two known; one immediate right, one far right
606 | | | | summary: (14) merge two known; one immediate right, one far right
607 | | | |
607 | | | |
608 o | | | changeset: 13:22d8966a97e3
608 o | | | changeset: 13:22d8966a97e3
609 |\ \ \ \ parent: 9:7010c0af0a35
609 |\ \ \ \ parent: 9:7010c0af0a35
610 | | | | | parent: 11:832d76e6bdf2
610 | | | | | parent: 11:832d76e6bdf2
611 | | | | | user: test
611 | | | | | user: test
612 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
612 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
613 | | | | | summary: (13) expand
613 | | | | | summary: (13) expand
614 | | | | |
614 | | | | |
615 +---o | | changeset: 12:86b91144a6e9
615 +---o | | changeset: 12:86b91144a6e9
616 | | |/ / parent: 1:6db2ef61d156
616 | | |/ / parent: 1:6db2ef61d156
617 | | | | parent: 9:7010c0af0a35
617 | | | | parent: 9:7010c0af0a35
618 | | | | user: test
618 | | | | user: test
619 | | | | date: Thu Jan 01 00:00:12 1970 +0000
619 | | | | date: Thu Jan 01 00:00:12 1970 +0000
620 | | | | summary: (12) merge two known; one immediate right, one far left
620 | | | | summary: (12) merge two known; one immediate right, one far left
621 | | | |
621 | | | |
622 | o | | changeset: 11:832d76e6bdf2
622 | o | | changeset: 11:832d76e6bdf2
623 | |\ \ \ parent: 6:b105a072e251
623 | |\ \ \ parent: 6:b105a072e251
624 | | | | | parent: 10:74c64d036d72
624 | | | | | parent: 10:74c64d036d72
625 | | | | | user: test
625 | | | | | user: test
626 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
626 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
627 | | | | | summary: (11) expand
627 | | | | | summary: (11) expand
628 | | | | |
628 | | | | |
629 | | o---+ changeset: 10:74c64d036d72
629 | | o---+ changeset: 10:74c64d036d72
630 | | | | | parent: 0:e6eb3150255d
630 | | | | | parent: 0:e6eb3150255d
631 | |/ / / parent: 6:b105a072e251
631 | |/ / / parent: 6:b105a072e251
632 | | | | user: test
632 | | | | user: test
633 | | | | date: Thu Jan 01 00:00:10 1970 +0000
633 | | | | date: Thu Jan 01 00:00:10 1970 +0000
634 | | | | summary: (10) merge two known; one immediate left, one near right
634 | | | | summary: (10) merge two known; one immediate left, one near right
635 | | | |
635 | | | |
636 o | | | changeset: 9:7010c0af0a35
636 o | | | changeset: 9:7010c0af0a35
637 |\ \ \ \ parent: 7:b632bb1b1224
637 |\ \ \ \ parent: 7:b632bb1b1224
638 | | | | | parent: 8:7a0b11f71937
638 | | | | | parent: 8:7a0b11f71937
639 | | | | | user: test
639 | | | | | user: test
640 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
640 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
641 | | | | | summary: (9) expand
641 | | | | | summary: (9) expand
642 | | | | |
642 | | | | |
643 | o-----+ changeset: 8:7a0b11f71937
643 | o-----+ changeset: 8:7a0b11f71937
644 | | | | | parent: 0:e6eb3150255d
644 | | | | | parent: 0:e6eb3150255d
645 |/ / / / parent: 7:b632bb1b1224
645 |/ / / / parent: 7:b632bb1b1224
646 | | | | user: test
646 | | | | user: test
647 | | | | date: Thu Jan 01 00:00:08 1970 +0000
647 | | | | date: Thu Jan 01 00:00:08 1970 +0000
648 | | | | summary: (8) merge two known; one immediate left, one far right
648 | | | | summary: (8) merge two known; one immediate left, one far right
649 | | | |
649 | | | |
650 o | | | changeset: 7:b632bb1b1224
650 o | | | changeset: 7:b632bb1b1224
651 |\ \ \ \ parent: 2:3d9a33b8d1e1
651 |\ \ \ \ parent: 2:3d9a33b8d1e1
652 | | | | | parent: 5:4409d547b708
652 | | | | | parent: 5:4409d547b708
653 | | | | | user: test
653 | | | | | user: test
654 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
654 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
655 | | | | | summary: (7) expand
655 | | | | | summary: (7) expand
656 | | | | |
656 | | | | |
657 +---o | | changeset: 6:b105a072e251
657 +---o | | changeset: 6:b105a072e251
658 | |/ / / parent: 2:3d9a33b8d1e1
658 | |/ / / parent: 2:3d9a33b8d1e1
659 | | | | parent: 5:4409d547b708
659 | | | | parent: 5:4409d547b708
660 | | | | user: test
660 | | | | user: test
661 | | | | date: Thu Jan 01 00:00:06 1970 +0000
661 | | | | date: Thu Jan 01 00:00:06 1970 +0000
662 | | | | summary: (6) merge two known; one immediate left, one far left
662 | | | | summary: (6) merge two known; one immediate left, one far left
663 | | | |
663 | | | |
664 | o | | changeset: 5:4409d547b708
664 | o | | changeset: 5:4409d547b708
665 | |\ \ \ parent: 3:27eef8ed80b4
665 | |\ \ \ parent: 3:27eef8ed80b4
666 | | | | | parent: 4:26a8bac39d9f
666 | | | | | parent: 4:26a8bac39d9f
667 | | | | | user: test
667 | | | | | user: test
668 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
668 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
669 | | | | | summary: (5) expand
669 | | | | | summary: (5) expand
670 | | | | |
670 | | | | |
671 | | o | | changeset: 4:26a8bac39d9f
671 | | o | | changeset: 4:26a8bac39d9f
672 | |/|/ / parent: 1:6db2ef61d156
672 | |/|/ / parent: 1:6db2ef61d156
673 | | | | parent: 3:27eef8ed80b4
673 | | | | parent: 3:27eef8ed80b4
674 | | | | user: test
674 | | | | user: test
675 | | | | date: Thu Jan 01 00:00:04 1970 +0000
675 | | | | date: Thu Jan 01 00:00:04 1970 +0000
676 | | | | summary: (4) merge two known; one immediate left, one immediate right
676 | | | | summary: (4) merge two known; one immediate left, one immediate right
677 | | | |
677 | | | |
678 | o | | changeset: 3:27eef8ed80b4
678 | o | | changeset: 3:27eef8ed80b4
679 |/ / / user: test
679 |/ / / user: test
680 | | | date: Thu Jan 01 00:00:03 1970 +0000
680 | | | date: Thu Jan 01 00:00:03 1970 +0000
681 | | | summary: (3) collapse
681 | | | summary: (3) collapse
682 | | |
682 | | |
683 o | | changeset: 2:3d9a33b8d1e1
683 o | | changeset: 2:3d9a33b8d1e1
684 |/ / user: test
684 |/ / user: test
685 | | date: Thu Jan 01 00:00:02 1970 +0000
685 | | date: Thu Jan 01 00:00:02 1970 +0000
686 | | summary: (2) collapse
686 | | summary: (2) collapse
687 | |
687 | |
688 o | changeset: 1:6db2ef61d156
688 o | changeset: 1:6db2ef61d156
689 |/ user: test
689 |/ user: test
690 | date: Thu Jan 01 00:00:01 1970 +0000
690 | date: Thu Jan 01 00:00:01 1970 +0000
691 | summary: (1) collapse
691 | summary: (1) collapse
692 |
692 |
693 o changeset: 0:e6eb3150255d
693 o changeset: 0:e6eb3150255d
694 user: test
694 user: test
695 date: Thu Jan 01 00:00:00 1970 +0000
695 date: Thu Jan 01 00:00:00 1970 +0000
696 summary: (0) root
696 summary: (0) root
697
697
698
698
699 File glog per revset:
699 File glog per revset:
700
700
701 $ hg log -G -r 'file("a")'
701 $ hg log -G -r 'file("a")'
702 @ changeset: 34:fea3ac5810e0
702 @ changeset: 34:fea3ac5810e0
703 | tag: tip
703 | tag: tip
704 | parent: 32:d06dffa21a31
704 | parent: 32:d06dffa21a31
705 | user: test
705 | user: test
706 | date: Thu Jan 01 00:00:34 1970 +0000
706 | date: Thu Jan 01 00:00:34 1970 +0000
707 | summary: (34) head
707 | summary: (34) head
708 |
708 |
709 | o changeset: 33:68608f5145f9
709 | o changeset: 33:68608f5145f9
710 | | parent: 18:1aa84d96232a
710 | | parent: 18:1aa84d96232a
711 | | user: test
711 | | user: test
712 | | date: Thu Jan 01 00:00:33 1970 +0000
712 | | date: Thu Jan 01 00:00:33 1970 +0000
713 | | summary: (33) head
713 | | summary: (33) head
714 | |
714 | |
715 o | changeset: 32:d06dffa21a31
715 o | changeset: 32:d06dffa21a31
716 |\ \ parent: 27:886ed638191b
716 |\ \ parent: 27:886ed638191b
717 | | | parent: 31:621d83e11f67
717 | | | parent: 31:621d83e11f67
718 | | | user: test
718 | | | user: test
719 | | | date: Thu Jan 01 00:00:32 1970 +0000
719 | | | date: Thu Jan 01 00:00:32 1970 +0000
720 | | | summary: (32) expand
720 | | | summary: (32) expand
721 | | |
721 | | |
722 | o | changeset: 31:621d83e11f67
722 | o | changeset: 31:621d83e11f67
723 | |\ \ parent: 21:d42a756af44d
723 | |\ \ parent: 21:d42a756af44d
724 | | | | parent: 30:6e11cd4b648f
724 | | | | parent: 30:6e11cd4b648f
725 | | | | user: test
725 | | | | user: test
726 | | | | date: Thu Jan 01 00:00:31 1970 +0000
726 | | | | date: Thu Jan 01 00:00:31 1970 +0000
727 | | | | summary: (31) expand
727 | | | | summary: (31) expand
728 | | | |
728 | | | |
729 | | o | changeset: 30:6e11cd4b648f
729 | | o | changeset: 30:6e11cd4b648f
730 | | |\ \ parent: 28:44ecd0b9ae99
730 | | |\ \ parent: 28:44ecd0b9ae99
731 | | | | | parent: 29:cd9bb2be7593
731 | | | | | parent: 29:cd9bb2be7593
732 | | | | | user: test
732 | | | | | user: test
733 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
733 | | | | | date: Thu Jan 01 00:00:30 1970 +0000
734 | | | | | summary: (30) expand
734 | | | | | summary: (30) expand
735 | | | | |
735 | | | | |
736 | | | o | changeset: 29:cd9bb2be7593
736 | | | o | changeset: 29:cd9bb2be7593
737 | | | | | parent: 0:e6eb3150255d
737 | | | | | parent: 0:e6eb3150255d
738 | | | | | user: test
738 | | | | | user: test
739 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
739 | | | | | date: Thu Jan 01 00:00:29 1970 +0000
740 | | | | | summary: (29) regular commit
740 | | | | | summary: (29) regular commit
741 | | | | |
741 | | | | |
742 | | o | | changeset: 28:44ecd0b9ae99
742 | | o | | changeset: 28:44ecd0b9ae99
743 | | |\ \ \ parent: 1:6db2ef61d156
743 | | |\ \ \ parent: 1:6db2ef61d156
744 | | | | | | parent: 26:7f25b6c2f0b9
744 | | | | | | parent: 26:7f25b6c2f0b9
745 | | | | | | user: test
745 | | | | | | user: test
746 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
746 | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
747 | | | | | | summary: (28) merge zero known
747 | | | | | | summary: (28) merge zero known
748 | | | | | |
748 | | | | | |
749 o | | | | | changeset: 27:886ed638191b
749 o | | | | | changeset: 27:886ed638191b
750 |/ / / / / parent: 21:d42a756af44d
750 |/ / / / / parent: 21:d42a756af44d
751 | | | | | user: test
751 | | | | | user: test
752 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
752 | | | | | date: Thu Jan 01 00:00:27 1970 +0000
753 | | | | | summary: (27) collapse
753 | | | | | summary: (27) collapse
754 | | | | |
754 | | | | |
755 | | o---+ changeset: 26:7f25b6c2f0b9
755 | | o---+ changeset: 26:7f25b6c2f0b9
756 | | | | | parent: 18:1aa84d96232a
756 | | | | | parent: 18:1aa84d96232a
757 | | | | | parent: 25:91da8ed57247
757 | | | | | parent: 25:91da8ed57247
758 | | | | | user: test
758 | | | | | user: test
759 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
759 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
760 | | | | | summary: (26) merge one known; far right
760 | | | | | summary: (26) merge one known; far right
761 | | | | |
761 | | | | |
762 +---o | | changeset: 25:91da8ed57247
762 +---o | | changeset: 25:91da8ed57247
763 | | | | | parent: 21:d42a756af44d
763 | | | | | parent: 21:d42a756af44d
764 | | | | | parent: 24:a9c19a3d96b7
764 | | | | | parent: 24:a9c19a3d96b7
765 | | | | | user: test
765 | | | | | user: test
766 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
766 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
767 | | | | | summary: (25) merge one known; far left
767 | | | | | summary: (25) merge one known; far left
768 | | | | |
768 | | | | |
769 | | o | | changeset: 24:a9c19a3d96b7
769 | | o | | changeset: 24:a9c19a3d96b7
770 | | |\| | parent: 0:e6eb3150255d
770 | | |\| | parent: 0:e6eb3150255d
771 | | | | | parent: 23:a01cddf0766d
771 | | | | | parent: 23:a01cddf0766d
772 | | | | | user: test
772 | | | | | user: test
773 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
773 | | | | | date: Thu Jan 01 00:00:24 1970 +0000
774 | | | | | summary: (24) merge one known; immediate right
774 | | | | | summary: (24) merge one known; immediate right
775 | | | | |
775 | | | | |
776 | | o | | changeset: 23:a01cddf0766d
776 | | o | | changeset: 23:a01cddf0766d
777 | |/| | | parent: 1:6db2ef61d156
777 | |/| | | parent: 1:6db2ef61d156
778 | | | | | parent: 22:e0d9cccacb5d
778 | | | | | parent: 22:e0d9cccacb5d
779 | | | | | user: test
779 | | | | | user: test
780 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
780 | | | | | date: Thu Jan 01 00:00:23 1970 +0000
781 | | | | | summary: (23) merge one known; immediate left
781 | | | | | summary: (23) merge one known; immediate left
782 | | | | |
782 | | | | |
783 +---o---+ changeset: 22:e0d9cccacb5d
783 +---o---+ changeset: 22:e0d9cccacb5d
784 | | | | parent: 18:1aa84d96232a
784 | | | | parent: 18:1aa84d96232a
785 | | / / parent: 21:d42a756af44d
785 | | / / parent: 21:d42a756af44d
786 | | | | user: test
786 | | | | user: test
787 | | | | date: Thu Jan 01 00:00:22 1970 +0000
787 | | | | date: Thu Jan 01 00:00:22 1970 +0000
788 | | | | summary: (22) merge two known; one far left, one far right
788 | | | | summary: (22) merge two known; one far left, one far right
789 | | | |
789 | | | |
790 o | | | changeset: 21:d42a756af44d
790 o | | | changeset: 21:d42a756af44d
791 |\ \ \ \ parent: 19:31ddc2c1573b
791 |\ \ \ \ parent: 19:31ddc2c1573b
792 | | | | | parent: 20:d30ed6450e32
792 | | | | | parent: 20:d30ed6450e32
793 | | | | | user: test
793 | | | | | user: test
794 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
794 | | | | | date: Thu Jan 01 00:00:21 1970 +0000
795 | | | | | summary: (21) expand
795 | | | | | summary: (21) expand
796 | | | | |
796 | | | | |
797 | o---+-+ changeset: 20:d30ed6450e32
797 | o---+-+ changeset: 20:d30ed6450e32
798 | | | | parent: 0:e6eb3150255d
798 | | | | parent: 0:e6eb3150255d
799 | / / / parent: 18:1aa84d96232a
799 | / / / parent: 18:1aa84d96232a
800 | | | | user: test
800 | | | | user: test
801 | | | | date: Thu Jan 01 00:00:20 1970 +0000
801 | | | | date: Thu Jan 01 00:00:20 1970 +0000
802 | | | | summary: (20) merge two known; two far right
802 | | | | summary: (20) merge two known; two far right
803 | | | |
803 | | | |
804 o | | | changeset: 19:31ddc2c1573b
804 o | | | changeset: 19:31ddc2c1573b
805 |\ \ \ \ parent: 15:1dda3f72782d
805 |\ \ \ \ parent: 15:1dda3f72782d
806 | | | | | parent: 17:44765d7c06e0
806 | | | | | parent: 17:44765d7c06e0
807 | | | | | user: test
807 | | | | | user: test
808 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
808 | | | | | date: Thu Jan 01 00:00:19 1970 +0000
809 | | | | | summary: (19) expand
809 | | | | | summary: (19) expand
810 | | | | |
810 | | | | |
811 +---+---o changeset: 18:1aa84d96232a
811 +---+---o changeset: 18:1aa84d96232a
812 | | | | parent: 1:6db2ef61d156
812 | | | | parent: 1:6db2ef61d156
813 | | | | parent: 15:1dda3f72782d
813 | | | | parent: 15:1dda3f72782d
814 | | | | user: test
814 | | | | user: test
815 | | | | date: Thu Jan 01 00:00:18 1970 +0000
815 | | | | date: Thu Jan 01 00:00:18 1970 +0000
816 | | | | summary: (18) merge two known; two far left
816 | | | | summary: (18) merge two known; two far left
817 | | | |
817 | | | |
818 | o | | changeset: 17:44765d7c06e0
818 | o | | changeset: 17:44765d7c06e0
819 | |\ \ \ parent: 12:86b91144a6e9
819 | |\ \ \ parent: 12:86b91144a6e9
820 | | | | | parent: 16:3677d192927d
820 | | | | | parent: 16:3677d192927d
821 | | | | | user: test
821 | | | | | user: test
822 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
822 | | | | | date: Thu Jan 01 00:00:17 1970 +0000
823 | | | | | summary: (17) expand
823 | | | | | summary: (17) expand
824 | | | | |
824 | | | | |
825 | | o---+ changeset: 16:3677d192927d
825 | | o---+ changeset: 16:3677d192927d
826 | | | | | parent: 0:e6eb3150255d
826 | | | | | parent: 0:e6eb3150255d
827 | | |/ / parent: 1:6db2ef61d156
827 | | |/ / parent: 1:6db2ef61d156
828 | | | | user: test
828 | | | | user: test
829 | | | | date: Thu Jan 01 00:00:16 1970 +0000
829 | | | | date: Thu Jan 01 00:00:16 1970 +0000
830 | | | | summary: (16) merge two known; one immediate right, one near right
830 | | | | summary: (16) merge two known; one immediate right, one near right
831 | | | |
831 | | | |
832 o | | | changeset: 15:1dda3f72782d
832 o | | | changeset: 15:1dda3f72782d
833 |\ \ \ \ parent: 13:22d8966a97e3
833 |\ \ \ \ parent: 13:22d8966a97e3
834 | | | | | parent: 14:8eac370358ef
834 | | | | | parent: 14:8eac370358ef
835 | | | | | user: test
835 | | | | | user: test
836 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
836 | | | | | date: Thu Jan 01 00:00:15 1970 +0000
837 | | | | | summary: (15) expand
837 | | | | | summary: (15) expand
838 | | | | |
838 | | | | |
839 | o-----+ changeset: 14:8eac370358ef
839 | o-----+ changeset: 14:8eac370358ef
840 | | | | | parent: 0:e6eb3150255d
840 | | | | | parent: 0:e6eb3150255d
841 | |/ / / parent: 12:86b91144a6e9
841 | |/ / / parent: 12:86b91144a6e9
842 | | | | user: test
842 | | | | user: test
843 | | | | date: Thu Jan 01 00:00:14 1970 +0000
843 | | | | date: Thu Jan 01 00:00:14 1970 +0000
844 | | | | summary: (14) merge two known; one immediate right, one far right
844 | | | | summary: (14) merge two known; one immediate right, one far right
845 | | | |
845 | | | |
846 o | | | changeset: 13:22d8966a97e3
846 o | | | changeset: 13:22d8966a97e3
847 |\ \ \ \ parent: 9:7010c0af0a35
847 |\ \ \ \ parent: 9:7010c0af0a35
848 | | | | | parent: 11:832d76e6bdf2
848 | | | | | parent: 11:832d76e6bdf2
849 | | | | | user: test
849 | | | | | user: test
850 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
850 | | | | | date: Thu Jan 01 00:00:13 1970 +0000
851 | | | | | summary: (13) expand
851 | | | | | summary: (13) expand
852 | | | | |
852 | | | | |
853 +---o | | changeset: 12:86b91144a6e9
853 +---o | | changeset: 12:86b91144a6e9
854 | | |/ / parent: 1:6db2ef61d156
854 | | |/ / parent: 1:6db2ef61d156
855 | | | | parent: 9:7010c0af0a35
855 | | | | parent: 9:7010c0af0a35
856 | | | | user: test
856 | | | | user: test
857 | | | | date: Thu Jan 01 00:00:12 1970 +0000
857 | | | | date: Thu Jan 01 00:00:12 1970 +0000
858 | | | | summary: (12) merge two known; one immediate right, one far left
858 | | | | summary: (12) merge two known; one immediate right, one far left
859 | | | |
859 | | | |
860 | o | | changeset: 11:832d76e6bdf2
860 | o | | changeset: 11:832d76e6bdf2
861 | |\ \ \ parent: 6:b105a072e251
861 | |\ \ \ parent: 6:b105a072e251
862 | | | | | parent: 10:74c64d036d72
862 | | | | | parent: 10:74c64d036d72
863 | | | | | user: test
863 | | | | | user: test
864 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
864 | | | | | date: Thu Jan 01 00:00:11 1970 +0000
865 | | | | | summary: (11) expand
865 | | | | | summary: (11) expand
866 | | | | |
866 | | | | |
867 | | o---+ changeset: 10:74c64d036d72
867 | | o---+ changeset: 10:74c64d036d72
868 | | | | | parent: 0:e6eb3150255d
868 | | | | | parent: 0:e6eb3150255d
869 | |/ / / parent: 6:b105a072e251
869 | |/ / / parent: 6:b105a072e251
870 | | | | user: test
870 | | | | user: test
871 | | | | date: Thu Jan 01 00:00:10 1970 +0000
871 | | | | date: Thu Jan 01 00:00:10 1970 +0000
872 | | | | summary: (10) merge two known; one immediate left, one near right
872 | | | | summary: (10) merge two known; one immediate left, one near right
873 | | | |
873 | | | |
874 o | | | changeset: 9:7010c0af0a35
874 o | | | changeset: 9:7010c0af0a35
875 |\ \ \ \ parent: 7:b632bb1b1224
875 |\ \ \ \ parent: 7:b632bb1b1224
876 | | | | | parent: 8:7a0b11f71937
876 | | | | | parent: 8:7a0b11f71937
877 | | | | | user: test
877 | | | | | user: test
878 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
878 | | | | | date: Thu Jan 01 00:00:09 1970 +0000
879 | | | | | summary: (9) expand
879 | | | | | summary: (9) expand
880 | | | | |
880 | | | | |
881 | o-----+ changeset: 8:7a0b11f71937
881 | o-----+ changeset: 8:7a0b11f71937
882 | | | | | parent: 0:e6eb3150255d
882 | | | | | parent: 0:e6eb3150255d
883 |/ / / / parent: 7:b632bb1b1224
883 |/ / / / parent: 7:b632bb1b1224
884 | | | | user: test
884 | | | | user: test
885 | | | | date: Thu Jan 01 00:00:08 1970 +0000
885 | | | | date: Thu Jan 01 00:00:08 1970 +0000
886 | | | | summary: (8) merge two known; one immediate left, one far right
886 | | | | summary: (8) merge two known; one immediate left, one far right
887 | | | |
887 | | | |
888 o | | | changeset: 7:b632bb1b1224
888 o | | | changeset: 7:b632bb1b1224
889 |\ \ \ \ parent: 2:3d9a33b8d1e1
889 |\ \ \ \ parent: 2:3d9a33b8d1e1
890 | | | | | parent: 5:4409d547b708
890 | | | | | parent: 5:4409d547b708
891 | | | | | user: test
891 | | | | | user: test
892 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
892 | | | | | date: Thu Jan 01 00:00:07 1970 +0000
893 | | | | | summary: (7) expand
893 | | | | | summary: (7) expand
894 | | | | |
894 | | | | |
895 +---o | | changeset: 6:b105a072e251
895 +---o | | changeset: 6:b105a072e251
896 | |/ / / parent: 2:3d9a33b8d1e1
896 | |/ / / parent: 2:3d9a33b8d1e1
897 | | | | parent: 5:4409d547b708
897 | | | | parent: 5:4409d547b708
898 | | | | user: test
898 | | | | user: test
899 | | | | date: Thu Jan 01 00:00:06 1970 +0000
899 | | | | date: Thu Jan 01 00:00:06 1970 +0000
900 | | | | summary: (6) merge two known; one immediate left, one far left
900 | | | | summary: (6) merge two known; one immediate left, one far left
901 | | | |
901 | | | |
902 | o | | changeset: 5:4409d547b708
902 | o | | changeset: 5:4409d547b708
903 | |\ \ \ parent: 3:27eef8ed80b4
903 | |\ \ \ parent: 3:27eef8ed80b4
904 | | | | | parent: 4:26a8bac39d9f
904 | | | | | parent: 4:26a8bac39d9f
905 | | | | | user: test
905 | | | | | user: test
906 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
906 | | | | | date: Thu Jan 01 00:00:05 1970 +0000
907 | | | | | summary: (5) expand
907 | | | | | summary: (5) expand
908 | | | | |
908 | | | | |
909 | | o | | changeset: 4:26a8bac39d9f
909 | | o | | changeset: 4:26a8bac39d9f
910 | |/|/ / parent: 1:6db2ef61d156
910 | |/|/ / parent: 1:6db2ef61d156
911 | | | | parent: 3:27eef8ed80b4
911 | | | | parent: 3:27eef8ed80b4
912 | | | | user: test
912 | | | | user: test
913 | | | | date: Thu Jan 01 00:00:04 1970 +0000
913 | | | | date: Thu Jan 01 00:00:04 1970 +0000
914 | | | | summary: (4) merge two known; one immediate left, one immediate right
914 | | | | summary: (4) merge two known; one immediate left, one immediate right
915 | | | |
915 | | | |
916 | o | | changeset: 3:27eef8ed80b4
916 | o | | changeset: 3:27eef8ed80b4
917 |/ / / user: test
917 |/ / / user: test
918 | | | date: Thu Jan 01 00:00:03 1970 +0000
918 | | | date: Thu Jan 01 00:00:03 1970 +0000
919 | | | summary: (3) collapse
919 | | | summary: (3) collapse
920 | | |
920 | | |
921 o | | changeset: 2:3d9a33b8d1e1
921 o | | changeset: 2:3d9a33b8d1e1
922 |/ / user: test
922 |/ / user: test
923 | | date: Thu Jan 01 00:00:02 1970 +0000
923 | | date: Thu Jan 01 00:00:02 1970 +0000
924 | | summary: (2) collapse
924 | | summary: (2) collapse
925 | |
925 | |
926 o | changeset: 1:6db2ef61d156
926 o | changeset: 1:6db2ef61d156
927 |/ user: test
927 |/ user: test
928 | date: Thu Jan 01 00:00:01 1970 +0000
928 | date: Thu Jan 01 00:00:01 1970 +0000
929 | summary: (1) collapse
929 | summary: (1) collapse
930 |
930 |
931 o changeset: 0:e6eb3150255d
931 o changeset: 0:e6eb3150255d
932 user: test
932 user: test
933 date: Thu Jan 01 00:00:00 1970 +0000
933 date: Thu Jan 01 00:00:00 1970 +0000
934 summary: (0) root
934 summary: (0) root
935
935
936
936
937
937
938 File glog per revset (only merges):
938 File glog per revset (only merges):
939
939
940 $ hg log -G -r 'file("a")' -m
940 $ hg log -G -r 'file("a")' -m
941 o changeset: 32:d06dffa21a31
941 o changeset: 32:d06dffa21a31
942 |\ parent: 27:886ed638191b
942 |\ parent: 27:886ed638191b
943 | | parent: 31:621d83e11f67
943 | | parent: 31:621d83e11f67
944 | | user: test
944 | | user: test
945 | | date: Thu Jan 01 00:00:32 1970 +0000
945 | | date: Thu Jan 01 00:00:32 1970 +0000
946 | | summary: (32) expand
946 | | summary: (32) expand
947 | |
947 | |
948 o | changeset: 31:621d83e11f67
948 o | changeset: 31:621d83e11f67
949 |\| parent: 21:d42a756af44d
949 |\| parent: 21:d42a756af44d
950 | | parent: 30:6e11cd4b648f
950 | | parent: 30:6e11cd4b648f
951 | | user: test
951 | | user: test
952 | | date: Thu Jan 01 00:00:31 1970 +0000
952 | | date: Thu Jan 01 00:00:31 1970 +0000
953 | | summary: (31) expand
953 | | summary: (31) expand
954 | |
954 | |
955 o | changeset: 30:6e11cd4b648f
955 o | changeset: 30:6e11cd4b648f
956 |\ \ parent: 28:44ecd0b9ae99
956 |\ \ parent: 28:44ecd0b9ae99
957 | | | parent: 29:cd9bb2be7593
957 | | | parent: 29:cd9bb2be7593
958 | | | user: test
958 | | | user: test
959 | | | date: Thu Jan 01 00:00:30 1970 +0000
959 | | | date: Thu Jan 01 00:00:30 1970 +0000
960 | | | summary: (30) expand
960 | | | summary: (30) expand
961 | | |
961 | | |
962 o | | changeset: 28:44ecd0b9ae99
962 o | | changeset: 28:44ecd0b9ae99
963 |\ \ \ parent: 1:6db2ef61d156
963 |\ \ \ parent: 1:6db2ef61d156
964 | | | | parent: 26:7f25b6c2f0b9
964 | | | | parent: 26:7f25b6c2f0b9
965 | | | | user: test
965 | | | | user: test
966 | | | | date: Thu Jan 01 00:00:28 1970 +0000
966 | | | | date: Thu Jan 01 00:00:28 1970 +0000
967 | | | | summary: (28) merge zero known
967 | | | | summary: (28) merge zero known
968 | | | |
968 | | | |
969 o | | | changeset: 26:7f25b6c2f0b9
969 o | | | changeset: 26:7f25b6c2f0b9
970 |\ \ \ \ parent: 18:1aa84d96232a
970 |\ \ \ \ parent: 18:1aa84d96232a
971 | | | | | parent: 25:91da8ed57247
971 | | | | | parent: 25:91da8ed57247
972 | | | | | user: test
972 | | | | | user: test
973 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
973 | | | | | date: Thu Jan 01 00:00:26 1970 +0000
974 | | | | | summary: (26) merge one known; far right
974 | | | | | summary: (26) merge one known; far right
975 | | | | |
975 | | | | |
976 | o-----+ changeset: 25:91da8ed57247
976 | o-----+ changeset: 25:91da8ed57247
977 | | | | | parent: 21:d42a756af44d
977 | | | | | parent: 21:d42a756af44d
978 | | | | | parent: 24:a9c19a3d96b7
978 | | | | | parent: 24:a9c19a3d96b7
979 | | | | | user: test
979 | | | | | user: test
980 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
980 | | | | | date: Thu Jan 01 00:00:25 1970 +0000
981 | | | | | summary: (25) merge one known; far left
981 | | | | | summary: (25) merge one known; far left
982 | | | | |
982 | | | | |
983 | o | | | changeset: 24:a9c19a3d96b7
983 | o | | | changeset: 24:a9c19a3d96b7
984 | |\ \ \ \ parent: 0:e6eb3150255d
984 | |\ \ \ \ parent: 0:e6eb3150255d
985 | | | | | | parent: 23:a01cddf0766d
985 | | | | | | parent: 23:a01cddf0766d
986 | | | | | | user: test
986 | | | | | | user: test
987 | | | | | | date: Thu Jan 01 00:00:24 1970 +0000
987 | | | | | | date: Thu Jan 01 00:00:24 1970 +0000
988 | | | | | | summary: (24) merge one known; immediate right
988 | | | | | | summary: (24) merge one known; immediate right
989 | | | | | |
989 | | | | | |
990 | o---+ | | changeset: 23:a01cddf0766d
990 | o---+ | | changeset: 23:a01cddf0766d
991 | | | | | | parent: 1:6db2ef61d156
991 | | | | | | parent: 1:6db2ef61d156
992 | | | | | | parent: 22:e0d9cccacb5d
992 | | | | | | parent: 22:e0d9cccacb5d
993 | | | | | | user: test
993 | | | | | | user: test
994 | | | | | | date: Thu Jan 01 00:00:23 1970 +0000
994 | | | | | | date: Thu Jan 01 00:00:23 1970 +0000
995 | | | | | | summary: (23) merge one known; immediate left
995 | | | | | | summary: (23) merge one known; immediate left
996 | | | | | |
996 | | | | | |
997 | o-------+ changeset: 22:e0d9cccacb5d
997 | o-------+ changeset: 22:e0d9cccacb5d
998 | | | | | | parent: 18:1aa84d96232a
998 | | | | | | parent: 18:1aa84d96232a
999 |/ / / / / parent: 21:d42a756af44d
999 |/ / / / / parent: 21:d42a756af44d
1000 | | | | | user: test
1000 | | | | | user: test
1001 | | | | | date: Thu Jan 01 00:00:22 1970 +0000
1001 | | | | | date: Thu Jan 01 00:00:22 1970 +0000
1002 | | | | | summary: (22) merge two known; one far left, one far right
1002 | | | | | summary: (22) merge two known; one far left, one far right
1003 | | | | |
1003 | | | | |
1004 | | | | o changeset: 21:d42a756af44d
1004 | | | | o changeset: 21:d42a756af44d
1005 | | | | |\ parent: 19:31ddc2c1573b
1005 | | | | |\ parent: 19:31ddc2c1573b
1006 | | | | | | parent: 20:d30ed6450e32
1006 | | | | | | parent: 20:d30ed6450e32
1007 | | | | | | user: test
1007 | | | | | | user: test
1008 | | | | | | date: Thu Jan 01 00:00:21 1970 +0000
1008 | | | | | | date: Thu Jan 01 00:00:21 1970 +0000
1009 | | | | | | summary: (21) expand
1009 | | | | | | summary: (21) expand
1010 | | | | | |
1010 | | | | | |
1011 +-+-------o changeset: 20:d30ed6450e32
1011 +-+-------o changeset: 20:d30ed6450e32
1012 | | | | | parent: 0:e6eb3150255d
1012 | | | | | parent: 0:e6eb3150255d
1013 | | | | | parent: 18:1aa84d96232a
1013 | | | | | parent: 18:1aa84d96232a
1014 | | | | | user: test
1014 | | | | | user: test
1015 | | | | | date: Thu Jan 01 00:00:20 1970 +0000
1015 | | | | | date: Thu Jan 01 00:00:20 1970 +0000
1016 | | | | | summary: (20) merge two known; two far right
1016 | | | | | summary: (20) merge two known; two far right
1017 | | | | |
1017 | | | | |
1018 | | | | o changeset: 19:31ddc2c1573b
1018 | | | | o changeset: 19:31ddc2c1573b
1019 | | | | |\ parent: 15:1dda3f72782d
1019 | | | | |\ parent: 15:1dda3f72782d
1020 | | | | | | parent: 17:44765d7c06e0
1020 | | | | | | parent: 17:44765d7c06e0
1021 | | | | | | user: test
1021 | | | | | | user: test
1022 | | | | | | date: Thu Jan 01 00:00:19 1970 +0000
1022 | | | | | | date: Thu Jan 01 00:00:19 1970 +0000
1023 | | | | | | summary: (19) expand
1023 | | | | | | summary: (19) expand
1024 | | | | | |
1024 | | | | | |
1025 o---+---+ | changeset: 18:1aa84d96232a
1025 o---+---+ | changeset: 18:1aa84d96232a
1026 | | | | | parent: 1:6db2ef61d156
1026 | | | | | parent: 1:6db2ef61d156
1027 / / / / / parent: 15:1dda3f72782d
1027 / / / / / parent: 15:1dda3f72782d
1028 | | | | | user: test
1028 | | | | | user: test
1029 | | | | | date: Thu Jan 01 00:00:18 1970 +0000
1029 | | | | | date: Thu Jan 01 00:00:18 1970 +0000
1030 | | | | | summary: (18) merge two known; two far left
1030 | | | | | summary: (18) merge two known; two far left
1031 | | | | |
1031 | | | | |
1032 | | | | o changeset: 17:44765d7c06e0
1032 | | | | o changeset: 17:44765d7c06e0
1033 | | | | |\ parent: 12:86b91144a6e9
1033 | | | | |\ parent: 12:86b91144a6e9
1034 | | | | | | parent: 16:3677d192927d
1034 | | | | | | parent: 16:3677d192927d
1035 | | | | | | user: test
1035 | | | | | | user: test
1036 | | | | | | date: Thu Jan 01 00:00:17 1970 +0000
1036 | | | | | | date: Thu Jan 01 00:00:17 1970 +0000
1037 | | | | | | summary: (17) expand
1037 | | | | | | summary: (17) expand
1038 | | | | | |
1038 | | | | | |
1039 +-+-------o changeset: 16:3677d192927d
1039 +-+-------o changeset: 16:3677d192927d
1040 | | | | | parent: 0:e6eb3150255d
1040 | | | | | parent: 0:e6eb3150255d
1041 | | | | | parent: 1:6db2ef61d156
1041 | | | | | parent: 1:6db2ef61d156
1042 | | | | | user: test
1042 | | | | | user: test
1043 | | | | | date: Thu Jan 01 00:00:16 1970 +0000
1043 | | | | | date: Thu Jan 01 00:00:16 1970 +0000
1044 | | | | | summary: (16) merge two known; one immediate right, one near right
1044 | | | | | summary: (16) merge two known; one immediate right, one near right
1045 | | | | |
1045 | | | | |
1046 | | | o | changeset: 15:1dda3f72782d
1046 | | | o | changeset: 15:1dda3f72782d
1047 | | | |\ \ parent: 13:22d8966a97e3
1047 | | | |\ \ parent: 13:22d8966a97e3
1048 | | | | | | parent: 14:8eac370358ef
1048 | | | | | | parent: 14:8eac370358ef
1049 | | | | | | user: test
1049 | | | | | | user: test
1050 | | | | | | date: Thu Jan 01 00:00:15 1970 +0000
1050 | | | | | | date: Thu Jan 01 00:00:15 1970 +0000
1051 | | | | | | summary: (15) expand
1051 | | | | | | summary: (15) expand
1052 | | | | | |
1052 | | | | | |
1053 +-------o | changeset: 14:8eac370358ef
1053 +-------o | changeset: 14:8eac370358ef
1054 | | | | |/ parent: 0:e6eb3150255d
1054 | | | | |/ parent: 0:e6eb3150255d
1055 | | | | | parent: 12:86b91144a6e9
1055 | | | | | parent: 12:86b91144a6e9
1056 | | | | | user: test
1056 | | | | | user: test
1057 | | | | | date: Thu Jan 01 00:00:14 1970 +0000
1057 | | | | | date: Thu Jan 01 00:00:14 1970 +0000
1058 | | | | | summary: (14) merge two known; one immediate right, one far right
1058 | | | | | summary: (14) merge two known; one immediate right, one far right
1059 | | | | |
1059 | | | | |
1060 | | | o | changeset: 13:22d8966a97e3
1060 | | | o | changeset: 13:22d8966a97e3
1061 | | | |\ \ parent: 9:7010c0af0a35
1061 | | | |\ \ parent: 9:7010c0af0a35
1062 | | | | | | parent: 11:832d76e6bdf2
1062 | | | | | | parent: 11:832d76e6bdf2
1063 | | | | | | user: test
1063 | | | | | | user: test
1064 | | | | | | date: Thu Jan 01 00:00:13 1970 +0000
1064 | | | | | | date: Thu Jan 01 00:00:13 1970 +0000
1065 | | | | | | summary: (13) expand
1065 | | | | | | summary: (13) expand
1066 | | | | | |
1066 | | | | | |
1067 | +---+---o changeset: 12:86b91144a6e9
1067 | +---+---o changeset: 12:86b91144a6e9
1068 | | | | | parent: 1:6db2ef61d156
1068 | | | | | parent: 1:6db2ef61d156
1069 | | | | | parent: 9:7010c0af0a35
1069 | | | | | parent: 9:7010c0af0a35
1070 | | | | | user: test
1070 | | | | | user: test
1071 | | | | | date: Thu Jan 01 00:00:12 1970 +0000
1071 | | | | | date: Thu Jan 01 00:00:12 1970 +0000
1072 | | | | | summary: (12) merge two known; one immediate right, one far left
1072 | | | | | summary: (12) merge two known; one immediate right, one far left
1073 | | | | |
1073 | | | | |
1074 | | | | o changeset: 11:832d76e6bdf2
1074 | | | | o changeset: 11:832d76e6bdf2
1075 | | | | |\ parent: 6:b105a072e251
1075 | | | | |\ parent: 6:b105a072e251
1076 | | | | | | parent: 10:74c64d036d72
1076 | | | | | | parent: 10:74c64d036d72
1077 | | | | | | user: test
1077 | | | | | | user: test
1078 | | | | | | date: Thu Jan 01 00:00:11 1970 +0000
1078 | | | | | | date: Thu Jan 01 00:00:11 1970 +0000
1079 | | | | | | summary: (11) expand
1079 | | | | | | summary: (11) expand
1080 | | | | | |
1080 | | | | | |
1081 +---------o changeset: 10:74c64d036d72
1081 +---------o changeset: 10:74c64d036d72
1082 | | | | |/ parent: 0:e6eb3150255d
1082 | | | | |/ parent: 0:e6eb3150255d
1083 | | | | | parent: 6:b105a072e251
1083 | | | | | parent: 6:b105a072e251
1084 | | | | | user: test
1084 | | | | | user: test
1085 | | | | | date: Thu Jan 01 00:00:10 1970 +0000
1085 | | | | | date: Thu Jan 01 00:00:10 1970 +0000
1086 | | | | | summary: (10) merge two known; one immediate left, one near right
1086 | | | | | summary: (10) merge two known; one immediate left, one near right
1087 | | | | |
1087 | | | | |
1088 | | | o | changeset: 9:7010c0af0a35
1088 | | | o | changeset: 9:7010c0af0a35
1089 | | | |\ \ parent: 7:b632bb1b1224
1089 | | | |\ \ parent: 7:b632bb1b1224
1090 | | | | | | parent: 8:7a0b11f71937
1090 | | | | | | parent: 8:7a0b11f71937
1091 | | | | | | user: test
1091 | | | | | | user: test
1092 | | | | | | date: Thu Jan 01 00:00:09 1970 +0000
1092 | | | | | | date: Thu Jan 01 00:00:09 1970 +0000
1093 | | | | | | summary: (9) expand
1093 | | | | | | summary: (9) expand
1094 | | | | | |
1094 | | | | | |
1095 +-------o | changeset: 8:7a0b11f71937
1095 +-------o | changeset: 8:7a0b11f71937
1096 | | | |/ / parent: 0:e6eb3150255d
1096 | | | |/ / parent: 0:e6eb3150255d
1097 | | | | | parent: 7:b632bb1b1224
1097 | | | | | parent: 7:b632bb1b1224
1098 | | | | | user: test
1098 | | | | | user: test
1099 | | | | | date: Thu Jan 01 00:00:08 1970 +0000
1099 | | | | | date: Thu Jan 01 00:00:08 1970 +0000
1100 | | | | | summary: (8) merge two known; one immediate left, one far right
1100 | | | | | summary: (8) merge two known; one immediate left, one far right
1101 | | | | |
1101 | | | | |
1102 | | | o | changeset: 7:b632bb1b1224
1102 | | | o | changeset: 7:b632bb1b1224
1103 | | | |\ \ parent: 2:3d9a33b8d1e1
1103 | | | |\ \ parent: 2:3d9a33b8d1e1
1104 | | | | | | parent: 5:4409d547b708
1104 | | | | | | parent: 5:4409d547b708
1105 | | | | | | user: test
1105 | | | | | | user: test
1106 | | | | | | date: Thu Jan 01 00:00:07 1970 +0000
1106 | | | | | | date: Thu Jan 01 00:00:07 1970 +0000
1107 | | | | | | summary: (7) expand
1107 | | | | | | summary: (7) expand
1108 | | | | | |
1108 | | | | | |
1109 | | | +---o changeset: 6:b105a072e251
1109 | | | +---o changeset: 6:b105a072e251
1110 | | | | |/ parent: 2:3d9a33b8d1e1
1110 | | | | |/ parent: 2:3d9a33b8d1e1
1111 | | | | | parent: 5:4409d547b708
1111 | | | | | parent: 5:4409d547b708
1112 | | | | | user: test
1112 | | | | | user: test
1113 | | | | | date: Thu Jan 01 00:00:06 1970 +0000
1113 | | | | | date: Thu Jan 01 00:00:06 1970 +0000
1114 | | | | | summary: (6) merge two known; one immediate left, one far left
1114 | | | | | summary: (6) merge two known; one immediate left, one far left
1115 | | | | |
1115 | | | | |
1116 | | | o | changeset: 5:4409d547b708
1116 | | | o | changeset: 5:4409d547b708
1117 | | | |\ \ parent: 3:27eef8ed80b4
1117 | | | |\ \ parent: 3:27eef8ed80b4
1118 | | | | | | parent: 4:26a8bac39d9f
1118 | | | | | | parent: 4:26a8bac39d9f
1119 | | | | | | user: test
1119 | | | | | | user: test
1120 | | | | | | date: Thu Jan 01 00:00:05 1970 +0000
1120 | | | | | | date: Thu Jan 01 00:00:05 1970 +0000
1121 | | | | | | summary: (5) expand
1121 | | | | | | summary: (5) expand
1122 | | | | | |
1122 | | | | | |
1123 | +---o | | changeset: 4:26a8bac39d9f
1123 | +---o | | changeset: 4:26a8bac39d9f
1124 | | | |/ / parent: 1:6db2ef61d156
1124 | | | |/ / parent: 1:6db2ef61d156
1125 | | | | | parent: 3:27eef8ed80b4
1125 | | | | | parent: 3:27eef8ed80b4
1126 | | | | | user: test
1126 | | | | | user: test
1127 | | | | | date: Thu Jan 01 00:00:04 1970 +0000
1127 | | | | | date: Thu Jan 01 00:00:04 1970 +0000
1128 | | | | | summary: (4) merge two known; one immediate left, one immediate right
1128 | | | | | summary: (4) merge two known; one immediate left, one immediate right
1129 | | | | |
1129 | | | | |
1130
1130
1131
1131
1132 Empty revision range - display nothing:
1132 Empty revision range - display nothing:
1133 $ hg log -G -r 1..0
1133 $ hg log -G -r 1..0
1134
1134
1135 $ cd ..
1135 $ cd ..
1136
1136
1137 #if no-outer-repo
1137 #if no-outer-repo
1138
1138
1139 From outer space:
1139 From outer space:
1140 $ hg log -G -l1 repo
1140 $ hg log -G -l1 repo
1141 @ changeset: 34:fea3ac5810e0
1141 @ changeset: 34:fea3ac5810e0
1142 | tag: tip
1142 | tag: tip
1143 | parent: 32:d06dffa21a31
1143 | parent: 32:d06dffa21a31
1144 | user: test
1144 | user: test
1145 | date: Thu Jan 01 00:00:34 1970 +0000
1145 | date: Thu Jan 01 00:00:34 1970 +0000
1146 | summary: (34) head
1146 | summary: (34) head
1147 |
1147 |
1148 $ hg log -G -l1 repo/a
1148 $ hg log -G -l1 repo/a
1149 @ changeset: 34:fea3ac5810e0
1149 @ changeset: 34:fea3ac5810e0
1150 | tag: tip
1150 | tag: tip
1151 | parent: 32:d06dffa21a31
1151 | parent: 32:d06dffa21a31
1152 | user: test
1152 | user: test
1153 | date: Thu Jan 01 00:00:34 1970 +0000
1153 | date: Thu Jan 01 00:00:34 1970 +0000
1154 | summary: (34) head
1154 | summary: (34) head
1155 |
1155 |
1156 $ hg log -G -l1 repo/missing
1156 $ hg log -G -l1 repo/missing
1157
1157
1158 #endif
1158 #endif
1159
1159
1160 File log with revs != cset revs:
1160 File log with revs != cset revs:
1161 $ hg init flog
1161 $ hg init flog
1162 $ cd flog
1162 $ cd flog
1163 $ echo one >one
1163 $ echo one >one
1164 $ hg add one
1164 $ hg add one
1165 $ hg commit -mone
1165 $ hg commit -mone
1166 $ echo two >two
1166 $ echo two >two
1167 $ hg add two
1167 $ hg add two
1168 $ hg commit -mtwo
1168 $ hg commit -mtwo
1169 $ echo more >two
1169 $ echo more >two
1170 $ hg commit -mmore
1170 $ hg commit -mmore
1171 $ hg log -G two
1171 $ hg log -G two
1172 @ changeset: 2:12c28321755b
1172 @ changeset: 2:12c28321755b
1173 | tag: tip
1173 | tag: tip
1174 | user: test
1174 | user: test
1175 | date: Thu Jan 01 00:00:00 1970 +0000
1175 | date: Thu Jan 01 00:00:00 1970 +0000
1176 | summary: more
1176 | summary: more
1177 |
1177 |
1178 o changeset: 1:5ac72c0599bf
1178 o changeset: 1:5ac72c0599bf
1179 | user: test
1179 | user: test
1180 | date: Thu Jan 01 00:00:00 1970 +0000
1180 | date: Thu Jan 01 00:00:00 1970 +0000
1181 | summary: two
1181 | summary: two
1182 |
1182 |
1183
1183
1184 Issue1896: File log with explicit style
1184 Issue1896: File log with explicit style
1185 $ hg log -G --style=default one
1185 $ hg log -G --style=default one
1186 o changeset: 0:3d578b4a1f53
1186 o changeset: 0:3d578b4a1f53
1187 user: test
1187 user: test
1188 date: Thu Jan 01 00:00:00 1970 +0000
1188 date: Thu Jan 01 00:00:00 1970 +0000
1189 summary: one
1189 summary: one
1190
1190
1191 Issue2395: glog --style header and footer
1191 Issue2395: glog --style header and footer
1192 $ hg log -G --style=xml one
1192 $ hg log -G --style=xml one
1193 <?xml version="1.0"?>
1193 <?xml version="1.0"?>
1194 <log>
1194 <log>
1195 o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
1195 o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
1196 <author email="test">test</author>
1196 <author email="test">test</author>
1197 <date>1970-01-01T00:00:00+00:00</date>
1197 <date>1970-01-01T00:00:00+00:00</date>
1198 <msg xml:space="preserve">one</msg>
1198 <msg xml:space="preserve">one</msg>
1199 </logentry>
1199 </logentry>
1200 </log>
1200 </log>
1201
1201
1202 $ cd ..
1202 $ cd ..
1203
1203
1204 Incoming and outgoing:
1204 Incoming and outgoing:
1205
1205
1206 $ hg clone -U -r31 repo repo2
1206 $ hg clone -U -r31 repo repo2
1207 adding changesets
1207 adding changesets
1208 adding manifests
1208 adding manifests
1209 adding file changes
1209 adding file changes
1210 added 31 changesets with 31 changes to 1 files
1210 added 31 changesets with 31 changes to 1 files
1211 $ cd repo2
1211 $ cd repo2
1212
1212
1213 $ hg incoming --graph ../repo
1213 $ hg incoming --graph ../repo
1214 comparing with ../repo
1214 comparing with ../repo
1215 searching for changes
1215 searching for changes
1216 o changeset: 34:fea3ac5810e0
1216 o changeset: 34:fea3ac5810e0
1217 | tag: tip
1217 | tag: tip
1218 | parent: 32:d06dffa21a31
1218 | parent: 32:d06dffa21a31
1219 | user: test
1219 | user: test
1220 | date: Thu Jan 01 00:00:34 1970 +0000
1220 | date: Thu Jan 01 00:00:34 1970 +0000
1221 | summary: (34) head
1221 | summary: (34) head
1222 |
1222 |
1223 | o changeset: 33:68608f5145f9
1223 | o changeset: 33:68608f5145f9
1224 | parent: 18:1aa84d96232a
1224 | parent: 18:1aa84d96232a
1225 | user: test
1225 | user: test
1226 | date: Thu Jan 01 00:00:33 1970 +0000
1226 | date: Thu Jan 01 00:00:33 1970 +0000
1227 | summary: (33) head
1227 | summary: (33) head
1228 |
1228 |
1229 o changeset: 32:d06dffa21a31
1229 o changeset: 32:d06dffa21a31
1230 | parent: 27:886ed638191b
1230 | parent: 27:886ed638191b
1231 | parent: 31:621d83e11f67
1231 | parent: 31:621d83e11f67
1232 | user: test
1232 | user: test
1233 | date: Thu Jan 01 00:00:32 1970 +0000
1233 | date: Thu Jan 01 00:00:32 1970 +0000
1234 | summary: (32) expand
1234 | summary: (32) expand
1235 |
1235 |
1236 o changeset: 27:886ed638191b
1236 o changeset: 27:886ed638191b
1237 parent: 21:d42a756af44d
1237 parent: 21:d42a756af44d
1238 user: test
1238 user: test
1239 date: Thu Jan 01 00:00:27 1970 +0000
1239 date: Thu Jan 01 00:00:27 1970 +0000
1240 summary: (27) collapse
1240 summary: (27) collapse
1241
1241
1242 $ cd ..
1242 $ cd ..
1243
1243
1244 $ hg -R repo outgoing --graph repo2
1244 $ hg -R repo outgoing --graph repo2
1245 comparing with repo2
1245 comparing with repo2
1246 searching for changes
1246 searching for changes
1247 @ changeset: 34:fea3ac5810e0
1247 @ changeset: 34:fea3ac5810e0
1248 | tag: tip
1248 | tag: tip
1249 | parent: 32:d06dffa21a31
1249 | parent: 32:d06dffa21a31
1250 | user: test
1250 | user: test
1251 | date: Thu Jan 01 00:00:34 1970 +0000
1251 | date: Thu Jan 01 00:00:34 1970 +0000
1252 | summary: (34) head
1252 | summary: (34) head
1253 |
1253 |
1254 | o changeset: 33:68608f5145f9
1254 | o changeset: 33:68608f5145f9
1255 | parent: 18:1aa84d96232a
1255 | parent: 18:1aa84d96232a
1256 | user: test
1256 | user: test
1257 | date: Thu Jan 01 00:00:33 1970 +0000
1257 | date: Thu Jan 01 00:00:33 1970 +0000
1258 | summary: (33) head
1258 | summary: (33) head
1259 |
1259 |
1260 o changeset: 32:d06dffa21a31
1260 o changeset: 32:d06dffa21a31
1261 | parent: 27:886ed638191b
1261 | parent: 27:886ed638191b
1262 | parent: 31:621d83e11f67
1262 | parent: 31:621d83e11f67
1263 | user: test
1263 | user: test
1264 | date: Thu Jan 01 00:00:32 1970 +0000
1264 | date: Thu Jan 01 00:00:32 1970 +0000
1265 | summary: (32) expand
1265 | summary: (32) expand
1266 |
1266 |
1267 o changeset: 27:886ed638191b
1267 o changeset: 27:886ed638191b
1268 parent: 21:d42a756af44d
1268 parent: 21:d42a756af44d
1269 user: test
1269 user: test
1270 date: Thu Jan 01 00:00:27 1970 +0000
1270 date: Thu Jan 01 00:00:27 1970 +0000
1271 summary: (27) collapse
1271 summary: (27) collapse
1272
1272
1273
1273
1274 File + limit with revs != cset revs:
1274 File + limit with revs != cset revs:
1275 $ cd repo
1275 $ cd repo
1276 $ touch b
1276 $ touch b
1277 $ hg ci -Aqm0
1277 $ hg ci -Aqm0
1278 $ hg log -G -l2 a
1278 $ hg log -G -l2 a
1279 o changeset: 34:fea3ac5810e0
1279 o changeset: 34:fea3ac5810e0
1280 | parent: 32:d06dffa21a31
1280 | parent: 32:d06dffa21a31
1281 | user: test
1281 | user: test
1282 | date: Thu Jan 01 00:00:34 1970 +0000
1282 | date: Thu Jan 01 00:00:34 1970 +0000
1283 | summary: (34) head
1283 | summary: (34) head
1284 |
1284 |
1285 | o changeset: 33:68608f5145f9
1285 | o changeset: 33:68608f5145f9
1286 | | parent: 18:1aa84d96232a
1286 | | parent: 18:1aa84d96232a
1287 | | user: test
1287 | | user: test
1288 | | date: Thu Jan 01 00:00:33 1970 +0000
1288 | | date: Thu Jan 01 00:00:33 1970 +0000
1289 | | summary: (33) head
1289 | | summary: (33) head
1290 | |
1290 | |
1291
1291
1292 File + limit + -ra:b, (b - a) < limit:
1292 File + limit + -ra:b, (b - a) < limit:
1293 $ hg log -G -l3000 -r32:tip a
1293 $ hg log -G -l3000 -r32:tip a
1294 o changeset: 34:fea3ac5810e0
1294 o changeset: 34:fea3ac5810e0
1295 | parent: 32:d06dffa21a31
1295 | parent: 32:d06dffa21a31
1296 | user: test
1296 | user: test
1297 | date: Thu Jan 01 00:00:34 1970 +0000
1297 | date: Thu Jan 01 00:00:34 1970 +0000
1298 | summary: (34) head
1298 | summary: (34) head
1299 |
1299 |
1300 | o changeset: 33:68608f5145f9
1300 | o changeset: 33:68608f5145f9
1301 | | parent: 18:1aa84d96232a
1301 | | parent: 18:1aa84d96232a
1302 | | user: test
1302 | | user: test
1303 | | date: Thu Jan 01 00:00:33 1970 +0000
1303 | | date: Thu Jan 01 00:00:33 1970 +0000
1304 | | summary: (33) head
1304 | | summary: (33) head
1305 | |
1305 | |
1306 o | changeset: 32:d06dffa21a31
1306 o | changeset: 32:d06dffa21a31
1307 |\ \ parent: 27:886ed638191b
1307 |\ \ parent: 27:886ed638191b
1308 | | | parent: 31:621d83e11f67
1308 | | | parent: 31:621d83e11f67
1309 | | | user: test
1309 | | | user: test
1310 | | | date: Thu Jan 01 00:00:32 1970 +0000
1310 | | | date: Thu Jan 01 00:00:32 1970 +0000
1311 | | | summary: (32) expand
1311 | | | summary: (32) expand
1312 | | |
1312 | | |
1313
1313
1314 Point out a common and an uncommon unshown parent
1314 Point out a common and an uncommon unshown parent
1315
1315
1316 $ hg log -G -r 'rev(8) or rev(9)'
1316 $ hg log -G -r 'rev(8) or rev(9)'
1317 o changeset: 9:7010c0af0a35
1317 o changeset: 9:7010c0af0a35
1318 |\ parent: 7:b632bb1b1224
1318 |\ parent: 7:b632bb1b1224
1319 | | parent: 8:7a0b11f71937
1319 | | parent: 8:7a0b11f71937
1320 | | user: test
1320 | | user: test
1321 | | date: Thu Jan 01 00:00:09 1970 +0000
1321 | | date: Thu Jan 01 00:00:09 1970 +0000
1322 | | summary: (9) expand
1322 | | summary: (9) expand
1323 | |
1323 | |
1324 o | changeset: 8:7a0b11f71937
1324 o | changeset: 8:7a0b11f71937
1325 |\| parent: 0:e6eb3150255d
1325 |\| parent: 0:e6eb3150255d
1326 | | parent: 7:b632bb1b1224
1326 | | parent: 7:b632bb1b1224
1327 | | user: test
1327 | | user: test
1328 | | date: Thu Jan 01 00:00:08 1970 +0000
1328 | | date: Thu Jan 01 00:00:08 1970 +0000
1329 | | summary: (8) merge two known; one immediate left, one far right
1329 | | summary: (8) merge two known; one immediate left, one far right
1330 | |
1330 | |
1331
1331
1332 File + limit + -ra:b, b < tip:
1332 File + limit + -ra:b, b < tip:
1333
1333
1334 $ hg log -G -l1 -r32:34 a
1334 $ hg log -G -l1 -r32:34 a
1335 o changeset: 34:fea3ac5810e0
1335 o changeset: 34:fea3ac5810e0
1336 | parent: 32:d06dffa21a31
1336 | parent: 32:d06dffa21a31
1337 | user: test
1337 | user: test
1338 | date: Thu Jan 01 00:00:34 1970 +0000
1338 | date: Thu Jan 01 00:00:34 1970 +0000
1339 | summary: (34) head
1339 | summary: (34) head
1340 |
1340 |
1341
1341
1342 file(File) + limit + -ra:b, b < tip:
1342 file(File) + limit + -ra:b, b < tip:
1343
1343
1344 $ hg log -G -l1 -r32:34 -r 'file("a")'
1344 $ hg log -G -l1 -r32:34 -r 'file("a")'
1345 o changeset: 34:fea3ac5810e0
1345 o changeset: 34:fea3ac5810e0
1346 | parent: 32:d06dffa21a31
1346 | parent: 32:d06dffa21a31
1347 | user: test
1347 | user: test
1348 | date: Thu Jan 01 00:00:34 1970 +0000
1348 | date: Thu Jan 01 00:00:34 1970 +0000
1349 | summary: (34) head
1349 | summary: (34) head
1350 |
1350 |
1351
1351
1352 limit(file(File) and a::b), b < tip:
1352 limit(file(File) and a::b), b < tip:
1353
1353
1354 $ hg log -G -r 'limit(file("a") and 32::34, 1)'
1354 $ hg log -G -r 'limit(file("a") and 32::34, 1)'
1355 o changeset: 32:d06dffa21a31
1355 o changeset: 32:d06dffa21a31
1356 |\ parent: 27:886ed638191b
1356 |\ parent: 27:886ed638191b
1357 | | parent: 31:621d83e11f67
1357 | | parent: 31:621d83e11f67
1358 | | user: test
1358 | | user: test
1359 | | date: Thu Jan 01 00:00:32 1970 +0000
1359 | | date: Thu Jan 01 00:00:32 1970 +0000
1360 | | summary: (32) expand
1360 | | summary: (32) expand
1361 | |
1361 | |
1362
1362
1363 File + limit + -ra:b, b < tip:
1363 File + limit + -ra:b, b < tip:
1364
1364
1365 $ hg log -G -r 'limit(file("a") and 34::32, 1)'
1365 $ hg log -G -r 'limit(file("a") and 34::32, 1)'
1366
1366
1367 File + limit + -ra:b, b < tip, (b - a) < limit:
1367 File + limit + -ra:b, b < tip, (b - a) < limit:
1368
1368
1369 $ hg log -G -l10 -r33:34 a
1369 $ hg log -G -l10 -r33:34 a
1370 o changeset: 34:fea3ac5810e0
1370 o changeset: 34:fea3ac5810e0
1371 | parent: 32:d06dffa21a31
1371 | parent: 32:d06dffa21a31
1372 | user: test
1372 | user: test
1373 | date: Thu Jan 01 00:00:34 1970 +0000
1373 | date: Thu Jan 01 00:00:34 1970 +0000
1374 | summary: (34) head
1374 | summary: (34) head
1375 |
1375 |
1376 | o changeset: 33:68608f5145f9
1376 | o changeset: 33:68608f5145f9
1377 | | parent: 18:1aa84d96232a
1377 | | parent: 18:1aa84d96232a
1378 | | user: test
1378 | | user: test
1379 | | date: Thu Jan 01 00:00:33 1970 +0000
1379 | | date: Thu Jan 01 00:00:33 1970 +0000
1380 | | summary: (33) head
1380 | | summary: (33) head
1381 | |
1381 | |
1382
1382
1383 Do not crash or produce strange graphs if history is buggy
1383 Do not crash or produce strange graphs if history is buggy
1384
1384
1385 $ hg branch branch
1385 $ hg branch branch
1386 marked working directory as branch branch
1386 marked working directory as branch branch
1387 (branches are permanent and global, did you want a bookmark?)
1387 (branches are permanent and global, did you want a bookmark?)
1388 $ commit 36 "buggy merge: identical parents" 35 35
1388 $ commit 36 "buggy merge: identical parents" 35 35
1389 $ hg log -G -l5
1389 $ hg log -G -l5
1390 @ changeset: 36:08a19a744424
1390 @ changeset: 36:08a19a744424
1391 | branch: branch
1391 | branch: branch
1392 | tag: tip
1392 | tag: tip
1393 | parent: 35:9159c3644c5e
1393 | parent: 35:9159c3644c5e
1394 | parent: 35:9159c3644c5e
1394 | parent: 35:9159c3644c5e
1395 | user: test
1395 | user: test
1396 | date: Thu Jan 01 00:00:36 1970 +0000
1396 | date: Thu Jan 01 00:00:36 1970 +0000
1397 | summary: (36) buggy merge: identical parents
1397 | summary: (36) buggy merge: identical parents
1398 |
1398 |
1399 o changeset: 35:9159c3644c5e
1399 o changeset: 35:9159c3644c5e
1400 | user: test
1400 | user: test
1401 | date: Thu Jan 01 00:00:00 1970 +0000
1401 | date: Thu Jan 01 00:00:00 1970 +0000
1402 | summary: 0
1402 | summary: 0
1403 |
1403 |
1404 o changeset: 34:fea3ac5810e0
1404 o changeset: 34:fea3ac5810e0
1405 | parent: 32:d06dffa21a31
1405 | parent: 32:d06dffa21a31
1406 | user: test
1406 | user: test
1407 | date: Thu Jan 01 00:00:34 1970 +0000
1407 | date: Thu Jan 01 00:00:34 1970 +0000
1408 | summary: (34) head
1408 | summary: (34) head
1409 |
1409 |
1410 | o changeset: 33:68608f5145f9
1410 | o changeset: 33:68608f5145f9
1411 | | parent: 18:1aa84d96232a
1411 | | parent: 18:1aa84d96232a
1412 | | user: test
1412 | | user: test
1413 | | date: Thu Jan 01 00:00:33 1970 +0000
1413 | | date: Thu Jan 01 00:00:33 1970 +0000
1414 | | summary: (33) head
1414 | | summary: (33) head
1415 | |
1415 | |
1416 o | changeset: 32:d06dffa21a31
1416 o | changeset: 32:d06dffa21a31
1417 |\ \ parent: 27:886ed638191b
1417 |\ \ parent: 27:886ed638191b
1418 | | | parent: 31:621d83e11f67
1418 | | | parent: 31:621d83e11f67
1419 | | | user: test
1419 | | | user: test
1420 | | | date: Thu Jan 01 00:00:32 1970 +0000
1420 | | | date: Thu Jan 01 00:00:32 1970 +0000
1421 | | | summary: (32) expand
1421 | | | summary: (32) expand
1422 | | |
1422 | | |
1423
1423
1424 Test log -G options
1424 Test log -G options
1425
1425
1426 $ testlog() {
1426 $ testlog() {
1427 > hg log -G --print-revset "$@"
1427 > hg log -G --print-revset "$@"
1428 > hg log --template 'nodetag {rev}\n' "$@" | grep nodetag \
1428 > hg log --template 'nodetag {rev}\n' "$@" | grep nodetag \
1429 > | sed 's/.*nodetag/nodetag/' > log.nodes
1429 > | sed 's/.*nodetag/nodetag/' > log.nodes
1430 > hg log -G --template 'nodetag {rev}\n' "$@" | grep nodetag \
1430 > hg log -G --template 'nodetag {rev}\n' "$@" | grep nodetag \
1431 > | sed 's/.*nodetag/nodetag/' > glog.nodes
1431 > | sed 's/.*nodetag/nodetag/' > glog.nodes
1432 > diff -u log.nodes glog.nodes | grep '^[-+@ ]' || :
1432 > diff -u log.nodes glog.nodes | grep '^[-+@ ]' || :
1433 > }
1433 > }
1434
1434
1435 glog always reorders nodes which explains the difference with log
1435 glog always reorders nodes which explains the difference with log
1436
1436
1437 $ testlog -r 27 -r 25 -r 21 -r 34 -r 32 -r 31
1437 $ testlog -r 27 -r 25 -r 21 -r 34 -r 32 -r 31
1438 ['27', '25', '21', '34', '32', '31']
1438 ['27', '25', '21', '34', '32', '31']
1439 []
1439 []
1440 --- log.nodes * (glob)
1440 --- log.nodes * (glob)
1441 +++ glog.nodes * (glob)
1441 +++ glog.nodes * (glob)
1442 @@ -1,6 +1,6 @@
1442 @@ -1,6 +1,6 @@
1443 -nodetag 27
1443 -nodetag 27
1444 -nodetag 25
1444 -nodetag 25
1445 -nodetag 21
1445 -nodetag 21
1446 nodetag 34
1446 nodetag 34
1447 nodetag 32
1447 nodetag 32
1448 nodetag 31
1448 nodetag 31
1449 +nodetag 27
1449 +nodetag 27
1450 +nodetag 25
1450 +nodetag 25
1451 +nodetag 21
1451 +nodetag 21
1452 $ testlog -u test -u not-a-user
1452 $ testlog -u test -u not-a-user
1453 []
1453 []
1454 (group
1454 (group
1455 (group
1455 (group
1456 (or
1456 (or
1457 (func
1457 (func
1458 ('symbol', 'user')
1458 ('symbol', 'user')
1459 ('string', 'test'))
1459 ('string', 'test'))
1460 (func
1460 (func
1461 ('symbol', 'user')
1461 ('symbol', 'user')
1462 ('string', 'not-a-user')))))
1462 ('string', 'not-a-user')))))
1463 $ testlog -b not-a-branch
1463 $ testlog -b not-a-branch
1464 abort: unknown revision 'not-a-branch'!
1464 abort: unknown revision 'not-a-branch'!
1465 abort: unknown revision 'not-a-branch'!
1465 abort: unknown revision 'not-a-branch'!
1466 abort: unknown revision 'not-a-branch'!
1466 abort: unknown revision 'not-a-branch'!
1467 $ testlog -b 35 -b 36 --only-branch branch
1467 $ testlog -b 35 -b 36 --only-branch branch
1468 []
1468 []
1469 (group
1469 (group
1470 (group
1470 (group
1471 (or
1471 (or
1472 (or
1472 (or
1473 (func
1473 (func
1474 ('symbol', 'branch')
1474 ('symbol', 'branch')
1475 ('string', 'default'))
1475 ('string', 'default'))
1476 (func
1476 (func
1477 ('symbol', 'branch')
1477 ('symbol', 'branch')
1478 ('string', 'branch')))
1478 ('string', 'branch')))
1479 (func
1479 (func
1480 ('symbol', 'branch')
1480 ('symbol', 'branch')
1481 ('string', 'branch')))))
1481 ('string', 'branch')))))
1482 $ testlog -k expand -k merge
1482 $ testlog -k expand -k merge
1483 []
1483 []
1484 (group
1484 (group
1485 (group
1485 (group
1486 (or
1486 (or
1487 (func
1487 (func
1488 ('symbol', 'keyword')
1488 ('symbol', 'keyword')
1489 ('string', 'expand'))
1489 ('string', 'expand'))
1490 (func
1490 (func
1491 ('symbol', 'keyword')
1491 ('symbol', 'keyword')
1492 ('string', 'merge')))))
1492 ('string', 'merge')))))
1493 $ testlog --only-merges
1493 $ testlog --only-merges
1494 []
1494 []
1495 (group
1495 (group
1496 (func
1496 (func
1497 ('symbol', 'merge')
1497 ('symbol', 'merge')
1498 None))
1498 None))
1499 $ testlog --no-merges
1499 $ testlog --no-merges
1500 []
1500 []
1501 (group
1501 (group
1502 (not
1502 (not
1503 (func
1503 (func
1504 ('symbol', 'merge')
1504 ('symbol', 'merge')
1505 None)))
1505 None)))
1506 $ testlog --date '2 0 to 4 0'
1506 $ testlog --date '2 0 to 4 0'
1507 []
1507 []
1508 (group
1508 (group
1509 (func
1509 (func
1510 ('symbol', 'date')
1510 ('symbol', 'date')
1511 ('string', '2 0 to 4 0')))
1511 ('string', '2 0 to 4 0')))
1512 $ hg log -G -d 'brace ) in a date'
1512 $ hg log -G -d 'brace ) in a date'
1513 abort: invalid date: 'brace ) in a date'
1513 abort: invalid date: 'brace ) in a date'
1514 [255]
1514 [255]
1515 $ testlog --prune 31 --prune 32
1515 $ testlog --prune 31 --prune 32
1516 []
1516 []
1517 (group
1517 (group
1518 (group
1518 (group
1519 (and
1519 (and
1520 (not
1520 (not
1521 (group
1521 (group
1522 (or
1522 (or
1523 ('string', '31')
1523 ('string', '31')
1524 (func
1524 (func
1525 ('symbol', 'ancestors')
1525 ('symbol', 'ancestors')
1526 ('string', '31')))))
1526 ('string', '31')))))
1527 (not
1527 (not
1528 (group
1528 (group
1529 (or
1529 (or
1530 ('string', '32')
1530 ('string', '32')
1531 (func
1531 (func
1532 ('symbol', 'ancestors')
1532 ('symbol', 'ancestors')
1533 ('string', '32'))))))))
1533 ('string', '32'))))))))
1534
1534
1535 Dedicated repo for --follow and paths filtering. The g is crafted to
1535 Dedicated repo for --follow and paths filtering. The g is crafted to
1536 have 2 filelog topological heads in a linear changeset graph.
1536 have 2 filelog topological heads in a linear changeset graph.
1537
1537
1538 $ cd ..
1538 $ cd ..
1539 $ hg init follow
1539 $ hg init follow
1540 $ cd follow
1540 $ cd follow
1541 $ testlog --follow
1541 $ testlog --follow
1542 []
1542 []
1543 []
1543 []
1544 $ testlog -rnull
1544 $ testlog -rnull
1545 ['null']
1545 ['null']
1546 []
1546 []
1547 $ echo a > a
1547 $ echo a > a
1548 $ echo aa > aa
1548 $ echo aa > aa
1549 $ echo f > f
1549 $ echo f > f
1550 $ hg ci -Am "add a" a aa f
1550 $ hg ci -Am "add a" a aa f
1551 $ hg cp a b
1551 $ hg cp a b
1552 $ hg cp f g
1552 $ hg cp f g
1553 $ hg ci -m "copy a b"
1553 $ hg ci -m "copy a b"
1554 $ mkdir dir
1554 $ mkdir dir
1555 $ hg mv b dir
1555 $ hg mv b dir
1556 $ echo g >> g
1556 $ echo g >> g
1557 $ echo f >> f
1557 $ echo f >> f
1558 $ hg ci -m "mv b dir/b"
1558 $ hg ci -m "mv b dir/b"
1559 $ hg mv a b
1559 $ hg mv a b
1560 $ hg cp -f f g
1560 $ hg cp -f f g
1561 $ echo a > d
1561 $ echo a > d
1562 $ hg add d
1562 $ hg add d
1563 $ hg ci -m "mv a b; add d"
1563 $ hg ci -m "mv a b; add d"
1564 $ hg mv dir/b e
1564 $ hg mv dir/b e
1565 $ hg ci -m "mv dir/b e"
1565 $ hg ci -m "mv dir/b e"
1566 $ hg log -G --template '({rev}) {desc|firstline}\n'
1566 $ hg log -G --template '({rev}) {desc|firstline}\n'
1567 @ (4) mv dir/b e
1567 @ (4) mv dir/b e
1568 |
1568 |
1569 o (3) mv a b; add d
1569 o (3) mv a b; add d
1570 |
1570 |
1571 o (2) mv b dir/b
1571 o (2) mv b dir/b
1572 |
1572 |
1573 o (1) copy a b
1573 o (1) copy a b
1574 |
1574 |
1575 o (0) add a
1575 o (0) add a
1576
1576
1577
1577
1578 $ testlog a
1578 $ testlog a
1579 []
1579 []
1580 (group
1580 (group
1581 (group
1581 (group
1582 (func
1582 (func
1583 ('symbol', 'filelog')
1583 ('symbol', 'filelog')
1584 ('string', 'a'))))
1584 ('string', 'a'))))
1585 $ testlog a b
1585 $ testlog a b
1586 []
1586 []
1587 (group
1587 (group
1588 (group
1588 (group
1589 (or
1589 (or
1590 (func
1590 (func
1591 ('symbol', 'filelog')
1591 ('symbol', 'filelog')
1592 ('string', 'a'))
1592 ('string', 'a'))
1593 (func
1593 (func
1594 ('symbol', 'filelog')
1594 ('symbol', 'filelog')
1595 ('string', 'b')))))
1595 ('string', 'b')))))
1596
1596
1597 Test falling back to slow path for non-existing files
1597 Test falling back to slow path for non-existing files
1598
1598
1599 $ testlog a c
1599 $ testlog a c
1600 []
1600 []
1601 (group
1601 (group
1602 (func
1602 (func
1603 ('symbol', '_matchfiles')
1603 ('symbol', '_matchfiles')
1604 (list
1604 (list
1605 (list
1605 (list
1606 (list
1606 (list
1607 ('string', 'r:')
1607 ('string', 'r:')
1608 ('string', 'd:relpath'))
1608 ('string', 'd:relpath'))
1609 ('string', 'p:a'))
1609 ('string', 'p:a'))
1610 ('string', 'p:c'))))
1610 ('string', 'p:c'))))
1611
1611
1612 Test multiple --include/--exclude/paths
1612 Test multiple --include/--exclude/paths
1613
1613
1614 $ testlog --include a --include e --exclude b --exclude e a e
1614 $ testlog --include a --include e --exclude b --exclude e a e
1615 []
1615 []
1616 (group
1616 (group
1617 (func
1617 (func
1618 ('symbol', '_matchfiles')
1618 ('symbol', '_matchfiles')
1619 (list
1619 (list
1620 (list
1620 (list
1621 (list
1621 (list
1622 (list
1622 (list
1623 (list
1623 (list
1624 (list
1624 (list
1625 (list
1625 (list
1626 ('string', 'r:')
1626 ('string', 'r:')
1627 ('string', 'd:relpath'))
1627 ('string', 'd:relpath'))
1628 ('string', 'p:a'))
1628 ('string', 'p:a'))
1629 ('string', 'p:e'))
1629 ('string', 'p:e'))
1630 ('string', 'i:a'))
1630 ('string', 'i:a'))
1631 ('string', 'i:e'))
1631 ('string', 'i:e'))
1632 ('string', 'x:b'))
1632 ('string', 'x:b'))
1633 ('string', 'x:e'))))
1633 ('string', 'x:e'))))
1634
1634
1635 Test glob expansion of pats
1635 Test glob expansion of pats
1636
1636
1637 $ expandglobs=`$PYTHON -c "import mercurial.util; \
1637 $ expandglobs=`$PYTHON -c "import mercurial.util; \
1638 > print mercurial.util.expandglobs and 'true' or 'false'"`
1638 > print mercurial.util.expandglobs and 'true' or 'false'"`
1639 $ if [ $expandglobs = "true" ]; then
1639 $ if [ $expandglobs = "true" ]; then
1640 > testlog 'a*';
1640 > testlog 'a*';
1641 > else
1641 > else
1642 > testlog a*;
1642 > testlog a*;
1643 > fi;
1643 > fi;
1644 []
1644 []
1645 (group
1645 (group
1646 (group
1646 (group
1647 (func
1647 (func
1648 ('symbol', 'filelog')
1648 ('symbol', 'filelog')
1649 ('string', 'aa'))))
1649 ('string', 'aa'))))
1650
1650
1651 Test --follow on a non-existent directory
1651 Test --follow on a non-existent directory
1652
1652
1653 $ testlog -f dir
1653 $ testlog -f dir
1654 abort: cannot follow file not in parent revision: "dir"
1654 abort: cannot follow file not in parent revision: "dir"
1655 abort: cannot follow file not in parent revision: "dir"
1655 abort: cannot follow file not in parent revision: "dir"
1656 abort: cannot follow file not in parent revision: "dir"
1656 abort: cannot follow file not in parent revision: "dir"
1657
1657
1658 Test --follow on a directory
1658 Test --follow on a directory
1659
1659
1660 $ hg up -q '.^'
1660 $ hg up -q '.^'
1661 $ testlog -f dir
1661 $ testlog -f dir
1662 []
1662 []
1663 (group
1663 (group
1664 (and
1664 (and
1665 (func
1665 (func
1666 ('symbol', 'ancestors')
1666 ('symbol', 'ancestors')
1667 ('symbol', '.'))
1667 ('symbol', '.'))
1668 (func
1668 (func
1669 ('symbol', '_matchfiles')
1669 ('symbol', '_matchfiles')
1670 (list
1670 (list
1671 (list
1671 (list
1672 ('string', 'r:')
1672 ('string', 'r:')
1673 ('string', 'd:relpath'))
1673 ('string', 'd:relpath'))
1674 ('string', 'p:dir')))))
1674 ('string', 'p:dir')))))
1675 $ hg up -q tip
1675 $ hg up -q tip
1676
1676
1677 Test --follow on file not in parent revision
1677 Test --follow on file not in parent revision
1678
1678
1679 $ testlog -f a
1679 $ testlog -f a
1680 abort: cannot follow file not in parent revision: "a"
1680 abort: cannot follow file not in parent revision: "a"
1681 abort: cannot follow file not in parent revision: "a"
1681 abort: cannot follow file not in parent revision: "a"
1682 abort: cannot follow file not in parent revision: "a"
1682 abort: cannot follow file not in parent revision: "a"
1683
1683
1684 Test --follow and patterns
1684 Test --follow and patterns
1685
1685
1686 $ testlog -f 'glob:*'
1686 $ testlog -f 'glob:*'
1687 []
1687 []
1688 (group
1688 (group
1689 (and
1689 (and
1690 (func
1690 (func
1691 ('symbol', 'ancestors')
1691 ('symbol', 'ancestors')
1692 ('symbol', '.'))
1692 ('symbol', '.'))
1693 (func
1693 (func
1694 ('symbol', '_matchfiles')
1694 ('symbol', '_matchfiles')
1695 (list
1695 (list
1696 (list
1696 (list
1697 ('string', 'r:')
1697 ('string', 'r:')
1698 ('string', 'd:relpath'))
1698 ('string', 'd:relpath'))
1699 ('string', 'p:glob:*')))))
1699 ('string', 'p:glob:*')))))
1700
1700
1701 Test --follow on a single rename
1701 Test --follow on a single rename
1702
1702
1703 $ hg up -q 2
1703 $ hg up -q 2
1704 $ testlog -f a
1704 $ testlog -f a
1705 []
1705 []
1706 (group
1706 (group
1707 (group
1707 (group
1708 (func
1708 (func
1709 ('symbol', 'follow')
1709 ('symbol', 'follow')
1710 ('string', 'a'))))
1710 ('string', 'a'))))
1711
1711
1712 Test --follow and multiple renames
1712 Test --follow and multiple renames
1713
1713
1714 $ hg up -q tip
1714 $ hg up -q tip
1715 $ testlog -f e
1715 $ testlog -f e
1716 []
1716 []
1717 (group
1717 (group
1718 (group
1718 (group
1719 (func
1719 (func
1720 ('symbol', 'follow')
1720 ('symbol', 'follow')
1721 ('string', 'e'))))
1721 ('string', 'e'))))
1722
1722
1723 Test --follow and multiple filelog heads
1723 Test --follow and multiple filelog heads
1724
1724
1725 $ hg up -q 2
1725 $ hg up -q 2
1726 $ testlog -f g
1726 $ testlog -f g
1727 []
1727 []
1728 (group
1728 (group
1729 (group
1729 (group
1730 (func
1730 (func
1731 ('symbol', 'follow')
1731 ('symbol', 'follow')
1732 ('string', 'g'))))
1732 ('string', 'g'))))
1733 $ cat log.nodes
1733 $ cat log.nodes
1734 nodetag 2
1734 nodetag 2
1735 nodetag 1
1735 nodetag 1
1736 nodetag 0
1736 nodetag 0
1737 $ hg up -q tip
1737 $ hg up -q tip
1738 $ testlog -f g
1738 $ testlog -f g
1739 []
1739 []
1740 (group
1740 (group
1741 (group
1741 (group
1742 (func
1742 (func
1743 ('symbol', 'follow')
1743 ('symbol', 'follow')
1744 ('string', 'g'))))
1744 ('string', 'g'))))
1745 $ cat log.nodes
1745 $ cat log.nodes
1746 nodetag 3
1746 nodetag 3
1747 nodetag 2
1747 nodetag 2
1748 nodetag 0
1748 nodetag 0
1749
1749
1750 Test --follow and multiple files
1750 Test --follow and multiple files
1751
1751
1752 $ testlog -f g e
1752 $ testlog -f g e
1753 []
1753 []
1754 (group
1754 (group
1755 (group
1755 (group
1756 (or
1756 (or
1757 (func
1757 (func
1758 ('symbol', 'follow')
1758 ('symbol', 'follow')
1759 ('string', 'g'))
1759 ('string', 'g'))
1760 (func
1760 (func
1761 ('symbol', 'follow')
1761 ('symbol', 'follow')
1762 ('string', 'e')))))
1762 ('string', 'e')))))
1763 $ cat log.nodes
1763 $ cat log.nodes
1764 nodetag 4
1764 nodetag 4
1765 nodetag 3
1765 nodetag 3
1766 nodetag 2
1766 nodetag 2
1767 nodetag 1
1767 nodetag 1
1768 nodetag 0
1768 nodetag 0
1769
1769
1770 Test --follow null parent
1770 Test --follow null parent
1771
1771
1772 $ hg up -q null
1772 $ hg up -q null
1773 $ testlog -f
1773 $ testlog -f
1774 []
1774 []
1775 []
1775 []
1776
1776
1777 Test --follow-first
1777 Test --follow-first
1778
1778
1779 $ hg up -q 3
1779 $ hg up -q 3
1780 $ echo ee > e
1780 $ echo ee > e
1781 $ hg ci -Am "add another e" e
1781 $ hg ci -Am "add another e" e
1782 created new head
1782 created new head
1783 $ hg merge --tool internal:other 4
1783 $ hg merge --tool internal:other 4
1784 0 files updated, 1 files merged, 1 files removed, 0 files unresolved
1784 0 files updated, 1 files merged, 1 files removed, 0 files unresolved
1785 (branch merge, don't forget to commit)
1785 (branch merge, don't forget to commit)
1786 $ echo merge > e
1786 $ echo merge > e
1787 $ hg ci -m "merge 5 and 4"
1787 $ hg ci -m "merge 5 and 4"
1788 $ testlog --follow-first
1788 $ testlog --follow-first
1789 []
1789 []
1790 (group
1790 (group
1791 (func
1791 (func
1792 ('symbol', '_firstancestors')
1792 ('symbol', '_firstancestors')
1793 (func
1793 (func
1794 ('symbol', 'rev')
1794 ('symbol', 'rev')
1795 ('symbol', '6'))))
1795 ('symbol', '6'))))
1796
1796
1797 Cannot compare with log --follow-first FILE as it never worked
1797 Cannot compare with log --follow-first FILE as it never worked
1798
1798
1799 $ hg log -G --print-revset --follow-first e
1799 $ hg log -G --print-revset --follow-first e
1800 []
1800 []
1801 (group
1801 (group
1802 (group
1802 (group
1803 (func
1803 (func
1804 ('symbol', '_followfirst')
1804 ('symbol', '_followfirst')
1805 ('string', 'e'))))
1805 ('string', 'e'))))
1806 $ hg log -G --follow-first e --template '{rev} {desc|firstline}\n'
1806 $ hg log -G --follow-first e --template '{rev} {desc|firstline}\n'
1807 @ 6 merge 5 and 4
1807 @ 6 merge 5 and 4
1808 |\
1808 |\
1809 o | 5 add another e
1809 o | 5 add another e
1810 | |
1810 | |
1811
1811
1812 Test --copies
1812 Test --copies
1813
1813
1814 $ hg log -G --copies --template "{rev} {desc|firstline} \
1814 $ hg log -G --copies --template "{rev} {desc|firstline} \
1815 > copies: {file_copies_switch}\n"
1815 > copies: {file_copies_switch}\n"
1816 @ 6 merge 5 and 4 copies:
1816 @ 6 merge 5 and 4 copies:
1817 |\
1817 |\
1818 | o 5 add another e copies:
1818 | o 5 add another e copies:
1819 | |
1819 | |
1820 o | 4 mv dir/b e copies: e (dir/b)
1820 o | 4 mv dir/b e copies: e (dir/b)
1821 |/
1821 |/
1822 o 3 mv a b; add d copies: b (a)g (f)
1822 o 3 mv a b; add d copies: b (a)g (f)
1823 |
1823 |
1824 o 2 mv b dir/b copies: dir/b (b)
1824 o 2 mv b dir/b copies: dir/b (b)
1825 |
1825 |
1826 o 1 copy a b copies: b (a)g (f)
1826 o 1 copy a b copies: b (a)g (f)
1827 |
1827 |
1828 o 0 add a copies:
1828 o 0 add a copies:
1829
1829
1830 Test "set:..." and parent revision
1830 Test "set:..." and parent revision
1831
1831
1832 $ hg up -q 4
1832 $ hg up -q 4
1833 $ testlog "set:copied()"
1833 $ testlog "set:copied()"
1834 []
1834 []
1835 (group
1835 (group
1836 (func
1836 (func
1837 ('symbol', '_matchfiles')
1837 ('symbol', '_matchfiles')
1838 (list
1838 (list
1839 (list
1839 (list
1840 ('string', 'r:')
1840 ('string', 'r:')
1841 ('string', 'd:relpath'))
1841 ('string', 'd:relpath'))
1842 ('string', 'p:set:copied()'))))
1842 ('string', 'p:set:copied()'))))
1843 $ testlog --include "set:copied()"
1843 $ testlog --include "set:copied()"
1844 []
1844 []
1845 (group
1845 (group
1846 (func
1846 (func
1847 ('symbol', '_matchfiles')
1847 ('symbol', '_matchfiles')
1848 (list
1848 (list
1849 (list
1849 (list
1850 ('string', 'r:')
1850 ('string', 'r:')
1851 ('string', 'd:relpath'))
1851 ('string', 'd:relpath'))
1852 ('string', 'i:set:copied()'))))
1852 ('string', 'i:set:copied()'))))
1853 $ testlog -r "sort(file('set:copied()'), -rev)"
1853 $ testlog -r "sort(file('set:copied()'), -rev)"
1854 ["sort(file('set:copied()'), -rev)"]
1854 ["sort(file('set:copied()'), -rev)"]
1855 []
1855 []
1856
1856
1857 Test --removed
1857 Test --removed
1858
1858
1859 $ testlog --removed
1859 $ testlog --removed
1860 []
1860 []
1861 []
1861 []
1862 $ testlog --removed a
1862 $ testlog --removed a
1863 []
1863 []
1864 (group
1864 (group
1865 (func
1865 (func
1866 ('symbol', '_matchfiles')
1866 ('symbol', '_matchfiles')
1867 (list
1867 (list
1868 (list
1868 (list
1869 ('string', 'r:')
1869 ('string', 'r:')
1870 ('string', 'd:relpath'))
1870 ('string', 'd:relpath'))
1871 ('string', 'p:a'))))
1871 ('string', 'p:a'))))
1872 $ testlog --removed --follow a
1872 $ testlog --removed --follow a
1873 []
1873 []
1874 (group
1874 (group
1875 (and
1875 (and
1876 (func
1876 (func
1877 ('symbol', 'ancestors')
1877 ('symbol', 'ancestors')
1878 ('symbol', '.'))
1878 ('symbol', '.'))
1879 (func
1879 (func
1880 ('symbol', '_matchfiles')
1880 ('symbol', '_matchfiles')
1881 (list
1881 (list
1882 (list
1882 (list
1883 ('string', 'r:')
1883 ('string', 'r:')
1884 ('string', 'd:relpath'))
1884 ('string', 'd:relpath'))
1885 ('string', 'p:a')))))
1885 ('string', 'p:a')))))
1886
1886
1887 Test --patch and --stat with --follow and --follow-first
1887 Test --patch and --stat with --follow and --follow-first
1888
1888
1889 $ hg up -q 3
1889 $ hg up -q 3
1890 $ hg log -G --git --patch b
1890 $ hg log -G --git --patch b
1891 o changeset: 1:216d4c92cf98
1891 o changeset: 1:216d4c92cf98
1892 | user: test
1892 | user: test
1893 | date: Thu Jan 01 00:00:00 1970 +0000
1893 | date: Thu Jan 01 00:00:00 1970 +0000
1894 | summary: copy a b
1894 | summary: copy a b
1895 |
1895 |
1896 | diff --git a/a b/b
1896 | diff --git a/a b/b
1897 | copy from a
1897 | copy from a
1898 | copy to b
1898 | copy to b
1899 |
1899 |
1900
1900
1901 $ hg log -G --git --stat b
1901 $ hg log -G --git --stat b
1902 o changeset: 1:216d4c92cf98
1902 o changeset: 1:216d4c92cf98
1903 | user: test
1903 | user: test
1904 | date: Thu Jan 01 00:00:00 1970 +0000
1904 | date: Thu Jan 01 00:00:00 1970 +0000
1905 | summary: copy a b
1905 | summary: copy a b
1906 |
1906 |
1907 | b | 0
1907 | b | 0
1908 | 1 files changed, 0 insertions(+), 0 deletions(-)
1908 | 1 files changed, 0 insertions(+), 0 deletions(-)
1909 |
1909 |
1910
1910
1911 $ hg log -G --git --patch --follow b
1911 $ hg log -G --git --patch --follow b
1912 o changeset: 1:216d4c92cf98
1912 o changeset: 1:216d4c92cf98
1913 | user: test
1913 | user: test
1914 | date: Thu Jan 01 00:00:00 1970 +0000
1914 | date: Thu Jan 01 00:00:00 1970 +0000
1915 | summary: copy a b
1915 | summary: copy a b
1916 |
1916 |
1917 | diff --git a/a b/b
1917 | diff --git a/a b/b
1918 | copy from a
1918 | copy from a
1919 | copy to b
1919 | copy to b
1920 |
1920 |
1921 o changeset: 0:f8035bb17114
1921 o changeset: 0:f8035bb17114
1922 user: test
1922 user: test
1923 date: Thu Jan 01 00:00:00 1970 +0000
1923 date: Thu Jan 01 00:00:00 1970 +0000
1924 summary: add a
1924 summary: add a
1925
1925
1926 diff --git a/a b/a
1926 diff --git a/a b/a
1927 new file mode 100644
1927 new file mode 100644
1928 --- /dev/null
1928 --- /dev/null
1929 +++ b/a
1929 +++ b/a
1930 @@ -0,0 +1,1 @@
1930 @@ -0,0 +1,1 @@
1931 +a
1931 +a
1932
1932
1933
1933
1934 $ hg log -G --git --stat --follow b
1934 $ hg log -G --git --stat --follow b
1935 o changeset: 1:216d4c92cf98
1935 o changeset: 1:216d4c92cf98
1936 | user: test
1936 | user: test
1937 | date: Thu Jan 01 00:00:00 1970 +0000
1937 | date: Thu Jan 01 00:00:00 1970 +0000
1938 | summary: copy a b
1938 | summary: copy a b
1939 |
1939 |
1940 | b | 0
1940 | b | 0
1941 | 1 files changed, 0 insertions(+), 0 deletions(-)
1941 | 1 files changed, 0 insertions(+), 0 deletions(-)
1942 |
1942 |
1943 o changeset: 0:f8035bb17114
1943 o changeset: 0:f8035bb17114
1944 user: test
1944 user: test
1945 date: Thu Jan 01 00:00:00 1970 +0000
1945 date: Thu Jan 01 00:00:00 1970 +0000
1946 summary: add a
1946 summary: add a
1947
1947
1948 a | 1 +
1948 a | 1 +
1949 1 files changed, 1 insertions(+), 0 deletions(-)
1949 1 files changed, 1 insertions(+), 0 deletions(-)
1950
1950
1951
1951
1952 $ hg up -q 6
1952 $ hg up -q 6
1953 $ hg log -G --git --patch --follow-first e
1953 $ hg log -G --git --patch --follow-first e
1954 @ changeset: 6:fc281d8ff18d
1954 @ changeset: 6:fc281d8ff18d
1955 |\ tag: tip
1955 |\ tag: tip
1956 | | parent: 5:99b31f1c2782
1956 | | parent: 5:99b31f1c2782
1957 | | parent: 4:17d952250a9d
1957 | | parent: 4:17d952250a9d
1958 | | user: test
1958 | | user: test
1959 | | date: Thu Jan 01 00:00:00 1970 +0000
1959 | | date: Thu Jan 01 00:00:00 1970 +0000
1960 | | summary: merge 5 and 4
1960 | | summary: merge 5 and 4
1961 | |
1961 | |
1962 | | diff --git a/e b/e
1962 | | diff --git a/e b/e
1963 | | --- a/e
1963 | | --- a/e
1964 | | +++ b/e
1964 | | +++ b/e
1965 | | @@ -1,1 +1,1 @@
1965 | | @@ -1,1 +1,1 @@
1966 | | -ee
1966 | | -ee
1967 | | +merge
1967 | | +merge
1968 | |
1968 | |
1969 o | changeset: 5:99b31f1c2782
1969 o | changeset: 5:99b31f1c2782
1970 | | parent: 3:5918b8d165d1
1970 | | parent: 3:5918b8d165d1
1971 | | user: test
1971 | | user: test
1972 | | date: Thu Jan 01 00:00:00 1970 +0000
1972 | | date: Thu Jan 01 00:00:00 1970 +0000
1973 | | summary: add another e
1973 | | summary: add another e
1974 | |
1974 | |
1975 | | diff --git a/e b/e
1975 | | diff --git a/e b/e
1976 | | new file mode 100644
1976 | | new file mode 100644
1977 | | --- /dev/null
1977 | | --- /dev/null
1978 | | +++ b/e
1978 | | +++ b/e
1979 | | @@ -0,0 +1,1 @@
1979 | | @@ -0,0 +1,1 @@
1980 | | +ee
1980 | | +ee
1981 | |
1981 | |
1982
1982
1983 Test old-style --rev
1983 Test old-style --rev
1984
1984
1985 $ hg tag 'foo-bar'
1985 $ hg tag 'foo-bar'
1986 $ testlog -r 'foo-bar'
1986 $ testlog -r 'foo-bar'
1987 ['foo-bar']
1987 ['foo-bar']
1988 []
1988 []
1989
1989
1990 Test --follow and forward --rev
1990 Test --follow and forward --rev
1991
1991
1992 $ hg up -q 6
1992 $ hg up -q 6
1993 $ echo g > g
1993 $ echo g > g
1994 $ hg ci -Am 'add g' g
1994 $ hg ci -Am 'add g' g
1995 created new head
1995 created new head
1996 $ hg up -q 2
1996 $ hg up -q 2
1997 $ hg log -G --template "{rev} {desc|firstline}\n"
1997 $ hg log -G --template "{rev} {desc|firstline}\n"
1998 o 8 add g
1998 o 8 add g
1999 |
1999 |
2000 | o 7 Added tag foo-bar for changeset fc281d8ff18d
2000 | o 7 Added tag foo-bar for changeset fc281d8ff18d
2001 |/
2001 |/
2002 o 6 merge 5 and 4
2002 o 6 merge 5 and 4
2003 |\
2003 |\
2004 | o 5 add another e
2004 | o 5 add another e
2005 | |
2005 | |
2006 o | 4 mv dir/b e
2006 o | 4 mv dir/b e
2007 |/
2007 |/
2008 o 3 mv a b; add d
2008 o 3 mv a b; add d
2009 |
2009 |
2010 @ 2 mv b dir/b
2010 @ 2 mv b dir/b
2011 |
2011 |
2012 o 1 copy a b
2012 o 1 copy a b
2013 |
2013 |
2014 o 0 add a
2014 o 0 add a
2015
2015
2016 $ hg export 'all()'
2016 $ hg export 'all()'
2017 # HG changeset patch
2017 # HG changeset patch
2018 # User test
2018 # User test
2019 # Date 0 0
2019 # Date 0 0
2020 # Thu Jan 01 00:00:00 1970 +0000
2020 # Thu Jan 01 00:00:00 1970 +0000
2021 # Node ID f8035bb17114da16215af3436ec5222428ace8ee
2021 # Node ID f8035bb17114da16215af3436ec5222428ace8ee
2022 # Parent 0000000000000000000000000000000000000000
2022 # Parent 0000000000000000000000000000000000000000
2023 add a
2023 add a
2024
2024
2025 diff -r 000000000000 -r f8035bb17114 a
2025 diff -r 000000000000 -r f8035bb17114 a
2026 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2026 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2027 +++ b/a Thu Jan 01 00:00:00 1970 +0000
2027 +++ b/a Thu Jan 01 00:00:00 1970 +0000
2028 @@ -0,0 +1,1 @@
2028 @@ -0,0 +1,1 @@
2029 +a
2029 +a
2030 diff -r 000000000000 -r f8035bb17114 aa
2030 diff -r 000000000000 -r f8035bb17114 aa
2031 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2031 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2032 +++ b/aa Thu Jan 01 00:00:00 1970 +0000
2032 +++ b/aa Thu Jan 01 00:00:00 1970 +0000
2033 @@ -0,0 +1,1 @@
2033 @@ -0,0 +1,1 @@
2034 +aa
2034 +aa
2035 diff -r 000000000000 -r f8035bb17114 f
2035 diff -r 000000000000 -r f8035bb17114 f
2036 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2036 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2037 +++ b/f Thu Jan 01 00:00:00 1970 +0000
2037 +++ b/f Thu Jan 01 00:00:00 1970 +0000
2038 @@ -0,0 +1,1 @@
2038 @@ -0,0 +1,1 @@
2039 +f
2039 +f
2040 # HG changeset patch
2040 # HG changeset patch
2041 # User test
2041 # User test
2042 # Date 0 0
2042 # Date 0 0
2043 # Thu Jan 01 00:00:00 1970 +0000
2043 # Thu Jan 01 00:00:00 1970 +0000
2044 # Node ID 216d4c92cf98ff2b4641d508b76b529f3d424c92
2044 # Node ID 216d4c92cf98ff2b4641d508b76b529f3d424c92
2045 # Parent f8035bb17114da16215af3436ec5222428ace8ee
2045 # Parent f8035bb17114da16215af3436ec5222428ace8ee
2046 copy a b
2046 copy a b
2047
2047
2048 diff -r f8035bb17114 -r 216d4c92cf98 b
2048 diff -r f8035bb17114 -r 216d4c92cf98 b
2049 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2049 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2050 +++ b/b Thu Jan 01 00:00:00 1970 +0000
2050 +++ b/b Thu Jan 01 00:00:00 1970 +0000
2051 @@ -0,0 +1,1 @@
2051 @@ -0,0 +1,1 @@
2052 +a
2052 +a
2053 diff -r f8035bb17114 -r 216d4c92cf98 g
2053 diff -r f8035bb17114 -r 216d4c92cf98 g
2054 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2054 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2055 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2055 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2056 @@ -0,0 +1,1 @@
2056 @@ -0,0 +1,1 @@
2057 +f
2057 +f
2058 # HG changeset patch
2058 # HG changeset patch
2059 # User test
2059 # User test
2060 # Date 0 0
2060 # Date 0 0
2061 # Thu Jan 01 00:00:00 1970 +0000
2061 # Thu Jan 01 00:00:00 1970 +0000
2062 # Node ID bb573313a9e8349099b6ea2b2fb1fc7f424446f3
2062 # Node ID bb573313a9e8349099b6ea2b2fb1fc7f424446f3
2063 # Parent 216d4c92cf98ff2b4641d508b76b529f3d424c92
2063 # Parent 216d4c92cf98ff2b4641d508b76b529f3d424c92
2064 mv b dir/b
2064 mv b dir/b
2065
2065
2066 diff -r 216d4c92cf98 -r bb573313a9e8 b
2066 diff -r 216d4c92cf98 -r bb573313a9e8 b
2067 --- a/b Thu Jan 01 00:00:00 1970 +0000
2067 --- a/b Thu Jan 01 00:00:00 1970 +0000
2068 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2068 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2069 @@ -1,1 +0,0 @@
2069 @@ -1,1 +0,0 @@
2070 -a
2070 -a
2071 diff -r 216d4c92cf98 -r bb573313a9e8 dir/b
2071 diff -r 216d4c92cf98 -r bb573313a9e8 dir/b
2072 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2072 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2073 +++ b/dir/b Thu Jan 01 00:00:00 1970 +0000
2073 +++ b/dir/b Thu Jan 01 00:00:00 1970 +0000
2074 @@ -0,0 +1,1 @@
2074 @@ -0,0 +1,1 @@
2075 +a
2075 +a
2076 diff -r 216d4c92cf98 -r bb573313a9e8 f
2076 diff -r 216d4c92cf98 -r bb573313a9e8 f
2077 --- a/f Thu Jan 01 00:00:00 1970 +0000
2077 --- a/f Thu Jan 01 00:00:00 1970 +0000
2078 +++ b/f Thu Jan 01 00:00:00 1970 +0000
2078 +++ b/f Thu Jan 01 00:00:00 1970 +0000
2079 @@ -1,1 +1,2 @@
2079 @@ -1,1 +1,2 @@
2080 f
2080 f
2081 +f
2081 +f
2082 diff -r 216d4c92cf98 -r bb573313a9e8 g
2082 diff -r 216d4c92cf98 -r bb573313a9e8 g
2083 --- a/g Thu Jan 01 00:00:00 1970 +0000
2083 --- a/g Thu Jan 01 00:00:00 1970 +0000
2084 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2084 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2085 @@ -1,1 +1,2 @@
2085 @@ -1,1 +1,2 @@
2086 f
2086 f
2087 +g
2087 +g
2088 # HG changeset patch
2088 # HG changeset patch
2089 # User test
2089 # User test
2090 # Date 0 0
2090 # Date 0 0
2091 # Thu Jan 01 00:00:00 1970 +0000
2091 # Thu Jan 01 00:00:00 1970 +0000
2092 # Node ID 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2092 # Node ID 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2093 # Parent bb573313a9e8349099b6ea2b2fb1fc7f424446f3
2093 # Parent bb573313a9e8349099b6ea2b2fb1fc7f424446f3
2094 mv a b; add d
2094 mv a b; add d
2095
2095
2096 diff -r bb573313a9e8 -r 5918b8d165d1 a
2096 diff -r bb573313a9e8 -r 5918b8d165d1 a
2097 --- a/a Thu Jan 01 00:00:00 1970 +0000
2097 --- a/a Thu Jan 01 00:00:00 1970 +0000
2098 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2098 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2099 @@ -1,1 +0,0 @@
2099 @@ -1,1 +0,0 @@
2100 -a
2100 -a
2101 diff -r bb573313a9e8 -r 5918b8d165d1 b
2101 diff -r bb573313a9e8 -r 5918b8d165d1 b
2102 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2102 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2103 +++ b/b Thu Jan 01 00:00:00 1970 +0000
2103 +++ b/b Thu Jan 01 00:00:00 1970 +0000
2104 @@ -0,0 +1,1 @@
2104 @@ -0,0 +1,1 @@
2105 +a
2105 +a
2106 diff -r bb573313a9e8 -r 5918b8d165d1 d
2106 diff -r bb573313a9e8 -r 5918b8d165d1 d
2107 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2107 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2108 +++ b/d Thu Jan 01 00:00:00 1970 +0000
2108 +++ b/d Thu Jan 01 00:00:00 1970 +0000
2109 @@ -0,0 +1,1 @@
2109 @@ -0,0 +1,1 @@
2110 +a
2110 +a
2111 diff -r bb573313a9e8 -r 5918b8d165d1 g
2111 diff -r bb573313a9e8 -r 5918b8d165d1 g
2112 --- a/g Thu Jan 01 00:00:00 1970 +0000
2112 --- a/g Thu Jan 01 00:00:00 1970 +0000
2113 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2113 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2114 @@ -1,2 +1,2 @@
2114 @@ -1,2 +1,2 @@
2115 f
2115 f
2116 -g
2116 -g
2117 +f
2117 +f
2118 # HG changeset patch
2118 # HG changeset patch
2119 # User test
2119 # User test
2120 # Date 0 0
2120 # Date 0 0
2121 # Thu Jan 01 00:00:00 1970 +0000
2121 # Thu Jan 01 00:00:00 1970 +0000
2122 # Node ID 17d952250a9d03cc3dc77b199ab60e959b9b0260
2122 # Node ID 17d952250a9d03cc3dc77b199ab60e959b9b0260
2123 # Parent 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2123 # Parent 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2124 mv dir/b e
2124 mv dir/b e
2125
2125
2126 diff -r 5918b8d165d1 -r 17d952250a9d dir/b
2126 diff -r 5918b8d165d1 -r 17d952250a9d dir/b
2127 --- a/dir/b Thu Jan 01 00:00:00 1970 +0000
2127 --- a/dir/b Thu Jan 01 00:00:00 1970 +0000
2128 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2128 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2129 @@ -1,1 +0,0 @@
2129 @@ -1,1 +0,0 @@
2130 -a
2130 -a
2131 diff -r 5918b8d165d1 -r 17d952250a9d e
2131 diff -r 5918b8d165d1 -r 17d952250a9d e
2132 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2132 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2133 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2133 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2134 @@ -0,0 +1,1 @@
2134 @@ -0,0 +1,1 @@
2135 +a
2135 +a
2136 # HG changeset patch
2136 # HG changeset patch
2137 # User test
2137 # User test
2138 # Date 0 0
2138 # Date 0 0
2139 # Thu Jan 01 00:00:00 1970 +0000
2139 # Thu Jan 01 00:00:00 1970 +0000
2140 # Node ID 99b31f1c2782e2deb1723cef08930f70fc84b37b
2140 # Node ID 99b31f1c2782e2deb1723cef08930f70fc84b37b
2141 # Parent 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2141 # Parent 5918b8d165d1364e78a66d02e66caa0133c5d1ed
2142 add another e
2142 add another e
2143
2143
2144 diff -r 5918b8d165d1 -r 99b31f1c2782 e
2144 diff -r 5918b8d165d1 -r 99b31f1c2782 e
2145 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2145 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2146 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2146 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2147 @@ -0,0 +1,1 @@
2147 @@ -0,0 +1,1 @@
2148 +ee
2148 +ee
2149 # HG changeset patch
2149 # HG changeset patch
2150 # User test
2150 # User test
2151 # Date 0 0
2151 # Date 0 0
2152 # Thu Jan 01 00:00:00 1970 +0000
2152 # Thu Jan 01 00:00:00 1970 +0000
2153 # Node ID fc281d8ff18d999ad6497b3d27390bcd695dcc73
2153 # Node ID fc281d8ff18d999ad6497b3d27390bcd695dcc73
2154 # Parent 99b31f1c2782e2deb1723cef08930f70fc84b37b
2154 # Parent 99b31f1c2782e2deb1723cef08930f70fc84b37b
2155 # Parent 17d952250a9d03cc3dc77b199ab60e959b9b0260
2155 # Parent 17d952250a9d03cc3dc77b199ab60e959b9b0260
2156 merge 5 and 4
2156 merge 5 and 4
2157
2157
2158 diff -r 99b31f1c2782 -r fc281d8ff18d dir/b
2158 diff -r 99b31f1c2782 -r fc281d8ff18d dir/b
2159 --- a/dir/b Thu Jan 01 00:00:00 1970 +0000
2159 --- a/dir/b Thu Jan 01 00:00:00 1970 +0000
2160 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2160 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
2161 @@ -1,1 +0,0 @@
2161 @@ -1,1 +0,0 @@
2162 -a
2162 -a
2163 diff -r 99b31f1c2782 -r fc281d8ff18d e
2163 diff -r 99b31f1c2782 -r fc281d8ff18d e
2164 --- a/e Thu Jan 01 00:00:00 1970 +0000
2164 --- a/e Thu Jan 01 00:00:00 1970 +0000
2165 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2165 +++ b/e Thu Jan 01 00:00:00 1970 +0000
2166 @@ -1,1 +1,1 @@
2166 @@ -1,1 +1,1 @@
2167 -ee
2167 -ee
2168 +merge
2168 +merge
2169 # HG changeset patch
2169 # HG changeset patch
2170 # User test
2170 # User test
2171 # Date 0 0
2171 # Date 0 0
2172 # Thu Jan 01 00:00:00 1970 +0000
2172 # Thu Jan 01 00:00:00 1970 +0000
2173 # Node ID 02dbb8e276b8ab7abfd07cab50c901647e75c2dd
2173 # Node ID 02dbb8e276b8ab7abfd07cab50c901647e75c2dd
2174 # Parent fc281d8ff18d999ad6497b3d27390bcd695dcc73
2174 # Parent fc281d8ff18d999ad6497b3d27390bcd695dcc73
2175 Added tag foo-bar for changeset fc281d8ff18d
2175 Added tag foo-bar for changeset fc281d8ff18d
2176
2176
2177 diff -r fc281d8ff18d -r 02dbb8e276b8 .hgtags
2177 diff -r fc281d8ff18d -r 02dbb8e276b8 .hgtags
2178 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2178 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2179 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2179 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2180 @@ -0,0 +1,1 @@
2180 @@ -0,0 +1,1 @@
2181 +fc281d8ff18d999ad6497b3d27390bcd695dcc73 foo-bar
2181 +fc281d8ff18d999ad6497b3d27390bcd695dcc73 foo-bar
2182 # HG changeset patch
2182 # HG changeset patch
2183 # User test
2183 # User test
2184 # Date 0 0
2184 # Date 0 0
2185 # Thu Jan 01 00:00:00 1970 +0000
2185 # Thu Jan 01 00:00:00 1970 +0000
2186 # Node ID 24c2e826ddebf80f9dcd60b856bdb8e6715c5449
2186 # Node ID 24c2e826ddebf80f9dcd60b856bdb8e6715c5449
2187 # Parent fc281d8ff18d999ad6497b3d27390bcd695dcc73
2187 # Parent fc281d8ff18d999ad6497b3d27390bcd695dcc73
2188 add g
2188 add g
2189
2189
2190 diff -r fc281d8ff18d -r 24c2e826ddeb g
2190 diff -r fc281d8ff18d -r 24c2e826ddeb g
2191 --- a/g Thu Jan 01 00:00:00 1970 +0000
2191 --- a/g Thu Jan 01 00:00:00 1970 +0000
2192 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2192 +++ b/g Thu Jan 01 00:00:00 1970 +0000
2193 @@ -1,2 +1,1 @@
2193 @@ -1,2 +1,1 @@
2194 -f
2194 -f
2195 -f
2195 -f
2196 +g
2196 +g
2197 $ testlog --follow -r6 -r8 -r5 -r7 -r4
2197 $ testlog --follow -r6 -r8 -r5 -r7 -r4
2198 ['6', '8', '5', '7', '4']
2198 ['6', '8', '5', '7', '4']
2199 (group
2199 (group
2200 (func
2200 (func
2201 ('symbol', 'descendants')
2201 ('symbol', 'descendants')
2202 (func
2202 (func
2203 ('symbol', 'rev')
2203 ('symbol', 'rev')
2204 ('symbol', '6'))))
2204 ('symbol', '6'))))
2205 --- log.nodes * (glob)
2206 +++ glog.nodes * (glob)
2207 @@ -1,3 +1,3 @@
2208 -nodetag 6
2209 nodetag 8
2210 nodetag 7
2211 +nodetag 6
2212
2205
2213 Test --follow-first and forward --rev
2206 Test --follow-first and forward --rev
2214
2207
2215 $ testlog --follow-first -r6 -r8 -r5 -r7 -r4
2208 $ testlog --follow-first -r6 -r8 -r5 -r7 -r4
2216 ['6', '8', '5', '7', '4']
2209 ['6', '8', '5', '7', '4']
2217 (group
2210 (group
2218 (func
2211 (func
2219 ('symbol', '_firstdescendants')
2212 ('symbol', '_firstdescendants')
2220 (func
2213 (func
2221 ('symbol', 'rev')
2214 ('symbol', 'rev')
2222 ('symbol', '6'))))
2215 ('symbol', '6'))))
2223 --- log.nodes * (glob)
2216 --- log.nodes * (glob)
2224 +++ glog.nodes * (glob)
2217 +++ glog.nodes * (glob)
2225 @@ -1,3 +1,3 @@
2218 @@ -1,3 +1,3 @@
2226 -nodetag 6
2219 -nodetag 6
2227 nodetag 8
2220 nodetag 8
2228 nodetag 7
2221 nodetag 7
2229 +nodetag 6
2222 +nodetag 6
2230
2223
2231 Test --follow and backward --rev
2224 Test --follow and backward --rev
2232
2225
2233 $ testlog --follow -r6 -r5 -r7 -r8 -r4
2226 $ testlog --follow -r6 -r5 -r7 -r8 -r4
2234 ['6', '5', '7', '8', '4']
2227 ['6', '5', '7', '8', '4']
2235 (group
2228 (group
2236 (func
2229 (func
2237 ('symbol', 'ancestors')
2230 ('symbol', 'ancestors')
2238 (func
2231 (func
2239 ('symbol', 'rev')
2232 ('symbol', 'rev')
2240 ('symbol', '6'))))
2233 ('symbol', '6'))))
2241
2234
2242 Test --follow-first and backward --rev
2235 Test --follow-first and backward --rev
2243
2236
2244 $ testlog --follow-first -r6 -r5 -r7 -r8 -r4
2237 $ testlog --follow-first -r6 -r5 -r7 -r8 -r4
2245 ['6', '5', '7', '8', '4']
2238 ['6', '5', '7', '8', '4']
2246 (group
2239 (group
2247 (func
2240 (func
2248 ('symbol', '_firstancestors')
2241 ('symbol', '_firstancestors')
2249 (func
2242 (func
2250 ('symbol', 'rev')
2243 ('symbol', 'rev')
2251 ('symbol', '6'))))
2244 ('symbol', '6'))))
2252
2245
2253 Test subdir
2246 Test subdir
2254
2247
2255 $ hg up -q 3
2248 $ hg up -q 3
2256 $ cd dir
2249 $ cd dir
2257 $ testlog .
2250 $ testlog .
2258 []
2251 []
2259 (group
2252 (group
2260 (func
2253 (func
2261 ('symbol', '_matchfiles')
2254 ('symbol', '_matchfiles')
2262 (list
2255 (list
2263 (list
2256 (list
2264 ('string', 'r:')
2257 ('string', 'r:')
2265 ('string', 'd:relpath'))
2258 ('string', 'd:relpath'))
2266 ('string', 'p:.'))))
2259 ('string', 'p:.'))))
2267 $ testlog ../b
2260 $ testlog ../b
2268 []
2261 []
2269 (group
2262 (group
2270 (group
2263 (group
2271 (func
2264 (func
2272 ('symbol', 'filelog')
2265 ('symbol', 'filelog')
2273 ('string', '../b'))))
2266 ('string', '../b'))))
2274 $ testlog -f ../b
2267 $ testlog -f ../b
2275 []
2268 []
2276 (group
2269 (group
2277 (group
2270 (group
2278 (func
2271 (func
2279 ('symbol', 'follow')
2272 ('symbol', 'follow')
2280 ('string', 'b'))))
2273 ('string', 'b'))))
2281 $ cd ..
2274 $ cd ..
2282
2275
2283 Test --hidden
2276 Test --hidden
2284 (enable obsolete)
2277 (enable obsolete)
2285
2278
2286 $ cat >> $HGRCPATH << EOF
2279 $ cat >> $HGRCPATH << EOF
2287 > [experimental]
2280 > [experimental]
2288 > evolution=createmarkers
2281 > evolution=createmarkers
2289 > EOF
2282 > EOF
2290
2283
2291 $ hg debugobsolete `hg id --debug -i -r 8`
2284 $ hg debugobsolete `hg id --debug -i -r 8`
2292 $ testlog
2285 $ testlog
2293 []
2286 []
2294 []
2287 []
2295 $ testlog --hidden
2288 $ testlog --hidden
2296 []
2289 []
2297 []
2290 []
2298 $ hg log -G --template '{rev} {desc}\n'
2291 $ hg log -G --template '{rev} {desc}\n'
2299 o 7 Added tag foo-bar for changeset fc281d8ff18d
2292 o 7 Added tag foo-bar for changeset fc281d8ff18d
2300 |
2293 |
2301 o 6 merge 5 and 4
2294 o 6 merge 5 and 4
2302 |\
2295 |\
2303 | o 5 add another e
2296 | o 5 add another e
2304 | |
2297 | |
2305 o | 4 mv dir/b e
2298 o | 4 mv dir/b e
2306 |/
2299 |/
2307 @ 3 mv a b; add d
2300 @ 3 mv a b; add d
2308 |
2301 |
2309 o 2 mv b dir/b
2302 o 2 mv b dir/b
2310 |
2303 |
2311 o 1 copy a b
2304 o 1 copy a b
2312 |
2305 |
2313 o 0 add a
2306 o 0 add a
2314
2307
2315
2308
2316 A template without trailing newline should do something sane
2309 A template without trailing newline should do something sane
2317
2310
2318 $ hg log -G -r ::2 --template '{rev} {desc}'
2311 $ hg log -G -r ::2 --template '{rev} {desc}'
2319 o 2 mv b dir/b
2312 o 2 mv b dir/b
2320 |
2313 |
2321 o 1 copy a b
2314 o 1 copy a b
2322 |
2315 |
2323 o 0 add a
2316 o 0 add a
2324
2317
2325
2318
2326 Extra newlines must be preserved
2319 Extra newlines must be preserved
2327
2320
2328 $ hg log -G -r ::2 --template '\n{rev} {desc}\n\n'
2321 $ hg log -G -r ::2 --template '\n{rev} {desc}\n\n'
2329 o
2322 o
2330 | 2 mv b dir/b
2323 | 2 mv b dir/b
2331 |
2324 |
2332 o
2325 o
2333 | 1 copy a b
2326 | 1 copy a b
2334 |
2327 |
2335 o
2328 o
2336 0 add a
2329 0 add a
2337
2330
2338
2331
2339 The almost-empty template should do something sane too ...
2332 The almost-empty template should do something sane too ...
2340
2333
2341 $ hg log -G -r ::2 --template '\n'
2334 $ hg log -G -r ::2 --template '\n'
2342 o
2335 o
2343 |
2336 |
2344 o
2337 o
2345 |
2338 |
2346 o
2339 o
2347
2340
2348
2341
2349 issue3772
2342 issue3772
2350
2343
2351 $ hg log -G -r :null
2344 $ hg log -G -r :null
2352 o changeset: 0:f8035bb17114
2345 o changeset: 0:f8035bb17114
2353 | user: test
2346 | user: test
2354 | date: Thu Jan 01 00:00:00 1970 +0000
2347 | date: Thu Jan 01 00:00:00 1970 +0000
2355 | summary: add a
2348 | summary: add a
2356 |
2349 |
2357 o changeset: -1:000000000000
2350 o changeset: -1:000000000000
2358 user:
2351 user:
2359 date: Thu Jan 01 00:00:00 1970 +0000
2352 date: Thu Jan 01 00:00:00 1970 +0000
2360
2353
2361 $ hg log -G -r null:null
2354 $ hg log -G -r null:null
2362 o changeset: -1:000000000000
2355 o changeset: -1:000000000000
2363 user:
2356 user:
2364 date: Thu Jan 01 00:00:00 1970 +0000
2357 date: Thu Jan 01 00:00:00 1970 +0000
2365
2358
2366
2359
2367 $ cd ..
2360 $ cd ..
@@ -1,1968 +1,1972 b''
1 Log on empty repository: checking consistency
1 Log on empty repository: checking consistency
2
2
3 $ hg init empty
3 $ hg init empty
4 $ cd empty
4 $ cd empty
5 $ hg log
5 $ hg log
6 $ hg log -r 1
6 $ hg log -r 1
7 abort: unknown revision '1'!
7 abort: unknown revision '1'!
8 [255]
8 [255]
9 $ hg log -r -1:0
9 $ hg log -r -1:0
10 abort: unknown revision '-1'!
10 abort: unknown revision '-1'!
11 [255]
11 [255]
12 $ hg log -r 'branch(name)'
12 $ hg log -r 'branch(name)'
13 abort: unknown revision 'name'!
13 abort: unknown revision 'name'!
14 [255]
14 [255]
15 $ hg log -r null -q
15 $ hg log -r null -q
16 -1:000000000000
16 -1:000000000000
17
17
18 The g is crafted to have 2 filelog topological heads in a linear
18 The g is crafted to have 2 filelog topological heads in a linear
19 changeset graph
19 changeset graph
20
20
21 $ hg init a
21 $ hg init a
22 $ cd a
22 $ cd a
23 $ echo a > a
23 $ echo a > a
24 $ echo f > f
24 $ echo f > f
25 $ hg ci -Ama -d '1 0'
25 $ hg ci -Ama -d '1 0'
26 adding a
26 adding a
27 adding f
27 adding f
28
28
29 $ hg cp a b
29 $ hg cp a b
30 $ hg cp f g
30 $ hg cp f g
31 $ hg ci -mb -d '2 0'
31 $ hg ci -mb -d '2 0'
32
32
33 $ mkdir dir
33 $ mkdir dir
34 $ hg mv b dir
34 $ hg mv b dir
35 $ echo g >> g
35 $ echo g >> g
36 $ echo f >> f
36 $ echo f >> f
37 $ hg ci -mc -d '3 0'
37 $ hg ci -mc -d '3 0'
38
38
39 $ hg mv a b
39 $ hg mv a b
40 $ hg cp -f f g
40 $ hg cp -f f g
41 $ echo a > d
41 $ echo a > d
42 $ hg add d
42 $ hg add d
43 $ hg ci -md -d '4 0'
43 $ hg ci -md -d '4 0'
44
44
45 $ hg mv dir/b e
45 $ hg mv dir/b e
46 $ hg ci -me -d '5 0'
46 $ hg ci -me -d '5 0'
47
47
48 Make sure largefiles doesn't interfere with logging a regular file
48 Make sure largefiles doesn't interfere with logging a regular file
49 $ hg log a --config extensions.largefiles=
49 $ hg log a --config extensions.largefiles=
50 changeset: 0:9161b9aeaf16
50 changeset: 0:9161b9aeaf16
51 user: test
51 user: test
52 date: Thu Jan 01 00:00:01 1970 +0000
52 date: Thu Jan 01 00:00:01 1970 +0000
53 summary: a
53 summary: a
54
54
55 $ hg log a
55 $ hg log a
56 changeset: 0:9161b9aeaf16
56 changeset: 0:9161b9aeaf16
57 user: test
57 user: test
58 date: Thu Jan 01 00:00:01 1970 +0000
58 date: Thu Jan 01 00:00:01 1970 +0000
59 summary: a
59 summary: a
60
60
61 log on directory
61 log on directory
62
62
63 $ hg log dir
63 $ hg log dir
64 changeset: 4:7e4639b4691b
64 changeset: 4:7e4639b4691b
65 tag: tip
65 tag: tip
66 user: test
66 user: test
67 date: Thu Jan 01 00:00:05 1970 +0000
67 date: Thu Jan 01 00:00:05 1970 +0000
68 summary: e
68 summary: e
69
69
70 changeset: 2:f8954cd4dc1f
70 changeset: 2:f8954cd4dc1f
71 user: test
71 user: test
72 date: Thu Jan 01 00:00:03 1970 +0000
72 date: Thu Jan 01 00:00:03 1970 +0000
73 summary: c
73 summary: c
74
74
75 $ hg log somethingthatdoesntexist dir
75 $ hg log somethingthatdoesntexist dir
76 changeset: 4:7e4639b4691b
76 changeset: 4:7e4639b4691b
77 tag: tip
77 tag: tip
78 user: test
78 user: test
79 date: Thu Jan 01 00:00:05 1970 +0000
79 date: Thu Jan 01 00:00:05 1970 +0000
80 summary: e
80 summary: e
81
81
82 changeset: 2:f8954cd4dc1f
82 changeset: 2:f8954cd4dc1f
83 user: test
83 user: test
84 date: Thu Jan 01 00:00:03 1970 +0000
84 date: Thu Jan 01 00:00:03 1970 +0000
85 summary: c
85 summary: c
86
86
87
87
88 -f, non-existent directory
88 -f, non-existent directory
89
89
90 $ hg log -f dir
90 $ hg log -f dir
91 abort: cannot follow file not in parent revision: "dir"
91 abort: cannot follow file not in parent revision: "dir"
92 [255]
92 [255]
93
93
94 -f, directory
94 -f, directory
95
95
96 $ hg up -q 3
96 $ hg up -q 3
97 $ hg log -f dir
97 $ hg log -f dir
98 changeset: 2:f8954cd4dc1f
98 changeset: 2:f8954cd4dc1f
99 user: test
99 user: test
100 date: Thu Jan 01 00:00:03 1970 +0000
100 date: Thu Jan 01 00:00:03 1970 +0000
101 summary: c
101 summary: c
102
102
103 -f, directory with --patch
103 -f, directory with --patch
104
104
105 $ hg log -f dir -p
105 $ hg log -f dir -p
106 changeset: 2:f8954cd4dc1f
106 changeset: 2:f8954cd4dc1f
107 user: test
107 user: test
108 date: Thu Jan 01 00:00:03 1970 +0000
108 date: Thu Jan 01 00:00:03 1970 +0000
109 summary: c
109 summary: c
110
110
111 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
111 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
112 --- /dev/null* (glob)
112 --- /dev/null* (glob)
113 +++ b/dir/b* (glob)
113 +++ b/dir/b* (glob)
114 @@ -0,0 +1,1 @@
114 @@ -0,0 +1,1 @@
115 +a
115 +a
116
116
117
117
118 -f, pattern
118 -f, pattern
119
119
120 $ hg log -f -I 'dir**' -p
120 $ hg log -f -I 'dir**' -p
121 changeset: 2:f8954cd4dc1f
121 changeset: 2:f8954cd4dc1f
122 user: test
122 user: test
123 date: Thu Jan 01 00:00:03 1970 +0000
123 date: Thu Jan 01 00:00:03 1970 +0000
124 summary: c
124 summary: c
125
125
126 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
126 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
127 --- /dev/null* (glob)
127 --- /dev/null* (glob)
128 +++ b/dir/b* (glob)
128 +++ b/dir/b* (glob)
129 @@ -0,0 +1,1 @@
129 @@ -0,0 +1,1 @@
130 +a
130 +a
131
131
132 $ hg up -q 4
132 $ hg up -q 4
133
133
134 -f, a wrong style
134 -f, a wrong style
135
135
136 $ hg log -f -l1 --style something
136 $ hg log -f -l1 --style something
137 abort: style 'something' not found
137 abort: style 'something' not found
138 (available styles: bisect, changelog, compact, default, phases, xml)
138 (available styles: bisect, changelog, compact, default, phases, xml)
139 [255]
139 [255]
140
140
141 -f, phases style
141 -f, phases style
142
142
143
143
144 $ hg log -f -l1 --style phases
144 $ hg log -f -l1 --style phases
145 changeset: 4:7e4639b4691b
145 changeset: 4:7e4639b4691b
146 tag: tip
146 tag: tip
147 phase: draft
147 phase: draft
148 user: test
148 user: test
149 date: Thu Jan 01 00:00:05 1970 +0000
149 date: Thu Jan 01 00:00:05 1970 +0000
150 summary: e
150 summary: e
151
151
152
152
153 -f, but no args
153 -f, but no args
154
154
155 $ hg log -f
155 $ hg log -f
156 changeset: 4:7e4639b4691b
156 changeset: 4:7e4639b4691b
157 tag: tip
157 tag: tip
158 user: test
158 user: test
159 date: Thu Jan 01 00:00:05 1970 +0000
159 date: Thu Jan 01 00:00:05 1970 +0000
160 summary: e
160 summary: e
161
161
162 changeset: 3:2ca5ba701980
162 changeset: 3:2ca5ba701980
163 user: test
163 user: test
164 date: Thu Jan 01 00:00:04 1970 +0000
164 date: Thu Jan 01 00:00:04 1970 +0000
165 summary: d
165 summary: d
166
166
167 changeset: 2:f8954cd4dc1f
167 changeset: 2:f8954cd4dc1f
168 user: test
168 user: test
169 date: Thu Jan 01 00:00:03 1970 +0000
169 date: Thu Jan 01 00:00:03 1970 +0000
170 summary: c
170 summary: c
171
171
172 changeset: 1:d89b0a12d229
172 changeset: 1:d89b0a12d229
173 user: test
173 user: test
174 date: Thu Jan 01 00:00:02 1970 +0000
174 date: Thu Jan 01 00:00:02 1970 +0000
175 summary: b
175 summary: b
176
176
177 changeset: 0:9161b9aeaf16
177 changeset: 0:9161b9aeaf16
178 user: test
178 user: test
179 date: Thu Jan 01 00:00:01 1970 +0000
179 date: Thu Jan 01 00:00:01 1970 +0000
180 summary: a
180 summary: a
181
181
182
182
183 one rename
183 one rename
184
184
185 $ hg up -q 2
185 $ hg up -q 2
186 $ hg log -vf a
186 $ hg log -vf a
187 changeset: 0:9161b9aeaf16
187 changeset: 0:9161b9aeaf16
188 user: test
188 user: test
189 date: Thu Jan 01 00:00:01 1970 +0000
189 date: Thu Jan 01 00:00:01 1970 +0000
190 files: a f
190 files: a f
191 description:
191 description:
192 a
192 a
193
193
194
194
195
195
196 many renames
196 many renames
197
197
198 $ hg up -q tip
198 $ hg up -q tip
199 $ hg log -vf e
199 $ hg log -vf e
200 changeset: 4:7e4639b4691b
200 changeset: 4:7e4639b4691b
201 tag: tip
201 tag: tip
202 user: test
202 user: test
203 date: Thu Jan 01 00:00:05 1970 +0000
203 date: Thu Jan 01 00:00:05 1970 +0000
204 files: dir/b e
204 files: dir/b e
205 description:
205 description:
206 e
206 e
207
207
208
208
209 changeset: 2:f8954cd4dc1f
209 changeset: 2:f8954cd4dc1f
210 user: test
210 user: test
211 date: Thu Jan 01 00:00:03 1970 +0000
211 date: Thu Jan 01 00:00:03 1970 +0000
212 files: b dir/b f g
212 files: b dir/b f g
213 description:
213 description:
214 c
214 c
215
215
216
216
217 changeset: 1:d89b0a12d229
217 changeset: 1:d89b0a12d229
218 user: test
218 user: test
219 date: Thu Jan 01 00:00:02 1970 +0000
219 date: Thu Jan 01 00:00:02 1970 +0000
220 files: b g
220 files: b g
221 description:
221 description:
222 b
222 b
223
223
224
224
225 changeset: 0:9161b9aeaf16
225 changeset: 0:9161b9aeaf16
226 user: test
226 user: test
227 date: Thu Jan 01 00:00:01 1970 +0000
227 date: Thu Jan 01 00:00:01 1970 +0000
228 files: a f
228 files: a f
229 description:
229 description:
230 a
230 a
231
231
232
232
233
233
234
234
235 log -pf dir/b
235 log -pf dir/b
236
236
237 $ hg up -q 3
237 $ hg up -q 3
238 $ hg log -pf dir/b
238 $ hg log -pf dir/b
239 changeset: 2:f8954cd4dc1f
239 changeset: 2:f8954cd4dc1f
240 user: test
240 user: test
241 date: Thu Jan 01 00:00:03 1970 +0000
241 date: Thu Jan 01 00:00:03 1970 +0000
242 summary: c
242 summary: c
243
243
244 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
244 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
245 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
245 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
246 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
246 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
247 @@ -0,0 +1,1 @@
247 @@ -0,0 +1,1 @@
248 +a
248 +a
249
249
250 changeset: 1:d89b0a12d229
250 changeset: 1:d89b0a12d229
251 user: test
251 user: test
252 date: Thu Jan 01 00:00:02 1970 +0000
252 date: Thu Jan 01 00:00:02 1970 +0000
253 summary: b
253 summary: b
254
254
255 diff -r 9161b9aeaf16 -r d89b0a12d229 b
255 diff -r 9161b9aeaf16 -r d89b0a12d229 b
256 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
256 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
257 +++ b/b Thu Jan 01 00:00:02 1970 +0000
257 +++ b/b Thu Jan 01 00:00:02 1970 +0000
258 @@ -0,0 +1,1 @@
258 @@ -0,0 +1,1 @@
259 +a
259 +a
260
260
261 changeset: 0:9161b9aeaf16
261 changeset: 0:9161b9aeaf16
262 user: test
262 user: test
263 date: Thu Jan 01 00:00:01 1970 +0000
263 date: Thu Jan 01 00:00:01 1970 +0000
264 summary: a
264 summary: a
265
265
266 diff -r 000000000000 -r 9161b9aeaf16 a
266 diff -r 000000000000 -r 9161b9aeaf16 a
267 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
267 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
268 +++ b/a Thu Jan 01 00:00:01 1970 +0000
268 +++ b/a Thu Jan 01 00:00:01 1970 +0000
269 @@ -0,0 +1,1 @@
269 @@ -0,0 +1,1 @@
270 +a
270 +a
271
271
272
272
273 log -pf b inside dir
273 log -pf b inside dir
274
274
275 $ hg --cwd=dir log -pf b
275 $ hg --cwd=dir log -pf b
276 changeset: 2:f8954cd4dc1f
276 changeset: 2:f8954cd4dc1f
277 user: test
277 user: test
278 date: Thu Jan 01 00:00:03 1970 +0000
278 date: Thu Jan 01 00:00:03 1970 +0000
279 summary: c
279 summary: c
280
280
281 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
281 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
282 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
282 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
283 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
283 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
284 @@ -0,0 +1,1 @@
284 @@ -0,0 +1,1 @@
285 +a
285 +a
286
286
287 changeset: 1:d89b0a12d229
287 changeset: 1:d89b0a12d229
288 user: test
288 user: test
289 date: Thu Jan 01 00:00:02 1970 +0000
289 date: Thu Jan 01 00:00:02 1970 +0000
290 summary: b
290 summary: b
291
291
292 diff -r 9161b9aeaf16 -r d89b0a12d229 b
292 diff -r 9161b9aeaf16 -r d89b0a12d229 b
293 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
293 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
294 +++ b/b Thu Jan 01 00:00:02 1970 +0000
294 +++ b/b Thu Jan 01 00:00:02 1970 +0000
295 @@ -0,0 +1,1 @@
295 @@ -0,0 +1,1 @@
296 +a
296 +a
297
297
298 changeset: 0:9161b9aeaf16
298 changeset: 0:9161b9aeaf16
299 user: test
299 user: test
300 date: Thu Jan 01 00:00:01 1970 +0000
300 date: Thu Jan 01 00:00:01 1970 +0000
301 summary: a
301 summary: a
302
302
303 diff -r 000000000000 -r 9161b9aeaf16 a
303 diff -r 000000000000 -r 9161b9aeaf16 a
304 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
304 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
305 +++ b/a Thu Jan 01 00:00:01 1970 +0000
305 +++ b/a Thu Jan 01 00:00:01 1970 +0000
306 @@ -0,0 +1,1 @@
306 @@ -0,0 +1,1 @@
307 +a
307 +a
308
308
309
309
310 log -pf, but no args
310 log -pf, but no args
311
311
312 $ hg log -pf
312 $ hg log -pf
313 changeset: 3:2ca5ba701980
313 changeset: 3:2ca5ba701980
314 user: test
314 user: test
315 date: Thu Jan 01 00:00:04 1970 +0000
315 date: Thu Jan 01 00:00:04 1970 +0000
316 summary: d
316 summary: d
317
317
318 diff -r f8954cd4dc1f -r 2ca5ba701980 a
318 diff -r f8954cd4dc1f -r 2ca5ba701980 a
319 --- a/a Thu Jan 01 00:00:03 1970 +0000
319 --- a/a Thu Jan 01 00:00:03 1970 +0000
320 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
320 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
321 @@ -1,1 +0,0 @@
321 @@ -1,1 +0,0 @@
322 -a
322 -a
323 diff -r f8954cd4dc1f -r 2ca5ba701980 b
323 diff -r f8954cd4dc1f -r 2ca5ba701980 b
324 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
324 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
325 +++ b/b Thu Jan 01 00:00:04 1970 +0000
325 +++ b/b Thu Jan 01 00:00:04 1970 +0000
326 @@ -0,0 +1,1 @@
326 @@ -0,0 +1,1 @@
327 +a
327 +a
328 diff -r f8954cd4dc1f -r 2ca5ba701980 d
328 diff -r f8954cd4dc1f -r 2ca5ba701980 d
329 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
329 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
330 +++ b/d Thu Jan 01 00:00:04 1970 +0000
330 +++ b/d Thu Jan 01 00:00:04 1970 +0000
331 @@ -0,0 +1,1 @@
331 @@ -0,0 +1,1 @@
332 +a
332 +a
333 diff -r f8954cd4dc1f -r 2ca5ba701980 g
333 diff -r f8954cd4dc1f -r 2ca5ba701980 g
334 --- a/g Thu Jan 01 00:00:03 1970 +0000
334 --- a/g Thu Jan 01 00:00:03 1970 +0000
335 +++ b/g Thu Jan 01 00:00:04 1970 +0000
335 +++ b/g Thu Jan 01 00:00:04 1970 +0000
336 @@ -1,2 +1,2 @@
336 @@ -1,2 +1,2 @@
337 f
337 f
338 -g
338 -g
339 +f
339 +f
340
340
341 changeset: 2:f8954cd4dc1f
341 changeset: 2:f8954cd4dc1f
342 user: test
342 user: test
343 date: Thu Jan 01 00:00:03 1970 +0000
343 date: Thu Jan 01 00:00:03 1970 +0000
344 summary: c
344 summary: c
345
345
346 diff -r d89b0a12d229 -r f8954cd4dc1f b
346 diff -r d89b0a12d229 -r f8954cd4dc1f b
347 --- a/b Thu Jan 01 00:00:02 1970 +0000
347 --- a/b Thu Jan 01 00:00:02 1970 +0000
348 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
348 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
349 @@ -1,1 +0,0 @@
349 @@ -1,1 +0,0 @@
350 -a
350 -a
351 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
351 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
352 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
352 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
353 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
353 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
354 @@ -0,0 +1,1 @@
354 @@ -0,0 +1,1 @@
355 +a
355 +a
356 diff -r d89b0a12d229 -r f8954cd4dc1f f
356 diff -r d89b0a12d229 -r f8954cd4dc1f f
357 --- a/f Thu Jan 01 00:00:02 1970 +0000
357 --- a/f Thu Jan 01 00:00:02 1970 +0000
358 +++ b/f Thu Jan 01 00:00:03 1970 +0000
358 +++ b/f Thu Jan 01 00:00:03 1970 +0000
359 @@ -1,1 +1,2 @@
359 @@ -1,1 +1,2 @@
360 f
360 f
361 +f
361 +f
362 diff -r d89b0a12d229 -r f8954cd4dc1f g
362 diff -r d89b0a12d229 -r f8954cd4dc1f g
363 --- a/g Thu Jan 01 00:00:02 1970 +0000
363 --- a/g Thu Jan 01 00:00:02 1970 +0000
364 +++ b/g Thu Jan 01 00:00:03 1970 +0000
364 +++ b/g Thu Jan 01 00:00:03 1970 +0000
365 @@ -1,1 +1,2 @@
365 @@ -1,1 +1,2 @@
366 f
366 f
367 +g
367 +g
368
368
369 changeset: 1:d89b0a12d229
369 changeset: 1:d89b0a12d229
370 user: test
370 user: test
371 date: Thu Jan 01 00:00:02 1970 +0000
371 date: Thu Jan 01 00:00:02 1970 +0000
372 summary: b
372 summary: b
373
373
374 diff -r 9161b9aeaf16 -r d89b0a12d229 b
374 diff -r 9161b9aeaf16 -r d89b0a12d229 b
375 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
375 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
376 +++ b/b Thu Jan 01 00:00:02 1970 +0000
376 +++ b/b Thu Jan 01 00:00:02 1970 +0000
377 @@ -0,0 +1,1 @@
377 @@ -0,0 +1,1 @@
378 +a
378 +a
379 diff -r 9161b9aeaf16 -r d89b0a12d229 g
379 diff -r 9161b9aeaf16 -r d89b0a12d229 g
380 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
380 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
381 +++ b/g Thu Jan 01 00:00:02 1970 +0000
381 +++ b/g Thu Jan 01 00:00:02 1970 +0000
382 @@ -0,0 +1,1 @@
382 @@ -0,0 +1,1 @@
383 +f
383 +f
384
384
385 changeset: 0:9161b9aeaf16
385 changeset: 0:9161b9aeaf16
386 user: test
386 user: test
387 date: Thu Jan 01 00:00:01 1970 +0000
387 date: Thu Jan 01 00:00:01 1970 +0000
388 summary: a
388 summary: a
389
389
390 diff -r 000000000000 -r 9161b9aeaf16 a
390 diff -r 000000000000 -r 9161b9aeaf16 a
391 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
391 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
392 +++ b/a Thu Jan 01 00:00:01 1970 +0000
392 +++ b/a Thu Jan 01 00:00:01 1970 +0000
393 @@ -0,0 +1,1 @@
393 @@ -0,0 +1,1 @@
394 +a
394 +a
395 diff -r 000000000000 -r 9161b9aeaf16 f
395 diff -r 000000000000 -r 9161b9aeaf16 f
396 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
396 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
397 +++ b/f Thu Jan 01 00:00:01 1970 +0000
397 +++ b/f Thu Jan 01 00:00:01 1970 +0000
398 @@ -0,0 +1,1 @@
398 @@ -0,0 +1,1 @@
399 +f
399 +f
400
400
401
401
402 log -vf dir/b
402 log -vf dir/b
403
403
404 $ hg log -vf dir/b
404 $ hg log -vf dir/b
405 changeset: 2:f8954cd4dc1f
405 changeset: 2:f8954cd4dc1f
406 user: test
406 user: test
407 date: Thu Jan 01 00:00:03 1970 +0000
407 date: Thu Jan 01 00:00:03 1970 +0000
408 files: b dir/b f g
408 files: b dir/b f g
409 description:
409 description:
410 c
410 c
411
411
412
412
413 changeset: 1:d89b0a12d229
413 changeset: 1:d89b0a12d229
414 user: test
414 user: test
415 date: Thu Jan 01 00:00:02 1970 +0000
415 date: Thu Jan 01 00:00:02 1970 +0000
416 files: b g
416 files: b g
417 description:
417 description:
418 b
418 b
419
419
420
420
421 changeset: 0:9161b9aeaf16
421 changeset: 0:9161b9aeaf16
422 user: test
422 user: test
423 date: Thu Jan 01 00:00:01 1970 +0000
423 date: Thu Jan 01 00:00:01 1970 +0000
424 files: a f
424 files: a f
425 description:
425 description:
426 a
426 a
427
427
428
428
429
429
430
430
431 -f and multiple filelog heads
431 -f and multiple filelog heads
432
432
433 $ hg up -q 2
433 $ hg up -q 2
434 $ hg log -f g --template '{rev}\n'
434 $ hg log -f g --template '{rev}\n'
435 2
435 2
436 1
436 1
437 0
437 0
438 $ hg up -q tip
438 $ hg up -q tip
439 $ hg log -f g --template '{rev}\n'
439 $ hg log -f g --template '{rev}\n'
440 3
440 3
441 2
441 2
442 0
442 0
443
443
444
444
445 log copies with --copies
445 log copies with --copies
446
446
447 $ hg log -vC --template '{rev} {file_copies}\n'
447 $ hg log -vC --template '{rev} {file_copies}\n'
448 4 e (dir/b)
448 4 e (dir/b)
449 3 b (a)g (f)
449 3 b (a)g (f)
450 2 dir/b (b)
450 2 dir/b (b)
451 1 b (a)g (f)
451 1 b (a)g (f)
452 0
452 0
453
453
454 log copies switch without --copies, with old filecopy template
454 log copies switch without --copies, with old filecopy template
455
455
456 $ hg log -v --template '{rev} {file_copies_switch%filecopy}\n'
456 $ hg log -v --template '{rev} {file_copies_switch%filecopy}\n'
457 4
457 4
458 3
458 3
459 2
459 2
460 1
460 1
461 0
461 0
462
462
463 log copies switch with --copies
463 log copies switch with --copies
464
464
465 $ hg log -vC --template '{rev} {file_copies_switch}\n'
465 $ hg log -vC --template '{rev} {file_copies_switch}\n'
466 4 e (dir/b)
466 4 e (dir/b)
467 3 b (a)g (f)
467 3 b (a)g (f)
468 2 dir/b (b)
468 2 dir/b (b)
469 1 b (a)g (f)
469 1 b (a)g (f)
470 0
470 0
471
471
472
472
473 log copies with hardcoded style and with --style=default
473 log copies with hardcoded style and with --style=default
474
474
475 $ hg log -vC -r4
475 $ hg log -vC -r4
476 changeset: 4:7e4639b4691b
476 changeset: 4:7e4639b4691b
477 tag: tip
477 tag: tip
478 user: test
478 user: test
479 date: Thu Jan 01 00:00:05 1970 +0000
479 date: Thu Jan 01 00:00:05 1970 +0000
480 files: dir/b e
480 files: dir/b e
481 copies: e (dir/b)
481 copies: e (dir/b)
482 description:
482 description:
483 e
483 e
484
484
485
485
486 $ hg log -vC -r4 --style=default
486 $ hg log -vC -r4 --style=default
487 changeset: 4:7e4639b4691b
487 changeset: 4:7e4639b4691b
488 tag: tip
488 tag: tip
489 user: test
489 user: test
490 date: Thu Jan 01 00:00:05 1970 +0000
490 date: Thu Jan 01 00:00:05 1970 +0000
491 files: dir/b e
491 files: dir/b e
492 copies: e (dir/b)
492 copies: e (dir/b)
493 description:
493 description:
494 e
494 e
495
495
496
496
497 $ hg log -vC -r4 -Tjson
497 $ hg log -vC -r4 -Tjson
498 [
498 [
499 {
499 {
500 "rev": 4,
500 "rev": 4,
501 "node": "7e4639b4691b9f84b81036a8d4fb218ce3c5e3a3",
501 "node": "7e4639b4691b9f84b81036a8d4fb218ce3c5e3a3",
502 "branch": "default",
502 "branch": "default",
503 "phase": "draft",
503 "phase": "draft",
504 "user": "test",
504 "user": "test",
505 "date": [5, 0],
505 "date": [5, 0],
506 "desc": "e",
506 "desc": "e",
507 "bookmarks": [],
507 "bookmarks": [],
508 "tags": ["tip"],
508 "tags": ["tip"],
509 "parents": ["2ca5ba7019804f1f597249caddf22a64d34df0ba"],
509 "parents": ["2ca5ba7019804f1f597249caddf22a64d34df0ba"],
510 "files": ["dir/b", "e"],
510 "files": ["dir/b", "e"],
511 "copies": {"e": "dir/b"}
511 "copies": {"e": "dir/b"}
512 }
512 }
513 ]
513 ]
514
514
515 log copies, non-linear manifest
515 log copies, non-linear manifest
516
516
517 $ hg up -C 3
517 $ hg up -C 3
518 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
518 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
519 $ hg mv dir/b e
519 $ hg mv dir/b e
520 $ echo foo > foo
520 $ echo foo > foo
521 $ hg ci -Ame2 -d '6 0'
521 $ hg ci -Ame2 -d '6 0'
522 adding foo
522 adding foo
523 created new head
523 created new head
524 $ hg log -v --template '{rev} {file_copies}\n' -r 5
524 $ hg log -v --template '{rev} {file_copies}\n' -r 5
525 5 e (dir/b)
525 5 e (dir/b)
526
526
527
527
528 log copies, execute bit set
528 log copies, execute bit set
529
529
530 #if execbit
530 #if execbit
531 $ chmod +x e
531 $ chmod +x e
532 $ hg ci -me3 -d '7 0'
532 $ hg ci -me3 -d '7 0'
533 $ hg log -v --template '{rev} {file_copies}\n' -r 6
533 $ hg log -v --template '{rev} {file_copies}\n' -r 6
534 6
534 6
535 #endif
535 #endif
536
536
537
537
538 log -p d
538 log -p d
539
539
540 $ hg log -pv d
540 $ hg log -pv d
541 changeset: 3:2ca5ba701980
541 changeset: 3:2ca5ba701980
542 user: test
542 user: test
543 date: Thu Jan 01 00:00:04 1970 +0000
543 date: Thu Jan 01 00:00:04 1970 +0000
544 files: a b d g
544 files: a b d g
545 description:
545 description:
546 d
546 d
547
547
548
548
549 diff -r f8954cd4dc1f -r 2ca5ba701980 d
549 diff -r f8954cd4dc1f -r 2ca5ba701980 d
550 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
550 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
551 +++ b/d Thu Jan 01 00:00:04 1970 +0000
551 +++ b/d Thu Jan 01 00:00:04 1970 +0000
552 @@ -0,0 +1,1 @@
552 @@ -0,0 +1,1 @@
553 +a
553 +a
554
554
555
555
556
556
557 log --removed file
557 log --removed file
558
558
559 $ hg log --removed -v a
559 $ hg log --removed -v a
560 changeset: 3:2ca5ba701980
560 changeset: 3:2ca5ba701980
561 user: test
561 user: test
562 date: Thu Jan 01 00:00:04 1970 +0000
562 date: Thu Jan 01 00:00:04 1970 +0000
563 files: a b d g
563 files: a b d g
564 description:
564 description:
565 d
565 d
566
566
567
567
568 changeset: 0:9161b9aeaf16
568 changeset: 0:9161b9aeaf16
569 user: test
569 user: test
570 date: Thu Jan 01 00:00:01 1970 +0000
570 date: Thu Jan 01 00:00:01 1970 +0000
571 files: a f
571 files: a f
572 description:
572 description:
573 a
573 a
574
574
575
575
576
576
577 log --removed revrange file
577 log --removed revrange file
578
578
579 $ hg log --removed -v -r0:2 a
579 $ hg log --removed -v -r0:2 a
580 changeset: 0:9161b9aeaf16
580 changeset: 0:9161b9aeaf16
581 user: test
581 user: test
582 date: Thu Jan 01 00:00:01 1970 +0000
582 date: Thu Jan 01 00:00:01 1970 +0000
583 files: a f
583 files: a f
584 description:
584 description:
585 a
585 a
586
586
587
587
588 $ cd ..
588 $ cd ..
589
589
590 log --follow tests
590 log --follow tests
591
591
592 $ hg init follow
592 $ hg init follow
593 $ cd follow
593 $ cd follow
594
594
595 $ echo base > base
595 $ echo base > base
596 $ hg ci -Ambase -d '1 0'
596 $ hg ci -Ambase -d '1 0'
597 adding base
597 adding base
598
598
599 $ echo r1 >> base
599 $ echo r1 >> base
600 $ hg ci -Amr1 -d '1 0'
600 $ hg ci -Amr1 -d '1 0'
601 $ echo r2 >> base
601 $ echo r2 >> base
602 $ hg ci -Amr2 -d '1 0'
602 $ hg ci -Amr2 -d '1 0'
603
603
604 $ hg up -C 1
604 $ hg up -C 1
605 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
605 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
606 $ echo b1 > b1
606 $ echo b1 > b1
607 $ hg ci -Amb1 -d '1 0'
607 $ hg ci -Amb1 -d '1 0'
608 adding b1
608 adding b1
609 created new head
609 created new head
610
610
611
611
612 log -f
612 log -f
613
613
614 $ hg log -f
614 $ hg log -f
615 changeset: 3:e62f78d544b4
615 changeset: 3:e62f78d544b4
616 tag: tip
616 tag: tip
617 parent: 1:3d5bf5654eda
617 parent: 1:3d5bf5654eda
618 user: test
618 user: test
619 date: Thu Jan 01 00:00:01 1970 +0000
619 date: Thu Jan 01 00:00:01 1970 +0000
620 summary: b1
620 summary: b1
621
621
622 changeset: 1:3d5bf5654eda
622 changeset: 1:3d5bf5654eda
623 user: test
623 user: test
624 date: Thu Jan 01 00:00:01 1970 +0000
624 date: Thu Jan 01 00:00:01 1970 +0000
625 summary: r1
625 summary: r1
626
626
627 changeset: 0:67e992f2c4f3
627 changeset: 0:67e992f2c4f3
628 user: test
628 user: test
629 date: Thu Jan 01 00:00:01 1970 +0000
629 date: Thu Jan 01 00:00:01 1970 +0000
630 summary: base
630 summary: base
631
631
632
632
633
633
634 log -f -r 1:tip
634 log -f -r '1 + 4'
635
635
636 $ hg up -C 0
636 $ hg up -C 0
637 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
637 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
638 $ echo b2 > b2
638 $ echo b2 > b2
639 $ hg ci -Amb2 -d '1 0'
639 $ hg ci -Amb2 -d '1 0'
640 adding b2
640 adding b2
641 created new head
641 created new head
642 $ hg log -f -r 1:tip
642 $ hg log -f -r '1 + 4'
643 changeset: 4:ddb82e70d1a1
644 tag: tip
645 parent: 0:67e992f2c4f3
646 user: test
647 date: Thu Jan 01 00:00:01 1970 +0000
648 summary: b2
649
643 changeset: 1:3d5bf5654eda
650 changeset: 1:3d5bf5654eda
644 user: test
651 user: test
645 date: Thu Jan 01 00:00:01 1970 +0000
652 date: Thu Jan 01 00:00:01 1970 +0000
646 summary: r1
653 summary: r1
647
654
648 changeset: 2:60c670bf5b30
655 changeset: 0:67e992f2c4f3
649 user: test
656 user: test
650 date: Thu Jan 01 00:00:01 1970 +0000
657 date: Thu Jan 01 00:00:01 1970 +0000
651 summary: r2
658 summary: base
652
653 changeset: 3:e62f78d544b4
654 parent: 1:3d5bf5654eda
655 user: test
656 date: Thu Jan 01 00:00:01 1970 +0000
657 summary: b1
658
659
660
659
661 log -f -r null
660 log -f -r null
662
661
663 $ hg log -f -r null
662 $ hg log -f -r null
664 changeset: -1:000000000000
663 changeset: -1:000000000000
665 user:
664 user:
666 date: Thu Jan 01 00:00:00 1970 +0000
665 date: Thu Jan 01 00:00:00 1970 +0000
667
666
668 $ hg log -f -r null -G
667 $ hg log -f -r null -G
669 o changeset: -1:000000000000
668 o changeset: -1:000000000000
670 user:
669 user:
671 date: Thu Jan 01 00:00:00 1970 +0000
670 date: Thu Jan 01 00:00:00 1970 +0000
672
671
673
672
674
673
675 log -f with null parent
674 log -f with null parent
676
675
677 $ hg up -C null
676 $ hg up -C null
678 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
677 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
679 $ hg log -f
678 $ hg log -f
680
679
681
680
682 log -r . with two parents
681 log -r . with two parents
683
682
684 $ hg up -C 3
683 $ hg up -C 3
685 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
684 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
686 $ hg merge tip
685 $ hg merge tip
687 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
686 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
688 (branch merge, don't forget to commit)
687 (branch merge, don't forget to commit)
689 $ hg log -r .
688 $ hg log -r .
690 changeset: 3:e62f78d544b4
689 changeset: 3:e62f78d544b4
691 parent: 1:3d5bf5654eda
690 parent: 1:3d5bf5654eda
692 user: test
691 user: test
693 date: Thu Jan 01 00:00:01 1970 +0000
692 date: Thu Jan 01 00:00:01 1970 +0000
694 summary: b1
693 summary: b1
695
694
696
695
697
696
698 log -r . with one parent
697 log -r . with one parent
699
698
700 $ hg ci -mm12 -d '1 0'
699 $ hg ci -mm12 -d '1 0'
701 $ hg log -r .
700 $ hg log -r .
702 changeset: 5:302e9dd6890d
701 changeset: 5:302e9dd6890d
703 tag: tip
702 tag: tip
704 parent: 3:e62f78d544b4
703 parent: 3:e62f78d544b4
705 parent: 4:ddb82e70d1a1
704 parent: 4:ddb82e70d1a1
706 user: test
705 user: test
707 date: Thu Jan 01 00:00:01 1970 +0000
706 date: Thu Jan 01 00:00:01 1970 +0000
708 summary: m12
707 summary: m12
709
708
710
709
711 $ echo postm >> b1
710 $ echo postm >> b1
712 $ hg ci -Amb1.1 -d'1 0'
711 $ hg ci -Amb1.1 -d'1 0'
713
712
714
713
715 log --follow-first
714 log --follow-first
716
715
717 $ hg log --follow-first
716 $ hg log --follow-first
718 changeset: 6:2404bbcab562
717 changeset: 6:2404bbcab562
719 tag: tip
718 tag: tip
720 user: test
719 user: test
721 date: Thu Jan 01 00:00:01 1970 +0000
720 date: Thu Jan 01 00:00:01 1970 +0000
722 summary: b1.1
721 summary: b1.1
723
722
724 changeset: 5:302e9dd6890d
723 changeset: 5:302e9dd6890d
725 parent: 3:e62f78d544b4
724 parent: 3:e62f78d544b4
726 parent: 4:ddb82e70d1a1
725 parent: 4:ddb82e70d1a1
727 user: test
726 user: test
728 date: Thu Jan 01 00:00:01 1970 +0000
727 date: Thu Jan 01 00:00:01 1970 +0000
729 summary: m12
728 summary: m12
730
729
731 changeset: 3:e62f78d544b4
730 changeset: 3:e62f78d544b4
732 parent: 1:3d5bf5654eda
731 parent: 1:3d5bf5654eda
733 user: test
732 user: test
734 date: Thu Jan 01 00:00:01 1970 +0000
733 date: Thu Jan 01 00:00:01 1970 +0000
735 summary: b1
734 summary: b1
736
735
737 changeset: 1:3d5bf5654eda
736 changeset: 1:3d5bf5654eda
738 user: test
737 user: test
739 date: Thu Jan 01 00:00:01 1970 +0000
738 date: Thu Jan 01 00:00:01 1970 +0000
740 summary: r1
739 summary: r1
741
740
742 changeset: 0:67e992f2c4f3
741 changeset: 0:67e992f2c4f3
743 user: test
742 user: test
744 date: Thu Jan 01 00:00:01 1970 +0000
743 date: Thu Jan 01 00:00:01 1970 +0000
745 summary: base
744 summary: base
746
745
747
746
748
747
749 log -P 2
748 log -P 2
750
749
751 $ hg log -P 2
750 $ hg log -P 2
752 changeset: 6:2404bbcab562
751 changeset: 6:2404bbcab562
753 tag: tip
752 tag: tip
754 user: test
753 user: test
755 date: Thu Jan 01 00:00:01 1970 +0000
754 date: Thu Jan 01 00:00:01 1970 +0000
756 summary: b1.1
755 summary: b1.1
757
756
758 changeset: 5:302e9dd6890d
757 changeset: 5:302e9dd6890d
759 parent: 3:e62f78d544b4
758 parent: 3:e62f78d544b4
760 parent: 4:ddb82e70d1a1
759 parent: 4:ddb82e70d1a1
761 user: test
760 user: test
762 date: Thu Jan 01 00:00:01 1970 +0000
761 date: Thu Jan 01 00:00:01 1970 +0000
763 summary: m12
762 summary: m12
764
763
765 changeset: 4:ddb82e70d1a1
764 changeset: 4:ddb82e70d1a1
766 parent: 0:67e992f2c4f3
765 parent: 0:67e992f2c4f3
767 user: test
766 user: test
768 date: Thu Jan 01 00:00:01 1970 +0000
767 date: Thu Jan 01 00:00:01 1970 +0000
769 summary: b2
768 summary: b2
770
769
771 changeset: 3:e62f78d544b4
770 changeset: 3:e62f78d544b4
772 parent: 1:3d5bf5654eda
771 parent: 1:3d5bf5654eda
773 user: test
772 user: test
774 date: Thu Jan 01 00:00:01 1970 +0000
773 date: Thu Jan 01 00:00:01 1970 +0000
775 summary: b1
774 summary: b1
776
775
777
776
778
777
779 log -r tip -p --git
778 log -r tip -p --git
780
779
781 $ hg log -r tip -p --git
780 $ hg log -r tip -p --git
782 changeset: 6:2404bbcab562
781 changeset: 6:2404bbcab562
783 tag: tip
782 tag: tip
784 user: test
783 user: test
785 date: Thu Jan 01 00:00:01 1970 +0000
784 date: Thu Jan 01 00:00:01 1970 +0000
786 summary: b1.1
785 summary: b1.1
787
786
788 diff --git a/b1 b/b1
787 diff --git a/b1 b/b1
789 --- a/b1
788 --- a/b1
790 +++ b/b1
789 +++ b/b1
791 @@ -1,1 +1,2 @@
790 @@ -1,1 +1,2 @@
792 b1
791 b1
793 +postm
792 +postm
794
793
795
794
796
795
797 log -r ""
796 log -r ""
798
797
799 $ hg log -r ''
798 $ hg log -r ''
800 hg: parse error: empty query
799 hg: parse error: empty query
801 [255]
800 [255]
802
801
803 log -r <some unknown node id>
802 log -r <some unknown node id>
804
803
805 $ hg log -r 1000000000000000000000000000000000000000
804 $ hg log -r 1000000000000000000000000000000000000000
806 abort: unknown revision '1000000000000000000000000000000000000000'!
805 abort: unknown revision '1000000000000000000000000000000000000000'!
807 [255]
806 [255]
808
807
809 log -k r1
808 log -k r1
810
809
811 $ hg log -k r1
810 $ hg log -k r1
812 changeset: 1:3d5bf5654eda
811 changeset: 1:3d5bf5654eda
813 user: test
812 user: test
814 date: Thu Jan 01 00:00:01 1970 +0000
813 date: Thu Jan 01 00:00:01 1970 +0000
815 summary: r1
814 summary: r1
816
815
817 log -p -l2 --color=always
816 log -p -l2 --color=always
818
817
819 $ hg --config extensions.color= --config color.mode=ansi \
818 $ hg --config extensions.color= --config color.mode=ansi \
820 > log -p -l2 --color=always
819 > log -p -l2 --color=always
821 \x1b[0;33mchangeset: 6:2404bbcab562\x1b[0m (esc)
820 \x1b[0;33mchangeset: 6:2404bbcab562\x1b[0m (esc)
822 tag: tip
821 tag: tip
823 user: test
822 user: test
824 date: Thu Jan 01 00:00:01 1970 +0000
823 date: Thu Jan 01 00:00:01 1970 +0000
825 summary: b1.1
824 summary: b1.1
826
825
827 \x1b[0;1mdiff -r 302e9dd6890d -r 2404bbcab562 b1\x1b[0m (esc)
826 \x1b[0;1mdiff -r 302e9dd6890d -r 2404bbcab562 b1\x1b[0m (esc)
828 \x1b[0;31;1m--- a/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
827 \x1b[0;31;1m--- a/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
829 \x1b[0;32;1m+++ b/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
828 \x1b[0;32;1m+++ b/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
830 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
829 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
831 b1
830 b1
832 \x1b[0;32m+postm\x1b[0m (esc)
831 \x1b[0;32m+postm\x1b[0m (esc)
833
832
834 \x1b[0;33mchangeset: 5:302e9dd6890d\x1b[0m (esc)
833 \x1b[0;33mchangeset: 5:302e9dd6890d\x1b[0m (esc)
835 parent: 3:e62f78d544b4
834 parent: 3:e62f78d544b4
836 parent: 4:ddb82e70d1a1
835 parent: 4:ddb82e70d1a1
837 user: test
836 user: test
838 date: Thu Jan 01 00:00:01 1970 +0000
837 date: Thu Jan 01 00:00:01 1970 +0000
839 summary: m12
838 summary: m12
840
839
841 \x1b[0;1mdiff -r e62f78d544b4 -r 302e9dd6890d b2\x1b[0m (esc)
840 \x1b[0;1mdiff -r e62f78d544b4 -r 302e9dd6890d b2\x1b[0m (esc)
842 \x1b[0;31;1m--- /dev/null Thu Jan 01 00:00:00 1970 +0000\x1b[0m (esc)
841 \x1b[0;31;1m--- /dev/null Thu Jan 01 00:00:00 1970 +0000\x1b[0m (esc)
843 \x1b[0;32;1m+++ b/b2 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
842 \x1b[0;32;1m+++ b/b2 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
844 \x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m (esc)
843 \x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m (esc)
845 \x1b[0;32m+b2\x1b[0m (esc)
844 \x1b[0;32m+b2\x1b[0m (esc)
846
845
847
846
848
847
849 log -r tip --stat
848 log -r tip --stat
850
849
851 $ hg log -r tip --stat
850 $ hg log -r tip --stat
852 changeset: 6:2404bbcab562
851 changeset: 6:2404bbcab562
853 tag: tip
852 tag: tip
854 user: test
853 user: test
855 date: Thu Jan 01 00:00:01 1970 +0000
854 date: Thu Jan 01 00:00:01 1970 +0000
856 summary: b1.1
855 summary: b1.1
857
856
858 b1 | 1 +
857 b1 | 1 +
859 1 files changed, 1 insertions(+), 0 deletions(-)
858 1 files changed, 1 insertions(+), 0 deletions(-)
860
859
861
860
862 $ cd ..
861 $ cd ..
863
862
864
863
865 User
864 User
866
865
867 $ hg init usertest
866 $ hg init usertest
868 $ cd usertest
867 $ cd usertest
869
868
870 $ echo a > a
869 $ echo a > a
871 $ hg ci -A -m "a" -u "User One <user1@example.org>"
870 $ hg ci -A -m "a" -u "User One <user1@example.org>"
872 adding a
871 adding a
873 $ echo b > b
872 $ echo b > b
874 $ hg ci -A -m "b" -u "User Two <user2@example.org>"
873 $ hg ci -A -m "b" -u "User Two <user2@example.org>"
875 adding b
874 adding b
876
875
877 $ hg log -u "User One <user1@example.org>"
876 $ hg log -u "User One <user1@example.org>"
878 changeset: 0:29a4c94f1924
877 changeset: 0:29a4c94f1924
879 user: User One <user1@example.org>
878 user: User One <user1@example.org>
880 date: Thu Jan 01 00:00:00 1970 +0000
879 date: Thu Jan 01 00:00:00 1970 +0000
881 summary: a
880 summary: a
882
881
883 $ hg log -u "user1" -u "user2"
882 $ hg log -u "user1" -u "user2"
884 changeset: 1:e834b5e69c0e
883 changeset: 1:e834b5e69c0e
885 tag: tip
884 tag: tip
886 user: User Two <user2@example.org>
885 user: User Two <user2@example.org>
887 date: Thu Jan 01 00:00:00 1970 +0000
886 date: Thu Jan 01 00:00:00 1970 +0000
888 summary: b
887 summary: b
889
888
890 changeset: 0:29a4c94f1924
889 changeset: 0:29a4c94f1924
891 user: User One <user1@example.org>
890 user: User One <user1@example.org>
892 date: Thu Jan 01 00:00:00 1970 +0000
891 date: Thu Jan 01 00:00:00 1970 +0000
893 summary: a
892 summary: a
894
893
895 $ hg log -u "user3"
894 $ hg log -u "user3"
896
895
897 $ cd ..
896 $ cd ..
898
897
899 $ hg init branches
898 $ hg init branches
900 $ cd branches
899 $ cd branches
901
900
902 $ echo a > a
901 $ echo a > a
903 $ hg ci -A -m "commit on default"
902 $ hg ci -A -m "commit on default"
904 adding a
903 adding a
905 $ hg branch test
904 $ hg branch test
906 marked working directory as branch test
905 marked working directory as branch test
907 (branches are permanent and global, did you want a bookmark?)
906 (branches are permanent and global, did you want a bookmark?)
908 $ echo b > b
907 $ echo b > b
909 $ hg ci -A -m "commit on test"
908 $ hg ci -A -m "commit on test"
910 adding b
909 adding b
911
910
912 $ hg up default
911 $ hg up default
913 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
912 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
914 $ echo c > c
913 $ echo c > c
915 $ hg ci -A -m "commit on default"
914 $ hg ci -A -m "commit on default"
916 adding c
915 adding c
917 $ hg up test
916 $ hg up test
918 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
917 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
919 $ echo c > c
918 $ echo c > c
920 $ hg ci -A -m "commit on test"
919 $ hg ci -A -m "commit on test"
921 adding c
920 adding c
922
921
923
922
924 log -b default
923 log -b default
925
924
926 $ hg log -b default
925 $ hg log -b default
927 changeset: 2:c3a4f03cc9a7
926 changeset: 2:c3a4f03cc9a7
928 parent: 0:24427303d56f
927 parent: 0:24427303d56f
929 user: test
928 user: test
930 date: Thu Jan 01 00:00:00 1970 +0000
929 date: Thu Jan 01 00:00:00 1970 +0000
931 summary: commit on default
930 summary: commit on default
932
931
933 changeset: 0:24427303d56f
932 changeset: 0:24427303d56f
934 user: test
933 user: test
935 date: Thu Jan 01 00:00:00 1970 +0000
934 date: Thu Jan 01 00:00:00 1970 +0000
936 summary: commit on default
935 summary: commit on default
937
936
938
937
939
938
940 log -b test
939 log -b test
941
940
942 $ hg log -b test
941 $ hg log -b test
943 changeset: 3:f5d8de11c2e2
942 changeset: 3:f5d8de11c2e2
944 branch: test
943 branch: test
945 tag: tip
944 tag: tip
946 parent: 1:d32277701ccb
945 parent: 1:d32277701ccb
947 user: test
946 user: test
948 date: Thu Jan 01 00:00:00 1970 +0000
947 date: Thu Jan 01 00:00:00 1970 +0000
949 summary: commit on test
948 summary: commit on test
950
949
951 changeset: 1:d32277701ccb
950 changeset: 1:d32277701ccb
952 branch: test
951 branch: test
953 user: test
952 user: test
954 date: Thu Jan 01 00:00:00 1970 +0000
953 date: Thu Jan 01 00:00:00 1970 +0000
955 summary: commit on test
954 summary: commit on test
956
955
957
956
958
957
959 log -b dummy
958 log -b dummy
960
959
961 $ hg log -b dummy
960 $ hg log -b dummy
962 abort: unknown revision 'dummy'!
961 abort: unknown revision 'dummy'!
963 [255]
962 [255]
964
963
965
964
966 log -b .
965 log -b .
967
966
968 $ hg log -b .
967 $ hg log -b .
969 changeset: 3:f5d8de11c2e2
968 changeset: 3:f5d8de11c2e2
970 branch: test
969 branch: test
971 tag: tip
970 tag: tip
972 parent: 1:d32277701ccb
971 parent: 1:d32277701ccb
973 user: test
972 user: test
974 date: Thu Jan 01 00:00:00 1970 +0000
973 date: Thu Jan 01 00:00:00 1970 +0000
975 summary: commit on test
974 summary: commit on test
976
975
977 changeset: 1:d32277701ccb
976 changeset: 1:d32277701ccb
978 branch: test
977 branch: test
979 user: test
978 user: test
980 date: Thu Jan 01 00:00:00 1970 +0000
979 date: Thu Jan 01 00:00:00 1970 +0000
981 summary: commit on test
980 summary: commit on test
982
981
983
982
984
983
985 log -b default -b test
984 log -b default -b test
986
985
987 $ hg log -b default -b test
986 $ hg log -b default -b test
988 changeset: 3:f5d8de11c2e2
987 changeset: 3:f5d8de11c2e2
989 branch: test
988 branch: test
990 tag: tip
989 tag: tip
991 parent: 1:d32277701ccb
990 parent: 1:d32277701ccb
992 user: test
991 user: test
993 date: Thu Jan 01 00:00:00 1970 +0000
992 date: Thu Jan 01 00:00:00 1970 +0000
994 summary: commit on test
993 summary: commit on test
995
994
996 changeset: 2:c3a4f03cc9a7
995 changeset: 2:c3a4f03cc9a7
997 parent: 0:24427303d56f
996 parent: 0:24427303d56f
998 user: test
997 user: test
999 date: Thu Jan 01 00:00:00 1970 +0000
998 date: Thu Jan 01 00:00:00 1970 +0000
1000 summary: commit on default
999 summary: commit on default
1001
1000
1002 changeset: 1:d32277701ccb
1001 changeset: 1:d32277701ccb
1003 branch: test
1002 branch: test
1004 user: test
1003 user: test
1005 date: Thu Jan 01 00:00:00 1970 +0000
1004 date: Thu Jan 01 00:00:00 1970 +0000
1006 summary: commit on test
1005 summary: commit on test
1007
1006
1008 changeset: 0:24427303d56f
1007 changeset: 0:24427303d56f
1009 user: test
1008 user: test
1010 date: Thu Jan 01 00:00:00 1970 +0000
1009 date: Thu Jan 01 00:00:00 1970 +0000
1011 summary: commit on default
1010 summary: commit on default
1012
1011
1013
1012
1014
1013
1015 log -b default -b .
1014 log -b default -b .
1016
1015
1017 $ hg log -b default -b .
1016 $ hg log -b default -b .
1018 changeset: 3:f5d8de11c2e2
1017 changeset: 3:f5d8de11c2e2
1019 branch: test
1018 branch: test
1020 tag: tip
1019 tag: tip
1021 parent: 1:d32277701ccb
1020 parent: 1:d32277701ccb
1022 user: test
1021 user: test
1023 date: Thu Jan 01 00:00:00 1970 +0000
1022 date: Thu Jan 01 00:00:00 1970 +0000
1024 summary: commit on test
1023 summary: commit on test
1025
1024
1026 changeset: 2:c3a4f03cc9a7
1025 changeset: 2:c3a4f03cc9a7
1027 parent: 0:24427303d56f
1026 parent: 0:24427303d56f
1028 user: test
1027 user: test
1029 date: Thu Jan 01 00:00:00 1970 +0000
1028 date: Thu Jan 01 00:00:00 1970 +0000
1030 summary: commit on default
1029 summary: commit on default
1031
1030
1032 changeset: 1:d32277701ccb
1031 changeset: 1:d32277701ccb
1033 branch: test
1032 branch: test
1034 user: test
1033 user: test
1035 date: Thu Jan 01 00:00:00 1970 +0000
1034 date: Thu Jan 01 00:00:00 1970 +0000
1036 summary: commit on test
1035 summary: commit on test
1037
1036
1038 changeset: 0:24427303d56f
1037 changeset: 0:24427303d56f
1039 user: test
1038 user: test
1040 date: Thu Jan 01 00:00:00 1970 +0000
1039 date: Thu Jan 01 00:00:00 1970 +0000
1041 summary: commit on default
1040 summary: commit on default
1042
1041
1043
1042
1044
1043
1045 log -b . -b test
1044 log -b . -b test
1046
1045
1047 $ hg log -b . -b test
1046 $ hg log -b . -b test
1048 changeset: 3:f5d8de11c2e2
1047 changeset: 3:f5d8de11c2e2
1049 branch: test
1048 branch: test
1050 tag: tip
1049 tag: tip
1051 parent: 1:d32277701ccb
1050 parent: 1:d32277701ccb
1052 user: test
1051 user: test
1053 date: Thu Jan 01 00:00:00 1970 +0000
1052 date: Thu Jan 01 00:00:00 1970 +0000
1054 summary: commit on test
1053 summary: commit on test
1055
1054
1056 changeset: 1:d32277701ccb
1055 changeset: 1:d32277701ccb
1057 branch: test
1056 branch: test
1058 user: test
1057 user: test
1059 date: Thu Jan 01 00:00:00 1970 +0000
1058 date: Thu Jan 01 00:00:00 1970 +0000
1060 summary: commit on test
1059 summary: commit on test
1061
1060
1062
1061
1063
1062
1064 log -b 2
1063 log -b 2
1065
1064
1066 $ hg log -b 2
1065 $ hg log -b 2
1067 changeset: 2:c3a4f03cc9a7
1066 changeset: 2:c3a4f03cc9a7
1068 parent: 0:24427303d56f
1067 parent: 0:24427303d56f
1069 user: test
1068 user: test
1070 date: Thu Jan 01 00:00:00 1970 +0000
1069 date: Thu Jan 01 00:00:00 1970 +0000
1071 summary: commit on default
1070 summary: commit on default
1072
1071
1073 changeset: 0:24427303d56f
1072 changeset: 0:24427303d56f
1074 user: test
1073 user: test
1075 date: Thu Jan 01 00:00:00 1970 +0000
1074 date: Thu Jan 01 00:00:00 1970 +0000
1076 summary: commit on default
1075 summary: commit on default
1077
1076
1078 #if gettext
1077 #if gettext
1079
1078
1080 Test that all log names are translated (e.g. branches, bookmarks, tags):
1079 Test that all log names are translated (e.g. branches, bookmarks, tags):
1081
1080
1082 $ hg bookmark babar -r tip
1081 $ hg bookmark babar -r tip
1083
1082
1084 $ HGENCODING=UTF-8 LANGUAGE=de hg log -r tip
1083 $ HGENCODING=UTF-8 LANGUAGE=de hg log -r tip
1085 \xc3\x84nderung: 3:f5d8de11c2e2 (esc)
1084 \xc3\x84nderung: 3:f5d8de11c2e2 (esc)
1086 Zweig: test
1085 Zweig: test
1087 Lesezeichen: babar
1086 Lesezeichen: babar
1088 Marke: tip
1087 Marke: tip
1089 Vorg\xc3\xa4nger: 1:d32277701ccb (esc)
1088 Vorg\xc3\xa4nger: 1:d32277701ccb (esc)
1090 Nutzer: test
1089 Nutzer: test
1091 Datum: Thu Jan 01 00:00:00 1970 +0000
1090 Datum: Thu Jan 01 00:00:00 1970 +0000
1092 Zusammenfassung: commit on test
1091 Zusammenfassung: commit on test
1093
1092
1094 $ hg bookmark -d babar
1093 $ hg bookmark -d babar
1095
1094
1096 #endif
1095 #endif
1097
1096
1098 log -p --cwd dir (in subdir)
1097 log -p --cwd dir (in subdir)
1099
1098
1100 $ mkdir dir
1099 $ mkdir dir
1101 $ hg log -p --cwd dir
1100 $ hg log -p --cwd dir
1102 changeset: 3:f5d8de11c2e2
1101 changeset: 3:f5d8de11c2e2
1103 branch: test
1102 branch: test
1104 tag: tip
1103 tag: tip
1105 parent: 1:d32277701ccb
1104 parent: 1:d32277701ccb
1106 user: test
1105 user: test
1107 date: Thu Jan 01 00:00:00 1970 +0000
1106 date: Thu Jan 01 00:00:00 1970 +0000
1108 summary: commit on test
1107 summary: commit on test
1109
1108
1110 diff -r d32277701ccb -r f5d8de11c2e2 c
1109 diff -r d32277701ccb -r f5d8de11c2e2 c
1111 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1110 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1112 +++ b/c Thu Jan 01 00:00:00 1970 +0000
1111 +++ b/c Thu Jan 01 00:00:00 1970 +0000
1113 @@ -0,0 +1,1 @@
1112 @@ -0,0 +1,1 @@
1114 +c
1113 +c
1115
1114
1116 changeset: 2:c3a4f03cc9a7
1115 changeset: 2:c3a4f03cc9a7
1117 parent: 0:24427303d56f
1116 parent: 0:24427303d56f
1118 user: test
1117 user: test
1119 date: Thu Jan 01 00:00:00 1970 +0000
1118 date: Thu Jan 01 00:00:00 1970 +0000
1120 summary: commit on default
1119 summary: commit on default
1121
1120
1122 diff -r 24427303d56f -r c3a4f03cc9a7 c
1121 diff -r 24427303d56f -r c3a4f03cc9a7 c
1123 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1122 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1124 +++ b/c Thu Jan 01 00:00:00 1970 +0000
1123 +++ b/c Thu Jan 01 00:00:00 1970 +0000
1125 @@ -0,0 +1,1 @@
1124 @@ -0,0 +1,1 @@
1126 +c
1125 +c
1127
1126
1128 changeset: 1:d32277701ccb
1127 changeset: 1:d32277701ccb
1129 branch: test
1128 branch: test
1130 user: test
1129 user: test
1131 date: Thu Jan 01 00:00:00 1970 +0000
1130 date: Thu Jan 01 00:00:00 1970 +0000
1132 summary: commit on test
1131 summary: commit on test
1133
1132
1134 diff -r 24427303d56f -r d32277701ccb b
1133 diff -r 24427303d56f -r d32277701ccb b
1135 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1134 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1136 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1135 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1137 @@ -0,0 +1,1 @@
1136 @@ -0,0 +1,1 @@
1138 +b
1137 +b
1139
1138
1140 changeset: 0:24427303d56f
1139 changeset: 0:24427303d56f
1141 user: test
1140 user: test
1142 date: Thu Jan 01 00:00:00 1970 +0000
1141 date: Thu Jan 01 00:00:00 1970 +0000
1143 summary: commit on default
1142 summary: commit on default
1144
1143
1145 diff -r 000000000000 -r 24427303d56f a
1144 diff -r 000000000000 -r 24427303d56f a
1146 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1145 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1147 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1146 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1148 @@ -0,0 +1,1 @@
1147 @@ -0,0 +1,1 @@
1149 +a
1148 +a
1150
1149
1151
1150
1152
1151
1153 log -p -R repo
1152 log -p -R repo
1154
1153
1155 $ cd dir
1154 $ cd dir
1156 $ hg log -p -R .. ../a
1155 $ hg log -p -R .. ../a
1157 changeset: 0:24427303d56f
1156 changeset: 0:24427303d56f
1158 user: test
1157 user: test
1159 date: Thu Jan 01 00:00:00 1970 +0000
1158 date: Thu Jan 01 00:00:00 1970 +0000
1160 summary: commit on default
1159 summary: commit on default
1161
1160
1162 diff -r 000000000000 -r 24427303d56f a
1161 diff -r 000000000000 -r 24427303d56f a
1163 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1162 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1164 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1163 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1165 @@ -0,0 +1,1 @@
1164 @@ -0,0 +1,1 @@
1166 +a
1165 +a
1167
1166
1168
1167
1169 $ cd ../..
1168 $ cd ../..
1170
1169
1171 $ hg init follow2
1170 $ hg init follow2
1172 $ cd follow2
1171 $ cd follow2
1173
1172
1174 # Build the following history:
1173 # Build the following history:
1175 # tip - o - x - o - x - x
1174 # tip - o - x - o - x - x
1176 # \ /
1175 # \ /
1177 # o - o - o - x
1176 # o - o - o - x
1178 # \ /
1177 # \ /
1179 # o
1178 # o
1180 #
1179 #
1181 # Where "o" is a revision containing "foo" and
1180 # Where "o" is a revision containing "foo" and
1182 # "x" is a revision without "foo"
1181 # "x" is a revision without "foo"
1183
1182
1184 $ touch init
1183 $ touch init
1185 $ hg ci -A -m "init, unrelated"
1184 $ hg ci -A -m "init, unrelated"
1186 adding init
1185 adding init
1187 $ echo 'foo' > init
1186 $ echo 'foo' > init
1188 $ hg ci -m "change, unrelated"
1187 $ hg ci -m "change, unrelated"
1189 $ echo 'foo' > foo
1188 $ echo 'foo' > foo
1190 $ hg ci -A -m "add unrelated old foo"
1189 $ hg ci -A -m "add unrelated old foo"
1191 adding foo
1190 adding foo
1192 $ hg rm foo
1191 $ hg rm foo
1193 $ hg ci -m "delete foo, unrelated"
1192 $ hg ci -m "delete foo, unrelated"
1194 $ echo 'related' > foo
1193 $ echo 'related' > foo
1195 $ hg ci -A -m "add foo, related"
1194 $ hg ci -A -m "add foo, related"
1196 adding foo
1195 adding foo
1197
1196
1198 $ hg up 0
1197 $ hg up 0
1199 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1198 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1200 $ touch branch
1199 $ touch branch
1201 $ hg ci -A -m "first branch, unrelated"
1200 $ hg ci -A -m "first branch, unrelated"
1202 adding branch
1201 adding branch
1203 created new head
1202 created new head
1204 $ touch foo
1203 $ touch foo
1205 $ hg ci -A -m "create foo, related"
1204 $ hg ci -A -m "create foo, related"
1206 adding foo
1205 adding foo
1207 $ echo 'change' > foo
1206 $ echo 'change' > foo
1208 $ hg ci -m "change foo, related"
1207 $ hg ci -m "change foo, related"
1209
1208
1210 $ hg up 6
1209 $ hg up 6
1211 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1210 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1212 $ echo 'change foo in branch' > foo
1211 $ echo 'change foo in branch' > foo
1213 $ hg ci -m "change foo in branch, related"
1212 $ hg ci -m "change foo in branch, related"
1214 created new head
1213 created new head
1215 $ hg merge 7
1214 $ hg merge 7
1216 merging foo
1215 merging foo
1217 warning: conflicts during merge.
1216 warning: conflicts during merge.
1218 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1217 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1219 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1218 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1220 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1219 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1221 [1]
1220 [1]
1222 $ echo 'merge 1' > foo
1221 $ echo 'merge 1' > foo
1223 $ hg resolve -m foo
1222 $ hg resolve -m foo
1224 (no more unresolved files)
1223 (no more unresolved files)
1225 $ hg ci -m "First merge, related"
1224 $ hg ci -m "First merge, related"
1226
1225
1227 $ hg merge 4
1226 $ hg merge 4
1228 merging foo
1227 merging foo
1229 warning: conflicts during merge.
1228 warning: conflicts during merge.
1230 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1229 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1231 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
1230 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
1232 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1231 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1233 [1]
1232 [1]
1234 $ echo 'merge 2' > foo
1233 $ echo 'merge 2' > foo
1235 $ hg resolve -m foo
1234 $ hg resolve -m foo
1236 (no more unresolved files)
1235 (no more unresolved files)
1237 $ hg ci -m "Last merge, related"
1236 $ hg ci -m "Last merge, related"
1238
1237
1239 $ hg log --graph
1238 $ hg log --graph
1240 @ changeset: 10:4dae8563d2c5
1239 @ changeset: 10:4dae8563d2c5
1241 |\ tag: tip
1240 |\ tag: tip
1242 | | parent: 9:7b35701b003e
1241 | | parent: 9:7b35701b003e
1243 | | parent: 4:88176d361b69
1242 | | parent: 4:88176d361b69
1244 | | user: test
1243 | | user: test
1245 | | date: Thu Jan 01 00:00:00 1970 +0000
1244 | | date: Thu Jan 01 00:00:00 1970 +0000
1246 | | summary: Last merge, related
1245 | | summary: Last merge, related
1247 | |
1246 | |
1248 | o changeset: 9:7b35701b003e
1247 | o changeset: 9:7b35701b003e
1249 | |\ parent: 8:e5416ad8a855
1248 | |\ parent: 8:e5416ad8a855
1250 | | | parent: 7:87fe3144dcfa
1249 | | | parent: 7:87fe3144dcfa
1251 | | | user: test
1250 | | | user: test
1252 | | | date: Thu Jan 01 00:00:00 1970 +0000
1251 | | | date: Thu Jan 01 00:00:00 1970 +0000
1253 | | | summary: First merge, related
1252 | | | summary: First merge, related
1254 | | |
1253 | | |
1255 | | o changeset: 8:e5416ad8a855
1254 | | o changeset: 8:e5416ad8a855
1256 | | | parent: 6:dc6c325fe5ee
1255 | | | parent: 6:dc6c325fe5ee
1257 | | | user: test
1256 | | | user: test
1258 | | | date: Thu Jan 01 00:00:00 1970 +0000
1257 | | | date: Thu Jan 01 00:00:00 1970 +0000
1259 | | | summary: change foo in branch, related
1258 | | | summary: change foo in branch, related
1260 | | |
1259 | | |
1261 | o | changeset: 7:87fe3144dcfa
1260 | o | changeset: 7:87fe3144dcfa
1262 | |/ user: test
1261 | |/ user: test
1263 | | date: Thu Jan 01 00:00:00 1970 +0000
1262 | | date: Thu Jan 01 00:00:00 1970 +0000
1264 | | summary: change foo, related
1263 | | summary: change foo, related
1265 | |
1264 | |
1266 | o changeset: 6:dc6c325fe5ee
1265 | o changeset: 6:dc6c325fe5ee
1267 | | user: test
1266 | | user: test
1268 | | date: Thu Jan 01 00:00:00 1970 +0000
1267 | | date: Thu Jan 01 00:00:00 1970 +0000
1269 | | summary: create foo, related
1268 | | summary: create foo, related
1270 | |
1269 | |
1271 | o changeset: 5:73db34516eb9
1270 | o changeset: 5:73db34516eb9
1272 | | parent: 0:e87515fd044a
1271 | | parent: 0:e87515fd044a
1273 | | user: test
1272 | | user: test
1274 | | date: Thu Jan 01 00:00:00 1970 +0000
1273 | | date: Thu Jan 01 00:00:00 1970 +0000
1275 | | summary: first branch, unrelated
1274 | | summary: first branch, unrelated
1276 | |
1275 | |
1277 o | changeset: 4:88176d361b69
1276 o | changeset: 4:88176d361b69
1278 | | user: test
1277 | | user: test
1279 | | date: Thu Jan 01 00:00:00 1970 +0000
1278 | | date: Thu Jan 01 00:00:00 1970 +0000
1280 | | summary: add foo, related
1279 | | summary: add foo, related
1281 | |
1280 | |
1282 o | changeset: 3:dd78ae4afb56
1281 o | changeset: 3:dd78ae4afb56
1283 | | user: test
1282 | | user: test
1284 | | date: Thu Jan 01 00:00:00 1970 +0000
1283 | | date: Thu Jan 01 00:00:00 1970 +0000
1285 | | summary: delete foo, unrelated
1284 | | summary: delete foo, unrelated
1286 | |
1285 | |
1287 o | changeset: 2:c4c64aedf0f7
1286 o | changeset: 2:c4c64aedf0f7
1288 | | user: test
1287 | | user: test
1289 | | date: Thu Jan 01 00:00:00 1970 +0000
1288 | | date: Thu Jan 01 00:00:00 1970 +0000
1290 | | summary: add unrelated old foo
1289 | | summary: add unrelated old foo
1291 | |
1290 | |
1292 o | changeset: 1:e5faa7440653
1291 o | changeset: 1:e5faa7440653
1293 |/ user: test
1292 |/ user: test
1294 | date: Thu Jan 01 00:00:00 1970 +0000
1293 | date: Thu Jan 01 00:00:00 1970 +0000
1295 | summary: change, unrelated
1294 | summary: change, unrelated
1296 |
1295 |
1297 o changeset: 0:e87515fd044a
1296 o changeset: 0:e87515fd044a
1298 user: test
1297 user: test
1299 date: Thu Jan 01 00:00:00 1970 +0000
1298 date: Thu Jan 01 00:00:00 1970 +0000
1300 summary: init, unrelated
1299 summary: init, unrelated
1301
1300
1302
1301
1303 $ hg --traceback log -f foo
1302 $ hg --traceback log -f foo
1304 changeset: 10:4dae8563d2c5
1303 changeset: 10:4dae8563d2c5
1305 tag: tip
1304 tag: tip
1306 parent: 9:7b35701b003e
1305 parent: 9:7b35701b003e
1307 parent: 4:88176d361b69
1306 parent: 4:88176d361b69
1308 user: test
1307 user: test
1309 date: Thu Jan 01 00:00:00 1970 +0000
1308 date: Thu Jan 01 00:00:00 1970 +0000
1310 summary: Last merge, related
1309 summary: Last merge, related
1311
1310
1312 changeset: 9:7b35701b003e
1311 changeset: 9:7b35701b003e
1313 parent: 8:e5416ad8a855
1312 parent: 8:e5416ad8a855
1314 parent: 7:87fe3144dcfa
1313 parent: 7:87fe3144dcfa
1315 user: test
1314 user: test
1316 date: Thu Jan 01 00:00:00 1970 +0000
1315 date: Thu Jan 01 00:00:00 1970 +0000
1317 summary: First merge, related
1316 summary: First merge, related
1318
1317
1319 changeset: 8:e5416ad8a855
1318 changeset: 8:e5416ad8a855
1320 parent: 6:dc6c325fe5ee
1319 parent: 6:dc6c325fe5ee
1321 user: test
1320 user: test
1322 date: Thu Jan 01 00:00:00 1970 +0000
1321 date: Thu Jan 01 00:00:00 1970 +0000
1323 summary: change foo in branch, related
1322 summary: change foo in branch, related
1324
1323
1325 changeset: 7:87fe3144dcfa
1324 changeset: 7:87fe3144dcfa
1326 user: test
1325 user: test
1327 date: Thu Jan 01 00:00:00 1970 +0000
1326 date: Thu Jan 01 00:00:00 1970 +0000
1328 summary: change foo, related
1327 summary: change foo, related
1329
1328
1330 changeset: 6:dc6c325fe5ee
1329 changeset: 6:dc6c325fe5ee
1331 user: test
1330 user: test
1332 date: Thu Jan 01 00:00:00 1970 +0000
1331 date: Thu Jan 01 00:00:00 1970 +0000
1333 summary: create foo, related
1332 summary: create foo, related
1334
1333
1335 changeset: 4:88176d361b69
1334 changeset: 4:88176d361b69
1336 user: test
1335 user: test
1337 date: Thu Jan 01 00:00:00 1970 +0000
1336 date: Thu Jan 01 00:00:00 1970 +0000
1338 summary: add foo, related
1337 summary: add foo, related
1339
1338
1340
1339
1341 Also check when maxrev < lastrevfilelog
1340 Also check when maxrev < lastrevfilelog
1342
1341
1343 $ hg --traceback log -f -r4 foo
1342 $ hg --traceback log -f -r4 foo
1344 changeset: 4:88176d361b69
1343 changeset: 4:88176d361b69
1345 user: test
1344 user: test
1346 date: Thu Jan 01 00:00:00 1970 +0000
1345 date: Thu Jan 01 00:00:00 1970 +0000
1347 summary: add foo, related
1346 summary: add foo, related
1348
1347
1348 changeset: 2:c4c64aedf0f7
1349 user: test
1350 date: Thu Jan 01 00:00:00 1970 +0000
1351 summary: add unrelated old foo
1352
1349 $ cd ..
1353 $ cd ..
1350
1354
1351 Issue2383: hg log showing _less_ differences than hg diff
1355 Issue2383: hg log showing _less_ differences than hg diff
1352
1356
1353 $ hg init issue2383
1357 $ hg init issue2383
1354 $ cd issue2383
1358 $ cd issue2383
1355
1359
1356 Create a test repo:
1360 Create a test repo:
1357
1361
1358 $ echo a > a
1362 $ echo a > a
1359 $ hg ci -Am0
1363 $ hg ci -Am0
1360 adding a
1364 adding a
1361 $ echo b > b
1365 $ echo b > b
1362 $ hg ci -Am1
1366 $ hg ci -Am1
1363 adding b
1367 adding b
1364 $ hg co 0
1368 $ hg co 0
1365 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1369 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1366 $ echo b > a
1370 $ echo b > a
1367 $ hg ci -m2
1371 $ hg ci -m2
1368 created new head
1372 created new head
1369
1373
1370 Merge:
1374 Merge:
1371
1375
1372 $ hg merge
1376 $ hg merge
1373 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1377 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1374 (branch merge, don't forget to commit)
1378 (branch merge, don't forget to commit)
1375
1379
1376 Make sure there's a file listed in the merge to trigger the bug:
1380 Make sure there's a file listed in the merge to trigger the bug:
1377
1381
1378 $ echo c > a
1382 $ echo c > a
1379 $ hg ci -m3
1383 $ hg ci -m3
1380
1384
1381 Two files shown here in diff:
1385 Two files shown here in diff:
1382
1386
1383 $ hg diff --rev 2:3
1387 $ hg diff --rev 2:3
1384 diff -r b09be438c43a -r 8e07aafe1edc a
1388 diff -r b09be438c43a -r 8e07aafe1edc a
1385 --- a/a Thu Jan 01 00:00:00 1970 +0000
1389 --- a/a Thu Jan 01 00:00:00 1970 +0000
1386 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1390 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1387 @@ -1,1 +1,1 @@
1391 @@ -1,1 +1,1 @@
1388 -b
1392 -b
1389 +c
1393 +c
1390 diff -r b09be438c43a -r 8e07aafe1edc b
1394 diff -r b09be438c43a -r 8e07aafe1edc b
1391 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1395 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1392 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1396 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1393 @@ -0,0 +1,1 @@
1397 @@ -0,0 +1,1 @@
1394 +b
1398 +b
1395
1399
1396 Diff here should be the same:
1400 Diff here should be the same:
1397
1401
1398 $ hg log -vpr 3
1402 $ hg log -vpr 3
1399 changeset: 3:8e07aafe1edc
1403 changeset: 3:8e07aafe1edc
1400 tag: tip
1404 tag: tip
1401 parent: 2:b09be438c43a
1405 parent: 2:b09be438c43a
1402 parent: 1:925d80f479bb
1406 parent: 1:925d80f479bb
1403 user: test
1407 user: test
1404 date: Thu Jan 01 00:00:00 1970 +0000
1408 date: Thu Jan 01 00:00:00 1970 +0000
1405 files: a
1409 files: a
1406 description:
1410 description:
1407 3
1411 3
1408
1412
1409
1413
1410 diff -r b09be438c43a -r 8e07aafe1edc a
1414 diff -r b09be438c43a -r 8e07aafe1edc a
1411 --- a/a Thu Jan 01 00:00:00 1970 +0000
1415 --- a/a Thu Jan 01 00:00:00 1970 +0000
1412 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1416 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1413 @@ -1,1 +1,1 @@
1417 @@ -1,1 +1,1 @@
1414 -b
1418 -b
1415 +c
1419 +c
1416 diff -r b09be438c43a -r 8e07aafe1edc b
1420 diff -r b09be438c43a -r 8e07aafe1edc b
1417 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1421 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1418 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1422 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1419 @@ -0,0 +1,1 @@
1423 @@ -0,0 +1,1 @@
1420 +b
1424 +b
1421
1425
1422 $ cd ..
1426 $ cd ..
1423
1427
1424 'hg log -r rev fn' when last(filelog(fn)) != rev
1428 'hg log -r rev fn' when last(filelog(fn)) != rev
1425
1429
1426 $ hg init simplelog
1430 $ hg init simplelog
1427 $ cd simplelog
1431 $ cd simplelog
1428 $ echo f > a
1432 $ echo f > a
1429 $ hg ci -Am'a' -d '0 0'
1433 $ hg ci -Am'a' -d '0 0'
1430 adding a
1434 adding a
1431 $ echo f >> a
1435 $ echo f >> a
1432 $ hg ci -Am'a bis' -d '1 0'
1436 $ hg ci -Am'a bis' -d '1 0'
1433
1437
1434 $ hg log -r0 a
1438 $ hg log -r0 a
1435 changeset: 0:9f758d63dcde
1439 changeset: 0:9f758d63dcde
1436 user: test
1440 user: test
1437 date: Thu Jan 01 00:00:00 1970 +0000
1441 date: Thu Jan 01 00:00:00 1970 +0000
1438 summary: a
1442 summary: a
1439
1443
1440 enable obsolete to test hidden feature
1444 enable obsolete to test hidden feature
1441
1445
1442 $ cat >> $HGRCPATH << EOF
1446 $ cat >> $HGRCPATH << EOF
1443 > [experimental]
1447 > [experimental]
1444 > evolution=createmarkers
1448 > evolution=createmarkers
1445 > EOF
1449 > EOF
1446
1450
1447 $ hg log --template='{rev}:{node}\n'
1451 $ hg log --template='{rev}:{node}\n'
1448 1:a765632148dc55d38c35c4f247c618701886cb2f
1452 1:a765632148dc55d38c35c4f247c618701886cb2f
1449 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1453 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1450 $ hg debugobsolete a765632148dc55d38c35c4f247c618701886cb2f
1454 $ hg debugobsolete a765632148dc55d38c35c4f247c618701886cb2f
1451 $ hg up null -q
1455 $ hg up null -q
1452 $ hg log --template='{rev}:{node}\n'
1456 $ hg log --template='{rev}:{node}\n'
1453 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1457 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1454 $ hg log --template='{rev}:{node}\n' --hidden
1458 $ hg log --template='{rev}:{node}\n' --hidden
1455 1:a765632148dc55d38c35c4f247c618701886cb2f
1459 1:a765632148dc55d38c35c4f247c618701886cb2f
1456 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1460 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1457 $ hg log -r a
1461 $ hg log -r a
1458 abort: hidden revision 'a'!
1462 abort: hidden revision 'a'!
1459 (use --hidden to access hidden revisions)
1463 (use --hidden to access hidden revisions)
1460 [255]
1464 [255]
1461
1465
1462 test that parent prevent a changeset to be hidden
1466 test that parent prevent a changeset to be hidden
1463
1467
1464 $ hg up 1 -q --hidden
1468 $ hg up 1 -q --hidden
1465 $ hg log --template='{rev}:{node}\n'
1469 $ hg log --template='{rev}:{node}\n'
1466 1:a765632148dc55d38c35c4f247c618701886cb2f
1470 1:a765632148dc55d38c35c4f247c618701886cb2f
1467 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1471 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1468
1472
1469 test that second parent prevent a changeset to be hidden too
1473 test that second parent prevent a changeset to be hidden too
1470
1474
1471 $ hg debugsetparents 0 1 # nothing suitable to merge here
1475 $ hg debugsetparents 0 1 # nothing suitable to merge here
1472 $ hg log --template='{rev}:{node}\n'
1476 $ hg log --template='{rev}:{node}\n'
1473 1:a765632148dc55d38c35c4f247c618701886cb2f
1477 1:a765632148dc55d38c35c4f247c618701886cb2f
1474 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1478 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1475 $ hg debugsetparents 1
1479 $ hg debugsetparents 1
1476 $ hg up -q null
1480 $ hg up -q null
1477
1481
1478 bookmarks prevent a changeset being hidden
1482 bookmarks prevent a changeset being hidden
1479
1483
1480 $ hg bookmark --hidden -r 1 X
1484 $ hg bookmark --hidden -r 1 X
1481 $ hg log --template '{rev}:{node}\n'
1485 $ hg log --template '{rev}:{node}\n'
1482 1:a765632148dc55d38c35c4f247c618701886cb2f
1486 1:a765632148dc55d38c35c4f247c618701886cb2f
1483 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1487 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1484 $ hg bookmark -d X
1488 $ hg bookmark -d X
1485
1489
1486 divergent bookmarks are not hidden
1490 divergent bookmarks are not hidden
1487
1491
1488 $ hg bookmark --hidden -r 1 X@foo
1492 $ hg bookmark --hidden -r 1 X@foo
1489 $ hg log --template '{rev}:{node}\n'
1493 $ hg log --template '{rev}:{node}\n'
1490 1:a765632148dc55d38c35c4f247c618701886cb2f
1494 1:a765632148dc55d38c35c4f247c618701886cb2f
1491 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1495 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1492
1496
1493 clear extensions configuration
1497 clear extensions configuration
1494 $ echo '[extensions]' >> $HGRCPATH
1498 $ echo '[extensions]' >> $HGRCPATH
1495 $ echo "obs=!" >> $HGRCPATH
1499 $ echo "obs=!" >> $HGRCPATH
1496 $ cd ..
1500 $ cd ..
1497
1501
1498 test -u/-k for problematic encoding
1502 test -u/-k for problematic encoding
1499 # unicode: cp932:
1503 # unicode: cp932:
1500 # u30A2 0x83 0x41(= 'A')
1504 # u30A2 0x83 0x41(= 'A')
1501 # u30C2 0x83 0x61(= 'a')
1505 # u30C2 0x83 0x61(= 'a')
1502
1506
1503 $ hg init problematicencoding
1507 $ hg init problematicencoding
1504 $ cd problematicencoding
1508 $ cd problematicencoding
1505
1509
1506 $ python > setup.sh <<EOF
1510 $ python > setup.sh <<EOF
1507 > print u'''
1511 > print u'''
1508 > echo a > text
1512 > echo a > text
1509 > hg add text
1513 > hg add text
1510 > hg --encoding utf-8 commit -u '\u30A2' -m none
1514 > hg --encoding utf-8 commit -u '\u30A2' -m none
1511 > echo b > text
1515 > echo b > text
1512 > hg --encoding utf-8 commit -u '\u30C2' -m none
1516 > hg --encoding utf-8 commit -u '\u30C2' -m none
1513 > echo c > text
1517 > echo c > text
1514 > hg --encoding utf-8 commit -u none -m '\u30A2'
1518 > hg --encoding utf-8 commit -u none -m '\u30A2'
1515 > echo d > text
1519 > echo d > text
1516 > hg --encoding utf-8 commit -u none -m '\u30C2'
1520 > hg --encoding utf-8 commit -u none -m '\u30C2'
1517 > '''.encode('utf-8')
1521 > '''.encode('utf-8')
1518 > EOF
1522 > EOF
1519 $ sh < setup.sh
1523 $ sh < setup.sh
1520
1524
1521 test in problematic encoding
1525 test in problematic encoding
1522 $ python > test.sh <<EOF
1526 $ python > test.sh <<EOF
1523 > print u'''
1527 > print u'''
1524 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2'
1528 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2'
1525 > echo ====
1529 > echo ====
1526 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2'
1530 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2'
1527 > echo ====
1531 > echo ====
1528 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2'
1532 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2'
1529 > echo ====
1533 > echo ====
1530 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2'
1534 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2'
1531 > '''.encode('cp932')
1535 > '''.encode('cp932')
1532 > EOF
1536 > EOF
1533 $ sh < test.sh
1537 $ sh < test.sh
1534 0
1538 0
1535 ====
1539 ====
1536 1
1540 1
1537 ====
1541 ====
1538 2
1542 2
1539 0
1543 0
1540 ====
1544 ====
1541 3
1545 3
1542 1
1546 1
1543
1547
1544 $ cd ..
1548 $ cd ..
1545
1549
1546 test hg log on non-existent files and on directories
1550 test hg log on non-existent files and on directories
1547 $ hg init issue1340
1551 $ hg init issue1340
1548 $ cd issue1340
1552 $ cd issue1340
1549 $ mkdir d1; mkdir D2; mkdir D3.i; mkdir d4.hg; mkdir d5.d; mkdir .d6
1553 $ mkdir d1; mkdir D2; mkdir D3.i; mkdir d4.hg; mkdir d5.d; mkdir .d6
1550 $ echo 1 > d1/f1
1554 $ echo 1 > d1/f1
1551 $ echo 1 > D2/f1
1555 $ echo 1 > D2/f1
1552 $ echo 1 > D3.i/f1
1556 $ echo 1 > D3.i/f1
1553 $ echo 1 > d4.hg/f1
1557 $ echo 1 > d4.hg/f1
1554 $ echo 1 > d5.d/f1
1558 $ echo 1 > d5.d/f1
1555 $ echo 1 > .d6/f1
1559 $ echo 1 > .d6/f1
1556 $ hg -q add .
1560 $ hg -q add .
1557 $ hg commit -m "a bunch of weird directories"
1561 $ hg commit -m "a bunch of weird directories"
1558 $ hg log -l1 d1/f1 | grep changeset
1562 $ hg log -l1 d1/f1 | grep changeset
1559 changeset: 0:65624cd9070a
1563 changeset: 0:65624cd9070a
1560 $ hg log -l1 f1
1564 $ hg log -l1 f1
1561 $ hg log -l1 . | grep changeset
1565 $ hg log -l1 . | grep changeset
1562 changeset: 0:65624cd9070a
1566 changeset: 0:65624cd9070a
1563 $ hg log -l1 ./ | grep changeset
1567 $ hg log -l1 ./ | grep changeset
1564 changeset: 0:65624cd9070a
1568 changeset: 0:65624cd9070a
1565 $ hg log -l1 d1 | grep changeset
1569 $ hg log -l1 d1 | grep changeset
1566 changeset: 0:65624cd9070a
1570 changeset: 0:65624cd9070a
1567 $ hg log -l1 D2 | grep changeset
1571 $ hg log -l1 D2 | grep changeset
1568 changeset: 0:65624cd9070a
1572 changeset: 0:65624cd9070a
1569 $ hg log -l1 D2/f1 | grep changeset
1573 $ hg log -l1 D2/f1 | grep changeset
1570 changeset: 0:65624cd9070a
1574 changeset: 0:65624cd9070a
1571 $ hg log -l1 D3.i | grep changeset
1575 $ hg log -l1 D3.i | grep changeset
1572 changeset: 0:65624cd9070a
1576 changeset: 0:65624cd9070a
1573 $ hg log -l1 D3.i/f1 | grep changeset
1577 $ hg log -l1 D3.i/f1 | grep changeset
1574 changeset: 0:65624cd9070a
1578 changeset: 0:65624cd9070a
1575 $ hg log -l1 d4.hg | grep changeset
1579 $ hg log -l1 d4.hg | grep changeset
1576 changeset: 0:65624cd9070a
1580 changeset: 0:65624cd9070a
1577 $ hg log -l1 d4.hg/f1 | grep changeset
1581 $ hg log -l1 d4.hg/f1 | grep changeset
1578 changeset: 0:65624cd9070a
1582 changeset: 0:65624cd9070a
1579 $ hg log -l1 d5.d | grep changeset
1583 $ hg log -l1 d5.d | grep changeset
1580 changeset: 0:65624cd9070a
1584 changeset: 0:65624cd9070a
1581 $ hg log -l1 d5.d/f1 | grep changeset
1585 $ hg log -l1 d5.d/f1 | grep changeset
1582 changeset: 0:65624cd9070a
1586 changeset: 0:65624cd9070a
1583 $ hg log -l1 .d6 | grep changeset
1587 $ hg log -l1 .d6 | grep changeset
1584 changeset: 0:65624cd9070a
1588 changeset: 0:65624cd9070a
1585 $ hg log -l1 .d6/f1 | grep changeset
1589 $ hg log -l1 .d6/f1 | grep changeset
1586 changeset: 0:65624cd9070a
1590 changeset: 0:65624cd9070a
1587
1591
1588 issue3772: hg log -r :null showing revision 0 as well
1592 issue3772: hg log -r :null showing revision 0 as well
1589
1593
1590 $ hg log -r :null
1594 $ hg log -r :null
1591 changeset: 0:65624cd9070a
1595 changeset: 0:65624cd9070a
1592 tag: tip
1596 tag: tip
1593 user: test
1597 user: test
1594 date: Thu Jan 01 00:00:00 1970 +0000
1598 date: Thu Jan 01 00:00:00 1970 +0000
1595 summary: a bunch of weird directories
1599 summary: a bunch of weird directories
1596
1600
1597 changeset: -1:000000000000
1601 changeset: -1:000000000000
1598 user:
1602 user:
1599 date: Thu Jan 01 00:00:00 1970 +0000
1603 date: Thu Jan 01 00:00:00 1970 +0000
1600
1604
1601 $ hg log -r null:null
1605 $ hg log -r null:null
1602 changeset: -1:000000000000
1606 changeset: -1:000000000000
1603 user:
1607 user:
1604 date: Thu Jan 01 00:00:00 1970 +0000
1608 date: Thu Jan 01 00:00:00 1970 +0000
1605
1609
1606 Check that adding an arbitrary name shows up in log automatically
1610 Check that adding an arbitrary name shows up in log automatically
1607
1611
1608 $ cat > ../names.py <<EOF
1612 $ cat > ../names.py <<EOF
1609 > """A small extension to test adding arbitrary names to a repo"""
1613 > """A small extension to test adding arbitrary names to a repo"""
1610 > from mercurial.namespaces import namespace
1614 > from mercurial.namespaces import namespace
1611 >
1615 >
1612 > def reposetup(ui, repo):
1616 > def reposetup(ui, repo):
1613 > foo = {'foo': repo[0].node()}
1617 > foo = {'foo': repo[0].node()}
1614 > names = lambda r: foo.keys()
1618 > names = lambda r: foo.keys()
1615 > namemap = lambda r, name: foo.get(name)
1619 > namemap = lambda r, name: foo.get(name)
1616 > nodemap = lambda r, node: [name for name, n in foo.iteritems()
1620 > nodemap = lambda r, node: [name for name, n in foo.iteritems()
1617 > if n == node]
1621 > if n == node]
1618 > ns = namespace("bars", templatename="bar", logname="barlog",
1622 > ns = namespace("bars", templatename="bar", logname="barlog",
1619 > colorname="barcolor", listnames=names, namemap=namemap,
1623 > colorname="barcolor", listnames=names, namemap=namemap,
1620 > nodemap=nodemap)
1624 > nodemap=nodemap)
1621 >
1625 >
1622 > repo.names.addnamespace(ns)
1626 > repo.names.addnamespace(ns)
1623 > EOF
1627 > EOF
1624
1628
1625 $ hg --config extensions.names=../names.py log -r 0
1629 $ hg --config extensions.names=../names.py log -r 0
1626 changeset: 0:65624cd9070a
1630 changeset: 0:65624cd9070a
1627 tag: tip
1631 tag: tip
1628 barlog: foo
1632 barlog: foo
1629 user: test
1633 user: test
1630 date: Thu Jan 01 00:00:00 1970 +0000
1634 date: Thu Jan 01 00:00:00 1970 +0000
1631 summary: a bunch of weird directories
1635 summary: a bunch of weird directories
1632
1636
1633 $ hg --config extensions.names=../names.py \
1637 $ hg --config extensions.names=../names.py \
1634 > --config extensions.color= --config color.log.barcolor=red \
1638 > --config extensions.color= --config color.log.barcolor=red \
1635 > --color=always log -r 0
1639 > --color=always log -r 0
1636 \x1b[0;33mchangeset: 0:65624cd9070a\x1b[0m (esc)
1640 \x1b[0;33mchangeset: 0:65624cd9070a\x1b[0m (esc)
1637 tag: tip
1641 tag: tip
1638 \x1b[0;31mbarlog: foo\x1b[0m (esc)
1642 \x1b[0;31mbarlog: foo\x1b[0m (esc)
1639 user: test
1643 user: test
1640 date: Thu Jan 01 00:00:00 1970 +0000
1644 date: Thu Jan 01 00:00:00 1970 +0000
1641 summary: a bunch of weird directories
1645 summary: a bunch of weird directories
1642
1646
1643 $ hg --config extensions.names=../names.py log -r 0 --template '{bars}\n'
1647 $ hg --config extensions.names=../names.py log -r 0 --template '{bars}\n'
1644 foo
1648 foo
1645
1649
1646 $ cd ..
1650 $ cd ..
1647
1651
1648 hg log -f dir across branches
1652 hg log -f dir across branches
1649
1653
1650 $ hg init acrossbranches
1654 $ hg init acrossbranches
1651 $ cd acrossbranches
1655 $ cd acrossbranches
1652 $ mkdir d
1656 $ mkdir d
1653 $ echo a > d/a && hg ci -Aqm a
1657 $ echo a > d/a && hg ci -Aqm a
1654 $ echo b > d/a && hg ci -Aqm b
1658 $ echo b > d/a && hg ci -Aqm b
1655 $ hg up -q 0
1659 $ hg up -q 0
1656 $ echo b > d/a && hg ci -Aqm c
1660 $ echo b > d/a && hg ci -Aqm c
1657 $ hg log -f d -T '{desc}' -G
1661 $ hg log -f d -T '{desc}' -G
1658 @ c
1662 @ c
1659 |
1663 |
1660 o a
1664 o a
1661
1665
1662 Ensure that largefiles doesn't interfere with following a normal file
1666 Ensure that largefiles doesn't interfere with following a normal file
1663 $ hg --config extensions.largefiles= log -f d -T '{desc}' -G
1667 $ hg --config extensions.largefiles= log -f d -T '{desc}' -G
1664 @ c
1668 @ c
1665 |
1669 |
1666 o a
1670 o a
1667
1671
1668 $ hg log -f d/a -T '{desc}' -G
1672 $ hg log -f d/a -T '{desc}' -G
1669 @ c
1673 @ c
1670 |
1674 |
1671 o a
1675 o a
1672
1676
1673 $ cd ..
1677 $ cd ..
1674
1678
1675 hg log -f with linkrev pointing to another branch
1679 hg log -f with linkrev pointing to another branch
1676 -------------------------------------------------
1680 -------------------------------------------------
1677
1681
1678 create history with a filerev whose linkrev points to another branch
1682 create history with a filerev whose linkrev points to another branch
1679
1683
1680 $ hg init branchedlinkrev
1684 $ hg init branchedlinkrev
1681 $ cd branchedlinkrev
1685 $ cd branchedlinkrev
1682 $ echo 1 > a
1686 $ echo 1 > a
1683 $ hg commit -Am 'content1'
1687 $ hg commit -Am 'content1'
1684 adding a
1688 adding a
1685 $ echo 2 > a
1689 $ echo 2 > a
1686 $ hg commit -m 'content2'
1690 $ hg commit -m 'content2'
1687 $ hg up --rev 'desc(content1)'
1691 $ hg up --rev 'desc(content1)'
1688 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1692 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1689 $ echo unrelated > unrelated
1693 $ echo unrelated > unrelated
1690 $ hg commit -Am 'unrelated'
1694 $ hg commit -Am 'unrelated'
1691 adding unrelated
1695 adding unrelated
1692 created new head
1696 created new head
1693 $ hg graft -r 'desc(content2)'
1697 $ hg graft -r 'desc(content2)'
1694 grafting 1:2294ae80ad84 "content2"
1698 grafting 1:2294ae80ad84 "content2"
1695 $ echo 3 > a
1699 $ echo 3 > a
1696 $ hg commit -m 'content3'
1700 $ hg commit -m 'content3'
1697 $ hg log -G
1701 $ hg log -G
1698 @ changeset: 4:50b9b36e9c5d
1702 @ changeset: 4:50b9b36e9c5d
1699 | tag: tip
1703 | tag: tip
1700 | user: test
1704 | user: test
1701 | date: Thu Jan 01 00:00:00 1970 +0000
1705 | date: Thu Jan 01 00:00:00 1970 +0000
1702 | summary: content3
1706 | summary: content3
1703 |
1707 |
1704 o changeset: 3:15b2327059e5
1708 o changeset: 3:15b2327059e5
1705 | user: test
1709 | user: test
1706 | date: Thu Jan 01 00:00:00 1970 +0000
1710 | date: Thu Jan 01 00:00:00 1970 +0000
1707 | summary: content2
1711 | summary: content2
1708 |
1712 |
1709 o changeset: 2:2029acd1168c
1713 o changeset: 2:2029acd1168c
1710 | parent: 0:ae0a3c9f9e95
1714 | parent: 0:ae0a3c9f9e95
1711 | user: test
1715 | user: test
1712 | date: Thu Jan 01 00:00:00 1970 +0000
1716 | date: Thu Jan 01 00:00:00 1970 +0000
1713 | summary: unrelated
1717 | summary: unrelated
1714 |
1718 |
1715 | o changeset: 1:2294ae80ad84
1719 | o changeset: 1:2294ae80ad84
1716 |/ user: test
1720 |/ user: test
1717 | date: Thu Jan 01 00:00:00 1970 +0000
1721 | date: Thu Jan 01 00:00:00 1970 +0000
1718 | summary: content2
1722 | summary: content2
1719 |
1723 |
1720 o changeset: 0:ae0a3c9f9e95
1724 o changeset: 0:ae0a3c9f9e95
1721 user: test
1725 user: test
1722 date: Thu Jan 01 00:00:00 1970 +0000
1726 date: Thu Jan 01 00:00:00 1970 +0000
1723 summary: content1
1727 summary: content1
1724
1728
1725
1729
1726 log -f on the file should list the graft result.
1730 log -f on the file should list the graft result.
1727
1731
1728 $ hg log -Gf a
1732 $ hg log -Gf a
1729 @ changeset: 4:50b9b36e9c5d
1733 @ changeset: 4:50b9b36e9c5d
1730 | tag: tip
1734 | tag: tip
1731 | user: test
1735 | user: test
1732 | date: Thu Jan 01 00:00:00 1970 +0000
1736 | date: Thu Jan 01 00:00:00 1970 +0000
1733 | summary: content3
1737 | summary: content3
1734 |
1738 |
1735 o changeset: 3:15b2327059e5
1739 o changeset: 3:15b2327059e5
1736 | user: test
1740 | user: test
1737 | date: Thu Jan 01 00:00:00 1970 +0000
1741 | date: Thu Jan 01 00:00:00 1970 +0000
1738 | summary: content2
1742 | summary: content2
1739 |
1743 |
1740 o changeset: 0:ae0a3c9f9e95
1744 o changeset: 0:ae0a3c9f9e95
1741 user: test
1745 user: test
1742 date: Thu Jan 01 00:00:00 1970 +0000
1746 date: Thu Jan 01 00:00:00 1970 +0000
1743 summary: content1
1747 summary: content1
1744
1748
1745
1749
1746 plain log lists the original version
1750 plain log lists the original version
1747 (XXX we should probably list both)
1751 (XXX we should probably list both)
1748
1752
1749 $ hg log -G a
1753 $ hg log -G a
1750 @ changeset: 4:50b9b36e9c5d
1754 @ changeset: 4:50b9b36e9c5d
1751 | tag: tip
1755 | tag: tip
1752 | user: test
1756 | user: test
1753 | date: Thu Jan 01 00:00:00 1970 +0000
1757 | date: Thu Jan 01 00:00:00 1970 +0000
1754 | summary: content3
1758 | summary: content3
1755 |
1759 |
1756 | o changeset: 1:2294ae80ad84
1760 | o changeset: 1:2294ae80ad84
1757 |/ user: test
1761 |/ user: test
1758 | date: Thu Jan 01 00:00:00 1970 +0000
1762 | date: Thu Jan 01 00:00:00 1970 +0000
1759 | summary: content2
1763 | summary: content2
1760 |
1764 |
1761 o changeset: 0:ae0a3c9f9e95
1765 o changeset: 0:ae0a3c9f9e95
1762 user: test
1766 user: test
1763 date: Thu Jan 01 00:00:00 1970 +0000
1767 date: Thu Jan 01 00:00:00 1970 +0000
1764 summary: content1
1768 summary: content1
1765
1769
1766
1770
1767 hg log -f from the grafted changeset
1771 hg log -f from the grafted changeset
1768 (The bootstrap should properly take the topology in account)
1772 (The bootstrap should properly take the topology in account)
1769
1773
1770 $ hg up 'desc(content3)^'
1774 $ hg up 'desc(content3)^'
1771 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1775 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1772 $ hg log -Gf a
1776 $ hg log -Gf a
1773 @ changeset: 3:15b2327059e5
1777 @ changeset: 3:15b2327059e5
1774 | user: test
1778 | user: test
1775 | date: Thu Jan 01 00:00:00 1970 +0000
1779 | date: Thu Jan 01 00:00:00 1970 +0000
1776 | summary: content2
1780 | summary: content2
1777 |
1781 |
1778 o changeset: 0:ae0a3c9f9e95
1782 o changeset: 0:ae0a3c9f9e95
1779 user: test
1783 user: test
1780 date: Thu Jan 01 00:00:00 1970 +0000
1784 date: Thu Jan 01 00:00:00 1970 +0000
1781 summary: content1
1785 summary: content1
1782
1786
1783
1787
1784 Test that we use the first non-hidden changeset in that case.
1788 Test that we use the first non-hidden changeset in that case.
1785
1789
1786 (hide the changeset)
1790 (hide the changeset)
1787
1791
1788 $ hg log -T '{node}\n' -r 1
1792 $ hg log -T '{node}\n' -r 1
1789 2294ae80ad8447bc78383182eeac50cb049df623
1793 2294ae80ad8447bc78383182eeac50cb049df623
1790 $ hg debugobsolete 2294ae80ad8447bc78383182eeac50cb049df623
1794 $ hg debugobsolete 2294ae80ad8447bc78383182eeac50cb049df623
1791 $ hg log -G
1795 $ hg log -G
1792 o changeset: 4:50b9b36e9c5d
1796 o changeset: 4:50b9b36e9c5d
1793 | tag: tip
1797 | tag: tip
1794 | user: test
1798 | user: test
1795 | date: Thu Jan 01 00:00:00 1970 +0000
1799 | date: Thu Jan 01 00:00:00 1970 +0000
1796 | summary: content3
1800 | summary: content3
1797 |
1801 |
1798 @ changeset: 3:15b2327059e5
1802 @ changeset: 3:15b2327059e5
1799 | user: test
1803 | user: test
1800 | date: Thu Jan 01 00:00:00 1970 +0000
1804 | date: Thu Jan 01 00:00:00 1970 +0000
1801 | summary: content2
1805 | summary: content2
1802 |
1806 |
1803 o changeset: 2:2029acd1168c
1807 o changeset: 2:2029acd1168c
1804 | parent: 0:ae0a3c9f9e95
1808 | parent: 0:ae0a3c9f9e95
1805 | user: test
1809 | user: test
1806 | date: Thu Jan 01 00:00:00 1970 +0000
1810 | date: Thu Jan 01 00:00:00 1970 +0000
1807 | summary: unrelated
1811 | summary: unrelated
1808 |
1812 |
1809 o changeset: 0:ae0a3c9f9e95
1813 o changeset: 0:ae0a3c9f9e95
1810 user: test
1814 user: test
1811 date: Thu Jan 01 00:00:00 1970 +0000
1815 date: Thu Jan 01 00:00:00 1970 +0000
1812 summary: content1
1816 summary: content1
1813
1817
1814
1818
1815 Check that log on the file does not drop the file revision.
1819 Check that log on the file does not drop the file revision.
1816
1820
1817 $ hg log -G a
1821 $ hg log -G a
1818 o changeset: 4:50b9b36e9c5d
1822 o changeset: 4:50b9b36e9c5d
1819 | tag: tip
1823 | tag: tip
1820 | user: test
1824 | user: test
1821 | date: Thu Jan 01 00:00:00 1970 +0000
1825 | date: Thu Jan 01 00:00:00 1970 +0000
1822 | summary: content3
1826 | summary: content3
1823 |
1827 |
1824 @ changeset: 3:15b2327059e5
1828 @ changeset: 3:15b2327059e5
1825 | user: test
1829 | user: test
1826 | date: Thu Jan 01 00:00:00 1970 +0000
1830 | date: Thu Jan 01 00:00:00 1970 +0000
1827 | summary: content2
1831 | summary: content2
1828 |
1832 |
1829 o changeset: 0:ae0a3c9f9e95
1833 o changeset: 0:ae0a3c9f9e95
1830 user: test
1834 user: test
1831 date: Thu Jan 01 00:00:00 1970 +0000
1835 date: Thu Jan 01 00:00:00 1970 +0000
1832 summary: content1
1836 summary: content1
1833
1837
1834
1838
1835 Even when a head revision is linkrev-shadowed.
1839 Even when a head revision is linkrev-shadowed.
1836
1840
1837 $ hg log -T '{node}\n' -r 4
1841 $ hg log -T '{node}\n' -r 4
1838 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
1842 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
1839 $ hg debugobsolete 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
1843 $ hg debugobsolete 50b9b36e9c5df2c6fc6dcefa8ad0da929e84aed2
1840 $ hg log -G a
1844 $ hg log -G a
1841 @ changeset: 3:15b2327059e5
1845 @ changeset: 3:15b2327059e5
1842 | tag: tip
1846 | tag: tip
1843 | user: test
1847 | user: test
1844 | date: Thu Jan 01 00:00:00 1970 +0000
1848 | date: Thu Jan 01 00:00:00 1970 +0000
1845 | summary: content2
1849 | summary: content2
1846 |
1850 |
1847 o changeset: 0:ae0a3c9f9e95
1851 o changeset: 0:ae0a3c9f9e95
1848 user: test
1852 user: test
1849 date: Thu Jan 01 00:00:00 1970 +0000
1853 date: Thu Jan 01 00:00:00 1970 +0000
1850 summary: content1
1854 summary: content1
1851
1855
1852
1856
1853 $ cd ..
1857 $ cd ..
1854
1858
1855 Even when the file revision is missing from some head:
1859 Even when the file revision is missing from some head:
1856
1860
1857 $ hg init issue4490
1861 $ hg init issue4490
1858 $ cd issue4490
1862 $ cd issue4490
1859 $ echo '[experimental]' >> .hg/hgrc
1863 $ echo '[experimental]' >> .hg/hgrc
1860 $ echo 'evolution=createmarkers' >> .hg/hgrc
1864 $ echo 'evolution=createmarkers' >> .hg/hgrc
1861 $ echo a > a
1865 $ echo a > a
1862 $ hg ci -Am0
1866 $ hg ci -Am0
1863 adding a
1867 adding a
1864 $ echo b > b
1868 $ echo b > b
1865 $ hg ci -Am1
1869 $ hg ci -Am1
1866 adding b
1870 adding b
1867 $ echo B > b
1871 $ echo B > b
1868 $ hg ci --amend -m 1
1872 $ hg ci --amend -m 1
1869 $ hg up 0
1873 $ hg up 0
1870 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1874 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1871 $ echo c > c
1875 $ echo c > c
1872 $ hg ci -Am2
1876 $ hg ci -Am2
1873 adding c
1877 adding c
1874 created new head
1878 created new head
1875 $ hg up 'head() and not .'
1879 $ hg up 'head() and not .'
1876 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1880 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1877 $ hg log -G
1881 $ hg log -G
1878 o changeset: 4:db815d6d32e6
1882 o changeset: 4:db815d6d32e6
1879 | tag: tip
1883 | tag: tip
1880 | parent: 0:f7b1eb17ad24
1884 | parent: 0:f7b1eb17ad24
1881 | user: test
1885 | user: test
1882 | date: Thu Jan 01 00:00:00 1970 +0000
1886 | date: Thu Jan 01 00:00:00 1970 +0000
1883 | summary: 2
1887 | summary: 2
1884 |
1888 |
1885 | @ changeset: 3:9bc8ce7f9356
1889 | @ changeset: 3:9bc8ce7f9356
1886 |/ parent: 0:f7b1eb17ad24
1890 |/ parent: 0:f7b1eb17ad24
1887 | user: test
1891 | user: test
1888 | date: Thu Jan 01 00:00:00 1970 +0000
1892 | date: Thu Jan 01 00:00:00 1970 +0000
1889 | summary: 1
1893 | summary: 1
1890 |
1894 |
1891 o changeset: 0:f7b1eb17ad24
1895 o changeset: 0:f7b1eb17ad24
1892 user: test
1896 user: test
1893 date: Thu Jan 01 00:00:00 1970 +0000
1897 date: Thu Jan 01 00:00:00 1970 +0000
1894 summary: 0
1898 summary: 0
1895
1899
1896 $ hg log -f -G b
1900 $ hg log -f -G b
1897 @ changeset: 3:9bc8ce7f9356
1901 @ changeset: 3:9bc8ce7f9356
1898 | parent: 0:f7b1eb17ad24
1902 | parent: 0:f7b1eb17ad24
1899 | user: test
1903 | user: test
1900 | date: Thu Jan 01 00:00:00 1970 +0000
1904 | date: Thu Jan 01 00:00:00 1970 +0000
1901 | summary: 1
1905 | summary: 1
1902 |
1906 |
1903 $ hg log -G b
1907 $ hg log -G b
1904 @ changeset: 3:9bc8ce7f9356
1908 @ changeset: 3:9bc8ce7f9356
1905 | parent: 0:f7b1eb17ad24
1909 | parent: 0:f7b1eb17ad24
1906 | user: test
1910 | user: test
1907 | date: Thu Jan 01 00:00:00 1970 +0000
1911 | date: Thu Jan 01 00:00:00 1970 +0000
1908 | summary: 1
1912 | summary: 1
1909 |
1913 |
1910 $ cd ..
1914 $ cd ..
1911
1915
1912 Check proper report when the manifest changes but not the file issue4499
1916 Check proper report when the manifest changes but not the file issue4499
1913 ------------------------------------------------------------------------
1917 ------------------------------------------------------------------------
1914
1918
1915 $ hg init issue4499
1919 $ hg init issue4499
1916 $ cd issue4499
1920 $ cd issue4499
1917 $ for f in A B C D F E G H I J K L M N O P Q R S T U; do
1921 $ for f in A B C D F E G H I J K L M N O P Q R S T U; do
1918 > echo 1 > $f;
1922 > echo 1 > $f;
1919 > hg add $f;
1923 > hg add $f;
1920 > done
1924 > done
1921 $ hg commit -m 'A1B1C1'
1925 $ hg commit -m 'A1B1C1'
1922 $ echo 2 > A
1926 $ echo 2 > A
1923 $ echo 2 > B
1927 $ echo 2 > B
1924 $ echo 2 > C
1928 $ echo 2 > C
1925 $ hg commit -m 'A2B2C2'
1929 $ hg commit -m 'A2B2C2'
1926 $ hg up 0
1930 $ hg up 0
1927 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
1931 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
1928 $ echo 3 > A
1932 $ echo 3 > A
1929 $ echo 2 > B
1933 $ echo 2 > B
1930 $ echo 2 > C
1934 $ echo 2 > C
1931 $ hg commit -m 'A3B2C2'
1935 $ hg commit -m 'A3B2C2'
1932 created new head
1936 created new head
1933
1937
1934 $ hg log -G
1938 $ hg log -G
1935 @ changeset: 2:fe5fc3d0eb17
1939 @ changeset: 2:fe5fc3d0eb17
1936 | tag: tip
1940 | tag: tip
1937 | parent: 0:abf4f0e38563
1941 | parent: 0:abf4f0e38563
1938 | user: test
1942 | user: test
1939 | date: Thu Jan 01 00:00:00 1970 +0000
1943 | date: Thu Jan 01 00:00:00 1970 +0000
1940 | summary: A3B2C2
1944 | summary: A3B2C2
1941 |
1945 |
1942 | o changeset: 1:07dcc6b312c0
1946 | o changeset: 1:07dcc6b312c0
1943 |/ user: test
1947 |/ user: test
1944 | date: Thu Jan 01 00:00:00 1970 +0000
1948 | date: Thu Jan 01 00:00:00 1970 +0000
1945 | summary: A2B2C2
1949 | summary: A2B2C2
1946 |
1950 |
1947 o changeset: 0:abf4f0e38563
1951 o changeset: 0:abf4f0e38563
1948 user: test
1952 user: test
1949 date: Thu Jan 01 00:00:00 1970 +0000
1953 date: Thu Jan 01 00:00:00 1970 +0000
1950 summary: A1B1C1
1954 summary: A1B1C1
1951
1955
1952
1956
1953 Log -f on B should reports current changesets
1957 Log -f on B should reports current changesets
1954
1958
1955 $ hg log -fG B
1959 $ hg log -fG B
1956 @ changeset: 2:fe5fc3d0eb17
1960 @ changeset: 2:fe5fc3d0eb17
1957 | tag: tip
1961 | tag: tip
1958 | parent: 0:abf4f0e38563
1962 | parent: 0:abf4f0e38563
1959 | user: test
1963 | user: test
1960 | date: Thu Jan 01 00:00:00 1970 +0000
1964 | date: Thu Jan 01 00:00:00 1970 +0000
1961 | summary: A3B2C2
1965 | summary: A3B2C2
1962 |
1966 |
1963 o changeset: 0:abf4f0e38563
1967 o changeset: 0:abf4f0e38563
1964 user: test
1968 user: test
1965 date: Thu Jan 01 00:00:00 1970 +0000
1969 date: Thu Jan 01 00:00:00 1970 +0000
1966 summary: A1B1C1
1970 summary: A1B1C1
1967
1971
1968 $ cd ..
1972 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now