##// END OF EJS Templates
resolve: add parenthesis around "no more unresolved files" message...
Pierre-Yves David -
r21947:b081decd stable
parent child Browse files
Show More
@@ -1,6036 +1,6036 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
11 import os, re, difflib, time, tempfile, errno
12 import sys
12 import sys
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
21 import dagparser, context, simplemerge, graphmod
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
24 import phases, obsolete, exchange
25
25
26 table = {}
26 table = {}
27
27
28 command = cmdutil.command(table)
28 command = cmdutil.command(table)
29
29
30 # Space delimited list of commands that don't require local repositories.
30 # Space delimited list of commands that don't require local repositories.
31 # This should be populated by passing norepo=True into the @command decorator.
31 # This should be populated by passing norepo=True into the @command decorator.
32 norepo = ''
32 norepo = ''
33 # Space delimited list of commands that optionally require local repositories.
33 # Space delimited list of commands that optionally require local repositories.
34 # This should be populated by passing optionalrepo=True into the @command
34 # This should be populated by passing optionalrepo=True into the @command
35 # decorator.
35 # decorator.
36 optionalrepo = ''
36 optionalrepo = ''
37 # Space delimited list of commands that will examine arguments looking for
37 # Space delimited list of commands that will examine arguments looking for
38 # a repository. This should be populated by passing inferrepo=True into the
38 # a repository. This should be populated by passing inferrepo=True into the
39 # @command decorator.
39 # @command decorator.
40 inferrepo = ''
40 inferrepo = ''
41
41
42 # common command options
42 # common command options
43
43
44 globalopts = [
44 globalopts = [
45 ('R', 'repository', '',
45 ('R', 'repository', '',
46 _('repository root directory or name of overlay bundle file'),
46 _('repository root directory or name of overlay bundle file'),
47 _('REPO')),
47 _('REPO')),
48 ('', 'cwd', '',
48 ('', 'cwd', '',
49 _('change working directory'), _('DIR')),
49 _('change working directory'), _('DIR')),
50 ('y', 'noninteractive', None,
50 ('y', 'noninteractive', None,
51 _('do not prompt, automatically pick the first choice for all prompts')),
51 _('do not prompt, automatically pick the first choice for all prompts')),
52 ('q', 'quiet', None, _('suppress output')),
52 ('q', 'quiet', None, _('suppress output')),
53 ('v', 'verbose', None, _('enable additional output')),
53 ('v', 'verbose', None, _('enable additional output')),
54 ('', 'config', [],
54 ('', 'config', [],
55 _('set/override config option (use \'section.name=value\')'),
55 _('set/override config option (use \'section.name=value\')'),
56 _('CONFIG')),
56 _('CONFIG')),
57 ('', 'debug', None, _('enable debugging output')),
57 ('', 'debug', None, _('enable debugging output')),
58 ('', 'debugger', None, _('start debugger')),
58 ('', 'debugger', None, _('start debugger')),
59 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
59 ('', 'encoding', encoding.encoding, _('set the charset encoding'),
60 _('ENCODE')),
60 _('ENCODE')),
61 ('', 'encodingmode', encoding.encodingmode,
61 ('', 'encodingmode', encoding.encodingmode,
62 _('set the charset encoding mode'), _('MODE')),
62 _('set the charset encoding mode'), _('MODE')),
63 ('', 'traceback', None, _('always print a traceback on exception')),
63 ('', 'traceback', None, _('always print a traceback on exception')),
64 ('', 'time', None, _('time how long the command takes')),
64 ('', 'time', None, _('time how long the command takes')),
65 ('', 'profile', None, _('print command execution profile')),
65 ('', 'profile', None, _('print command execution profile')),
66 ('', 'version', None, _('output version information and exit')),
66 ('', 'version', None, _('output version information and exit')),
67 ('h', 'help', None, _('display help and exit')),
67 ('h', 'help', None, _('display help and exit')),
68 ('', 'hidden', False, _('consider hidden changesets')),
68 ('', 'hidden', False, _('consider hidden changesets')),
69 ]
69 ]
70
70
71 dryrunopts = [('n', 'dry-run', None,
71 dryrunopts = [('n', 'dry-run', None,
72 _('do not perform actions, just print output'))]
72 _('do not perform actions, just print output'))]
73
73
74 remoteopts = [
74 remoteopts = [
75 ('e', 'ssh', '',
75 ('e', 'ssh', '',
76 _('specify ssh command to use'), _('CMD')),
76 _('specify ssh command to use'), _('CMD')),
77 ('', 'remotecmd', '',
77 ('', 'remotecmd', '',
78 _('specify hg command to run on the remote side'), _('CMD')),
78 _('specify hg command to run on the remote side'), _('CMD')),
79 ('', 'insecure', None,
79 ('', 'insecure', None,
80 _('do not verify server certificate (ignoring web.cacerts config)')),
80 _('do not verify server certificate (ignoring web.cacerts config)')),
81 ]
81 ]
82
82
83 walkopts = [
83 walkopts = [
84 ('I', 'include', [],
84 ('I', 'include', [],
85 _('include names matching the given patterns'), _('PATTERN')),
85 _('include names matching the given patterns'), _('PATTERN')),
86 ('X', 'exclude', [],
86 ('X', 'exclude', [],
87 _('exclude names matching the given patterns'), _('PATTERN')),
87 _('exclude names matching the given patterns'), _('PATTERN')),
88 ]
88 ]
89
89
90 commitopts = [
90 commitopts = [
91 ('m', 'message', '',
91 ('m', 'message', '',
92 _('use text as commit message'), _('TEXT')),
92 _('use text as commit message'), _('TEXT')),
93 ('l', 'logfile', '',
93 ('l', 'logfile', '',
94 _('read commit message from file'), _('FILE')),
94 _('read commit message from file'), _('FILE')),
95 ]
95 ]
96
96
97 commitopts2 = [
97 commitopts2 = [
98 ('d', 'date', '',
98 ('d', 'date', '',
99 _('record the specified date as commit date'), _('DATE')),
99 _('record the specified date as commit date'), _('DATE')),
100 ('u', 'user', '',
100 ('u', 'user', '',
101 _('record the specified user as committer'), _('USER')),
101 _('record the specified user as committer'), _('USER')),
102 ]
102 ]
103
103
104 templateopts = [
104 templateopts = [
105 ('', 'style', '',
105 ('', 'style', '',
106 _('display using template map file (DEPRECATED)'), _('STYLE')),
106 _('display using template map file (DEPRECATED)'), _('STYLE')),
107 ('T', 'template', '',
107 ('T', 'template', '',
108 _('display with template'), _('TEMPLATE')),
108 _('display with template'), _('TEMPLATE')),
109 ]
109 ]
110
110
111 logopts = [
111 logopts = [
112 ('p', 'patch', None, _('show patch')),
112 ('p', 'patch', None, _('show patch')),
113 ('g', 'git', None, _('use git extended diff format')),
113 ('g', 'git', None, _('use git extended diff format')),
114 ('l', 'limit', '',
114 ('l', 'limit', '',
115 _('limit number of changes displayed'), _('NUM')),
115 _('limit number of changes displayed'), _('NUM')),
116 ('M', 'no-merges', None, _('do not show merges')),
116 ('M', 'no-merges', None, _('do not show merges')),
117 ('', 'stat', None, _('output diffstat-style summary of changes')),
117 ('', 'stat', None, _('output diffstat-style summary of changes')),
118 ('G', 'graph', None, _("show the revision DAG")),
118 ('G', 'graph', None, _("show the revision DAG")),
119 ] + templateopts
119 ] + templateopts
120
120
121 diffopts = [
121 diffopts = [
122 ('a', 'text', None, _('treat all files as text')),
122 ('a', 'text', None, _('treat all files as text')),
123 ('g', 'git', None, _('use git extended diff format')),
123 ('g', 'git', None, _('use git extended diff format')),
124 ('', 'nodates', None, _('omit dates from diff headers'))
124 ('', 'nodates', None, _('omit dates from diff headers'))
125 ]
125 ]
126
126
127 diffwsopts = [
127 diffwsopts = [
128 ('w', 'ignore-all-space', None,
128 ('w', 'ignore-all-space', None,
129 _('ignore white space when comparing lines')),
129 _('ignore white space when comparing lines')),
130 ('b', 'ignore-space-change', None,
130 ('b', 'ignore-space-change', None,
131 _('ignore changes in the amount of white space')),
131 _('ignore changes in the amount of white space')),
132 ('B', 'ignore-blank-lines', None,
132 ('B', 'ignore-blank-lines', None,
133 _('ignore changes whose lines are all blank')),
133 _('ignore changes whose lines are all blank')),
134 ]
134 ]
135
135
136 diffopts2 = [
136 diffopts2 = [
137 ('p', 'show-function', None, _('show which function each change is in')),
137 ('p', 'show-function', None, _('show which function each change is in')),
138 ('', 'reverse', None, _('produce a diff that undoes the changes')),
138 ('', 'reverse', None, _('produce a diff that undoes the changes')),
139 ] + diffwsopts + [
139 ] + diffwsopts + [
140 ('U', 'unified', '',
140 ('U', 'unified', '',
141 _('number of lines of context to show'), _('NUM')),
141 _('number of lines of context to show'), _('NUM')),
142 ('', 'stat', None, _('output diffstat-style summary of changes')),
142 ('', 'stat', None, _('output diffstat-style summary of changes')),
143 ]
143 ]
144
144
145 mergetoolopts = [
145 mergetoolopts = [
146 ('t', 'tool', '', _('specify merge tool')),
146 ('t', 'tool', '', _('specify merge tool')),
147 ]
147 ]
148
148
149 similarityopts = [
149 similarityopts = [
150 ('s', 'similarity', '',
150 ('s', 'similarity', '',
151 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
151 _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
152 ]
152 ]
153
153
154 subrepoopts = [
154 subrepoopts = [
155 ('S', 'subrepos', None,
155 ('S', 'subrepos', None,
156 _('recurse into subrepositories'))
156 _('recurse into subrepositories'))
157 ]
157 ]
158
158
159 # Commands start here, listed alphabetically
159 # Commands start here, listed alphabetically
160
160
161 @command('^add',
161 @command('^add',
162 walkopts + subrepoopts + dryrunopts,
162 walkopts + subrepoopts + dryrunopts,
163 _('[OPTION]... [FILE]...'),
163 _('[OPTION]... [FILE]...'),
164 inferrepo=True)
164 inferrepo=True)
165 def add(ui, repo, *pats, **opts):
165 def add(ui, repo, *pats, **opts):
166 """add the specified files on the next commit
166 """add the specified files on the next commit
167
167
168 Schedule files to be version controlled and added to the
168 Schedule files to be version controlled and added to the
169 repository.
169 repository.
170
170
171 The files will be added to the repository at the next commit. To
171 The files will be added to the repository at the next commit. To
172 undo an add before that, see :hg:`forget`.
172 undo an add before that, see :hg:`forget`.
173
173
174 If no names are given, add all files to the repository.
174 If no names are given, add all files to the repository.
175
175
176 .. container:: verbose
176 .. container:: verbose
177
177
178 An example showing how new (unknown) files are added
178 An example showing how new (unknown) files are added
179 automatically by :hg:`add`::
179 automatically by :hg:`add`::
180
180
181 $ ls
181 $ ls
182 foo.c
182 foo.c
183 $ hg status
183 $ hg status
184 ? foo.c
184 ? foo.c
185 $ hg add
185 $ hg add
186 adding foo.c
186 adding foo.c
187 $ hg status
187 $ hg status
188 A foo.c
188 A foo.c
189
189
190 Returns 0 if all files are successfully added.
190 Returns 0 if all files are successfully added.
191 """
191 """
192
192
193 m = scmutil.match(repo[None], pats, opts)
193 m = scmutil.match(repo[None], pats, opts)
194 rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'),
194 rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'),
195 opts.get('subrepos'), prefix="", explicitonly=False)
195 opts.get('subrepos'), prefix="", explicitonly=False)
196 return rejected and 1 or 0
196 return rejected and 1 or 0
197
197
198 @command('addremove',
198 @command('addremove',
199 similarityopts + walkopts + dryrunopts,
199 similarityopts + walkopts + dryrunopts,
200 _('[OPTION]... [FILE]...'),
200 _('[OPTION]... [FILE]...'),
201 inferrepo=True)
201 inferrepo=True)
202 def addremove(ui, repo, *pats, **opts):
202 def addremove(ui, repo, *pats, **opts):
203 """add all new files, delete all missing files
203 """add all new files, delete all missing files
204
204
205 Add all new files and remove all missing files from the
205 Add all new files and remove all missing files from the
206 repository.
206 repository.
207
207
208 New files are ignored if they match any of the patterns in
208 New files are ignored if they match any of the patterns in
209 ``.hgignore``. As with add, these changes take effect at the next
209 ``.hgignore``. As with add, these changes take effect at the next
210 commit.
210 commit.
211
211
212 Use the -s/--similarity option to detect renamed files. This
212 Use the -s/--similarity option to detect renamed files. This
213 option takes a percentage between 0 (disabled) and 100 (files must
213 option takes a percentage between 0 (disabled) and 100 (files must
214 be identical) as its parameter. With a parameter greater than 0,
214 be identical) as its parameter. With a parameter greater than 0,
215 this compares every removed file with every added file and records
215 this compares every removed file with every added file and records
216 those similar enough as renames. Detecting renamed files this way
216 those similar enough as renames. Detecting renamed files this way
217 can be expensive. After using this option, :hg:`status -C` can be
217 can be expensive. After using this option, :hg:`status -C` can be
218 used to check which files were identified as moved or renamed. If
218 used to check which files were identified as moved or renamed. If
219 not specified, -s/--similarity defaults to 100 and only renames of
219 not specified, -s/--similarity defaults to 100 and only renames of
220 identical files are detected.
220 identical files are detected.
221
221
222 Returns 0 if all files are successfully added.
222 Returns 0 if all files are successfully added.
223 """
223 """
224 try:
224 try:
225 sim = float(opts.get('similarity') or 100)
225 sim = float(opts.get('similarity') or 100)
226 except ValueError:
226 except ValueError:
227 raise util.Abort(_('similarity must be a number'))
227 raise util.Abort(_('similarity must be a number'))
228 if sim < 0 or sim > 100:
228 if sim < 0 or sim > 100:
229 raise util.Abort(_('similarity must be between 0 and 100'))
229 raise util.Abort(_('similarity must be between 0 and 100'))
230 return scmutil.addremove(repo, pats, opts, similarity=sim / 100.0)
230 return scmutil.addremove(repo, pats, opts, similarity=sim / 100.0)
231
231
232 @command('^annotate|blame',
232 @command('^annotate|blame',
233 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
233 [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
234 ('', 'follow', None,
234 ('', 'follow', None,
235 _('follow copies/renames and list the filename (DEPRECATED)')),
235 _('follow copies/renames and list the filename (DEPRECATED)')),
236 ('', 'no-follow', None, _("don't follow copies and renames")),
236 ('', 'no-follow', None, _("don't follow copies and renames")),
237 ('a', 'text', None, _('treat all files as text')),
237 ('a', 'text', None, _('treat all files as text')),
238 ('u', 'user', None, _('list the author (long with -v)')),
238 ('u', 'user', None, _('list the author (long with -v)')),
239 ('f', 'file', None, _('list the filename')),
239 ('f', 'file', None, _('list the filename')),
240 ('d', 'date', None, _('list the date (short with -q)')),
240 ('d', 'date', None, _('list the date (short with -q)')),
241 ('n', 'number', None, _('list the revision number (default)')),
241 ('n', 'number', None, _('list the revision number (default)')),
242 ('c', 'changeset', None, _('list the changeset')),
242 ('c', 'changeset', None, _('list the changeset')),
243 ('l', 'line-number', None, _('show line number at the first appearance'))
243 ('l', 'line-number', None, _('show line number at the first appearance'))
244 ] + diffwsopts + walkopts,
244 ] + diffwsopts + walkopts,
245 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
245 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'),
246 inferrepo=True)
246 inferrepo=True)
247 def annotate(ui, repo, *pats, **opts):
247 def annotate(ui, repo, *pats, **opts):
248 """show changeset information by line for each file
248 """show changeset information by line for each file
249
249
250 List changes in files, showing the revision id responsible for
250 List changes in files, showing the revision id responsible for
251 each line
251 each line
252
252
253 This command is useful for discovering when a change was made and
253 This command is useful for discovering when a change was made and
254 by whom.
254 by whom.
255
255
256 Without the -a/--text option, annotate will avoid processing files
256 Without the -a/--text option, annotate will avoid processing files
257 it detects as binary. With -a, annotate will annotate the file
257 it detects as binary. With -a, annotate will annotate the file
258 anyway, although the results will probably be neither useful
258 anyway, although the results will probably be neither useful
259 nor desirable.
259 nor desirable.
260
260
261 Returns 0 on success.
261 Returns 0 on success.
262 """
262 """
263 if opts.get('follow'):
263 if opts.get('follow'):
264 # --follow is deprecated and now just an alias for -f/--file
264 # --follow is deprecated and now just an alias for -f/--file
265 # to mimic the behavior of Mercurial before version 1.5
265 # to mimic the behavior of Mercurial before version 1.5
266 opts['file'] = True
266 opts['file'] = True
267
267
268 datefunc = ui.quiet and util.shortdate or util.datestr
268 datefunc = ui.quiet and util.shortdate or util.datestr
269 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
269 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
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 hexfn = ui.debugflag and hex or short
274 hexfn = ui.debugflag and hex or short
275
275
276 opmap = [('user', ' ', lambda x: ui.shortuser(x[0].user())),
276 opmap = [('user', ' ', lambda x: ui.shortuser(x[0].user())),
277 ('number', ' ', lambda x: str(x[0].rev())),
277 ('number', ' ', lambda x: str(x[0].rev())),
278 ('changeset', ' ', lambda x: hexfn(x[0].node())),
278 ('changeset', ' ', lambda x: hexfn(x[0].node())),
279 ('date', ' ', getdate),
279 ('date', ' ', getdate),
280 ('file', ' ', lambda x: x[0].path()),
280 ('file', ' ', lambda x: x[0].path()),
281 ('line_number', ':', lambda x: str(x[1])),
281 ('line_number', ':', lambda x: str(x[1])),
282 ]
282 ]
283
283
284 if (not opts.get('user') and not opts.get('changeset')
284 if (not opts.get('user') and not opts.get('changeset')
285 and not opts.get('date') and not opts.get('file')):
285 and not opts.get('date') and not opts.get('file')):
286 opts['number'] = True
286 opts['number'] = True
287
287
288 linenumber = opts.get('line_number') is not None
288 linenumber = opts.get('line_number') is not None
289 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
289 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
290 raise util.Abort(_('at least one of -n/-c is required for -l'))
290 raise util.Abort(_('at least one of -n/-c is required for -l'))
291
291
292 funcmap = [(func, sep) for op, sep, func in opmap if opts.get(op)]
292 funcmap = [(func, sep) for op, sep, func in opmap if opts.get(op)]
293 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
293 funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
294
294
295 def bad(x, y):
295 def bad(x, y):
296 raise util.Abort("%s: %s" % (x, y))
296 raise util.Abort("%s: %s" % (x, y))
297
297
298 ctx = scmutil.revsingle(repo, opts.get('rev'))
298 ctx = scmutil.revsingle(repo, opts.get('rev'))
299 m = scmutil.match(ctx, pats, opts)
299 m = scmutil.match(ctx, pats, opts)
300 m.bad = bad
300 m.bad = bad
301 follow = not opts.get('no_follow')
301 follow = not opts.get('no_follow')
302 diffopts = patch.diffopts(ui, opts, section='annotate')
302 diffopts = patch.diffopts(ui, opts, section='annotate')
303 for abs in ctx.walk(m):
303 for abs in ctx.walk(m):
304 fctx = ctx[abs]
304 fctx = ctx[abs]
305 if not opts.get('text') and util.binary(fctx.data()):
305 if not opts.get('text') and util.binary(fctx.data()):
306 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
306 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
307 continue
307 continue
308
308
309 lines = fctx.annotate(follow=follow, linenumber=linenumber,
309 lines = fctx.annotate(follow=follow, linenumber=linenumber,
310 diffopts=diffopts)
310 diffopts=diffopts)
311 pieces = []
311 pieces = []
312
312
313 for f, sep in funcmap:
313 for f, sep in funcmap:
314 l = [f(n) for n, dummy in lines]
314 l = [f(n) for n, dummy in lines]
315 if l:
315 if l:
316 sized = [(x, encoding.colwidth(x)) for x in l]
316 sized = [(x, encoding.colwidth(x)) for x in l]
317 ml = max([w for x, w in sized])
317 ml = max([w for x, w in sized])
318 pieces.append(["%s%s%s" % (sep, ' ' * (ml - w), x)
318 pieces.append(["%s%s%s" % (sep, ' ' * (ml - w), x)
319 for x, w in sized])
319 for x, w in sized])
320
320
321 if pieces:
321 if pieces:
322 for p, l in zip(zip(*pieces), lines):
322 for p, l in zip(zip(*pieces), lines):
323 ui.write("%s: %s" % ("".join(p), l[1]))
323 ui.write("%s: %s" % ("".join(p), l[1]))
324
324
325 if lines and not lines[-1][1].endswith('\n'):
325 if lines and not lines[-1][1].endswith('\n'):
326 ui.write('\n')
326 ui.write('\n')
327
327
328 @command('archive',
328 @command('archive',
329 [('', 'no-decode', None, _('do not pass files through decoders')),
329 [('', 'no-decode', None, _('do not pass files through decoders')),
330 ('p', 'prefix', '', _('directory prefix for files in archive'),
330 ('p', 'prefix', '', _('directory prefix for files in archive'),
331 _('PREFIX')),
331 _('PREFIX')),
332 ('r', 'rev', '', _('revision to distribute'), _('REV')),
332 ('r', 'rev', '', _('revision to distribute'), _('REV')),
333 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
333 ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
334 ] + subrepoopts + walkopts,
334 ] + subrepoopts + walkopts,
335 _('[OPTION]... DEST'))
335 _('[OPTION]... DEST'))
336 def archive(ui, repo, dest, **opts):
336 def archive(ui, repo, dest, **opts):
337 '''create an unversioned archive of a repository revision
337 '''create an unversioned archive of a repository revision
338
338
339 By default, the revision used is the parent of the working
339 By default, the revision used is the parent of the working
340 directory; use -r/--rev to specify a different revision.
340 directory; use -r/--rev to specify a different revision.
341
341
342 The archive type is automatically detected based on file
342 The archive type is automatically detected based on file
343 extension (or override using -t/--type).
343 extension (or override using -t/--type).
344
344
345 .. container:: verbose
345 .. container:: verbose
346
346
347 Examples:
347 Examples:
348
348
349 - create a zip file containing the 1.0 release::
349 - create a zip file containing the 1.0 release::
350
350
351 hg archive -r 1.0 project-1.0.zip
351 hg archive -r 1.0 project-1.0.zip
352
352
353 - create a tarball excluding .hg files::
353 - create a tarball excluding .hg files::
354
354
355 hg archive project.tar.gz -X ".hg*"
355 hg archive project.tar.gz -X ".hg*"
356
356
357 Valid types are:
357 Valid types are:
358
358
359 :``files``: a directory full of files (default)
359 :``files``: a directory full of files (default)
360 :``tar``: tar archive, uncompressed
360 :``tar``: tar archive, uncompressed
361 :``tbz2``: tar archive, compressed using bzip2
361 :``tbz2``: tar archive, compressed using bzip2
362 :``tgz``: tar archive, compressed using gzip
362 :``tgz``: tar archive, compressed using gzip
363 :``uzip``: zip archive, uncompressed
363 :``uzip``: zip archive, uncompressed
364 :``zip``: zip archive, compressed using deflate
364 :``zip``: zip archive, compressed using deflate
365
365
366 The exact name of the destination archive or directory is given
366 The exact name of the destination archive or directory is given
367 using a format string; see :hg:`help export` for details.
367 using a format string; see :hg:`help export` for details.
368
368
369 Each member added to an archive file has a directory prefix
369 Each member added to an archive file has a directory prefix
370 prepended. Use -p/--prefix to specify a format string for the
370 prepended. Use -p/--prefix to specify a format string for the
371 prefix. The default is the basename of the archive, with suffixes
371 prefix. The default is the basename of the archive, with suffixes
372 removed.
372 removed.
373
373
374 Returns 0 on success.
374 Returns 0 on success.
375 '''
375 '''
376
376
377 ctx = scmutil.revsingle(repo, opts.get('rev'))
377 ctx = scmutil.revsingle(repo, opts.get('rev'))
378 if not ctx:
378 if not ctx:
379 raise util.Abort(_('no working directory: please specify a revision'))
379 raise util.Abort(_('no working directory: please specify a revision'))
380 node = ctx.node()
380 node = ctx.node()
381 dest = cmdutil.makefilename(repo, dest, node)
381 dest = cmdutil.makefilename(repo, dest, node)
382 if os.path.realpath(dest) == repo.root:
382 if os.path.realpath(dest) == repo.root:
383 raise util.Abort(_('repository root cannot be destination'))
383 raise util.Abort(_('repository root cannot be destination'))
384
384
385 kind = opts.get('type') or archival.guesskind(dest) or 'files'
385 kind = opts.get('type') or archival.guesskind(dest) or 'files'
386 prefix = opts.get('prefix')
386 prefix = opts.get('prefix')
387
387
388 if dest == '-':
388 if dest == '-':
389 if kind == 'files':
389 if kind == 'files':
390 raise util.Abort(_('cannot archive plain files to stdout'))
390 raise util.Abort(_('cannot archive plain files to stdout'))
391 dest = cmdutil.makefileobj(repo, dest)
391 dest = cmdutil.makefileobj(repo, dest)
392 if not prefix:
392 if not prefix:
393 prefix = os.path.basename(repo.root) + '-%h'
393 prefix = os.path.basename(repo.root) + '-%h'
394
394
395 prefix = cmdutil.makefilename(repo, prefix, node)
395 prefix = cmdutil.makefilename(repo, prefix, node)
396 matchfn = scmutil.match(ctx, [], opts)
396 matchfn = scmutil.match(ctx, [], opts)
397 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
397 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
398 matchfn, prefix, subrepos=opts.get('subrepos'))
398 matchfn, prefix, subrepos=opts.get('subrepos'))
399
399
400 @command('backout',
400 @command('backout',
401 [('', 'merge', None, _('merge with old dirstate parent after backout')),
401 [('', 'merge', None, _('merge with old dirstate parent after backout')),
402 ('', 'parent', '',
402 ('', 'parent', '',
403 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
403 _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
404 ('r', 'rev', '', _('revision to backout'), _('REV')),
404 ('r', 'rev', '', _('revision to backout'), _('REV')),
405 ('e', 'edit', False, _('invoke editor on commit messages')),
405 ('e', 'edit', False, _('invoke editor on commit messages')),
406 ] + mergetoolopts + walkopts + commitopts + commitopts2,
406 ] + mergetoolopts + walkopts + commitopts + commitopts2,
407 _('[OPTION]... [-r] REV'))
407 _('[OPTION]... [-r] REV'))
408 def backout(ui, repo, node=None, rev=None, **opts):
408 def backout(ui, repo, node=None, rev=None, **opts):
409 '''reverse effect of earlier changeset
409 '''reverse effect of earlier changeset
410
410
411 Prepare a new changeset with the effect of REV undone in the
411 Prepare a new changeset with the effect of REV undone in the
412 current working directory.
412 current working directory.
413
413
414 If REV is the parent of the working directory, then this new changeset
414 If REV is the parent of the working directory, then this new changeset
415 is committed automatically. Otherwise, hg needs to merge the
415 is committed automatically. Otherwise, hg needs to merge the
416 changes and the merged result is left uncommitted.
416 changes and the merged result is left uncommitted.
417
417
418 .. note::
418 .. note::
419
419
420 backout cannot be used to fix either an unwanted or
420 backout cannot be used to fix either an unwanted or
421 incorrect merge.
421 incorrect merge.
422
422
423 .. container:: verbose
423 .. container:: verbose
424
424
425 By default, the pending changeset will have one parent,
425 By default, the pending changeset will have one parent,
426 maintaining a linear history. With --merge, the pending
426 maintaining a linear history. With --merge, the pending
427 changeset will instead have two parents: the old parent of the
427 changeset will instead have two parents: the old parent of the
428 working directory and a new child of REV that simply undoes REV.
428 working directory and a new child of REV that simply undoes REV.
429
429
430 Before version 1.7, the behavior without --merge was equivalent
430 Before version 1.7, the behavior without --merge was equivalent
431 to specifying --merge followed by :hg:`update --clean .` to
431 to specifying --merge followed by :hg:`update --clean .` to
432 cancel the merge and leave the child of REV as a head to be
432 cancel the merge and leave the child of REV as a head to be
433 merged separately.
433 merged separately.
434
434
435 See :hg:`help dates` for a list of formats valid for -d/--date.
435 See :hg:`help dates` for a list of formats valid for -d/--date.
436
436
437 Returns 0 on success, 1 if nothing to backout or there are unresolved
437 Returns 0 on success, 1 if nothing to backout or there are unresolved
438 files.
438 files.
439 '''
439 '''
440 if rev and node:
440 if rev and node:
441 raise util.Abort(_("please specify just one revision"))
441 raise util.Abort(_("please specify just one revision"))
442
442
443 if not rev:
443 if not rev:
444 rev = node
444 rev = node
445
445
446 if not rev:
446 if not rev:
447 raise util.Abort(_("please specify a revision to backout"))
447 raise util.Abort(_("please specify a revision to backout"))
448
448
449 date = opts.get('date')
449 date = opts.get('date')
450 if date:
450 if date:
451 opts['date'] = util.parsedate(date)
451 opts['date'] = util.parsedate(date)
452
452
453 cmdutil.checkunfinished(repo)
453 cmdutil.checkunfinished(repo)
454 cmdutil.bailifchanged(repo)
454 cmdutil.bailifchanged(repo)
455 node = scmutil.revsingle(repo, rev).node()
455 node = scmutil.revsingle(repo, rev).node()
456
456
457 op1, op2 = repo.dirstate.parents()
457 op1, op2 = repo.dirstate.parents()
458 if node not in repo.changelog.commonancestorsheads(op1, node):
458 if node not in repo.changelog.commonancestorsheads(op1, node):
459 raise util.Abort(_('cannot backout change that is not an ancestor'))
459 raise util.Abort(_('cannot backout change that is not an ancestor'))
460
460
461 p1, p2 = repo.changelog.parents(node)
461 p1, p2 = repo.changelog.parents(node)
462 if p1 == nullid:
462 if p1 == nullid:
463 raise util.Abort(_('cannot backout a change with no parents'))
463 raise util.Abort(_('cannot backout a change with no parents'))
464 if p2 != nullid:
464 if p2 != nullid:
465 if not opts.get('parent'):
465 if not opts.get('parent'):
466 raise util.Abort(_('cannot backout a merge changeset'))
466 raise util.Abort(_('cannot backout a merge changeset'))
467 p = repo.lookup(opts['parent'])
467 p = repo.lookup(opts['parent'])
468 if p not in (p1, p2):
468 if p not in (p1, p2):
469 raise util.Abort(_('%s is not a parent of %s') %
469 raise util.Abort(_('%s is not a parent of %s') %
470 (short(p), short(node)))
470 (short(p), short(node)))
471 parent = p
471 parent = p
472 else:
472 else:
473 if opts.get('parent'):
473 if opts.get('parent'):
474 raise util.Abort(_('cannot use --parent on non-merge changeset'))
474 raise util.Abort(_('cannot use --parent on non-merge changeset'))
475 parent = p1
475 parent = p1
476
476
477 # the backout should appear on the same branch
477 # the backout should appear on the same branch
478 wlock = repo.wlock()
478 wlock = repo.wlock()
479 try:
479 try:
480 branch = repo.dirstate.branch()
480 branch = repo.dirstate.branch()
481 bheads = repo.branchheads(branch)
481 bheads = repo.branchheads(branch)
482 rctx = scmutil.revsingle(repo, hex(parent))
482 rctx = scmutil.revsingle(repo, hex(parent))
483 if not opts.get('merge') and op1 != node:
483 if not opts.get('merge') and op1 != node:
484 try:
484 try:
485 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
485 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
486 'backout')
486 'backout')
487 stats = mergemod.update(repo, parent, True, True, False,
487 stats = mergemod.update(repo, parent, True, True, False,
488 node, False)
488 node, False)
489 repo.setparents(op1, op2)
489 repo.setparents(op1, op2)
490 hg._showstats(repo, stats)
490 hg._showstats(repo, stats)
491 if stats[3]:
491 if stats[3]:
492 repo.ui.status(_("use 'hg resolve' to retry unresolved "
492 repo.ui.status(_("use 'hg resolve' to retry unresolved "
493 "file merges\n"))
493 "file merges\n"))
494 else:
494 else:
495 msg = _("changeset %s backed out, "
495 msg = _("changeset %s backed out, "
496 "don't forget to commit.\n")
496 "don't forget to commit.\n")
497 ui.status(msg % short(node))
497 ui.status(msg % short(node))
498 return stats[3] > 0
498 return stats[3] > 0
499 finally:
499 finally:
500 ui.setconfig('ui', 'forcemerge', '', '')
500 ui.setconfig('ui', 'forcemerge', '', '')
501 else:
501 else:
502 hg.clean(repo, node, show_stats=False)
502 hg.clean(repo, node, show_stats=False)
503 repo.dirstate.setbranch(branch)
503 repo.dirstate.setbranch(branch)
504 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
504 cmdutil.revert(ui, repo, rctx, repo.dirstate.parents())
505
505
506
506
507 def commitfunc(ui, repo, message, match, opts):
507 def commitfunc(ui, repo, message, match, opts):
508 e = cmdutil.getcommiteditor(**opts)
508 e = cmdutil.getcommiteditor(**opts)
509 if not message:
509 if not message:
510 # we don't translate commit messages
510 # we don't translate commit messages
511 message = "Backed out changeset %s" % short(node)
511 message = "Backed out changeset %s" % short(node)
512 e = cmdutil.getcommiteditor(edit=True)
512 e = cmdutil.getcommiteditor(edit=True)
513 return repo.commit(message, opts.get('user'), opts.get('date'),
513 return repo.commit(message, opts.get('user'), opts.get('date'),
514 match, editor=e)
514 match, editor=e)
515 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
515 newnode = cmdutil.commit(ui, repo, commitfunc, [], opts)
516 if not newnode:
516 if not newnode:
517 ui.status(_("nothing changed\n"))
517 ui.status(_("nothing changed\n"))
518 return 1
518 return 1
519 cmdutil.commitstatus(repo, newnode, branch, bheads)
519 cmdutil.commitstatus(repo, newnode, branch, bheads)
520
520
521 def nice(node):
521 def nice(node):
522 return '%d:%s' % (repo.changelog.rev(node), short(node))
522 return '%d:%s' % (repo.changelog.rev(node), short(node))
523 ui.status(_('changeset %s backs out changeset %s\n') %
523 ui.status(_('changeset %s backs out changeset %s\n') %
524 (nice(repo.changelog.tip()), nice(node)))
524 (nice(repo.changelog.tip()), nice(node)))
525 if opts.get('merge') and op1 != node:
525 if opts.get('merge') and op1 != node:
526 hg.clean(repo, op1, show_stats=False)
526 hg.clean(repo, op1, show_stats=False)
527 ui.status(_('merging with changeset %s\n')
527 ui.status(_('merging with changeset %s\n')
528 % nice(repo.changelog.tip()))
528 % nice(repo.changelog.tip()))
529 try:
529 try:
530 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
530 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
531 'backout')
531 'backout')
532 return hg.merge(repo, hex(repo.changelog.tip()))
532 return hg.merge(repo, hex(repo.changelog.tip()))
533 finally:
533 finally:
534 ui.setconfig('ui', 'forcemerge', '', '')
534 ui.setconfig('ui', 'forcemerge', '', '')
535 finally:
535 finally:
536 wlock.release()
536 wlock.release()
537 return 0
537 return 0
538
538
539 @command('bisect',
539 @command('bisect',
540 [('r', 'reset', False, _('reset bisect state')),
540 [('r', 'reset', False, _('reset bisect state')),
541 ('g', 'good', False, _('mark changeset good')),
541 ('g', 'good', False, _('mark changeset good')),
542 ('b', 'bad', False, _('mark changeset bad')),
542 ('b', 'bad', False, _('mark changeset bad')),
543 ('s', 'skip', False, _('skip testing changeset')),
543 ('s', 'skip', False, _('skip testing changeset')),
544 ('e', 'extend', False, _('extend the bisect range')),
544 ('e', 'extend', False, _('extend the bisect range')),
545 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
545 ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
546 ('U', 'noupdate', False, _('do not update to target'))],
546 ('U', 'noupdate', False, _('do not update to target'))],
547 _("[-gbsr] [-U] [-c CMD] [REV]"))
547 _("[-gbsr] [-U] [-c CMD] [REV]"))
548 def bisect(ui, repo, rev=None, extra=None, command=None,
548 def bisect(ui, repo, rev=None, extra=None, command=None,
549 reset=None, good=None, bad=None, skip=None, extend=None,
549 reset=None, good=None, bad=None, skip=None, extend=None,
550 noupdate=None):
550 noupdate=None):
551 """subdivision search of changesets
551 """subdivision search of changesets
552
552
553 This command helps to find changesets which introduce problems. To
553 This command helps to find changesets which introduce problems. To
554 use, mark the earliest changeset you know exhibits the problem as
554 use, mark the earliest changeset you know exhibits the problem as
555 bad, then mark the latest changeset which is free from the problem
555 bad, then mark the latest changeset which is free from the problem
556 as good. Bisect will update your working directory to a revision
556 as good. Bisect will update your working directory to a revision
557 for testing (unless the -U/--noupdate option is specified). Once
557 for testing (unless the -U/--noupdate option is specified). Once
558 you have performed tests, mark the working directory as good or
558 you have performed tests, mark the working directory as good or
559 bad, and bisect will either update to another candidate changeset
559 bad, and bisect will either update to another candidate changeset
560 or announce that it has found the bad revision.
560 or announce that it has found the bad revision.
561
561
562 As a shortcut, you can also use the revision argument to mark a
562 As a shortcut, you can also use the revision argument to mark a
563 revision as good or bad without checking it out first.
563 revision as good or bad without checking it out first.
564
564
565 If you supply a command, it will be used for automatic bisection.
565 If you supply a command, it will be used for automatic bisection.
566 The environment variable HG_NODE will contain the ID of the
566 The environment variable HG_NODE will contain the ID of the
567 changeset being tested. The exit status of the command will be
567 changeset being tested. The exit status of the command will be
568 used to mark revisions as good or bad: status 0 means good, 125
568 used to mark revisions as good or bad: status 0 means good, 125
569 means to skip the revision, 127 (command not found) will abort the
569 means to skip the revision, 127 (command not found) will abort the
570 bisection, and any other non-zero exit status means the revision
570 bisection, and any other non-zero exit status means the revision
571 is bad.
571 is bad.
572
572
573 .. container:: verbose
573 .. container:: verbose
574
574
575 Some examples:
575 Some examples:
576
576
577 - start a bisection with known bad revision 34, and good revision 12::
577 - start a bisection with known bad revision 34, and good revision 12::
578
578
579 hg bisect --bad 34
579 hg bisect --bad 34
580 hg bisect --good 12
580 hg bisect --good 12
581
581
582 - advance the current bisection by marking current revision as good or
582 - advance the current bisection by marking current revision as good or
583 bad::
583 bad::
584
584
585 hg bisect --good
585 hg bisect --good
586 hg bisect --bad
586 hg bisect --bad
587
587
588 - mark the current revision, or a known revision, to be skipped (e.g. if
588 - mark the current revision, or a known revision, to be skipped (e.g. if
589 that revision is not usable because of another issue)::
589 that revision is not usable because of another issue)::
590
590
591 hg bisect --skip
591 hg bisect --skip
592 hg bisect --skip 23
592 hg bisect --skip 23
593
593
594 - skip all revisions that do not touch directories ``foo`` or ``bar``::
594 - skip all revisions that do not touch directories ``foo`` or ``bar``::
595
595
596 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
596 hg bisect --skip "!( file('path:foo') & file('path:bar') )"
597
597
598 - forget the current bisection::
598 - forget the current bisection::
599
599
600 hg bisect --reset
600 hg bisect --reset
601
601
602 - use 'make && make tests' to automatically find the first broken
602 - use 'make && make tests' to automatically find the first broken
603 revision::
603 revision::
604
604
605 hg bisect --reset
605 hg bisect --reset
606 hg bisect --bad 34
606 hg bisect --bad 34
607 hg bisect --good 12
607 hg bisect --good 12
608 hg bisect --command "make && make tests"
608 hg bisect --command "make && make tests"
609
609
610 - see all changesets whose states are already known in the current
610 - see all changesets whose states are already known in the current
611 bisection::
611 bisection::
612
612
613 hg log -r "bisect(pruned)"
613 hg log -r "bisect(pruned)"
614
614
615 - see the changeset currently being bisected (especially useful
615 - see the changeset currently being bisected (especially useful
616 if running with -U/--noupdate)::
616 if running with -U/--noupdate)::
617
617
618 hg log -r "bisect(current)"
618 hg log -r "bisect(current)"
619
619
620 - see all changesets that took part in the current bisection::
620 - see all changesets that took part in the current bisection::
621
621
622 hg log -r "bisect(range)"
622 hg log -r "bisect(range)"
623
623
624 - you can even get a nice graph::
624 - you can even get a nice graph::
625
625
626 hg log --graph -r "bisect(range)"
626 hg log --graph -r "bisect(range)"
627
627
628 See :hg:`help revsets` for more about the `bisect()` keyword.
628 See :hg:`help revsets` for more about the `bisect()` keyword.
629
629
630 Returns 0 on success.
630 Returns 0 on success.
631 """
631 """
632 def extendbisectrange(nodes, good):
632 def extendbisectrange(nodes, good):
633 # bisect is incomplete when it ends on a merge node and
633 # bisect is incomplete when it ends on a merge node and
634 # one of the parent was not checked.
634 # one of the parent was not checked.
635 parents = repo[nodes[0]].parents()
635 parents = repo[nodes[0]].parents()
636 if len(parents) > 1:
636 if len(parents) > 1:
637 side = good and state['bad'] or state['good']
637 side = good and state['bad'] or state['good']
638 num = len(set(i.node() for i in parents) & set(side))
638 num = len(set(i.node() for i in parents) & set(side))
639 if num == 1:
639 if num == 1:
640 return parents[0].ancestor(parents[1])
640 return parents[0].ancestor(parents[1])
641 return None
641 return None
642
642
643 def print_result(nodes, good):
643 def print_result(nodes, good):
644 displayer = cmdutil.show_changeset(ui, repo, {})
644 displayer = cmdutil.show_changeset(ui, repo, {})
645 if len(nodes) == 1:
645 if len(nodes) == 1:
646 # narrowed it down to a single revision
646 # narrowed it down to a single revision
647 if good:
647 if good:
648 ui.write(_("The first good revision is:\n"))
648 ui.write(_("The first good revision is:\n"))
649 else:
649 else:
650 ui.write(_("The first bad revision is:\n"))
650 ui.write(_("The first bad revision is:\n"))
651 displayer.show(repo[nodes[0]])
651 displayer.show(repo[nodes[0]])
652 extendnode = extendbisectrange(nodes, good)
652 extendnode = extendbisectrange(nodes, good)
653 if extendnode is not None:
653 if extendnode is not None:
654 ui.write(_('Not all ancestors of this changeset have been'
654 ui.write(_('Not all ancestors of this changeset have been'
655 ' checked.\nUse bisect --extend to continue the '
655 ' checked.\nUse bisect --extend to continue the '
656 'bisection from\nthe common ancestor, %s.\n')
656 'bisection from\nthe common ancestor, %s.\n')
657 % extendnode)
657 % extendnode)
658 else:
658 else:
659 # multiple possible revisions
659 # multiple possible revisions
660 if good:
660 if good:
661 ui.write(_("Due to skipped revisions, the first "
661 ui.write(_("Due to skipped revisions, the first "
662 "good revision could be any of:\n"))
662 "good revision could be any of:\n"))
663 else:
663 else:
664 ui.write(_("Due to skipped revisions, the first "
664 ui.write(_("Due to skipped revisions, the first "
665 "bad revision could be any of:\n"))
665 "bad revision could be any of:\n"))
666 for n in nodes:
666 for n in nodes:
667 displayer.show(repo[n])
667 displayer.show(repo[n])
668 displayer.close()
668 displayer.close()
669
669
670 def check_state(state, interactive=True):
670 def check_state(state, interactive=True):
671 if not state['good'] or not state['bad']:
671 if not state['good'] or not state['bad']:
672 if (good or bad or skip or reset) and interactive:
672 if (good or bad or skip or reset) and interactive:
673 return
673 return
674 if not state['good']:
674 if not state['good']:
675 raise util.Abort(_('cannot bisect (no known good revisions)'))
675 raise util.Abort(_('cannot bisect (no known good revisions)'))
676 else:
676 else:
677 raise util.Abort(_('cannot bisect (no known bad revisions)'))
677 raise util.Abort(_('cannot bisect (no known bad revisions)'))
678 return True
678 return True
679
679
680 # backward compatibility
680 # backward compatibility
681 if rev in "good bad reset init".split():
681 if rev in "good bad reset init".split():
682 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
682 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
683 cmd, rev, extra = rev, extra, None
683 cmd, rev, extra = rev, extra, None
684 if cmd == "good":
684 if cmd == "good":
685 good = True
685 good = True
686 elif cmd == "bad":
686 elif cmd == "bad":
687 bad = True
687 bad = True
688 else:
688 else:
689 reset = True
689 reset = True
690 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
690 elif extra or good + bad + skip + reset + extend + bool(command) > 1:
691 raise util.Abort(_('incompatible arguments'))
691 raise util.Abort(_('incompatible arguments'))
692
692
693 cmdutil.checkunfinished(repo)
693 cmdutil.checkunfinished(repo)
694
694
695 if reset:
695 if reset:
696 p = repo.join("bisect.state")
696 p = repo.join("bisect.state")
697 if os.path.exists(p):
697 if os.path.exists(p):
698 os.unlink(p)
698 os.unlink(p)
699 return
699 return
700
700
701 state = hbisect.load_state(repo)
701 state = hbisect.load_state(repo)
702
702
703 if command:
703 if command:
704 changesets = 1
704 changesets = 1
705 if noupdate:
705 if noupdate:
706 try:
706 try:
707 node = state['current'][0]
707 node = state['current'][0]
708 except LookupError:
708 except LookupError:
709 raise util.Abort(_('current bisect revision is unknown - '
709 raise util.Abort(_('current bisect revision is unknown - '
710 'start a new bisect to fix'))
710 'start a new bisect to fix'))
711 else:
711 else:
712 node, p2 = repo.dirstate.parents()
712 node, p2 = repo.dirstate.parents()
713 if p2 != nullid:
713 if p2 != nullid:
714 raise util.Abort(_('current bisect revision is a merge'))
714 raise util.Abort(_('current bisect revision is a merge'))
715 try:
715 try:
716 while changesets:
716 while changesets:
717 # update state
717 # update state
718 state['current'] = [node]
718 state['current'] = [node]
719 hbisect.save_state(repo, state)
719 hbisect.save_state(repo, state)
720 status = util.system(command,
720 status = util.system(command,
721 environ={'HG_NODE': hex(node)},
721 environ={'HG_NODE': hex(node)},
722 out=ui.fout)
722 out=ui.fout)
723 if status == 125:
723 if status == 125:
724 transition = "skip"
724 transition = "skip"
725 elif status == 0:
725 elif status == 0:
726 transition = "good"
726 transition = "good"
727 # status < 0 means process was killed
727 # status < 0 means process was killed
728 elif status == 127:
728 elif status == 127:
729 raise util.Abort(_("failed to execute %s") % command)
729 raise util.Abort(_("failed to execute %s") % command)
730 elif status < 0:
730 elif status < 0:
731 raise util.Abort(_("%s killed") % command)
731 raise util.Abort(_("%s killed") % command)
732 else:
732 else:
733 transition = "bad"
733 transition = "bad"
734 ctx = scmutil.revsingle(repo, rev, node)
734 ctx = scmutil.revsingle(repo, rev, node)
735 rev = None # clear for future iterations
735 rev = None # clear for future iterations
736 state[transition].append(ctx.node())
736 state[transition].append(ctx.node())
737 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
737 ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
738 check_state(state, interactive=False)
738 check_state(state, interactive=False)
739 # bisect
739 # bisect
740 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
740 nodes, changesets, bgood = hbisect.bisect(repo.changelog, state)
741 # update to next check
741 # update to next check
742 node = nodes[0]
742 node = nodes[0]
743 if not noupdate:
743 if not noupdate:
744 cmdutil.bailifchanged(repo)
744 cmdutil.bailifchanged(repo)
745 hg.clean(repo, node, show_stats=False)
745 hg.clean(repo, node, show_stats=False)
746 finally:
746 finally:
747 state['current'] = [node]
747 state['current'] = [node]
748 hbisect.save_state(repo, state)
748 hbisect.save_state(repo, state)
749 print_result(nodes, bgood)
749 print_result(nodes, bgood)
750 return
750 return
751
751
752 # update state
752 # update state
753
753
754 if rev:
754 if rev:
755 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
755 nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
756 else:
756 else:
757 nodes = [repo.lookup('.')]
757 nodes = [repo.lookup('.')]
758
758
759 if good or bad or skip:
759 if good or bad or skip:
760 if good:
760 if good:
761 state['good'] += nodes
761 state['good'] += nodes
762 elif bad:
762 elif bad:
763 state['bad'] += nodes
763 state['bad'] += nodes
764 elif skip:
764 elif skip:
765 state['skip'] += nodes
765 state['skip'] += nodes
766 hbisect.save_state(repo, state)
766 hbisect.save_state(repo, state)
767
767
768 if not check_state(state):
768 if not check_state(state):
769 return
769 return
770
770
771 # actually bisect
771 # actually bisect
772 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
772 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
773 if extend:
773 if extend:
774 if not changesets:
774 if not changesets:
775 extendnode = extendbisectrange(nodes, good)
775 extendnode = extendbisectrange(nodes, good)
776 if extendnode is not None:
776 if extendnode is not None:
777 ui.write(_("Extending search to changeset %d:%s\n")
777 ui.write(_("Extending search to changeset %d:%s\n")
778 % (extendnode.rev(), extendnode))
778 % (extendnode.rev(), extendnode))
779 state['current'] = [extendnode.node()]
779 state['current'] = [extendnode.node()]
780 hbisect.save_state(repo, state)
780 hbisect.save_state(repo, state)
781 if noupdate:
781 if noupdate:
782 return
782 return
783 cmdutil.bailifchanged(repo)
783 cmdutil.bailifchanged(repo)
784 return hg.clean(repo, extendnode.node())
784 return hg.clean(repo, extendnode.node())
785 raise util.Abort(_("nothing to extend"))
785 raise util.Abort(_("nothing to extend"))
786
786
787 if changesets == 0:
787 if changesets == 0:
788 print_result(nodes, good)
788 print_result(nodes, good)
789 else:
789 else:
790 assert len(nodes) == 1 # only a single node can be tested next
790 assert len(nodes) == 1 # only a single node can be tested next
791 node = nodes[0]
791 node = nodes[0]
792 # compute the approximate number of remaining tests
792 # compute the approximate number of remaining tests
793 tests, size = 0, 2
793 tests, size = 0, 2
794 while size <= changesets:
794 while size <= changesets:
795 tests, size = tests + 1, size * 2
795 tests, size = tests + 1, size * 2
796 rev = repo.changelog.rev(node)
796 rev = repo.changelog.rev(node)
797 ui.write(_("Testing changeset %d:%s "
797 ui.write(_("Testing changeset %d:%s "
798 "(%d changesets remaining, ~%d tests)\n")
798 "(%d changesets remaining, ~%d tests)\n")
799 % (rev, short(node), changesets, tests))
799 % (rev, short(node), changesets, tests))
800 state['current'] = [node]
800 state['current'] = [node]
801 hbisect.save_state(repo, state)
801 hbisect.save_state(repo, state)
802 if not noupdate:
802 if not noupdate:
803 cmdutil.bailifchanged(repo)
803 cmdutil.bailifchanged(repo)
804 return hg.clean(repo, node)
804 return hg.clean(repo, node)
805
805
806 @command('bookmarks|bookmark',
806 @command('bookmarks|bookmark',
807 [('f', 'force', False, _('force')),
807 [('f', 'force', False, _('force')),
808 ('r', 'rev', '', _('revision'), _('REV')),
808 ('r', 'rev', '', _('revision'), _('REV')),
809 ('d', 'delete', False, _('delete a given bookmark')),
809 ('d', 'delete', False, _('delete a given bookmark')),
810 ('m', 'rename', '', _('rename a given bookmark'), _('NAME')),
810 ('m', 'rename', '', _('rename a given bookmark'), _('NAME')),
811 ('i', 'inactive', False, _('mark a bookmark inactive'))],
811 ('i', 'inactive', False, _('mark a bookmark inactive'))],
812 _('hg bookmarks [OPTIONS]... [NAME]...'))
812 _('hg bookmarks [OPTIONS]... [NAME]...'))
813 def bookmark(ui, repo, *names, **opts):
813 def bookmark(ui, repo, *names, **opts):
814 '''create a new bookmark or list existing bookmarks
814 '''create a new bookmark or list existing bookmarks
815
815
816 Bookmarks are labels on changesets to help track lines of development.
816 Bookmarks are labels on changesets to help track lines of development.
817 Bookmarks are unversioned and can be moved, renamed and deleted.
817 Bookmarks are unversioned and can be moved, renamed and deleted.
818 Deleting or moving a bookmark has no effect on the associated changesets.
818 Deleting or moving a bookmark has no effect on the associated changesets.
819
819
820 Creating or updating to a bookmark causes it to be marked as 'active'.
820 Creating or updating to a bookmark causes it to be marked as 'active'.
821 Active bookmarks are indicated with a '*'.
821 Active bookmarks are indicated with a '*'.
822 When a commit is made, an active bookmark will advance to the new commit.
822 When a commit is made, an active bookmark will advance to the new commit.
823 A plain :hg:`update` will also advance an active bookmark, if possible.
823 A plain :hg:`update` will also advance an active bookmark, if possible.
824 Updating away from a bookmark will cause it to be deactivated.
824 Updating away from a bookmark will cause it to be deactivated.
825
825
826 Bookmarks can be pushed and pulled between repositories (see
826 Bookmarks can be pushed and pulled between repositories (see
827 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
827 :hg:`help push` and :hg:`help pull`). If a shared bookmark has
828 diverged, a new 'divergent bookmark' of the form 'name@path' will
828 diverged, a new 'divergent bookmark' of the form 'name@path' will
829 be created. Using :hg:'merge' will resolve the divergence.
829 be created. Using :hg:'merge' will resolve the divergence.
830
830
831 A bookmark named '@' has the special property that :hg:`clone` will
831 A bookmark named '@' has the special property that :hg:`clone` will
832 check it out by default if it exists.
832 check it out by default if it exists.
833
833
834 .. container:: verbose
834 .. container:: verbose
835
835
836 Examples:
836 Examples:
837
837
838 - create an active bookmark for a new line of development::
838 - create an active bookmark for a new line of development::
839
839
840 hg book new-feature
840 hg book new-feature
841
841
842 - create an inactive bookmark as a place marker::
842 - create an inactive bookmark as a place marker::
843
843
844 hg book -i reviewed
844 hg book -i reviewed
845
845
846 - create an inactive bookmark on another changeset::
846 - create an inactive bookmark on another changeset::
847
847
848 hg book -r .^ tested
848 hg book -r .^ tested
849
849
850 - move the '@' bookmark from another branch::
850 - move the '@' bookmark from another branch::
851
851
852 hg book -f @
852 hg book -f @
853 '''
853 '''
854 force = opts.get('force')
854 force = opts.get('force')
855 rev = opts.get('rev')
855 rev = opts.get('rev')
856 delete = opts.get('delete')
856 delete = opts.get('delete')
857 rename = opts.get('rename')
857 rename = opts.get('rename')
858 inactive = opts.get('inactive')
858 inactive = opts.get('inactive')
859
859
860 def checkformat(mark):
860 def checkformat(mark):
861 mark = mark.strip()
861 mark = mark.strip()
862 if not mark:
862 if not mark:
863 raise util.Abort(_("bookmark names cannot consist entirely of "
863 raise util.Abort(_("bookmark names cannot consist entirely of "
864 "whitespace"))
864 "whitespace"))
865 scmutil.checknewlabel(repo, mark, 'bookmark')
865 scmutil.checknewlabel(repo, mark, 'bookmark')
866 return mark
866 return mark
867
867
868 def checkconflict(repo, mark, cur, force=False, target=None):
868 def checkconflict(repo, mark, cur, force=False, target=None):
869 if mark in marks and not force:
869 if mark in marks and not force:
870 if target:
870 if target:
871 if marks[mark] == target and target == cur:
871 if marks[mark] == target and target == cur:
872 # re-activating a bookmark
872 # re-activating a bookmark
873 return
873 return
874 anc = repo.changelog.ancestors([repo[target].rev()])
874 anc = repo.changelog.ancestors([repo[target].rev()])
875 bmctx = repo[marks[mark]]
875 bmctx = repo[marks[mark]]
876 divs = [repo[b].node() for b in marks
876 divs = [repo[b].node() for b in marks
877 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
877 if b.split('@', 1)[0] == mark.split('@', 1)[0]]
878
878
879 # allow resolving a single divergent bookmark even if moving
879 # allow resolving a single divergent bookmark even if moving
880 # the bookmark across branches when a revision is specified
880 # the bookmark across branches when a revision is specified
881 # that contains a divergent bookmark
881 # that contains a divergent bookmark
882 if bmctx.rev() not in anc and target in divs:
882 if bmctx.rev() not in anc and target in divs:
883 bookmarks.deletedivergent(repo, [target], mark)
883 bookmarks.deletedivergent(repo, [target], mark)
884 return
884 return
885
885
886 deletefrom = [b for b in divs
886 deletefrom = [b for b in divs
887 if repo[b].rev() in anc or b == target]
887 if repo[b].rev() in anc or b == target]
888 bookmarks.deletedivergent(repo, deletefrom, mark)
888 bookmarks.deletedivergent(repo, deletefrom, mark)
889 if bookmarks.validdest(repo, bmctx, repo[target]):
889 if bookmarks.validdest(repo, bmctx, repo[target]):
890 ui.status(_("moving bookmark '%s' forward from %s\n") %
890 ui.status(_("moving bookmark '%s' forward from %s\n") %
891 (mark, short(bmctx.node())))
891 (mark, short(bmctx.node())))
892 return
892 return
893 raise util.Abort(_("bookmark '%s' already exists "
893 raise util.Abort(_("bookmark '%s' already exists "
894 "(use -f to force)") % mark)
894 "(use -f to force)") % mark)
895 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
895 if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
896 and not force):
896 and not force):
897 raise util.Abort(
897 raise util.Abort(
898 _("a bookmark cannot have the name of an existing branch"))
898 _("a bookmark cannot have the name of an existing branch"))
899
899
900 if delete and rename:
900 if delete and rename:
901 raise util.Abort(_("--delete and --rename are incompatible"))
901 raise util.Abort(_("--delete and --rename are incompatible"))
902 if delete and rev:
902 if delete and rev:
903 raise util.Abort(_("--rev is incompatible with --delete"))
903 raise util.Abort(_("--rev is incompatible with --delete"))
904 if rename and rev:
904 if rename and rev:
905 raise util.Abort(_("--rev is incompatible with --rename"))
905 raise util.Abort(_("--rev is incompatible with --rename"))
906 if not names and (delete or rev):
906 if not names and (delete or rev):
907 raise util.Abort(_("bookmark name required"))
907 raise util.Abort(_("bookmark name required"))
908
908
909 if delete or rename or names or inactive:
909 if delete or rename or names or inactive:
910 wlock = repo.wlock()
910 wlock = repo.wlock()
911 try:
911 try:
912 cur = repo.changectx('.').node()
912 cur = repo.changectx('.').node()
913 marks = repo._bookmarks
913 marks = repo._bookmarks
914 if delete:
914 if delete:
915 for mark in names:
915 for mark in names:
916 if mark not in marks:
916 if mark not in marks:
917 raise util.Abort(_("bookmark '%s' does not exist") %
917 raise util.Abort(_("bookmark '%s' does not exist") %
918 mark)
918 mark)
919 if mark == repo._bookmarkcurrent:
919 if mark == repo._bookmarkcurrent:
920 bookmarks.unsetcurrent(repo)
920 bookmarks.unsetcurrent(repo)
921 del marks[mark]
921 del marks[mark]
922 marks.write()
922 marks.write()
923
923
924 elif rename:
924 elif rename:
925 if not names:
925 if not names:
926 raise util.Abort(_("new bookmark name required"))
926 raise util.Abort(_("new bookmark name required"))
927 elif len(names) > 1:
927 elif len(names) > 1:
928 raise util.Abort(_("only one new bookmark name allowed"))
928 raise util.Abort(_("only one new bookmark name allowed"))
929 mark = checkformat(names[0])
929 mark = checkformat(names[0])
930 if rename not in marks:
930 if rename not in marks:
931 raise util.Abort(_("bookmark '%s' does not exist") % rename)
931 raise util.Abort(_("bookmark '%s' does not exist") % rename)
932 checkconflict(repo, mark, cur, force)
932 checkconflict(repo, mark, cur, force)
933 marks[mark] = marks[rename]
933 marks[mark] = marks[rename]
934 if repo._bookmarkcurrent == rename and not inactive:
934 if repo._bookmarkcurrent == rename and not inactive:
935 bookmarks.setcurrent(repo, mark)
935 bookmarks.setcurrent(repo, mark)
936 del marks[rename]
936 del marks[rename]
937 marks.write()
937 marks.write()
938
938
939 elif names:
939 elif names:
940 newact = None
940 newact = None
941 for mark in names:
941 for mark in names:
942 mark = checkformat(mark)
942 mark = checkformat(mark)
943 if newact is None:
943 if newact is None:
944 newact = mark
944 newact = mark
945 if inactive and mark == repo._bookmarkcurrent:
945 if inactive and mark == repo._bookmarkcurrent:
946 bookmarks.unsetcurrent(repo)
946 bookmarks.unsetcurrent(repo)
947 return
947 return
948 tgt = cur
948 tgt = cur
949 if rev:
949 if rev:
950 tgt = scmutil.revsingle(repo, rev).node()
950 tgt = scmutil.revsingle(repo, rev).node()
951 checkconflict(repo, mark, cur, force, tgt)
951 checkconflict(repo, mark, cur, force, tgt)
952 marks[mark] = tgt
952 marks[mark] = tgt
953 if not inactive and cur == marks[newact] and not rev:
953 if not inactive and cur == marks[newact] and not rev:
954 bookmarks.setcurrent(repo, newact)
954 bookmarks.setcurrent(repo, newact)
955 elif cur != tgt and newact == repo._bookmarkcurrent:
955 elif cur != tgt and newact == repo._bookmarkcurrent:
956 bookmarks.unsetcurrent(repo)
956 bookmarks.unsetcurrent(repo)
957 marks.write()
957 marks.write()
958
958
959 elif inactive:
959 elif inactive:
960 if len(marks) == 0:
960 if len(marks) == 0:
961 ui.status(_("no bookmarks set\n"))
961 ui.status(_("no bookmarks set\n"))
962 elif not repo._bookmarkcurrent:
962 elif not repo._bookmarkcurrent:
963 ui.status(_("no active bookmark\n"))
963 ui.status(_("no active bookmark\n"))
964 else:
964 else:
965 bookmarks.unsetcurrent(repo)
965 bookmarks.unsetcurrent(repo)
966 finally:
966 finally:
967 wlock.release()
967 wlock.release()
968 else: # show bookmarks
968 else: # show bookmarks
969 hexfn = ui.debugflag and hex or short
969 hexfn = ui.debugflag and hex or short
970 marks = repo._bookmarks
970 marks = repo._bookmarks
971 if len(marks) == 0:
971 if len(marks) == 0:
972 ui.status(_("no bookmarks set\n"))
972 ui.status(_("no bookmarks set\n"))
973 else:
973 else:
974 for bmark, n in sorted(marks.iteritems()):
974 for bmark, n in sorted(marks.iteritems()):
975 current = repo._bookmarkcurrent
975 current = repo._bookmarkcurrent
976 if bmark == current:
976 if bmark == current:
977 prefix, label = '*', 'bookmarks.current'
977 prefix, label = '*', 'bookmarks.current'
978 else:
978 else:
979 prefix, label = ' ', ''
979 prefix, label = ' ', ''
980
980
981 if ui.quiet:
981 if ui.quiet:
982 ui.write("%s\n" % bmark, label=label)
982 ui.write("%s\n" % bmark, label=label)
983 else:
983 else:
984 pad = " " * (25 - encoding.colwidth(bmark))
984 pad = " " * (25 - encoding.colwidth(bmark))
985 ui.write(" %s %s%s %d:%s\n" % (
985 ui.write(" %s %s%s %d:%s\n" % (
986 prefix, bmark, pad, repo.changelog.rev(n), hexfn(n)),
986 prefix, bmark, pad, repo.changelog.rev(n), hexfn(n)),
987 label=label)
987 label=label)
988
988
989 @command('branch',
989 @command('branch',
990 [('f', 'force', None,
990 [('f', 'force', None,
991 _('set branch name even if it shadows an existing branch')),
991 _('set branch name even if it shadows an existing branch')),
992 ('C', 'clean', None, _('reset branch name to parent branch name'))],
992 ('C', 'clean', None, _('reset branch name to parent branch name'))],
993 _('[-fC] [NAME]'))
993 _('[-fC] [NAME]'))
994 def branch(ui, repo, label=None, **opts):
994 def branch(ui, repo, label=None, **opts):
995 """set or show the current branch name
995 """set or show the current branch name
996
996
997 .. note::
997 .. note::
998
998
999 Branch names are permanent and global. Use :hg:`bookmark` to create a
999 Branch names are permanent and global. Use :hg:`bookmark` to create a
1000 light-weight bookmark instead. See :hg:`help glossary` for more
1000 light-weight bookmark instead. See :hg:`help glossary` for more
1001 information about named branches and bookmarks.
1001 information about named branches and bookmarks.
1002
1002
1003 With no argument, show the current branch name. With one argument,
1003 With no argument, show the current branch name. With one argument,
1004 set the working directory branch name (the branch will not exist
1004 set the working directory branch name (the branch will not exist
1005 in the repository until the next commit). Standard practice
1005 in the repository until the next commit). Standard practice
1006 recommends that primary development take place on the 'default'
1006 recommends that primary development take place on the 'default'
1007 branch.
1007 branch.
1008
1008
1009 Unless -f/--force is specified, branch will not let you set a
1009 Unless -f/--force is specified, branch will not let you set a
1010 branch name that already exists, even if it's inactive.
1010 branch name that already exists, even if it's inactive.
1011
1011
1012 Use -C/--clean to reset the working directory branch to that of
1012 Use -C/--clean to reset the working directory branch to that of
1013 the parent of the working directory, negating a previous branch
1013 the parent of the working directory, negating a previous branch
1014 change.
1014 change.
1015
1015
1016 Use the command :hg:`update` to switch to an existing branch. Use
1016 Use the command :hg:`update` to switch to an existing branch. Use
1017 :hg:`commit --close-branch` to mark this branch as closed.
1017 :hg:`commit --close-branch` to mark this branch as closed.
1018
1018
1019 Returns 0 on success.
1019 Returns 0 on success.
1020 """
1020 """
1021 if label:
1021 if label:
1022 label = label.strip()
1022 label = label.strip()
1023
1023
1024 if not opts.get('clean') and not label:
1024 if not opts.get('clean') and not label:
1025 ui.write("%s\n" % repo.dirstate.branch())
1025 ui.write("%s\n" % repo.dirstate.branch())
1026 return
1026 return
1027
1027
1028 wlock = repo.wlock()
1028 wlock = repo.wlock()
1029 try:
1029 try:
1030 if opts.get('clean'):
1030 if opts.get('clean'):
1031 label = repo[None].p1().branch()
1031 label = repo[None].p1().branch()
1032 repo.dirstate.setbranch(label)
1032 repo.dirstate.setbranch(label)
1033 ui.status(_('reset working directory to branch %s\n') % label)
1033 ui.status(_('reset working directory to branch %s\n') % label)
1034 elif label:
1034 elif label:
1035 if not opts.get('force') and label in repo.branchmap():
1035 if not opts.get('force') and label in repo.branchmap():
1036 if label not in [p.branch() for p in repo.parents()]:
1036 if label not in [p.branch() for p in repo.parents()]:
1037 raise util.Abort(_('a branch of the same name already'
1037 raise util.Abort(_('a branch of the same name already'
1038 ' exists'),
1038 ' exists'),
1039 # i18n: "it" refers to an existing branch
1039 # i18n: "it" refers to an existing branch
1040 hint=_("use 'hg update' to switch to it"))
1040 hint=_("use 'hg update' to switch to it"))
1041 scmutil.checknewlabel(repo, label, 'branch')
1041 scmutil.checknewlabel(repo, label, 'branch')
1042 repo.dirstate.setbranch(label)
1042 repo.dirstate.setbranch(label)
1043 ui.status(_('marked working directory as branch %s\n') % label)
1043 ui.status(_('marked working directory as branch %s\n') % label)
1044 ui.status(_('(branches are permanent and global, '
1044 ui.status(_('(branches are permanent and global, '
1045 'did you want a bookmark?)\n'))
1045 'did you want a bookmark?)\n'))
1046 finally:
1046 finally:
1047 wlock.release()
1047 wlock.release()
1048
1048
1049 @command('branches',
1049 @command('branches',
1050 [('a', 'active', False, _('show only branches that have unmerged heads')),
1050 [('a', 'active', False, _('show only branches that have unmerged heads')),
1051 ('c', 'closed', False, _('show normal and closed branches'))],
1051 ('c', 'closed', False, _('show normal and closed branches'))],
1052 _('[-ac]'))
1052 _('[-ac]'))
1053 def branches(ui, repo, active=False, closed=False):
1053 def branches(ui, repo, active=False, closed=False):
1054 """list repository named branches
1054 """list repository named branches
1055
1055
1056 List the repository's named branches, indicating which ones are
1056 List the repository's named branches, indicating which ones are
1057 inactive. If -c/--closed is specified, also list branches which have
1057 inactive. If -c/--closed is specified, also list branches which have
1058 been marked closed (see :hg:`commit --close-branch`).
1058 been marked closed (see :hg:`commit --close-branch`).
1059
1059
1060 If -a/--active is specified, only show active branches. A branch
1060 If -a/--active is specified, only show active branches. A branch
1061 is considered active if it contains repository heads.
1061 is considered active if it contains repository heads.
1062
1062
1063 Use the command :hg:`update` to switch to an existing branch.
1063 Use the command :hg:`update` to switch to an existing branch.
1064
1064
1065 Returns 0.
1065 Returns 0.
1066 """
1066 """
1067
1067
1068 hexfunc = ui.debugflag and hex or short
1068 hexfunc = ui.debugflag and hex or short
1069
1069
1070 allheads = set(repo.heads())
1070 allheads = set(repo.heads())
1071 branches = []
1071 branches = []
1072 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1072 for tag, heads, tip, isclosed in repo.branchmap().iterbranches():
1073 isactive = not isclosed and bool(set(heads) & allheads)
1073 isactive = not isclosed and bool(set(heads) & allheads)
1074 branches.append((tag, repo[tip], isactive, not isclosed))
1074 branches.append((tag, repo[tip], isactive, not isclosed))
1075 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1075 branches.sort(key=lambda i: (i[2], i[1].rev(), i[0], i[3]),
1076 reverse=True)
1076 reverse=True)
1077
1077
1078 for tag, ctx, isactive, isopen in branches:
1078 for tag, ctx, isactive, isopen in branches:
1079 if (not active) or isactive:
1079 if (not active) or isactive:
1080 if isactive:
1080 if isactive:
1081 label = 'branches.active'
1081 label = 'branches.active'
1082 notice = ''
1082 notice = ''
1083 elif not isopen:
1083 elif not isopen:
1084 if not closed:
1084 if not closed:
1085 continue
1085 continue
1086 label = 'branches.closed'
1086 label = 'branches.closed'
1087 notice = _(' (closed)')
1087 notice = _(' (closed)')
1088 else:
1088 else:
1089 label = 'branches.inactive'
1089 label = 'branches.inactive'
1090 notice = _(' (inactive)')
1090 notice = _(' (inactive)')
1091 if tag == repo.dirstate.branch():
1091 if tag == repo.dirstate.branch():
1092 label = 'branches.current'
1092 label = 'branches.current'
1093 rev = str(ctx.rev()).rjust(31 - encoding.colwidth(tag))
1093 rev = str(ctx.rev()).rjust(31 - encoding.colwidth(tag))
1094 rev = ui.label('%s:%s' % (rev, hexfunc(ctx.node())),
1094 rev = ui.label('%s:%s' % (rev, hexfunc(ctx.node())),
1095 'log.changeset changeset.%s' % ctx.phasestr())
1095 'log.changeset changeset.%s' % ctx.phasestr())
1096 labeledtag = ui.label(tag, label)
1096 labeledtag = ui.label(tag, label)
1097 if ui.quiet:
1097 if ui.quiet:
1098 ui.write("%s\n" % labeledtag)
1098 ui.write("%s\n" % labeledtag)
1099 else:
1099 else:
1100 ui.write("%s %s%s\n" % (labeledtag, rev, notice))
1100 ui.write("%s %s%s\n" % (labeledtag, rev, notice))
1101
1101
1102 @command('bundle',
1102 @command('bundle',
1103 [('f', 'force', None, _('run even when the destination is unrelated')),
1103 [('f', 'force', None, _('run even when the destination is unrelated')),
1104 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1104 ('r', 'rev', [], _('a changeset intended to be added to the destination'),
1105 _('REV')),
1105 _('REV')),
1106 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1106 ('b', 'branch', [], _('a specific branch you would like to bundle'),
1107 _('BRANCH')),
1107 _('BRANCH')),
1108 ('', 'base', [],
1108 ('', 'base', [],
1109 _('a base changeset assumed to be available at the destination'),
1109 _('a base changeset assumed to be available at the destination'),
1110 _('REV')),
1110 _('REV')),
1111 ('a', 'all', None, _('bundle all changesets in the repository')),
1111 ('a', 'all', None, _('bundle all changesets in the repository')),
1112 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1112 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
1113 ] + remoteopts,
1113 ] + remoteopts,
1114 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1114 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
1115 def bundle(ui, repo, fname, dest=None, **opts):
1115 def bundle(ui, repo, fname, dest=None, **opts):
1116 """create a changegroup file
1116 """create a changegroup file
1117
1117
1118 Generate a compressed changegroup file collecting changesets not
1118 Generate a compressed changegroup file collecting changesets not
1119 known to be in another repository.
1119 known to be in another repository.
1120
1120
1121 If you omit the destination repository, then hg assumes the
1121 If you omit the destination repository, then hg assumes the
1122 destination will have all the nodes you specify with --base
1122 destination will have all the nodes you specify with --base
1123 parameters. To create a bundle containing all changesets, use
1123 parameters. To create a bundle containing all changesets, use
1124 -a/--all (or --base null).
1124 -a/--all (or --base null).
1125
1125
1126 You can change compression method with the -t/--type option.
1126 You can change compression method with the -t/--type option.
1127 The available compression methods are: none, bzip2, and
1127 The available compression methods are: none, bzip2, and
1128 gzip (by default, bundles are compressed using bzip2).
1128 gzip (by default, bundles are compressed using bzip2).
1129
1129
1130 The bundle file can then be transferred using conventional means
1130 The bundle file can then be transferred using conventional means
1131 and applied to another repository with the unbundle or pull
1131 and applied to another repository with the unbundle or pull
1132 command. This is useful when direct push and pull are not
1132 command. This is useful when direct push and pull are not
1133 available or when exporting an entire repository is undesirable.
1133 available or when exporting an entire repository is undesirable.
1134
1134
1135 Applying bundles preserves all changeset contents including
1135 Applying bundles preserves all changeset contents including
1136 permissions, copy/rename information, and revision history.
1136 permissions, copy/rename information, and revision history.
1137
1137
1138 Returns 0 on success, 1 if no changes found.
1138 Returns 0 on success, 1 if no changes found.
1139 """
1139 """
1140 revs = None
1140 revs = None
1141 if 'rev' in opts:
1141 if 'rev' in opts:
1142 revs = scmutil.revrange(repo, opts['rev'])
1142 revs = scmutil.revrange(repo, opts['rev'])
1143
1143
1144 bundletype = opts.get('type', 'bzip2').lower()
1144 bundletype = opts.get('type', 'bzip2').lower()
1145 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
1145 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
1146 bundletype = btypes.get(bundletype)
1146 bundletype = btypes.get(bundletype)
1147 if bundletype not in changegroup.bundletypes:
1147 if bundletype not in changegroup.bundletypes:
1148 raise util.Abort(_('unknown bundle type specified with --type'))
1148 raise util.Abort(_('unknown bundle type specified with --type'))
1149
1149
1150 if opts.get('all'):
1150 if opts.get('all'):
1151 base = ['null']
1151 base = ['null']
1152 else:
1152 else:
1153 base = scmutil.revrange(repo, opts.get('base'))
1153 base = scmutil.revrange(repo, opts.get('base'))
1154 # TODO: get desired bundlecaps from command line.
1154 # TODO: get desired bundlecaps from command line.
1155 bundlecaps = None
1155 bundlecaps = None
1156 if base:
1156 if base:
1157 if dest:
1157 if dest:
1158 raise util.Abort(_("--base is incompatible with specifying "
1158 raise util.Abort(_("--base is incompatible with specifying "
1159 "a destination"))
1159 "a destination"))
1160 common = [repo.lookup(rev) for rev in base]
1160 common = [repo.lookup(rev) for rev in base]
1161 heads = revs and map(repo.lookup, revs) or revs
1161 heads = revs and map(repo.lookup, revs) or revs
1162 cg = changegroup.getbundle(repo, 'bundle', heads=heads, common=common,
1162 cg = changegroup.getbundle(repo, 'bundle', heads=heads, common=common,
1163 bundlecaps=bundlecaps)
1163 bundlecaps=bundlecaps)
1164 outgoing = None
1164 outgoing = None
1165 else:
1165 else:
1166 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1166 dest = ui.expandpath(dest or 'default-push', dest or 'default')
1167 dest, branches = hg.parseurl(dest, opts.get('branch'))
1167 dest, branches = hg.parseurl(dest, opts.get('branch'))
1168 other = hg.peer(repo, opts, dest)
1168 other = hg.peer(repo, opts, dest)
1169 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1169 revs, checkout = hg.addbranchrevs(repo, repo, branches, revs)
1170 heads = revs and map(repo.lookup, revs) or revs
1170 heads = revs and map(repo.lookup, revs) or revs
1171 outgoing = discovery.findcommonoutgoing(repo, other,
1171 outgoing = discovery.findcommonoutgoing(repo, other,
1172 onlyheads=heads,
1172 onlyheads=heads,
1173 force=opts.get('force'),
1173 force=opts.get('force'),
1174 portable=True)
1174 portable=True)
1175 cg = changegroup.getlocalbundle(repo, 'bundle', outgoing, bundlecaps)
1175 cg = changegroup.getlocalbundle(repo, 'bundle', outgoing, bundlecaps)
1176 if not cg:
1176 if not cg:
1177 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1177 scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
1178 return 1
1178 return 1
1179
1179
1180 changegroup.writebundle(cg, fname, bundletype)
1180 changegroup.writebundle(cg, fname, bundletype)
1181
1181
1182 @command('cat',
1182 @command('cat',
1183 [('o', 'output', '',
1183 [('o', 'output', '',
1184 _('print output to file with formatted name'), _('FORMAT')),
1184 _('print output to file with formatted name'), _('FORMAT')),
1185 ('r', 'rev', '', _('print the given revision'), _('REV')),
1185 ('r', 'rev', '', _('print the given revision'), _('REV')),
1186 ('', 'decode', None, _('apply any matching decode filter')),
1186 ('', 'decode', None, _('apply any matching decode filter')),
1187 ] + walkopts,
1187 ] + walkopts,
1188 _('[OPTION]... FILE...'),
1188 _('[OPTION]... FILE...'),
1189 inferrepo=True)
1189 inferrepo=True)
1190 def cat(ui, repo, file1, *pats, **opts):
1190 def cat(ui, repo, file1, *pats, **opts):
1191 """output the current or given revision of files
1191 """output the current or given revision of files
1192
1192
1193 Print the specified files as they were at the given revision. If
1193 Print the specified files as they were at the given revision. If
1194 no revision is given, the parent of the working directory is used.
1194 no revision is given, the parent of the working directory is used.
1195
1195
1196 Output may be to a file, in which case the name of the file is
1196 Output may be to a file, in which case the name of the file is
1197 given using a format string. The formatting rules as follows:
1197 given using a format string. The formatting rules as follows:
1198
1198
1199 :``%%``: literal "%" character
1199 :``%%``: literal "%" character
1200 :``%s``: basename of file being printed
1200 :``%s``: basename of file being printed
1201 :``%d``: dirname of file being printed, or '.' if in repository root
1201 :``%d``: dirname of file being printed, or '.' if in repository root
1202 :``%p``: root-relative path name of file being printed
1202 :``%p``: root-relative path name of file being printed
1203 :``%H``: changeset hash (40 hexadecimal digits)
1203 :``%H``: changeset hash (40 hexadecimal digits)
1204 :``%R``: changeset revision number
1204 :``%R``: changeset revision number
1205 :``%h``: short-form changeset hash (12 hexadecimal digits)
1205 :``%h``: short-form changeset hash (12 hexadecimal digits)
1206 :``%r``: zero-padded changeset revision number
1206 :``%r``: zero-padded changeset revision number
1207 :``%b``: basename of the exporting repository
1207 :``%b``: basename of the exporting repository
1208
1208
1209 Returns 0 on success.
1209 Returns 0 on success.
1210 """
1210 """
1211 ctx = scmutil.revsingle(repo, opts.get('rev'))
1211 ctx = scmutil.revsingle(repo, opts.get('rev'))
1212 m = scmutil.match(ctx, (file1,) + pats, opts)
1212 m = scmutil.match(ctx, (file1,) + pats, opts)
1213
1213
1214 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1214 return cmdutil.cat(ui, repo, ctx, m, '', **opts)
1215
1215
1216 @command('^clone',
1216 @command('^clone',
1217 [('U', 'noupdate', None,
1217 [('U', 'noupdate', None,
1218 _('the clone will include an empty working copy (only a repository)')),
1218 _('the clone will include an empty working copy (only a repository)')),
1219 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1219 ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
1220 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1220 ('r', 'rev', [], _('include the specified changeset'), _('REV')),
1221 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1221 ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
1222 ('', 'pull', None, _('use pull protocol to copy metadata')),
1222 ('', 'pull', None, _('use pull protocol to copy metadata')),
1223 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1223 ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
1224 ] + remoteopts,
1224 ] + remoteopts,
1225 _('[OPTION]... SOURCE [DEST]'),
1225 _('[OPTION]... SOURCE [DEST]'),
1226 norepo=True)
1226 norepo=True)
1227 def clone(ui, source, dest=None, **opts):
1227 def clone(ui, source, dest=None, **opts):
1228 """make a copy of an existing repository
1228 """make a copy of an existing repository
1229
1229
1230 Create a copy of an existing repository in a new directory.
1230 Create a copy of an existing repository in a new directory.
1231
1231
1232 If no destination directory name is specified, it defaults to the
1232 If no destination directory name is specified, it defaults to the
1233 basename of the source.
1233 basename of the source.
1234
1234
1235 The location of the source is added to the new repository's
1235 The location of the source is added to the new repository's
1236 ``.hg/hgrc`` file, as the default to be used for future pulls.
1236 ``.hg/hgrc`` file, as the default to be used for future pulls.
1237
1237
1238 Only local paths and ``ssh://`` URLs are supported as
1238 Only local paths and ``ssh://`` URLs are supported as
1239 destinations. For ``ssh://`` destinations, no working directory or
1239 destinations. For ``ssh://`` destinations, no working directory or
1240 ``.hg/hgrc`` will be created on the remote side.
1240 ``.hg/hgrc`` will be created on the remote side.
1241
1241
1242 To pull only a subset of changesets, specify one or more revisions
1242 To pull only a subset of changesets, specify one or more revisions
1243 identifiers with -r/--rev or branches with -b/--branch. The
1243 identifiers with -r/--rev or branches with -b/--branch. The
1244 resulting clone will contain only the specified changesets and
1244 resulting clone will contain only the specified changesets and
1245 their ancestors. These options (or 'clone src#rev dest') imply
1245 their ancestors. These options (or 'clone src#rev dest') imply
1246 --pull, even for local source repositories. Note that specifying a
1246 --pull, even for local source repositories. Note that specifying a
1247 tag will include the tagged changeset but not the changeset
1247 tag will include the tagged changeset but not the changeset
1248 containing the tag.
1248 containing the tag.
1249
1249
1250 If the source repository has a bookmark called '@' set, that
1250 If the source repository has a bookmark called '@' set, that
1251 revision will be checked out in the new repository by default.
1251 revision will be checked out in the new repository by default.
1252
1252
1253 To check out a particular version, use -u/--update, or
1253 To check out a particular version, use -u/--update, or
1254 -U/--noupdate to create a clone with no working directory.
1254 -U/--noupdate to create a clone with no working directory.
1255
1255
1256 .. container:: verbose
1256 .. container:: verbose
1257
1257
1258 For efficiency, hardlinks are used for cloning whenever the
1258 For efficiency, hardlinks are used for cloning whenever the
1259 source and destination are on the same filesystem (note this
1259 source and destination are on the same filesystem (note this
1260 applies only to the repository data, not to the working
1260 applies only to the repository data, not to the working
1261 directory). Some filesystems, such as AFS, implement hardlinking
1261 directory). Some filesystems, such as AFS, implement hardlinking
1262 incorrectly, but do not report errors. In these cases, use the
1262 incorrectly, but do not report errors. In these cases, use the
1263 --pull option to avoid hardlinking.
1263 --pull option to avoid hardlinking.
1264
1264
1265 In some cases, you can clone repositories and the working
1265 In some cases, you can clone repositories and the working
1266 directory using full hardlinks with ::
1266 directory using full hardlinks with ::
1267
1267
1268 $ cp -al REPO REPOCLONE
1268 $ cp -al REPO REPOCLONE
1269
1269
1270 This is the fastest way to clone, but it is not always safe. The
1270 This is the fastest way to clone, but it is not always safe. The
1271 operation is not atomic (making sure REPO is not modified during
1271 operation is not atomic (making sure REPO is not modified during
1272 the operation is up to you) and you have to make sure your
1272 the operation is up to you) and you have to make sure your
1273 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1273 editor breaks hardlinks (Emacs and most Linux Kernel tools do
1274 so). Also, this is not compatible with certain extensions that
1274 so). Also, this is not compatible with certain extensions that
1275 place their metadata under the .hg directory, such as mq.
1275 place their metadata under the .hg directory, such as mq.
1276
1276
1277 Mercurial will update the working directory to the first applicable
1277 Mercurial will update the working directory to the first applicable
1278 revision from this list:
1278 revision from this list:
1279
1279
1280 a) null if -U or the source repository has no changesets
1280 a) null if -U or the source repository has no changesets
1281 b) if -u . and the source repository is local, the first parent of
1281 b) if -u . and the source repository is local, the first parent of
1282 the source repository's working directory
1282 the source repository's working directory
1283 c) the changeset specified with -u (if a branch name, this means the
1283 c) the changeset specified with -u (if a branch name, this means the
1284 latest head of that branch)
1284 latest head of that branch)
1285 d) the changeset specified with -r
1285 d) the changeset specified with -r
1286 e) the tipmost head specified with -b
1286 e) the tipmost head specified with -b
1287 f) the tipmost head specified with the url#branch source syntax
1287 f) the tipmost head specified with the url#branch source syntax
1288 g) the revision marked with the '@' bookmark, if present
1288 g) the revision marked with the '@' bookmark, if present
1289 h) the tipmost head of the default branch
1289 h) the tipmost head of the default branch
1290 i) tip
1290 i) tip
1291
1291
1292 Examples:
1292 Examples:
1293
1293
1294 - clone a remote repository to a new directory named hg/::
1294 - clone a remote repository to a new directory named hg/::
1295
1295
1296 hg clone http://selenic.com/hg
1296 hg clone http://selenic.com/hg
1297
1297
1298 - create a lightweight local clone::
1298 - create a lightweight local clone::
1299
1299
1300 hg clone project/ project-feature/
1300 hg clone project/ project-feature/
1301
1301
1302 - clone from an absolute path on an ssh server (note double-slash)::
1302 - clone from an absolute path on an ssh server (note double-slash)::
1303
1303
1304 hg clone ssh://user@server//home/projects/alpha/
1304 hg clone ssh://user@server//home/projects/alpha/
1305
1305
1306 - do a high-speed clone over a LAN while checking out a
1306 - do a high-speed clone over a LAN while checking out a
1307 specified version::
1307 specified version::
1308
1308
1309 hg clone --uncompressed http://server/repo -u 1.5
1309 hg clone --uncompressed http://server/repo -u 1.5
1310
1310
1311 - create a repository without changesets after a particular revision::
1311 - create a repository without changesets after a particular revision::
1312
1312
1313 hg clone -r 04e544 experimental/ good/
1313 hg clone -r 04e544 experimental/ good/
1314
1314
1315 - clone (and track) a particular named branch::
1315 - clone (and track) a particular named branch::
1316
1316
1317 hg clone http://selenic.com/hg#stable
1317 hg clone http://selenic.com/hg#stable
1318
1318
1319 See :hg:`help urls` for details on specifying URLs.
1319 See :hg:`help urls` for details on specifying URLs.
1320
1320
1321 Returns 0 on success.
1321 Returns 0 on success.
1322 """
1322 """
1323 if opts.get('noupdate') and opts.get('updaterev'):
1323 if opts.get('noupdate') and opts.get('updaterev'):
1324 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
1324 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
1325
1325
1326 r = hg.clone(ui, opts, source, dest,
1326 r = hg.clone(ui, opts, source, dest,
1327 pull=opts.get('pull'),
1327 pull=opts.get('pull'),
1328 stream=opts.get('uncompressed'),
1328 stream=opts.get('uncompressed'),
1329 rev=opts.get('rev'),
1329 rev=opts.get('rev'),
1330 update=opts.get('updaterev') or not opts.get('noupdate'),
1330 update=opts.get('updaterev') or not opts.get('noupdate'),
1331 branch=opts.get('branch'))
1331 branch=opts.get('branch'))
1332
1332
1333 return r is None
1333 return r is None
1334
1334
1335 @command('^commit|ci',
1335 @command('^commit|ci',
1336 [('A', 'addremove', None,
1336 [('A', 'addremove', None,
1337 _('mark new/missing files as added/removed before committing')),
1337 _('mark new/missing files as added/removed before committing')),
1338 ('', 'close-branch', None,
1338 ('', 'close-branch', None,
1339 _('mark a branch as closed, hiding it from the branch list')),
1339 _('mark a branch as closed, hiding it from the branch list')),
1340 ('', 'amend', None, _('amend the parent of the working dir')),
1340 ('', 'amend', None, _('amend the parent of the working dir')),
1341 ('s', 'secret', None, _('use the secret phase for committing')),
1341 ('s', 'secret', None, _('use the secret phase for committing')),
1342 ('e', 'edit', None,
1342 ('e', 'edit', None,
1343 _('further edit commit message already specified')),
1343 _('further edit commit message already specified')),
1344 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1344 ] + walkopts + commitopts + commitopts2 + subrepoopts,
1345 _('[OPTION]... [FILE]...'),
1345 _('[OPTION]... [FILE]...'),
1346 inferrepo=True)
1346 inferrepo=True)
1347 def commit(ui, repo, *pats, **opts):
1347 def commit(ui, repo, *pats, **opts):
1348 """commit the specified files or all outstanding changes
1348 """commit the specified files or all outstanding changes
1349
1349
1350 Commit changes to the given files into the repository. Unlike a
1350 Commit changes to the given files into the repository. Unlike a
1351 centralized SCM, this operation is a local operation. See
1351 centralized SCM, this operation is a local operation. See
1352 :hg:`push` for a way to actively distribute your changes.
1352 :hg:`push` for a way to actively distribute your changes.
1353
1353
1354 If a list of files is omitted, all changes reported by :hg:`status`
1354 If a list of files is omitted, all changes reported by :hg:`status`
1355 will be committed.
1355 will be committed.
1356
1356
1357 If you are committing the result of a merge, do not provide any
1357 If you are committing the result of a merge, do not provide any
1358 filenames or -I/-X filters.
1358 filenames or -I/-X filters.
1359
1359
1360 If no commit message is specified, Mercurial starts your
1360 If no commit message is specified, Mercurial starts your
1361 configured editor where you can enter a message. In case your
1361 configured editor where you can enter a message. In case your
1362 commit fails, you will find a backup of your message in
1362 commit fails, you will find a backup of your message in
1363 ``.hg/last-message.txt``.
1363 ``.hg/last-message.txt``.
1364
1364
1365 The --amend flag can be used to amend the parent of the
1365 The --amend flag can be used to amend the parent of the
1366 working directory with a new commit that contains the changes
1366 working directory with a new commit that contains the changes
1367 in the parent in addition to those currently reported by :hg:`status`,
1367 in the parent in addition to those currently reported by :hg:`status`,
1368 if there are any. The old commit is stored in a backup bundle in
1368 if there are any. The old commit is stored in a backup bundle in
1369 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1369 ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
1370 on how to restore it).
1370 on how to restore it).
1371
1371
1372 Message, user and date are taken from the amended commit unless
1372 Message, user and date are taken from the amended commit unless
1373 specified. When a message isn't specified on the command line,
1373 specified. When a message isn't specified on the command line,
1374 the editor will open with the message of the amended commit.
1374 the editor will open with the message of the amended commit.
1375
1375
1376 It is not possible to amend public changesets (see :hg:`help phases`)
1376 It is not possible to amend public changesets (see :hg:`help phases`)
1377 or changesets that have children.
1377 or changesets that have children.
1378
1378
1379 See :hg:`help dates` for a list of formats valid for -d/--date.
1379 See :hg:`help dates` for a list of formats valid for -d/--date.
1380
1380
1381 Returns 0 on success, 1 if nothing changed.
1381 Returns 0 on success, 1 if nothing changed.
1382 """
1382 """
1383 if opts.get('subrepos'):
1383 if opts.get('subrepos'):
1384 if opts.get('amend'):
1384 if opts.get('amend'):
1385 raise util.Abort(_('cannot amend with --subrepos'))
1385 raise util.Abort(_('cannot amend with --subrepos'))
1386 # Let --subrepos on the command line override config setting.
1386 # Let --subrepos on the command line override config setting.
1387 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1387 ui.setconfig('ui', 'commitsubrepos', True, 'commit')
1388
1388
1389 # Save this for restoring it later
1389 # Save this for restoring it later
1390 oldcommitphase = ui.config('phases', 'new-commit')
1390 oldcommitphase = ui.config('phases', 'new-commit')
1391
1391
1392 cmdutil.checkunfinished(repo, commit=True)
1392 cmdutil.checkunfinished(repo, commit=True)
1393
1393
1394 branch = repo[None].branch()
1394 branch = repo[None].branch()
1395 bheads = repo.branchheads(branch)
1395 bheads = repo.branchheads(branch)
1396
1396
1397 extra = {}
1397 extra = {}
1398 if opts.get('close_branch'):
1398 if opts.get('close_branch'):
1399 extra['close'] = 1
1399 extra['close'] = 1
1400
1400
1401 if not bheads:
1401 if not bheads:
1402 raise util.Abort(_('can only close branch heads'))
1402 raise util.Abort(_('can only close branch heads'))
1403 elif opts.get('amend'):
1403 elif opts.get('amend'):
1404 if repo.parents()[0].p1().branch() != branch and \
1404 if repo.parents()[0].p1().branch() != branch and \
1405 repo.parents()[0].p2().branch() != branch:
1405 repo.parents()[0].p2().branch() != branch:
1406 raise util.Abort(_('can only close branch heads'))
1406 raise util.Abort(_('can only close branch heads'))
1407
1407
1408 if opts.get('amend'):
1408 if opts.get('amend'):
1409 if ui.configbool('ui', 'commitsubrepos'):
1409 if ui.configbool('ui', 'commitsubrepos'):
1410 raise util.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1410 raise util.Abort(_('cannot amend with ui.commitsubrepos enabled'))
1411
1411
1412 old = repo['.']
1412 old = repo['.']
1413 if old.phase() == phases.public:
1413 if old.phase() == phases.public:
1414 raise util.Abort(_('cannot amend public changesets'))
1414 raise util.Abort(_('cannot amend public changesets'))
1415 if len(repo[None].parents()) > 1:
1415 if len(repo[None].parents()) > 1:
1416 raise util.Abort(_('cannot amend while merging'))
1416 raise util.Abort(_('cannot amend while merging'))
1417 if (not obsolete._enabled) and old.children():
1417 if (not obsolete._enabled) and old.children():
1418 raise util.Abort(_('cannot amend changeset with children'))
1418 raise util.Abort(_('cannot amend changeset with children'))
1419
1419
1420 # commitfunc is used only for temporary amend commit by cmdutil.amend
1420 # commitfunc is used only for temporary amend commit by cmdutil.amend
1421 def commitfunc(ui, repo, message, match, opts):
1421 def commitfunc(ui, repo, message, match, opts):
1422 return repo.commit(message,
1422 return repo.commit(message,
1423 opts.get('user') or old.user(),
1423 opts.get('user') or old.user(),
1424 opts.get('date') or old.date(),
1424 opts.get('date') or old.date(),
1425 match,
1425 match,
1426 extra=extra)
1426 extra=extra)
1427
1427
1428 current = repo._bookmarkcurrent
1428 current = repo._bookmarkcurrent
1429 marks = old.bookmarks()
1429 marks = old.bookmarks()
1430 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1430 node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
1431 if node == old.node():
1431 if node == old.node():
1432 ui.status(_("nothing changed\n"))
1432 ui.status(_("nothing changed\n"))
1433 return 1
1433 return 1
1434 elif marks:
1434 elif marks:
1435 ui.debug('moving bookmarks %r from %s to %s\n' %
1435 ui.debug('moving bookmarks %r from %s to %s\n' %
1436 (marks, old.hex(), hex(node)))
1436 (marks, old.hex(), hex(node)))
1437 newmarks = repo._bookmarks
1437 newmarks = repo._bookmarks
1438 for bm in marks:
1438 for bm in marks:
1439 newmarks[bm] = node
1439 newmarks[bm] = node
1440 if bm == current:
1440 if bm == current:
1441 bookmarks.setcurrent(repo, bm)
1441 bookmarks.setcurrent(repo, bm)
1442 newmarks.write()
1442 newmarks.write()
1443 else:
1443 else:
1444 def commitfunc(ui, repo, message, match, opts):
1444 def commitfunc(ui, repo, message, match, opts):
1445 try:
1445 try:
1446 if opts.get('secret'):
1446 if opts.get('secret'):
1447 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1447 ui.setconfig('phases', 'new-commit', 'secret', 'commit')
1448 # Propagate to subrepos
1448 # Propagate to subrepos
1449 repo.baseui.setconfig('phases', 'new-commit', 'secret',
1449 repo.baseui.setconfig('phases', 'new-commit', 'secret',
1450 'commit')
1450 'commit')
1451
1451
1452 return repo.commit(message, opts.get('user'), opts.get('date'),
1452 return repo.commit(message, opts.get('user'), opts.get('date'),
1453 match,
1453 match,
1454 editor=cmdutil.getcommiteditor(**opts),
1454 editor=cmdutil.getcommiteditor(**opts),
1455 extra=extra)
1455 extra=extra)
1456 finally:
1456 finally:
1457 ui.setconfig('phases', 'new-commit', oldcommitphase, 'commit')
1457 ui.setconfig('phases', 'new-commit', oldcommitphase, 'commit')
1458 repo.baseui.setconfig('phases', 'new-commit', oldcommitphase,
1458 repo.baseui.setconfig('phases', 'new-commit', oldcommitphase,
1459 'commit')
1459 'commit')
1460
1460
1461
1461
1462 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1462 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
1463
1463
1464 if not node:
1464 if not node:
1465 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1465 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
1466 if stat[3]:
1466 if stat[3]:
1467 ui.status(_("nothing changed (%d missing files, see "
1467 ui.status(_("nothing changed (%d missing files, see "
1468 "'hg status')\n") % len(stat[3]))
1468 "'hg status')\n") % len(stat[3]))
1469 else:
1469 else:
1470 ui.status(_("nothing changed\n"))
1470 ui.status(_("nothing changed\n"))
1471 return 1
1471 return 1
1472
1472
1473 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1473 cmdutil.commitstatus(repo, node, branch, bheads, opts)
1474
1474
1475 @command('config|showconfig|debugconfig',
1475 @command('config|showconfig|debugconfig',
1476 [('u', 'untrusted', None, _('show untrusted configuration options')),
1476 [('u', 'untrusted', None, _('show untrusted configuration options')),
1477 ('e', 'edit', None, _('edit user config')),
1477 ('e', 'edit', None, _('edit user config')),
1478 ('l', 'local', None, _('edit repository config')),
1478 ('l', 'local', None, _('edit repository config')),
1479 ('g', 'global', None, _('edit global config'))],
1479 ('g', 'global', None, _('edit global config'))],
1480 _('[-u] [NAME]...'),
1480 _('[-u] [NAME]...'),
1481 optionalrepo=True)
1481 optionalrepo=True)
1482 def config(ui, repo, *values, **opts):
1482 def config(ui, repo, *values, **opts):
1483 """show combined config settings from all hgrc files
1483 """show combined config settings from all hgrc files
1484
1484
1485 With no arguments, print names and values of all config items.
1485 With no arguments, print names and values of all config items.
1486
1486
1487 With one argument of the form section.name, print just the value
1487 With one argument of the form section.name, print just the value
1488 of that config item.
1488 of that config item.
1489
1489
1490 With multiple arguments, print names and values of all config
1490 With multiple arguments, print names and values of all config
1491 items with matching section names.
1491 items with matching section names.
1492
1492
1493 With --edit, start an editor on the user-level config file. With
1493 With --edit, start an editor on the user-level config file. With
1494 --global, edit the system-wide config file. With --local, edit the
1494 --global, edit the system-wide config file. With --local, edit the
1495 repository-level config file.
1495 repository-level config file.
1496
1496
1497 With --debug, the source (filename and line number) is printed
1497 With --debug, the source (filename and line number) is printed
1498 for each config item.
1498 for each config item.
1499
1499
1500 See :hg:`help config` for more information about config files.
1500 See :hg:`help config` for more information about config files.
1501
1501
1502 Returns 0 on success.
1502 Returns 0 on success.
1503
1503
1504 """
1504 """
1505
1505
1506 if opts.get('edit') or opts.get('local') or opts.get('global'):
1506 if opts.get('edit') or opts.get('local') or opts.get('global'):
1507 if opts.get('local') and opts.get('global'):
1507 if opts.get('local') and opts.get('global'):
1508 raise util.Abort(_("can't use --local and --global together"))
1508 raise util.Abort(_("can't use --local and --global together"))
1509
1509
1510 if opts.get('local'):
1510 if opts.get('local'):
1511 if not repo:
1511 if not repo:
1512 raise util.Abort(_("can't use --local outside a repository"))
1512 raise util.Abort(_("can't use --local outside a repository"))
1513 paths = [repo.join('hgrc')]
1513 paths = [repo.join('hgrc')]
1514 elif opts.get('global'):
1514 elif opts.get('global'):
1515 paths = scmutil.systemrcpath()
1515 paths = scmutil.systemrcpath()
1516 else:
1516 else:
1517 paths = scmutil.userrcpath()
1517 paths = scmutil.userrcpath()
1518
1518
1519 for f in paths:
1519 for f in paths:
1520 if os.path.exists(f):
1520 if os.path.exists(f):
1521 break
1521 break
1522 else:
1522 else:
1523 f = paths[0]
1523 f = paths[0]
1524 fp = open(f, "w")
1524 fp = open(f, "w")
1525 fp.write(
1525 fp.write(
1526 '# example config (see "hg help config" for more info)\n'
1526 '# example config (see "hg help config" for more info)\n'
1527 '\n'
1527 '\n'
1528 '[ui]\n'
1528 '[ui]\n'
1529 '# name and email, e.g.\n'
1529 '# name and email, e.g.\n'
1530 '# username = Jane Doe <jdoe@example.com>\n'
1530 '# username = Jane Doe <jdoe@example.com>\n'
1531 'username =\n'
1531 'username =\n'
1532 '\n'
1532 '\n'
1533 '[extensions]\n'
1533 '[extensions]\n'
1534 '# uncomment these lines to enable some popular extensions\n'
1534 '# uncomment these lines to enable some popular extensions\n'
1535 '# (see "hg help extensions" for more info)\n'
1535 '# (see "hg help extensions" for more info)\n'
1536 '# pager =\n'
1536 '# pager =\n'
1537 '# progress =\n'
1537 '# progress =\n'
1538 '# color =\n')
1538 '# color =\n')
1539 fp.close()
1539 fp.close()
1540
1540
1541 editor = ui.geteditor()
1541 editor = ui.geteditor()
1542 util.system("%s \"%s\"" % (editor, f),
1542 util.system("%s \"%s\"" % (editor, f),
1543 onerr=util.Abort, errprefix=_("edit failed"),
1543 onerr=util.Abort, errprefix=_("edit failed"),
1544 out=ui.fout)
1544 out=ui.fout)
1545 return
1545 return
1546
1546
1547 for f in scmutil.rcpath():
1547 for f in scmutil.rcpath():
1548 ui.debug('read config from: %s\n' % f)
1548 ui.debug('read config from: %s\n' % f)
1549 untrusted = bool(opts.get('untrusted'))
1549 untrusted = bool(opts.get('untrusted'))
1550 if values:
1550 if values:
1551 sections = [v for v in values if '.' not in v]
1551 sections = [v for v in values if '.' not in v]
1552 items = [v for v in values if '.' in v]
1552 items = [v for v in values if '.' in v]
1553 if len(items) > 1 or items and sections:
1553 if len(items) > 1 or items and sections:
1554 raise util.Abort(_('only one config item permitted'))
1554 raise util.Abort(_('only one config item permitted'))
1555 for section, name, value in ui.walkconfig(untrusted=untrusted):
1555 for section, name, value in ui.walkconfig(untrusted=untrusted):
1556 value = str(value).replace('\n', '\\n')
1556 value = str(value).replace('\n', '\\n')
1557 sectname = section + '.' + name
1557 sectname = section + '.' + name
1558 if values:
1558 if values:
1559 for v in values:
1559 for v in values:
1560 if v == section:
1560 if v == section:
1561 ui.debug('%s: ' %
1561 ui.debug('%s: ' %
1562 ui.configsource(section, name, untrusted))
1562 ui.configsource(section, name, untrusted))
1563 ui.write('%s=%s\n' % (sectname, value))
1563 ui.write('%s=%s\n' % (sectname, value))
1564 elif v == sectname:
1564 elif v == sectname:
1565 ui.debug('%s: ' %
1565 ui.debug('%s: ' %
1566 ui.configsource(section, name, untrusted))
1566 ui.configsource(section, name, untrusted))
1567 ui.write(value, '\n')
1567 ui.write(value, '\n')
1568 else:
1568 else:
1569 ui.debug('%s: ' %
1569 ui.debug('%s: ' %
1570 ui.configsource(section, name, untrusted))
1570 ui.configsource(section, name, untrusted))
1571 ui.write('%s=%s\n' % (sectname, value))
1571 ui.write('%s=%s\n' % (sectname, value))
1572
1572
1573 @command('copy|cp',
1573 @command('copy|cp',
1574 [('A', 'after', None, _('record a copy that has already occurred')),
1574 [('A', 'after', None, _('record a copy that has already occurred')),
1575 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1575 ('f', 'force', None, _('forcibly copy over an existing managed file')),
1576 ] + walkopts + dryrunopts,
1576 ] + walkopts + dryrunopts,
1577 _('[OPTION]... [SOURCE]... DEST'))
1577 _('[OPTION]... [SOURCE]... DEST'))
1578 def copy(ui, repo, *pats, **opts):
1578 def copy(ui, repo, *pats, **opts):
1579 """mark files as copied for the next commit
1579 """mark files as copied for the next commit
1580
1580
1581 Mark dest as having copies of source files. If dest is a
1581 Mark dest as having copies of source files. If dest is a
1582 directory, copies are put in that directory. If dest is a file,
1582 directory, copies are put in that directory. If dest is a file,
1583 the source must be a single file.
1583 the source must be a single file.
1584
1584
1585 By default, this command copies the contents of files as they
1585 By default, this command copies the contents of files as they
1586 exist in the working directory. If invoked with -A/--after, the
1586 exist in the working directory. If invoked with -A/--after, the
1587 operation is recorded, but no copying is performed.
1587 operation is recorded, but no copying is performed.
1588
1588
1589 This command takes effect with the next commit. To undo a copy
1589 This command takes effect with the next commit. To undo a copy
1590 before that, see :hg:`revert`.
1590 before that, see :hg:`revert`.
1591
1591
1592 Returns 0 on success, 1 if errors are encountered.
1592 Returns 0 on success, 1 if errors are encountered.
1593 """
1593 """
1594 wlock = repo.wlock(False)
1594 wlock = repo.wlock(False)
1595 try:
1595 try:
1596 return cmdutil.copy(ui, repo, pats, opts)
1596 return cmdutil.copy(ui, repo, pats, opts)
1597 finally:
1597 finally:
1598 wlock.release()
1598 wlock.release()
1599
1599
1600 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1600 @command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
1601 def debugancestor(ui, repo, *args):
1601 def debugancestor(ui, repo, *args):
1602 """find the ancestor revision of two revisions in a given index"""
1602 """find the ancestor revision of two revisions in a given index"""
1603 if len(args) == 3:
1603 if len(args) == 3:
1604 index, rev1, rev2 = args
1604 index, rev1, rev2 = args
1605 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1605 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
1606 lookup = r.lookup
1606 lookup = r.lookup
1607 elif len(args) == 2:
1607 elif len(args) == 2:
1608 if not repo:
1608 if not repo:
1609 raise util.Abort(_("there is no Mercurial repository here "
1609 raise util.Abort(_("there is no Mercurial repository here "
1610 "(.hg not found)"))
1610 "(.hg not found)"))
1611 rev1, rev2 = args
1611 rev1, rev2 = args
1612 r = repo.changelog
1612 r = repo.changelog
1613 lookup = repo.lookup
1613 lookup = repo.lookup
1614 else:
1614 else:
1615 raise util.Abort(_('either two or three arguments required'))
1615 raise util.Abort(_('either two or three arguments required'))
1616 a = r.ancestor(lookup(rev1), lookup(rev2))
1616 a = r.ancestor(lookup(rev1), lookup(rev2))
1617 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1617 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
1618
1618
1619 @command('debugbuilddag',
1619 @command('debugbuilddag',
1620 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1620 [('m', 'mergeable-file', None, _('add single file mergeable changes')),
1621 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1621 ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
1622 ('n', 'new-file', None, _('add new file at each rev'))],
1622 ('n', 'new-file', None, _('add new file at each rev'))],
1623 _('[OPTION]... [TEXT]'))
1623 _('[OPTION]... [TEXT]'))
1624 def debugbuilddag(ui, repo, text=None,
1624 def debugbuilddag(ui, repo, text=None,
1625 mergeable_file=False,
1625 mergeable_file=False,
1626 overwritten_file=False,
1626 overwritten_file=False,
1627 new_file=False):
1627 new_file=False):
1628 """builds a repo with a given DAG from scratch in the current empty repo
1628 """builds a repo with a given DAG from scratch in the current empty repo
1629
1629
1630 The description of the DAG is read from stdin if not given on the
1630 The description of the DAG is read from stdin if not given on the
1631 command line.
1631 command line.
1632
1632
1633 Elements:
1633 Elements:
1634
1634
1635 - "+n" is a linear run of n nodes based on the current default parent
1635 - "+n" is a linear run of n nodes based on the current default parent
1636 - "." is a single node based on the current default parent
1636 - "." is a single node based on the current default parent
1637 - "$" resets the default parent to null (implied at the start);
1637 - "$" resets the default parent to null (implied at the start);
1638 otherwise the default parent is always the last node created
1638 otherwise the default parent is always the last node created
1639 - "<p" sets the default parent to the backref p
1639 - "<p" sets the default parent to the backref p
1640 - "*p" is a fork at parent p, which is a backref
1640 - "*p" is a fork at parent p, which is a backref
1641 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1641 - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
1642 - "/p2" is a merge of the preceding node and p2
1642 - "/p2" is a merge of the preceding node and p2
1643 - ":tag" defines a local tag for the preceding node
1643 - ":tag" defines a local tag for the preceding node
1644 - "@branch" sets the named branch for subsequent nodes
1644 - "@branch" sets the named branch for subsequent nodes
1645 - "#...\\n" is a comment up to the end of the line
1645 - "#...\\n" is a comment up to the end of the line
1646
1646
1647 Whitespace between the above elements is ignored.
1647 Whitespace between the above elements is ignored.
1648
1648
1649 A backref is either
1649 A backref is either
1650
1650
1651 - a number n, which references the node curr-n, where curr is the current
1651 - a number n, which references the node curr-n, where curr is the current
1652 node, or
1652 node, or
1653 - the name of a local tag you placed earlier using ":tag", or
1653 - the name of a local tag you placed earlier using ":tag", or
1654 - empty to denote the default parent.
1654 - empty to denote the default parent.
1655
1655
1656 All string valued-elements are either strictly alphanumeric, or must
1656 All string valued-elements are either strictly alphanumeric, or must
1657 be enclosed in double quotes ("..."), with "\\" as escape character.
1657 be enclosed in double quotes ("..."), with "\\" as escape character.
1658 """
1658 """
1659
1659
1660 if text is None:
1660 if text is None:
1661 ui.status(_("reading DAG from stdin\n"))
1661 ui.status(_("reading DAG from stdin\n"))
1662 text = ui.fin.read()
1662 text = ui.fin.read()
1663
1663
1664 cl = repo.changelog
1664 cl = repo.changelog
1665 if len(cl) > 0:
1665 if len(cl) > 0:
1666 raise util.Abort(_('repository is not empty'))
1666 raise util.Abort(_('repository is not empty'))
1667
1667
1668 # determine number of revs in DAG
1668 # determine number of revs in DAG
1669 total = 0
1669 total = 0
1670 for type, data in dagparser.parsedag(text):
1670 for type, data in dagparser.parsedag(text):
1671 if type == 'n':
1671 if type == 'n':
1672 total += 1
1672 total += 1
1673
1673
1674 if mergeable_file:
1674 if mergeable_file:
1675 linesperrev = 2
1675 linesperrev = 2
1676 # make a file with k lines per rev
1676 # make a file with k lines per rev
1677 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1677 initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
1678 initialmergedlines.append("")
1678 initialmergedlines.append("")
1679
1679
1680 tags = []
1680 tags = []
1681
1681
1682 lock = tr = None
1682 lock = tr = None
1683 try:
1683 try:
1684 lock = repo.lock()
1684 lock = repo.lock()
1685 tr = repo.transaction("builddag")
1685 tr = repo.transaction("builddag")
1686
1686
1687 at = -1
1687 at = -1
1688 atbranch = 'default'
1688 atbranch = 'default'
1689 nodeids = []
1689 nodeids = []
1690 id = 0
1690 id = 0
1691 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1691 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1692 for type, data in dagparser.parsedag(text):
1692 for type, data in dagparser.parsedag(text):
1693 if type == 'n':
1693 if type == 'n':
1694 ui.note(('node %s\n' % str(data)))
1694 ui.note(('node %s\n' % str(data)))
1695 id, ps = data
1695 id, ps = data
1696
1696
1697 files = []
1697 files = []
1698 fctxs = {}
1698 fctxs = {}
1699
1699
1700 p2 = None
1700 p2 = None
1701 if mergeable_file:
1701 if mergeable_file:
1702 fn = "mf"
1702 fn = "mf"
1703 p1 = repo[ps[0]]
1703 p1 = repo[ps[0]]
1704 if len(ps) > 1:
1704 if len(ps) > 1:
1705 p2 = repo[ps[1]]
1705 p2 = repo[ps[1]]
1706 pa = p1.ancestor(p2)
1706 pa = p1.ancestor(p2)
1707 base, local, other = [x[fn].data() for x in (pa, p1,
1707 base, local, other = [x[fn].data() for x in (pa, p1,
1708 p2)]
1708 p2)]
1709 m3 = simplemerge.Merge3Text(base, local, other)
1709 m3 = simplemerge.Merge3Text(base, local, other)
1710 ml = [l.strip() for l in m3.merge_lines()]
1710 ml = [l.strip() for l in m3.merge_lines()]
1711 ml.append("")
1711 ml.append("")
1712 elif at > 0:
1712 elif at > 0:
1713 ml = p1[fn].data().split("\n")
1713 ml = p1[fn].data().split("\n")
1714 else:
1714 else:
1715 ml = initialmergedlines
1715 ml = initialmergedlines
1716 ml[id * linesperrev] += " r%i" % id
1716 ml[id * linesperrev] += " r%i" % id
1717 mergedtext = "\n".join(ml)
1717 mergedtext = "\n".join(ml)
1718 files.append(fn)
1718 files.append(fn)
1719 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1719 fctxs[fn] = context.memfilectx(repo, fn, mergedtext)
1720
1720
1721 if overwritten_file:
1721 if overwritten_file:
1722 fn = "of"
1722 fn = "of"
1723 files.append(fn)
1723 files.append(fn)
1724 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1724 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1725
1725
1726 if new_file:
1726 if new_file:
1727 fn = "nf%i" % id
1727 fn = "nf%i" % id
1728 files.append(fn)
1728 files.append(fn)
1729 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1729 fctxs[fn] = context.memfilectx(repo, fn, "r%i\n" % id)
1730 if len(ps) > 1:
1730 if len(ps) > 1:
1731 if not p2:
1731 if not p2:
1732 p2 = repo[ps[1]]
1732 p2 = repo[ps[1]]
1733 for fn in p2:
1733 for fn in p2:
1734 if fn.startswith("nf"):
1734 if fn.startswith("nf"):
1735 files.append(fn)
1735 files.append(fn)
1736 fctxs[fn] = p2[fn]
1736 fctxs[fn] = p2[fn]
1737
1737
1738 def fctxfn(repo, cx, path):
1738 def fctxfn(repo, cx, path):
1739 return fctxs.get(path)
1739 return fctxs.get(path)
1740
1740
1741 if len(ps) == 0 or ps[0] < 0:
1741 if len(ps) == 0 or ps[0] < 0:
1742 pars = [None, None]
1742 pars = [None, None]
1743 elif len(ps) == 1:
1743 elif len(ps) == 1:
1744 pars = [nodeids[ps[0]], None]
1744 pars = [nodeids[ps[0]], None]
1745 else:
1745 else:
1746 pars = [nodeids[p] for p in ps]
1746 pars = [nodeids[p] for p in ps]
1747 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1747 cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
1748 date=(id, 0),
1748 date=(id, 0),
1749 user="debugbuilddag",
1749 user="debugbuilddag",
1750 extra={'branch': atbranch})
1750 extra={'branch': atbranch})
1751 nodeid = repo.commitctx(cx)
1751 nodeid = repo.commitctx(cx)
1752 nodeids.append(nodeid)
1752 nodeids.append(nodeid)
1753 at = id
1753 at = id
1754 elif type == 'l':
1754 elif type == 'l':
1755 id, name = data
1755 id, name = data
1756 ui.note(('tag %s\n' % name))
1756 ui.note(('tag %s\n' % name))
1757 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1757 tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
1758 elif type == 'a':
1758 elif type == 'a':
1759 ui.note(('branch %s\n' % data))
1759 ui.note(('branch %s\n' % data))
1760 atbranch = data
1760 atbranch = data
1761 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1761 ui.progress(_('building'), id, unit=_('revisions'), total=total)
1762 tr.close()
1762 tr.close()
1763
1763
1764 if tags:
1764 if tags:
1765 repo.opener.write("localtags", "".join(tags))
1765 repo.opener.write("localtags", "".join(tags))
1766 finally:
1766 finally:
1767 ui.progress(_('building'), None)
1767 ui.progress(_('building'), None)
1768 release(tr, lock)
1768 release(tr, lock)
1769
1769
1770 @command('debugbundle',
1770 @command('debugbundle',
1771 [('a', 'all', None, _('show all details'))],
1771 [('a', 'all', None, _('show all details'))],
1772 _('FILE'),
1772 _('FILE'),
1773 norepo=True)
1773 norepo=True)
1774 def debugbundle(ui, bundlepath, all=None, **opts):
1774 def debugbundle(ui, bundlepath, all=None, **opts):
1775 """lists the contents of a bundle"""
1775 """lists the contents of a bundle"""
1776 f = hg.openpath(ui, bundlepath)
1776 f = hg.openpath(ui, bundlepath)
1777 try:
1777 try:
1778 gen = exchange.readbundle(ui, f, bundlepath)
1778 gen = exchange.readbundle(ui, f, bundlepath)
1779 if all:
1779 if all:
1780 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1780 ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n"))
1781
1781
1782 def showchunks(named):
1782 def showchunks(named):
1783 ui.write("\n%s\n" % named)
1783 ui.write("\n%s\n" % named)
1784 chain = None
1784 chain = None
1785 while True:
1785 while True:
1786 chunkdata = gen.deltachunk(chain)
1786 chunkdata = gen.deltachunk(chain)
1787 if not chunkdata:
1787 if not chunkdata:
1788 break
1788 break
1789 node = chunkdata['node']
1789 node = chunkdata['node']
1790 p1 = chunkdata['p1']
1790 p1 = chunkdata['p1']
1791 p2 = chunkdata['p2']
1791 p2 = chunkdata['p2']
1792 cs = chunkdata['cs']
1792 cs = chunkdata['cs']
1793 deltabase = chunkdata['deltabase']
1793 deltabase = chunkdata['deltabase']
1794 delta = chunkdata['delta']
1794 delta = chunkdata['delta']
1795 ui.write("%s %s %s %s %s %s\n" %
1795 ui.write("%s %s %s %s %s %s\n" %
1796 (hex(node), hex(p1), hex(p2),
1796 (hex(node), hex(p1), hex(p2),
1797 hex(cs), hex(deltabase), len(delta)))
1797 hex(cs), hex(deltabase), len(delta)))
1798 chain = node
1798 chain = node
1799
1799
1800 chunkdata = gen.changelogheader()
1800 chunkdata = gen.changelogheader()
1801 showchunks("changelog")
1801 showchunks("changelog")
1802 chunkdata = gen.manifestheader()
1802 chunkdata = gen.manifestheader()
1803 showchunks("manifest")
1803 showchunks("manifest")
1804 while True:
1804 while True:
1805 chunkdata = gen.filelogheader()
1805 chunkdata = gen.filelogheader()
1806 if not chunkdata:
1806 if not chunkdata:
1807 break
1807 break
1808 fname = chunkdata['filename']
1808 fname = chunkdata['filename']
1809 showchunks(fname)
1809 showchunks(fname)
1810 else:
1810 else:
1811 chunkdata = gen.changelogheader()
1811 chunkdata = gen.changelogheader()
1812 chain = None
1812 chain = None
1813 while True:
1813 while True:
1814 chunkdata = gen.deltachunk(chain)
1814 chunkdata = gen.deltachunk(chain)
1815 if not chunkdata:
1815 if not chunkdata:
1816 break
1816 break
1817 node = chunkdata['node']
1817 node = chunkdata['node']
1818 ui.write("%s\n" % hex(node))
1818 ui.write("%s\n" % hex(node))
1819 chain = node
1819 chain = node
1820 finally:
1820 finally:
1821 f.close()
1821 f.close()
1822
1822
1823 @command('debugcheckstate', [], '')
1823 @command('debugcheckstate', [], '')
1824 def debugcheckstate(ui, repo):
1824 def debugcheckstate(ui, repo):
1825 """validate the correctness of the current dirstate"""
1825 """validate the correctness of the current dirstate"""
1826 parent1, parent2 = repo.dirstate.parents()
1826 parent1, parent2 = repo.dirstate.parents()
1827 m1 = repo[parent1].manifest()
1827 m1 = repo[parent1].manifest()
1828 m2 = repo[parent2].manifest()
1828 m2 = repo[parent2].manifest()
1829 errors = 0
1829 errors = 0
1830 for f in repo.dirstate:
1830 for f in repo.dirstate:
1831 state = repo.dirstate[f]
1831 state = repo.dirstate[f]
1832 if state in "nr" and f not in m1:
1832 if state in "nr" and f not in m1:
1833 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1833 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
1834 errors += 1
1834 errors += 1
1835 if state in "a" and f in m1:
1835 if state in "a" and f in m1:
1836 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1836 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
1837 errors += 1
1837 errors += 1
1838 if state in "m" and f not in m1 and f not in m2:
1838 if state in "m" and f not in m1 and f not in m2:
1839 ui.warn(_("%s in state %s, but not in either manifest\n") %
1839 ui.warn(_("%s in state %s, but not in either manifest\n") %
1840 (f, state))
1840 (f, state))
1841 errors += 1
1841 errors += 1
1842 for f in m1:
1842 for f in m1:
1843 state = repo.dirstate[f]
1843 state = repo.dirstate[f]
1844 if state not in "nrm":
1844 if state not in "nrm":
1845 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1845 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
1846 errors += 1
1846 errors += 1
1847 if errors:
1847 if errors:
1848 error = _(".hg/dirstate inconsistent with current parent's manifest")
1848 error = _(".hg/dirstate inconsistent with current parent's manifest")
1849 raise util.Abort(error)
1849 raise util.Abort(error)
1850
1850
1851 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
1851 @command('debugcommands', [], _('[COMMAND]'), norepo=True)
1852 def debugcommands(ui, cmd='', *args):
1852 def debugcommands(ui, cmd='', *args):
1853 """list all available commands and options"""
1853 """list all available commands and options"""
1854 for cmd, vals in sorted(table.iteritems()):
1854 for cmd, vals in sorted(table.iteritems()):
1855 cmd = cmd.split('|')[0].strip('^')
1855 cmd = cmd.split('|')[0].strip('^')
1856 opts = ', '.join([i[1] for i in vals[1]])
1856 opts = ', '.join([i[1] for i in vals[1]])
1857 ui.write('%s: %s\n' % (cmd, opts))
1857 ui.write('%s: %s\n' % (cmd, opts))
1858
1858
1859 @command('debugcomplete',
1859 @command('debugcomplete',
1860 [('o', 'options', None, _('show the command options'))],
1860 [('o', 'options', None, _('show the command options'))],
1861 _('[-o] CMD'),
1861 _('[-o] CMD'),
1862 norepo=True)
1862 norepo=True)
1863 def debugcomplete(ui, cmd='', **opts):
1863 def debugcomplete(ui, cmd='', **opts):
1864 """returns the completion list associated with the given command"""
1864 """returns the completion list associated with the given command"""
1865
1865
1866 if opts.get('options'):
1866 if opts.get('options'):
1867 options = []
1867 options = []
1868 otables = [globalopts]
1868 otables = [globalopts]
1869 if cmd:
1869 if cmd:
1870 aliases, entry = cmdutil.findcmd(cmd, table, False)
1870 aliases, entry = cmdutil.findcmd(cmd, table, False)
1871 otables.append(entry[1])
1871 otables.append(entry[1])
1872 for t in otables:
1872 for t in otables:
1873 for o in t:
1873 for o in t:
1874 if "(DEPRECATED)" in o[3]:
1874 if "(DEPRECATED)" in o[3]:
1875 continue
1875 continue
1876 if o[0]:
1876 if o[0]:
1877 options.append('-%s' % o[0])
1877 options.append('-%s' % o[0])
1878 options.append('--%s' % o[1])
1878 options.append('--%s' % o[1])
1879 ui.write("%s\n" % "\n".join(options))
1879 ui.write("%s\n" % "\n".join(options))
1880 return
1880 return
1881
1881
1882 cmdlist = cmdutil.findpossible(cmd, table)
1882 cmdlist = cmdutil.findpossible(cmd, table)
1883 if ui.verbose:
1883 if ui.verbose:
1884 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1884 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
1885 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1885 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
1886
1886
1887 @command('debugdag',
1887 @command('debugdag',
1888 [('t', 'tags', None, _('use tags as labels')),
1888 [('t', 'tags', None, _('use tags as labels')),
1889 ('b', 'branches', None, _('annotate with branch names')),
1889 ('b', 'branches', None, _('annotate with branch names')),
1890 ('', 'dots', None, _('use dots for runs')),
1890 ('', 'dots', None, _('use dots for runs')),
1891 ('s', 'spaces', None, _('separate elements by spaces'))],
1891 ('s', 'spaces', None, _('separate elements by spaces'))],
1892 _('[OPTION]... [FILE [REV]...]'),
1892 _('[OPTION]... [FILE [REV]...]'),
1893 optionalrepo=True)
1893 optionalrepo=True)
1894 def debugdag(ui, repo, file_=None, *revs, **opts):
1894 def debugdag(ui, repo, file_=None, *revs, **opts):
1895 """format the changelog or an index DAG as a concise textual description
1895 """format the changelog or an index DAG as a concise textual description
1896
1896
1897 If you pass a revlog index, the revlog's DAG is emitted. If you list
1897 If you pass a revlog index, the revlog's DAG is emitted. If you list
1898 revision numbers, they get labeled in the output as rN.
1898 revision numbers, they get labeled in the output as rN.
1899
1899
1900 Otherwise, the changelog DAG of the current repo is emitted.
1900 Otherwise, the changelog DAG of the current repo is emitted.
1901 """
1901 """
1902 spaces = opts.get('spaces')
1902 spaces = opts.get('spaces')
1903 dots = opts.get('dots')
1903 dots = opts.get('dots')
1904 if file_:
1904 if file_:
1905 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
1905 rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
1906 revs = set((int(r) for r in revs))
1906 revs = set((int(r) for r in revs))
1907 def events():
1907 def events():
1908 for r in rlog:
1908 for r in rlog:
1909 yield 'n', (r, list(set(p for p in rlog.parentrevs(r)
1909 yield 'n', (r, list(set(p for p in rlog.parentrevs(r)
1910 if p != -1)))
1910 if p != -1)))
1911 if r in revs:
1911 if r in revs:
1912 yield 'l', (r, "r%i" % r)
1912 yield 'l', (r, "r%i" % r)
1913 elif repo:
1913 elif repo:
1914 cl = repo.changelog
1914 cl = repo.changelog
1915 tags = opts.get('tags')
1915 tags = opts.get('tags')
1916 branches = opts.get('branches')
1916 branches = opts.get('branches')
1917 if tags:
1917 if tags:
1918 labels = {}
1918 labels = {}
1919 for l, n in repo.tags().items():
1919 for l, n in repo.tags().items():
1920 labels.setdefault(cl.rev(n), []).append(l)
1920 labels.setdefault(cl.rev(n), []).append(l)
1921 def events():
1921 def events():
1922 b = "default"
1922 b = "default"
1923 for r in cl:
1923 for r in cl:
1924 if branches:
1924 if branches:
1925 newb = cl.read(cl.node(r))[5]['branch']
1925 newb = cl.read(cl.node(r))[5]['branch']
1926 if newb != b:
1926 if newb != b:
1927 yield 'a', newb
1927 yield 'a', newb
1928 b = newb
1928 b = newb
1929 yield 'n', (r, list(set(p for p in cl.parentrevs(r)
1929 yield 'n', (r, list(set(p for p in cl.parentrevs(r)
1930 if p != -1)))
1930 if p != -1)))
1931 if tags:
1931 if tags:
1932 ls = labels.get(r)
1932 ls = labels.get(r)
1933 if ls:
1933 if ls:
1934 for l in ls:
1934 for l in ls:
1935 yield 'l', (r, l)
1935 yield 'l', (r, l)
1936 else:
1936 else:
1937 raise util.Abort(_('need repo for changelog dag'))
1937 raise util.Abort(_('need repo for changelog dag'))
1938
1938
1939 for line in dagparser.dagtextlines(events(),
1939 for line in dagparser.dagtextlines(events(),
1940 addspaces=spaces,
1940 addspaces=spaces,
1941 wraplabels=True,
1941 wraplabels=True,
1942 wrapannotations=True,
1942 wrapannotations=True,
1943 wrapnonlinear=dots,
1943 wrapnonlinear=dots,
1944 usedots=dots,
1944 usedots=dots,
1945 maxlinewidth=70):
1945 maxlinewidth=70):
1946 ui.write(line)
1946 ui.write(line)
1947 ui.write("\n")
1947 ui.write("\n")
1948
1948
1949 @command('debugdata',
1949 @command('debugdata',
1950 [('c', 'changelog', False, _('open changelog')),
1950 [('c', 'changelog', False, _('open changelog')),
1951 ('m', 'manifest', False, _('open manifest'))],
1951 ('m', 'manifest', False, _('open manifest'))],
1952 _('-c|-m|FILE REV'))
1952 _('-c|-m|FILE REV'))
1953 def debugdata(ui, repo, file_, rev=None, **opts):
1953 def debugdata(ui, repo, file_, rev=None, **opts):
1954 """dump the contents of a data file revision"""
1954 """dump the contents of a data file revision"""
1955 if opts.get('changelog') or opts.get('manifest'):
1955 if opts.get('changelog') or opts.get('manifest'):
1956 file_, rev = None, file_
1956 file_, rev = None, file_
1957 elif rev is None:
1957 elif rev is None:
1958 raise error.CommandError('debugdata', _('invalid arguments'))
1958 raise error.CommandError('debugdata', _('invalid arguments'))
1959 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
1959 r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
1960 try:
1960 try:
1961 ui.write(r.revision(r.lookup(rev)))
1961 ui.write(r.revision(r.lookup(rev)))
1962 except KeyError:
1962 except KeyError:
1963 raise util.Abort(_('invalid revision identifier %s') % rev)
1963 raise util.Abort(_('invalid revision identifier %s') % rev)
1964
1964
1965 @command('debugdate',
1965 @command('debugdate',
1966 [('e', 'extended', None, _('try extended date formats'))],
1966 [('e', 'extended', None, _('try extended date formats'))],
1967 _('[-e] DATE [RANGE]'),
1967 _('[-e] DATE [RANGE]'),
1968 norepo=True, optionalrepo=True)
1968 norepo=True, optionalrepo=True)
1969 def debugdate(ui, date, range=None, **opts):
1969 def debugdate(ui, date, range=None, **opts):
1970 """parse and display a date"""
1970 """parse and display a date"""
1971 if opts["extended"]:
1971 if opts["extended"]:
1972 d = util.parsedate(date, util.extendeddateformats)
1972 d = util.parsedate(date, util.extendeddateformats)
1973 else:
1973 else:
1974 d = util.parsedate(date)
1974 d = util.parsedate(date)
1975 ui.write(("internal: %s %s\n") % d)
1975 ui.write(("internal: %s %s\n") % d)
1976 ui.write(("standard: %s\n") % util.datestr(d))
1976 ui.write(("standard: %s\n") % util.datestr(d))
1977 if range:
1977 if range:
1978 m = util.matchdate(range)
1978 m = util.matchdate(range)
1979 ui.write(("match: %s\n") % m(d[0]))
1979 ui.write(("match: %s\n") % m(d[0]))
1980
1980
1981 @command('debugdiscovery',
1981 @command('debugdiscovery',
1982 [('', 'old', None, _('use old-style discovery')),
1982 [('', 'old', None, _('use old-style discovery')),
1983 ('', 'nonheads', None,
1983 ('', 'nonheads', None,
1984 _('use old-style discovery with non-heads included')),
1984 _('use old-style discovery with non-heads included')),
1985 ] + remoteopts,
1985 ] + remoteopts,
1986 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
1986 _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
1987 def debugdiscovery(ui, repo, remoteurl="default", **opts):
1987 def debugdiscovery(ui, repo, remoteurl="default", **opts):
1988 """runs the changeset discovery protocol in isolation"""
1988 """runs the changeset discovery protocol in isolation"""
1989 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
1989 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
1990 opts.get('branch'))
1990 opts.get('branch'))
1991 remote = hg.peer(repo, opts, remoteurl)
1991 remote = hg.peer(repo, opts, remoteurl)
1992 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
1992 ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
1993
1993
1994 # make sure tests are repeatable
1994 # make sure tests are repeatable
1995 random.seed(12323)
1995 random.seed(12323)
1996
1996
1997 def doit(localheads, remoteheads, remote=remote):
1997 def doit(localheads, remoteheads, remote=remote):
1998 if opts.get('old'):
1998 if opts.get('old'):
1999 if localheads:
1999 if localheads:
2000 raise util.Abort('cannot use localheads with old style '
2000 raise util.Abort('cannot use localheads with old style '
2001 'discovery')
2001 'discovery')
2002 if not util.safehasattr(remote, 'branches'):
2002 if not util.safehasattr(remote, 'branches'):
2003 # enable in-client legacy support
2003 # enable in-client legacy support
2004 remote = localrepo.locallegacypeer(remote.local())
2004 remote = localrepo.locallegacypeer(remote.local())
2005 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2005 common, _in, hds = treediscovery.findcommonincoming(repo, remote,
2006 force=True)
2006 force=True)
2007 common = set(common)
2007 common = set(common)
2008 if not opts.get('nonheads'):
2008 if not opts.get('nonheads'):
2009 ui.write(("unpruned common: %s\n") %
2009 ui.write(("unpruned common: %s\n") %
2010 " ".join(sorted(short(n) for n in common)))
2010 " ".join(sorted(short(n) for n in common)))
2011 dag = dagutil.revlogdag(repo.changelog)
2011 dag = dagutil.revlogdag(repo.changelog)
2012 all = dag.ancestorset(dag.internalizeall(common))
2012 all = dag.ancestorset(dag.internalizeall(common))
2013 common = dag.externalizeall(dag.headsetofconnecteds(all))
2013 common = dag.externalizeall(dag.headsetofconnecteds(all))
2014 else:
2014 else:
2015 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2015 common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
2016 common = set(common)
2016 common = set(common)
2017 rheads = set(hds)
2017 rheads = set(hds)
2018 lheads = set(repo.heads())
2018 lheads = set(repo.heads())
2019 ui.write(("common heads: %s\n") %
2019 ui.write(("common heads: %s\n") %
2020 " ".join(sorted(short(n) for n in common)))
2020 " ".join(sorted(short(n) for n in common)))
2021 if lheads <= common:
2021 if lheads <= common:
2022 ui.write(("local is subset\n"))
2022 ui.write(("local is subset\n"))
2023 elif rheads <= common:
2023 elif rheads <= common:
2024 ui.write(("remote is subset\n"))
2024 ui.write(("remote is subset\n"))
2025
2025
2026 serverlogs = opts.get('serverlog')
2026 serverlogs = opts.get('serverlog')
2027 if serverlogs:
2027 if serverlogs:
2028 for filename in serverlogs:
2028 for filename in serverlogs:
2029 logfile = open(filename, 'r')
2029 logfile = open(filename, 'r')
2030 try:
2030 try:
2031 line = logfile.readline()
2031 line = logfile.readline()
2032 while line:
2032 while line:
2033 parts = line.strip().split(';')
2033 parts = line.strip().split(';')
2034 op = parts[1]
2034 op = parts[1]
2035 if op == 'cg':
2035 if op == 'cg':
2036 pass
2036 pass
2037 elif op == 'cgss':
2037 elif op == 'cgss':
2038 doit(parts[2].split(' '), parts[3].split(' '))
2038 doit(parts[2].split(' '), parts[3].split(' '))
2039 elif op == 'unb':
2039 elif op == 'unb':
2040 doit(parts[3].split(' '), parts[2].split(' '))
2040 doit(parts[3].split(' '), parts[2].split(' '))
2041 line = logfile.readline()
2041 line = logfile.readline()
2042 finally:
2042 finally:
2043 logfile.close()
2043 logfile.close()
2044
2044
2045 else:
2045 else:
2046 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2046 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
2047 opts.get('remote_head'))
2047 opts.get('remote_head'))
2048 localrevs = opts.get('local_head')
2048 localrevs = opts.get('local_head')
2049 doit(localrevs, remoterevs)
2049 doit(localrevs, remoterevs)
2050
2050
2051 @command('debugfileset',
2051 @command('debugfileset',
2052 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2052 [('r', 'rev', '', _('apply the filespec on this revision'), _('REV'))],
2053 _('[-r REV] FILESPEC'))
2053 _('[-r REV] FILESPEC'))
2054 def debugfileset(ui, repo, expr, **opts):
2054 def debugfileset(ui, repo, expr, **opts):
2055 '''parse and apply a fileset specification'''
2055 '''parse and apply a fileset specification'''
2056 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2056 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
2057 if ui.verbose:
2057 if ui.verbose:
2058 tree = fileset.parse(expr)[0]
2058 tree = fileset.parse(expr)[0]
2059 ui.note(tree, "\n")
2059 ui.note(tree, "\n")
2060
2060
2061 for f in ctx.getfileset(expr):
2061 for f in ctx.getfileset(expr):
2062 ui.write("%s\n" % f)
2062 ui.write("%s\n" % f)
2063
2063
2064 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2064 @command('debugfsinfo', [], _('[PATH]'), norepo=True)
2065 def debugfsinfo(ui, path="."):
2065 def debugfsinfo(ui, path="."):
2066 """show information detected about current filesystem"""
2066 """show information detected about current filesystem"""
2067 util.writefile('.debugfsinfo', '')
2067 util.writefile('.debugfsinfo', '')
2068 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2068 ui.write(('exec: %s\n') % (util.checkexec(path) and 'yes' or 'no'))
2069 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2069 ui.write(('symlink: %s\n') % (util.checklink(path) and 'yes' or 'no'))
2070 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2070 ui.write(('hardlink: %s\n') % (util.checknlink(path) and 'yes' or 'no'))
2071 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2071 ui.write(('case-sensitive: %s\n') % (util.checkcase('.debugfsinfo')
2072 and 'yes' or 'no'))
2072 and 'yes' or 'no'))
2073 os.unlink('.debugfsinfo')
2073 os.unlink('.debugfsinfo')
2074
2074
2075 @command('debuggetbundle',
2075 @command('debuggetbundle',
2076 [('H', 'head', [], _('id of head node'), _('ID')),
2076 [('H', 'head', [], _('id of head node'), _('ID')),
2077 ('C', 'common', [], _('id of common node'), _('ID')),
2077 ('C', 'common', [], _('id of common node'), _('ID')),
2078 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2078 ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
2079 _('REPO FILE [-H|-C ID]...'),
2079 _('REPO FILE [-H|-C ID]...'),
2080 norepo=True)
2080 norepo=True)
2081 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2081 def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
2082 """retrieves a bundle from a repo
2082 """retrieves a bundle from a repo
2083
2083
2084 Every ID must be a full-length hex node id string. Saves the bundle to the
2084 Every ID must be a full-length hex node id string. Saves the bundle to the
2085 given file.
2085 given file.
2086 """
2086 """
2087 repo = hg.peer(ui, opts, repopath)
2087 repo = hg.peer(ui, opts, repopath)
2088 if not repo.capable('getbundle'):
2088 if not repo.capable('getbundle'):
2089 raise util.Abort("getbundle() not supported by target repository")
2089 raise util.Abort("getbundle() not supported by target repository")
2090 args = {}
2090 args = {}
2091 if common:
2091 if common:
2092 args['common'] = [bin(s) for s in common]
2092 args['common'] = [bin(s) for s in common]
2093 if head:
2093 if head:
2094 args['heads'] = [bin(s) for s in head]
2094 args['heads'] = [bin(s) for s in head]
2095 # TODO: get desired bundlecaps from command line.
2095 # TODO: get desired bundlecaps from command line.
2096 args['bundlecaps'] = None
2096 args['bundlecaps'] = None
2097 bundle = repo.getbundle('debug', **args)
2097 bundle = repo.getbundle('debug', **args)
2098
2098
2099 bundletype = opts.get('type', 'bzip2').lower()
2099 bundletype = opts.get('type', 'bzip2').lower()
2100 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
2100 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
2101 bundletype = btypes.get(bundletype)
2101 bundletype = btypes.get(bundletype)
2102 if bundletype not in changegroup.bundletypes:
2102 if bundletype not in changegroup.bundletypes:
2103 raise util.Abort(_('unknown bundle type specified with --type'))
2103 raise util.Abort(_('unknown bundle type specified with --type'))
2104 changegroup.writebundle(bundle, bundlepath, bundletype)
2104 changegroup.writebundle(bundle, bundlepath, bundletype)
2105
2105
2106 @command('debugignore', [], '')
2106 @command('debugignore', [], '')
2107 def debugignore(ui, repo, *values, **opts):
2107 def debugignore(ui, repo, *values, **opts):
2108 """display the combined ignore pattern"""
2108 """display the combined ignore pattern"""
2109 ignore = repo.dirstate._ignore
2109 ignore = repo.dirstate._ignore
2110 includepat = getattr(ignore, 'includepat', None)
2110 includepat = getattr(ignore, 'includepat', None)
2111 if includepat is not None:
2111 if includepat is not None:
2112 ui.write("%s\n" % includepat)
2112 ui.write("%s\n" % includepat)
2113 else:
2113 else:
2114 raise util.Abort(_("no ignore patterns found"))
2114 raise util.Abort(_("no ignore patterns found"))
2115
2115
2116 @command('debugindex',
2116 @command('debugindex',
2117 [('c', 'changelog', False, _('open changelog')),
2117 [('c', 'changelog', False, _('open changelog')),
2118 ('m', 'manifest', False, _('open manifest')),
2118 ('m', 'manifest', False, _('open manifest')),
2119 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2119 ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
2120 _('[-f FORMAT] -c|-m|FILE'),
2120 _('[-f FORMAT] -c|-m|FILE'),
2121 optionalrepo=True)
2121 optionalrepo=True)
2122 def debugindex(ui, repo, file_=None, **opts):
2122 def debugindex(ui, repo, file_=None, **opts):
2123 """dump the contents of an index file"""
2123 """dump the contents of an index file"""
2124 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2124 r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
2125 format = opts.get('format', 0)
2125 format = opts.get('format', 0)
2126 if format not in (0, 1):
2126 if format not in (0, 1):
2127 raise util.Abort(_("unknown format %d") % format)
2127 raise util.Abort(_("unknown format %d") % format)
2128
2128
2129 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2129 generaldelta = r.version & revlog.REVLOGGENERALDELTA
2130 if generaldelta:
2130 if generaldelta:
2131 basehdr = ' delta'
2131 basehdr = ' delta'
2132 else:
2132 else:
2133 basehdr = ' base'
2133 basehdr = ' base'
2134
2134
2135 if format == 0:
2135 if format == 0:
2136 ui.write(" rev offset length " + basehdr + " linkrev"
2136 ui.write(" rev offset length " + basehdr + " linkrev"
2137 " nodeid p1 p2\n")
2137 " nodeid p1 p2\n")
2138 elif format == 1:
2138 elif format == 1:
2139 ui.write(" rev flag offset length"
2139 ui.write(" rev flag offset length"
2140 " size " + basehdr + " link p1 p2"
2140 " size " + basehdr + " link p1 p2"
2141 " nodeid\n")
2141 " nodeid\n")
2142
2142
2143 for i in r:
2143 for i in r:
2144 node = r.node(i)
2144 node = r.node(i)
2145 if generaldelta:
2145 if generaldelta:
2146 base = r.deltaparent(i)
2146 base = r.deltaparent(i)
2147 else:
2147 else:
2148 base = r.chainbase(i)
2148 base = r.chainbase(i)
2149 if format == 0:
2149 if format == 0:
2150 try:
2150 try:
2151 pp = r.parents(node)
2151 pp = r.parents(node)
2152 except Exception:
2152 except Exception:
2153 pp = [nullid, nullid]
2153 pp = [nullid, nullid]
2154 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2154 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
2155 i, r.start(i), r.length(i), base, r.linkrev(i),
2155 i, r.start(i), r.length(i), base, r.linkrev(i),
2156 short(node), short(pp[0]), short(pp[1])))
2156 short(node), short(pp[0]), short(pp[1])))
2157 elif format == 1:
2157 elif format == 1:
2158 pr = r.parentrevs(i)
2158 pr = r.parentrevs(i)
2159 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2159 ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
2160 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2160 i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
2161 base, r.linkrev(i), pr[0], pr[1], short(node)))
2161 base, r.linkrev(i), pr[0], pr[1], short(node)))
2162
2162
2163 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2163 @command('debugindexdot', [], _('FILE'), optionalrepo=True)
2164 def debugindexdot(ui, repo, file_):
2164 def debugindexdot(ui, repo, file_):
2165 """dump an index DAG as a graphviz dot file"""
2165 """dump an index DAG as a graphviz dot file"""
2166 r = None
2166 r = None
2167 if repo:
2167 if repo:
2168 filelog = repo.file(file_)
2168 filelog = repo.file(file_)
2169 if len(filelog):
2169 if len(filelog):
2170 r = filelog
2170 r = filelog
2171 if not r:
2171 if not r:
2172 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2172 r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
2173 ui.write(("digraph G {\n"))
2173 ui.write(("digraph G {\n"))
2174 for i in r:
2174 for i in r:
2175 node = r.node(i)
2175 node = r.node(i)
2176 pp = r.parents(node)
2176 pp = r.parents(node)
2177 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2177 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
2178 if pp[1] != nullid:
2178 if pp[1] != nullid:
2179 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2179 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
2180 ui.write("}\n")
2180 ui.write("}\n")
2181
2181
2182 @command('debuginstall', [], '', norepo=True)
2182 @command('debuginstall', [], '', norepo=True)
2183 def debuginstall(ui):
2183 def debuginstall(ui):
2184 '''test Mercurial installation
2184 '''test Mercurial installation
2185
2185
2186 Returns 0 on success.
2186 Returns 0 on success.
2187 '''
2187 '''
2188
2188
2189 def writetemp(contents):
2189 def writetemp(contents):
2190 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2190 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
2191 f = os.fdopen(fd, "wb")
2191 f = os.fdopen(fd, "wb")
2192 f.write(contents)
2192 f.write(contents)
2193 f.close()
2193 f.close()
2194 return name
2194 return name
2195
2195
2196 problems = 0
2196 problems = 0
2197
2197
2198 # encoding
2198 # encoding
2199 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2199 ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
2200 try:
2200 try:
2201 encoding.fromlocal("test")
2201 encoding.fromlocal("test")
2202 except util.Abort, inst:
2202 except util.Abort, inst:
2203 ui.write(" %s\n" % inst)
2203 ui.write(" %s\n" % inst)
2204 ui.write(_(" (check that your locale is properly set)\n"))
2204 ui.write(_(" (check that your locale is properly set)\n"))
2205 problems += 1
2205 problems += 1
2206
2206
2207 # Python
2207 # Python
2208 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2208 ui.status(_("checking Python executable (%s)\n") % sys.executable)
2209 ui.status(_("checking Python version (%s)\n")
2209 ui.status(_("checking Python version (%s)\n")
2210 % ("%s.%s.%s" % sys.version_info[:3]))
2210 % ("%s.%s.%s" % sys.version_info[:3]))
2211 ui.status(_("checking Python lib (%s)...\n")
2211 ui.status(_("checking Python lib (%s)...\n")
2212 % os.path.dirname(os.__file__))
2212 % os.path.dirname(os.__file__))
2213
2213
2214 # compiled modules
2214 # compiled modules
2215 ui.status(_("checking installed modules (%s)...\n")
2215 ui.status(_("checking installed modules (%s)...\n")
2216 % os.path.dirname(__file__))
2216 % os.path.dirname(__file__))
2217 try:
2217 try:
2218 import bdiff, mpatch, base85, osutil
2218 import bdiff, mpatch, base85, osutil
2219 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2219 dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
2220 except Exception, inst:
2220 except Exception, inst:
2221 ui.write(" %s\n" % inst)
2221 ui.write(" %s\n" % inst)
2222 ui.write(_(" One or more extensions could not be found"))
2222 ui.write(_(" One or more extensions could not be found"))
2223 ui.write(_(" (check that you compiled the extensions)\n"))
2223 ui.write(_(" (check that you compiled the extensions)\n"))
2224 problems += 1
2224 problems += 1
2225
2225
2226 # templates
2226 # templates
2227 import templater
2227 import templater
2228 p = templater.templatepath()
2228 p = templater.templatepath()
2229 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2229 ui.status(_("checking templates (%s)...\n") % ' '.join(p))
2230 if p:
2230 if p:
2231 m = templater.templatepath("map-cmdline.default")
2231 m = templater.templatepath("map-cmdline.default")
2232 if m:
2232 if m:
2233 # template found, check if it is working
2233 # template found, check if it is working
2234 try:
2234 try:
2235 templater.templater(m)
2235 templater.templater(m)
2236 except Exception, inst:
2236 except Exception, inst:
2237 ui.write(" %s\n" % inst)
2237 ui.write(" %s\n" % inst)
2238 p = None
2238 p = None
2239 else:
2239 else:
2240 ui.write(_(" template 'default' not found\n"))
2240 ui.write(_(" template 'default' not found\n"))
2241 p = None
2241 p = None
2242 else:
2242 else:
2243 ui.write(_(" no template directories found\n"))
2243 ui.write(_(" no template directories found\n"))
2244 if not p:
2244 if not p:
2245 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2245 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
2246 problems += 1
2246 problems += 1
2247
2247
2248 # editor
2248 # editor
2249 ui.status(_("checking commit editor...\n"))
2249 ui.status(_("checking commit editor...\n"))
2250 editor = ui.geteditor()
2250 editor = ui.geteditor()
2251 cmdpath = util.findexe(editor) or util.findexe(editor.split()[0])
2251 cmdpath = util.findexe(editor) or util.findexe(editor.split()[0])
2252 if not cmdpath:
2252 if not cmdpath:
2253 if editor == 'vi':
2253 if editor == 'vi':
2254 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2254 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
2255 ui.write(_(" (specify a commit editor in your configuration"
2255 ui.write(_(" (specify a commit editor in your configuration"
2256 " file)\n"))
2256 " file)\n"))
2257 else:
2257 else:
2258 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2258 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
2259 ui.write(_(" (specify a commit editor in your configuration"
2259 ui.write(_(" (specify a commit editor in your configuration"
2260 " file)\n"))
2260 " file)\n"))
2261 problems += 1
2261 problems += 1
2262
2262
2263 # check username
2263 # check username
2264 ui.status(_("checking username...\n"))
2264 ui.status(_("checking username...\n"))
2265 try:
2265 try:
2266 ui.username()
2266 ui.username()
2267 except util.Abort, e:
2267 except util.Abort, e:
2268 ui.write(" %s\n" % e)
2268 ui.write(" %s\n" % e)
2269 ui.write(_(" (specify a username in your configuration file)\n"))
2269 ui.write(_(" (specify a username in your configuration file)\n"))
2270 problems += 1
2270 problems += 1
2271
2271
2272 if not problems:
2272 if not problems:
2273 ui.status(_("no problems detected\n"))
2273 ui.status(_("no problems detected\n"))
2274 else:
2274 else:
2275 ui.write(_("%s problems detected,"
2275 ui.write(_("%s problems detected,"
2276 " please check your install!\n") % problems)
2276 " please check your install!\n") % problems)
2277
2277
2278 return problems
2278 return problems
2279
2279
2280 @command('debugknown', [], _('REPO ID...'), norepo=True)
2280 @command('debugknown', [], _('REPO ID...'), norepo=True)
2281 def debugknown(ui, repopath, *ids, **opts):
2281 def debugknown(ui, repopath, *ids, **opts):
2282 """test whether node ids are known to a repo
2282 """test whether node ids are known to a repo
2283
2283
2284 Every ID must be a full-length hex node id string. Returns a list of 0s
2284 Every ID must be a full-length hex node id string. Returns a list of 0s
2285 and 1s indicating unknown/known.
2285 and 1s indicating unknown/known.
2286 """
2286 """
2287 repo = hg.peer(ui, opts, repopath)
2287 repo = hg.peer(ui, opts, repopath)
2288 if not repo.capable('known'):
2288 if not repo.capable('known'):
2289 raise util.Abort("known() not supported by target repository")
2289 raise util.Abort("known() not supported by target repository")
2290 flags = repo.known([bin(s) for s in ids])
2290 flags = repo.known([bin(s) for s in ids])
2291 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2291 ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
2292
2292
2293 @command('debuglabelcomplete', [], _('LABEL...'))
2293 @command('debuglabelcomplete', [], _('LABEL...'))
2294 def debuglabelcomplete(ui, repo, *args):
2294 def debuglabelcomplete(ui, repo, *args):
2295 '''complete "labels" - tags, open branch names, bookmark names'''
2295 '''complete "labels" - tags, open branch names, bookmark names'''
2296
2296
2297 labels = set()
2297 labels = set()
2298 labels.update(t[0] for t in repo.tagslist())
2298 labels.update(t[0] for t in repo.tagslist())
2299 labels.update(repo._bookmarks.keys())
2299 labels.update(repo._bookmarks.keys())
2300 labels.update(tag for (tag, heads, tip, closed)
2300 labels.update(tag for (tag, heads, tip, closed)
2301 in repo.branchmap().iterbranches() if not closed)
2301 in repo.branchmap().iterbranches() if not closed)
2302 completions = set()
2302 completions = set()
2303 if not args:
2303 if not args:
2304 args = ['']
2304 args = ['']
2305 for a in args:
2305 for a in args:
2306 completions.update(l for l in labels if l.startswith(a))
2306 completions.update(l for l in labels if l.startswith(a))
2307 ui.write('\n'.join(sorted(completions)))
2307 ui.write('\n'.join(sorted(completions)))
2308 ui.write('\n')
2308 ui.write('\n')
2309
2309
2310 @command('debugobsolete',
2310 @command('debugobsolete',
2311 [('', 'flags', 0, _('markers flag')),
2311 [('', 'flags', 0, _('markers flag')),
2312 ] + commitopts2,
2312 ] + commitopts2,
2313 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2313 _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
2314 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2314 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
2315 """create arbitrary obsolete marker
2315 """create arbitrary obsolete marker
2316
2316
2317 With no arguments, displays the list of obsolescence markers."""
2317 With no arguments, displays the list of obsolescence markers."""
2318
2318
2319 def parsenodeid(s):
2319 def parsenodeid(s):
2320 try:
2320 try:
2321 # We do not use revsingle/revrange functions here to accept
2321 # We do not use revsingle/revrange functions here to accept
2322 # arbitrary node identifiers, possibly not present in the
2322 # arbitrary node identifiers, possibly not present in the
2323 # local repository.
2323 # local repository.
2324 n = bin(s)
2324 n = bin(s)
2325 if len(n) != len(nullid):
2325 if len(n) != len(nullid):
2326 raise TypeError()
2326 raise TypeError()
2327 return n
2327 return n
2328 except TypeError:
2328 except TypeError:
2329 raise util.Abort('changeset references must be full hexadecimal '
2329 raise util.Abort('changeset references must be full hexadecimal '
2330 'node identifiers')
2330 'node identifiers')
2331
2331
2332 if precursor is not None:
2332 if precursor is not None:
2333 metadata = {}
2333 metadata = {}
2334 if 'date' in opts:
2334 if 'date' in opts:
2335 metadata['date'] = opts['date']
2335 metadata['date'] = opts['date']
2336 metadata['user'] = opts['user'] or ui.username()
2336 metadata['user'] = opts['user'] or ui.username()
2337 succs = tuple(parsenodeid(succ) for succ in successors)
2337 succs = tuple(parsenodeid(succ) for succ in successors)
2338 l = repo.lock()
2338 l = repo.lock()
2339 try:
2339 try:
2340 tr = repo.transaction('debugobsolete')
2340 tr = repo.transaction('debugobsolete')
2341 try:
2341 try:
2342 repo.obsstore.create(tr, parsenodeid(precursor), succs,
2342 repo.obsstore.create(tr, parsenodeid(precursor), succs,
2343 opts['flags'], metadata)
2343 opts['flags'], metadata)
2344 tr.close()
2344 tr.close()
2345 finally:
2345 finally:
2346 tr.release()
2346 tr.release()
2347 finally:
2347 finally:
2348 l.release()
2348 l.release()
2349 else:
2349 else:
2350 for m in obsolete.allmarkers(repo):
2350 for m in obsolete.allmarkers(repo):
2351 cmdutil.showmarker(ui, m)
2351 cmdutil.showmarker(ui, m)
2352
2352
2353 @command('debugpathcomplete',
2353 @command('debugpathcomplete',
2354 [('f', 'full', None, _('complete an entire path')),
2354 [('f', 'full', None, _('complete an entire path')),
2355 ('n', 'normal', None, _('show only normal files')),
2355 ('n', 'normal', None, _('show only normal files')),
2356 ('a', 'added', None, _('show only added files')),
2356 ('a', 'added', None, _('show only added files')),
2357 ('r', 'removed', None, _('show only removed files'))],
2357 ('r', 'removed', None, _('show only removed files'))],
2358 _('FILESPEC...'))
2358 _('FILESPEC...'))
2359 def debugpathcomplete(ui, repo, *specs, **opts):
2359 def debugpathcomplete(ui, repo, *specs, **opts):
2360 '''complete part or all of a tracked path
2360 '''complete part or all of a tracked path
2361
2361
2362 This command supports shells that offer path name completion. It
2362 This command supports shells that offer path name completion. It
2363 currently completes only files already known to the dirstate.
2363 currently completes only files already known to the dirstate.
2364
2364
2365 Completion extends only to the next path segment unless
2365 Completion extends only to the next path segment unless
2366 --full is specified, in which case entire paths are used.'''
2366 --full is specified, in which case entire paths are used.'''
2367
2367
2368 def complete(path, acceptable):
2368 def complete(path, acceptable):
2369 dirstate = repo.dirstate
2369 dirstate = repo.dirstate
2370 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2370 spec = os.path.normpath(os.path.join(os.getcwd(), path))
2371 rootdir = repo.root + os.sep
2371 rootdir = repo.root + os.sep
2372 if spec != repo.root and not spec.startswith(rootdir):
2372 if spec != repo.root and not spec.startswith(rootdir):
2373 return [], []
2373 return [], []
2374 if os.path.isdir(spec):
2374 if os.path.isdir(spec):
2375 spec += '/'
2375 spec += '/'
2376 spec = spec[len(rootdir):]
2376 spec = spec[len(rootdir):]
2377 fixpaths = os.sep != '/'
2377 fixpaths = os.sep != '/'
2378 if fixpaths:
2378 if fixpaths:
2379 spec = spec.replace(os.sep, '/')
2379 spec = spec.replace(os.sep, '/')
2380 speclen = len(spec)
2380 speclen = len(spec)
2381 fullpaths = opts['full']
2381 fullpaths = opts['full']
2382 files, dirs = set(), set()
2382 files, dirs = set(), set()
2383 adddir, addfile = dirs.add, files.add
2383 adddir, addfile = dirs.add, files.add
2384 for f, st in dirstate.iteritems():
2384 for f, st in dirstate.iteritems():
2385 if f.startswith(spec) and st[0] in acceptable:
2385 if f.startswith(spec) and st[0] in acceptable:
2386 if fixpaths:
2386 if fixpaths:
2387 f = f.replace('/', os.sep)
2387 f = f.replace('/', os.sep)
2388 if fullpaths:
2388 if fullpaths:
2389 addfile(f)
2389 addfile(f)
2390 continue
2390 continue
2391 s = f.find(os.sep, speclen)
2391 s = f.find(os.sep, speclen)
2392 if s >= 0:
2392 if s >= 0:
2393 adddir(f[:s])
2393 adddir(f[:s])
2394 else:
2394 else:
2395 addfile(f)
2395 addfile(f)
2396 return files, dirs
2396 return files, dirs
2397
2397
2398 acceptable = ''
2398 acceptable = ''
2399 if opts['normal']:
2399 if opts['normal']:
2400 acceptable += 'nm'
2400 acceptable += 'nm'
2401 if opts['added']:
2401 if opts['added']:
2402 acceptable += 'a'
2402 acceptable += 'a'
2403 if opts['removed']:
2403 if opts['removed']:
2404 acceptable += 'r'
2404 acceptable += 'r'
2405 cwd = repo.getcwd()
2405 cwd = repo.getcwd()
2406 if not specs:
2406 if not specs:
2407 specs = ['.']
2407 specs = ['.']
2408
2408
2409 files, dirs = set(), set()
2409 files, dirs = set(), set()
2410 for spec in specs:
2410 for spec in specs:
2411 f, d = complete(spec, acceptable or 'nmar')
2411 f, d = complete(spec, acceptable or 'nmar')
2412 files.update(f)
2412 files.update(f)
2413 dirs.update(d)
2413 dirs.update(d)
2414 files.update(dirs)
2414 files.update(dirs)
2415 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2415 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
2416 ui.write('\n')
2416 ui.write('\n')
2417
2417
2418 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2418 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'), norepo=True)
2419 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2419 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
2420 '''access the pushkey key/value protocol
2420 '''access the pushkey key/value protocol
2421
2421
2422 With two args, list the keys in the given namespace.
2422 With two args, list the keys in the given namespace.
2423
2423
2424 With five args, set a key to new if it currently is set to old.
2424 With five args, set a key to new if it currently is set to old.
2425 Reports success or failure.
2425 Reports success or failure.
2426 '''
2426 '''
2427
2427
2428 target = hg.peer(ui, {}, repopath)
2428 target = hg.peer(ui, {}, repopath)
2429 if keyinfo:
2429 if keyinfo:
2430 key, old, new = keyinfo
2430 key, old, new = keyinfo
2431 r = target.pushkey(namespace, key, old, new)
2431 r = target.pushkey(namespace, key, old, new)
2432 ui.status(str(r) + '\n')
2432 ui.status(str(r) + '\n')
2433 return not r
2433 return not r
2434 else:
2434 else:
2435 for k, v in sorted(target.listkeys(namespace).iteritems()):
2435 for k, v in sorted(target.listkeys(namespace).iteritems()):
2436 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2436 ui.write("%s\t%s\n" % (k.encode('string-escape'),
2437 v.encode('string-escape')))
2437 v.encode('string-escape')))
2438
2438
2439 @command('debugpvec', [], _('A B'))
2439 @command('debugpvec', [], _('A B'))
2440 def debugpvec(ui, repo, a, b=None):
2440 def debugpvec(ui, repo, a, b=None):
2441 ca = scmutil.revsingle(repo, a)
2441 ca = scmutil.revsingle(repo, a)
2442 cb = scmutil.revsingle(repo, b)
2442 cb = scmutil.revsingle(repo, b)
2443 pa = pvec.ctxpvec(ca)
2443 pa = pvec.ctxpvec(ca)
2444 pb = pvec.ctxpvec(cb)
2444 pb = pvec.ctxpvec(cb)
2445 if pa == pb:
2445 if pa == pb:
2446 rel = "="
2446 rel = "="
2447 elif pa > pb:
2447 elif pa > pb:
2448 rel = ">"
2448 rel = ">"
2449 elif pa < pb:
2449 elif pa < pb:
2450 rel = "<"
2450 rel = "<"
2451 elif pa | pb:
2451 elif pa | pb:
2452 rel = "|"
2452 rel = "|"
2453 ui.write(_("a: %s\n") % pa)
2453 ui.write(_("a: %s\n") % pa)
2454 ui.write(_("b: %s\n") % pb)
2454 ui.write(_("b: %s\n") % pb)
2455 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2455 ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
2456 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2456 ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
2457 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2457 (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
2458 pa.distance(pb), rel))
2458 pa.distance(pb), rel))
2459
2459
2460 @command('debugrebuilddirstate|debugrebuildstate',
2460 @command('debugrebuilddirstate|debugrebuildstate',
2461 [('r', 'rev', '', _('revision to rebuild to'), _('REV'))],
2461 [('r', 'rev', '', _('revision to rebuild to'), _('REV'))],
2462 _('[-r REV]'))
2462 _('[-r REV]'))
2463 def debugrebuilddirstate(ui, repo, rev):
2463 def debugrebuilddirstate(ui, repo, rev):
2464 """rebuild the dirstate as it would look like for the given revision
2464 """rebuild the dirstate as it would look like for the given revision
2465
2465
2466 If no revision is specified the first current parent will be used.
2466 If no revision is specified the first current parent will be used.
2467
2467
2468 The dirstate will be set to the files of the given revision.
2468 The dirstate will be set to the files of the given revision.
2469 The actual working directory content or existing dirstate
2469 The actual working directory content or existing dirstate
2470 information such as adds or removes is not considered.
2470 information such as adds or removes is not considered.
2471
2471
2472 One use of this command is to make the next :hg:`status` invocation
2472 One use of this command is to make the next :hg:`status` invocation
2473 check the actual file content.
2473 check the actual file content.
2474 """
2474 """
2475 ctx = scmutil.revsingle(repo, rev)
2475 ctx = scmutil.revsingle(repo, rev)
2476 wlock = repo.wlock()
2476 wlock = repo.wlock()
2477 try:
2477 try:
2478 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
2478 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
2479 finally:
2479 finally:
2480 wlock.release()
2480 wlock.release()
2481
2481
2482 @command('debugrename',
2482 @command('debugrename',
2483 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2483 [('r', 'rev', '', _('revision to debug'), _('REV'))],
2484 _('[-r REV] FILE'))
2484 _('[-r REV] FILE'))
2485 def debugrename(ui, repo, file1, *pats, **opts):
2485 def debugrename(ui, repo, file1, *pats, **opts):
2486 """dump rename information"""
2486 """dump rename information"""
2487
2487
2488 ctx = scmutil.revsingle(repo, opts.get('rev'))
2488 ctx = scmutil.revsingle(repo, opts.get('rev'))
2489 m = scmutil.match(ctx, (file1,) + pats, opts)
2489 m = scmutil.match(ctx, (file1,) + pats, opts)
2490 for abs in ctx.walk(m):
2490 for abs in ctx.walk(m):
2491 fctx = ctx[abs]
2491 fctx = ctx[abs]
2492 o = fctx.filelog().renamed(fctx.filenode())
2492 o = fctx.filelog().renamed(fctx.filenode())
2493 rel = m.rel(abs)
2493 rel = m.rel(abs)
2494 if o:
2494 if o:
2495 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2495 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
2496 else:
2496 else:
2497 ui.write(_("%s not renamed\n") % rel)
2497 ui.write(_("%s not renamed\n") % rel)
2498
2498
2499 @command('debugrevlog',
2499 @command('debugrevlog',
2500 [('c', 'changelog', False, _('open changelog')),
2500 [('c', 'changelog', False, _('open changelog')),
2501 ('m', 'manifest', False, _('open manifest')),
2501 ('m', 'manifest', False, _('open manifest')),
2502 ('d', 'dump', False, _('dump index data'))],
2502 ('d', 'dump', False, _('dump index data'))],
2503 _('-c|-m|FILE'),
2503 _('-c|-m|FILE'),
2504 optionalrepo=True)
2504 optionalrepo=True)
2505 def debugrevlog(ui, repo, file_=None, **opts):
2505 def debugrevlog(ui, repo, file_=None, **opts):
2506 """show data and statistics about a revlog"""
2506 """show data and statistics about a revlog"""
2507 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2507 r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
2508
2508
2509 if opts.get("dump"):
2509 if opts.get("dump"):
2510 numrevs = len(r)
2510 numrevs = len(r)
2511 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2511 ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
2512 " rawsize totalsize compression heads\n")
2512 " rawsize totalsize compression heads\n")
2513 ts = 0
2513 ts = 0
2514 heads = set()
2514 heads = set()
2515 for rev in xrange(numrevs):
2515 for rev in xrange(numrevs):
2516 dbase = r.deltaparent(rev)
2516 dbase = r.deltaparent(rev)
2517 if dbase == -1:
2517 if dbase == -1:
2518 dbase = rev
2518 dbase = rev
2519 cbase = r.chainbase(rev)
2519 cbase = r.chainbase(rev)
2520 p1, p2 = r.parentrevs(rev)
2520 p1, p2 = r.parentrevs(rev)
2521 rs = r.rawsize(rev)
2521 rs = r.rawsize(rev)
2522 ts = ts + rs
2522 ts = ts + rs
2523 heads -= set(r.parentrevs(rev))
2523 heads -= set(r.parentrevs(rev))
2524 heads.add(rev)
2524 heads.add(rev)
2525 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d %11d %5d\n" %
2525 ui.write("%5d %5d %5d %5d %5d %10d %4d %4d %4d %7d %9d %11d %5d\n" %
2526 (rev, p1, p2, r.start(rev), r.end(rev),
2526 (rev, p1, p2, r.start(rev), r.end(rev),
2527 r.start(dbase), r.start(cbase),
2527 r.start(dbase), r.start(cbase),
2528 r.start(p1), r.start(p2),
2528 r.start(p1), r.start(p2),
2529 rs, ts, ts / r.end(rev), len(heads)))
2529 rs, ts, ts / r.end(rev), len(heads)))
2530 return 0
2530 return 0
2531
2531
2532 v = r.version
2532 v = r.version
2533 format = v & 0xFFFF
2533 format = v & 0xFFFF
2534 flags = []
2534 flags = []
2535 gdelta = False
2535 gdelta = False
2536 if v & revlog.REVLOGNGINLINEDATA:
2536 if v & revlog.REVLOGNGINLINEDATA:
2537 flags.append('inline')
2537 flags.append('inline')
2538 if v & revlog.REVLOGGENERALDELTA:
2538 if v & revlog.REVLOGGENERALDELTA:
2539 gdelta = True
2539 gdelta = True
2540 flags.append('generaldelta')
2540 flags.append('generaldelta')
2541 if not flags:
2541 if not flags:
2542 flags = ['(none)']
2542 flags = ['(none)']
2543
2543
2544 nummerges = 0
2544 nummerges = 0
2545 numfull = 0
2545 numfull = 0
2546 numprev = 0
2546 numprev = 0
2547 nump1 = 0
2547 nump1 = 0
2548 nump2 = 0
2548 nump2 = 0
2549 numother = 0
2549 numother = 0
2550 nump1prev = 0
2550 nump1prev = 0
2551 nump2prev = 0
2551 nump2prev = 0
2552 chainlengths = []
2552 chainlengths = []
2553
2553
2554 datasize = [None, 0, 0L]
2554 datasize = [None, 0, 0L]
2555 fullsize = [None, 0, 0L]
2555 fullsize = [None, 0, 0L]
2556 deltasize = [None, 0, 0L]
2556 deltasize = [None, 0, 0L]
2557
2557
2558 def addsize(size, l):
2558 def addsize(size, l):
2559 if l[0] is None or size < l[0]:
2559 if l[0] is None or size < l[0]:
2560 l[0] = size
2560 l[0] = size
2561 if size > l[1]:
2561 if size > l[1]:
2562 l[1] = size
2562 l[1] = size
2563 l[2] += size
2563 l[2] += size
2564
2564
2565 numrevs = len(r)
2565 numrevs = len(r)
2566 for rev in xrange(numrevs):
2566 for rev in xrange(numrevs):
2567 p1, p2 = r.parentrevs(rev)
2567 p1, p2 = r.parentrevs(rev)
2568 delta = r.deltaparent(rev)
2568 delta = r.deltaparent(rev)
2569 if format > 0:
2569 if format > 0:
2570 addsize(r.rawsize(rev), datasize)
2570 addsize(r.rawsize(rev), datasize)
2571 if p2 != nullrev:
2571 if p2 != nullrev:
2572 nummerges += 1
2572 nummerges += 1
2573 size = r.length(rev)
2573 size = r.length(rev)
2574 if delta == nullrev:
2574 if delta == nullrev:
2575 chainlengths.append(0)
2575 chainlengths.append(0)
2576 numfull += 1
2576 numfull += 1
2577 addsize(size, fullsize)
2577 addsize(size, fullsize)
2578 else:
2578 else:
2579 chainlengths.append(chainlengths[delta] + 1)
2579 chainlengths.append(chainlengths[delta] + 1)
2580 addsize(size, deltasize)
2580 addsize(size, deltasize)
2581 if delta == rev - 1:
2581 if delta == rev - 1:
2582 numprev += 1
2582 numprev += 1
2583 if delta == p1:
2583 if delta == p1:
2584 nump1prev += 1
2584 nump1prev += 1
2585 elif delta == p2:
2585 elif delta == p2:
2586 nump2prev += 1
2586 nump2prev += 1
2587 elif delta == p1:
2587 elif delta == p1:
2588 nump1 += 1
2588 nump1 += 1
2589 elif delta == p2:
2589 elif delta == p2:
2590 nump2 += 1
2590 nump2 += 1
2591 elif delta != nullrev:
2591 elif delta != nullrev:
2592 numother += 1
2592 numother += 1
2593
2593
2594 # Adjust size min value for empty cases
2594 # Adjust size min value for empty cases
2595 for size in (datasize, fullsize, deltasize):
2595 for size in (datasize, fullsize, deltasize):
2596 if size[0] is None:
2596 if size[0] is None:
2597 size[0] = 0
2597 size[0] = 0
2598
2598
2599 numdeltas = numrevs - numfull
2599 numdeltas = numrevs - numfull
2600 numoprev = numprev - nump1prev - nump2prev
2600 numoprev = numprev - nump1prev - nump2prev
2601 totalrawsize = datasize[2]
2601 totalrawsize = datasize[2]
2602 datasize[2] /= numrevs
2602 datasize[2] /= numrevs
2603 fulltotal = fullsize[2]
2603 fulltotal = fullsize[2]
2604 fullsize[2] /= numfull
2604 fullsize[2] /= numfull
2605 deltatotal = deltasize[2]
2605 deltatotal = deltasize[2]
2606 if numrevs - numfull > 0:
2606 if numrevs - numfull > 0:
2607 deltasize[2] /= numrevs - numfull
2607 deltasize[2] /= numrevs - numfull
2608 totalsize = fulltotal + deltatotal
2608 totalsize = fulltotal + deltatotal
2609 avgchainlen = sum(chainlengths) / numrevs
2609 avgchainlen = sum(chainlengths) / numrevs
2610 compratio = totalrawsize / totalsize
2610 compratio = totalrawsize / totalsize
2611
2611
2612 basedfmtstr = '%%%dd\n'
2612 basedfmtstr = '%%%dd\n'
2613 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
2613 basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
2614
2614
2615 def dfmtstr(max):
2615 def dfmtstr(max):
2616 return basedfmtstr % len(str(max))
2616 return basedfmtstr % len(str(max))
2617 def pcfmtstr(max, padding=0):
2617 def pcfmtstr(max, padding=0):
2618 return basepcfmtstr % (len(str(max)), ' ' * padding)
2618 return basepcfmtstr % (len(str(max)), ' ' * padding)
2619
2619
2620 def pcfmt(value, total):
2620 def pcfmt(value, total):
2621 return (value, 100 * float(value) / total)
2621 return (value, 100 * float(value) / total)
2622
2622
2623 ui.write(('format : %d\n') % format)
2623 ui.write(('format : %d\n') % format)
2624 ui.write(('flags : %s\n') % ', '.join(flags))
2624 ui.write(('flags : %s\n') % ', '.join(flags))
2625
2625
2626 ui.write('\n')
2626 ui.write('\n')
2627 fmt = pcfmtstr(totalsize)
2627 fmt = pcfmtstr(totalsize)
2628 fmt2 = dfmtstr(totalsize)
2628 fmt2 = dfmtstr(totalsize)
2629 ui.write(('revisions : ') + fmt2 % numrevs)
2629 ui.write(('revisions : ') + fmt2 % numrevs)
2630 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
2630 ui.write((' merges : ') + fmt % pcfmt(nummerges, numrevs))
2631 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
2631 ui.write((' normal : ') + fmt % pcfmt(numrevs - nummerges, numrevs))
2632 ui.write(('revisions : ') + fmt2 % numrevs)
2632 ui.write(('revisions : ') + fmt2 % numrevs)
2633 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
2633 ui.write((' full : ') + fmt % pcfmt(numfull, numrevs))
2634 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
2634 ui.write((' deltas : ') + fmt % pcfmt(numdeltas, numrevs))
2635 ui.write(('revision size : ') + fmt2 % totalsize)
2635 ui.write(('revision size : ') + fmt2 % totalsize)
2636 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
2636 ui.write((' full : ') + fmt % pcfmt(fulltotal, totalsize))
2637 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
2637 ui.write((' deltas : ') + fmt % pcfmt(deltatotal, totalsize))
2638
2638
2639 ui.write('\n')
2639 ui.write('\n')
2640 fmt = dfmtstr(max(avgchainlen, compratio))
2640 fmt = dfmtstr(max(avgchainlen, compratio))
2641 ui.write(('avg chain length : ') + fmt % avgchainlen)
2641 ui.write(('avg chain length : ') + fmt % avgchainlen)
2642 ui.write(('compression ratio : ') + fmt % compratio)
2642 ui.write(('compression ratio : ') + fmt % compratio)
2643
2643
2644 if format > 0:
2644 if format > 0:
2645 ui.write('\n')
2645 ui.write('\n')
2646 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
2646 ui.write(('uncompressed data size (min/max/avg) : %d / %d / %d\n')
2647 % tuple(datasize))
2647 % tuple(datasize))
2648 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
2648 ui.write(('full revision size (min/max/avg) : %d / %d / %d\n')
2649 % tuple(fullsize))
2649 % tuple(fullsize))
2650 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
2650 ui.write(('delta size (min/max/avg) : %d / %d / %d\n')
2651 % tuple(deltasize))
2651 % tuple(deltasize))
2652
2652
2653 if numdeltas > 0:
2653 if numdeltas > 0:
2654 ui.write('\n')
2654 ui.write('\n')
2655 fmt = pcfmtstr(numdeltas)
2655 fmt = pcfmtstr(numdeltas)
2656 fmt2 = pcfmtstr(numdeltas, 4)
2656 fmt2 = pcfmtstr(numdeltas, 4)
2657 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
2657 ui.write(('deltas against prev : ') + fmt % pcfmt(numprev, numdeltas))
2658 if numprev > 0:
2658 if numprev > 0:
2659 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
2659 ui.write((' where prev = p1 : ') + fmt2 % pcfmt(nump1prev,
2660 numprev))
2660 numprev))
2661 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
2661 ui.write((' where prev = p2 : ') + fmt2 % pcfmt(nump2prev,
2662 numprev))
2662 numprev))
2663 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
2663 ui.write((' other : ') + fmt2 % pcfmt(numoprev,
2664 numprev))
2664 numprev))
2665 if gdelta:
2665 if gdelta:
2666 ui.write(('deltas against p1 : ')
2666 ui.write(('deltas against p1 : ')
2667 + fmt % pcfmt(nump1, numdeltas))
2667 + fmt % pcfmt(nump1, numdeltas))
2668 ui.write(('deltas against p2 : ')
2668 ui.write(('deltas against p2 : ')
2669 + fmt % pcfmt(nump2, numdeltas))
2669 + fmt % pcfmt(nump2, numdeltas))
2670 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
2670 ui.write(('deltas against other : ') + fmt % pcfmt(numother,
2671 numdeltas))
2671 numdeltas))
2672
2672
2673 @command('debugrevspec',
2673 @command('debugrevspec',
2674 [('', 'optimize', None, _('print parsed tree after optimizing'))],
2674 [('', 'optimize', None, _('print parsed tree after optimizing'))],
2675 ('REVSPEC'))
2675 ('REVSPEC'))
2676 def debugrevspec(ui, repo, expr, **opts):
2676 def debugrevspec(ui, repo, expr, **opts):
2677 """parse and apply a revision specification
2677 """parse and apply a revision specification
2678
2678
2679 Use --verbose to print the parsed tree before and after aliases
2679 Use --verbose to print the parsed tree before and after aliases
2680 expansion.
2680 expansion.
2681 """
2681 """
2682 if ui.verbose:
2682 if ui.verbose:
2683 tree = revset.parse(expr)[0]
2683 tree = revset.parse(expr)[0]
2684 ui.note(revset.prettyformat(tree), "\n")
2684 ui.note(revset.prettyformat(tree), "\n")
2685 newtree = revset.findaliases(ui, tree)
2685 newtree = revset.findaliases(ui, tree)
2686 if newtree != tree:
2686 if newtree != tree:
2687 ui.note(revset.prettyformat(newtree), "\n")
2687 ui.note(revset.prettyformat(newtree), "\n")
2688 if opts["optimize"]:
2688 if opts["optimize"]:
2689 weight, optimizedtree = revset.optimize(newtree, True)
2689 weight, optimizedtree = revset.optimize(newtree, True)
2690 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
2690 ui.note("* optimized:\n", revset.prettyformat(optimizedtree), "\n")
2691 func = revset.match(ui, expr)
2691 func = revset.match(ui, expr)
2692 for c in func(repo, revset.spanset(repo)):
2692 for c in func(repo, revset.spanset(repo)):
2693 ui.write("%s\n" % c)
2693 ui.write("%s\n" % c)
2694
2694
2695 @command('debugsetparents', [], _('REV1 [REV2]'))
2695 @command('debugsetparents', [], _('REV1 [REV2]'))
2696 def debugsetparents(ui, repo, rev1, rev2=None):
2696 def debugsetparents(ui, repo, rev1, rev2=None):
2697 """manually set the parents of the current working directory
2697 """manually set the parents of the current working directory
2698
2698
2699 This is useful for writing repository conversion tools, but should
2699 This is useful for writing repository conversion tools, but should
2700 be used with care.
2700 be used with care.
2701
2701
2702 Returns 0 on success.
2702 Returns 0 on success.
2703 """
2703 """
2704
2704
2705 r1 = scmutil.revsingle(repo, rev1).node()
2705 r1 = scmutil.revsingle(repo, rev1).node()
2706 r2 = scmutil.revsingle(repo, rev2, 'null').node()
2706 r2 = scmutil.revsingle(repo, rev2, 'null').node()
2707
2707
2708 wlock = repo.wlock()
2708 wlock = repo.wlock()
2709 try:
2709 try:
2710 repo.setparents(r1, r2)
2710 repo.setparents(r1, r2)
2711 finally:
2711 finally:
2712 wlock.release()
2712 wlock.release()
2713
2713
2714 @command('debugdirstate|debugstate',
2714 @command('debugdirstate|debugstate',
2715 [('', 'nodates', None, _('do not display the saved mtime')),
2715 [('', 'nodates', None, _('do not display the saved mtime')),
2716 ('', 'datesort', None, _('sort by saved mtime'))],
2716 ('', 'datesort', None, _('sort by saved mtime'))],
2717 _('[OPTION]...'))
2717 _('[OPTION]...'))
2718 def debugstate(ui, repo, nodates=None, datesort=None):
2718 def debugstate(ui, repo, nodates=None, datesort=None):
2719 """show the contents of the current dirstate"""
2719 """show the contents of the current dirstate"""
2720 timestr = ""
2720 timestr = ""
2721 showdate = not nodates
2721 showdate = not nodates
2722 if datesort:
2722 if datesort:
2723 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
2723 keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
2724 else:
2724 else:
2725 keyfunc = None # sort by filename
2725 keyfunc = None # sort by filename
2726 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
2726 for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
2727 if showdate:
2727 if showdate:
2728 if ent[3] == -1:
2728 if ent[3] == -1:
2729 # Pad or slice to locale representation
2729 # Pad or slice to locale representation
2730 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
2730 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
2731 time.localtime(0)))
2731 time.localtime(0)))
2732 timestr = 'unset'
2732 timestr = 'unset'
2733 timestr = (timestr[:locale_len] +
2733 timestr = (timestr[:locale_len] +
2734 ' ' * (locale_len - len(timestr)))
2734 ' ' * (locale_len - len(timestr)))
2735 else:
2735 else:
2736 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
2736 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
2737 time.localtime(ent[3]))
2737 time.localtime(ent[3]))
2738 if ent[1] & 020000:
2738 if ent[1] & 020000:
2739 mode = 'lnk'
2739 mode = 'lnk'
2740 else:
2740 else:
2741 mode = '%3o' % (ent[1] & 0777 & ~util.umask)
2741 mode = '%3o' % (ent[1] & 0777 & ~util.umask)
2742 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
2742 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
2743 for f in repo.dirstate.copies():
2743 for f in repo.dirstate.copies():
2744 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
2744 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
2745
2745
2746 @command('debugsub',
2746 @command('debugsub',
2747 [('r', 'rev', '',
2747 [('r', 'rev', '',
2748 _('revision to check'), _('REV'))],
2748 _('revision to check'), _('REV'))],
2749 _('[-r REV] [REV]'))
2749 _('[-r REV] [REV]'))
2750 def debugsub(ui, repo, rev=None):
2750 def debugsub(ui, repo, rev=None):
2751 ctx = scmutil.revsingle(repo, rev, None)
2751 ctx = scmutil.revsingle(repo, rev, None)
2752 for k, v in sorted(ctx.substate.items()):
2752 for k, v in sorted(ctx.substate.items()):
2753 ui.write(('path %s\n') % k)
2753 ui.write(('path %s\n') % k)
2754 ui.write((' source %s\n') % v[0])
2754 ui.write((' source %s\n') % v[0])
2755 ui.write((' revision %s\n') % v[1])
2755 ui.write((' revision %s\n') % v[1])
2756
2756
2757 @command('debugsuccessorssets',
2757 @command('debugsuccessorssets',
2758 [],
2758 [],
2759 _('[REV]'))
2759 _('[REV]'))
2760 def debugsuccessorssets(ui, repo, *revs):
2760 def debugsuccessorssets(ui, repo, *revs):
2761 """show set of successors for revision
2761 """show set of successors for revision
2762
2762
2763 A successors set of changeset A is a consistent group of revisions that
2763 A successors set of changeset A is a consistent group of revisions that
2764 succeed A. It contains non-obsolete changesets only.
2764 succeed A. It contains non-obsolete changesets only.
2765
2765
2766 In most cases a changeset A has a single successors set containing a single
2766 In most cases a changeset A has a single successors set containing a single
2767 successor (changeset A replaced by A').
2767 successor (changeset A replaced by A').
2768
2768
2769 A changeset that is made obsolete with no successors are called "pruned".
2769 A changeset that is made obsolete with no successors are called "pruned".
2770 Such changesets have no successors sets at all.
2770 Such changesets have no successors sets at all.
2771
2771
2772 A changeset that has been "split" will have a successors set containing
2772 A changeset that has been "split" will have a successors set containing
2773 more than one successor.
2773 more than one successor.
2774
2774
2775 A changeset that has been rewritten in multiple different ways is called
2775 A changeset that has been rewritten in multiple different ways is called
2776 "divergent". Such changesets have multiple successor sets (each of which
2776 "divergent". Such changesets have multiple successor sets (each of which
2777 may also be split, i.e. have multiple successors).
2777 may also be split, i.e. have multiple successors).
2778
2778
2779 Results are displayed as follows::
2779 Results are displayed as follows::
2780
2780
2781 <rev1>
2781 <rev1>
2782 <successors-1A>
2782 <successors-1A>
2783 <rev2>
2783 <rev2>
2784 <successors-2A>
2784 <successors-2A>
2785 <successors-2B1> <successors-2B2> <successors-2B3>
2785 <successors-2B1> <successors-2B2> <successors-2B3>
2786
2786
2787 Here rev2 has two possible (i.e. divergent) successors sets. The first
2787 Here rev2 has two possible (i.e. divergent) successors sets. The first
2788 holds one element, whereas the second holds three (i.e. the changeset has
2788 holds one element, whereas the second holds three (i.e. the changeset has
2789 been split).
2789 been split).
2790 """
2790 """
2791 # passed to successorssets caching computation from one call to another
2791 # passed to successorssets caching computation from one call to another
2792 cache = {}
2792 cache = {}
2793 ctx2str = str
2793 ctx2str = str
2794 node2str = short
2794 node2str = short
2795 if ui.debug():
2795 if ui.debug():
2796 def ctx2str(ctx):
2796 def ctx2str(ctx):
2797 return ctx.hex()
2797 return ctx.hex()
2798 node2str = hex
2798 node2str = hex
2799 for rev in scmutil.revrange(repo, revs):
2799 for rev in scmutil.revrange(repo, revs):
2800 ctx = repo[rev]
2800 ctx = repo[rev]
2801 ui.write('%s\n'% ctx2str(ctx))
2801 ui.write('%s\n'% ctx2str(ctx))
2802 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
2802 for succsset in obsolete.successorssets(repo, ctx.node(), cache):
2803 if succsset:
2803 if succsset:
2804 ui.write(' ')
2804 ui.write(' ')
2805 ui.write(node2str(succsset[0]))
2805 ui.write(node2str(succsset[0]))
2806 for node in succsset[1:]:
2806 for node in succsset[1:]:
2807 ui.write(' ')
2807 ui.write(' ')
2808 ui.write(node2str(node))
2808 ui.write(node2str(node))
2809 ui.write('\n')
2809 ui.write('\n')
2810
2810
2811 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
2811 @command('debugwalk', walkopts, _('[OPTION]... [FILE]...'), inferrepo=True)
2812 def debugwalk(ui, repo, *pats, **opts):
2812 def debugwalk(ui, repo, *pats, **opts):
2813 """show how files match on given patterns"""
2813 """show how files match on given patterns"""
2814 m = scmutil.match(repo[None], pats, opts)
2814 m = scmutil.match(repo[None], pats, opts)
2815 items = list(repo.walk(m))
2815 items = list(repo.walk(m))
2816 if not items:
2816 if not items:
2817 return
2817 return
2818 f = lambda fn: fn
2818 f = lambda fn: fn
2819 if ui.configbool('ui', 'slash') and os.sep != '/':
2819 if ui.configbool('ui', 'slash') and os.sep != '/':
2820 f = lambda fn: util.normpath(fn)
2820 f = lambda fn: util.normpath(fn)
2821 fmt = 'f %%-%ds %%-%ds %%s' % (
2821 fmt = 'f %%-%ds %%-%ds %%s' % (
2822 max([len(abs) for abs in items]),
2822 max([len(abs) for abs in items]),
2823 max([len(m.rel(abs)) for abs in items]))
2823 max([len(m.rel(abs)) for abs in items]))
2824 for abs in items:
2824 for abs in items:
2825 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
2825 line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
2826 ui.write("%s\n" % line.rstrip())
2826 ui.write("%s\n" % line.rstrip())
2827
2827
2828 @command('debugwireargs',
2828 @command('debugwireargs',
2829 [('', 'three', '', 'three'),
2829 [('', 'three', '', 'three'),
2830 ('', 'four', '', 'four'),
2830 ('', 'four', '', 'four'),
2831 ('', 'five', '', 'five'),
2831 ('', 'five', '', 'five'),
2832 ] + remoteopts,
2832 ] + remoteopts,
2833 _('REPO [OPTIONS]... [ONE [TWO]]'),
2833 _('REPO [OPTIONS]... [ONE [TWO]]'),
2834 norepo=True)
2834 norepo=True)
2835 def debugwireargs(ui, repopath, *vals, **opts):
2835 def debugwireargs(ui, repopath, *vals, **opts):
2836 repo = hg.peer(ui, opts, repopath)
2836 repo = hg.peer(ui, opts, repopath)
2837 for opt in remoteopts:
2837 for opt in remoteopts:
2838 del opts[opt[1]]
2838 del opts[opt[1]]
2839 args = {}
2839 args = {}
2840 for k, v in opts.iteritems():
2840 for k, v in opts.iteritems():
2841 if v:
2841 if v:
2842 args[k] = v
2842 args[k] = v
2843 # run twice to check that we don't mess up the stream for the next command
2843 # run twice to check that we don't mess up the stream for the next command
2844 res1 = repo.debugwireargs(*vals, **args)
2844 res1 = repo.debugwireargs(*vals, **args)
2845 res2 = repo.debugwireargs(*vals, **args)
2845 res2 = repo.debugwireargs(*vals, **args)
2846 ui.write("%s\n" % res1)
2846 ui.write("%s\n" % res1)
2847 if res1 != res2:
2847 if res1 != res2:
2848 ui.warn("%s\n" % res2)
2848 ui.warn("%s\n" % res2)
2849
2849
2850 @command('^diff',
2850 @command('^diff',
2851 [('r', 'rev', [], _('revision'), _('REV')),
2851 [('r', 'rev', [], _('revision'), _('REV')),
2852 ('c', 'change', '', _('change made by revision'), _('REV'))
2852 ('c', 'change', '', _('change made by revision'), _('REV'))
2853 ] + diffopts + diffopts2 + walkopts + subrepoopts,
2853 ] + diffopts + diffopts2 + walkopts + subrepoopts,
2854 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
2854 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'),
2855 inferrepo=True)
2855 inferrepo=True)
2856 def diff(ui, repo, *pats, **opts):
2856 def diff(ui, repo, *pats, **opts):
2857 """diff repository (or selected files)
2857 """diff repository (or selected files)
2858
2858
2859 Show differences between revisions for the specified files.
2859 Show differences between revisions for the specified files.
2860
2860
2861 Differences between files are shown using the unified diff format.
2861 Differences between files are shown using the unified diff format.
2862
2862
2863 .. note::
2863 .. note::
2864
2864
2865 diff may generate unexpected results for merges, as it will
2865 diff may generate unexpected results for merges, as it will
2866 default to comparing against the working directory's first
2866 default to comparing against the working directory's first
2867 parent changeset if no revisions are specified.
2867 parent changeset if no revisions are specified.
2868
2868
2869 When two revision arguments are given, then changes are shown
2869 When two revision arguments are given, then changes are shown
2870 between those revisions. If only one revision is specified then
2870 between those revisions. If only one revision is specified then
2871 that revision is compared to the working directory, and, when no
2871 that revision is compared to the working directory, and, when no
2872 revisions are specified, the working directory files are compared
2872 revisions are specified, the working directory files are compared
2873 to its parent.
2873 to its parent.
2874
2874
2875 Alternatively you can specify -c/--change with a revision to see
2875 Alternatively you can specify -c/--change with a revision to see
2876 the changes in that changeset relative to its first parent.
2876 the changes in that changeset relative to its first parent.
2877
2877
2878 Without the -a/--text option, diff will avoid generating diffs of
2878 Without the -a/--text option, diff will avoid generating diffs of
2879 files it detects as binary. With -a, diff will generate a diff
2879 files it detects as binary. With -a, diff will generate a diff
2880 anyway, probably with undesirable results.
2880 anyway, probably with undesirable results.
2881
2881
2882 Use the -g/--git option to generate diffs in the git extended diff
2882 Use the -g/--git option to generate diffs in the git extended diff
2883 format. For more information, read :hg:`help diffs`.
2883 format. For more information, read :hg:`help diffs`.
2884
2884
2885 .. container:: verbose
2885 .. container:: verbose
2886
2886
2887 Examples:
2887 Examples:
2888
2888
2889 - compare a file in the current working directory to its parent::
2889 - compare a file in the current working directory to its parent::
2890
2890
2891 hg diff foo.c
2891 hg diff foo.c
2892
2892
2893 - compare two historical versions of a directory, with rename info::
2893 - compare two historical versions of a directory, with rename info::
2894
2894
2895 hg diff --git -r 1.0:1.2 lib/
2895 hg diff --git -r 1.0:1.2 lib/
2896
2896
2897 - get change stats relative to the last change on some date::
2897 - get change stats relative to the last change on some date::
2898
2898
2899 hg diff --stat -r "date('may 2')"
2899 hg diff --stat -r "date('may 2')"
2900
2900
2901 - diff all newly-added files that contain a keyword::
2901 - diff all newly-added files that contain a keyword::
2902
2902
2903 hg diff "set:added() and grep(GNU)"
2903 hg diff "set:added() and grep(GNU)"
2904
2904
2905 - compare a revision and its parents::
2905 - compare a revision and its parents::
2906
2906
2907 hg diff -c 9353 # compare against first parent
2907 hg diff -c 9353 # compare against first parent
2908 hg diff -r 9353^:9353 # same using revset syntax
2908 hg diff -r 9353^:9353 # same using revset syntax
2909 hg diff -r 9353^2:9353 # compare against the second parent
2909 hg diff -r 9353^2:9353 # compare against the second parent
2910
2910
2911 Returns 0 on success.
2911 Returns 0 on success.
2912 """
2912 """
2913
2913
2914 revs = opts.get('rev')
2914 revs = opts.get('rev')
2915 change = opts.get('change')
2915 change = opts.get('change')
2916 stat = opts.get('stat')
2916 stat = opts.get('stat')
2917 reverse = opts.get('reverse')
2917 reverse = opts.get('reverse')
2918
2918
2919 if revs and change:
2919 if revs and change:
2920 msg = _('cannot specify --rev and --change at the same time')
2920 msg = _('cannot specify --rev and --change at the same time')
2921 raise util.Abort(msg)
2921 raise util.Abort(msg)
2922 elif change:
2922 elif change:
2923 node2 = scmutil.revsingle(repo, change, None).node()
2923 node2 = scmutil.revsingle(repo, change, None).node()
2924 node1 = repo[node2].p1().node()
2924 node1 = repo[node2].p1().node()
2925 else:
2925 else:
2926 node1, node2 = scmutil.revpair(repo, revs)
2926 node1, node2 = scmutil.revpair(repo, revs)
2927
2927
2928 if reverse:
2928 if reverse:
2929 node1, node2 = node2, node1
2929 node1, node2 = node2, node1
2930
2930
2931 diffopts = patch.diffopts(ui, opts)
2931 diffopts = patch.diffopts(ui, opts)
2932 m = scmutil.match(repo[node2], pats, opts)
2932 m = scmutil.match(repo[node2], pats, opts)
2933 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
2933 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
2934 listsubrepos=opts.get('subrepos'))
2934 listsubrepos=opts.get('subrepos'))
2935
2935
2936 @command('^export',
2936 @command('^export',
2937 [('o', 'output', '',
2937 [('o', 'output', '',
2938 _('print output to file with formatted name'), _('FORMAT')),
2938 _('print output to file with formatted name'), _('FORMAT')),
2939 ('', 'switch-parent', None, _('diff against the second parent')),
2939 ('', 'switch-parent', None, _('diff against the second parent')),
2940 ('r', 'rev', [], _('revisions to export'), _('REV')),
2940 ('r', 'rev', [], _('revisions to export'), _('REV')),
2941 ] + diffopts,
2941 ] + diffopts,
2942 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
2942 _('[OPTION]... [-o OUTFILESPEC] [-r] [REV]...'))
2943 def export(ui, repo, *changesets, **opts):
2943 def export(ui, repo, *changesets, **opts):
2944 """dump the header and diffs for one or more changesets
2944 """dump the header and diffs for one or more changesets
2945
2945
2946 Print the changeset header and diffs for one or more revisions.
2946 Print the changeset header and diffs for one or more revisions.
2947 If no revision is given, the parent of the working directory is used.
2947 If no revision is given, the parent of the working directory is used.
2948
2948
2949 The information shown in the changeset header is: author, date,
2949 The information shown in the changeset header is: author, date,
2950 branch name (if non-default), changeset hash, parent(s) and commit
2950 branch name (if non-default), changeset hash, parent(s) and commit
2951 comment.
2951 comment.
2952
2952
2953 .. note::
2953 .. note::
2954
2954
2955 export may generate unexpected diff output for merge
2955 export may generate unexpected diff output for merge
2956 changesets, as it will compare the merge changeset against its
2956 changesets, as it will compare the merge changeset against its
2957 first parent only.
2957 first parent only.
2958
2958
2959 Output may be to a file, in which case the name of the file is
2959 Output may be to a file, in which case the name of the file is
2960 given using a format string. The formatting rules are as follows:
2960 given using a format string. The formatting rules are as follows:
2961
2961
2962 :``%%``: literal "%" character
2962 :``%%``: literal "%" character
2963 :``%H``: changeset hash (40 hexadecimal digits)
2963 :``%H``: changeset hash (40 hexadecimal digits)
2964 :``%N``: number of patches being generated
2964 :``%N``: number of patches being generated
2965 :``%R``: changeset revision number
2965 :``%R``: changeset revision number
2966 :``%b``: basename of the exporting repository
2966 :``%b``: basename of the exporting repository
2967 :``%h``: short-form changeset hash (12 hexadecimal digits)
2967 :``%h``: short-form changeset hash (12 hexadecimal digits)
2968 :``%m``: first line of the commit message (only alphanumeric characters)
2968 :``%m``: first line of the commit message (only alphanumeric characters)
2969 :``%n``: zero-padded sequence number, starting at 1
2969 :``%n``: zero-padded sequence number, starting at 1
2970 :``%r``: zero-padded changeset revision number
2970 :``%r``: zero-padded changeset revision number
2971
2971
2972 Without the -a/--text option, export will avoid generating diffs
2972 Without the -a/--text option, export will avoid generating diffs
2973 of files it detects as binary. With -a, export will generate a
2973 of files it detects as binary. With -a, export will generate a
2974 diff anyway, probably with undesirable results.
2974 diff anyway, probably with undesirable results.
2975
2975
2976 Use the -g/--git option to generate diffs in the git extended diff
2976 Use the -g/--git option to generate diffs in the git extended diff
2977 format. See :hg:`help diffs` for more information.
2977 format. See :hg:`help diffs` for more information.
2978
2978
2979 With the --switch-parent option, the diff will be against the
2979 With the --switch-parent option, the diff will be against the
2980 second parent. It can be useful to review a merge.
2980 second parent. It can be useful to review a merge.
2981
2981
2982 .. container:: verbose
2982 .. container:: verbose
2983
2983
2984 Examples:
2984 Examples:
2985
2985
2986 - use export and import to transplant a bugfix to the current
2986 - use export and import to transplant a bugfix to the current
2987 branch::
2987 branch::
2988
2988
2989 hg export -r 9353 | hg import -
2989 hg export -r 9353 | hg import -
2990
2990
2991 - export all the changesets between two revisions to a file with
2991 - export all the changesets between two revisions to a file with
2992 rename information::
2992 rename information::
2993
2993
2994 hg export --git -r 123:150 > changes.txt
2994 hg export --git -r 123:150 > changes.txt
2995
2995
2996 - split outgoing changes into a series of patches with
2996 - split outgoing changes into a series of patches with
2997 descriptive names::
2997 descriptive names::
2998
2998
2999 hg export -r "outgoing()" -o "%n-%m.patch"
2999 hg export -r "outgoing()" -o "%n-%m.patch"
3000
3000
3001 Returns 0 on success.
3001 Returns 0 on success.
3002 """
3002 """
3003 changesets += tuple(opts.get('rev', []))
3003 changesets += tuple(opts.get('rev', []))
3004 if not changesets:
3004 if not changesets:
3005 changesets = ['.']
3005 changesets = ['.']
3006 revs = scmutil.revrange(repo, changesets)
3006 revs = scmutil.revrange(repo, changesets)
3007 if not revs:
3007 if not revs:
3008 raise util.Abort(_("export requires at least one changeset"))
3008 raise util.Abort(_("export requires at least one changeset"))
3009 if len(revs) > 1:
3009 if len(revs) > 1:
3010 ui.note(_('exporting patches:\n'))
3010 ui.note(_('exporting patches:\n'))
3011 else:
3011 else:
3012 ui.note(_('exporting patch:\n'))
3012 ui.note(_('exporting patch:\n'))
3013 cmdutil.export(repo, revs, template=opts.get('output'),
3013 cmdutil.export(repo, revs, template=opts.get('output'),
3014 switch_parent=opts.get('switch_parent'),
3014 switch_parent=opts.get('switch_parent'),
3015 opts=patch.diffopts(ui, opts))
3015 opts=patch.diffopts(ui, opts))
3016
3016
3017 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3017 @command('^forget', walkopts, _('[OPTION]... FILE...'), inferrepo=True)
3018 def forget(ui, repo, *pats, **opts):
3018 def forget(ui, repo, *pats, **opts):
3019 """forget the specified files on the next commit
3019 """forget the specified files on the next commit
3020
3020
3021 Mark the specified files so they will no longer be tracked
3021 Mark the specified files so they will no longer be tracked
3022 after the next commit.
3022 after the next commit.
3023
3023
3024 This only removes files from the current branch, not from the
3024 This only removes files from the current branch, not from the
3025 entire project history, and it does not delete them from the
3025 entire project history, and it does not delete them from the
3026 working directory.
3026 working directory.
3027
3027
3028 To undo a forget before the next commit, see :hg:`add`.
3028 To undo a forget before the next commit, see :hg:`add`.
3029
3029
3030 .. container:: verbose
3030 .. container:: verbose
3031
3031
3032 Examples:
3032 Examples:
3033
3033
3034 - forget newly-added binary files::
3034 - forget newly-added binary files::
3035
3035
3036 hg forget "set:added() and binary()"
3036 hg forget "set:added() and binary()"
3037
3037
3038 - forget files that would be excluded by .hgignore::
3038 - forget files that would be excluded by .hgignore::
3039
3039
3040 hg forget "set:hgignore()"
3040 hg forget "set:hgignore()"
3041
3041
3042 Returns 0 on success.
3042 Returns 0 on success.
3043 """
3043 """
3044
3044
3045 if not pats:
3045 if not pats:
3046 raise util.Abort(_('no files specified'))
3046 raise util.Abort(_('no files specified'))
3047
3047
3048 m = scmutil.match(repo[None], pats, opts)
3048 m = scmutil.match(repo[None], pats, opts)
3049 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3049 rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
3050 return rejected and 1 or 0
3050 return rejected and 1 or 0
3051
3051
3052 @command(
3052 @command(
3053 'graft',
3053 'graft',
3054 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3054 [('r', 'rev', [], _('revisions to graft'), _('REV')),
3055 ('c', 'continue', False, _('resume interrupted graft')),
3055 ('c', 'continue', False, _('resume interrupted graft')),
3056 ('e', 'edit', False, _('invoke editor on commit messages')),
3056 ('e', 'edit', False, _('invoke editor on commit messages')),
3057 ('', 'log', None, _('append graft info to log message')),
3057 ('', 'log', None, _('append graft info to log message')),
3058 ('D', 'currentdate', False,
3058 ('D', 'currentdate', False,
3059 _('record the current date as commit date')),
3059 _('record the current date as commit date')),
3060 ('U', 'currentuser', False,
3060 ('U', 'currentuser', False,
3061 _('record the current user as committer'), _('DATE'))]
3061 _('record the current user as committer'), _('DATE'))]
3062 + commitopts2 + mergetoolopts + dryrunopts,
3062 + commitopts2 + mergetoolopts + dryrunopts,
3063 _('[OPTION]... [-r] REV...'))
3063 _('[OPTION]... [-r] REV...'))
3064 def graft(ui, repo, *revs, **opts):
3064 def graft(ui, repo, *revs, **opts):
3065 '''copy changes from other branches onto the current branch
3065 '''copy changes from other branches onto the current branch
3066
3066
3067 This command uses Mercurial's merge logic to copy individual
3067 This command uses Mercurial's merge logic to copy individual
3068 changes from other branches without merging branches in the
3068 changes from other branches without merging branches in the
3069 history graph. This is sometimes known as 'backporting' or
3069 history graph. This is sometimes known as 'backporting' or
3070 'cherry-picking'. By default, graft will copy user, date, and
3070 'cherry-picking'. By default, graft will copy user, date, and
3071 description from the source changesets.
3071 description from the source changesets.
3072
3072
3073 Changesets that are ancestors of the current revision, that have
3073 Changesets that are ancestors of the current revision, that have
3074 already been grafted, or that are merges will be skipped.
3074 already been grafted, or that are merges will be skipped.
3075
3075
3076 If --log is specified, log messages will have a comment appended
3076 If --log is specified, log messages will have a comment appended
3077 of the form::
3077 of the form::
3078
3078
3079 (grafted from CHANGESETHASH)
3079 (grafted from CHANGESETHASH)
3080
3080
3081 If a graft merge results in conflicts, the graft process is
3081 If a graft merge results in conflicts, the graft process is
3082 interrupted so that the current merge can be manually resolved.
3082 interrupted so that the current merge can be manually resolved.
3083 Once all conflicts are addressed, the graft process can be
3083 Once all conflicts are addressed, the graft process can be
3084 continued with the -c/--continue option.
3084 continued with the -c/--continue option.
3085
3085
3086 .. note::
3086 .. note::
3087
3087
3088 The -c/--continue option does not reapply earlier options.
3088 The -c/--continue option does not reapply earlier options.
3089
3089
3090 .. container:: verbose
3090 .. container:: verbose
3091
3091
3092 Examples:
3092 Examples:
3093
3093
3094 - copy a single change to the stable branch and edit its description::
3094 - copy a single change to the stable branch and edit its description::
3095
3095
3096 hg update stable
3096 hg update stable
3097 hg graft --edit 9393
3097 hg graft --edit 9393
3098
3098
3099 - graft a range of changesets with one exception, updating dates::
3099 - graft a range of changesets with one exception, updating dates::
3100
3100
3101 hg graft -D "2085::2093 and not 2091"
3101 hg graft -D "2085::2093 and not 2091"
3102
3102
3103 - continue a graft after resolving conflicts::
3103 - continue a graft after resolving conflicts::
3104
3104
3105 hg graft -c
3105 hg graft -c
3106
3106
3107 - show the source of a grafted changeset::
3107 - show the source of a grafted changeset::
3108
3108
3109 hg log --debug -r .
3109 hg log --debug -r .
3110
3110
3111 Returns 0 on successful completion.
3111 Returns 0 on successful completion.
3112 '''
3112 '''
3113
3113
3114 revs = list(revs)
3114 revs = list(revs)
3115 revs.extend(opts['rev'])
3115 revs.extend(opts['rev'])
3116
3116
3117 if not opts.get('user') and opts.get('currentuser'):
3117 if not opts.get('user') and opts.get('currentuser'):
3118 opts['user'] = ui.username()
3118 opts['user'] = ui.username()
3119 if not opts.get('date') and opts.get('currentdate'):
3119 if not opts.get('date') and opts.get('currentdate'):
3120 opts['date'] = "%d %d" % util.makedate()
3120 opts['date'] = "%d %d" % util.makedate()
3121
3121
3122 editor = cmdutil.getcommiteditor(**opts)
3122 editor = cmdutil.getcommiteditor(**opts)
3123
3123
3124 cont = False
3124 cont = False
3125 if opts['continue']:
3125 if opts['continue']:
3126 cont = True
3126 cont = True
3127 if revs:
3127 if revs:
3128 raise util.Abort(_("can't specify --continue and revisions"))
3128 raise util.Abort(_("can't specify --continue and revisions"))
3129 # read in unfinished revisions
3129 # read in unfinished revisions
3130 try:
3130 try:
3131 nodes = repo.opener.read('graftstate').splitlines()
3131 nodes = repo.opener.read('graftstate').splitlines()
3132 revs = [repo[node].rev() for node in nodes]
3132 revs = [repo[node].rev() for node in nodes]
3133 except IOError, inst:
3133 except IOError, inst:
3134 if inst.errno != errno.ENOENT:
3134 if inst.errno != errno.ENOENT:
3135 raise
3135 raise
3136 raise util.Abort(_("no graft state found, can't continue"))
3136 raise util.Abort(_("no graft state found, can't continue"))
3137 else:
3137 else:
3138 cmdutil.checkunfinished(repo)
3138 cmdutil.checkunfinished(repo)
3139 cmdutil.bailifchanged(repo)
3139 cmdutil.bailifchanged(repo)
3140 if not revs:
3140 if not revs:
3141 raise util.Abort(_('no revisions specified'))
3141 raise util.Abort(_('no revisions specified'))
3142 revs = scmutil.revrange(repo, revs)
3142 revs = scmutil.revrange(repo, revs)
3143
3143
3144 # check for merges
3144 # check for merges
3145 for rev in repo.revs('%ld and merge()', revs):
3145 for rev in repo.revs('%ld and merge()', revs):
3146 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3146 ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
3147 revs.remove(rev)
3147 revs.remove(rev)
3148 if not revs:
3148 if not revs:
3149 return -1
3149 return -1
3150
3150
3151 # check for ancestors of dest branch
3151 # check for ancestors of dest branch
3152 crev = repo['.'].rev()
3152 crev = repo['.'].rev()
3153 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3153 ancestors = repo.changelog.ancestors([crev], inclusive=True)
3154 # Cannot use x.remove(y) on smart set, this has to be a list.
3154 # Cannot use x.remove(y) on smart set, this has to be a list.
3155 # XXX make this lazy in the future
3155 # XXX make this lazy in the future
3156 revs = list(revs)
3156 revs = list(revs)
3157 # don't mutate while iterating, create a copy
3157 # don't mutate while iterating, create a copy
3158 for rev in list(revs):
3158 for rev in list(revs):
3159 if rev in ancestors:
3159 if rev in ancestors:
3160 ui.warn(_('skipping ancestor revision %s\n') % rev)
3160 ui.warn(_('skipping ancestor revision %s\n') % rev)
3161 # XXX remove on list is slow
3161 # XXX remove on list is slow
3162 revs.remove(rev)
3162 revs.remove(rev)
3163 if not revs:
3163 if not revs:
3164 return -1
3164 return -1
3165
3165
3166 # analyze revs for earlier grafts
3166 # analyze revs for earlier grafts
3167 ids = {}
3167 ids = {}
3168 for ctx in repo.set("%ld", revs):
3168 for ctx in repo.set("%ld", revs):
3169 ids[ctx.hex()] = ctx.rev()
3169 ids[ctx.hex()] = ctx.rev()
3170 n = ctx.extra().get('source')
3170 n = ctx.extra().get('source')
3171 if n:
3171 if n:
3172 ids[n] = ctx.rev()
3172 ids[n] = ctx.rev()
3173
3173
3174 # check ancestors for earlier grafts
3174 # check ancestors for earlier grafts
3175 ui.debug('scanning for duplicate grafts\n')
3175 ui.debug('scanning for duplicate grafts\n')
3176
3176
3177 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3177 for rev in repo.changelog.findmissingrevs(revs, [crev]):
3178 ctx = repo[rev]
3178 ctx = repo[rev]
3179 n = ctx.extra().get('source')
3179 n = ctx.extra().get('source')
3180 if n in ids:
3180 if n in ids:
3181 r = repo[n].rev()
3181 r = repo[n].rev()
3182 if r in revs:
3182 if r in revs:
3183 ui.warn(_('skipping revision %s (already grafted to %s)\n')
3183 ui.warn(_('skipping revision %s (already grafted to %s)\n')
3184 % (r, rev))
3184 % (r, rev))
3185 revs.remove(r)
3185 revs.remove(r)
3186 elif ids[n] in revs:
3186 elif ids[n] in revs:
3187 ui.warn(_('skipping already grafted revision %s '
3187 ui.warn(_('skipping already grafted revision %s '
3188 '(%s also has origin %d)\n') % (ids[n], rev, r))
3188 '(%s also has origin %d)\n') % (ids[n], rev, r))
3189 revs.remove(ids[n])
3189 revs.remove(ids[n])
3190 elif ctx.hex() in ids:
3190 elif ctx.hex() in ids:
3191 r = ids[ctx.hex()]
3191 r = ids[ctx.hex()]
3192 ui.warn(_('skipping already grafted revision %s '
3192 ui.warn(_('skipping already grafted revision %s '
3193 '(was grafted from %d)\n') % (r, rev))
3193 '(was grafted from %d)\n') % (r, rev))
3194 revs.remove(r)
3194 revs.remove(r)
3195 if not revs:
3195 if not revs:
3196 return -1
3196 return -1
3197
3197
3198 wlock = repo.wlock()
3198 wlock = repo.wlock()
3199 try:
3199 try:
3200 current = repo['.']
3200 current = repo['.']
3201 for pos, ctx in enumerate(repo.set("%ld", revs)):
3201 for pos, ctx in enumerate(repo.set("%ld", revs)):
3202
3202
3203 ui.status(_('grafting revision %s\n') % ctx.rev())
3203 ui.status(_('grafting revision %s\n') % ctx.rev())
3204 if opts.get('dry_run'):
3204 if opts.get('dry_run'):
3205 continue
3205 continue
3206
3206
3207 source = ctx.extra().get('source')
3207 source = ctx.extra().get('source')
3208 if not source:
3208 if not source:
3209 source = ctx.hex()
3209 source = ctx.hex()
3210 extra = {'source': source}
3210 extra = {'source': source}
3211 user = ctx.user()
3211 user = ctx.user()
3212 if opts.get('user'):
3212 if opts.get('user'):
3213 user = opts['user']
3213 user = opts['user']
3214 date = ctx.date()
3214 date = ctx.date()
3215 if opts.get('date'):
3215 if opts.get('date'):
3216 date = opts['date']
3216 date = opts['date']
3217 message = ctx.description()
3217 message = ctx.description()
3218 if opts.get('log'):
3218 if opts.get('log'):
3219 message += '\n(grafted from %s)' % ctx.hex()
3219 message += '\n(grafted from %s)' % ctx.hex()
3220
3220
3221 # we don't merge the first commit when continuing
3221 # we don't merge the first commit when continuing
3222 if not cont:
3222 if not cont:
3223 # perform the graft merge with p1(rev) as 'ancestor'
3223 # perform the graft merge with p1(rev) as 'ancestor'
3224 try:
3224 try:
3225 # ui.forcemerge is an internal variable, do not document
3225 # ui.forcemerge is an internal variable, do not document
3226 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3226 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
3227 'graft')
3227 'graft')
3228 stats = mergemod.update(repo, ctx.node(), True, True, False,
3228 stats = mergemod.update(repo, ctx.node(), True, True, False,
3229 ctx.p1().node(),
3229 ctx.p1().node(),
3230 labels=['local', 'graft'])
3230 labels=['local', 'graft'])
3231 finally:
3231 finally:
3232 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3232 repo.ui.setconfig('ui', 'forcemerge', '', 'graft')
3233 # report any conflicts
3233 # report any conflicts
3234 if stats and stats[3] > 0:
3234 if stats and stats[3] > 0:
3235 # write out state for --continue
3235 # write out state for --continue
3236 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3236 nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
3237 repo.opener.write('graftstate', ''.join(nodelines))
3237 repo.opener.write('graftstate', ''.join(nodelines))
3238 raise util.Abort(
3238 raise util.Abort(
3239 _("unresolved conflicts, can't continue"),
3239 _("unresolved conflicts, can't continue"),
3240 hint=_('use hg resolve and hg graft --continue'))
3240 hint=_('use hg resolve and hg graft --continue'))
3241 else:
3241 else:
3242 cont = False
3242 cont = False
3243
3243
3244 # drop the second merge parent
3244 # drop the second merge parent
3245 repo.setparents(current.node(), nullid)
3245 repo.setparents(current.node(), nullid)
3246 repo.dirstate.write()
3246 repo.dirstate.write()
3247 # fix up dirstate for copies and renames
3247 # fix up dirstate for copies and renames
3248 cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev())
3248 cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev())
3249
3249
3250 # commit
3250 # commit
3251 node = repo.commit(text=message, user=user,
3251 node = repo.commit(text=message, user=user,
3252 date=date, extra=extra, editor=editor)
3252 date=date, extra=extra, editor=editor)
3253 if node is None:
3253 if node is None:
3254 ui.status(_('graft for revision %s is empty\n') % ctx.rev())
3254 ui.status(_('graft for revision %s is empty\n') % ctx.rev())
3255 else:
3255 else:
3256 current = repo[node]
3256 current = repo[node]
3257 finally:
3257 finally:
3258 wlock.release()
3258 wlock.release()
3259
3259
3260 # remove state when we complete successfully
3260 # remove state when we complete successfully
3261 if not opts.get('dry_run'):
3261 if not opts.get('dry_run'):
3262 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3262 util.unlinkpath(repo.join('graftstate'), ignoremissing=True)
3263
3263
3264 return 0
3264 return 0
3265
3265
3266 @command('grep',
3266 @command('grep',
3267 [('0', 'print0', None, _('end fields with NUL')),
3267 [('0', 'print0', None, _('end fields with NUL')),
3268 ('', 'all', None, _('print all revisions that match')),
3268 ('', 'all', None, _('print all revisions that match')),
3269 ('a', 'text', None, _('treat all files as text')),
3269 ('a', 'text', None, _('treat all files as text')),
3270 ('f', 'follow', None,
3270 ('f', 'follow', None,
3271 _('follow changeset history,'
3271 _('follow changeset history,'
3272 ' or file history across copies and renames')),
3272 ' or file history across copies and renames')),
3273 ('i', 'ignore-case', None, _('ignore case when matching')),
3273 ('i', 'ignore-case', None, _('ignore case when matching')),
3274 ('l', 'files-with-matches', None,
3274 ('l', 'files-with-matches', None,
3275 _('print only filenames and revisions that match')),
3275 _('print only filenames and revisions that match')),
3276 ('n', 'line-number', None, _('print matching line numbers')),
3276 ('n', 'line-number', None, _('print matching line numbers')),
3277 ('r', 'rev', [],
3277 ('r', 'rev', [],
3278 _('only search files changed within revision range'), _('REV')),
3278 _('only search files changed within revision range'), _('REV')),
3279 ('u', 'user', None, _('list the author (long with -v)')),
3279 ('u', 'user', None, _('list the author (long with -v)')),
3280 ('d', 'date', None, _('list the date (short with -q)')),
3280 ('d', 'date', None, _('list the date (short with -q)')),
3281 ] + walkopts,
3281 ] + walkopts,
3282 _('[OPTION]... PATTERN [FILE]...'),
3282 _('[OPTION]... PATTERN [FILE]...'),
3283 inferrepo=True)
3283 inferrepo=True)
3284 def grep(ui, repo, pattern, *pats, **opts):
3284 def grep(ui, repo, pattern, *pats, **opts):
3285 """search for a pattern in specified files and revisions
3285 """search for a pattern in specified files and revisions
3286
3286
3287 Search revisions of files for a regular expression.
3287 Search revisions of files for a regular expression.
3288
3288
3289 This command behaves differently than Unix grep. It only accepts
3289 This command behaves differently than Unix grep. It only accepts
3290 Python/Perl regexps. It searches repository history, not the
3290 Python/Perl regexps. It searches repository history, not the
3291 working directory. It always prints the revision number in which a
3291 working directory. It always prints the revision number in which a
3292 match appears.
3292 match appears.
3293
3293
3294 By default, grep only prints output for the first revision of a
3294 By default, grep only prints output for the first revision of a
3295 file in which it finds a match. To get it to print every revision
3295 file in which it finds a match. To get it to print every revision
3296 that contains a change in match status ("-" for a match that
3296 that contains a change in match status ("-" for a match that
3297 becomes a non-match, or "+" for a non-match that becomes a match),
3297 becomes a non-match, or "+" for a non-match that becomes a match),
3298 use the --all flag.
3298 use the --all flag.
3299
3299
3300 Returns 0 if a match is found, 1 otherwise.
3300 Returns 0 if a match is found, 1 otherwise.
3301 """
3301 """
3302 reflags = re.M
3302 reflags = re.M
3303 if opts.get('ignore_case'):
3303 if opts.get('ignore_case'):
3304 reflags |= re.I
3304 reflags |= re.I
3305 try:
3305 try:
3306 regexp = util.re.compile(pattern, reflags)
3306 regexp = util.re.compile(pattern, reflags)
3307 except re.error, inst:
3307 except re.error, inst:
3308 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3308 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
3309 return 1
3309 return 1
3310 sep, eol = ':', '\n'
3310 sep, eol = ':', '\n'
3311 if opts.get('print0'):
3311 if opts.get('print0'):
3312 sep = eol = '\0'
3312 sep = eol = '\0'
3313
3313
3314 getfile = util.lrucachefunc(repo.file)
3314 getfile = util.lrucachefunc(repo.file)
3315
3315
3316 def matchlines(body):
3316 def matchlines(body):
3317 begin = 0
3317 begin = 0
3318 linenum = 0
3318 linenum = 0
3319 while begin < len(body):
3319 while begin < len(body):
3320 match = regexp.search(body, begin)
3320 match = regexp.search(body, begin)
3321 if not match:
3321 if not match:
3322 break
3322 break
3323 mstart, mend = match.span()
3323 mstart, mend = match.span()
3324 linenum += body.count('\n', begin, mstart) + 1
3324 linenum += body.count('\n', begin, mstart) + 1
3325 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3325 lstart = body.rfind('\n', begin, mstart) + 1 or begin
3326 begin = body.find('\n', mend) + 1 or len(body) + 1
3326 begin = body.find('\n', mend) + 1 or len(body) + 1
3327 lend = begin - 1
3327 lend = begin - 1
3328 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3328 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
3329
3329
3330 class linestate(object):
3330 class linestate(object):
3331 def __init__(self, line, linenum, colstart, colend):
3331 def __init__(self, line, linenum, colstart, colend):
3332 self.line = line
3332 self.line = line
3333 self.linenum = linenum
3333 self.linenum = linenum
3334 self.colstart = colstart
3334 self.colstart = colstart
3335 self.colend = colend
3335 self.colend = colend
3336
3336
3337 def __hash__(self):
3337 def __hash__(self):
3338 return hash((self.linenum, self.line))
3338 return hash((self.linenum, self.line))
3339
3339
3340 def __eq__(self, other):
3340 def __eq__(self, other):
3341 return self.line == other.line
3341 return self.line == other.line
3342
3342
3343 def __iter__(self):
3343 def __iter__(self):
3344 yield (self.line[:self.colstart], '')
3344 yield (self.line[:self.colstart], '')
3345 yield (self.line[self.colstart:self.colend], 'grep.match')
3345 yield (self.line[self.colstart:self.colend], 'grep.match')
3346 rest = self.line[self.colend:]
3346 rest = self.line[self.colend:]
3347 while rest != '':
3347 while rest != '':
3348 match = regexp.search(rest)
3348 match = regexp.search(rest)
3349 if not match:
3349 if not match:
3350 yield (rest, '')
3350 yield (rest, '')
3351 break
3351 break
3352 mstart, mend = match.span()
3352 mstart, mend = match.span()
3353 yield (rest[:mstart], '')
3353 yield (rest[:mstart], '')
3354 yield (rest[mstart:mend], 'grep.match')
3354 yield (rest[mstart:mend], 'grep.match')
3355 rest = rest[mend:]
3355 rest = rest[mend:]
3356
3356
3357 matches = {}
3357 matches = {}
3358 copies = {}
3358 copies = {}
3359 def grepbody(fn, rev, body):
3359 def grepbody(fn, rev, body):
3360 matches[rev].setdefault(fn, [])
3360 matches[rev].setdefault(fn, [])
3361 m = matches[rev][fn]
3361 m = matches[rev][fn]
3362 for lnum, cstart, cend, line in matchlines(body):
3362 for lnum, cstart, cend, line in matchlines(body):
3363 s = linestate(line, lnum, cstart, cend)
3363 s = linestate(line, lnum, cstart, cend)
3364 m.append(s)
3364 m.append(s)
3365
3365
3366 def difflinestates(a, b):
3366 def difflinestates(a, b):
3367 sm = difflib.SequenceMatcher(None, a, b)
3367 sm = difflib.SequenceMatcher(None, a, b)
3368 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3368 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
3369 if tag == 'insert':
3369 if tag == 'insert':
3370 for i in xrange(blo, bhi):
3370 for i in xrange(blo, bhi):
3371 yield ('+', b[i])
3371 yield ('+', b[i])
3372 elif tag == 'delete':
3372 elif tag == 'delete':
3373 for i in xrange(alo, ahi):
3373 for i in xrange(alo, ahi):
3374 yield ('-', a[i])
3374 yield ('-', a[i])
3375 elif tag == 'replace':
3375 elif tag == 'replace':
3376 for i in xrange(alo, ahi):
3376 for i in xrange(alo, ahi):
3377 yield ('-', a[i])
3377 yield ('-', a[i])
3378 for i in xrange(blo, bhi):
3378 for i in xrange(blo, bhi):
3379 yield ('+', b[i])
3379 yield ('+', b[i])
3380
3380
3381 def display(fn, ctx, pstates, states):
3381 def display(fn, ctx, pstates, states):
3382 rev = ctx.rev()
3382 rev = ctx.rev()
3383 datefunc = ui.quiet and util.shortdate or util.datestr
3383 datefunc = ui.quiet and util.shortdate or util.datestr
3384 found = False
3384 found = False
3385 @util.cachefunc
3385 @util.cachefunc
3386 def binary():
3386 def binary():
3387 flog = getfile(fn)
3387 flog = getfile(fn)
3388 return util.binary(flog.read(ctx.filenode(fn)))
3388 return util.binary(flog.read(ctx.filenode(fn)))
3389
3389
3390 if opts.get('all'):
3390 if opts.get('all'):
3391 iter = difflinestates(pstates, states)
3391 iter = difflinestates(pstates, states)
3392 else:
3392 else:
3393 iter = [('', l) for l in states]
3393 iter = [('', l) for l in states]
3394 for change, l in iter:
3394 for change, l in iter:
3395 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3395 cols = [(fn, 'grep.filename'), (str(rev), 'grep.rev')]
3396
3396
3397 if opts.get('line_number'):
3397 if opts.get('line_number'):
3398 cols.append((str(l.linenum), 'grep.linenumber'))
3398 cols.append((str(l.linenum), 'grep.linenumber'))
3399 if opts.get('all'):
3399 if opts.get('all'):
3400 cols.append((change, 'grep.change'))
3400 cols.append((change, 'grep.change'))
3401 if opts.get('user'):
3401 if opts.get('user'):
3402 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3402 cols.append((ui.shortuser(ctx.user()), 'grep.user'))
3403 if opts.get('date'):
3403 if opts.get('date'):
3404 cols.append((datefunc(ctx.date()), 'grep.date'))
3404 cols.append((datefunc(ctx.date()), 'grep.date'))
3405 for col, label in cols[:-1]:
3405 for col, label in cols[:-1]:
3406 ui.write(col, label=label)
3406 ui.write(col, label=label)
3407 ui.write(sep, label='grep.sep')
3407 ui.write(sep, label='grep.sep')
3408 ui.write(cols[-1][0], label=cols[-1][1])
3408 ui.write(cols[-1][0], label=cols[-1][1])
3409 if not opts.get('files_with_matches'):
3409 if not opts.get('files_with_matches'):
3410 ui.write(sep, label='grep.sep')
3410 ui.write(sep, label='grep.sep')
3411 if not opts.get('text') and binary():
3411 if not opts.get('text') and binary():
3412 ui.write(" Binary file matches")
3412 ui.write(" Binary file matches")
3413 else:
3413 else:
3414 for s, label in l:
3414 for s, label in l:
3415 ui.write(s, label=label)
3415 ui.write(s, label=label)
3416 ui.write(eol)
3416 ui.write(eol)
3417 found = True
3417 found = True
3418 if opts.get('files_with_matches'):
3418 if opts.get('files_with_matches'):
3419 break
3419 break
3420 return found
3420 return found
3421
3421
3422 skip = {}
3422 skip = {}
3423 revfiles = {}
3423 revfiles = {}
3424 matchfn = scmutil.match(repo[None], pats, opts)
3424 matchfn = scmutil.match(repo[None], pats, opts)
3425 found = False
3425 found = False
3426 follow = opts.get('follow')
3426 follow = opts.get('follow')
3427
3427
3428 def prep(ctx, fns):
3428 def prep(ctx, fns):
3429 rev = ctx.rev()
3429 rev = ctx.rev()
3430 pctx = ctx.p1()
3430 pctx = ctx.p1()
3431 parent = pctx.rev()
3431 parent = pctx.rev()
3432 matches.setdefault(rev, {})
3432 matches.setdefault(rev, {})
3433 matches.setdefault(parent, {})
3433 matches.setdefault(parent, {})
3434 files = revfiles.setdefault(rev, [])
3434 files = revfiles.setdefault(rev, [])
3435 for fn in fns:
3435 for fn in fns:
3436 flog = getfile(fn)
3436 flog = getfile(fn)
3437 try:
3437 try:
3438 fnode = ctx.filenode(fn)
3438 fnode = ctx.filenode(fn)
3439 except error.LookupError:
3439 except error.LookupError:
3440 continue
3440 continue
3441
3441
3442 copied = flog.renamed(fnode)
3442 copied = flog.renamed(fnode)
3443 copy = follow and copied and copied[0]
3443 copy = follow and copied and copied[0]
3444 if copy:
3444 if copy:
3445 copies.setdefault(rev, {})[fn] = copy
3445 copies.setdefault(rev, {})[fn] = copy
3446 if fn in skip:
3446 if fn in skip:
3447 if copy:
3447 if copy:
3448 skip[copy] = True
3448 skip[copy] = True
3449 continue
3449 continue
3450 files.append(fn)
3450 files.append(fn)
3451
3451
3452 if fn not in matches[rev]:
3452 if fn not in matches[rev]:
3453 grepbody(fn, rev, flog.read(fnode))
3453 grepbody(fn, rev, flog.read(fnode))
3454
3454
3455 pfn = copy or fn
3455 pfn = copy or fn
3456 if pfn not in matches[parent]:
3456 if pfn not in matches[parent]:
3457 try:
3457 try:
3458 fnode = pctx.filenode(pfn)
3458 fnode = pctx.filenode(pfn)
3459 grepbody(pfn, parent, flog.read(fnode))
3459 grepbody(pfn, parent, flog.read(fnode))
3460 except error.LookupError:
3460 except error.LookupError:
3461 pass
3461 pass
3462
3462
3463 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3463 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
3464 rev = ctx.rev()
3464 rev = ctx.rev()
3465 parent = ctx.p1().rev()
3465 parent = ctx.p1().rev()
3466 for fn in sorted(revfiles.get(rev, [])):
3466 for fn in sorted(revfiles.get(rev, [])):
3467 states = matches[rev][fn]
3467 states = matches[rev][fn]
3468 copy = copies.get(rev, {}).get(fn)
3468 copy = copies.get(rev, {}).get(fn)
3469 if fn in skip:
3469 if fn in skip:
3470 if copy:
3470 if copy:
3471 skip[copy] = True
3471 skip[copy] = True
3472 continue
3472 continue
3473 pstates = matches.get(parent, {}).get(copy or fn, [])
3473 pstates = matches.get(parent, {}).get(copy or fn, [])
3474 if pstates or states:
3474 if pstates or states:
3475 r = display(fn, ctx, pstates, states)
3475 r = display(fn, ctx, pstates, states)
3476 found = found or r
3476 found = found or r
3477 if r and not opts.get('all'):
3477 if r and not opts.get('all'):
3478 skip[fn] = True
3478 skip[fn] = True
3479 if copy:
3479 if copy:
3480 skip[copy] = True
3480 skip[copy] = True
3481 del matches[rev]
3481 del matches[rev]
3482 del revfiles[rev]
3482 del revfiles[rev]
3483
3483
3484 return not found
3484 return not found
3485
3485
3486 @command('heads',
3486 @command('heads',
3487 [('r', 'rev', '',
3487 [('r', 'rev', '',
3488 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
3488 _('show only heads which are descendants of STARTREV'), _('STARTREV')),
3489 ('t', 'topo', False, _('show topological heads only')),
3489 ('t', 'topo', False, _('show topological heads only')),
3490 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
3490 ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
3491 ('c', 'closed', False, _('show normal and closed branch heads')),
3491 ('c', 'closed', False, _('show normal and closed branch heads')),
3492 ] + templateopts,
3492 ] + templateopts,
3493 _('[-ct] [-r STARTREV] [REV]...'))
3493 _('[-ct] [-r STARTREV] [REV]...'))
3494 def heads(ui, repo, *branchrevs, **opts):
3494 def heads(ui, repo, *branchrevs, **opts):
3495 """show branch heads
3495 """show branch heads
3496
3496
3497 With no arguments, show all open branch heads in the repository.
3497 With no arguments, show all open branch heads in the repository.
3498 Branch heads are changesets that have no descendants on the
3498 Branch heads are changesets that have no descendants on the
3499 same branch. They are where development generally takes place and
3499 same branch. They are where development generally takes place and
3500 are the usual targets for update and merge operations.
3500 are the usual targets for update and merge operations.
3501
3501
3502 If one or more REVs are given, only open branch heads on the
3502 If one or more REVs are given, only open branch heads on the
3503 branches associated with the specified changesets are shown. This
3503 branches associated with the specified changesets are shown. This
3504 means that you can use :hg:`heads .` to see the heads on the
3504 means that you can use :hg:`heads .` to see the heads on the
3505 currently checked-out branch.
3505 currently checked-out branch.
3506
3506
3507 If -c/--closed is specified, also show branch heads marked closed
3507 If -c/--closed is specified, also show branch heads marked closed
3508 (see :hg:`commit --close-branch`).
3508 (see :hg:`commit --close-branch`).
3509
3509
3510 If STARTREV is specified, only those heads that are descendants of
3510 If STARTREV is specified, only those heads that are descendants of
3511 STARTREV will be displayed.
3511 STARTREV will be displayed.
3512
3512
3513 If -t/--topo is specified, named branch mechanics will be ignored and only
3513 If -t/--topo is specified, named branch mechanics will be ignored and only
3514 topological heads (changesets with no children) will be shown.
3514 topological heads (changesets with no children) will be shown.
3515
3515
3516 Returns 0 if matching heads are found, 1 if not.
3516 Returns 0 if matching heads are found, 1 if not.
3517 """
3517 """
3518
3518
3519 start = None
3519 start = None
3520 if 'rev' in opts:
3520 if 'rev' in opts:
3521 start = scmutil.revsingle(repo, opts['rev'], None).node()
3521 start = scmutil.revsingle(repo, opts['rev'], None).node()
3522
3522
3523 if opts.get('topo'):
3523 if opts.get('topo'):
3524 heads = [repo[h] for h in repo.heads(start)]
3524 heads = [repo[h] for h in repo.heads(start)]
3525 else:
3525 else:
3526 heads = []
3526 heads = []
3527 for branch in repo.branchmap():
3527 for branch in repo.branchmap():
3528 heads += repo.branchheads(branch, start, opts.get('closed'))
3528 heads += repo.branchheads(branch, start, opts.get('closed'))
3529 heads = [repo[h] for h in heads]
3529 heads = [repo[h] for h in heads]
3530
3530
3531 if branchrevs:
3531 if branchrevs:
3532 branches = set(repo[br].branch() for br in branchrevs)
3532 branches = set(repo[br].branch() for br in branchrevs)
3533 heads = [h for h in heads if h.branch() in branches]
3533 heads = [h for h in heads if h.branch() in branches]
3534
3534
3535 if opts.get('active') and branchrevs:
3535 if opts.get('active') and branchrevs:
3536 dagheads = repo.heads(start)
3536 dagheads = repo.heads(start)
3537 heads = [h for h in heads if h.node() in dagheads]
3537 heads = [h for h in heads if h.node() in dagheads]
3538
3538
3539 if branchrevs:
3539 if branchrevs:
3540 haveheads = set(h.branch() for h in heads)
3540 haveheads = set(h.branch() for h in heads)
3541 if branches - haveheads:
3541 if branches - haveheads:
3542 headless = ', '.join(b for b in branches - haveheads)
3542 headless = ', '.join(b for b in branches - haveheads)
3543 msg = _('no open branch heads found on branches %s')
3543 msg = _('no open branch heads found on branches %s')
3544 if opts.get('rev'):
3544 if opts.get('rev'):
3545 msg += _(' (started at %s)') % opts['rev']
3545 msg += _(' (started at %s)') % opts['rev']
3546 ui.warn((msg + '\n') % headless)
3546 ui.warn((msg + '\n') % headless)
3547
3547
3548 if not heads:
3548 if not heads:
3549 return 1
3549 return 1
3550
3550
3551 heads = sorted(heads, key=lambda x: -x.rev())
3551 heads = sorted(heads, key=lambda x: -x.rev())
3552 displayer = cmdutil.show_changeset(ui, repo, opts)
3552 displayer = cmdutil.show_changeset(ui, repo, opts)
3553 for ctx in heads:
3553 for ctx in heads:
3554 displayer.show(ctx)
3554 displayer.show(ctx)
3555 displayer.close()
3555 displayer.close()
3556
3556
3557 @command('help',
3557 @command('help',
3558 [('e', 'extension', None, _('show only help for extensions')),
3558 [('e', 'extension', None, _('show only help for extensions')),
3559 ('c', 'command', None, _('show only help for commands')),
3559 ('c', 'command', None, _('show only help for commands')),
3560 ('k', 'keyword', '', _('show topics matching keyword')),
3560 ('k', 'keyword', '', _('show topics matching keyword')),
3561 ],
3561 ],
3562 _('[-ec] [TOPIC]'),
3562 _('[-ec] [TOPIC]'),
3563 norepo=True)
3563 norepo=True)
3564 def help_(ui, name=None, **opts):
3564 def help_(ui, name=None, **opts):
3565 """show help for a given topic or a help overview
3565 """show help for a given topic or a help overview
3566
3566
3567 With no arguments, print a list of commands with short help messages.
3567 With no arguments, print a list of commands with short help messages.
3568
3568
3569 Given a topic, extension, or command name, print help for that
3569 Given a topic, extension, or command name, print help for that
3570 topic.
3570 topic.
3571
3571
3572 Returns 0 if successful.
3572 Returns 0 if successful.
3573 """
3573 """
3574
3574
3575 textwidth = min(ui.termwidth(), 80) - 2
3575 textwidth = min(ui.termwidth(), 80) - 2
3576
3576
3577 keep = ui.verbose and ['verbose'] or []
3577 keep = ui.verbose and ['verbose'] or []
3578 text = help.help_(ui, name, **opts)
3578 text = help.help_(ui, name, **opts)
3579
3579
3580 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3580 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3581 if 'verbose' in pruned:
3581 if 'verbose' in pruned:
3582 keep.append('omitted')
3582 keep.append('omitted')
3583 else:
3583 else:
3584 keep.append('notomitted')
3584 keep.append('notomitted')
3585 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3585 formatted, pruned = minirst.format(text, textwidth, keep=keep)
3586 ui.write(formatted)
3586 ui.write(formatted)
3587
3587
3588
3588
3589 @command('identify|id',
3589 @command('identify|id',
3590 [('r', 'rev', '',
3590 [('r', 'rev', '',
3591 _('identify the specified revision'), _('REV')),
3591 _('identify the specified revision'), _('REV')),
3592 ('n', 'num', None, _('show local revision number')),
3592 ('n', 'num', None, _('show local revision number')),
3593 ('i', 'id', None, _('show global revision id')),
3593 ('i', 'id', None, _('show global revision id')),
3594 ('b', 'branch', None, _('show branch')),
3594 ('b', 'branch', None, _('show branch')),
3595 ('t', 'tags', None, _('show tags')),
3595 ('t', 'tags', None, _('show tags')),
3596 ('B', 'bookmarks', None, _('show bookmarks')),
3596 ('B', 'bookmarks', None, _('show bookmarks')),
3597 ] + remoteopts,
3597 ] + remoteopts,
3598 _('[-nibtB] [-r REV] [SOURCE]'),
3598 _('[-nibtB] [-r REV] [SOURCE]'),
3599 optionalrepo=True)
3599 optionalrepo=True)
3600 def identify(ui, repo, source=None, rev=None,
3600 def identify(ui, repo, source=None, rev=None,
3601 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
3601 num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
3602 """identify the working copy or specified revision
3602 """identify the working copy or specified revision
3603
3603
3604 Print a summary identifying the repository state at REV using one or
3604 Print a summary identifying the repository state at REV using one or
3605 two parent hash identifiers, followed by a "+" if the working
3605 two parent hash identifiers, followed by a "+" if the working
3606 directory has uncommitted changes, the branch name (if not default),
3606 directory has uncommitted changes, the branch name (if not default),
3607 a list of tags, and a list of bookmarks.
3607 a list of tags, and a list of bookmarks.
3608
3608
3609 When REV is not given, print a summary of the current state of the
3609 When REV is not given, print a summary of the current state of the
3610 repository.
3610 repository.
3611
3611
3612 Specifying a path to a repository root or Mercurial bundle will
3612 Specifying a path to a repository root or Mercurial bundle will
3613 cause lookup to operate on that repository/bundle.
3613 cause lookup to operate on that repository/bundle.
3614
3614
3615 .. container:: verbose
3615 .. container:: verbose
3616
3616
3617 Examples:
3617 Examples:
3618
3618
3619 - generate a build identifier for the working directory::
3619 - generate a build identifier for the working directory::
3620
3620
3621 hg id --id > build-id.dat
3621 hg id --id > build-id.dat
3622
3622
3623 - find the revision corresponding to a tag::
3623 - find the revision corresponding to a tag::
3624
3624
3625 hg id -n -r 1.3
3625 hg id -n -r 1.3
3626
3626
3627 - check the most recent revision of a remote repository::
3627 - check the most recent revision of a remote repository::
3628
3628
3629 hg id -r tip http://selenic.com/hg/
3629 hg id -r tip http://selenic.com/hg/
3630
3630
3631 Returns 0 if successful.
3631 Returns 0 if successful.
3632 """
3632 """
3633
3633
3634 if not repo and not source:
3634 if not repo and not source:
3635 raise util.Abort(_("there is no Mercurial repository here "
3635 raise util.Abort(_("there is no Mercurial repository here "
3636 "(.hg not found)"))
3636 "(.hg not found)"))
3637
3637
3638 hexfunc = ui.debugflag and hex or short
3638 hexfunc = ui.debugflag and hex or short
3639 default = not (num or id or branch or tags or bookmarks)
3639 default = not (num or id or branch or tags or bookmarks)
3640 output = []
3640 output = []
3641 revs = []
3641 revs = []
3642
3642
3643 if source:
3643 if source:
3644 source, branches = hg.parseurl(ui.expandpath(source))
3644 source, branches = hg.parseurl(ui.expandpath(source))
3645 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3645 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
3646 repo = peer.local()
3646 repo = peer.local()
3647 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3647 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3648
3648
3649 if not repo:
3649 if not repo:
3650 if num or branch or tags:
3650 if num or branch or tags:
3651 raise util.Abort(
3651 raise util.Abort(
3652 _("can't query remote revision number, branch, or tags"))
3652 _("can't query remote revision number, branch, or tags"))
3653 if not rev and revs:
3653 if not rev and revs:
3654 rev = revs[0]
3654 rev = revs[0]
3655 if not rev:
3655 if not rev:
3656 rev = "tip"
3656 rev = "tip"
3657
3657
3658 remoterev = peer.lookup(rev)
3658 remoterev = peer.lookup(rev)
3659 if default or id:
3659 if default or id:
3660 output = [hexfunc(remoterev)]
3660 output = [hexfunc(remoterev)]
3661
3661
3662 def getbms():
3662 def getbms():
3663 bms = []
3663 bms = []
3664
3664
3665 if 'bookmarks' in peer.listkeys('namespaces'):
3665 if 'bookmarks' in peer.listkeys('namespaces'):
3666 hexremoterev = hex(remoterev)
3666 hexremoterev = hex(remoterev)
3667 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
3667 bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
3668 if bmr == hexremoterev]
3668 if bmr == hexremoterev]
3669
3669
3670 return sorted(bms)
3670 return sorted(bms)
3671
3671
3672 if bookmarks:
3672 if bookmarks:
3673 output.extend(getbms())
3673 output.extend(getbms())
3674 elif default and not ui.quiet:
3674 elif default and not ui.quiet:
3675 # multiple bookmarks for a single parent separated by '/'
3675 # multiple bookmarks for a single parent separated by '/'
3676 bm = '/'.join(getbms())
3676 bm = '/'.join(getbms())
3677 if bm:
3677 if bm:
3678 output.append(bm)
3678 output.append(bm)
3679 else:
3679 else:
3680 if not rev:
3680 if not rev:
3681 ctx = repo[None]
3681 ctx = repo[None]
3682 parents = ctx.parents()
3682 parents = ctx.parents()
3683 changed = ""
3683 changed = ""
3684 if default or id or num:
3684 if default or id or num:
3685 if (util.any(repo.status())
3685 if (util.any(repo.status())
3686 or util.any(ctx.sub(s).dirty() for s in ctx.substate)):
3686 or util.any(ctx.sub(s).dirty() for s in ctx.substate)):
3687 changed = '+'
3687 changed = '+'
3688 if default or id:
3688 if default or id:
3689 output = ["%s%s" %
3689 output = ["%s%s" %
3690 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
3690 ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
3691 if num:
3691 if num:
3692 output.append("%s%s" %
3692 output.append("%s%s" %
3693 ('+'.join([str(p.rev()) for p in parents]), changed))
3693 ('+'.join([str(p.rev()) for p in parents]), changed))
3694 else:
3694 else:
3695 ctx = scmutil.revsingle(repo, rev)
3695 ctx = scmutil.revsingle(repo, rev)
3696 if default or id:
3696 if default or id:
3697 output = [hexfunc(ctx.node())]
3697 output = [hexfunc(ctx.node())]
3698 if num:
3698 if num:
3699 output.append(str(ctx.rev()))
3699 output.append(str(ctx.rev()))
3700
3700
3701 if default and not ui.quiet:
3701 if default and not ui.quiet:
3702 b = ctx.branch()
3702 b = ctx.branch()
3703 if b != 'default':
3703 if b != 'default':
3704 output.append("(%s)" % b)
3704 output.append("(%s)" % b)
3705
3705
3706 # multiple tags for a single parent separated by '/'
3706 # multiple tags for a single parent separated by '/'
3707 t = '/'.join(ctx.tags())
3707 t = '/'.join(ctx.tags())
3708 if t:
3708 if t:
3709 output.append(t)
3709 output.append(t)
3710
3710
3711 # multiple bookmarks for a single parent separated by '/'
3711 # multiple bookmarks for a single parent separated by '/'
3712 bm = '/'.join(ctx.bookmarks())
3712 bm = '/'.join(ctx.bookmarks())
3713 if bm:
3713 if bm:
3714 output.append(bm)
3714 output.append(bm)
3715 else:
3715 else:
3716 if branch:
3716 if branch:
3717 output.append(ctx.branch())
3717 output.append(ctx.branch())
3718
3718
3719 if tags:
3719 if tags:
3720 output.extend(ctx.tags())
3720 output.extend(ctx.tags())
3721
3721
3722 if bookmarks:
3722 if bookmarks:
3723 output.extend(ctx.bookmarks())
3723 output.extend(ctx.bookmarks())
3724
3724
3725 ui.write("%s\n" % ' '.join(output))
3725 ui.write("%s\n" % ' '.join(output))
3726
3726
3727 @command('import|patch',
3727 @command('import|patch',
3728 [('p', 'strip', 1,
3728 [('p', 'strip', 1,
3729 _('directory strip option for patch. This has the same '
3729 _('directory strip option for patch. This has the same '
3730 'meaning as the corresponding patch option'), _('NUM')),
3730 'meaning as the corresponding patch option'), _('NUM')),
3731 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
3731 ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
3732 ('e', 'edit', False, _('invoke editor on commit messages')),
3732 ('e', 'edit', False, _('invoke editor on commit messages')),
3733 ('f', 'force', None,
3733 ('f', 'force', None,
3734 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
3734 _('skip check for outstanding uncommitted changes (DEPRECATED)')),
3735 ('', 'no-commit', None,
3735 ('', 'no-commit', None,
3736 _("don't commit, just update the working directory")),
3736 _("don't commit, just update the working directory")),
3737 ('', 'bypass', None,
3737 ('', 'bypass', None,
3738 _("apply patch without touching the working directory")),
3738 _("apply patch without touching the working directory")),
3739 ('', 'partial', None,
3739 ('', 'partial', None,
3740 _('commit even if some hunks fail')),
3740 _('commit even if some hunks fail')),
3741 ('', 'exact', None,
3741 ('', 'exact', None,
3742 _('apply patch to the nodes from which it was generated')),
3742 _('apply patch to the nodes from which it was generated')),
3743 ('', 'import-branch', None,
3743 ('', 'import-branch', None,
3744 _('use any branch information in patch (implied by --exact)'))] +
3744 _('use any branch information in patch (implied by --exact)'))] +
3745 commitopts + commitopts2 + similarityopts,
3745 commitopts + commitopts2 + similarityopts,
3746 _('[OPTION]... PATCH...'))
3746 _('[OPTION]... PATCH...'))
3747 def import_(ui, repo, patch1=None, *patches, **opts):
3747 def import_(ui, repo, patch1=None, *patches, **opts):
3748 """import an ordered set of patches
3748 """import an ordered set of patches
3749
3749
3750 Import a list of patches and commit them individually (unless
3750 Import a list of patches and commit them individually (unless
3751 --no-commit is specified).
3751 --no-commit is specified).
3752
3752
3753 Because import first applies changes to the working directory,
3753 Because import first applies changes to the working directory,
3754 import will abort if there are outstanding changes.
3754 import will abort if there are outstanding changes.
3755
3755
3756 You can import a patch straight from a mail message. Even patches
3756 You can import a patch straight from a mail message. Even patches
3757 as attachments work (to use the body part, it must have type
3757 as attachments work (to use the body part, it must have type
3758 text/plain or text/x-patch). From and Subject headers of email
3758 text/plain or text/x-patch). From and Subject headers of email
3759 message are used as default committer and commit message. All
3759 message are used as default committer and commit message. All
3760 text/plain body parts before first diff are added to commit
3760 text/plain body parts before first diff are added to commit
3761 message.
3761 message.
3762
3762
3763 If the imported patch was generated by :hg:`export`, user and
3763 If the imported patch was generated by :hg:`export`, user and
3764 description from patch override values from message headers and
3764 description from patch override values from message headers and
3765 body. Values given on command line with -m/--message and -u/--user
3765 body. Values given on command line with -m/--message and -u/--user
3766 override these.
3766 override these.
3767
3767
3768 If --exact is specified, import will set the working directory to
3768 If --exact is specified, import will set the working directory to
3769 the parent of each patch before applying it, and will abort if the
3769 the parent of each patch before applying it, and will abort if the
3770 resulting changeset has a different ID than the one recorded in
3770 resulting changeset has a different ID than the one recorded in
3771 the patch. This may happen due to character set problems or other
3771 the patch. This may happen due to character set problems or other
3772 deficiencies in the text patch format.
3772 deficiencies in the text patch format.
3773
3773
3774 Use --bypass to apply and commit patches directly to the
3774 Use --bypass to apply and commit patches directly to the
3775 repository, not touching the working directory. Without --exact,
3775 repository, not touching the working directory. Without --exact,
3776 patches will be applied on top of the working directory parent
3776 patches will be applied on top of the working directory parent
3777 revision.
3777 revision.
3778
3778
3779 With -s/--similarity, hg will attempt to discover renames and
3779 With -s/--similarity, hg will attempt to discover renames and
3780 copies in the patch in the same way as :hg:`addremove`.
3780 copies in the patch in the same way as :hg:`addremove`.
3781
3781
3782 Use --partial to ensure a changeset will be created from the patch
3782 Use --partial to ensure a changeset will be created from the patch
3783 even if some hunks fail to apply. Hunks that fail to apply will be
3783 even if some hunks fail to apply. Hunks that fail to apply will be
3784 written to a <target-file>.rej file. Conflicts can then be resolved
3784 written to a <target-file>.rej file. Conflicts can then be resolved
3785 by hand before :hg:`commit --amend` is run to update the created
3785 by hand before :hg:`commit --amend` is run to update the created
3786 changeset. This flag exists to let people import patches that
3786 changeset. This flag exists to let people import patches that
3787 partially apply without losing the associated metadata (author,
3787 partially apply without losing the associated metadata (author,
3788 date, description, ...). Note that when none of the hunk applies
3788 date, description, ...). Note that when none of the hunk applies
3789 cleanly, :hg:`import --partial` will create an empty changeset,
3789 cleanly, :hg:`import --partial` will create an empty changeset,
3790 importing only the patch metadata.
3790 importing only the patch metadata.
3791
3791
3792 To read a patch from standard input, use "-" as the patch name. If
3792 To read a patch from standard input, use "-" as the patch name. If
3793 a URL is specified, the patch will be downloaded from it.
3793 a URL is specified, the patch will be downloaded from it.
3794 See :hg:`help dates` for a list of formats valid for -d/--date.
3794 See :hg:`help dates` for a list of formats valid for -d/--date.
3795
3795
3796 .. container:: verbose
3796 .. container:: verbose
3797
3797
3798 Examples:
3798 Examples:
3799
3799
3800 - import a traditional patch from a website and detect renames::
3800 - import a traditional patch from a website and detect renames::
3801
3801
3802 hg import -s 80 http://example.com/bugfix.patch
3802 hg import -s 80 http://example.com/bugfix.patch
3803
3803
3804 - import a changeset from an hgweb server::
3804 - import a changeset from an hgweb server::
3805
3805
3806 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
3806 hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
3807
3807
3808 - import all the patches in an Unix-style mbox::
3808 - import all the patches in an Unix-style mbox::
3809
3809
3810 hg import incoming-patches.mbox
3810 hg import incoming-patches.mbox
3811
3811
3812 - attempt to exactly restore an exported changeset (not always
3812 - attempt to exactly restore an exported changeset (not always
3813 possible)::
3813 possible)::
3814
3814
3815 hg import --exact proposed-fix.patch
3815 hg import --exact proposed-fix.patch
3816
3816
3817 Returns 0 on success, 1 on partial success (see --partial).
3817 Returns 0 on success, 1 on partial success (see --partial).
3818 """
3818 """
3819
3819
3820 if not patch1:
3820 if not patch1:
3821 raise util.Abort(_('need at least one patch to import'))
3821 raise util.Abort(_('need at least one patch to import'))
3822
3822
3823 patches = (patch1,) + patches
3823 patches = (patch1,) + patches
3824
3824
3825 date = opts.get('date')
3825 date = opts.get('date')
3826 if date:
3826 if date:
3827 opts['date'] = util.parsedate(date)
3827 opts['date'] = util.parsedate(date)
3828
3828
3829 update = not opts.get('bypass')
3829 update = not opts.get('bypass')
3830 if not update and opts.get('no_commit'):
3830 if not update and opts.get('no_commit'):
3831 raise util.Abort(_('cannot use --no-commit with --bypass'))
3831 raise util.Abort(_('cannot use --no-commit with --bypass'))
3832 try:
3832 try:
3833 sim = float(opts.get('similarity') or 0)
3833 sim = float(opts.get('similarity') or 0)
3834 except ValueError:
3834 except ValueError:
3835 raise util.Abort(_('similarity must be a number'))
3835 raise util.Abort(_('similarity must be a number'))
3836 if sim < 0 or sim > 100:
3836 if sim < 0 or sim > 100:
3837 raise util.Abort(_('similarity must be between 0 and 100'))
3837 raise util.Abort(_('similarity must be between 0 and 100'))
3838 if sim and not update:
3838 if sim and not update:
3839 raise util.Abort(_('cannot use --similarity with --bypass'))
3839 raise util.Abort(_('cannot use --similarity with --bypass'))
3840
3840
3841 if update:
3841 if update:
3842 cmdutil.checkunfinished(repo)
3842 cmdutil.checkunfinished(repo)
3843 if (opts.get('exact') or not opts.get('force')) and update:
3843 if (opts.get('exact') or not opts.get('force')) and update:
3844 cmdutil.bailifchanged(repo)
3844 cmdutil.bailifchanged(repo)
3845
3845
3846 base = opts["base"]
3846 base = opts["base"]
3847 wlock = lock = tr = None
3847 wlock = lock = tr = None
3848 msgs = []
3848 msgs = []
3849 ret = 0
3849 ret = 0
3850
3850
3851
3851
3852 try:
3852 try:
3853 try:
3853 try:
3854 wlock = repo.wlock()
3854 wlock = repo.wlock()
3855 if not opts.get('no_commit'):
3855 if not opts.get('no_commit'):
3856 lock = repo.lock()
3856 lock = repo.lock()
3857 tr = repo.transaction('import')
3857 tr = repo.transaction('import')
3858 parents = repo.parents()
3858 parents = repo.parents()
3859 for patchurl in patches:
3859 for patchurl in patches:
3860 if patchurl == '-':
3860 if patchurl == '-':
3861 ui.status(_('applying patch from stdin\n'))
3861 ui.status(_('applying patch from stdin\n'))
3862 patchfile = ui.fin
3862 patchfile = ui.fin
3863 patchurl = 'stdin' # for error message
3863 patchurl = 'stdin' # for error message
3864 else:
3864 else:
3865 patchurl = os.path.join(base, patchurl)
3865 patchurl = os.path.join(base, patchurl)
3866 ui.status(_('applying %s\n') % patchurl)
3866 ui.status(_('applying %s\n') % patchurl)
3867 patchfile = hg.openpath(ui, patchurl)
3867 patchfile = hg.openpath(ui, patchurl)
3868
3868
3869 haspatch = False
3869 haspatch = False
3870 for hunk in patch.split(patchfile):
3870 for hunk in patch.split(patchfile):
3871 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
3871 (msg, node, rej) = cmdutil.tryimportone(ui, repo, hunk,
3872 parents, opts,
3872 parents, opts,
3873 msgs, hg.clean)
3873 msgs, hg.clean)
3874 if msg:
3874 if msg:
3875 haspatch = True
3875 haspatch = True
3876 ui.note(msg + '\n')
3876 ui.note(msg + '\n')
3877 if update or opts.get('exact'):
3877 if update or opts.get('exact'):
3878 parents = repo.parents()
3878 parents = repo.parents()
3879 else:
3879 else:
3880 parents = [repo[node]]
3880 parents = [repo[node]]
3881 if rej:
3881 if rej:
3882 ui.write_err(_("patch applied partially\n"))
3882 ui.write_err(_("patch applied partially\n"))
3883 ui.write_err(("(fix the .rej files and run "
3883 ui.write_err(("(fix the .rej files and run "
3884 "`hg commit --amend`)\n"))
3884 "`hg commit --amend`)\n"))
3885 ret = 1
3885 ret = 1
3886 break
3886 break
3887
3887
3888 if not haspatch:
3888 if not haspatch:
3889 raise util.Abort(_('%s: no diffs found') % patchurl)
3889 raise util.Abort(_('%s: no diffs found') % patchurl)
3890
3890
3891 if tr:
3891 if tr:
3892 tr.close()
3892 tr.close()
3893 if msgs:
3893 if msgs:
3894 repo.savecommitmessage('\n* * *\n'.join(msgs))
3894 repo.savecommitmessage('\n* * *\n'.join(msgs))
3895 return ret
3895 return ret
3896 except: # re-raises
3896 except: # re-raises
3897 # wlock.release() indirectly calls dirstate.write(): since
3897 # wlock.release() indirectly calls dirstate.write(): since
3898 # we're crashing, we do not want to change the working dir
3898 # we're crashing, we do not want to change the working dir
3899 # parent after all, so make sure it writes nothing
3899 # parent after all, so make sure it writes nothing
3900 repo.dirstate.invalidate()
3900 repo.dirstate.invalidate()
3901 raise
3901 raise
3902 finally:
3902 finally:
3903 if tr:
3903 if tr:
3904 tr.release()
3904 tr.release()
3905 release(lock, wlock)
3905 release(lock, wlock)
3906
3906
3907 @command('incoming|in',
3907 @command('incoming|in',
3908 [('f', 'force', None,
3908 [('f', 'force', None,
3909 _('run even if remote repository is unrelated')),
3909 _('run even if remote repository is unrelated')),
3910 ('n', 'newest-first', None, _('show newest record first')),
3910 ('n', 'newest-first', None, _('show newest record first')),
3911 ('', 'bundle', '',
3911 ('', 'bundle', '',
3912 _('file to store the bundles into'), _('FILE')),
3912 _('file to store the bundles into'), _('FILE')),
3913 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
3913 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
3914 ('B', 'bookmarks', False, _("compare bookmarks")),
3914 ('B', 'bookmarks', False, _("compare bookmarks")),
3915 ('b', 'branch', [],
3915 ('b', 'branch', [],
3916 _('a specific branch you would like to pull'), _('BRANCH')),
3916 _('a specific branch you would like to pull'), _('BRANCH')),
3917 ] + logopts + remoteopts + subrepoopts,
3917 ] + logopts + remoteopts + subrepoopts,
3918 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
3918 _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
3919 def incoming(ui, repo, source="default", **opts):
3919 def incoming(ui, repo, source="default", **opts):
3920 """show new changesets found in source
3920 """show new changesets found in source
3921
3921
3922 Show new changesets found in the specified path/URL or the default
3922 Show new changesets found in the specified path/URL or the default
3923 pull location. These are the changesets that would have been pulled
3923 pull location. These are the changesets that would have been pulled
3924 if a pull at the time you issued this command.
3924 if a pull at the time you issued this command.
3925
3925
3926 For remote repository, using --bundle avoids downloading the
3926 For remote repository, using --bundle avoids downloading the
3927 changesets twice if the incoming is followed by a pull.
3927 changesets twice if the incoming is followed by a pull.
3928
3928
3929 See pull for valid source format details.
3929 See pull for valid source format details.
3930
3930
3931 .. container:: verbose
3931 .. container:: verbose
3932
3932
3933 Examples:
3933 Examples:
3934
3934
3935 - show incoming changes with patches and full description::
3935 - show incoming changes with patches and full description::
3936
3936
3937 hg incoming -vp
3937 hg incoming -vp
3938
3938
3939 - show incoming changes excluding merges, store a bundle::
3939 - show incoming changes excluding merges, store a bundle::
3940
3940
3941 hg in -vpM --bundle incoming.hg
3941 hg in -vpM --bundle incoming.hg
3942 hg pull incoming.hg
3942 hg pull incoming.hg
3943
3943
3944 - briefly list changes inside a bundle::
3944 - briefly list changes inside a bundle::
3945
3945
3946 hg in changes.hg -T "{desc|firstline}\\n"
3946 hg in changes.hg -T "{desc|firstline}\\n"
3947
3947
3948 Returns 0 if there are incoming changes, 1 otherwise.
3948 Returns 0 if there are incoming changes, 1 otherwise.
3949 """
3949 """
3950 if opts.get('graph'):
3950 if opts.get('graph'):
3951 cmdutil.checkunsupportedgraphflags([], opts)
3951 cmdutil.checkunsupportedgraphflags([], opts)
3952 def display(other, chlist, displayer):
3952 def display(other, chlist, displayer):
3953 revdag = cmdutil.graphrevs(other, chlist, opts)
3953 revdag = cmdutil.graphrevs(other, chlist, opts)
3954 showparents = [ctx.node() for ctx in repo[None].parents()]
3954 showparents = [ctx.node() for ctx in repo[None].parents()]
3955 cmdutil.displaygraph(ui, revdag, displayer, showparents,
3955 cmdutil.displaygraph(ui, revdag, displayer, showparents,
3956 graphmod.asciiedges)
3956 graphmod.asciiedges)
3957
3957
3958 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
3958 hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
3959 return 0
3959 return 0
3960
3960
3961 if opts.get('bundle') and opts.get('subrepos'):
3961 if opts.get('bundle') and opts.get('subrepos'):
3962 raise util.Abort(_('cannot combine --bundle and --subrepos'))
3962 raise util.Abort(_('cannot combine --bundle and --subrepos'))
3963
3963
3964 if opts.get('bookmarks'):
3964 if opts.get('bookmarks'):
3965 source, branches = hg.parseurl(ui.expandpath(source),
3965 source, branches = hg.parseurl(ui.expandpath(source),
3966 opts.get('branch'))
3966 opts.get('branch'))
3967 other = hg.peer(repo, opts, source)
3967 other = hg.peer(repo, opts, source)
3968 if 'bookmarks' not in other.listkeys('namespaces'):
3968 if 'bookmarks' not in other.listkeys('namespaces'):
3969 ui.warn(_("remote doesn't support bookmarks\n"))
3969 ui.warn(_("remote doesn't support bookmarks\n"))
3970 return 0
3970 return 0
3971 ui.status(_('comparing with %s\n') % util.hidepassword(source))
3971 ui.status(_('comparing with %s\n') % util.hidepassword(source))
3972 return bookmarks.diff(ui, repo, other)
3972 return bookmarks.diff(ui, repo, other)
3973
3973
3974 repo._subtoppath = ui.expandpath(source)
3974 repo._subtoppath = ui.expandpath(source)
3975 try:
3975 try:
3976 return hg.incoming(ui, repo, source, opts)
3976 return hg.incoming(ui, repo, source, opts)
3977 finally:
3977 finally:
3978 del repo._subtoppath
3978 del repo._subtoppath
3979
3979
3980
3980
3981 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
3981 @command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'),
3982 norepo=True)
3982 norepo=True)
3983 def init(ui, dest=".", **opts):
3983 def init(ui, dest=".", **opts):
3984 """create a new repository in the given directory
3984 """create a new repository in the given directory
3985
3985
3986 Initialize a new repository in the given directory. If the given
3986 Initialize a new repository in the given directory. If the given
3987 directory does not exist, it will be created.
3987 directory does not exist, it will be created.
3988
3988
3989 If no directory is given, the current directory is used.
3989 If no directory is given, the current directory is used.
3990
3990
3991 It is possible to specify an ``ssh://`` URL as the destination.
3991 It is possible to specify an ``ssh://`` URL as the destination.
3992 See :hg:`help urls` for more information.
3992 See :hg:`help urls` for more information.
3993
3993
3994 Returns 0 on success.
3994 Returns 0 on success.
3995 """
3995 """
3996 hg.peer(ui, opts, ui.expandpath(dest), create=True)
3996 hg.peer(ui, opts, ui.expandpath(dest), create=True)
3997
3997
3998 @command('locate',
3998 @command('locate',
3999 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
3999 [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
4000 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4000 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
4001 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4001 ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
4002 ] + walkopts,
4002 ] + walkopts,
4003 _('[OPTION]... [PATTERN]...'))
4003 _('[OPTION]... [PATTERN]...'))
4004 def locate(ui, repo, *pats, **opts):
4004 def locate(ui, repo, *pats, **opts):
4005 """locate files matching specific patterns
4005 """locate files matching specific patterns
4006
4006
4007 Print files under Mercurial control in the working directory whose
4007 Print files under Mercurial control in the working directory whose
4008 names match the given patterns.
4008 names match the given patterns.
4009
4009
4010 By default, this command searches all directories in the working
4010 By default, this command searches all directories in the working
4011 directory. To search just the current directory and its
4011 directory. To search just the current directory and its
4012 subdirectories, use "--include .".
4012 subdirectories, use "--include .".
4013
4013
4014 If no patterns are given to match, this command prints the names
4014 If no patterns are given to match, this command prints the names
4015 of all files under Mercurial control in the working directory.
4015 of all files under Mercurial control in the working directory.
4016
4016
4017 If you want to feed the output of this command into the "xargs"
4017 If you want to feed the output of this command into the "xargs"
4018 command, use the -0 option to both this command and "xargs". This
4018 command, use the -0 option to both this command and "xargs". This
4019 will avoid the problem of "xargs" treating single filenames that
4019 will avoid the problem of "xargs" treating single filenames that
4020 contain whitespace as multiple filenames.
4020 contain whitespace as multiple filenames.
4021
4021
4022 Returns 0 if a match is found, 1 otherwise.
4022 Returns 0 if a match is found, 1 otherwise.
4023 """
4023 """
4024 end = opts.get('print0') and '\0' or '\n'
4024 end = opts.get('print0') and '\0' or '\n'
4025 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4025 rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
4026
4026
4027 ret = 1
4027 ret = 1
4028 m = scmutil.match(repo[rev], pats, opts, default='relglob')
4028 m = scmutil.match(repo[rev], pats, opts, default='relglob')
4029 m.bad = lambda x, y: False
4029 m.bad = lambda x, y: False
4030 for abs in repo[rev].walk(m):
4030 for abs in repo[rev].walk(m):
4031 if not rev and abs not in repo.dirstate:
4031 if not rev and abs not in repo.dirstate:
4032 continue
4032 continue
4033 if opts.get('fullpath'):
4033 if opts.get('fullpath'):
4034 ui.write(repo.wjoin(abs), end)
4034 ui.write(repo.wjoin(abs), end)
4035 else:
4035 else:
4036 ui.write(((pats and m.rel(abs)) or abs), end)
4036 ui.write(((pats and m.rel(abs)) or abs), end)
4037 ret = 0
4037 ret = 0
4038
4038
4039 return ret
4039 return ret
4040
4040
4041 @command('^log|history',
4041 @command('^log|history',
4042 [('f', 'follow', None,
4042 [('f', 'follow', None,
4043 _('follow changeset history, or file history across copies and renames')),
4043 _('follow changeset history, or file history across copies and renames')),
4044 ('', 'follow-first', None,
4044 ('', 'follow-first', None,
4045 _('only follow the first parent of merge changesets (DEPRECATED)')),
4045 _('only follow the first parent of merge changesets (DEPRECATED)')),
4046 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4046 ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
4047 ('C', 'copies', None, _('show copied files')),
4047 ('C', 'copies', None, _('show copied files')),
4048 ('k', 'keyword', [],
4048 ('k', 'keyword', [],
4049 _('do case-insensitive search for a given text'), _('TEXT')),
4049 _('do case-insensitive search for a given text'), _('TEXT')),
4050 ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
4050 ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
4051 ('', 'removed', None, _('include revisions where files were removed')),
4051 ('', 'removed', None, _('include revisions where files were removed')),
4052 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4052 ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
4053 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4053 ('u', 'user', [], _('revisions committed by user'), _('USER')),
4054 ('', 'only-branch', [],
4054 ('', 'only-branch', [],
4055 _('show only changesets within the given named branch (DEPRECATED)'),
4055 _('show only changesets within the given named branch (DEPRECATED)'),
4056 _('BRANCH')),
4056 _('BRANCH')),
4057 ('b', 'branch', [],
4057 ('b', 'branch', [],
4058 _('show changesets within the given named branch'), _('BRANCH')),
4058 _('show changesets within the given named branch'), _('BRANCH')),
4059 ('P', 'prune', [],
4059 ('P', 'prune', [],
4060 _('do not display revision or any of its ancestors'), _('REV')),
4060 _('do not display revision or any of its ancestors'), _('REV')),
4061 ] + logopts + walkopts,
4061 ] + logopts + walkopts,
4062 _('[OPTION]... [FILE]'),
4062 _('[OPTION]... [FILE]'),
4063 inferrepo=True)
4063 inferrepo=True)
4064 def log(ui, repo, *pats, **opts):
4064 def log(ui, repo, *pats, **opts):
4065 """show revision history of entire repository or files
4065 """show revision history of entire repository or files
4066
4066
4067 Print the revision history of the specified files or the entire
4067 Print the revision history of the specified files or the entire
4068 project.
4068 project.
4069
4069
4070 If no revision range is specified, the default is ``tip:0`` unless
4070 If no revision range is specified, the default is ``tip:0`` unless
4071 --follow is set, in which case the working directory parent is
4071 --follow is set, in which case the working directory parent is
4072 used as the starting revision.
4072 used as the starting revision.
4073
4073
4074 File history is shown without following rename or copy history of
4074 File history is shown without following rename or copy history of
4075 files. Use -f/--follow with a filename to follow history across
4075 files. Use -f/--follow with a filename to follow history across
4076 renames and copies. --follow without a filename will only show
4076 renames and copies. --follow without a filename will only show
4077 ancestors or descendants of the starting revision.
4077 ancestors or descendants of the starting revision.
4078
4078
4079 By default this command prints revision number and changeset id,
4079 By default this command prints revision number and changeset id,
4080 tags, non-trivial parents, user, date and time, and a summary for
4080 tags, non-trivial parents, user, date and time, and a summary for
4081 each commit. When the -v/--verbose switch is used, the list of
4081 each commit. When the -v/--verbose switch is used, the list of
4082 changed files and full commit message are shown.
4082 changed files and full commit message are shown.
4083
4083
4084 With --graph the revisions are shown as an ASCII art DAG with the most
4084 With --graph the revisions are shown as an ASCII art DAG with the most
4085 recent changeset at the top.
4085 recent changeset at the top.
4086 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4086 'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
4087 and '+' represents a fork where the changeset from the lines below is a
4087 and '+' represents a fork where the changeset from the lines below is a
4088 parent of the 'o' merge on the same line.
4088 parent of the 'o' merge on the same line.
4089
4089
4090 .. note::
4090 .. note::
4091
4091
4092 log -p/--patch may generate unexpected diff output for merge
4092 log -p/--patch may generate unexpected diff output for merge
4093 changesets, as it will only compare the merge changeset against
4093 changesets, as it will only compare the merge changeset against
4094 its first parent. Also, only files different from BOTH parents
4094 its first parent. Also, only files different from BOTH parents
4095 will appear in files:.
4095 will appear in files:.
4096
4096
4097 .. note::
4097 .. note::
4098
4098
4099 for performance reasons, log FILE may omit duplicate changes
4099 for performance reasons, log FILE may omit duplicate changes
4100 made on branches and will not show deletions. To see all
4100 made on branches and will not show deletions. To see all
4101 changes including duplicates and deletions, use the --removed
4101 changes including duplicates and deletions, use the --removed
4102 switch.
4102 switch.
4103
4103
4104 .. container:: verbose
4104 .. container:: verbose
4105
4105
4106 Some examples:
4106 Some examples:
4107
4107
4108 - changesets with full descriptions and file lists::
4108 - changesets with full descriptions and file lists::
4109
4109
4110 hg log -v
4110 hg log -v
4111
4111
4112 - changesets ancestral to the working directory::
4112 - changesets ancestral to the working directory::
4113
4113
4114 hg log -f
4114 hg log -f
4115
4115
4116 - last 10 commits on the current branch::
4116 - last 10 commits on the current branch::
4117
4117
4118 hg log -l 10 -b .
4118 hg log -l 10 -b .
4119
4119
4120 - changesets showing all modifications of a file, including removals::
4120 - changesets showing all modifications of a file, including removals::
4121
4121
4122 hg log --removed file.c
4122 hg log --removed file.c
4123
4123
4124 - all changesets that touch a directory, with diffs, excluding merges::
4124 - all changesets that touch a directory, with diffs, excluding merges::
4125
4125
4126 hg log -Mp lib/
4126 hg log -Mp lib/
4127
4127
4128 - all revision numbers that match a keyword::
4128 - all revision numbers that match a keyword::
4129
4129
4130 hg log -k bug --template "{rev}\\n"
4130 hg log -k bug --template "{rev}\\n"
4131
4131
4132 - list available log templates::
4132 - list available log templates::
4133
4133
4134 hg log -T list
4134 hg log -T list
4135
4135
4136 - check if a given changeset is included is a tagged release::
4136 - check if a given changeset is included is a tagged release::
4137
4137
4138 hg log -r "a21ccf and ancestor(1.9)"
4138 hg log -r "a21ccf and ancestor(1.9)"
4139
4139
4140 - find all changesets by some user in a date range::
4140 - find all changesets by some user in a date range::
4141
4141
4142 hg log -k alice -d "may 2008 to jul 2008"
4142 hg log -k alice -d "may 2008 to jul 2008"
4143
4143
4144 - summary of all changesets after the last tag::
4144 - summary of all changesets after the last tag::
4145
4145
4146 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4146 hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
4147
4147
4148 See :hg:`help dates` for a list of formats valid for -d/--date.
4148 See :hg:`help dates` for a list of formats valid for -d/--date.
4149
4149
4150 See :hg:`help revisions` and :hg:`help revsets` for more about
4150 See :hg:`help revisions` and :hg:`help revsets` for more about
4151 specifying revisions.
4151 specifying revisions.
4152
4152
4153 See :hg:`help templates` for more about pre-packaged styles and
4153 See :hg:`help templates` for more about pre-packaged styles and
4154 specifying custom templates.
4154 specifying custom templates.
4155
4155
4156 Returns 0 on success.
4156 Returns 0 on success.
4157 """
4157 """
4158 if opts.get('graph'):
4158 if opts.get('graph'):
4159 return cmdutil.graphlog(ui, repo, *pats, **opts)
4159 return cmdutil.graphlog(ui, repo, *pats, **opts)
4160
4160
4161 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4161 revs, expr, filematcher = cmdutil.getlogrevs(repo, pats, opts)
4162 limit = cmdutil.loglimit(opts)
4162 limit = cmdutil.loglimit(opts)
4163 count = 0
4163 count = 0
4164
4164
4165 getrenamed = None
4165 getrenamed = None
4166 if opts.get('copies'):
4166 if opts.get('copies'):
4167 endrev = None
4167 endrev = None
4168 if opts.get('rev'):
4168 if opts.get('rev'):
4169 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4169 endrev = scmutil.revrange(repo, opts.get('rev')).max() + 1
4170 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4170 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
4171
4171
4172 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4172 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4173 for rev in revs:
4173 for rev in revs:
4174 if count == limit:
4174 if count == limit:
4175 break
4175 break
4176 ctx = repo[rev]
4176 ctx = repo[rev]
4177 copies = None
4177 copies = None
4178 if getrenamed is not None and rev:
4178 if getrenamed is not None and rev:
4179 copies = []
4179 copies = []
4180 for fn in ctx.files():
4180 for fn in ctx.files():
4181 rename = getrenamed(fn, rev)
4181 rename = getrenamed(fn, rev)
4182 if rename:
4182 if rename:
4183 copies.append((fn, rename[0]))
4183 copies.append((fn, rename[0]))
4184 revmatchfn = filematcher and filematcher(ctx.rev()) or None
4184 revmatchfn = filematcher and filematcher(ctx.rev()) or None
4185 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4185 displayer.show(ctx, copies=copies, matchfn=revmatchfn)
4186 if displayer.flush(rev):
4186 if displayer.flush(rev):
4187 count += 1
4187 count += 1
4188
4188
4189 displayer.close()
4189 displayer.close()
4190
4190
4191 @command('manifest',
4191 @command('manifest',
4192 [('r', 'rev', '', _('revision to display'), _('REV')),
4192 [('r', 'rev', '', _('revision to display'), _('REV')),
4193 ('', 'all', False, _("list files from all revisions"))],
4193 ('', 'all', False, _("list files from all revisions"))],
4194 _('[-r REV]'))
4194 _('[-r REV]'))
4195 def manifest(ui, repo, node=None, rev=None, **opts):
4195 def manifest(ui, repo, node=None, rev=None, **opts):
4196 """output the current or given revision of the project manifest
4196 """output the current or given revision of the project manifest
4197
4197
4198 Print a list of version controlled files for the given revision.
4198 Print a list of version controlled files for the given revision.
4199 If no revision is given, the first parent of the working directory
4199 If no revision is given, the first parent of the working directory
4200 is used, or the null revision if no revision is checked out.
4200 is used, or the null revision if no revision is checked out.
4201
4201
4202 With -v, print file permissions, symlink and executable bits.
4202 With -v, print file permissions, symlink and executable bits.
4203 With --debug, print file revision hashes.
4203 With --debug, print file revision hashes.
4204
4204
4205 If option --all is specified, the list of all files from all revisions
4205 If option --all is specified, the list of all files from all revisions
4206 is printed. This includes deleted and renamed files.
4206 is printed. This includes deleted and renamed files.
4207
4207
4208 Returns 0 on success.
4208 Returns 0 on success.
4209 """
4209 """
4210
4210
4211 fm = ui.formatter('manifest', opts)
4211 fm = ui.formatter('manifest', opts)
4212
4212
4213 if opts.get('all'):
4213 if opts.get('all'):
4214 if rev or node:
4214 if rev or node:
4215 raise util.Abort(_("can't specify a revision with --all"))
4215 raise util.Abort(_("can't specify a revision with --all"))
4216
4216
4217 res = []
4217 res = []
4218 prefix = "data/"
4218 prefix = "data/"
4219 suffix = ".i"
4219 suffix = ".i"
4220 plen = len(prefix)
4220 plen = len(prefix)
4221 slen = len(suffix)
4221 slen = len(suffix)
4222 lock = repo.lock()
4222 lock = repo.lock()
4223 try:
4223 try:
4224 for fn, b, size in repo.store.datafiles():
4224 for fn, b, size in repo.store.datafiles():
4225 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4225 if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
4226 res.append(fn[plen:-slen])
4226 res.append(fn[plen:-slen])
4227 finally:
4227 finally:
4228 lock.release()
4228 lock.release()
4229 for f in res:
4229 for f in res:
4230 fm.startitem()
4230 fm.startitem()
4231 fm.write("path", '%s\n', f)
4231 fm.write("path", '%s\n', f)
4232 fm.end()
4232 fm.end()
4233 return
4233 return
4234
4234
4235 if rev and node:
4235 if rev and node:
4236 raise util.Abort(_("please specify just one revision"))
4236 raise util.Abort(_("please specify just one revision"))
4237
4237
4238 if not node:
4238 if not node:
4239 node = rev
4239 node = rev
4240
4240
4241 char = {'l': '@', 'x': '*', '': ''}
4241 char = {'l': '@', 'x': '*', '': ''}
4242 mode = {'l': '644', 'x': '755', '': '644'}
4242 mode = {'l': '644', 'x': '755', '': '644'}
4243 ctx = scmutil.revsingle(repo, node)
4243 ctx = scmutil.revsingle(repo, node)
4244 mf = ctx.manifest()
4244 mf = ctx.manifest()
4245 for f in ctx:
4245 for f in ctx:
4246 fm.startitem()
4246 fm.startitem()
4247 fl = ctx[f].flags()
4247 fl = ctx[f].flags()
4248 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4248 fm.condwrite(ui.debugflag, 'hash', '%s ', hex(mf[f]))
4249 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4249 fm.condwrite(ui.verbose, 'mode type', '%s %1s ', mode[fl], char[fl])
4250 fm.write('path', '%s\n', f)
4250 fm.write('path', '%s\n', f)
4251 fm.end()
4251 fm.end()
4252
4252
4253 @command('^merge',
4253 @command('^merge',
4254 [('f', 'force', None,
4254 [('f', 'force', None,
4255 _('force a merge including outstanding changes (DEPRECATED)')),
4255 _('force a merge including outstanding changes (DEPRECATED)')),
4256 ('r', 'rev', '', _('revision to merge'), _('REV')),
4256 ('r', 'rev', '', _('revision to merge'), _('REV')),
4257 ('P', 'preview', None,
4257 ('P', 'preview', None,
4258 _('review revisions to merge (no merge is performed)'))
4258 _('review revisions to merge (no merge is performed)'))
4259 ] + mergetoolopts,
4259 ] + mergetoolopts,
4260 _('[-P] [-f] [[-r] REV]'))
4260 _('[-P] [-f] [[-r] REV]'))
4261 def merge(ui, repo, node=None, **opts):
4261 def merge(ui, repo, node=None, **opts):
4262 """merge working directory with another revision
4262 """merge working directory with another revision
4263
4263
4264 The current working directory is updated with all changes made in
4264 The current working directory is updated with all changes made in
4265 the requested revision since the last common predecessor revision.
4265 the requested revision since the last common predecessor revision.
4266
4266
4267 Files that changed between either parent are marked as changed for
4267 Files that changed between either parent are marked as changed for
4268 the next commit and a commit must be performed before any further
4268 the next commit and a commit must be performed before any further
4269 updates to the repository are allowed. The next commit will have
4269 updates to the repository are allowed. The next commit will have
4270 two parents.
4270 two parents.
4271
4271
4272 ``--tool`` can be used to specify the merge tool used for file
4272 ``--tool`` can be used to specify the merge tool used for file
4273 merges. It overrides the HGMERGE environment variable and your
4273 merges. It overrides the HGMERGE environment variable and your
4274 configuration files. See :hg:`help merge-tools` for options.
4274 configuration files. See :hg:`help merge-tools` for options.
4275
4275
4276 If no revision is specified, the working directory's parent is a
4276 If no revision is specified, the working directory's parent is a
4277 head revision, and the current branch contains exactly one other
4277 head revision, and the current branch contains exactly one other
4278 head, the other head is merged with by default. Otherwise, an
4278 head, the other head is merged with by default. Otherwise, an
4279 explicit revision with which to merge with must be provided.
4279 explicit revision with which to merge with must be provided.
4280
4280
4281 :hg:`resolve` must be used to resolve unresolved files.
4281 :hg:`resolve` must be used to resolve unresolved files.
4282
4282
4283 To undo an uncommitted merge, use :hg:`update --clean .` which
4283 To undo an uncommitted merge, use :hg:`update --clean .` which
4284 will check out a clean copy of the original merge parent, losing
4284 will check out a clean copy of the original merge parent, losing
4285 all changes.
4285 all changes.
4286
4286
4287 Returns 0 on success, 1 if there are unresolved files.
4287 Returns 0 on success, 1 if there are unresolved files.
4288 """
4288 """
4289
4289
4290 if opts.get('rev') and node:
4290 if opts.get('rev') and node:
4291 raise util.Abort(_("please specify just one revision"))
4291 raise util.Abort(_("please specify just one revision"))
4292 if not node:
4292 if not node:
4293 node = opts.get('rev')
4293 node = opts.get('rev')
4294
4294
4295 if node:
4295 if node:
4296 node = scmutil.revsingle(repo, node).node()
4296 node = scmutil.revsingle(repo, node).node()
4297
4297
4298 if not node and repo._bookmarkcurrent:
4298 if not node and repo._bookmarkcurrent:
4299 bmheads = repo.bookmarkheads(repo._bookmarkcurrent)
4299 bmheads = repo.bookmarkheads(repo._bookmarkcurrent)
4300 curhead = repo[repo._bookmarkcurrent].node()
4300 curhead = repo[repo._bookmarkcurrent].node()
4301 if len(bmheads) == 2:
4301 if len(bmheads) == 2:
4302 if curhead == bmheads[0]:
4302 if curhead == bmheads[0]:
4303 node = bmheads[1]
4303 node = bmheads[1]
4304 else:
4304 else:
4305 node = bmheads[0]
4305 node = bmheads[0]
4306 elif len(bmheads) > 2:
4306 elif len(bmheads) > 2:
4307 raise util.Abort(_("multiple matching bookmarks to merge - "
4307 raise util.Abort(_("multiple matching bookmarks to merge - "
4308 "please merge with an explicit rev or bookmark"),
4308 "please merge with an explicit rev or bookmark"),
4309 hint=_("run 'hg heads' to see all heads"))
4309 hint=_("run 'hg heads' to see all heads"))
4310 elif len(bmheads) <= 1:
4310 elif len(bmheads) <= 1:
4311 raise util.Abort(_("no matching bookmark to merge - "
4311 raise util.Abort(_("no matching bookmark to merge - "
4312 "please merge with an explicit rev or bookmark"),
4312 "please merge with an explicit rev or bookmark"),
4313 hint=_("run 'hg heads' to see all heads"))
4313 hint=_("run 'hg heads' to see all heads"))
4314
4314
4315 if not node and not repo._bookmarkcurrent:
4315 if not node and not repo._bookmarkcurrent:
4316 branch = repo[None].branch()
4316 branch = repo[None].branch()
4317 bheads = repo.branchheads(branch)
4317 bheads = repo.branchheads(branch)
4318 nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
4318 nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
4319
4319
4320 if len(nbhs) > 2:
4320 if len(nbhs) > 2:
4321 raise util.Abort(_("branch '%s' has %d heads - "
4321 raise util.Abort(_("branch '%s' has %d heads - "
4322 "please merge with an explicit rev")
4322 "please merge with an explicit rev")
4323 % (branch, len(bheads)),
4323 % (branch, len(bheads)),
4324 hint=_("run 'hg heads .' to see heads"))
4324 hint=_("run 'hg heads .' to see heads"))
4325
4325
4326 parent = repo.dirstate.p1()
4326 parent = repo.dirstate.p1()
4327 if len(nbhs) <= 1:
4327 if len(nbhs) <= 1:
4328 if len(bheads) > 1:
4328 if len(bheads) > 1:
4329 raise util.Abort(_("heads are bookmarked - "
4329 raise util.Abort(_("heads are bookmarked - "
4330 "please merge with an explicit rev"),
4330 "please merge with an explicit rev"),
4331 hint=_("run 'hg heads' to see all heads"))
4331 hint=_("run 'hg heads' to see all heads"))
4332 if len(repo.heads()) > 1:
4332 if len(repo.heads()) > 1:
4333 raise util.Abort(_("branch '%s' has one head - "
4333 raise util.Abort(_("branch '%s' has one head - "
4334 "please merge with an explicit rev")
4334 "please merge with an explicit rev")
4335 % branch,
4335 % branch,
4336 hint=_("run 'hg heads' to see all heads"))
4336 hint=_("run 'hg heads' to see all heads"))
4337 msg, hint = _('nothing to merge'), None
4337 msg, hint = _('nothing to merge'), None
4338 if parent != repo.lookup(branch):
4338 if parent != repo.lookup(branch):
4339 hint = _("use 'hg update' instead")
4339 hint = _("use 'hg update' instead")
4340 raise util.Abort(msg, hint=hint)
4340 raise util.Abort(msg, hint=hint)
4341
4341
4342 if parent not in bheads:
4342 if parent not in bheads:
4343 raise util.Abort(_('working directory not at a head revision'),
4343 raise util.Abort(_('working directory not at a head revision'),
4344 hint=_("use 'hg update' or merge with an "
4344 hint=_("use 'hg update' or merge with an "
4345 "explicit revision"))
4345 "explicit revision"))
4346 if parent == nbhs[0]:
4346 if parent == nbhs[0]:
4347 node = nbhs[-1]
4347 node = nbhs[-1]
4348 else:
4348 else:
4349 node = nbhs[0]
4349 node = nbhs[0]
4350
4350
4351 if opts.get('preview'):
4351 if opts.get('preview'):
4352 # find nodes that are ancestors of p2 but not of p1
4352 # find nodes that are ancestors of p2 but not of p1
4353 p1 = repo.lookup('.')
4353 p1 = repo.lookup('.')
4354 p2 = repo.lookup(node)
4354 p2 = repo.lookup(node)
4355 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4355 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
4356
4356
4357 displayer = cmdutil.show_changeset(ui, repo, opts)
4357 displayer = cmdutil.show_changeset(ui, repo, opts)
4358 for node in nodes:
4358 for node in nodes:
4359 displayer.show(repo[node])
4359 displayer.show(repo[node])
4360 displayer.close()
4360 displayer.close()
4361 return 0
4361 return 0
4362
4362
4363 try:
4363 try:
4364 # ui.forcemerge is an internal variable, do not document
4364 # ui.forcemerge is an internal variable, do not document
4365 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4365 repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'merge')
4366 return hg.merge(repo, node, force=opts.get('force'))
4366 return hg.merge(repo, node, force=opts.get('force'))
4367 finally:
4367 finally:
4368 ui.setconfig('ui', 'forcemerge', '', 'merge')
4368 ui.setconfig('ui', 'forcemerge', '', 'merge')
4369
4369
4370 @command('outgoing|out',
4370 @command('outgoing|out',
4371 [('f', 'force', None, _('run even when the destination is unrelated')),
4371 [('f', 'force', None, _('run even when the destination is unrelated')),
4372 ('r', 'rev', [],
4372 ('r', 'rev', [],
4373 _('a changeset intended to be included in the destination'), _('REV')),
4373 _('a changeset intended to be included in the destination'), _('REV')),
4374 ('n', 'newest-first', None, _('show newest record first')),
4374 ('n', 'newest-first', None, _('show newest record first')),
4375 ('B', 'bookmarks', False, _('compare bookmarks')),
4375 ('B', 'bookmarks', False, _('compare bookmarks')),
4376 ('b', 'branch', [], _('a specific branch you would like to push'),
4376 ('b', 'branch', [], _('a specific branch you would like to push'),
4377 _('BRANCH')),
4377 _('BRANCH')),
4378 ] + logopts + remoteopts + subrepoopts,
4378 ] + logopts + remoteopts + subrepoopts,
4379 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4379 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
4380 def outgoing(ui, repo, dest=None, **opts):
4380 def outgoing(ui, repo, dest=None, **opts):
4381 """show changesets not found in the destination
4381 """show changesets not found in the destination
4382
4382
4383 Show changesets not found in the specified destination repository
4383 Show changesets not found in the specified destination repository
4384 or the default push location. These are the changesets that would
4384 or the default push location. These are the changesets that would
4385 be pushed if a push was requested.
4385 be pushed if a push was requested.
4386
4386
4387 See pull for details of valid destination formats.
4387 See pull for details of valid destination formats.
4388
4388
4389 Returns 0 if there are outgoing changes, 1 otherwise.
4389 Returns 0 if there are outgoing changes, 1 otherwise.
4390 """
4390 """
4391 if opts.get('graph'):
4391 if opts.get('graph'):
4392 cmdutil.checkunsupportedgraphflags([], opts)
4392 cmdutil.checkunsupportedgraphflags([], opts)
4393 o, other = hg._outgoing(ui, repo, dest, opts)
4393 o, other = hg._outgoing(ui, repo, dest, opts)
4394 if not o:
4394 if not o:
4395 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4395 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4396 return
4396 return
4397
4397
4398 revdag = cmdutil.graphrevs(repo, o, opts)
4398 revdag = cmdutil.graphrevs(repo, o, opts)
4399 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4399 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
4400 showparents = [ctx.node() for ctx in repo[None].parents()]
4400 showparents = [ctx.node() for ctx in repo[None].parents()]
4401 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4401 cmdutil.displaygraph(ui, revdag, displayer, showparents,
4402 graphmod.asciiedges)
4402 graphmod.asciiedges)
4403 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4403 cmdutil.outgoinghooks(ui, repo, other, opts, o)
4404 return 0
4404 return 0
4405
4405
4406 if opts.get('bookmarks'):
4406 if opts.get('bookmarks'):
4407 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4407 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4408 dest, branches = hg.parseurl(dest, opts.get('branch'))
4408 dest, branches = hg.parseurl(dest, opts.get('branch'))
4409 other = hg.peer(repo, opts, dest)
4409 other = hg.peer(repo, opts, dest)
4410 if 'bookmarks' not in other.listkeys('namespaces'):
4410 if 'bookmarks' not in other.listkeys('namespaces'):
4411 ui.warn(_("remote doesn't support bookmarks\n"))
4411 ui.warn(_("remote doesn't support bookmarks\n"))
4412 return 0
4412 return 0
4413 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
4413 ui.status(_('comparing with %s\n') % util.hidepassword(dest))
4414 return bookmarks.diff(ui, other, repo)
4414 return bookmarks.diff(ui, other, repo)
4415
4415
4416 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
4416 repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
4417 try:
4417 try:
4418 return hg.outgoing(ui, repo, dest, opts)
4418 return hg.outgoing(ui, repo, dest, opts)
4419 finally:
4419 finally:
4420 del repo._subtoppath
4420 del repo._subtoppath
4421
4421
4422 @command('parents',
4422 @command('parents',
4423 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
4423 [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
4424 ] + templateopts,
4424 ] + templateopts,
4425 _('[-r REV] [FILE]'),
4425 _('[-r REV] [FILE]'),
4426 inferrepo=True)
4426 inferrepo=True)
4427 def parents(ui, repo, file_=None, **opts):
4427 def parents(ui, repo, file_=None, **opts):
4428 """show the parents of the working directory or revision
4428 """show the parents of the working directory or revision
4429
4429
4430 Print the working directory's parent revisions. If a revision is
4430 Print the working directory's parent revisions. If a revision is
4431 given via -r/--rev, the parent of that revision will be printed.
4431 given via -r/--rev, the parent of that revision will be printed.
4432 If a file argument is given, the revision in which the file was
4432 If a file argument is given, the revision in which the file was
4433 last changed (before the working directory revision or the
4433 last changed (before the working directory revision or the
4434 argument to --rev if given) is printed.
4434 argument to --rev if given) is printed.
4435
4435
4436 Returns 0 on success.
4436 Returns 0 on success.
4437 """
4437 """
4438
4438
4439 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
4439 ctx = scmutil.revsingle(repo, opts.get('rev'), None)
4440
4440
4441 if file_:
4441 if file_:
4442 m = scmutil.match(ctx, (file_,), opts)
4442 m = scmutil.match(ctx, (file_,), opts)
4443 if m.anypats() or len(m.files()) != 1:
4443 if m.anypats() or len(m.files()) != 1:
4444 raise util.Abort(_('can only specify an explicit filename'))
4444 raise util.Abort(_('can only specify an explicit filename'))
4445 file_ = m.files()[0]
4445 file_ = m.files()[0]
4446 filenodes = []
4446 filenodes = []
4447 for cp in ctx.parents():
4447 for cp in ctx.parents():
4448 if not cp:
4448 if not cp:
4449 continue
4449 continue
4450 try:
4450 try:
4451 filenodes.append(cp.filenode(file_))
4451 filenodes.append(cp.filenode(file_))
4452 except error.LookupError:
4452 except error.LookupError:
4453 pass
4453 pass
4454 if not filenodes:
4454 if not filenodes:
4455 raise util.Abort(_("'%s' not found in manifest!") % file_)
4455 raise util.Abort(_("'%s' not found in manifest!") % file_)
4456 p = []
4456 p = []
4457 for fn in filenodes:
4457 for fn in filenodes:
4458 fctx = repo.filectx(file_, fileid=fn)
4458 fctx = repo.filectx(file_, fileid=fn)
4459 p.append(fctx.node())
4459 p.append(fctx.node())
4460 else:
4460 else:
4461 p = [cp.node() for cp in ctx.parents()]
4461 p = [cp.node() for cp in ctx.parents()]
4462
4462
4463 displayer = cmdutil.show_changeset(ui, repo, opts)
4463 displayer = cmdutil.show_changeset(ui, repo, opts)
4464 for n in p:
4464 for n in p:
4465 if n != nullid:
4465 if n != nullid:
4466 displayer.show(repo[n])
4466 displayer.show(repo[n])
4467 displayer.close()
4467 displayer.close()
4468
4468
4469 @command('paths', [], _('[NAME]'), optionalrepo=True)
4469 @command('paths', [], _('[NAME]'), optionalrepo=True)
4470 def paths(ui, repo, search=None):
4470 def paths(ui, repo, search=None):
4471 """show aliases for remote repositories
4471 """show aliases for remote repositories
4472
4472
4473 Show definition of symbolic path name NAME. If no name is given,
4473 Show definition of symbolic path name NAME. If no name is given,
4474 show definition of all available names.
4474 show definition of all available names.
4475
4475
4476 Option -q/--quiet suppresses all output when searching for NAME
4476 Option -q/--quiet suppresses all output when searching for NAME
4477 and shows only the path names when listing all definitions.
4477 and shows only the path names when listing all definitions.
4478
4478
4479 Path names are defined in the [paths] section of your
4479 Path names are defined in the [paths] section of your
4480 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
4480 configuration file and in ``/etc/mercurial/hgrc``. If run inside a
4481 repository, ``.hg/hgrc`` is used, too.
4481 repository, ``.hg/hgrc`` is used, too.
4482
4482
4483 The path names ``default`` and ``default-push`` have a special
4483 The path names ``default`` and ``default-push`` have a special
4484 meaning. When performing a push or pull operation, they are used
4484 meaning. When performing a push or pull operation, they are used
4485 as fallbacks if no location is specified on the command-line.
4485 as fallbacks if no location is specified on the command-line.
4486 When ``default-push`` is set, it will be used for push and
4486 When ``default-push`` is set, it will be used for push and
4487 ``default`` will be used for pull; otherwise ``default`` is used
4487 ``default`` will be used for pull; otherwise ``default`` is used
4488 as the fallback for both. When cloning a repository, the clone
4488 as the fallback for both. When cloning a repository, the clone
4489 source is written as ``default`` in ``.hg/hgrc``. Note that
4489 source is written as ``default`` in ``.hg/hgrc``. Note that
4490 ``default`` and ``default-push`` apply to all inbound (e.g.
4490 ``default`` and ``default-push`` apply to all inbound (e.g.
4491 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
4491 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
4492 :hg:`bundle`) operations.
4492 :hg:`bundle`) operations.
4493
4493
4494 See :hg:`help urls` for more information.
4494 See :hg:`help urls` for more information.
4495
4495
4496 Returns 0 on success.
4496 Returns 0 on success.
4497 """
4497 """
4498 if search:
4498 if search:
4499 for name, path in ui.configitems("paths"):
4499 for name, path in ui.configitems("paths"):
4500 if name == search:
4500 if name == search:
4501 ui.status("%s\n" % util.hidepassword(path))
4501 ui.status("%s\n" % util.hidepassword(path))
4502 return
4502 return
4503 if not ui.quiet:
4503 if not ui.quiet:
4504 ui.warn(_("not found!\n"))
4504 ui.warn(_("not found!\n"))
4505 return 1
4505 return 1
4506 else:
4506 else:
4507 for name, path in ui.configitems("paths"):
4507 for name, path in ui.configitems("paths"):
4508 if ui.quiet:
4508 if ui.quiet:
4509 ui.write("%s\n" % name)
4509 ui.write("%s\n" % name)
4510 else:
4510 else:
4511 ui.write("%s = %s\n" % (name, util.hidepassword(path)))
4511 ui.write("%s = %s\n" % (name, util.hidepassword(path)))
4512
4512
4513 @command('phase',
4513 @command('phase',
4514 [('p', 'public', False, _('set changeset phase to public')),
4514 [('p', 'public', False, _('set changeset phase to public')),
4515 ('d', 'draft', False, _('set changeset phase to draft')),
4515 ('d', 'draft', False, _('set changeset phase to draft')),
4516 ('s', 'secret', False, _('set changeset phase to secret')),
4516 ('s', 'secret', False, _('set changeset phase to secret')),
4517 ('f', 'force', False, _('allow to move boundary backward')),
4517 ('f', 'force', False, _('allow to move boundary backward')),
4518 ('r', 'rev', [], _('target revision'), _('REV')),
4518 ('r', 'rev', [], _('target revision'), _('REV')),
4519 ],
4519 ],
4520 _('[-p|-d|-s] [-f] [-r] REV...'))
4520 _('[-p|-d|-s] [-f] [-r] REV...'))
4521 def phase(ui, repo, *revs, **opts):
4521 def phase(ui, repo, *revs, **opts):
4522 """set or show the current phase name
4522 """set or show the current phase name
4523
4523
4524 With no argument, show the phase name of specified revisions.
4524 With no argument, show the phase name of specified revisions.
4525
4525
4526 With one of -p/--public, -d/--draft or -s/--secret, change the
4526 With one of -p/--public, -d/--draft or -s/--secret, change the
4527 phase value of the specified revisions.
4527 phase value of the specified revisions.
4528
4528
4529 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
4529 Unless -f/--force is specified, :hg:`phase` won't move changeset from a
4530 lower phase to an higher phase. Phases are ordered as follows::
4530 lower phase to an higher phase. Phases are ordered as follows::
4531
4531
4532 public < draft < secret
4532 public < draft < secret
4533
4533
4534 Returns 0 on success, 1 if no phases were changed or some could not
4534 Returns 0 on success, 1 if no phases were changed or some could not
4535 be changed.
4535 be changed.
4536 """
4536 """
4537 # search for a unique phase argument
4537 # search for a unique phase argument
4538 targetphase = None
4538 targetphase = None
4539 for idx, name in enumerate(phases.phasenames):
4539 for idx, name in enumerate(phases.phasenames):
4540 if opts[name]:
4540 if opts[name]:
4541 if targetphase is not None:
4541 if targetphase is not None:
4542 raise util.Abort(_('only one phase can be specified'))
4542 raise util.Abort(_('only one phase can be specified'))
4543 targetphase = idx
4543 targetphase = idx
4544
4544
4545 # look for specified revision
4545 # look for specified revision
4546 revs = list(revs)
4546 revs = list(revs)
4547 revs.extend(opts['rev'])
4547 revs.extend(opts['rev'])
4548 if not revs:
4548 if not revs:
4549 raise util.Abort(_('no revisions specified'))
4549 raise util.Abort(_('no revisions specified'))
4550
4550
4551 revs = scmutil.revrange(repo, revs)
4551 revs = scmutil.revrange(repo, revs)
4552
4552
4553 lock = None
4553 lock = None
4554 ret = 0
4554 ret = 0
4555 if targetphase is None:
4555 if targetphase is None:
4556 # display
4556 # display
4557 for r in revs:
4557 for r in revs:
4558 ctx = repo[r]
4558 ctx = repo[r]
4559 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
4559 ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
4560 else:
4560 else:
4561 lock = repo.lock()
4561 lock = repo.lock()
4562 try:
4562 try:
4563 # set phase
4563 # set phase
4564 if not revs:
4564 if not revs:
4565 raise util.Abort(_('empty revision set'))
4565 raise util.Abort(_('empty revision set'))
4566 nodes = [repo[r].node() for r in revs]
4566 nodes = [repo[r].node() for r in revs]
4567 olddata = repo._phasecache.getphaserevs(repo)[:]
4567 olddata = repo._phasecache.getphaserevs(repo)[:]
4568 phases.advanceboundary(repo, targetphase, nodes)
4568 phases.advanceboundary(repo, targetphase, nodes)
4569 if opts['force']:
4569 if opts['force']:
4570 phases.retractboundary(repo, targetphase, nodes)
4570 phases.retractboundary(repo, targetphase, nodes)
4571 finally:
4571 finally:
4572 lock.release()
4572 lock.release()
4573 # moving revision from public to draft may hide them
4573 # moving revision from public to draft may hide them
4574 # We have to check result on an unfiltered repository
4574 # We have to check result on an unfiltered repository
4575 unfi = repo.unfiltered()
4575 unfi = repo.unfiltered()
4576 newdata = repo._phasecache.getphaserevs(unfi)
4576 newdata = repo._phasecache.getphaserevs(unfi)
4577 changes = sum(o != newdata[i] for i, o in enumerate(olddata))
4577 changes = sum(o != newdata[i] for i, o in enumerate(olddata))
4578 cl = unfi.changelog
4578 cl = unfi.changelog
4579 rejected = [n for n in nodes
4579 rejected = [n for n in nodes
4580 if newdata[cl.rev(n)] < targetphase]
4580 if newdata[cl.rev(n)] < targetphase]
4581 if rejected:
4581 if rejected:
4582 ui.warn(_('cannot move %i changesets to a higher '
4582 ui.warn(_('cannot move %i changesets to a higher '
4583 'phase, use --force\n') % len(rejected))
4583 'phase, use --force\n') % len(rejected))
4584 ret = 1
4584 ret = 1
4585 if changes:
4585 if changes:
4586 msg = _('phase changed for %i changesets\n') % changes
4586 msg = _('phase changed for %i changesets\n') % changes
4587 if ret:
4587 if ret:
4588 ui.status(msg)
4588 ui.status(msg)
4589 else:
4589 else:
4590 ui.note(msg)
4590 ui.note(msg)
4591 else:
4591 else:
4592 ui.warn(_('no phases changed\n'))
4592 ui.warn(_('no phases changed\n'))
4593 ret = 1
4593 ret = 1
4594 return ret
4594 return ret
4595
4595
4596 def postincoming(ui, repo, modheads, optupdate, checkout):
4596 def postincoming(ui, repo, modheads, optupdate, checkout):
4597 if modheads == 0:
4597 if modheads == 0:
4598 return
4598 return
4599 if optupdate:
4599 if optupdate:
4600 checkout, movemarkfrom = bookmarks.calculateupdate(ui, repo, checkout)
4600 checkout, movemarkfrom = bookmarks.calculateupdate(ui, repo, checkout)
4601 try:
4601 try:
4602 ret = hg.update(repo, checkout)
4602 ret = hg.update(repo, checkout)
4603 except util.Abort, inst:
4603 except util.Abort, inst:
4604 ui.warn(_("not updating: %s\n") % str(inst))
4604 ui.warn(_("not updating: %s\n") % str(inst))
4605 if inst.hint:
4605 if inst.hint:
4606 ui.warn(_("(%s)\n") % inst.hint)
4606 ui.warn(_("(%s)\n") % inst.hint)
4607 return 0
4607 return 0
4608 if not ret and not checkout:
4608 if not ret and not checkout:
4609 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
4609 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
4610 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
4610 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
4611 return ret
4611 return ret
4612 if modheads > 1:
4612 if modheads > 1:
4613 currentbranchheads = len(repo.branchheads())
4613 currentbranchheads = len(repo.branchheads())
4614 if currentbranchheads == modheads:
4614 if currentbranchheads == modheads:
4615 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
4615 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
4616 elif currentbranchheads > 1:
4616 elif currentbranchheads > 1:
4617 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
4617 ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
4618 "merge)\n"))
4618 "merge)\n"))
4619 else:
4619 else:
4620 ui.status(_("(run 'hg heads' to see heads)\n"))
4620 ui.status(_("(run 'hg heads' to see heads)\n"))
4621 else:
4621 else:
4622 ui.status(_("(run 'hg update' to get a working copy)\n"))
4622 ui.status(_("(run 'hg update' to get a working copy)\n"))
4623
4623
4624 @command('^pull',
4624 @command('^pull',
4625 [('u', 'update', None,
4625 [('u', 'update', None,
4626 _('update to new branch head if changesets were pulled')),
4626 _('update to new branch head if changesets were pulled')),
4627 ('f', 'force', None, _('run even when remote repository is unrelated')),
4627 ('f', 'force', None, _('run even when remote repository is unrelated')),
4628 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4628 ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
4629 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
4629 ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
4630 ('b', 'branch', [], _('a specific branch you would like to pull'),
4630 ('b', 'branch', [], _('a specific branch you would like to pull'),
4631 _('BRANCH')),
4631 _('BRANCH')),
4632 ] + remoteopts,
4632 ] + remoteopts,
4633 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
4633 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
4634 def pull(ui, repo, source="default", **opts):
4634 def pull(ui, repo, source="default", **opts):
4635 """pull changes from the specified source
4635 """pull changes from the specified source
4636
4636
4637 Pull changes from a remote repository to a local one.
4637 Pull changes from a remote repository to a local one.
4638
4638
4639 This finds all changes from the repository at the specified path
4639 This finds all changes from the repository at the specified path
4640 or URL and adds them to a local repository (the current one unless
4640 or URL and adds them to a local repository (the current one unless
4641 -R is specified). By default, this does not update the copy of the
4641 -R is specified). By default, this does not update the copy of the
4642 project in the working directory.
4642 project in the working directory.
4643
4643
4644 Use :hg:`incoming` if you want to see what would have been added
4644 Use :hg:`incoming` if you want to see what would have been added
4645 by a pull at the time you issued this command. If you then decide
4645 by a pull at the time you issued this command. If you then decide
4646 to add those changes to the repository, you should use :hg:`pull
4646 to add those changes to the repository, you should use :hg:`pull
4647 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
4647 -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
4648
4648
4649 If SOURCE is omitted, the 'default' path will be used.
4649 If SOURCE is omitted, the 'default' path will be used.
4650 See :hg:`help urls` for more information.
4650 See :hg:`help urls` for more information.
4651
4651
4652 Returns 0 on success, 1 if an update had unresolved files.
4652 Returns 0 on success, 1 if an update had unresolved files.
4653 """
4653 """
4654 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
4654 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
4655 other = hg.peer(repo, opts, source)
4655 other = hg.peer(repo, opts, source)
4656 try:
4656 try:
4657 ui.status(_('pulling from %s\n') % util.hidepassword(source))
4657 ui.status(_('pulling from %s\n') % util.hidepassword(source))
4658 revs, checkout = hg.addbranchrevs(repo, other, branches,
4658 revs, checkout = hg.addbranchrevs(repo, other, branches,
4659 opts.get('rev'))
4659 opts.get('rev'))
4660
4660
4661 remotebookmarks = other.listkeys('bookmarks')
4661 remotebookmarks = other.listkeys('bookmarks')
4662
4662
4663 if opts.get('bookmark'):
4663 if opts.get('bookmark'):
4664 if not revs:
4664 if not revs:
4665 revs = []
4665 revs = []
4666 for b in opts['bookmark']:
4666 for b in opts['bookmark']:
4667 if b not in remotebookmarks:
4667 if b not in remotebookmarks:
4668 raise util.Abort(_('remote bookmark %s not found!') % b)
4668 raise util.Abort(_('remote bookmark %s not found!') % b)
4669 revs.append(remotebookmarks[b])
4669 revs.append(remotebookmarks[b])
4670
4670
4671 if revs:
4671 if revs:
4672 try:
4672 try:
4673 revs = [other.lookup(rev) for rev in revs]
4673 revs = [other.lookup(rev) for rev in revs]
4674 except error.CapabilityError:
4674 except error.CapabilityError:
4675 err = _("other repository doesn't support revision lookup, "
4675 err = _("other repository doesn't support revision lookup, "
4676 "so a rev cannot be specified.")
4676 "so a rev cannot be specified.")
4677 raise util.Abort(err)
4677 raise util.Abort(err)
4678
4678
4679 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
4679 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
4680 bookmarks.updatefromremote(ui, repo, remotebookmarks, source)
4680 bookmarks.updatefromremote(ui, repo, remotebookmarks, source)
4681 if checkout:
4681 if checkout:
4682 checkout = str(repo.changelog.rev(other.lookup(checkout)))
4682 checkout = str(repo.changelog.rev(other.lookup(checkout)))
4683 repo._subtoppath = source
4683 repo._subtoppath = source
4684 try:
4684 try:
4685 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
4685 ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
4686
4686
4687 finally:
4687 finally:
4688 del repo._subtoppath
4688 del repo._subtoppath
4689
4689
4690 # update specified bookmarks
4690 # update specified bookmarks
4691 if opts.get('bookmark'):
4691 if opts.get('bookmark'):
4692 marks = repo._bookmarks
4692 marks = repo._bookmarks
4693 for b in opts['bookmark']:
4693 for b in opts['bookmark']:
4694 # explicit pull overrides local bookmark if any
4694 # explicit pull overrides local bookmark if any
4695 ui.status(_("importing bookmark %s\n") % b)
4695 ui.status(_("importing bookmark %s\n") % b)
4696 marks[b] = repo[remotebookmarks[b]].node()
4696 marks[b] = repo[remotebookmarks[b]].node()
4697 marks.write()
4697 marks.write()
4698 finally:
4698 finally:
4699 other.close()
4699 other.close()
4700 return ret
4700 return ret
4701
4701
4702 @command('^push',
4702 @command('^push',
4703 [('f', 'force', None, _('force push')),
4703 [('f', 'force', None, _('force push')),
4704 ('r', 'rev', [],
4704 ('r', 'rev', [],
4705 _('a changeset intended to be included in the destination'),
4705 _('a changeset intended to be included in the destination'),
4706 _('REV')),
4706 _('REV')),
4707 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
4707 ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
4708 ('b', 'branch', [],
4708 ('b', 'branch', [],
4709 _('a specific branch you would like to push'), _('BRANCH')),
4709 _('a specific branch you would like to push'), _('BRANCH')),
4710 ('', 'new-branch', False, _('allow pushing a new branch')),
4710 ('', 'new-branch', False, _('allow pushing a new branch')),
4711 ] + remoteopts,
4711 ] + remoteopts,
4712 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
4712 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
4713 def push(ui, repo, dest=None, **opts):
4713 def push(ui, repo, dest=None, **opts):
4714 """push changes to the specified destination
4714 """push changes to the specified destination
4715
4715
4716 Push changesets from the local repository to the specified
4716 Push changesets from the local repository to the specified
4717 destination.
4717 destination.
4718
4718
4719 This operation is symmetrical to pull: it is identical to a pull
4719 This operation is symmetrical to pull: it is identical to a pull
4720 in the destination repository from the current one.
4720 in the destination repository from the current one.
4721
4721
4722 By default, push will not allow creation of new heads at the
4722 By default, push will not allow creation of new heads at the
4723 destination, since multiple heads would make it unclear which head
4723 destination, since multiple heads would make it unclear which head
4724 to use. In this situation, it is recommended to pull and merge
4724 to use. In this situation, it is recommended to pull and merge
4725 before pushing.
4725 before pushing.
4726
4726
4727 Use --new-branch if you want to allow push to create a new named
4727 Use --new-branch if you want to allow push to create a new named
4728 branch that is not present at the destination. This allows you to
4728 branch that is not present at the destination. This allows you to
4729 only create a new branch without forcing other changes.
4729 only create a new branch without forcing other changes.
4730
4730
4731 .. note::
4731 .. note::
4732
4732
4733 Extra care should be taken with the -f/--force option,
4733 Extra care should be taken with the -f/--force option,
4734 which will push all new heads on all branches, an action which will
4734 which will push all new heads on all branches, an action which will
4735 almost always cause confusion for collaborators.
4735 almost always cause confusion for collaborators.
4736
4736
4737 If -r/--rev is used, the specified revision and all its ancestors
4737 If -r/--rev is used, the specified revision and all its ancestors
4738 will be pushed to the remote repository.
4738 will be pushed to the remote repository.
4739
4739
4740 If -B/--bookmark is used, the specified bookmarked revision, its
4740 If -B/--bookmark is used, the specified bookmarked revision, its
4741 ancestors, and the bookmark will be pushed to the remote
4741 ancestors, and the bookmark will be pushed to the remote
4742 repository.
4742 repository.
4743
4743
4744 Please see :hg:`help urls` for important details about ``ssh://``
4744 Please see :hg:`help urls` for important details about ``ssh://``
4745 URLs. If DESTINATION is omitted, a default path will be used.
4745 URLs. If DESTINATION is omitted, a default path will be used.
4746
4746
4747 Returns 0 if push was successful, 1 if nothing to push.
4747 Returns 0 if push was successful, 1 if nothing to push.
4748 """
4748 """
4749
4749
4750 if opts.get('bookmark'):
4750 if opts.get('bookmark'):
4751 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
4751 ui.setconfig('bookmarks', 'pushing', opts['bookmark'], 'push')
4752 for b in opts['bookmark']:
4752 for b in opts['bookmark']:
4753 # translate -B options to -r so changesets get pushed
4753 # translate -B options to -r so changesets get pushed
4754 if b in repo._bookmarks:
4754 if b in repo._bookmarks:
4755 opts.setdefault('rev', []).append(b)
4755 opts.setdefault('rev', []).append(b)
4756 else:
4756 else:
4757 # if we try to push a deleted bookmark, translate it to null
4757 # if we try to push a deleted bookmark, translate it to null
4758 # this lets simultaneous -r, -b options continue working
4758 # this lets simultaneous -r, -b options continue working
4759 opts.setdefault('rev', []).append("null")
4759 opts.setdefault('rev', []).append("null")
4760
4760
4761 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4761 dest = ui.expandpath(dest or 'default-push', dest or 'default')
4762 dest, branches = hg.parseurl(dest, opts.get('branch'))
4762 dest, branches = hg.parseurl(dest, opts.get('branch'))
4763 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
4763 ui.status(_('pushing to %s\n') % util.hidepassword(dest))
4764 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
4764 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
4765 try:
4765 try:
4766 other = hg.peer(repo, opts, dest)
4766 other = hg.peer(repo, opts, dest)
4767 except error.RepoError:
4767 except error.RepoError:
4768 if dest == "default-push":
4768 if dest == "default-push":
4769 raise util.Abort(_("default repository not configured!"),
4769 raise util.Abort(_("default repository not configured!"),
4770 hint=_('see the "path" section in "hg help config"'))
4770 hint=_('see the "path" section in "hg help config"'))
4771 else:
4771 else:
4772 raise
4772 raise
4773
4773
4774 if revs:
4774 if revs:
4775 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
4775 revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
4776
4776
4777 repo._subtoppath = dest
4777 repo._subtoppath = dest
4778 try:
4778 try:
4779 # push subrepos depth-first for coherent ordering
4779 # push subrepos depth-first for coherent ordering
4780 c = repo['']
4780 c = repo['']
4781 subs = c.substate # only repos that are committed
4781 subs = c.substate # only repos that are committed
4782 for s in sorted(subs):
4782 for s in sorted(subs):
4783 result = c.sub(s).push(opts)
4783 result = c.sub(s).push(opts)
4784 if result == 0:
4784 if result == 0:
4785 return not result
4785 return not result
4786 finally:
4786 finally:
4787 del repo._subtoppath
4787 del repo._subtoppath
4788 result = repo.push(other, opts.get('force'), revs=revs,
4788 result = repo.push(other, opts.get('force'), revs=revs,
4789 newbranch=opts.get('new_branch'))
4789 newbranch=opts.get('new_branch'))
4790
4790
4791 result = not result
4791 result = not result
4792
4792
4793 if opts.get('bookmark'):
4793 if opts.get('bookmark'):
4794 bresult = bookmarks.pushtoremote(ui, repo, other, opts['bookmark'])
4794 bresult = bookmarks.pushtoremote(ui, repo, other, opts['bookmark'])
4795 if bresult == 2:
4795 if bresult == 2:
4796 return 2
4796 return 2
4797 if not result and bresult:
4797 if not result and bresult:
4798 result = 2
4798 result = 2
4799
4799
4800 return result
4800 return result
4801
4801
4802 @command('recover', [])
4802 @command('recover', [])
4803 def recover(ui, repo):
4803 def recover(ui, repo):
4804 """roll back an interrupted transaction
4804 """roll back an interrupted transaction
4805
4805
4806 Recover from an interrupted commit or pull.
4806 Recover from an interrupted commit or pull.
4807
4807
4808 This command tries to fix the repository status after an
4808 This command tries to fix the repository status after an
4809 interrupted operation. It should only be necessary when Mercurial
4809 interrupted operation. It should only be necessary when Mercurial
4810 suggests it.
4810 suggests it.
4811
4811
4812 Returns 0 if successful, 1 if nothing to recover or verify fails.
4812 Returns 0 if successful, 1 if nothing to recover or verify fails.
4813 """
4813 """
4814 if repo.recover():
4814 if repo.recover():
4815 return hg.verify(repo)
4815 return hg.verify(repo)
4816 return 1
4816 return 1
4817
4817
4818 @command('^remove|rm',
4818 @command('^remove|rm',
4819 [('A', 'after', None, _('record delete for missing files')),
4819 [('A', 'after', None, _('record delete for missing files')),
4820 ('f', 'force', None,
4820 ('f', 'force', None,
4821 _('remove (and delete) file even if added or modified')),
4821 _('remove (and delete) file even if added or modified')),
4822 ] + walkopts,
4822 ] + walkopts,
4823 _('[OPTION]... FILE...'),
4823 _('[OPTION]... FILE...'),
4824 inferrepo=True)
4824 inferrepo=True)
4825 def remove(ui, repo, *pats, **opts):
4825 def remove(ui, repo, *pats, **opts):
4826 """remove the specified files on the next commit
4826 """remove the specified files on the next commit
4827
4827
4828 Schedule the indicated files for removal from the current branch.
4828 Schedule the indicated files for removal from the current branch.
4829
4829
4830 This command schedules the files to be removed at the next commit.
4830 This command schedules the files to be removed at the next commit.
4831 To undo a remove before that, see :hg:`revert`. To undo added
4831 To undo a remove before that, see :hg:`revert`. To undo added
4832 files, see :hg:`forget`.
4832 files, see :hg:`forget`.
4833
4833
4834 .. container:: verbose
4834 .. container:: verbose
4835
4835
4836 -A/--after can be used to remove only files that have already
4836 -A/--after can be used to remove only files that have already
4837 been deleted, -f/--force can be used to force deletion, and -Af
4837 been deleted, -f/--force can be used to force deletion, and -Af
4838 can be used to remove files from the next revision without
4838 can be used to remove files from the next revision without
4839 deleting them from the working directory.
4839 deleting them from the working directory.
4840
4840
4841 The following table details the behavior of remove for different
4841 The following table details the behavior of remove for different
4842 file states (columns) and option combinations (rows). The file
4842 file states (columns) and option combinations (rows). The file
4843 states are Added [A], Clean [C], Modified [M] and Missing [!]
4843 states are Added [A], Clean [C], Modified [M] and Missing [!]
4844 (as reported by :hg:`status`). The actions are Warn, Remove
4844 (as reported by :hg:`status`). The actions are Warn, Remove
4845 (from branch) and Delete (from disk):
4845 (from branch) and Delete (from disk):
4846
4846
4847 ========= == == == ==
4847 ========= == == == ==
4848 opt/state A C M !
4848 opt/state A C M !
4849 ========= == == == ==
4849 ========= == == == ==
4850 none W RD W R
4850 none W RD W R
4851 -f R RD RD R
4851 -f R RD RD R
4852 -A W W W R
4852 -A W W W R
4853 -Af R R R R
4853 -Af R R R R
4854 ========= == == == ==
4854 ========= == == == ==
4855
4855
4856 Note that remove never deletes files in Added [A] state from the
4856 Note that remove never deletes files in Added [A] state from the
4857 working directory, not even if option --force is specified.
4857 working directory, not even if option --force is specified.
4858
4858
4859 Returns 0 on success, 1 if any warnings encountered.
4859 Returns 0 on success, 1 if any warnings encountered.
4860 """
4860 """
4861
4861
4862 ret = 0
4862 ret = 0
4863 after, force = opts.get('after'), opts.get('force')
4863 after, force = opts.get('after'), opts.get('force')
4864 if not pats and not after:
4864 if not pats and not after:
4865 raise util.Abort(_('no files specified'))
4865 raise util.Abort(_('no files specified'))
4866
4866
4867 m = scmutil.match(repo[None], pats, opts)
4867 m = scmutil.match(repo[None], pats, opts)
4868 s = repo.status(match=m, clean=True)
4868 s = repo.status(match=m, clean=True)
4869 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
4869 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
4870
4870
4871 # warn about failure to delete explicit files/dirs
4871 # warn about failure to delete explicit files/dirs
4872 wctx = repo[None]
4872 wctx = repo[None]
4873 for f in m.files():
4873 for f in m.files():
4874 if f in repo.dirstate or f in wctx.dirs():
4874 if f in repo.dirstate or f in wctx.dirs():
4875 continue
4875 continue
4876 if os.path.exists(m.rel(f)):
4876 if os.path.exists(m.rel(f)):
4877 if os.path.isdir(m.rel(f)):
4877 if os.path.isdir(m.rel(f)):
4878 ui.warn(_('not removing %s: no tracked files\n') % m.rel(f))
4878 ui.warn(_('not removing %s: no tracked files\n') % m.rel(f))
4879 else:
4879 else:
4880 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
4880 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
4881 # missing files will generate a warning elsewhere
4881 # missing files will generate a warning elsewhere
4882 ret = 1
4882 ret = 1
4883
4883
4884 if force:
4884 if force:
4885 list = modified + deleted + clean + added
4885 list = modified + deleted + clean + added
4886 elif after:
4886 elif after:
4887 list = deleted
4887 list = deleted
4888 for f in modified + added + clean:
4888 for f in modified + added + clean:
4889 ui.warn(_('not removing %s: file still exists\n') % m.rel(f))
4889 ui.warn(_('not removing %s: file still exists\n') % m.rel(f))
4890 ret = 1
4890 ret = 1
4891 else:
4891 else:
4892 list = deleted + clean
4892 list = deleted + clean
4893 for f in modified:
4893 for f in modified:
4894 ui.warn(_('not removing %s: file is modified (use -f'
4894 ui.warn(_('not removing %s: file is modified (use -f'
4895 ' to force removal)\n') % m.rel(f))
4895 ' to force removal)\n') % m.rel(f))
4896 ret = 1
4896 ret = 1
4897 for f in added:
4897 for f in added:
4898 ui.warn(_('not removing %s: file has been marked for add'
4898 ui.warn(_('not removing %s: file has been marked for add'
4899 ' (use forget to undo)\n') % m.rel(f))
4899 ' (use forget to undo)\n') % m.rel(f))
4900 ret = 1
4900 ret = 1
4901
4901
4902 for f in sorted(list):
4902 for f in sorted(list):
4903 if ui.verbose or not m.exact(f):
4903 if ui.verbose or not m.exact(f):
4904 ui.status(_('removing %s\n') % m.rel(f))
4904 ui.status(_('removing %s\n') % m.rel(f))
4905
4905
4906 wlock = repo.wlock()
4906 wlock = repo.wlock()
4907 try:
4907 try:
4908 if not after:
4908 if not after:
4909 for f in list:
4909 for f in list:
4910 if f in added:
4910 if f in added:
4911 continue # we never unlink added files on remove
4911 continue # we never unlink added files on remove
4912 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
4912 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
4913 repo[None].forget(list)
4913 repo[None].forget(list)
4914 finally:
4914 finally:
4915 wlock.release()
4915 wlock.release()
4916
4916
4917 return ret
4917 return ret
4918
4918
4919 @command('rename|move|mv',
4919 @command('rename|move|mv',
4920 [('A', 'after', None, _('record a rename that has already occurred')),
4920 [('A', 'after', None, _('record a rename that has already occurred')),
4921 ('f', 'force', None, _('forcibly copy over an existing managed file')),
4921 ('f', 'force', None, _('forcibly copy over an existing managed file')),
4922 ] + walkopts + dryrunopts,
4922 ] + walkopts + dryrunopts,
4923 _('[OPTION]... SOURCE... DEST'))
4923 _('[OPTION]... SOURCE... DEST'))
4924 def rename(ui, repo, *pats, **opts):
4924 def rename(ui, repo, *pats, **opts):
4925 """rename files; equivalent of copy + remove
4925 """rename files; equivalent of copy + remove
4926
4926
4927 Mark dest as copies of sources; mark sources for deletion. If dest
4927 Mark dest as copies of sources; mark sources for deletion. If dest
4928 is a directory, copies are put in that directory. If dest is a
4928 is a directory, copies are put in that directory. If dest is a
4929 file, there can only be one source.
4929 file, there can only be one source.
4930
4930
4931 By default, this command copies the contents of files as they
4931 By default, this command copies the contents of files as they
4932 exist in the working directory. If invoked with -A/--after, the
4932 exist in the working directory. If invoked with -A/--after, the
4933 operation is recorded, but no copying is performed.
4933 operation is recorded, but no copying is performed.
4934
4934
4935 This command takes effect at the next commit. To undo a rename
4935 This command takes effect at the next commit. To undo a rename
4936 before that, see :hg:`revert`.
4936 before that, see :hg:`revert`.
4937
4937
4938 Returns 0 on success, 1 if errors are encountered.
4938 Returns 0 on success, 1 if errors are encountered.
4939 """
4939 """
4940 wlock = repo.wlock(False)
4940 wlock = repo.wlock(False)
4941 try:
4941 try:
4942 return cmdutil.copy(ui, repo, pats, opts, rename=True)
4942 return cmdutil.copy(ui, repo, pats, opts, rename=True)
4943 finally:
4943 finally:
4944 wlock.release()
4944 wlock.release()
4945
4945
4946 @command('resolve',
4946 @command('resolve',
4947 [('a', 'all', None, _('select all unresolved files')),
4947 [('a', 'all', None, _('select all unresolved files')),
4948 ('l', 'list', None, _('list state of files needing merge')),
4948 ('l', 'list', None, _('list state of files needing merge')),
4949 ('m', 'mark', None, _('mark files as resolved')),
4949 ('m', 'mark', None, _('mark files as resolved')),
4950 ('u', 'unmark', None, _('mark files as unresolved')),
4950 ('u', 'unmark', None, _('mark files as unresolved')),
4951 ('n', 'no-status', None, _('hide status prefix'))]
4951 ('n', 'no-status', None, _('hide status prefix'))]
4952 + mergetoolopts + walkopts,
4952 + mergetoolopts + walkopts,
4953 _('[OPTION]... [FILE]...'),
4953 _('[OPTION]... [FILE]...'),
4954 inferrepo=True)
4954 inferrepo=True)
4955 def resolve(ui, repo, *pats, **opts):
4955 def resolve(ui, repo, *pats, **opts):
4956 """redo merges or set/view the merge status of files
4956 """redo merges or set/view the merge status of files
4957
4957
4958 Merges with unresolved conflicts are often the result of
4958 Merges with unresolved conflicts are often the result of
4959 non-interactive merging using the ``internal:merge`` configuration
4959 non-interactive merging using the ``internal:merge`` configuration
4960 setting, or a command-line merge tool like ``diff3``. The resolve
4960 setting, or a command-line merge tool like ``diff3``. The resolve
4961 command is used to manage the files involved in a merge, after
4961 command is used to manage the files involved in a merge, after
4962 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
4962 :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
4963 working directory must have two parents). See :hg:`help
4963 working directory must have two parents). See :hg:`help
4964 merge-tools` for information on configuring merge tools.
4964 merge-tools` for information on configuring merge tools.
4965
4965
4966 The resolve command can be used in the following ways:
4966 The resolve command can be used in the following ways:
4967
4967
4968 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
4968 - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
4969 files, discarding any previous merge attempts. Re-merging is not
4969 files, discarding any previous merge attempts. Re-merging is not
4970 performed for files already marked as resolved. Use ``--all/-a``
4970 performed for files already marked as resolved. Use ``--all/-a``
4971 to select all unresolved files. ``--tool`` can be used to specify
4971 to select all unresolved files. ``--tool`` can be used to specify
4972 the merge tool used for the given files. It overrides the HGMERGE
4972 the merge tool used for the given files. It overrides the HGMERGE
4973 environment variable and your configuration files. Previous file
4973 environment variable and your configuration files. Previous file
4974 contents are saved with a ``.orig`` suffix.
4974 contents are saved with a ``.orig`` suffix.
4975
4975
4976 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
4976 - :hg:`resolve -m [FILE]`: mark a file as having been resolved
4977 (e.g. after having manually fixed-up the files). The default is
4977 (e.g. after having manually fixed-up the files). The default is
4978 to mark all unresolved files.
4978 to mark all unresolved files.
4979
4979
4980 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
4980 - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
4981 default is to mark all resolved files.
4981 default is to mark all resolved files.
4982
4982
4983 - :hg:`resolve -l`: list files which had or still have conflicts.
4983 - :hg:`resolve -l`: list files which had or still have conflicts.
4984 In the printed list, ``U`` = unresolved and ``R`` = resolved.
4984 In the printed list, ``U`` = unresolved and ``R`` = resolved.
4985
4985
4986 Note that Mercurial will not let you commit files with unresolved
4986 Note that Mercurial will not let you commit files with unresolved
4987 merge conflicts. You must use :hg:`resolve -m ...` before you can
4987 merge conflicts. You must use :hg:`resolve -m ...` before you can
4988 commit after a conflicting merge.
4988 commit after a conflicting merge.
4989
4989
4990 Returns 0 on success, 1 if any files fail a resolve attempt.
4990 Returns 0 on success, 1 if any files fail a resolve attempt.
4991 """
4991 """
4992
4992
4993 all, mark, unmark, show, nostatus = \
4993 all, mark, unmark, show, nostatus = \
4994 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
4994 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
4995
4995
4996 if (show and (mark or unmark)) or (mark and unmark):
4996 if (show and (mark or unmark)) or (mark and unmark):
4997 raise util.Abort(_("too many options specified"))
4997 raise util.Abort(_("too many options specified"))
4998 if pats and all:
4998 if pats and all:
4999 raise util.Abort(_("can't specify --all and patterns"))
4999 raise util.Abort(_("can't specify --all and patterns"))
5000 if not (all or pats or show or mark or unmark):
5000 if not (all or pats or show or mark or unmark):
5001 raise util.Abort(_('no files or directories specified'),
5001 raise util.Abort(_('no files or directories specified'),
5002 hint=('use --all to remerge all files'))
5002 hint=('use --all to remerge all files'))
5003
5003
5004 wlock = repo.wlock()
5004 wlock = repo.wlock()
5005 try:
5005 try:
5006 ms = mergemod.mergestate(repo)
5006 ms = mergemod.mergestate(repo)
5007
5007
5008 if not ms.active() and not show:
5008 if not ms.active() and not show:
5009 raise util.Abort(
5009 raise util.Abort(
5010 _('resolve command not applicable when not merging'))
5010 _('resolve command not applicable when not merging'))
5011
5011
5012 m = scmutil.match(repo[None], pats, opts)
5012 m = scmutil.match(repo[None], pats, opts)
5013 ret = 0
5013 ret = 0
5014 didwork = False
5014 didwork = False
5015
5015
5016 for f in ms:
5016 for f in ms:
5017 if not m(f):
5017 if not m(f):
5018 continue
5018 continue
5019
5019
5020 didwork = True
5020 didwork = True
5021
5021
5022 if show:
5022 if show:
5023 if nostatus:
5023 if nostatus:
5024 ui.write("%s\n" % f)
5024 ui.write("%s\n" % f)
5025 else:
5025 else:
5026 ui.write("%s %s\n" % (ms[f].upper(), f),
5026 ui.write("%s %s\n" % (ms[f].upper(), f),
5027 label='resolve.' +
5027 label='resolve.' +
5028 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
5028 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
5029 elif mark:
5029 elif mark:
5030 ms.mark(f, "r")
5030 ms.mark(f, "r")
5031 elif unmark:
5031 elif unmark:
5032 ms.mark(f, "u")
5032 ms.mark(f, "u")
5033 else:
5033 else:
5034 wctx = repo[None]
5034 wctx = repo[None]
5035
5035
5036 # backup pre-resolve (merge uses .orig for its own purposes)
5036 # backup pre-resolve (merge uses .orig for its own purposes)
5037 a = repo.wjoin(f)
5037 a = repo.wjoin(f)
5038 util.copyfile(a, a + ".resolve")
5038 util.copyfile(a, a + ".resolve")
5039
5039
5040 try:
5040 try:
5041 # resolve file
5041 # resolve file
5042 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5042 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''),
5043 'resolve')
5043 'resolve')
5044 if ms.resolve(f, wctx):
5044 if ms.resolve(f, wctx):
5045 ret = 1
5045 ret = 1
5046 finally:
5046 finally:
5047 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5047 ui.setconfig('ui', 'forcemerge', '', 'resolve')
5048 ms.commit()
5048 ms.commit()
5049
5049
5050 # replace filemerge's .orig file with our resolve file
5050 # replace filemerge's .orig file with our resolve file
5051 util.rename(a + ".resolve", a + ".orig")
5051 util.rename(a + ".resolve", a + ".orig")
5052
5052
5053 ms.commit()
5053 ms.commit()
5054
5054
5055 if not didwork and pats:
5055 if not didwork and pats:
5056 ui.warn(_("arguments do not match paths that need resolving\n"))
5056 ui.warn(_("arguments do not match paths that need resolving\n"))
5057
5057
5058 finally:
5058 finally:
5059 wlock.release()
5059 wlock.release()
5060
5060
5061 # Nudge users into finishing an unfinished operation. We don't print
5061 # Nudge users into finishing an unfinished operation. We don't print
5062 # this with the list/show operation because we want list/show to remain
5062 # this with the list/show operation because we want list/show to remain
5063 # machine readable.
5063 # machine readable.
5064 if not list(ms.unresolved()) and not show:
5064 if not list(ms.unresolved()) and not show:
5065 ui.status(_('no more unresolved files\n'))
5065 ui.status(_('(no more unresolved files)\n'))
5066
5066
5067 return ret
5067 return ret
5068
5068
5069 @command('revert',
5069 @command('revert',
5070 [('a', 'all', None, _('revert all changes when no arguments given')),
5070 [('a', 'all', None, _('revert all changes when no arguments given')),
5071 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5071 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5072 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5072 ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
5073 ('C', 'no-backup', None, _('do not save backup copies of files')),
5073 ('C', 'no-backup', None, _('do not save backup copies of files')),
5074 ] + walkopts + dryrunopts,
5074 ] + walkopts + dryrunopts,
5075 _('[OPTION]... [-r REV] [NAME]...'))
5075 _('[OPTION]... [-r REV] [NAME]...'))
5076 def revert(ui, repo, *pats, **opts):
5076 def revert(ui, repo, *pats, **opts):
5077 """restore files to their checkout state
5077 """restore files to their checkout state
5078
5078
5079 .. note::
5079 .. note::
5080
5080
5081 To check out earlier revisions, you should use :hg:`update REV`.
5081 To check out earlier revisions, you should use :hg:`update REV`.
5082 To cancel an uncommitted merge (and lose your changes),
5082 To cancel an uncommitted merge (and lose your changes),
5083 use :hg:`update --clean .`.
5083 use :hg:`update --clean .`.
5084
5084
5085 With no revision specified, revert the specified files or directories
5085 With no revision specified, revert the specified files or directories
5086 to the contents they had in the parent of the working directory.
5086 to the contents they had in the parent of the working directory.
5087 This restores the contents of files to an unmodified
5087 This restores the contents of files to an unmodified
5088 state and unschedules adds, removes, copies, and renames. If the
5088 state and unschedules adds, removes, copies, and renames. If the
5089 working directory has two parents, you must explicitly specify a
5089 working directory has two parents, you must explicitly specify a
5090 revision.
5090 revision.
5091
5091
5092 Using the -r/--rev or -d/--date options, revert the given files or
5092 Using the -r/--rev or -d/--date options, revert the given files or
5093 directories to their states as of a specific revision. Because
5093 directories to their states as of a specific revision. Because
5094 revert does not change the working directory parents, this will
5094 revert does not change the working directory parents, this will
5095 cause these files to appear modified. This can be helpful to "back
5095 cause these files to appear modified. This can be helpful to "back
5096 out" some or all of an earlier change. See :hg:`backout` for a
5096 out" some or all of an earlier change. See :hg:`backout` for a
5097 related method.
5097 related method.
5098
5098
5099 Modified files are saved with a .orig suffix before reverting.
5099 Modified files are saved with a .orig suffix before reverting.
5100 To disable these backups, use --no-backup.
5100 To disable these backups, use --no-backup.
5101
5101
5102 See :hg:`help dates` for a list of formats valid for -d/--date.
5102 See :hg:`help dates` for a list of formats valid for -d/--date.
5103
5103
5104 Returns 0 on success.
5104 Returns 0 on success.
5105 """
5105 """
5106
5106
5107 if opts.get("date"):
5107 if opts.get("date"):
5108 if opts.get("rev"):
5108 if opts.get("rev"):
5109 raise util.Abort(_("you can't specify a revision and a date"))
5109 raise util.Abort(_("you can't specify a revision and a date"))
5110 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5110 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
5111
5111
5112 parent, p2 = repo.dirstate.parents()
5112 parent, p2 = repo.dirstate.parents()
5113 if not opts.get('rev') and p2 != nullid:
5113 if not opts.get('rev') and p2 != nullid:
5114 # revert after merge is a trap for new users (issue2915)
5114 # revert after merge is a trap for new users (issue2915)
5115 raise util.Abort(_('uncommitted merge with no revision specified'),
5115 raise util.Abort(_('uncommitted merge with no revision specified'),
5116 hint=_('use "hg update" or see "hg help revert"'))
5116 hint=_('use "hg update" or see "hg help revert"'))
5117
5117
5118 ctx = scmutil.revsingle(repo, opts.get('rev'))
5118 ctx = scmutil.revsingle(repo, opts.get('rev'))
5119
5119
5120 if not pats and not opts.get('all'):
5120 if not pats and not opts.get('all'):
5121 msg = _("no files or directories specified")
5121 msg = _("no files or directories specified")
5122 if p2 != nullid:
5122 if p2 != nullid:
5123 hint = _("uncommitted merge, use --all to discard all changes,"
5123 hint = _("uncommitted merge, use --all to discard all changes,"
5124 " or 'hg update -C .' to abort the merge")
5124 " or 'hg update -C .' to abort the merge")
5125 raise util.Abort(msg, hint=hint)
5125 raise util.Abort(msg, hint=hint)
5126 dirty = util.any(repo.status())
5126 dirty = util.any(repo.status())
5127 node = ctx.node()
5127 node = ctx.node()
5128 if node != parent:
5128 if node != parent:
5129 if dirty:
5129 if dirty:
5130 hint = _("uncommitted changes, use --all to discard all"
5130 hint = _("uncommitted changes, use --all to discard all"
5131 " changes, or 'hg update %s' to update") % ctx.rev()
5131 " changes, or 'hg update %s' to update") % ctx.rev()
5132 else:
5132 else:
5133 hint = _("use --all to revert all files,"
5133 hint = _("use --all to revert all files,"
5134 " or 'hg update %s' to update") % ctx.rev()
5134 " or 'hg update %s' to update") % ctx.rev()
5135 elif dirty:
5135 elif dirty:
5136 hint = _("uncommitted changes, use --all to discard all changes")
5136 hint = _("uncommitted changes, use --all to discard all changes")
5137 else:
5137 else:
5138 hint = _("use --all to revert all files")
5138 hint = _("use --all to revert all files")
5139 raise util.Abort(msg, hint=hint)
5139 raise util.Abort(msg, hint=hint)
5140
5140
5141 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5141 return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
5142
5142
5143 @command('rollback', dryrunopts +
5143 @command('rollback', dryrunopts +
5144 [('f', 'force', False, _('ignore safety measures'))])
5144 [('f', 'force', False, _('ignore safety measures'))])
5145 def rollback(ui, repo, **opts):
5145 def rollback(ui, repo, **opts):
5146 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5146 """roll back the last transaction (DANGEROUS) (DEPRECATED)
5147
5147
5148 Please use :hg:`commit --amend` instead of rollback to correct
5148 Please use :hg:`commit --amend` instead of rollback to correct
5149 mistakes in the last commit.
5149 mistakes in the last commit.
5150
5150
5151 This command should be used with care. There is only one level of
5151 This command should be used with care. There is only one level of
5152 rollback, and there is no way to undo a rollback. It will also
5152 rollback, and there is no way to undo a rollback. It will also
5153 restore the dirstate at the time of the last transaction, losing
5153 restore the dirstate at the time of the last transaction, losing
5154 any dirstate changes since that time. This command does not alter
5154 any dirstate changes since that time. This command does not alter
5155 the working directory.
5155 the working directory.
5156
5156
5157 Transactions are used to encapsulate the effects of all commands
5157 Transactions are used to encapsulate the effects of all commands
5158 that create new changesets or propagate existing changesets into a
5158 that create new changesets or propagate existing changesets into a
5159 repository.
5159 repository.
5160
5160
5161 .. container:: verbose
5161 .. container:: verbose
5162
5162
5163 For example, the following commands are transactional, and their
5163 For example, the following commands are transactional, and their
5164 effects can be rolled back:
5164 effects can be rolled back:
5165
5165
5166 - commit
5166 - commit
5167 - import
5167 - import
5168 - pull
5168 - pull
5169 - push (with this repository as the destination)
5169 - push (with this repository as the destination)
5170 - unbundle
5170 - unbundle
5171
5171
5172 To avoid permanent data loss, rollback will refuse to rollback a
5172 To avoid permanent data loss, rollback will refuse to rollback a
5173 commit transaction if it isn't checked out. Use --force to
5173 commit transaction if it isn't checked out. Use --force to
5174 override this protection.
5174 override this protection.
5175
5175
5176 This command is not intended for use on public repositories. Once
5176 This command is not intended for use on public repositories. Once
5177 changes are visible for pull by other users, rolling a transaction
5177 changes are visible for pull by other users, rolling a transaction
5178 back locally is ineffective (someone else may already have pulled
5178 back locally is ineffective (someone else may already have pulled
5179 the changes). Furthermore, a race is possible with readers of the
5179 the changes). Furthermore, a race is possible with readers of the
5180 repository; for example an in-progress pull from the repository
5180 repository; for example an in-progress pull from the repository
5181 may fail if a rollback is performed.
5181 may fail if a rollback is performed.
5182
5182
5183 Returns 0 on success, 1 if no rollback data is available.
5183 Returns 0 on success, 1 if no rollback data is available.
5184 """
5184 """
5185 return repo.rollback(dryrun=opts.get('dry_run'),
5185 return repo.rollback(dryrun=opts.get('dry_run'),
5186 force=opts.get('force'))
5186 force=opts.get('force'))
5187
5187
5188 @command('root', [])
5188 @command('root', [])
5189 def root(ui, repo):
5189 def root(ui, repo):
5190 """print the root (top) of the current working directory
5190 """print the root (top) of the current working directory
5191
5191
5192 Print the root directory of the current repository.
5192 Print the root directory of the current repository.
5193
5193
5194 Returns 0 on success.
5194 Returns 0 on success.
5195 """
5195 """
5196 ui.write(repo.root + "\n")
5196 ui.write(repo.root + "\n")
5197
5197
5198 @command('^serve',
5198 @command('^serve',
5199 [('A', 'accesslog', '', _('name of access log file to write to'),
5199 [('A', 'accesslog', '', _('name of access log file to write to'),
5200 _('FILE')),
5200 _('FILE')),
5201 ('d', 'daemon', None, _('run server in background')),
5201 ('d', 'daemon', None, _('run server in background')),
5202 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('NUM')),
5202 ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('NUM')),
5203 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5203 ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
5204 # use string type, then we can check if something was passed
5204 # use string type, then we can check if something was passed
5205 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5205 ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
5206 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5206 ('a', 'address', '', _('address to listen on (default: all interfaces)'),
5207 _('ADDR')),
5207 _('ADDR')),
5208 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5208 ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
5209 _('PREFIX')),
5209 _('PREFIX')),
5210 ('n', 'name', '',
5210 ('n', 'name', '',
5211 _('name to show in web pages (default: working directory)'), _('NAME')),
5211 _('name to show in web pages (default: working directory)'), _('NAME')),
5212 ('', 'web-conf', '',
5212 ('', 'web-conf', '',
5213 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5213 _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
5214 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5214 ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
5215 _('FILE')),
5215 _('FILE')),
5216 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5216 ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
5217 ('', 'stdio', None, _('for remote clients')),
5217 ('', 'stdio', None, _('for remote clients')),
5218 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5218 ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
5219 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5219 ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
5220 ('', 'style', '', _('template style to use'), _('STYLE')),
5220 ('', 'style', '', _('template style to use'), _('STYLE')),
5221 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5221 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
5222 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5222 ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
5223 _('[OPTION]...'),
5223 _('[OPTION]...'),
5224 optionalrepo=True)
5224 optionalrepo=True)
5225 def serve(ui, repo, **opts):
5225 def serve(ui, repo, **opts):
5226 """start stand-alone webserver
5226 """start stand-alone webserver
5227
5227
5228 Start a local HTTP repository browser and pull server. You can use
5228 Start a local HTTP repository browser and pull server. You can use
5229 this for ad-hoc sharing and browsing of repositories. It is
5229 this for ad-hoc sharing and browsing of repositories. It is
5230 recommended to use a real web server to serve a repository for
5230 recommended to use a real web server to serve a repository for
5231 longer periods of time.
5231 longer periods of time.
5232
5232
5233 Please note that the server does not implement access control.
5233 Please note that the server does not implement access control.
5234 This means that, by default, anybody can read from the server and
5234 This means that, by default, anybody can read from the server and
5235 nobody can write to it by default. Set the ``web.allow_push``
5235 nobody can write to it by default. Set the ``web.allow_push``
5236 option to ``*`` to allow everybody to push to the server. You
5236 option to ``*`` to allow everybody to push to the server. You
5237 should use a real web server if you need to authenticate users.
5237 should use a real web server if you need to authenticate users.
5238
5238
5239 By default, the server logs accesses to stdout and errors to
5239 By default, the server logs accesses to stdout and errors to
5240 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5240 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
5241 files.
5241 files.
5242
5242
5243 To have the server choose a free port number to listen on, specify
5243 To have the server choose a free port number to listen on, specify
5244 a port number of 0; in this case, the server will print the port
5244 a port number of 0; in this case, the server will print the port
5245 number it uses.
5245 number it uses.
5246
5246
5247 Returns 0 on success.
5247 Returns 0 on success.
5248 """
5248 """
5249
5249
5250 if opts["stdio"] and opts["cmdserver"]:
5250 if opts["stdio"] and opts["cmdserver"]:
5251 raise util.Abort(_("cannot use --stdio with --cmdserver"))
5251 raise util.Abort(_("cannot use --stdio with --cmdserver"))
5252
5252
5253 if opts["stdio"]:
5253 if opts["stdio"]:
5254 if repo is None:
5254 if repo is None:
5255 raise error.RepoError(_("there is no Mercurial repository here"
5255 raise error.RepoError(_("there is no Mercurial repository here"
5256 " (.hg not found)"))
5256 " (.hg not found)"))
5257 s = sshserver.sshserver(ui, repo)
5257 s = sshserver.sshserver(ui, repo)
5258 s.serve_forever()
5258 s.serve_forever()
5259
5259
5260 if opts["cmdserver"]:
5260 if opts["cmdserver"]:
5261 s = commandserver.server(ui, repo, opts["cmdserver"])
5261 s = commandserver.server(ui, repo, opts["cmdserver"])
5262 return s.serve()
5262 return s.serve()
5263
5263
5264 # this way we can check if something was given in the command-line
5264 # this way we can check if something was given in the command-line
5265 if opts.get('port'):
5265 if opts.get('port'):
5266 opts['port'] = util.getport(opts.get('port'))
5266 opts['port'] = util.getport(opts.get('port'))
5267
5267
5268 baseui = repo and repo.baseui or ui
5268 baseui = repo and repo.baseui or ui
5269 optlist = ("name templates style address port prefix ipv6"
5269 optlist = ("name templates style address port prefix ipv6"
5270 " accesslog errorlog certificate encoding")
5270 " accesslog errorlog certificate encoding")
5271 for o in optlist.split():
5271 for o in optlist.split():
5272 val = opts.get(o, '')
5272 val = opts.get(o, '')
5273 if val in (None, ''): # should check against default options instead
5273 if val in (None, ''): # should check against default options instead
5274 continue
5274 continue
5275 baseui.setconfig("web", o, val, 'serve')
5275 baseui.setconfig("web", o, val, 'serve')
5276 if repo and repo.ui != baseui:
5276 if repo and repo.ui != baseui:
5277 repo.ui.setconfig("web", o, val, 'serve')
5277 repo.ui.setconfig("web", o, val, 'serve')
5278
5278
5279 o = opts.get('web_conf') or opts.get('webdir_conf')
5279 o = opts.get('web_conf') or opts.get('webdir_conf')
5280 if not o:
5280 if not o:
5281 if not repo:
5281 if not repo:
5282 raise error.RepoError(_("there is no Mercurial repository"
5282 raise error.RepoError(_("there is no Mercurial repository"
5283 " here (.hg not found)"))
5283 " here (.hg not found)"))
5284 o = repo
5284 o = repo
5285
5285
5286 app = hgweb.hgweb(o, baseui=baseui)
5286 app = hgweb.hgweb(o, baseui=baseui)
5287 service = httpservice(ui, app, opts)
5287 service = httpservice(ui, app, opts)
5288 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5288 cmdutil.service(opts, initfn=service.init, runfn=service.run)
5289
5289
5290 class httpservice(object):
5290 class httpservice(object):
5291 def __init__(self, ui, app, opts):
5291 def __init__(self, ui, app, opts):
5292 self.ui = ui
5292 self.ui = ui
5293 self.app = app
5293 self.app = app
5294 self.opts = opts
5294 self.opts = opts
5295
5295
5296 def init(self):
5296 def init(self):
5297 util.setsignalhandler()
5297 util.setsignalhandler()
5298 self.httpd = hgweb_server.create_server(self.ui, self.app)
5298 self.httpd = hgweb_server.create_server(self.ui, self.app)
5299
5299
5300 if self.opts['port'] and not self.ui.verbose:
5300 if self.opts['port'] and not self.ui.verbose:
5301 return
5301 return
5302
5302
5303 if self.httpd.prefix:
5303 if self.httpd.prefix:
5304 prefix = self.httpd.prefix.strip('/') + '/'
5304 prefix = self.httpd.prefix.strip('/') + '/'
5305 else:
5305 else:
5306 prefix = ''
5306 prefix = ''
5307
5307
5308 port = ':%d' % self.httpd.port
5308 port = ':%d' % self.httpd.port
5309 if port == ':80':
5309 if port == ':80':
5310 port = ''
5310 port = ''
5311
5311
5312 bindaddr = self.httpd.addr
5312 bindaddr = self.httpd.addr
5313 if bindaddr == '0.0.0.0':
5313 if bindaddr == '0.0.0.0':
5314 bindaddr = '*'
5314 bindaddr = '*'
5315 elif ':' in bindaddr: # IPv6
5315 elif ':' in bindaddr: # IPv6
5316 bindaddr = '[%s]' % bindaddr
5316 bindaddr = '[%s]' % bindaddr
5317
5317
5318 fqaddr = self.httpd.fqaddr
5318 fqaddr = self.httpd.fqaddr
5319 if ':' in fqaddr:
5319 if ':' in fqaddr:
5320 fqaddr = '[%s]' % fqaddr
5320 fqaddr = '[%s]' % fqaddr
5321 if self.opts['port']:
5321 if self.opts['port']:
5322 write = self.ui.status
5322 write = self.ui.status
5323 else:
5323 else:
5324 write = self.ui.write
5324 write = self.ui.write
5325 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5325 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
5326 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5326 (fqaddr, port, prefix, bindaddr, self.httpd.port))
5327 self.ui.flush() # avoid buffering of status message
5327 self.ui.flush() # avoid buffering of status message
5328
5328
5329 def run(self):
5329 def run(self):
5330 self.httpd.serve_forever()
5330 self.httpd.serve_forever()
5331
5331
5332
5332
5333 @command('^status|st',
5333 @command('^status|st',
5334 [('A', 'all', None, _('show status of all files')),
5334 [('A', 'all', None, _('show status of all files')),
5335 ('m', 'modified', None, _('show only modified files')),
5335 ('m', 'modified', None, _('show only modified files')),
5336 ('a', 'added', None, _('show only added files')),
5336 ('a', 'added', None, _('show only added files')),
5337 ('r', 'removed', None, _('show only removed files')),
5337 ('r', 'removed', None, _('show only removed files')),
5338 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5338 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
5339 ('c', 'clean', None, _('show only files without changes')),
5339 ('c', 'clean', None, _('show only files without changes')),
5340 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5340 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
5341 ('i', 'ignored', None, _('show only ignored files')),
5341 ('i', 'ignored', None, _('show only ignored files')),
5342 ('n', 'no-status', None, _('hide status prefix')),
5342 ('n', 'no-status', None, _('hide status prefix')),
5343 ('C', 'copies', None, _('show source of copied files')),
5343 ('C', 'copies', None, _('show source of copied files')),
5344 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5344 ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
5345 ('', 'rev', [], _('show difference from revision'), _('REV')),
5345 ('', 'rev', [], _('show difference from revision'), _('REV')),
5346 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5346 ('', 'change', '', _('list the changed files of a revision'), _('REV')),
5347 ] + walkopts + subrepoopts,
5347 ] + walkopts + subrepoopts,
5348 _('[OPTION]... [FILE]...'),
5348 _('[OPTION]... [FILE]...'),
5349 inferrepo=True)
5349 inferrepo=True)
5350 def status(ui, repo, *pats, **opts):
5350 def status(ui, repo, *pats, **opts):
5351 """show changed files in the working directory
5351 """show changed files in the working directory
5352
5352
5353 Show status of files in the repository. If names are given, only
5353 Show status of files in the repository. If names are given, only
5354 files that match are shown. Files that are clean or ignored or
5354 files that match are shown. Files that are clean or ignored or
5355 the source of a copy/move operation, are not listed unless
5355 the source of a copy/move operation, are not listed unless
5356 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5356 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
5357 Unless options described with "show only ..." are given, the
5357 Unless options described with "show only ..." are given, the
5358 options -mardu are used.
5358 options -mardu are used.
5359
5359
5360 Option -q/--quiet hides untracked (unknown and ignored) files
5360 Option -q/--quiet hides untracked (unknown and ignored) files
5361 unless explicitly requested with -u/--unknown or -i/--ignored.
5361 unless explicitly requested with -u/--unknown or -i/--ignored.
5362
5362
5363 .. note::
5363 .. note::
5364
5364
5365 status may appear to disagree with diff if permissions have
5365 status may appear to disagree with diff if permissions have
5366 changed or a merge has occurred. The standard diff format does
5366 changed or a merge has occurred. The standard diff format does
5367 not report permission changes and diff only reports changes
5367 not report permission changes and diff only reports changes
5368 relative to one merge parent.
5368 relative to one merge parent.
5369
5369
5370 If one revision is given, it is used as the base revision.
5370 If one revision is given, it is used as the base revision.
5371 If two revisions are given, the differences between them are
5371 If two revisions are given, the differences between them are
5372 shown. The --change option can also be used as a shortcut to list
5372 shown. The --change option can also be used as a shortcut to list
5373 the changed files of a revision from its first parent.
5373 the changed files of a revision from its first parent.
5374
5374
5375 The codes used to show the status of files are::
5375 The codes used to show the status of files are::
5376
5376
5377 M = modified
5377 M = modified
5378 A = added
5378 A = added
5379 R = removed
5379 R = removed
5380 C = clean
5380 C = clean
5381 ! = missing (deleted by non-hg command, but still tracked)
5381 ! = missing (deleted by non-hg command, but still tracked)
5382 ? = not tracked
5382 ? = not tracked
5383 I = ignored
5383 I = ignored
5384 = origin of the previous file (with --copies)
5384 = origin of the previous file (with --copies)
5385
5385
5386 .. container:: verbose
5386 .. container:: verbose
5387
5387
5388 Examples:
5388 Examples:
5389
5389
5390 - show changes in the working directory relative to a
5390 - show changes in the working directory relative to a
5391 changeset::
5391 changeset::
5392
5392
5393 hg status --rev 9353
5393 hg status --rev 9353
5394
5394
5395 - show all changes including copies in an existing changeset::
5395 - show all changes including copies in an existing changeset::
5396
5396
5397 hg status --copies --change 9353
5397 hg status --copies --change 9353
5398
5398
5399 - get a NUL separated list of added files, suitable for xargs::
5399 - get a NUL separated list of added files, suitable for xargs::
5400
5400
5401 hg status -an0
5401 hg status -an0
5402
5402
5403 Returns 0 on success.
5403 Returns 0 on success.
5404 """
5404 """
5405
5405
5406 revs = opts.get('rev')
5406 revs = opts.get('rev')
5407 change = opts.get('change')
5407 change = opts.get('change')
5408
5408
5409 if revs and change:
5409 if revs and change:
5410 msg = _('cannot specify --rev and --change at the same time')
5410 msg = _('cannot specify --rev and --change at the same time')
5411 raise util.Abort(msg)
5411 raise util.Abort(msg)
5412 elif change:
5412 elif change:
5413 node2 = scmutil.revsingle(repo, change, None).node()
5413 node2 = scmutil.revsingle(repo, change, None).node()
5414 node1 = repo[node2].p1().node()
5414 node1 = repo[node2].p1().node()
5415 else:
5415 else:
5416 node1, node2 = scmutil.revpair(repo, revs)
5416 node1, node2 = scmutil.revpair(repo, revs)
5417
5417
5418 cwd = (pats and repo.getcwd()) or ''
5418 cwd = (pats and repo.getcwd()) or ''
5419 end = opts.get('print0') and '\0' or '\n'
5419 end = opts.get('print0') and '\0' or '\n'
5420 copy = {}
5420 copy = {}
5421 states = 'modified added removed deleted unknown ignored clean'.split()
5421 states = 'modified added removed deleted unknown ignored clean'.split()
5422 show = [k for k in states if opts.get(k)]
5422 show = [k for k in states if opts.get(k)]
5423 if opts.get('all'):
5423 if opts.get('all'):
5424 show += ui.quiet and (states[:4] + ['clean']) or states
5424 show += ui.quiet and (states[:4] + ['clean']) or states
5425 if not show:
5425 if not show:
5426 show = ui.quiet and states[:4] or states[:5]
5426 show = ui.quiet and states[:4] or states[:5]
5427
5427
5428 stat = repo.status(node1, node2, scmutil.match(repo[node2], pats, opts),
5428 stat = repo.status(node1, node2, scmutil.match(repo[node2], pats, opts),
5429 'ignored' in show, 'clean' in show, 'unknown' in show,
5429 'ignored' in show, 'clean' in show, 'unknown' in show,
5430 opts.get('subrepos'))
5430 opts.get('subrepos'))
5431 changestates = zip(states, 'MAR!?IC', stat)
5431 changestates = zip(states, 'MAR!?IC', stat)
5432
5432
5433 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
5433 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
5434 copy = copies.pathcopies(repo[node1], repo[node2])
5434 copy = copies.pathcopies(repo[node1], repo[node2])
5435
5435
5436 fm = ui.formatter('status', opts)
5436 fm = ui.formatter('status', opts)
5437 fmt = '%s' + end
5437 fmt = '%s' + end
5438 showchar = not opts.get('no_status')
5438 showchar = not opts.get('no_status')
5439
5439
5440 for state, char, files in changestates:
5440 for state, char, files in changestates:
5441 if state in show:
5441 if state in show:
5442 label = 'status.' + state
5442 label = 'status.' + state
5443 for f in files:
5443 for f in files:
5444 fm.startitem()
5444 fm.startitem()
5445 fm.condwrite(showchar, 'status', '%s ', char, label=label)
5445 fm.condwrite(showchar, 'status', '%s ', char, label=label)
5446 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
5446 fm.write('path', fmt, repo.pathto(f, cwd), label=label)
5447 if f in copy:
5447 if f in copy:
5448 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
5448 fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
5449 label='status.copied')
5449 label='status.copied')
5450 fm.end()
5450 fm.end()
5451
5451
5452 @command('^summary|sum',
5452 @command('^summary|sum',
5453 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
5453 [('', 'remote', None, _('check for push and pull'))], '[--remote]')
5454 def summary(ui, repo, **opts):
5454 def summary(ui, repo, **opts):
5455 """summarize working directory state
5455 """summarize working directory state
5456
5456
5457 This generates a brief summary of the working directory state,
5457 This generates a brief summary of the working directory state,
5458 including parents, branch, commit status, and available updates.
5458 including parents, branch, commit status, and available updates.
5459
5459
5460 With the --remote option, this will check the default paths for
5460 With the --remote option, this will check the default paths for
5461 incoming and outgoing changes. This can be time-consuming.
5461 incoming and outgoing changes. This can be time-consuming.
5462
5462
5463 Returns 0 on success.
5463 Returns 0 on success.
5464 """
5464 """
5465
5465
5466 ctx = repo[None]
5466 ctx = repo[None]
5467 parents = ctx.parents()
5467 parents = ctx.parents()
5468 pnode = parents[0].node()
5468 pnode = parents[0].node()
5469 marks = []
5469 marks = []
5470
5470
5471 for p in parents:
5471 for p in parents:
5472 # label with log.changeset (instead of log.parent) since this
5472 # label with log.changeset (instead of log.parent) since this
5473 # shows a working directory parent *changeset*:
5473 # shows a working directory parent *changeset*:
5474 # i18n: column positioning for "hg summary"
5474 # i18n: column positioning for "hg summary"
5475 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
5475 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
5476 label='log.changeset changeset.%s' % p.phasestr())
5476 label='log.changeset changeset.%s' % p.phasestr())
5477 ui.write(' '.join(p.tags()), label='log.tag')
5477 ui.write(' '.join(p.tags()), label='log.tag')
5478 if p.bookmarks():
5478 if p.bookmarks():
5479 marks.extend(p.bookmarks())
5479 marks.extend(p.bookmarks())
5480 if p.rev() == -1:
5480 if p.rev() == -1:
5481 if not len(repo):
5481 if not len(repo):
5482 ui.write(_(' (empty repository)'))
5482 ui.write(_(' (empty repository)'))
5483 else:
5483 else:
5484 ui.write(_(' (no revision checked out)'))
5484 ui.write(_(' (no revision checked out)'))
5485 ui.write('\n')
5485 ui.write('\n')
5486 if p.description():
5486 if p.description():
5487 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
5487 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
5488 label='log.summary')
5488 label='log.summary')
5489
5489
5490 branch = ctx.branch()
5490 branch = ctx.branch()
5491 bheads = repo.branchheads(branch)
5491 bheads = repo.branchheads(branch)
5492 # i18n: column positioning for "hg summary"
5492 # i18n: column positioning for "hg summary"
5493 m = _('branch: %s\n') % branch
5493 m = _('branch: %s\n') % branch
5494 if branch != 'default':
5494 if branch != 'default':
5495 ui.write(m, label='log.branch')
5495 ui.write(m, label='log.branch')
5496 else:
5496 else:
5497 ui.status(m, label='log.branch')
5497 ui.status(m, label='log.branch')
5498
5498
5499 if marks:
5499 if marks:
5500 current = repo._bookmarkcurrent
5500 current = repo._bookmarkcurrent
5501 # i18n: column positioning for "hg summary"
5501 # i18n: column positioning for "hg summary"
5502 ui.write(_('bookmarks:'), label='log.bookmark')
5502 ui.write(_('bookmarks:'), label='log.bookmark')
5503 if current is not None:
5503 if current is not None:
5504 if current in marks:
5504 if current in marks:
5505 ui.write(' *' + current, label='bookmarks.current')
5505 ui.write(' *' + current, label='bookmarks.current')
5506 marks.remove(current)
5506 marks.remove(current)
5507 else:
5507 else:
5508 ui.write(' [%s]' % current, label='bookmarks.current')
5508 ui.write(' [%s]' % current, label='bookmarks.current')
5509 for m in marks:
5509 for m in marks:
5510 ui.write(' ' + m, label='log.bookmark')
5510 ui.write(' ' + m, label='log.bookmark')
5511 ui.write('\n', label='log.bookmark')
5511 ui.write('\n', label='log.bookmark')
5512
5512
5513 st = list(repo.status(unknown=True))[:6]
5513 st = list(repo.status(unknown=True))[:6]
5514
5514
5515 c = repo.dirstate.copies()
5515 c = repo.dirstate.copies()
5516 copied, renamed = [], []
5516 copied, renamed = [], []
5517 for d, s in c.iteritems():
5517 for d, s in c.iteritems():
5518 if s in st[2]:
5518 if s in st[2]:
5519 st[2].remove(s)
5519 st[2].remove(s)
5520 renamed.append(d)
5520 renamed.append(d)
5521 else:
5521 else:
5522 copied.append(d)
5522 copied.append(d)
5523 if d in st[1]:
5523 if d in st[1]:
5524 st[1].remove(d)
5524 st[1].remove(d)
5525 st.insert(3, renamed)
5525 st.insert(3, renamed)
5526 st.insert(4, copied)
5526 st.insert(4, copied)
5527
5527
5528 ms = mergemod.mergestate(repo)
5528 ms = mergemod.mergestate(repo)
5529 st.append([f for f in ms if ms[f] == 'u'])
5529 st.append([f for f in ms if ms[f] == 'u'])
5530
5530
5531 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
5531 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
5532 st.append(subs)
5532 st.append(subs)
5533
5533
5534 labels = [ui.label(_('%d modified'), 'status.modified'),
5534 labels = [ui.label(_('%d modified'), 'status.modified'),
5535 ui.label(_('%d added'), 'status.added'),
5535 ui.label(_('%d added'), 'status.added'),
5536 ui.label(_('%d removed'), 'status.removed'),
5536 ui.label(_('%d removed'), 'status.removed'),
5537 ui.label(_('%d renamed'), 'status.copied'),
5537 ui.label(_('%d renamed'), 'status.copied'),
5538 ui.label(_('%d copied'), 'status.copied'),
5538 ui.label(_('%d copied'), 'status.copied'),
5539 ui.label(_('%d deleted'), 'status.deleted'),
5539 ui.label(_('%d deleted'), 'status.deleted'),
5540 ui.label(_('%d unknown'), 'status.unknown'),
5540 ui.label(_('%d unknown'), 'status.unknown'),
5541 ui.label(_('%d ignored'), 'status.ignored'),
5541 ui.label(_('%d ignored'), 'status.ignored'),
5542 ui.label(_('%d unresolved'), 'resolve.unresolved'),
5542 ui.label(_('%d unresolved'), 'resolve.unresolved'),
5543 ui.label(_('%d subrepos'), 'status.modified')]
5543 ui.label(_('%d subrepos'), 'status.modified')]
5544 t = []
5544 t = []
5545 for s, l in zip(st, labels):
5545 for s, l in zip(st, labels):
5546 if s:
5546 if s:
5547 t.append(l % len(s))
5547 t.append(l % len(s))
5548
5548
5549 t = ', '.join(t)
5549 t = ', '.join(t)
5550 cleanworkdir = False
5550 cleanworkdir = False
5551
5551
5552 if repo.vfs.exists('updatestate'):
5552 if repo.vfs.exists('updatestate'):
5553 t += _(' (interrupted update)')
5553 t += _(' (interrupted update)')
5554 elif len(parents) > 1:
5554 elif len(parents) > 1:
5555 t += _(' (merge)')
5555 t += _(' (merge)')
5556 elif branch != parents[0].branch():
5556 elif branch != parents[0].branch():
5557 t += _(' (new branch)')
5557 t += _(' (new branch)')
5558 elif (parents[0].closesbranch() and
5558 elif (parents[0].closesbranch() and
5559 pnode in repo.branchheads(branch, closed=True)):
5559 pnode in repo.branchheads(branch, closed=True)):
5560 t += _(' (head closed)')
5560 t += _(' (head closed)')
5561 elif not (st[0] or st[1] or st[2] or st[3] or st[4] or st[9]):
5561 elif not (st[0] or st[1] or st[2] or st[3] or st[4] or st[9]):
5562 t += _(' (clean)')
5562 t += _(' (clean)')
5563 cleanworkdir = True
5563 cleanworkdir = True
5564 elif pnode not in bheads:
5564 elif pnode not in bheads:
5565 t += _(' (new branch head)')
5565 t += _(' (new branch head)')
5566
5566
5567 if cleanworkdir:
5567 if cleanworkdir:
5568 # i18n: column positioning for "hg summary"
5568 # i18n: column positioning for "hg summary"
5569 ui.status(_('commit: %s\n') % t.strip())
5569 ui.status(_('commit: %s\n') % t.strip())
5570 else:
5570 else:
5571 # i18n: column positioning for "hg summary"
5571 # i18n: column positioning for "hg summary"
5572 ui.write(_('commit: %s\n') % t.strip())
5572 ui.write(_('commit: %s\n') % t.strip())
5573
5573
5574 # all ancestors of branch heads - all ancestors of parent = new csets
5574 # all ancestors of branch heads - all ancestors of parent = new csets
5575 new = len(repo.changelog.findmissing([ctx.node() for ctx in parents],
5575 new = len(repo.changelog.findmissing([ctx.node() for ctx in parents],
5576 bheads))
5576 bheads))
5577
5577
5578 if new == 0:
5578 if new == 0:
5579 # i18n: column positioning for "hg summary"
5579 # i18n: column positioning for "hg summary"
5580 ui.status(_('update: (current)\n'))
5580 ui.status(_('update: (current)\n'))
5581 elif pnode not in bheads:
5581 elif pnode not in bheads:
5582 # i18n: column positioning for "hg summary"
5582 # i18n: column positioning for "hg summary"
5583 ui.write(_('update: %d new changesets (update)\n') % new)
5583 ui.write(_('update: %d new changesets (update)\n') % new)
5584 else:
5584 else:
5585 # i18n: column positioning for "hg summary"
5585 # i18n: column positioning for "hg summary"
5586 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
5586 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
5587 (new, len(bheads)))
5587 (new, len(bheads)))
5588
5588
5589 cmdutil.summaryhooks(ui, repo)
5589 cmdutil.summaryhooks(ui, repo)
5590
5590
5591 if opts.get('remote'):
5591 if opts.get('remote'):
5592 needsincoming, needsoutgoing = True, True
5592 needsincoming, needsoutgoing = True, True
5593 else:
5593 else:
5594 needsincoming, needsoutgoing = False, False
5594 needsincoming, needsoutgoing = False, False
5595 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
5595 for i, o in cmdutil.summaryremotehooks(ui, repo, opts, None):
5596 if i:
5596 if i:
5597 needsincoming = True
5597 needsincoming = True
5598 if o:
5598 if o:
5599 needsoutgoing = True
5599 needsoutgoing = True
5600 if not needsincoming and not needsoutgoing:
5600 if not needsincoming and not needsoutgoing:
5601 return
5601 return
5602
5602
5603 def getincoming():
5603 def getincoming():
5604 source, branches = hg.parseurl(ui.expandpath('default'))
5604 source, branches = hg.parseurl(ui.expandpath('default'))
5605 sbranch = branches[0]
5605 sbranch = branches[0]
5606 try:
5606 try:
5607 other = hg.peer(repo, {}, source)
5607 other = hg.peer(repo, {}, source)
5608 except error.RepoError:
5608 except error.RepoError:
5609 if opts.get('remote'):
5609 if opts.get('remote'):
5610 raise
5610 raise
5611 return source, sbranch, None, None, None
5611 return source, sbranch, None, None, None
5612 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
5612 revs, checkout = hg.addbranchrevs(repo, other, branches, None)
5613 if revs:
5613 if revs:
5614 revs = [other.lookup(rev) for rev in revs]
5614 revs = [other.lookup(rev) for rev in revs]
5615 ui.debug('comparing with %s\n' % util.hidepassword(source))
5615 ui.debug('comparing with %s\n' % util.hidepassword(source))
5616 repo.ui.pushbuffer()
5616 repo.ui.pushbuffer()
5617 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
5617 commoninc = discovery.findcommonincoming(repo, other, heads=revs)
5618 repo.ui.popbuffer()
5618 repo.ui.popbuffer()
5619 return source, sbranch, other, commoninc, commoninc[1]
5619 return source, sbranch, other, commoninc, commoninc[1]
5620
5620
5621 if needsincoming:
5621 if needsincoming:
5622 source, sbranch, sother, commoninc, incoming = getincoming()
5622 source, sbranch, sother, commoninc, incoming = getincoming()
5623 else:
5623 else:
5624 source = sbranch = sother = commoninc = incoming = None
5624 source = sbranch = sother = commoninc = incoming = None
5625
5625
5626 def getoutgoing():
5626 def getoutgoing():
5627 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
5627 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
5628 dbranch = branches[0]
5628 dbranch = branches[0]
5629 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
5629 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
5630 if source != dest:
5630 if source != dest:
5631 try:
5631 try:
5632 dother = hg.peer(repo, {}, dest)
5632 dother = hg.peer(repo, {}, dest)
5633 except error.RepoError:
5633 except error.RepoError:
5634 if opts.get('remote'):
5634 if opts.get('remote'):
5635 raise
5635 raise
5636 return dest, dbranch, None, None
5636 return dest, dbranch, None, None
5637 ui.debug('comparing with %s\n' % util.hidepassword(dest))
5637 ui.debug('comparing with %s\n' % util.hidepassword(dest))
5638 elif sother is None:
5638 elif sother is None:
5639 # there is no explicit destination peer, but source one is invalid
5639 # there is no explicit destination peer, but source one is invalid
5640 return dest, dbranch, None, None
5640 return dest, dbranch, None, None
5641 else:
5641 else:
5642 dother = sother
5642 dother = sother
5643 if (source != dest or (sbranch is not None and sbranch != dbranch)):
5643 if (source != dest or (sbranch is not None and sbranch != dbranch)):
5644 common = None
5644 common = None
5645 else:
5645 else:
5646 common = commoninc
5646 common = commoninc
5647 if revs:
5647 if revs:
5648 revs = [repo.lookup(rev) for rev in revs]
5648 revs = [repo.lookup(rev) for rev in revs]
5649 repo.ui.pushbuffer()
5649 repo.ui.pushbuffer()
5650 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
5650 outgoing = discovery.findcommonoutgoing(repo, dother, onlyheads=revs,
5651 commoninc=common)
5651 commoninc=common)
5652 repo.ui.popbuffer()
5652 repo.ui.popbuffer()
5653 return dest, dbranch, dother, outgoing
5653 return dest, dbranch, dother, outgoing
5654
5654
5655 if needsoutgoing:
5655 if needsoutgoing:
5656 dest, dbranch, dother, outgoing = getoutgoing()
5656 dest, dbranch, dother, outgoing = getoutgoing()
5657 else:
5657 else:
5658 dest = dbranch = dother = outgoing = None
5658 dest = dbranch = dother = outgoing = None
5659
5659
5660 if opts.get('remote'):
5660 if opts.get('remote'):
5661 t = []
5661 t = []
5662 if incoming:
5662 if incoming:
5663 t.append(_('1 or more incoming'))
5663 t.append(_('1 or more incoming'))
5664 o = outgoing.missing
5664 o = outgoing.missing
5665 if o:
5665 if o:
5666 t.append(_('%d outgoing') % len(o))
5666 t.append(_('%d outgoing') % len(o))
5667 other = dother or sother
5667 other = dother or sother
5668 if 'bookmarks' in other.listkeys('namespaces'):
5668 if 'bookmarks' in other.listkeys('namespaces'):
5669 lmarks = repo.listkeys('bookmarks')
5669 lmarks = repo.listkeys('bookmarks')
5670 rmarks = other.listkeys('bookmarks')
5670 rmarks = other.listkeys('bookmarks')
5671 diff = set(rmarks) - set(lmarks)
5671 diff = set(rmarks) - set(lmarks)
5672 if len(diff) > 0:
5672 if len(diff) > 0:
5673 t.append(_('%d incoming bookmarks') % len(diff))
5673 t.append(_('%d incoming bookmarks') % len(diff))
5674 diff = set(lmarks) - set(rmarks)
5674 diff = set(lmarks) - set(rmarks)
5675 if len(diff) > 0:
5675 if len(diff) > 0:
5676 t.append(_('%d outgoing bookmarks') % len(diff))
5676 t.append(_('%d outgoing bookmarks') % len(diff))
5677
5677
5678 if t:
5678 if t:
5679 # i18n: column positioning for "hg summary"
5679 # i18n: column positioning for "hg summary"
5680 ui.write(_('remote: %s\n') % (', '.join(t)))
5680 ui.write(_('remote: %s\n') % (', '.join(t)))
5681 else:
5681 else:
5682 # i18n: column positioning for "hg summary"
5682 # i18n: column positioning for "hg summary"
5683 ui.status(_('remote: (synced)\n'))
5683 ui.status(_('remote: (synced)\n'))
5684
5684
5685 cmdutil.summaryremotehooks(ui, repo, opts,
5685 cmdutil.summaryremotehooks(ui, repo, opts,
5686 ((source, sbranch, sother, commoninc),
5686 ((source, sbranch, sother, commoninc),
5687 (dest, dbranch, dother, outgoing)))
5687 (dest, dbranch, dother, outgoing)))
5688
5688
5689 @command('tag',
5689 @command('tag',
5690 [('f', 'force', None, _('force tag')),
5690 [('f', 'force', None, _('force tag')),
5691 ('l', 'local', None, _('make the tag local')),
5691 ('l', 'local', None, _('make the tag local')),
5692 ('r', 'rev', '', _('revision to tag'), _('REV')),
5692 ('r', 'rev', '', _('revision to tag'), _('REV')),
5693 ('', 'remove', None, _('remove a tag')),
5693 ('', 'remove', None, _('remove a tag')),
5694 # -l/--local is already there, commitopts cannot be used
5694 # -l/--local is already there, commitopts cannot be used
5695 ('e', 'edit', None, _('edit commit message')),
5695 ('e', 'edit', None, _('edit commit message')),
5696 ('m', 'message', '', _('use <text> as commit message'), _('TEXT')),
5696 ('m', 'message', '', _('use <text> as commit message'), _('TEXT')),
5697 ] + commitopts2,
5697 ] + commitopts2,
5698 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
5698 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
5699 def tag(ui, repo, name1, *names, **opts):
5699 def tag(ui, repo, name1, *names, **opts):
5700 """add one or more tags for the current or given revision
5700 """add one or more tags for the current or given revision
5701
5701
5702 Name a particular revision using <name>.
5702 Name a particular revision using <name>.
5703
5703
5704 Tags are used to name particular revisions of the repository and are
5704 Tags are used to name particular revisions of the repository and are
5705 very useful to compare different revisions, to go back to significant
5705 very useful to compare different revisions, to go back to significant
5706 earlier versions or to mark branch points as releases, etc. Changing
5706 earlier versions or to mark branch points as releases, etc. Changing
5707 an existing tag is normally disallowed; use -f/--force to override.
5707 an existing tag is normally disallowed; use -f/--force to override.
5708
5708
5709 If no revision is given, the parent of the working directory is
5709 If no revision is given, the parent of the working directory is
5710 used.
5710 used.
5711
5711
5712 To facilitate version control, distribution, and merging of tags,
5712 To facilitate version control, distribution, and merging of tags,
5713 they are stored as a file named ".hgtags" which is managed similarly
5713 they are stored as a file named ".hgtags" which is managed similarly
5714 to other project files and can be hand-edited if necessary. This
5714 to other project files and can be hand-edited if necessary. This
5715 also means that tagging creates a new commit. The file
5715 also means that tagging creates a new commit. The file
5716 ".hg/localtags" is used for local tags (not shared among
5716 ".hg/localtags" is used for local tags (not shared among
5717 repositories).
5717 repositories).
5718
5718
5719 Tag commits are usually made at the head of a branch. If the parent
5719 Tag commits are usually made at the head of a branch. If the parent
5720 of the working directory is not a branch head, :hg:`tag` aborts; use
5720 of the working directory is not a branch head, :hg:`tag` aborts; use
5721 -f/--force to force the tag commit to be based on a non-head
5721 -f/--force to force the tag commit to be based on a non-head
5722 changeset.
5722 changeset.
5723
5723
5724 See :hg:`help dates` for a list of formats valid for -d/--date.
5724 See :hg:`help dates` for a list of formats valid for -d/--date.
5725
5725
5726 Since tag names have priority over branch names during revision
5726 Since tag names have priority over branch names during revision
5727 lookup, using an existing branch name as a tag name is discouraged.
5727 lookup, using an existing branch name as a tag name is discouraged.
5728
5728
5729 Returns 0 on success.
5729 Returns 0 on success.
5730 """
5730 """
5731 wlock = lock = None
5731 wlock = lock = None
5732 try:
5732 try:
5733 wlock = repo.wlock()
5733 wlock = repo.wlock()
5734 lock = repo.lock()
5734 lock = repo.lock()
5735 rev_ = "."
5735 rev_ = "."
5736 names = [t.strip() for t in (name1,) + names]
5736 names = [t.strip() for t in (name1,) + names]
5737 if len(names) != len(set(names)):
5737 if len(names) != len(set(names)):
5738 raise util.Abort(_('tag names must be unique'))
5738 raise util.Abort(_('tag names must be unique'))
5739 for n in names:
5739 for n in names:
5740 scmutil.checknewlabel(repo, n, 'tag')
5740 scmutil.checknewlabel(repo, n, 'tag')
5741 if not n:
5741 if not n:
5742 raise util.Abort(_('tag names cannot consist entirely of '
5742 raise util.Abort(_('tag names cannot consist entirely of '
5743 'whitespace'))
5743 'whitespace'))
5744 if opts.get('rev') and opts.get('remove'):
5744 if opts.get('rev') and opts.get('remove'):
5745 raise util.Abort(_("--rev and --remove are incompatible"))
5745 raise util.Abort(_("--rev and --remove are incompatible"))
5746 if opts.get('rev'):
5746 if opts.get('rev'):
5747 rev_ = opts['rev']
5747 rev_ = opts['rev']
5748 message = opts.get('message')
5748 message = opts.get('message')
5749 if opts.get('remove'):
5749 if opts.get('remove'):
5750 expectedtype = opts.get('local') and 'local' or 'global'
5750 expectedtype = opts.get('local') and 'local' or 'global'
5751 for n in names:
5751 for n in names:
5752 if not repo.tagtype(n):
5752 if not repo.tagtype(n):
5753 raise util.Abort(_("tag '%s' does not exist") % n)
5753 raise util.Abort(_("tag '%s' does not exist") % n)
5754 if repo.tagtype(n) != expectedtype:
5754 if repo.tagtype(n) != expectedtype:
5755 if expectedtype == 'global':
5755 if expectedtype == 'global':
5756 raise util.Abort(_("tag '%s' is not a global tag") % n)
5756 raise util.Abort(_("tag '%s' is not a global tag") % n)
5757 else:
5757 else:
5758 raise util.Abort(_("tag '%s' is not a local tag") % n)
5758 raise util.Abort(_("tag '%s' is not a local tag") % n)
5759 rev_ = nullid
5759 rev_ = nullid
5760 if not message:
5760 if not message:
5761 # we don't translate commit messages
5761 # we don't translate commit messages
5762 message = 'Removed tag %s' % ', '.join(names)
5762 message = 'Removed tag %s' % ', '.join(names)
5763 elif not opts.get('force'):
5763 elif not opts.get('force'):
5764 for n in names:
5764 for n in names:
5765 if n in repo.tags():
5765 if n in repo.tags():
5766 raise util.Abort(_("tag '%s' already exists "
5766 raise util.Abort(_("tag '%s' already exists "
5767 "(use -f to force)") % n)
5767 "(use -f to force)") % n)
5768 if not opts.get('local'):
5768 if not opts.get('local'):
5769 p1, p2 = repo.dirstate.parents()
5769 p1, p2 = repo.dirstate.parents()
5770 if p2 != nullid:
5770 if p2 != nullid:
5771 raise util.Abort(_('uncommitted merge'))
5771 raise util.Abort(_('uncommitted merge'))
5772 bheads = repo.branchheads()
5772 bheads = repo.branchheads()
5773 if not opts.get('force') and bheads and p1 not in bheads:
5773 if not opts.get('force') and bheads and p1 not in bheads:
5774 raise util.Abort(_('not at a branch head (use -f to force)'))
5774 raise util.Abort(_('not at a branch head (use -f to force)'))
5775 r = scmutil.revsingle(repo, rev_).node()
5775 r = scmutil.revsingle(repo, rev_).node()
5776
5776
5777 if not message:
5777 if not message:
5778 # we don't translate commit messages
5778 # we don't translate commit messages
5779 message = ('Added tag %s for changeset %s' %
5779 message = ('Added tag %s for changeset %s' %
5780 (', '.join(names), short(r)))
5780 (', '.join(names), short(r)))
5781
5781
5782 date = opts.get('date')
5782 date = opts.get('date')
5783 if date:
5783 if date:
5784 date = util.parsedate(date)
5784 date = util.parsedate(date)
5785
5785
5786 editor = cmdutil.getcommiteditor(**opts)
5786 editor = cmdutil.getcommiteditor(**opts)
5787
5787
5788 # don't allow tagging the null rev
5788 # don't allow tagging the null rev
5789 if (not opts.get('remove') and
5789 if (not opts.get('remove') and
5790 scmutil.revsingle(repo, rev_).rev() == nullrev):
5790 scmutil.revsingle(repo, rev_).rev() == nullrev):
5791 raise util.Abort(_("cannot tag null revision"))
5791 raise util.Abort(_("cannot tag null revision"))
5792
5792
5793 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
5793 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date,
5794 editor=editor)
5794 editor=editor)
5795 finally:
5795 finally:
5796 release(lock, wlock)
5796 release(lock, wlock)
5797
5797
5798 @command('tags', [], '')
5798 @command('tags', [], '')
5799 def tags(ui, repo, **opts):
5799 def tags(ui, repo, **opts):
5800 """list repository tags
5800 """list repository tags
5801
5801
5802 This lists both regular and local tags. When the -v/--verbose
5802 This lists both regular and local tags. When the -v/--verbose
5803 switch is used, a third column "local" is printed for local tags.
5803 switch is used, a third column "local" is printed for local tags.
5804
5804
5805 Returns 0 on success.
5805 Returns 0 on success.
5806 """
5806 """
5807
5807
5808 fm = ui.formatter('tags', opts)
5808 fm = ui.formatter('tags', opts)
5809 hexfunc = ui.debugflag and hex or short
5809 hexfunc = ui.debugflag and hex or short
5810 tagtype = ""
5810 tagtype = ""
5811
5811
5812 for t, n in reversed(repo.tagslist()):
5812 for t, n in reversed(repo.tagslist()):
5813 hn = hexfunc(n)
5813 hn = hexfunc(n)
5814 label = 'tags.normal'
5814 label = 'tags.normal'
5815 tagtype = ''
5815 tagtype = ''
5816 if repo.tagtype(t) == 'local':
5816 if repo.tagtype(t) == 'local':
5817 label = 'tags.local'
5817 label = 'tags.local'
5818 tagtype = 'local'
5818 tagtype = 'local'
5819
5819
5820 fm.startitem()
5820 fm.startitem()
5821 fm.write('tag', '%s', t, label=label)
5821 fm.write('tag', '%s', t, label=label)
5822 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
5822 fmt = " " * (30 - encoding.colwidth(t)) + ' %5d:%s'
5823 fm.condwrite(not ui.quiet, 'rev id', fmt,
5823 fm.condwrite(not ui.quiet, 'rev id', fmt,
5824 repo.changelog.rev(n), hn, label=label)
5824 repo.changelog.rev(n), hn, label=label)
5825 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
5825 fm.condwrite(ui.verbose and tagtype, 'type', ' %s',
5826 tagtype, label=label)
5826 tagtype, label=label)
5827 fm.plain('\n')
5827 fm.plain('\n')
5828 fm.end()
5828 fm.end()
5829
5829
5830 @command('tip',
5830 @command('tip',
5831 [('p', 'patch', None, _('show patch')),
5831 [('p', 'patch', None, _('show patch')),
5832 ('g', 'git', None, _('use git extended diff format')),
5832 ('g', 'git', None, _('use git extended diff format')),
5833 ] + templateopts,
5833 ] + templateopts,
5834 _('[-p] [-g]'))
5834 _('[-p] [-g]'))
5835 def tip(ui, repo, **opts):
5835 def tip(ui, repo, **opts):
5836 """show the tip revision (DEPRECATED)
5836 """show the tip revision (DEPRECATED)
5837
5837
5838 The tip revision (usually just called the tip) is the changeset
5838 The tip revision (usually just called the tip) is the changeset
5839 most recently added to the repository (and therefore the most
5839 most recently added to the repository (and therefore the most
5840 recently changed head).
5840 recently changed head).
5841
5841
5842 If you have just made a commit, that commit will be the tip. If
5842 If you have just made a commit, that commit will be the tip. If
5843 you have just pulled changes from another repository, the tip of
5843 you have just pulled changes from another repository, the tip of
5844 that repository becomes the current tip. The "tip" tag is special
5844 that repository becomes the current tip. The "tip" tag is special
5845 and cannot be renamed or assigned to a different changeset.
5845 and cannot be renamed or assigned to a different changeset.
5846
5846
5847 This command is deprecated, please use :hg:`heads` instead.
5847 This command is deprecated, please use :hg:`heads` instead.
5848
5848
5849 Returns 0 on success.
5849 Returns 0 on success.
5850 """
5850 """
5851 displayer = cmdutil.show_changeset(ui, repo, opts)
5851 displayer = cmdutil.show_changeset(ui, repo, opts)
5852 displayer.show(repo['tip'])
5852 displayer.show(repo['tip'])
5853 displayer.close()
5853 displayer.close()
5854
5854
5855 @command('unbundle',
5855 @command('unbundle',
5856 [('u', 'update', None,
5856 [('u', 'update', None,
5857 _('update to new branch head if changesets were unbundled'))],
5857 _('update to new branch head if changesets were unbundled'))],
5858 _('[-u] FILE...'))
5858 _('[-u] FILE...'))
5859 def unbundle(ui, repo, fname1, *fnames, **opts):
5859 def unbundle(ui, repo, fname1, *fnames, **opts):
5860 """apply one or more changegroup files
5860 """apply one or more changegroup files
5861
5861
5862 Apply one or more compressed changegroup files generated by the
5862 Apply one or more compressed changegroup files generated by the
5863 bundle command.
5863 bundle command.
5864
5864
5865 Returns 0 on success, 1 if an update has unresolved files.
5865 Returns 0 on success, 1 if an update has unresolved files.
5866 """
5866 """
5867 fnames = (fname1,) + fnames
5867 fnames = (fname1,) + fnames
5868
5868
5869 lock = repo.lock()
5869 lock = repo.lock()
5870 wc = repo['.']
5870 wc = repo['.']
5871 try:
5871 try:
5872 for fname in fnames:
5872 for fname in fnames:
5873 f = hg.openpath(ui, fname)
5873 f = hg.openpath(ui, fname)
5874 gen = exchange.readbundle(ui, f, fname)
5874 gen = exchange.readbundle(ui, f, fname)
5875 modheads = changegroup.addchangegroup(repo, gen, 'unbundle',
5875 modheads = changegroup.addchangegroup(repo, gen, 'unbundle',
5876 'bundle:' + fname)
5876 'bundle:' + fname)
5877 finally:
5877 finally:
5878 lock.release()
5878 lock.release()
5879 bookmarks.updatecurrentbookmark(repo, wc.node(), wc.branch())
5879 bookmarks.updatecurrentbookmark(repo, wc.node(), wc.branch())
5880 return postincoming(ui, repo, modheads, opts.get('update'), None)
5880 return postincoming(ui, repo, modheads, opts.get('update'), None)
5881
5881
5882 @command('^update|up|checkout|co',
5882 @command('^update|up|checkout|co',
5883 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
5883 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
5884 ('c', 'check', None,
5884 ('c', 'check', None,
5885 _('update across branches if no uncommitted changes')),
5885 _('update across branches if no uncommitted changes')),
5886 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5886 ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
5887 ('r', 'rev', '', _('revision'), _('REV'))
5887 ('r', 'rev', '', _('revision'), _('REV'))
5888 ] + mergetoolopts,
5888 ] + mergetoolopts,
5889 _('[-c] [-C] [-d DATE] [[-r] REV]'))
5889 _('[-c] [-C] [-d DATE] [[-r] REV]'))
5890 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
5890 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False,
5891 tool=None):
5891 tool=None):
5892 """update working directory (or switch revisions)
5892 """update working directory (or switch revisions)
5893
5893
5894 Update the repository's working directory to the specified
5894 Update the repository's working directory to the specified
5895 changeset. If no changeset is specified, update to the tip of the
5895 changeset. If no changeset is specified, update to the tip of the
5896 current named branch and move the current bookmark (see :hg:`help
5896 current named branch and move the current bookmark (see :hg:`help
5897 bookmarks`).
5897 bookmarks`).
5898
5898
5899 Update sets the working directory's parent revision to the specified
5899 Update sets the working directory's parent revision to the specified
5900 changeset (see :hg:`help parents`).
5900 changeset (see :hg:`help parents`).
5901
5901
5902 If the changeset is not a descendant or ancestor of the working
5902 If the changeset is not a descendant or ancestor of the working
5903 directory's parent, the update is aborted. With the -c/--check
5903 directory's parent, the update is aborted. With the -c/--check
5904 option, the working directory is checked for uncommitted changes; if
5904 option, the working directory is checked for uncommitted changes; if
5905 none are found, the working directory is updated to the specified
5905 none are found, the working directory is updated to the specified
5906 changeset.
5906 changeset.
5907
5907
5908 .. container:: verbose
5908 .. container:: verbose
5909
5909
5910 The following rules apply when the working directory contains
5910 The following rules apply when the working directory contains
5911 uncommitted changes:
5911 uncommitted changes:
5912
5912
5913 1. If neither -c/--check nor -C/--clean is specified, and if
5913 1. If neither -c/--check nor -C/--clean is specified, and if
5914 the requested changeset is an ancestor or descendant of
5914 the requested changeset is an ancestor or descendant of
5915 the working directory's parent, the uncommitted changes
5915 the working directory's parent, the uncommitted changes
5916 are merged into the requested changeset and the merged
5916 are merged into the requested changeset and the merged
5917 result is left uncommitted. If the requested changeset is
5917 result is left uncommitted. If the requested changeset is
5918 not an ancestor or descendant (that is, it is on another
5918 not an ancestor or descendant (that is, it is on another
5919 branch), the update is aborted and the uncommitted changes
5919 branch), the update is aborted and the uncommitted changes
5920 are preserved.
5920 are preserved.
5921
5921
5922 2. With the -c/--check option, the update is aborted and the
5922 2. With the -c/--check option, the update is aborted and the
5923 uncommitted changes are preserved.
5923 uncommitted changes are preserved.
5924
5924
5925 3. With the -C/--clean option, uncommitted changes are discarded and
5925 3. With the -C/--clean option, uncommitted changes are discarded and
5926 the working directory is updated to the requested changeset.
5926 the working directory is updated to the requested changeset.
5927
5927
5928 To cancel an uncommitted merge (and lose your changes), use
5928 To cancel an uncommitted merge (and lose your changes), use
5929 :hg:`update --clean .`.
5929 :hg:`update --clean .`.
5930
5930
5931 Use null as the changeset to remove the working directory (like
5931 Use null as the changeset to remove the working directory (like
5932 :hg:`clone -U`).
5932 :hg:`clone -U`).
5933
5933
5934 If you want to revert just one file to an older revision, use
5934 If you want to revert just one file to an older revision, use
5935 :hg:`revert [-r REV] NAME`.
5935 :hg:`revert [-r REV] NAME`.
5936
5936
5937 See :hg:`help dates` for a list of formats valid for -d/--date.
5937 See :hg:`help dates` for a list of formats valid for -d/--date.
5938
5938
5939 Returns 0 on success, 1 if there are unresolved files.
5939 Returns 0 on success, 1 if there are unresolved files.
5940 """
5940 """
5941 if rev and node:
5941 if rev and node:
5942 raise util.Abort(_("please specify just one revision"))
5942 raise util.Abort(_("please specify just one revision"))
5943
5943
5944 if rev is None or rev == '':
5944 if rev is None or rev == '':
5945 rev = node
5945 rev = node
5946
5946
5947 cmdutil.clearunfinished(repo)
5947 cmdutil.clearunfinished(repo)
5948
5948
5949 # with no argument, we also move the current bookmark, if any
5949 # with no argument, we also move the current bookmark, if any
5950 rev, movemarkfrom = bookmarks.calculateupdate(ui, repo, rev)
5950 rev, movemarkfrom = bookmarks.calculateupdate(ui, repo, rev)
5951
5951
5952 # if we defined a bookmark, we have to remember the original bookmark name
5952 # if we defined a bookmark, we have to remember the original bookmark name
5953 brev = rev
5953 brev = rev
5954 rev = scmutil.revsingle(repo, rev, rev).rev()
5954 rev = scmutil.revsingle(repo, rev, rev).rev()
5955
5955
5956 if check and clean:
5956 if check and clean:
5957 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
5957 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
5958
5958
5959 if date:
5959 if date:
5960 if rev is not None:
5960 if rev is not None:
5961 raise util.Abort(_("you can't specify a revision and a date"))
5961 raise util.Abort(_("you can't specify a revision and a date"))
5962 rev = cmdutil.finddate(ui, repo, date)
5962 rev = cmdutil.finddate(ui, repo, date)
5963
5963
5964 if check:
5964 if check:
5965 c = repo[None]
5965 c = repo[None]
5966 if c.dirty(merge=False, branch=False, missing=True):
5966 if c.dirty(merge=False, branch=False, missing=True):
5967 raise util.Abort(_("uncommitted changes"))
5967 raise util.Abort(_("uncommitted changes"))
5968 if rev is None:
5968 if rev is None:
5969 rev = repo[repo[None].branch()].rev()
5969 rev = repo[repo[None].branch()].rev()
5970 mergemod._checkunknown(repo, repo[None], repo[rev])
5970 mergemod._checkunknown(repo, repo[None], repo[rev])
5971
5971
5972 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
5972 repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
5973
5973
5974 if clean:
5974 if clean:
5975 ret = hg.clean(repo, rev)
5975 ret = hg.clean(repo, rev)
5976 else:
5976 else:
5977 ret = hg.update(repo, rev)
5977 ret = hg.update(repo, rev)
5978
5978
5979 if not ret and movemarkfrom:
5979 if not ret and movemarkfrom:
5980 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
5980 if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
5981 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
5981 ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
5982 elif brev in repo._bookmarks:
5982 elif brev in repo._bookmarks:
5983 bookmarks.setcurrent(repo, brev)
5983 bookmarks.setcurrent(repo, brev)
5984 ui.status(_("(activating bookmark %s)\n") % brev)
5984 ui.status(_("(activating bookmark %s)\n") % brev)
5985 elif brev:
5985 elif brev:
5986 if repo._bookmarkcurrent:
5986 if repo._bookmarkcurrent:
5987 ui.status(_("(leaving bookmark %s)\n") %
5987 ui.status(_("(leaving bookmark %s)\n") %
5988 repo._bookmarkcurrent)
5988 repo._bookmarkcurrent)
5989 bookmarks.unsetcurrent(repo)
5989 bookmarks.unsetcurrent(repo)
5990
5990
5991 return ret
5991 return ret
5992
5992
5993 @command('verify', [])
5993 @command('verify', [])
5994 def verify(ui, repo):
5994 def verify(ui, repo):
5995 """verify the integrity of the repository
5995 """verify the integrity of the repository
5996
5996
5997 Verify the integrity of the current repository.
5997 Verify the integrity of the current repository.
5998
5998
5999 This will perform an extensive check of the repository's
5999 This will perform an extensive check of the repository's
6000 integrity, validating the hashes and checksums of each entry in
6000 integrity, validating the hashes and checksums of each entry in
6001 the changelog, manifest, and tracked files, as well as the
6001 the changelog, manifest, and tracked files, as well as the
6002 integrity of their crosslinks and indices.
6002 integrity of their crosslinks and indices.
6003
6003
6004 Please see http://mercurial.selenic.com/wiki/RepositoryCorruption
6004 Please see http://mercurial.selenic.com/wiki/RepositoryCorruption
6005 for more information about recovery from corruption of the
6005 for more information about recovery from corruption of the
6006 repository.
6006 repository.
6007
6007
6008 Returns 0 on success, 1 if errors are encountered.
6008 Returns 0 on success, 1 if errors are encountered.
6009 """
6009 """
6010 return hg.verify(repo)
6010 return hg.verify(repo)
6011
6011
6012 @command('version', [], norepo=True)
6012 @command('version', [], norepo=True)
6013 def version_(ui):
6013 def version_(ui):
6014 """output version and copyright information"""
6014 """output version and copyright information"""
6015 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6015 ui.write(_("Mercurial Distributed SCM (version %s)\n")
6016 % util.version())
6016 % util.version())
6017 ui.status(_(
6017 ui.status(_(
6018 "(see http://mercurial.selenic.com for more information)\n"
6018 "(see http://mercurial.selenic.com for more information)\n"
6019 "\nCopyright (C) 2005-2014 Matt Mackall and others\n"
6019 "\nCopyright (C) 2005-2014 Matt Mackall and others\n"
6020 "This is free software; see the source for copying conditions. "
6020 "This is free software; see the source for copying conditions. "
6021 "There is NO\nwarranty; "
6021 "There is NO\nwarranty; "
6022 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6022 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
6023 ))
6023 ))
6024
6024
6025 ui.note(_("\nEnabled extensions:\n\n"))
6025 ui.note(_("\nEnabled extensions:\n\n"))
6026 if ui.verbose:
6026 if ui.verbose:
6027 # format names and versions into columns
6027 # format names and versions into columns
6028 names = []
6028 names = []
6029 vers = []
6029 vers = []
6030 for name, module in extensions.extensions():
6030 for name, module in extensions.extensions():
6031 names.append(name)
6031 names.append(name)
6032 vers.append(extensions.moduleversion(module))
6032 vers.append(extensions.moduleversion(module))
6033 if names:
6033 if names:
6034 maxnamelen = max(len(n) for n in names)
6034 maxnamelen = max(len(n) for n in names)
6035 for i, name in enumerate(names):
6035 for i, name in enumerate(names):
6036 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
6036 ui.write(" %-*s %s\n" % (maxnamelen, name, vers[i]))
@@ -1,159 +1,159 b''
1 $ hg init a
1 $ hg init a
2 $ cd a
2 $ cd a
3 $ echo a > a
3 $ echo a > a
4 $ hg add -n
4 $ hg add -n
5 adding a
5 adding a
6 $ hg st
6 $ hg st
7 ? a
7 ? a
8 $ hg add
8 $ hg add
9 adding a
9 adding a
10 $ hg st
10 $ hg st
11 A a
11 A a
12 $ hg forget a
12 $ hg forget a
13 $ hg add
13 $ hg add
14 adding a
14 adding a
15 $ hg st
15 $ hg st
16 A a
16 A a
17
17
18 $ echo b > b
18 $ echo b > b
19 $ hg add -n b
19 $ hg add -n b
20 $ hg st
20 $ hg st
21 A a
21 A a
22 ? b
22 ? b
23 $ hg add b
23 $ hg add b
24 $ hg st
24 $ hg st
25 A a
25 A a
26 A b
26 A b
27
27
28 should fail
28 should fail
29
29
30 $ hg add b
30 $ hg add b
31 b already tracked!
31 b already tracked!
32 $ hg st
32 $ hg st
33 A a
33 A a
34 A b
34 A b
35
35
36 #if no-windows
36 #if no-windows
37 $ echo foo > con.xml
37 $ echo foo > con.xml
38 $ hg --config ui.portablefilenames=jump add con.xml
38 $ hg --config ui.portablefilenames=jump add con.xml
39 abort: ui.portablefilenames value is invalid ('jump')
39 abort: ui.portablefilenames value is invalid ('jump')
40 [255]
40 [255]
41 $ hg --config ui.portablefilenames=abort add con.xml
41 $ hg --config ui.portablefilenames=abort add con.xml
42 abort: filename contains 'con', which is reserved on Windows: 'con.xml'
42 abort: filename contains 'con', which is reserved on Windows: 'con.xml'
43 [255]
43 [255]
44 $ hg st
44 $ hg st
45 A a
45 A a
46 A b
46 A b
47 ? con.xml
47 ? con.xml
48 $ hg add con.xml
48 $ hg add con.xml
49 warning: filename contains 'con', which is reserved on Windows: 'con.xml'
49 warning: filename contains 'con', which is reserved on Windows: 'con.xml'
50 $ hg st
50 $ hg st
51 A a
51 A a
52 A b
52 A b
53 A con.xml
53 A con.xml
54 $ hg forget con.xml
54 $ hg forget con.xml
55 $ rm con.xml
55 $ rm con.xml
56 #endif
56 #endif
57
57
58 #if eol-in-paths
58 #if eol-in-paths
59 $ echo bla > 'hello:world'
59 $ echo bla > 'hello:world'
60 $ hg --config ui.portablefilenames=abort add
60 $ hg --config ui.portablefilenames=abort add
61 adding hello:world
61 adding hello:world
62 abort: filename contains ':', which is reserved on Windows: 'hello:world'
62 abort: filename contains ':', which is reserved on Windows: 'hello:world'
63 [255]
63 [255]
64 $ hg st
64 $ hg st
65 A a
65 A a
66 A b
66 A b
67 ? hello:world
67 ? hello:world
68 $ hg --config ui.portablefilenames=ignore add
68 $ hg --config ui.portablefilenames=ignore add
69 adding hello:world
69 adding hello:world
70 $ hg st
70 $ hg st
71 A a
71 A a
72 A b
72 A b
73 A hello:world
73 A hello:world
74 #endif
74 #endif
75
75
76 $ hg ci -m 0 --traceback
76 $ hg ci -m 0 --traceback
77
77
78 should fail
78 should fail
79
79
80 $ hg add a
80 $ hg add a
81 a already tracked!
81 a already tracked!
82
82
83 $ echo aa > a
83 $ echo aa > a
84 $ hg ci -m 1
84 $ hg ci -m 1
85 $ hg up 0
85 $ hg up 0
86 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
87 $ echo aaa > a
87 $ echo aaa > a
88 $ hg ci -m 2
88 $ hg ci -m 2
89 created new head
89 created new head
90
90
91 $ hg merge
91 $ hg merge
92 merging a
92 merging a
93 warning: conflicts during merge.
93 warning: conflicts during merge.
94 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
94 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
95 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
95 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
96 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
96 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
97 [1]
97 [1]
98 $ hg st
98 $ hg st
99 M a
99 M a
100 ? a.orig
100 ? a.orig
101
101
102 should fail
102 should fail
103
103
104 $ hg add a
104 $ hg add a
105 a already tracked!
105 a already tracked!
106 $ hg st
106 $ hg st
107 M a
107 M a
108 ? a.orig
108 ? a.orig
109 $ hg resolve -m a
109 $ hg resolve -m a
110 no more unresolved files
110 (no more unresolved files)
111 $ hg ci -m merge
111 $ hg ci -m merge
112
112
113 Issue683: peculiarity with hg revert of an removed then added file
113 Issue683: peculiarity with hg revert of an removed then added file
114
114
115 $ hg forget a
115 $ hg forget a
116 $ hg add a
116 $ hg add a
117 $ hg st
117 $ hg st
118 ? a.orig
118 ? a.orig
119 $ hg rm a
119 $ hg rm a
120 $ hg st
120 $ hg st
121 R a
121 R a
122 ? a.orig
122 ? a.orig
123 $ echo a > a
123 $ echo a > a
124 $ hg add a
124 $ hg add a
125 $ hg st
125 $ hg st
126 M a
126 M a
127 ? a.orig
127 ? a.orig
128
128
129 $ hg add c && echo "unexpected addition of missing file"
129 $ hg add c && echo "unexpected addition of missing file"
130 c: * (glob)
130 c: * (glob)
131 [1]
131 [1]
132 $ echo c > c
132 $ echo c > c
133 $ hg add d c && echo "unexpected addition of missing file"
133 $ hg add d c && echo "unexpected addition of missing file"
134 d: * (glob)
134 d: * (glob)
135 [1]
135 [1]
136 $ hg st
136 $ hg st
137 M a
137 M a
138 A c
138 A c
139 ? a.orig
139 ? a.orig
140 $ hg up -C
140 $ hg up -C
141 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
141 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
142
142
143 forget and get should have the right order: added but missing dir should be
143 forget and get should have the right order: added but missing dir should be
144 forgotten before file with same name is added
144 forgotten before file with same name is added
145
145
146 $ echo file d > d
146 $ echo file d > d
147 $ hg add d
147 $ hg add d
148 $ hg ci -md
148 $ hg ci -md
149 $ hg rm d
149 $ hg rm d
150 $ mkdir d
150 $ mkdir d
151 $ echo a > d/a
151 $ echo a > d/a
152 $ hg add d/a
152 $ hg add d/a
153 $ rm -r d
153 $ rm -r d
154 $ hg up -C
154 $ hg up -C
155 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
155 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
156 $ cat d
156 $ cat d
157 file d
157 file d
158
158
159 $ cd ..
159 $ cd ..
@@ -1,544 +1,544 b''
1 $ hg init basic
1 $ hg init basic
2 $ cd basic
2 $ cd basic
3
3
4 should complain
4 should complain
5
5
6 $ hg backout
6 $ hg backout
7 abort: please specify a revision to backout
7 abort: please specify a revision to backout
8 [255]
8 [255]
9 $ hg backout -r 0 0
9 $ hg backout -r 0 0
10 abort: please specify just one revision
10 abort: please specify just one revision
11 [255]
11 [255]
12
12
13 basic operation
13 basic operation
14 (this also tests that editor is invoked if the commit message is not
14 (this also tests that editor is invoked if the commit message is not
15 specified explicitly)
15 specified explicitly)
16
16
17 $ echo a > a
17 $ echo a > a
18 $ hg commit -d '0 0' -A -m a
18 $ hg commit -d '0 0' -A -m a
19 adding a
19 adding a
20 $ echo b >> a
20 $ echo b >> a
21 $ hg commit -d '1 0' -m b
21 $ hg commit -d '1 0' -m b
22
22
23 $ hg status --rev tip --rev "tip^1"
23 $ hg status --rev tip --rev "tip^1"
24 M a
24 M a
25 $ HGEDITOR=cat hg backout -d '2 0' tip --tool=true
25 $ HGEDITOR=cat hg backout -d '2 0' tip --tool=true
26 reverting a
26 reverting a
27 Backed out changeset a820f4f40a57
27 Backed out changeset a820f4f40a57
28
28
29
29
30 HG: Enter commit message. Lines beginning with 'HG:' are removed.
30 HG: Enter commit message. Lines beginning with 'HG:' are removed.
31 HG: Leave message empty to abort commit.
31 HG: Leave message empty to abort commit.
32 HG: --
32 HG: --
33 HG: user: test
33 HG: user: test
34 HG: branch 'default'
34 HG: branch 'default'
35 HG: changed a
35 HG: changed a
36 changeset 2:2929462c3dff backs out changeset 1:a820f4f40a57
36 changeset 2:2929462c3dff backs out changeset 1:a820f4f40a57
37 $ cat a
37 $ cat a
38 a
38 a
39 $ hg summary
39 $ hg summary
40 parent: 2:2929462c3dff tip
40 parent: 2:2929462c3dff tip
41 Backed out changeset a820f4f40a57
41 Backed out changeset a820f4f40a57
42 branch: default
42 branch: default
43 commit: (clean)
43 commit: (clean)
44 update: (current)
44 update: (current)
45
45
46 file that was removed is recreated
46 file that was removed is recreated
47 (this also tests that editor is not invoked if the commit message is
47 (this also tests that editor is not invoked if the commit message is
48 specified explicitly)
48 specified explicitly)
49
49
50 $ cd ..
50 $ cd ..
51 $ hg init remove
51 $ hg init remove
52 $ cd remove
52 $ cd remove
53
53
54 $ echo content > a
54 $ echo content > a
55 $ hg commit -d '0 0' -A -m a
55 $ hg commit -d '0 0' -A -m a
56 adding a
56 adding a
57
57
58 $ hg rm a
58 $ hg rm a
59 $ hg commit -d '1 0' -m b
59 $ hg commit -d '1 0' -m b
60
60
61 $ HGEDITOR=cat hg backout -d '2 0' tip --tool=true -m "Backed out changeset 76862dcce372"
61 $ HGEDITOR=cat hg backout -d '2 0' tip --tool=true -m "Backed out changeset 76862dcce372"
62 adding a
62 adding a
63 changeset 2:de31bdc76c0d backs out changeset 1:76862dcce372
63 changeset 2:de31bdc76c0d backs out changeset 1:76862dcce372
64 $ cat a
64 $ cat a
65 content
65 content
66 $ hg summary
66 $ hg summary
67 parent: 2:de31bdc76c0d tip
67 parent: 2:de31bdc76c0d tip
68 Backed out changeset 76862dcce372
68 Backed out changeset 76862dcce372
69 branch: default
69 branch: default
70 commit: (clean)
70 commit: (clean)
71 update: (current)
71 update: (current)
72
72
73 backout of backout is as if nothing happened
73 backout of backout is as if nothing happened
74
74
75 $ hg backout -d '3 0' --merge tip --tool=true
75 $ hg backout -d '3 0' --merge tip --tool=true
76 removing a
76 removing a
77 changeset 3:7f6d0f120113 backs out changeset 2:de31bdc76c0d
77 changeset 3:7f6d0f120113 backs out changeset 2:de31bdc76c0d
78 $ test -f a
78 $ test -f a
79 [1]
79 [1]
80 $ hg summary
80 $ hg summary
81 parent: 3:7f6d0f120113 tip
81 parent: 3:7f6d0f120113 tip
82 Backed out changeset de31bdc76c0d
82 Backed out changeset de31bdc76c0d
83 branch: default
83 branch: default
84 commit: (clean)
84 commit: (clean)
85 update: (current)
85 update: (current)
86
86
87 across branch
87 across branch
88
88
89 $ cd ..
89 $ cd ..
90 $ hg init branch
90 $ hg init branch
91 $ cd branch
91 $ cd branch
92 $ echo a > a
92 $ echo a > a
93 $ hg ci -Am0
93 $ hg ci -Am0
94 adding a
94 adding a
95 $ echo b > b
95 $ echo b > b
96 $ hg ci -Am1
96 $ hg ci -Am1
97 adding b
97 adding b
98 $ hg co -C 0
98 $ hg co -C 0
99 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
99 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
100 $ hg summary
100 $ hg summary
101 parent: 0:f7b1eb17ad24
101 parent: 0:f7b1eb17ad24
102 0
102 0
103 branch: default
103 branch: default
104 commit: (clean)
104 commit: (clean)
105 update: 1 new changesets (update)
105 update: 1 new changesets (update)
106
106
107 should fail
107 should fail
108
108
109 $ hg backout 1
109 $ hg backout 1
110 abort: cannot backout change that is not an ancestor
110 abort: cannot backout change that is not an ancestor
111 [255]
111 [255]
112 $ echo c > c
112 $ echo c > c
113 $ hg ci -Am2
113 $ hg ci -Am2
114 adding c
114 adding c
115 created new head
115 created new head
116 $ hg summary
116 $ hg summary
117 parent: 2:db815d6d32e6 tip
117 parent: 2:db815d6d32e6 tip
118 2
118 2
119 branch: default
119 branch: default
120 commit: (clean)
120 commit: (clean)
121 update: 1 new changesets, 2 branch heads (merge)
121 update: 1 new changesets, 2 branch heads (merge)
122
122
123 should fail
123 should fail
124
124
125 $ hg backout 1
125 $ hg backout 1
126 abort: cannot backout change that is not an ancestor
126 abort: cannot backout change that is not an ancestor
127 [255]
127 [255]
128 $ hg summary
128 $ hg summary
129 parent: 2:db815d6d32e6 tip
129 parent: 2:db815d6d32e6 tip
130 2
130 2
131 branch: default
131 branch: default
132 commit: (clean)
132 commit: (clean)
133 update: 1 new changesets, 2 branch heads (merge)
133 update: 1 new changesets, 2 branch heads (merge)
134
134
135 backout with merge
135 backout with merge
136
136
137 $ cd ..
137 $ cd ..
138 $ hg init merge
138 $ hg init merge
139 $ cd merge
139 $ cd merge
140
140
141 $ echo line 1 > a
141 $ echo line 1 > a
142 $ echo line 2 >> a
142 $ echo line 2 >> a
143 $ hg commit -d '0 0' -A -m a
143 $ hg commit -d '0 0' -A -m a
144 adding a
144 adding a
145 $ hg summary
145 $ hg summary
146 parent: 0:59395513a13a tip
146 parent: 0:59395513a13a tip
147 a
147 a
148 branch: default
148 branch: default
149 commit: (clean)
149 commit: (clean)
150 update: (current)
150 update: (current)
151
151
152 remove line 1
152 remove line 1
153
153
154 $ echo line 2 > a
154 $ echo line 2 > a
155 $ hg commit -d '1 0' -m b
155 $ hg commit -d '1 0' -m b
156
156
157 $ echo line 3 >> a
157 $ echo line 3 >> a
158 $ hg commit -d '2 0' -m c
158 $ hg commit -d '2 0' -m c
159
159
160 $ hg backout --merge -d '3 0' 1 --tool=true
160 $ hg backout --merge -d '3 0' 1 --tool=true
161 reverting a
161 reverting a
162 created new head
162 created new head
163 changeset 3:26b8ccb9ad91 backs out changeset 1:5a50a024c182
163 changeset 3:26b8ccb9ad91 backs out changeset 1:5a50a024c182
164 merging with changeset 3:26b8ccb9ad91
164 merging with changeset 3:26b8ccb9ad91
165 merging a
165 merging a
166 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
166 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
167 (branch merge, don't forget to commit)
167 (branch merge, don't forget to commit)
168 $ hg commit -d '4 0' -m d
168 $ hg commit -d '4 0' -m d
169 $ hg summary
169 $ hg summary
170 parent: 4:c7df5e0b9c09 tip
170 parent: 4:c7df5e0b9c09 tip
171 d
171 d
172 branch: default
172 branch: default
173 commit: (clean)
173 commit: (clean)
174 update: (current)
174 update: (current)
175
175
176 check line 1 is back
176 check line 1 is back
177
177
178 $ cat a
178 $ cat a
179 line 1
179 line 1
180 line 2
180 line 2
181 line 3
181 line 3
182
182
183 $ cd ..
183 $ cd ..
184
184
185 backout should not back out subsequent changesets
185 backout should not back out subsequent changesets
186
186
187 $ hg init onecs
187 $ hg init onecs
188 $ cd onecs
188 $ cd onecs
189 $ echo 1 > a
189 $ echo 1 > a
190 $ hg commit -d '0 0' -A -m a
190 $ hg commit -d '0 0' -A -m a
191 adding a
191 adding a
192 $ echo 2 >> a
192 $ echo 2 >> a
193 $ hg commit -d '1 0' -m b
193 $ hg commit -d '1 0' -m b
194 $ echo 1 > b
194 $ echo 1 > b
195 $ hg commit -d '2 0' -A -m c
195 $ hg commit -d '2 0' -A -m c
196 adding b
196 adding b
197 $ hg summary
197 $ hg summary
198 parent: 2:882396649954 tip
198 parent: 2:882396649954 tip
199 c
199 c
200 branch: default
200 branch: default
201 commit: (clean)
201 commit: (clean)
202 update: (current)
202 update: (current)
203
203
204 without --merge
204 without --merge
205 $ hg backout -d '3 0' 1 --tool=true
205 $ hg backout -d '3 0' 1 --tool=true
206 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
206 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
207 changeset 22bca4c721e5 backed out, don't forget to commit.
207 changeset 22bca4c721e5 backed out, don't forget to commit.
208 $ hg locate b
208 $ hg locate b
209 b
209 b
210 $ hg update -C tip
210 $ hg update -C tip
211 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
211 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
212 $ hg locate b
212 $ hg locate b
213 b
213 b
214 $ hg summary
214 $ hg summary
215 parent: 2:882396649954 tip
215 parent: 2:882396649954 tip
216 c
216 c
217 branch: default
217 branch: default
218 commit: (clean)
218 commit: (clean)
219 update: (current)
219 update: (current)
220
220
221 with --merge
221 with --merge
222 $ hg backout --merge -d '3 0' 1 --tool=true
222 $ hg backout --merge -d '3 0' 1 --tool=true
223 reverting a
223 reverting a
224 created new head
224 created new head
225 changeset 3:3202beb76721 backs out changeset 1:22bca4c721e5
225 changeset 3:3202beb76721 backs out changeset 1:22bca4c721e5
226 merging with changeset 3:3202beb76721
226 merging with changeset 3:3202beb76721
227 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
227 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
228 (branch merge, don't forget to commit)
228 (branch merge, don't forget to commit)
229 $ hg locate b
229 $ hg locate b
230 b
230 b
231 $ hg update -C tip
231 $ hg update -C tip
232 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
232 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
233 $ hg locate b
233 $ hg locate b
234 [1]
234 [1]
235
235
236 $ cd ..
236 $ cd ..
237 $ hg init m
237 $ hg init m
238 $ cd m
238 $ cd m
239 $ echo a > a
239 $ echo a > a
240 $ hg commit -d '0 0' -A -m a
240 $ hg commit -d '0 0' -A -m a
241 adding a
241 adding a
242 $ echo b > b
242 $ echo b > b
243 $ hg commit -d '1 0' -A -m b
243 $ hg commit -d '1 0' -A -m b
244 adding b
244 adding b
245 $ echo c > c
245 $ echo c > c
246 $ hg commit -d '2 0' -A -m b
246 $ hg commit -d '2 0' -A -m b
247 adding c
247 adding c
248 $ hg update 1
248 $ hg update 1
249 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
249 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
250 $ echo d > d
250 $ echo d > d
251 $ hg commit -d '3 0' -A -m c
251 $ hg commit -d '3 0' -A -m c
252 adding d
252 adding d
253 created new head
253 created new head
254 $ hg merge 2
254 $ hg merge 2
255 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
255 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
256 (branch merge, don't forget to commit)
256 (branch merge, don't forget to commit)
257 $ hg commit -d '4 0' -A -m d
257 $ hg commit -d '4 0' -A -m d
258 $ hg summary
258 $ hg summary
259 parent: 4:b2f3bb92043e tip
259 parent: 4:b2f3bb92043e tip
260 d
260 d
261 branch: default
261 branch: default
262 commit: (clean)
262 commit: (clean)
263 update: (current)
263 update: (current)
264
264
265 backout of merge should fail
265 backout of merge should fail
266
266
267 $ hg backout 4
267 $ hg backout 4
268 abort: cannot backout a merge changeset
268 abort: cannot backout a merge changeset
269 [255]
269 [255]
270
270
271 backout of merge with bad parent should fail
271 backout of merge with bad parent should fail
272
272
273 $ hg backout --parent 0 4
273 $ hg backout --parent 0 4
274 abort: cb9a9f314b8b is not a parent of b2f3bb92043e
274 abort: cb9a9f314b8b is not a parent of b2f3bb92043e
275 [255]
275 [255]
276
276
277 backout of non-merge with parent should fail
277 backout of non-merge with parent should fail
278
278
279 $ hg backout --parent 0 3
279 $ hg backout --parent 0 3
280 abort: cannot use --parent on non-merge changeset
280 abort: cannot use --parent on non-merge changeset
281 [255]
281 [255]
282
282
283 backout with valid parent should be ok
283 backout with valid parent should be ok
284
284
285 $ hg backout -d '5 0' --parent 2 4 --tool=true
285 $ hg backout -d '5 0' --parent 2 4 --tool=true
286 removing d
286 removing d
287 changeset 5:10e5328c8435 backs out changeset 4:b2f3bb92043e
287 changeset 5:10e5328c8435 backs out changeset 4:b2f3bb92043e
288 $ hg summary
288 $ hg summary
289 parent: 5:10e5328c8435 tip
289 parent: 5:10e5328c8435 tip
290 Backed out changeset b2f3bb92043e
290 Backed out changeset b2f3bb92043e
291 branch: default
291 branch: default
292 commit: (clean)
292 commit: (clean)
293 update: (current)
293 update: (current)
294
294
295 $ hg rollback
295 $ hg rollback
296 repository tip rolled back to revision 4 (undo commit)
296 repository tip rolled back to revision 4 (undo commit)
297 working directory now based on revision 4
297 working directory now based on revision 4
298 $ hg update -C
298 $ hg update -C
299 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
299 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
300 $ hg summary
300 $ hg summary
301 parent: 4:b2f3bb92043e tip
301 parent: 4:b2f3bb92043e tip
302 d
302 d
303 branch: default
303 branch: default
304 commit: (clean)
304 commit: (clean)
305 update: (current)
305 update: (current)
306
306
307 $ hg backout -d '6 0' --parent 3 4 --tool=true
307 $ hg backout -d '6 0' --parent 3 4 --tool=true
308 removing c
308 removing c
309 changeset 5:033590168430 backs out changeset 4:b2f3bb92043e
309 changeset 5:033590168430 backs out changeset 4:b2f3bb92043e
310 $ hg summary
310 $ hg summary
311 parent: 5:033590168430 tip
311 parent: 5:033590168430 tip
312 Backed out changeset b2f3bb92043e
312 Backed out changeset b2f3bb92043e
313 branch: default
313 branch: default
314 commit: (clean)
314 commit: (clean)
315 update: (current)
315 update: (current)
316
316
317 $ cd ..
317 $ cd ..
318
318
319 named branches
319 named branches
320
320
321 $ hg init named_branches
321 $ hg init named_branches
322 $ cd named_branches
322 $ cd named_branches
323
323
324 $ echo default > default
324 $ echo default > default
325 $ hg ci -d '0 0' -Am default
325 $ hg ci -d '0 0' -Am default
326 adding default
326 adding default
327 $ hg branch branch1
327 $ hg branch branch1
328 marked working directory as branch branch1
328 marked working directory as branch branch1
329 (branches are permanent and global, did you want a bookmark?)
329 (branches are permanent and global, did you want a bookmark?)
330 $ echo branch1 > file1
330 $ echo branch1 > file1
331 $ hg ci -d '1 0' -Am file1
331 $ hg ci -d '1 0' -Am file1
332 adding file1
332 adding file1
333 $ hg branch branch2
333 $ hg branch branch2
334 marked working directory as branch branch2
334 marked working directory as branch branch2
335 (branches are permanent and global, did you want a bookmark?)
335 (branches are permanent and global, did you want a bookmark?)
336 $ echo branch2 > file2
336 $ echo branch2 > file2
337 $ hg ci -d '2 0' -Am file2
337 $ hg ci -d '2 0' -Am file2
338 adding file2
338 adding file2
339
339
340 without --merge
340 without --merge
341 $ hg backout -r 1 --tool=true
341 $ hg backout -r 1 --tool=true
342 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
342 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
343 changeset bf1602f437f3 backed out, don't forget to commit.
343 changeset bf1602f437f3 backed out, don't forget to commit.
344 $ hg branch
344 $ hg branch
345 branch2
345 branch2
346 $ hg status -A
346 $ hg status -A
347 R file1
347 R file1
348 C default
348 C default
349 C file2
349 C file2
350 $ hg summary
350 $ hg summary
351 parent: 2:45bbcd363bf0 tip
351 parent: 2:45bbcd363bf0 tip
352 file2
352 file2
353 branch: branch2
353 branch: branch2
354 commit: 1 removed
354 commit: 1 removed
355 update: (current)
355 update: (current)
356
356
357 with --merge
357 with --merge
358 (this also tests that editor is invoked if '--edit' is specified
358 (this also tests that editor is invoked if '--edit' is specified
359 explicitly regardless of '--message')
359 explicitly regardless of '--message')
360
360
361 $ hg update -qC
361 $ hg update -qC
362 $ HGEDITOR=cat hg backout --merge -d '3 0' -r 1 -m 'backout on branch1' --tool=true --edit
362 $ HGEDITOR=cat hg backout --merge -d '3 0' -r 1 -m 'backout on branch1' --tool=true --edit
363 removing file1
363 removing file1
364 backout on branch1
364 backout on branch1
365
365
366
366
367 HG: Enter commit message. Lines beginning with 'HG:' are removed.
367 HG: Enter commit message. Lines beginning with 'HG:' are removed.
368 HG: Leave message empty to abort commit.
368 HG: Leave message empty to abort commit.
369 HG: --
369 HG: --
370 HG: user: test
370 HG: user: test
371 HG: branch 'branch2'
371 HG: branch 'branch2'
372 HG: removed file1
372 HG: removed file1
373 created new head
373 created new head
374 changeset 3:d4e8f6db59fb backs out changeset 1:bf1602f437f3
374 changeset 3:d4e8f6db59fb backs out changeset 1:bf1602f437f3
375 merging with changeset 3:d4e8f6db59fb
375 merging with changeset 3:d4e8f6db59fb
376 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
376 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
377 (branch merge, don't forget to commit)
377 (branch merge, don't forget to commit)
378 $ hg summary
378 $ hg summary
379 parent: 2:45bbcd363bf0
379 parent: 2:45bbcd363bf0
380 file2
380 file2
381 parent: 3:d4e8f6db59fb tip
381 parent: 3:d4e8f6db59fb tip
382 backout on branch1
382 backout on branch1
383 branch: branch2
383 branch: branch2
384 commit: 1 removed (merge)
384 commit: 1 removed (merge)
385 update: (current)
385 update: (current)
386 $ hg update -q -C 2
386 $ hg update -q -C 2
387
387
388 on branch2 with branch1 not merged, so file1 should still exist:
388 on branch2 with branch1 not merged, so file1 should still exist:
389
389
390 $ hg id
390 $ hg id
391 45bbcd363bf0 (branch2)
391 45bbcd363bf0 (branch2)
392 $ hg st -A
392 $ hg st -A
393 C default
393 C default
394 C file1
394 C file1
395 C file2
395 C file2
396 $ hg summary
396 $ hg summary
397 parent: 2:45bbcd363bf0
397 parent: 2:45bbcd363bf0
398 file2
398 file2
399 branch: branch2
399 branch: branch2
400 commit: (clean)
400 commit: (clean)
401 update: 1 new changesets, 2 branch heads (merge)
401 update: 1 new changesets, 2 branch heads (merge)
402
402
403 on branch2 with branch1 merged, so file1 should be gone:
403 on branch2 with branch1 merged, so file1 should be gone:
404
404
405 $ hg merge
405 $ hg merge
406 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
406 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
407 (branch merge, don't forget to commit)
407 (branch merge, don't forget to commit)
408 $ hg ci -d '4 0' -m 'merge backout of branch1'
408 $ hg ci -d '4 0' -m 'merge backout of branch1'
409 $ hg id
409 $ hg id
410 22149cdde76d (branch2) tip
410 22149cdde76d (branch2) tip
411 $ hg st -A
411 $ hg st -A
412 C default
412 C default
413 C file2
413 C file2
414 $ hg summary
414 $ hg summary
415 parent: 4:22149cdde76d tip
415 parent: 4:22149cdde76d tip
416 merge backout of branch1
416 merge backout of branch1
417 branch: branch2
417 branch: branch2
418 commit: (clean)
418 commit: (clean)
419 update: (current)
419 update: (current)
420
420
421 on branch1, so no file1 and file2:
421 on branch1, so no file1 and file2:
422
422
423 $ hg co -C branch1
423 $ hg co -C branch1
424 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
424 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
425 $ hg id
425 $ hg id
426 bf1602f437f3 (branch1)
426 bf1602f437f3 (branch1)
427 $ hg st -A
427 $ hg st -A
428 C default
428 C default
429 C file1
429 C file1
430 $ hg summary
430 $ hg summary
431 parent: 1:bf1602f437f3
431 parent: 1:bf1602f437f3
432 file1
432 file1
433 branch: branch1
433 branch: branch1
434 commit: (clean)
434 commit: (clean)
435 update: (current)
435 update: (current)
436
436
437 $ cd ..
437 $ cd ..
438
438
439 backout of empty changeset (issue4190)
439 backout of empty changeset (issue4190)
440
440
441 $ hg init emptycommit
441 $ hg init emptycommit
442 $ cd emptycommit
442 $ cd emptycommit
443
443
444 $ touch file1
444 $ touch file1
445 $ hg ci -Aqm file1
445 $ hg ci -Aqm file1
446 $ hg branch -q branch1
446 $ hg branch -q branch1
447 $ hg ci -qm branch1
447 $ hg ci -qm branch1
448 $ hg backout -v 1
448 $ hg backout -v 1
449 resolving manifests
449 resolving manifests
450 nothing changed
450 nothing changed
451 [1]
451 [1]
452
452
453 $ cd ..
453 $ cd ..
454
454
455
455
456 Test usage of `hg resolve` in case of conflict
456 Test usage of `hg resolve` in case of conflict
457 (issue4163)
457 (issue4163)
458
458
459 $ hg init issue4163
459 $ hg init issue4163
460 $ cd issue4163
460 $ cd issue4163
461 $ touch foo
461 $ touch foo
462 $ hg add foo
462 $ hg add foo
463 $ cat > foo << EOF
463 $ cat > foo << EOF
464 > one
464 > one
465 > two
465 > two
466 > three
466 > three
467 > four
467 > four
468 > five
468 > five
469 > six
469 > six
470 > seven
470 > seven
471 > height
471 > height
472 > nine
472 > nine
473 > ten
473 > ten
474 > EOF
474 > EOF
475 $ hg ci -m 'initial'
475 $ hg ci -m 'initial'
476 $ cat > foo << EOF
476 $ cat > foo << EOF
477 > one
477 > one
478 > two
478 > two
479 > THREE
479 > THREE
480 > four
480 > four
481 > five
481 > five
482 > six
482 > six
483 > seven
483 > seven
484 > height
484 > height
485 > nine
485 > nine
486 > ten
486 > ten
487 > EOF
487 > EOF
488 $ hg ci -m 'capital three'
488 $ hg ci -m 'capital three'
489 $ cat > foo << EOF
489 $ cat > foo << EOF
490 > one
490 > one
491 > two
491 > two
492 > THREE
492 > THREE
493 > four
493 > four
494 > five
494 > five
495 > six
495 > six
496 > seven
496 > seven
497 > height
497 > height
498 > nine
498 > nine
499 > TEN
499 > TEN
500 > EOF
500 > EOF
501 $ hg ci -m 'capital ten'
501 $ hg ci -m 'capital ten'
502 $ hg backout -r 'desc("capital three")' --tool internal:fail
502 $ hg backout -r 'desc("capital three")' --tool internal:fail
503 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
503 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
504 use 'hg resolve' to retry unresolved file merges
504 use 'hg resolve' to retry unresolved file merges
505 [1]
505 [1]
506 $ hg status
506 $ hg status
507 $ hg resolve -l # still unresolved
507 $ hg resolve -l # still unresolved
508 U foo
508 U foo
509 $ hg summary
509 $ hg summary
510 parent: 2:b71750c4b0fd tip
510 parent: 2:b71750c4b0fd tip
511 capital ten
511 capital ten
512 branch: default
512 branch: default
513 commit: 1 unresolved (clean)
513 commit: 1 unresolved (clean)
514 update: (current)
514 update: (current)
515 $ hg resolve --all --debug
515 $ hg resolve --all --debug
516 picked tool 'internal:merge' for foo (binary False symlink False)
516 picked tool 'internal:merge' for foo (binary False symlink False)
517 merging foo
517 merging foo
518 my foo@b71750c4b0fd+ other foo@a30dd8addae3 ancestor foo@913609522437
518 my foo@b71750c4b0fd+ other foo@a30dd8addae3 ancestor foo@913609522437
519 premerge successful
519 premerge successful
520 no more unresolved files
520 (no more unresolved files)
521 $ hg status
521 $ hg status
522 M foo
522 M foo
523 ? foo.orig
523 ? foo.orig
524 $ hg resolve -l
524 $ hg resolve -l
525 R foo
525 R foo
526 $ hg summary
526 $ hg summary
527 parent: 2:b71750c4b0fd tip
527 parent: 2:b71750c4b0fd tip
528 capital ten
528 capital ten
529 branch: default
529 branch: default
530 commit: 1 modified, 1 unknown
530 commit: 1 modified, 1 unknown
531 update: (current)
531 update: (current)
532 $ cat foo
532 $ cat foo
533 one
533 one
534 two
534 two
535 three
535 three
536 four
536 four
537 five
537 five
538 six
538 six
539 seven
539 seven
540 height
540 height
541 nine
541 nine
542 TEN
542 TEN
543
543
544
544
@@ -1,852 +1,852 b''
1 $ hg init
1 $ hg init
2
2
3 Setup:
3 Setup:
4
4
5 $ echo a >> a
5 $ echo a >> a
6 $ hg ci -Am 'base'
6 $ hg ci -Am 'base'
7 adding a
7 adding a
8
8
9 Refuse to amend public csets:
9 Refuse to amend public csets:
10
10
11 $ hg phase -r . -p
11 $ hg phase -r . -p
12 $ hg ci --amend
12 $ hg ci --amend
13 abort: cannot amend public changesets
13 abort: cannot amend public changesets
14 [255]
14 [255]
15 $ hg phase -r . -f -d
15 $ hg phase -r . -f -d
16
16
17 $ echo a >> a
17 $ echo a >> a
18 $ hg ci -Am 'base1'
18 $ hg ci -Am 'base1'
19
19
20 Nothing to amend:
20 Nothing to amend:
21
21
22 $ hg ci --amend
22 $ hg ci --amend
23 nothing changed
23 nothing changed
24 [1]
24 [1]
25
25
26 $ cat >> $HGRCPATH <<EOF
26 $ cat >> $HGRCPATH <<EOF
27 > [hooks]
27 > [hooks]
28 > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
28 > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
29 > EOF
29 > EOF
30
30
31 Amending changeset with changes in working dir:
31 Amending changeset with changes in working dir:
32 (and check that --message does not trigger an editor)
32 (and check that --message does not trigger an editor)
33
33
34 $ echo a >> a
34 $ echo a >> a
35 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -m 'amend base1'
35 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -m 'amend base1'
36 pretxncommit 43f1ba15f28a50abf0aae529cf8a16bfced7b149
36 pretxncommit 43f1ba15f28a50abf0aae529cf8a16bfced7b149
37 43f1ba15f28a tip
37 43f1ba15f28a tip
38 saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg (glob)
38 saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg (glob)
39 $ echo 'pretxncommit.foo = ' >> $HGRCPATH
39 $ echo 'pretxncommit.foo = ' >> $HGRCPATH
40 $ hg diff -c .
40 $ hg diff -c .
41 diff -r ad120869acf0 -r 43f1ba15f28a a
41 diff -r ad120869acf0 -r 43f1ba15f28a a
42 --- a/a Thu Jan 01 00:00:00 1970 +0000
42 --- a/a Thu Jan 01 00:00:00 1970 +0000
43 +++ b/a Thu Jan 01 00:00:00 1970 +0000
43 +++ b/a Thu Jan 01 00:00:00 1970 +0000
44 @@ -1,1 +1,3 @@
44 @@ -1,1 +1,3 @@
45 a
45 a
46 +a
46 +a
47 +a
47 +a
48 $ hg log
48 $ hg log
49 changeset: 1:43f1ba15f28a
49 changeset: 1:43f1ba15f28a
50 tag: tip
50 tag: tip
51 user: test
51 user: test
52 date: Thu Jan 01 00:00:00 1970 +0000
52 date: Thu Jan 01 00:00:00 1970 +0000
53 summary: amend base1
53 summary: amend base1
54
54
55 changeset: 0:ad120869acf0
55 changeset: 0:ad120869acf0
56 user: test
56 user: test
57 date: Thu Jan 01 00:00:00 1970 +0000
57 date: Thu Jan 01 00:00:00 1970 +0000
58 summary: base
58 summary: base
59
59
60
60
61 Check proper abort for empty message
61 Check proper abort for empty message
62
62
63 $ cat > editor.sh << '__EOF__'
63 $ cat > editor.sh << '__EOF__'
64 > #!/bin/sh
64 > #!/bin/sh
65 > echo "" > "$1"
65 > echo "" > "$1"
66 > __EOF__
66 > __EOF__
67 $ echo b > b
67 $ echo b > b
68 $ hg add b
68 $ hg add b
69 $ hg summary
69 $ hg summary
70 parent: 1:43f1ba15f28a tip
70 parent: 1:43f1ba15f28a tip
71 amend base1
71 amend base1
72 branch: default
72 branch: default
73 commit: 1 added, 1 unknown
73 commit: 1 added, 1 unknown
74 update: (current)
74 update: (current)
75 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
75 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
76 transaction abort!
76 transaction abort!
77 rollback completed
77 rollback completed
78 abort: empty commit message
78 abort: empty commit message
79 [255]
79 [255]
80 $ hg summary
80 $ hg summary
81 parent: 1:43f1ba15f28a tip
81 parent: 1:43f1ba15f28a tip
82 amend base1
82 amend base1
83 branch: default
83 branch: default
84 commit: 1 added, 1 unknown
84 commit: 1 added, 1 unknown
85 update: (current)
85 update: (current)
86
86
87 Add new file:
87 Add new file:
88 $ hg ci --amend -m 'amend base1 new file'
88 $ hg ci --amend -m 'amend base1 new file'
89 saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-amend-backup.hg (glob)
89 saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-amend-backup.hg (glob)
90
90
91 Remove file that was added in amended commit:
91 Remove file that was added in amended commit:
92 (and test logfile option)
92 (and test logfile option)
93 (and test that logfile option do not trigger an editor)
93 (and test that logfile option do not trigger an editor)
94
94
95 $ hg rm b
95 $ hg rm b
96 $ echo 'amend base1 remove new file' > ../logfile
96 $ echo 'amend base1 remove new file' > ../logfile
97 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg ci --amend --logfile ../logfile
97 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg ci --amend --logfile ../logfile
98 saved backup bundle to $TESTTMP/.hg/strip-backup/b8e3cb2b3882-amend-backup.hg (glob)
98 saved backup bundle to $TESTTMP/.hg/strip-backup/b8e3cb2b3882-amend-backup.hg (glob)
99
99
100 $ hg cat b
100 $ hg cat b
101 b: no such file in rev 74609c7f506e
101 b: no such file in rev 74609c7f506e
102 [1]
102 [1]
103
103
104 No changes, just a different message:
104 No changes, just a different message:
105
105
106 $ hg ci -v --amend -m 'no changes, new message'
106 $ hg ci -v --amend -m 'no changes, new message'
107 amending changeset 74609c7f506e
107 amending changeset 74609c7f506e
108 copying changeset 74609c7f506e to ad120869acf0
108 copying changeset 74609c7f506e to ad120869acf0
109 a
109 a
110 stripping amended changeset 74609c7f506e
110 stripping amended changeset 74609c7f506e
111 1 changesets found
111 1 changesets found
112 saved backup bundle to $TESTTMP/.hg/strip-backup/74609c7f506e-amend-backup.hg (glob)
112 saved backup bundle to $TESTTMP/.hg/strip-backup/74609c7f506e-amend-backup.hg (glob)
113 1 changesets found
113 1 changesets found
114 adding branch
114 adding branch
115 adding changesets
115 adding changesets
116 adding manifests
116 adding manifests
117 adding file changes
117 adding file changes
118 added 1 changesets with 1 changes to 1 files
118 added 1 changesets with 1 changes to 1 files
119 committed changeset 1:1cd866679df8
119 committed changeset 1:1cd866679df8
120 $ hg diff -c .
120 $ hg diff -c .
121 diff -r ad120869acf0 -r 1cd866679df8 a
121 diff -r ad120869acf0 -r 1cd866679df8 a
122 --- a/a Thu Jan 01 00:00:00 1970 +0000
122 --- a/a Thu Jan 01 00:00:00 1970 +0000
123 +++ b/a Thu Jan 01 00:00:00 1970 +0000
123 +++ b/a Thu Jan 01 00:00:00 1970 +0000
124 @@ -1,1 +1,3 @@
124 @@ -1,1 +1,3 @@
125 a
125 a
126 +a
126 +a
127 +a
127 +a
128 $ hg log
128 $ hg log
129 changeset: 1:1cd866679df8
129 changeset: 1:1cd866679df8
130 tag: tip
130 tag: tip
131 user: test
131 user: test
132 date: Thu Jan 01 00:00:00 1970 +0000
132 date: Thu Jan 01 00:00:00 1970 +0000
133 summary: no changes, new message
133 summary: no changes, new message
134
134
135 changeset: 0:ad120869acf0
135 changeset: 0:ad120869acf0
136 user: test
136 user: test
137 date: Thu Jan 01 00:00:00 1970 +0000
137 date: Thu Jan 01 00:00:00 1970 +0000
138 summary: base
138 summary: base
139
139
140
140
141 Disable default date on commit so when -d isn't given, the old date is preserved:
141 Disable default date on commit so when -d isn't given, the old date is preserved:
142
142
143 $ echo '[defaults]' >> $HGRCPATH
143 $ echo '[defaults]' >> $HGRCPATH
144 $ echo 'commit=' >> $HGRCPATH
144 $ echo 'commit=' >> $HGRCPATH
145
145
146 Test -u/-d:
146 Test -u/-d:
147
147
148 $ hg ci --amend -u foo -d '1 0'
148 $ hg ci --amend -u foo -d '1 0'
149 saved backup bundle to $TESTTMP/.hg/strip-backup/1cd866679df8-amend-backup.hg (glob)
149 saved backup bundle to $TESTTMP/.hg/strip-backup/1cd866679df8-amend-backup.hg (glob)
150 $ echo a >> a
150 $ echo a >> a
151 $ hg ci --amend -u foo -d '1 0'
151 $ hg ci --amend -u foo -d '1 0'
152 saved backup bundle to $TESTTMP/.hg/strip-backup/780e6f23e03d-amend-backup.hg (glob)
152 saved backup bundle to $TESTTMP/.hg/strip-backup/780e6f23e03d-amend-backup.hg (glob)
153 $ hg log -r .
153 $ hg log -r .
154 changeset: 1:5f357c7560ab
154 changeset: 1:5f357c7560ab
155 tag: tip
155 tag: tip
156 user: foo
156 user: foo
157 date: Thu Jan 01 00:00:01 1970 +0000
157 date: Thu Jan 01 00:00:01 1970 +0000
158 summary: no changes, new message
158 summary: no changes, new message
159
159
160
160
161 Open editor with old commit message if a message isn't given otherwise:
161 Open editor with old commit message if a message isn't given otherwise:
162
162
163 $ cat > editor.sh << '__EOF__'
163 $ cat > editor.sh << '__EOF__'
164 > #!/bin/sh
164 > #!/bin/sh
165 > cat $1
165 > cat $1
166 > echo "another precious commit message" > "$1"
166 > echo "another precious commit message" > "$1"
167 > __EOF__
167 > __EOF__
168
168
169 at first, test saving last-message.txt
169 at first, test saving last-message.txt
170
170
171 $ cat > .hg/hgrc << '__EOF__'
171 $ cat > .hg/hgrc << '__EOF__'
172 > [hooks]
172 > [hooks]
173 > pretxncommit.test-saving-last-message = false
173 > pretxncommit.test-saving-last-message = false
174 > __EOF__
174 > __EOF__
175
175
176 $ rm -f .hg/last-message.txt
176 $ rm -f .hg/last-message.txt
177 $ hg commit --amend -v -m "message given from command line"
177 $ hg commit --amend -v -m "message given from command line"
178 amending changeset 5f357c7560ab
178 amending changeset 5f357c7560ab
179 copying changeset 5f357c7560ab to ad120869acf0
179 copying changeset 5f357c7560ab to ad120869acf0
180 a
180 a
181 running hook pretxncommit.test-saving-last-message: false
181 running hook pretxncommit.test-saving-last-message: false
182 transaction abort!
182 transaction abort!
183 rollback completed
183 rollback completed
184 abort: pretxncommit.test-saving-last-message hook exited with status 1
184 abort: pretxncommit.test-saving-last-message hook exited with status 1
185 [255]
185 [255]
186 $ cat .hg/last-message.txt
186 $ cat .hg/last-message.txt
187 message given from command line (no-eol)
187 message given from command line (no-eol)
188
188
189 $ rm -f .hg/last-message.txt
189 $ rm -f .hg/last-message.txt
190 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
190 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
191 amending changeset 5f357c7560ab
191 amending changeset 5f357c7560ab
192 copying changeset 5f357c7560ab to ad120869acf0
192 copying changeset 5f357c7560ab to ad120869acf0
193 no changes, new message
193 no changes, new message
194
194
195
195
196 HG: Enter commit message. Lines beginning with 'HG:' are removed.
196 HG: Enter commit message. Lines beginning with 'HG:' are removed.
197 HG: Leave message empty to abort commit.
197 HG: Leave message empty to abort commit.
198 HG: --
198 HG: --
199 HG: user: foo
199 HG: user: foo
200 HG: branch 'default'
200 HG: branch 'default'
201 HG: changed a
201 HG: changed a
202 a
202 a
203 running hook pretxncommit.test-saving-last-message: false
203 running hook pretxncommit.test-saving-last-message: false
204 transaction abort!
204 transaction abort!
205 rollback completed
205 rollback completed
206 abort: pretxncommit.test-saving-last-message hook exited with status 1
206 abort: pretxncommit.test-saving-last-message hook exited with status 1
207 [255]
207 [255]
208
208
209 $ cat .hg/last-message.txt
209 $ cat .hg/last-message.txt
210 another precious commit message
210 another precious commit message
211
211
212 $ cat > .hg/hgrc << '__EOF__'
212 $ cat > .hg/hgrc << '__EOF__'
213 > [hooks]
213 > [hooks]
214 > pretxncommit.test-saving-last-message =
214 > pretxncommit.test-saving-last-message =
215 > __EOF__
215 > __EOF__
216
216
217 then, test editing custom commit message
217 then, test editing custom commit message
218
218
219 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
219 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
220 amending changeset 5f357c7560ab
220 amending changeset 5f357c7560ab
221 copying changeset 5f357c7560ab to ad120869acf0
221 copying changeset 5f357c7560ab to ad120869acf0
222 no changes, new message
222 no changes, new message
223
223
224
224
225 HG: Enter commit message. Lines beginning with 'HG:' are removed.
225 HG: Enter commit message. Lines beginning with 'HG:' are removed.
226 HG: Leave message empty to abort commit.
226 HG: Leave message empty to abort commit.
227 HG: --
227 HG: --
228 HG: user: foo
228 HG: user: foo
229 HG: branch 'default'
229 HG: branch 'default'
230 HG: changed a
230 HG: changed a
231 a
231 a
232 stripping amended changeset 5f357c7560ab
232 stripping amended changeset 5f357c7560ab
233 1 changesets found
233 1 changesets found
234 saved backup bundle to $TESTTMP/.hg/strip-backup/5f357c7560ab-amend-backup.hg (glob)
234 saved backup bundle to $TESTTMP/.hg/strip-backup/5f357c7560ab-amend-backup.hg (glob)
235 1 changesets found
235 1 changesets found
236 adding branch
236 adding branch
237 adding changesets
237 adding changesets
238 adding manifests
238 adding manifests
239 adding file changes
239 adding file changes
240 added 1 changesets with 1 changes to 1 files
240 added 1 changesets with 1 changes to 1 files
241 committed changeset 1:7ab3bf440b54
241 committed changeset 1:7ab3bf440b54
242
242
243 Same, but with changes in working dir (different code path):
243 Same, but with changes in working dir (different code path):
244
244
245 $ echo a >> a
245 $ echo a >> a
246 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
246 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
247 amending changeset 7ab3bf440b54
247 amending changeset 7ab3bf440b54
248 a
248 a
249 copying changeset a0ea9b1a4c8c to ad120869acf0
249 copying changeset a0ea9b1a4c8c to ad120869acf0
250 another precious commit message
250 another precious commit message
251
251
252
252
253 HG: Enter commit message. Lines beginning with 'HG:' are removed.
253 HG: Enter commit message. Lines beginning with 'HG:' are removed.
254 HG: Leave message empty to abort commit.
254 HG: Leave message empty to abort commit.
255 HG: --
255 HG: --
256 HG: user: foo
256 HG: user: foo
257 HG: branch 'default'
257 HG: branch 'default'
258 HG: changed a
258 HG: changed a
259 a
259 a
260 stripping intermediate changeset a0ea9b1a4c8c
260 stripping intermediate changeset a0ea9b1a4c8c
261 stripping amended changeset 7ab3bf440b54
261 stripping amended changeset 7ab3bf440b54
262 2 changesets found
262 2 changesets found
263 saved backup bundle to $TESTTMP/.hg/strip-backup/7ab3bf440b54-amend-backup.hg (glob)
263 saved backup bundle to $TESTTMP/.hg/strip-backup/7ab3bf440b54-amend-backup.hg (glob)
264 1 changesets found
264 1 changesets found
265 adding branch
265 adding branch
266 adding changesets
266 adding changesets
267 adding manifests
267 adding manifests
268 adding file changes
268 adding file changes
269 added 1 changesets with 1 changes to 1 files
269 added 1 changesets with 1 changes to 1 files
270 committed changeset 1:ea22a388757c
270 committed changeset 1:ea22a388757c
271
271
272 $ rm editor.sh
272 $ rm editor.sh
273 $ hg log -r .
273 $ hg log -r .
274 changeset: 1:ea22a388757c
274 changeset: 1:ea22a388757c
275 tag: tip
275 tag: tip
276 user: foo
276 user: foo
277 date: Thu Jan 01 00:00:01 1970 +0000
277 date: Thu Jan 01 00:00:01 1970 +0000
278 summary: another precious commit message
278 summary: another precious commit message
279
279
280
280
281 Moving bookmarks, preserve active bookmark:
281 Moving bookmarks, preserve active bookmark:
282
282
283 $ hg book book1
283 $ hg book book1
284 $ hg book book2
284 $ hg book book2
285 $ hg ci --amend -m 'move bookmarks'
285 $ hg ci --amend -m 'move bookmarks'
286 saved backup bundle to $TESTTMP/.hg/strip-backup/ea22a388757c-amend-backup.hg (glob)
286 saved backup bundle to $TESTTMP/.hg/strip-backup/ea22a388757c-amend-backup.hg (glob)
287 $ hg book
287 $ hg book
288 book1 1:6cec5aa930e2
288 book1 1:6cec5aa930e2
289 * book2 1:6cec5aa930e2
289 * book2 1:6cec5aa930e2
290 $ echo a >> a
290 $ echo a >> a
291 $ hg ci --amend -m 'move bookmarks'
291 $ hg ci --amend -m 'move bookmarks'
292 saved backup bundle to $TESTTMP/.hg/strip-backup/6cec5aa930e2-amend-backup.hg (glob)
292 saved backup bundle to $TESTTMP/.hg/strip-backup/6cec5aa930e2-amend-backup.hg (glob)
293 $ hg book
293 $ hg book
294 book1 1:48bb6e53a15f
294 book1 1:48bb6e53a15f
295 * book2 1:48bb6e53a15f
295 * book2 1:48bb6e53a15f
296
296
297 abort does not loose bookmarks
297 abort does not loose bookmarks
298
298
299 $ cat > editor.sh << '__EOF__'
299 $ cat > editor.sh << '__EOF__'
300 > #!/bin/sh
300 > #!/bin/sh
301 > echo "" > "$1"
301 > echo "" > "$1"
302 > __EOF__
302 > __EOF__
303 $ echo a >> a
303 $ echo a >> a
304 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
304 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
305 transaction abort!
305 transaction abort!
306 rollback completed
306 rollback completed
307 abort: empty commit message
307 abort: empty commit message
308 [255]
308 [255]
309 $ hg book
309 $ hg book
310 book1 1:48bb6e53a15f
310 book1 1:48bb6e53a15f
311 * book2 1:48bb6e53a15f
311 * book2 1:48bb6e53a15f
312 $ hg revert -Caq
312 $ hg revert -Caq
313 $ rm editor.sh
313 $ rm editor.sh
314
314
315 $ echo '[defaults]' >> $HGRCPATH
315 $ echo '[defaults]' >> $HGRCPATH
316 $ echo "commit=-d '0 0'" >> $HGRCPATH
316 $ echo "commit=-d '0 0'" >> $HGRCPATH
317
317
318 Moving branches:
318 Moving branches:
319
319
320 $ hg branch foo
320 $ hg branch foo
321 marked working directory as branch foo
321 marked working directory as branch foo
322 (branches are permanent and global, did you want a bookmark?)
322 (branches are permanent and global, did you want a bookmark?)
323 $ echo a >> a
323 $ echo a >> a
324 $ hg ci -m 'branch foo'
324 $ hg ci -m 'branch foo'
325 $ hg branch default -f
325 $ hg branch default -f
326 marked working directory as branch default
326 marked working directory as branch default
327 (branches are permanent and global, did you want a bookmark?)
327 (branches are permanent and global, did you want a bookmark?)
328 $ hg ci --amend -m 'back to default'
328 $ hg ci --amend -m 'back to default'
329 saved backup bundle to $TESTTMP/.hg/strip-backup/8ac881fbf49d-amend-backup.hg (glob)
329 saved backup bundle to $TESTTMP/.hg/strip-backup/8ac881fbf49d-amend-backup.hg (glob)
330 $ hg branches
330 $ hg branches
331 default 2:ce12b0b57d46
331 default 2:ce12b0b57d46
332
332
333 Close branch:
333 Close branch:
334
334
335 $ hg up -q 0
335 $ hg up -q 0
336 $ echo b >> b
336 $ echo b >> b
337 $ hg branch foo
337 $ hg branch foo
338 marked working directory as branch foo
338 marked working directory as branch foo
339 (branches are permanent and global, did you want a bookmark?)
339 (branches are permanent and global, did you want a bookmark?)
340 $ hg ci -Am 'fork'
340 $ hg ci -Am 'fork'
341 adding b
341 adding b
342 $ echo b >> b
342 $ echo b >> b
343 $ hg ci -mb
343 $ hg ci -mb
344 $ hg ci --amend --close-branch -m 'closing branch foo'
344 $ hg ci --amend --close-branch -m 'closing branch foo'
345 saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-amend-backup.hg (glob)
345 saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-amend-backup.hg (glob)
346
346
347 Same thing, different code path:
347 Same thing, different code path:
348
348
349 $ echo b >> b
349 $ echo b >> b
350 $ hg ci -m 'reopen branch'
350 $ hg ci -m 'reopen branch'
351 reopening closed branch head 4
351 reopening closed branch head 4
352 $ echo b >> b
352 $ echo b >> b
353 $ hg ci --amend --close-branch
353 $ hg ci --amend --close-branch
354 saved backup bundle to $TESTTMP/.hg/strip-backup/027371728205-amend-backup.hg (glob)
354 saved backup bundle to $TESTTMP/.hg/strip-backup/027371728205-amend-backup.hg (glob)
355 $ hg branches
355 $ hg branches
356 default 2:ce12b0b57d46
356 default 2:ce12b0b57d46
357
357
358 Refuse to amend during a merge:
358 Refuse to amend during a merge:
359
359
360 $ hg up -q default
360 $ hg up -q default
361 $ hg merge foo
361 $ hg merge foo
362 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
362 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
363 (branch merge, don't forget to commit)
363 (branch merge, don't forget to commit)
364 $ hg ci --amend
364 $ hg ci --amend
365 abort: cannot amend while merging
365 abort: cannot amend while merging
366 [255]
366 [255]
367 $ hg ci -m 'merge'
367 $ hg ci -m 'merge'
368
368
369 Follow copies/renames:
369 Follow copies/renames:
370
370
371 $ hg mv b c
371 $ hg mv b c
372 $ hg ci -m 'b -> c'
372 $ hg ci -m 'b -> c'
373 $ hg mv c d
373 $ hg mv c d
374 $ hg ci --amend -m 'b -> d'
374 $ hg ci --amend -m 'b -> d'
375 saved backup bundle to $TESTTMP/.hg/strip-backup/b8c6eac7f12e-amend-backup.hg (glob)
375 saved backup bundle to $TESTTMP/.hg/strip-backup/b8c6eac7f12e-amend-backup.hg (glob)
376 $ hg st --rev '.^' --copies d
376 $ hg st --rev '.^' --copies d
377 A d
377 A d
378 b
378 b
379 $ hg cp d e
379 $ hg cp d e
380 $ hg ci -m 'e = d'
380 $ hg ci -m 'e = d'
381 $ hg cp e f
381 $ hg cp e f
382 $ hg ci --amend -m 'f = d'
382 $ hg ci --amend -m 'f = d'
383 saved backup bundle to $TESTTMP/.hg/strip-backup/7f9761d65613-amend-backup.hg (glob)
383 saved backup bundle to $TESTTMP/.hg/strip-backup/7f9761d65613-amend-backup.hg (glob)
384 $ hg st --rev '.^' --copies f
384 $ hg st --rev '.^' --copies f
385 A f
385 A f
386 d
386 d
387
387
388 $ mv f f.orig
388 $ mv f f.orig
389 $ hg rm -A f
389 $ hg rm -A f
390 $ hg ci -m removef
390 $ hg ci -m removef
391 $ hg cp a f
391 $ hg cp a f
392 $ mv f.orig f
392 $ mv f.orig f
393 $ hg ci --amend -m replacef
393 $ hg ci --amend -m replacef
394 saved backup bundle to $TESTTMP/.hg/strip-backup/9e8c5f7e3d95-amend-backup.hg (glob)
394 saved backup bundle to $TESTTMP/.hg/strip-backup/9e8c5f7e3d95-amend-backup.hg (glob)
395 $ hg st --change . --copies
395 $ hg st --change . --copies
396 $ hg log -r . --template "{file_copies}\n"
396 $ hg log -r . --template "{file_copies}\n"
397
397
398
398
399 Move added file (issue3410):
399 Move added file (issue3410):
400
400
401 $ echo g >> g
401 $ echo g >> g
402 $ hg ci -Am g
402 $ hg ci -Am g
403 adding g
403 adding g
404 $ hg mv g h
404 $ hg mv g h
405 $ hg ci --amend
405 $ hg ci --amend
406 saved backup bundle to $TESTTMP/.hg/strip-backup/24aa8eacce2b-amend-backup.hg (glob)
406 saved backup bundle to $TESTTMP/.hg/strip-backup/24aa8eacce2b-amend-backup.hg (glob)
407 $ hg st --change . --copies h
407 $ hg st --change . --copies h
408 A h
408 A h
409 $ hg log -r . --template "{file_copies}\n"
409 $ hg log -r . --template "{file_copies}\n"
410
410
411
411
412 Can't rollback an amend:
412 Can't rollback an amend:
413
413
414 $ hg rollback
414 $ hg rollback
415 no rollback information available
415 no rollback information available
416 [1]
416 [1]
417
417
418 Preserve extra dict (issue3430):
418 Preserve extra dict (issue3430):
419
419
420 $ hg branch a
420 $ hg branch a
421 marked working directory as branch a
421 marked working directory as branch a
422 (branches are permanent and global, did you want a bookmark?)
422 (branches are permanent and global, did you want a bookmark?)
423 $ echo a >> a
423 $ echo a >> a
424 $ hg ci -ma
424 $ hg ci -ma
425 $ hg ci --amend -m "a'"
425 $ hg ci --amend -m "a'"
426 saved backup bundle to $TESTTMP/.hg/strip-backup/3837aa2a2fdb-amend-backup.hg (glob)
426 saved backup bundle to $TESTTMP/.hg/strip-backup/3837aa2a2fdb-amend-backup.hg (glob)
427 $ hg log -r . --template "{branch}\n"
427 $ hg log -r . --template "{branch}\n"
428 a
428 a
429 $ hg ci --amend -m "a''"
429 $ hg ci --amend -m "a''"
430 saved backup bundle to $TESTTMP/.hg/strip-backup/c05c06be7514-amend-backup.hg (glob)
430 saved backup bundle to $TESTTMP/.hg/strip-backup/c05c06be7514-amend-backup.hg (glob)
431 $ hg log -r . --template "{branch}\n"
431 $ hg log -r . --template "{branch}\n"
432 a
432 a
433
433
434 Also preserve other entries in the dict that are in the old commit,
434 Also preserve other entries in the dict that are in the old commit,
435 first graft something so there's an additional entry:
435 first graft something so there's an additional entry:
436
436
437 $ hg up 0 -q
437 $ hg up 0 -q
438 $ echo z > z
438 $ echo z > z
439 $ hg ci -Am 'fork'
439 $ hg ci -Am 'fork'
440 adding z
440 adding z
441 created new head
441 created new head
442 $ hg up 11
442 $ hg up 11
443 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
443 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
444 $ hg graft 12
444 $ hg graft 12
445 grafting revision 12
445 grafting revision 12
446 $ hg ci --amend -m 'graft amend'
446 $ hg ci --amend -m 'graft amend'
447 saved backup bundle to $TESTTMP/.hg/strip-backup/bd010aea3f39-amend-backup.hg (glob)
447 saved backup bundle to $TESTTMP/.hg/strip-backup/bd010aea3f39-amend-backup.hg (glob)
448 $ hg log -r . --debug | grep extra
448 $ hg log -r . --debug | grep extra
449 extra: amend_source=bd010aea3f39f3fb2a2f884b9ccb0471cd77398e
449 extra: amend_source=bd010aea3f39f3fb2a2f884b9ccb0471cd77398e
450 extra: branch=a
450 extra: branch=a
451 extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
451 extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
452
452
453 Preserve phase
453 Preserve phase
454
454
455 $ hg phase '.^::.'
455 $ hg phase '.^::.'
456 11: draft
456 11: draft
457 13: draft
457 13: draft
458 $ hg phase --secret --force .
458 $ hg phase --secret --force .
459 $ hg phase '.^::.'
459 $ hg phase '.^::.'
460 11: draft
460 11: draft
461 13: secret
461 13: secret
462 $ hg commit --amend -m 'amend for phase' -q
462 $ hg commit --amend -m 'amend for phase' -q
463 $ hg phase '.^::.'
463 $ hg phase '.^::.'
464 11: draft
464 11: draft
465 13: secret
465 13: secret
466
466
467 Test amend with obsolete
467 Test amend with obsolete
468 ---------------------------
468 ---------------------------
469
469
470 Enable obsolete
470 Enable obsolete
471
471
472 $ cat > ${TESTTMP}/obs.py << EOF
472 $ cat > ${TESTTMP}/obs.py << EOF
473 > import mercurial.obsolete
473 > import mercurial.obsolete
474 > mercurial.obsolete._enabled = True
474 > mercurial.obsolete._enabled = True
475 > EOF
475 > EOF
476 $ echo '[extensions]' >> $HGRCPATH
476 $ echo '[extensions]' >> $HGRCPATH
477 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
477 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
478
478
479
479
480 Amend with no files changes
480 Amend with no files changes
481
481
482 $ hg id -n
482 $ hg id -n
483 13
483 13
484 $ hg ci --amend -m 'babar'
484 $ hg ci --amend -m 'babar'
485 $ hg id -n
485 $ hg id -n
486 14
486 14
487 $ hg log -Gl 3 --style=compact
487 $ hg log -Gl 3 --style=compact
488 @ 14[tip]:11 b650e6ee8614 1970-01-01 00:00 +0000 test
488 @ 14[tip]:11 b650e6ee8614 1970-01-01 00:00 +0000 test
489 | babar
489 | babar
490 |
490 |
491 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
491 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
492 | | fork
492 | | fork
493 | |
493 | |
494 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
494 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
495 | | a''
495 | | a''
496 | |
496 | |
497 $ hg log -Gl 4 --hidden --style=compact
497 $ hg log -Gl 4 --hidden --style=compact
498 @ 14[tip]:11 b650e6ee8614 1970-01-01 00:00 +0000 test
498 @ 14[tip]:11 b650e6ee8614 1970-01-01 00:00 +0000 test
499 | babar
499 | babar
500 |
500 |
501 | x 13:11 68ff8ff97044 1970-01-01 00:00 +0000 test
501 | x 13:11 68ff8ff97044 1970-01-01 00:00 +0000 test
502 |/ amend for phase
502 |/ amend for phase
503 |
503 |
504 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
504 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
505 | | fork
505 | | fork
506 | |
506 | |
507 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
507 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
508 | | a''
508 | | a''
509 | |
509 | |
510
510
511 Amend with files changes
511 Amend with files changes
512
512
513 (note: the extra commit over 15 is a temporary junk I would be happy to get
513 (note: the extra commit over 15 is a temporary junk I would be happy to get
514 ride of)
514 ride of)
515
515
516 $ echo 'babar' >> a
516 $ echo 'babar' >> a
517 $ hg commit --amend
517 $ hg commit --amend
518 $ hg log -Gl 6 --hidden --style=compact
518 $ hg log -Gl 6 --hidden --style=compact
519 @ 16[tip]:11 9f9e9bccf56c 1970-01-01 00:00 +0000 test
519 @ 16[tip]:11 9f9e9bccf56c 1970-01-01 00:00 +0000 test
520 | babar
520 | babar
521 |
521 |
522 | x 15 90fef497c56f 1970-01-01 00:00 +0000 test
522 | x 15 90fef497c56f 1970-01-01 00:00 +0000 test
523 | | temporary amend commit for b650e6ee8614
523 | | temporary amend commit for b650e6ee8614
524 | |
524 | |
525 | x 14:11 b650e6ee8614 1970-01-01 00:00 +0000 test
525 | x 14:11 b650e6ee8614 1970-01-01 00:00 +0000 test
526 |/ babar
526 |/ babar
527 |
527 |
528 | x 13:11 68ff8ff97044 1970-01-01 00:00 +0000 test
528 | x 13:11 68ff8ff97044 1970-01-01 00:00 +0000 test
529 |/ amend for phase
529 |/ amend for phase
530 |
530 |
531 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
531 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
532 | | fork
532 | | fork
533 | |
533 | |
534 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
534 o | 11 3334b7925910 1970-01-01 00:00 +0000 test
535 | | a''
535 | | a''
536 | |
536 | |
537
537
538
538
539 Test that amend does not make it easy to create obsolescence cycle
539 Test that amend does not make it easy to create obsolescence cycle
540 ---------------------------------------------------------------------
540 ---------------------------------------------------------------------
541
541
542 $ hg id -r 14 --hidden
542 $ hg id -r 14 --hidden
543 b650e6ee8614 (a)
543 b650e6ee8614 (a)
544 $ hg revert -ar 14 --hidden
544 $ hg revert -ar 14 --hidden
545 reverting a
545 reverting a
546 $ hg commit --amend
546 $ hg commit --amend
547 $ hg id
547 $ hg id
548 b99e5df575f7 (a) tip
548 b99e5df575f7 (a) tip
549
549
550 Test that rewriting leaving instability behind is allowed
550 Test that rewriting leaving instability behind is allowed
551 ---------------------------------------------------------------------
551 ---------------------------------------------------------------------
552
552
553 $ hg up '.^'
553 $ hg up '.^'
554 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
554 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
555 $ echo 'b' >> a
555 $ echo 'b' >> a
556 $ hg log --style compact -r 'children(.)'
556 $ hg log --style compact -r 'children(.)'
557 18[tip]:11 b99e5df575f7 1970-01-01 00:00 +0000 test
557 18[tip]:11 b99e5df575f7 1970-01-01 00:00 +0000 test
558 babar
558 babar
559
559
560 $ hg commit --amend
560 $ hg commit --amend
561 $ hg log -r 'unstable()'
561 $ hg log -r 'unstable()'
562 changeset: 18:b99e5df575f7
562 changeset: 18:b99e5df575f7
563 branch: a
563 branch: a
564 parent: 11:3334b7925910
564 parent: 11:3334b7925910
565 user: test
565 user: test
566 date: Thu Jan 01 00:00:00 1970 +0000
566 date: Thu Jan 01 00:00:00 1970 +0000
567 summary: babar
567 summary: babar
568
568
569
569
570 Amend a merge changeset (with renames and conflicts from the second parent):
570 Amend a merge changeset (with renames and conflicts from the second parent):
571
571
572 $ hg up -q default
572 $ hg up -q default
573 $ hg branch -q bar
573 $ hg branch -q bar
574 $ hg cp a aa
574 $ hg cp a aa
575 $ hg mv z zz
575 $ hg mv z zz
576 $ echo cc > cc
576 $ echo cc > cc
577 $ hg add cc
577 $ hg add cc
578 $ hg ci -m aazzcc
578 $ hg ci -m aazzcc
579 $ hg up -q default
579 $ hg up -q default
580 $ echo a >> a
580 $ echo a >> a
581 $ echo dd > cc
581 $ echo dd > cc
582 $ hg add cc
582 $ hg add cc
583 $ hg ci -m aa
583 $ hg ci -m aa
584 $ hg merge -q bar
584 $ hg merge -q bar
585 warning: conflicts during merge.
585 warning: conflicts during merge.
586 merging cc incomplete! (edit conflicts, then use 'hg resolve --mark')
586 merging cc incomplete! (edit conflicts, then use 'hg resolve --mark')
587 [1]
587 [1]
588 $ hg resolve -m cc
588 $ hg resolve -m cc
589 no more unresolved files
589 (no more unresolved files)
590 $ hg ci -m 'merge bar'
590 $ hg ci -m 'merge bar'
591 $ hg log --config diff.git=1 -pr .
591 $ hg log --config diff.git=1 -pr .
592 changeset: 23:93cd4445f720
592 changeset: 23:93cd4445f720
593 tag: tip
593 tag: tip
594 parent: 22:30d96aeaf27b
594 parent: 22:30d96aeaf27b
595 parent: 21:1aa437659d19
595 parent: 21:1aa437659d19
596 user: test
596 user: test
597 date: Thu Jan 01 00:00:00 1970 +0000
597 date: Thu Jan 01 00:00:00 1970 +0000
598 summary: merge bar
598 summary: merge bar
599
599
600 diff --git a/a b/aa
600 diff --git a/a b/aa
601 copy from a
601 copy from a
602 copy to aa
602 copy to aa
603 diff --git a/cc b/cc
603 diff --git a/cc b/cc
604 --- a/cc
604 --- a/cc
605 +++ b/cc
605 +++ b/cc
606 @@ -1,1 +1,5 @@
606 @@ -1,1 +1,5 @@
607 +<<<<<<< local: 30d96aeaf27b - test: aa
607 +<<<<<<< local: 30d96aeaf27b - test: aa
608 dd
608 dd
609 +=======
609 +=======
610 +cc
610 +cc
611 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
611 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
612 diff --git a/z b/zz
612 diff --git a/z b/zz
613 rename from z
613 rename from z
614 rename to zz
614 rename to zz
615
615
616 $ hg debugrename aa
616 $ hg debugrename aa
617 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
617 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
618 $ hg debugrename zz
618 $ hg debugrename zz
619 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
619 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
620 $ hg debugrename cc
620 $ hg debugrename cc
621 cc not renamed
621 cc not renamed
622 $ hg ci --amend -m 'merge bar (amend message)'
622 $ hg ci --amend -m 'merge bar (amend message)'
623 $ hg log --config diff.git=1 -pr .
623 $ hg log --config diff.git=1 -pr .
624 changeset: 24:832b50f2c271
624 changeset: 24:832b50f2c271
625 tag: tip
625 tag: tip
626 parent: 22:30d96aeaf27b
626 parent: 22:30d96aeaf27b
627 parent: 21:1aa437659d19
627 parent: 21:1aa437659d19
628 user: test
628 user: test
629 date: Thu Jan 01 00:00:00 1970 +0000
629 date: Thu Jan 01 00:00:00 1970 +0000
630 summary: merge bar (amend message)
630 summary: merge bar (amend message)
631
631
632 diff --git a/a b/aa
632 diff --git a/a b/aa
633 copy from a
633 copy from a
634 copy to aa
634 copy to aa
635 diff --git a/cc b/cc
635 diff --git a/cc b/cc
636 --- a/cc
636 --- a/cc
637 +++ b/cc
637 +++ b/cc
638 @@ -1,1 +1,5 @@
638 @@ -1,1 +1,5 @@
639 +<<<<<<< local: 30d96aeaf27b - test: aa
639 +<<<<<<< local: 30d96aeaf27b - test: aa
640 dd
640 dd
641 +=======
641 +=======
642 +cc
642 +cc
643 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
643 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
644 diff --git a/z b/zz
644 diff --git a/z b/zz
645 rename from z
645 rename from z
646 rename to zz
646 rename to zz
647
647
648 $ hg debugrename aa
648 $ hg debugrename aa
649 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
649 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
650 $ hg debugrename zz
650 $ hg debugrename zz
651 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
651 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
652 $ hg debugrename cc
652 $ hg debugrename cc
653 cc not renamed
653 cc not renamed
654 $ hg mv zz z
654 $ hg mv zz z
655 $ hg ci --amend -m 'merge bar (undo rename)'
655 $ hg ci --amend -m 'merge bar (undo rename)'
656 $ hg log --config diff.git=1 -pr .
656 $ hg log --config diff.git=1 -pr .
657 changeset: 26:bdafc5c72f74
657 changeset: 26:bdafc5c72f74
658 tag: tip
658 tag: tip
659 parent: 22:30d96aeaf27b
659 parent: 22:30d96aeaf27b
660 parent: 21:1aa437659d19
660 parent: 21:1aa437659d19
661 user: test
661 user: test
662 date: Thu Jan 01 00:00:00 1970 +0000
662 date: Thu Jan 01 00:00:00 1970 +0000
663 summary: merge bar (undo rename)
663 summary: merge bar (undo rename)
664
664
665 diff --git a/a b/aa
665 diff --git a/a b/aa
666 copy from a
666 copy from a
667 copy to aa
667 copy to aa
668 diff --git a/cc b/cc
668 diff --git a/cc b/cc
669 --- a/cc
669 --- a/cc
670 +++ b/cc
670 +++ b/cc
671 @@ -1,1 +1,5 @@
671 @@ -1,1 +1,5 @@
672 +<<<<<<< local: 30d96aeaf27b - test: aa
672 +<<<<<<< local: 30d96aeaf27b - test: aa
673 dd
673 dd
674 +=======
674 +=======
675 +cc
675 +cc
676 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
676 +>>>>>>> other: 1aa437659d19 bar - test: aazzcc
677
677
678 $ hg debugrename z
678 $ hg debugrename z
679 z not renamed
679 z not renamed
680
680
681 Amend a merge changeset (with renames during the merge):
681 Amend a merge changeset (with renames during the merge):
682
682
683 $ hg up -q bar
683 $ hg up -q bar
684 $ echo x > x
684 $ echo x > x
685 $ hg add x
685 $ hg add x
686 $ hg ci -m x
686 $ hg ci -m x
687 $ hg up -q default
687 $ hg up -q default
688 $ hg merge -q bar
688 $ hg merge -q bar
689 $ hg mv aa aaa
689 $ hg mv aa aaa
690 $ echo aa >> aaa
690 $ echo aa >> aaa
691 $ hg ci -m 'merge bar again'
691 $ hg ci -m 'merge bar again'
692 $ hg log --config diff.git=1 -pr .
692 $ hg log --config diff.git=1 -pr .
693 changeset: 28:32f19415b634
693 changeset: 28:32f19415b634
694 tag: tip
694 tag: tip
695 parent: 26:bdafc5c72f74
695 parent: 26:bdafc5c72f74
696 parent: 27:4c94d5bc65f5
696 parent: 27:4c94d5bc65f5
697 user: test
697 user: test
698 date: Thu Jan 01 00:00:00 1970 +0000
698 date: Thu Jan 01 00:00:00 1970 +0000
699 summary: merge bar again
699 summary: merge bar again
700
700
701 diff --git a/aa b/aa
701 diff --git a/aa b/aa
702 deleted file mode 100644
702 deleted file mode 100644
703 --- a/aa
703 --- a/aa
704 +++ /dev/null
704 +++ /dev/null
705 @@ -1,2 +0,0 @@
705 @@ -1,2 +0,0 @@
706 -a
706 -a
707 -a
707 -a
708 diff --git a/aaa b/aaa
708 diff --git a/aaa b/aaa
709 new file mode 100644
709 new file mode 100644
710 --- /dev/null
710 --- /dev/null
711 +++ b/aaa
711 +++ b/aaa
712 @@ -0,0 +1,3 @@
712 @@ -0,0 +1,3 @@
713 +a
713 +a
714 +a
714 +a
715 +aa
715 +aa
716 diff --git a/x b/x
716 diff --git a/x b/x
717 new file mode 100644
717 new file mode 100644
718 --- /dev/null
718 --- /dev/null
719 +++ b/x
719 +++ b/x
720 @@ -0,0 +1,1 @@
720 @@ -0,0 +1,1 @@
721 +x
721 +x
722
722
723 $ hg debugrename aaa
723 $ hg debugrename aaa
724 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
724 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
725 $ hg mv aaa aa
725 $ hg mv aaa aa
726 $ hg ci --amend -m 'merge bar again (undo rename)'
726 $ hg ci --amend -m 'merge bar again (undo rename)'
727 $ hg log --config diff.git=1 -pr .
727 $ hg log --config diff.git=1 -pr .
728 changeset: 30:1e2a06b3d312
728 changeset: 30:1e2a06b3d312
729 tag: tip
729 tag: tip
730 parent: 26:bdafc5c72f74
730 parent: 26:bdafc5c72f74
731 parent: 27:4c94d5bc65f5
731 parent: 27:4c94d5bc65f5
732 user: test
732 user: test
733 date: Thu Jan 01 00:00:00 1970 +0000
733 date: Thu Jan 01 00:00:00 1970 +0000
734 summary: merge bar again (undo rename)
734 summary: merge bar again (undo rename)
735
735
736 diff --git a/aa b/aa
736 diff --git a/aa b/aa
737 --- a/aa
737 --- a/aa
738 +++ b/aa
738 +++ b/aa
739 @@ -1,2 +1,3 @@
739 @@ -1,2 +1,3 @@
740 a
740 a
741 a
741 a
742 +aa
742 +aa
743 diff --git a/x b/x
743 diff --git a/x b/x
744 new file mode 100644
744 new file mode 100644
745 --- /dev/null
745 --- /dev/null
746 +++ b/x
746 +++ b/x
747 @@ -0,0 +1,1 @@
747 @@ -0,0 +1,1 @@
748 +x
748 +x
749
749
750 $ hg debugrename aa
750 $ hg debugrename aa
751 aa not renamed
751 aa not renamed
752 $ hg debugrename -r '.^' aa
752 $ hg debugrename -r '.^' aa
753 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
753 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
754
754
755 Amend a merge changeset (with manifest-level conflicts):
755 Amend a merge changeset (with manifest-level conflicts):
756
756
757 $ hg up -q bar
757 $ hg up -q bar
758 $ hg rm aa
758 $ hg rm aa
759 $ hg ci -m 'rm aa'
759 $ hg ci -m 'rm aa'
760 $ hg up -q default
760 $ hg up -q default
761 $ echo aa >> aa
761 $ echo aa >> aa
762 $ hg ci -m aa
762 $ hg ci -m aa
763 $ hg merge -q bar
763 $ hg merge -q bar
764 local changed aa which remote deleted
764 local changed aa which remote deleted
765 use (c)hanged version or (d)elete? c
765 use (c)hanged version or (d)elete? c
766 $ hg ci -m 'merge bar (with conflicts)'
766 $ hg ci -m 'merge bar (with conflicts)'
767 $ hg log --config diff.git=1 -pr .
767 $ hg log --config diff.git=1 -pr .
768 changeset: 33:97a298b0c59f
768 changeset: 33:97a298b0c59f
769 tag: tip
769 tag: tip
770 parent: 32:3d78ce4226b8
770 parent: 32:3d78ce4226b8
771 parent: 31:67db8847a540
771 parent: 31:67db8847a540
772 user: test
772 user: test
773 date: Thu Jan 01 00:00:00 1970 +0000
773 date: Thu Jan 01 00:00:00 1970 +0000
774 summary: merge bar (with conflicts)
774 summary: merge bar (with conflicts)
775
775
776
776
777 $ hg rm aa
777 $ hg rm aa
778 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
778 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
779 $ hg log --config diff.git=1 -pr .
779 $ hg log --config diff.git=1 -pr .
780 changeset: 35:6de0c1bde1c8
780 changeset: 35:6de0c1bde1c8
781 tag: tip
781 tag: tip
782 parent: 32:3d78ce4226b8
782 parent: 32:3d78ce4226b8
783 parent: 31:67db8847a540
783 parent: 31:67db8847a540
784 user: test
784 user: test
785 date: Thu Jan 01 00:00:00 1970 +0000
785 date: Thu Jan 01 00:00:00 1970 +0000
786 summary: merge bar (with conflicts, amended)
786 summary: merge bar (with conflicts, amended)
787
787
788 diff --git a/aa b/aa
788 diff --git a/aa b/aa
789 deleted file mode 100644
789 deleted file mode 100644
790 --- a/aa
790 --- a/aa
791 +++ /dev/null
791 +++ /dev/null
792 @@ -1,4 +0,0 @@
792 @@ -1,4 +0,0 @@
793 -a
793 -a
794 -a
794 -a
795 -aa
795 -aa
796 -aa
796 -aa
797
797
798 Issue 3445: amending with --close-branch a commit that created a new head should fail
798 Issue 3445: amending with --close-branch a commit that created a new head should fail
799 This shouldn't be possible:
799 This shouldn't be possible:
800
800
801 $ hg up -q default
801 $ hg up -q default
802 $ hg branch closewithamend
802 $ hg branch closewithamend
803 marked working directory as branch closewithamend
803 marked working directory as branch closewithamend
804 (branches are permanent and global, did you want a bookmark?)
804 (branches are permanent and global, did you want a bookmark?)
805 $ hg add obs.py
805 $ hg add obs.py
806 $ hg ci -m..
806 $ hg ci -m..
807 $ hg ci --amend --close-branch -m 'closing'
807 $ hg ci --amend --close-branch -m 'closing'
808 abort: can only close branch heads
808 abort: can only close branch heads
809 [255]
809 [255]
810
810
811 This silliness fails:
811 This silliness fails:
812
812
813 $ hg branch silliness
813 $ hg branch silliness
814 marked working directory as branch silliness
814 marked working directory as branch silliness
815 (branches are permanent and global, did you want a bookmark?)
815 (branches are permanent and global, did you want a bookmark?)
816 $ echo b >> b
816 $ echo b >> b
817 $ hg ci --close-branch -m'open and close'
817 $ hg ci --close-branch -m'open and close'
818 abort: can only close branch heads
818 abort: can only close branch heads
819 [255]
819 [255]
820
820
821 Test that amend with --secret creates new secret changeset forcibly
821 Test that amend with --secret creates new secret changeset forcibly
822 ---------------------------------------------------------------------
822 ---------------------------------------------------------------------
823
823
824 $ hg phase '.^::.'
824 $ hg phase '.^::.'
825 35: draft
825 35: draft
826 36: draft
826 36: draft
827 $ hg commit --amend --secret -m 'amend as secret' -q
827 $ hg commit --amend --secret -m 'amend as secret' -q
828 $ hg phase '.^::.'
828 $ hg phase '.^::.'
829 35: draft
829 35: draft
830 38: secret
830 38: secret
831
831
832 Test that amend with --edit invokes editor forcibly
832 Test that amend with --edit invokes editor forcibly
833 ---------------------------------------------------
833 ---------------------------------------------------
834
834
835 $ hg parents --template "{desc}\n"
835 $ hg parents --template "{desc}\n"
836 amend as secret
836 amend as secret
837 $ HGEDITOR=cat hg commit --amend -m "editor should be suppressed"
837 $ HGEDITOR=cat hg commit --amend -m "editor should be suppressed"
838 $ hg parents --template "{desc}\n"
838 $ hg parents --template "{desc}\n"
839 editor should be suppressed
839 editor should be suppressed
840
840
841 $ HGEDITOR=cat hg commit --amend -m "editor should be invoked" --edit
841 $ HGEDITOR=cat hg commit --amend -m "editor should be invoked" --edit
842 editor should be invoked
842 editor should be invoked
843
843
844
844
845 HG: Enter commit message. Lines beginning with 'HG:' are removed.
845 HG: Enter commit message. Lines beginning with 'HG:' are removed.
846 HG: Leave message empty to abort commit.
846 HG: Leave message empty to abort commit.
847 HG: --
847 HG: --
848 HG: user: test
848 HG: user: test
849 HG: branch 'silliness'
849 HG: branch 'silliness'
850 HG: changed obs.py
850 HG: changed obs.py
851 $ hg parents --template "{desc}\n"
851 $ hg parents --template "{desc}\n"
852 editor should be invoked
852 editor should be invoked
@@ -1,47 +1,47 b''
1 $ addcommit () {
1 $ addcommit () {
2 > echo $1 > $1
2 > echo $1 > $1
3 > hg add $1
3 > hg add $1
4 > hg commit -d "${2} 0" -m $1
4 > hg commit -d "${2} 0" -m $1
5 > }
5 > }
6
6
7 $ commit () {
7 $ commit () {
8 > hg commit -d "${2} 0" -m $1
8 > hg commit -d "${2} 0" -m $1
9 > }
9 > }
10
10
11 $ hg init a
11 $ hg init a
12 $ cd a
12 $ cd a
13 $ addcommit "A" 0
13 $ addcommit "A" 0
14 $ addcommit "B" 1
14 $ addcommit "B" 1
15 $ echo "C" >> A
15 $ echo "C" >> A
16 $ commit "C" 2
16 $ commit "C" 2
17
17
18 $ hg update -C 0
18 $ hg update -C 0
19 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
19 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
20 $ echo "D" >> A
20 $ echo "D" >> A
21 $ commit "D" 3
21 $ commit "D" 3
22 created new head
22 created new head
23
23
24 Merging a conflict araises
24 Merging a conflict araises
25
25
26 $ hg merge
26 $ hg merge
27 merging A
27 merging A
28 warning: conflicts during merge.
28 warning: conflicts during merge.
29 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
29 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
30 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
30 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
31 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
31 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
32 [1]
32 [1]
33
33
34 Correct the conflict without marking the file as resolved
34 Correct the conflict without marking the file as resolved
35
35
36 $ echo "ABCD" > A
36 $ echo "ABCD" > A
37 $ hg commit -m "Merged"
37 $ hg commit -m "Merged"
38 abort: unresolved merge conflicts (see hg help resolve)
38 abort: unresolved merge conflicts (see hg help resolve)
39 [255]
39 [255]
40
40
41 Mark the conflict as resolved and commit
41 Mark the conflict as resolved and commit
42
42
43 $ hg resolve -m A
43 $ hg resolve -m A
44 no more unresolved files
44 (no more unresolved files)
45 $ hg commit -m "Merged"
45 $ hg commit -m "Merged"
46
46
47 $ cd ..
47 $ cd ..
@@ -1,432 +1,432 b''
1 $ "$TESTDIR/hghave" svn13 || exit 80
1 $ "$TESTDIR/hghave" svn13 || exit 80
2
2
3 $ svnupanddisplay()
3 $ svnupanddisplay()
4 > {
4 > {
5 > (
5 > (
6 > cd $1;
6 > cd $1;
7 > svn up -q;
7 > svn up -q;
8 > svn st -v | sed 's/ */ /g' | sort
8 > svn st -v | sed 's/ */ /g' | sort
9 > limit=''
9 > limit=''
10 > if [ $2 -gt 0 ]; then
10 > if [ $2 -gt 0 ]; then
11 > limit="--limit=$2"
11 > limit="--limit=$2"
12 > fi
12 > fi
13 > svn log --xml -v $limit | python "$TESTDIR/svnxml.py"
13 > svn log --xml -v $limit | python "$TESTDIR/svnxml.py"
14 > )
14 > )
15 > }
15 > }
16
16
17 $ cat >> $HGRCPATH <<EOF
17 $ cat >> $HGRCPATH <<EOF
18 > [extensions]
18 > [extensions]
19 > convert =
19 > convert =
20 > EOF
20 > EOF
21
21
22 $ hg init a
22 $ hg init a
23
23
24 Add
24 Add
25
25
26 $ echo a > a/a
26 $ echo a > a/a
27 $ mkdir -p a/d1/d2
27 $ mkdir -p a/d1/d2
28 $ echo b > a/d1/d2/b
28 $ echo b > a/d1/d2/b
29 $ hg --cwd a ci -d '0 0' -A -m 'add a file'
29 $ hg --cwd a ci -d '0 0' -A -m 'add a file'
30 adding a
30 adding a
31 adding d1/d2/b
31 adding d1/d2/b
32
32
33 Modify
33 Modify
34
34
35 $ "$TESTDIR/svn-safe-append.py" a a/a
35 $ "$TESTDIR/svn-safe-append.py" a a/a
36 $ hg --cwd a ci -d '1 0' -m 'modify a file'
36 $ hg --cwd a ci -d '1 0' -m 'modify a file'
37 $ hg --cwd a tip -q
37 $ hg --cwd a tip -q
38 1:e0e2b8a9156b
38 1:e0e2b8a9156b
39
39
40 $ hg convert -d svn a
40 $ hg convert -d svn a
41 assuming destination a-hg
41 assuming destination a-hg
42 initializing svn repository 'a-hg'
42 initializing svn repository 'a-hg'
43 initializing svn working copy 'a-hg-wc'
43 initializing svn working copy 'a-hg-wc'
44 scanning source...
44 scanning source...
45 sorting...
45 sorting...
46 converting...
46 converting...
47 1 add a file
47 1 add a file
48 0 modify a file
48 0 modify a file
49 $ svnupanddisplay a-hg-wc 2
49 $ svnupanddisplay a-hg-wc 2
50 2 1 test d1
50 2 1 test d1
51 2 1 test d1/d2 (glob)
51 2 1 test d1/d2 (glob)
52 2 1 test d1/d2/b (glob)
52 2 1 test d1/d2/b (glob)
53 2 2 test .
53 2 2 test .
54 2 2 test a
54 2 2 test a
55 revision: 2
55 revision: 2
56 author: test
56 author: test
57 msg: modify a file
57 msg: modify a file
58 M /a
58 M /a
59 revision: 1
59 revision: 1
60 author: test
60 author: test
61 msg: add a file
61 msg: add a file
62 A /a
62 A /a
63 A /d1
63 A /d1
64 A /d1/d2
64 A /d1/d2
65 A /d1/d2/b
65 A /d1/d2/b
66 $ ls a a-hg-wc
66 $ ls a a-hg-wc
67 a:
67 a:
68 a
68 a
69 d1
69 d1
70
70
71 a-hg-wc:
71 a-hg-wc:
72 a
72 a
73 d1
73 d1
74 $ cmp a/a a-hg-wc/a
74 $ cmp a/a a-hg-wc/a
75
75
76 Rename
76 Rename
77
77
78 $ hg --cwd a mv a b
78 $ hg --cwd a mv a b
79 $ hg --cwd a ci -d '2 0' -m 'rename a file'
79 $ hg --cwd a ci -d '2 0' -m 'rename a file'
80 $ hg --cwd a tip -q
80 $ hg --cwd a tip -q
81 2:eb5169441d43
81 2:eb5169441d43
82
82
83 $ hg convert -d svn a
83 $ hg convert -d svn a
84 assuming destination a-hg
84 assuming destination a-hg
85 initializing svn working copy 'a-hg-wc'
85 initializing svn working copy 'a-hg-wc'
86 scanning source...
86 scanning source...
87 sorting...
87 sorting...
88 converting...
88 converting...
89 0 rename a file
89 0 rename a file
90 $ svnupanddisplay a-hg-wc 1
90 $ svnupanddisplay a-hg-wc 1
91 3 1 test d1
91 3 1 test d1
92 3 1 test d1/d2 (glob)
92 3 1 test d1/d2 (glob)
93 3 1 test d1/d2/b (glob)
93 3 1 test d1/d2/b (glob)
94 3 3 test .
94 3 3 test .
95 3 3 test b
95 3 3 test b
96 revision: 3
96 revision: 3
97 author: test
97 author: test
98 msg: rename a file
98 msg: rename a file
99 D /a
99 D /a
100 A /b (from /a@2)
100 A /b (from /a@2)
101 $ ls a a-hg-wc
101 $ ls a a-hg-wc
102 a:
102 a:
103 b
103 b
104 d1
104 d1
105
105
106 a-hg-wc:
106 a-hg-wc:
107 b
107 b
108 d1
108 d1
109
109
110 Copy
110 Copy
111
111
112 $ hg --cwd a cp b c
112 $ hg --cwd a cp b c
113
113
114 $ hg --cwd a ci -d '3 0' -m 'copy a file'
114 $ hg --cwd a ci -d '3 0' -m 'copy a file'
115 $ hg --cwd a tip -q
115 $ hg --cwd a tip -q
116 3:60effef6ab48
116 3:60effef6ab48
117
117
118 $ hg convert -d svn a
118 $ hg convert -d svn a
119 assuming destination a-hg
119 assuming destination a-hg
120 initializing svn working copy 'a-hg-wc'
120 initializing svn working copy 'a-hg-wc'
121 scanning source...
121 scanning source...
122 sorting...
122 sorting...
123 converting...
123 converting...
124 0 copy a file
124 0 copy a file
125 $ svnupanddisplay a-hg-wc 1
125 $ svnupanddisplay a-hg-wc 1
126 4 1 test d1
126 4 1 test d1
127 4 1 test d1/d2 (glob)
127 4 1 test d1/d2 (glob)
128 4 1 test d1/d2/b (glob)
128 4 1 test d1/d2/b (glob)
129 4 3 test b
129 4 3 test b
130 4 4 test .
130 4 4 test .
131 4 4 test c
131 4 4 test c
132 revision: 4
132 revision: 4
133 author: test
133 author: test
134 msg: copy a file
134 msg: copy a file
135 A /c (from /b@3)
135 A /c (from /b@3)
136 $ ls a a-hg-wc
136 $ ls a a-hg-wc
137 a:
137 a:
138 b
138 b
139 c
139 c
140 d1
140 d1
141
141
142 a-hg-wc:
142 a-hg-wc:
143 b
143 b
144 c
144 c
145 d1
145 d1
146
146
147 $ hg --cwd a rm b
147 $ hg --cwd a rm b
148
148
149 Remove
149 Remove
150
150
151 $ hg --cwd a ci -d '4 0' -m 'remove a file'
151 $ hg --cwd a ci -d '4 0' -m 'remove a file'
152 $ hg --cwd a tip -q
152 $ hg --cwd a tip -q
153 4:87bbe3013fb6
153 4:87bbe3013fb6
154
154
155 $ hg convert -d svn a
155 $ hg convert -d svn a
156 assuming destination a-hg
156 assuming destination a-hg
157 initializing svn working copy 'a-hg-wc'
157 initializing svn working copy 'a-hg-wc'
158 scanning source...
158 scanning source...
159 sorting...
159 sorting...
160 converting...
160 converting...
161 0 remove a file
161 0 remove a file
162 $ svnupanddisplay a-hg-wc 1
162 $ svnupanddisplay a-hg-wc 1
163 5 1 test d1
163 5 1 test d1
164 5 1 test d1/d2 (glob)
164 5 1 test d1/d2 (glob)
165 5 1 test d1/d2/b (glob)
165 5 1 test d1/d2/b (glob)
166 5 4 test c
166 5 4 test c
167 5 5 test .
167 5 5 test .
168 revision: 5
168 revision: 5
169 author: test
169 author: test
170 msg: remove a file
170 msg: remove a file
171 D /b
171 D /b
172 $ ls a a-hg-wc
172 $ ls a a-hg-wc
173 a:
173 a:
174 c
174 c
175 d1
175 d1
176
176
177 a-hg-wc:
177 a-hg-wc:
178 c
178 c
179 d1
179 d1
180
180
181 Executable
181 Executable
182
182
183 #if execbit
183 #if execbit
184 $ chmod +x a/c
184 $ chmod +x a/c
185 #else
185 #else
186 $ echo fake >> a/c
186 $ echo fake >> a/c
187 #endif
187 #endif
188 $ hg --cwd a ci -d '5 0' -m 'make a file executable'
188 $ hg --cwd a ci -d '5 0' -m 'make a file executable'
189 #if execbit
189 #if execbit
190 $ hg --cwd a tip -q
190 $ hg --cwd a tip -q
191 5:ff42e473c340
191 5:ff42e473c340
192 #else
192 #else
193 $ hg --cwd a tip -q
193 $ hg --cwd a tip -q
194 5:817a700c8cf1
194 5:817a700c8cf1
195 #endif
195 #endif
196
196
197 $ hg convert -d svn a
197 $ hg convert -d svn a
198 assuming destination a-hg
198 assuming destination a-hg
199 initializing svn working copy 'a-hg-wc'
199 initializing svn working copy 'a-hg-wc'
200 scanning source...
200 scanning source...
201 sorting...
201 sorting...
202 converting...
202 converting...
203 0 make a file executable
203 0 make a file executable
204 $ svnupanddisplay a-hg-wc 1
204 $ svnupanddisplay a-hg-wc 1
205 6 1 test d1
205 6 1 test d1
206 6 1 test d1/d2 (glob)
206 6 1 test d1/d2 (glob)
207 6 1 test d1/d2/b (glob)
207 6 1 test d1/d2/b (glob)
208 6 6 test .
208 6 6 test .
209 6 6 test c
209 6 6 test c
210 revision: 6
210 revision: 6
211 author: test
211 author: test
212 msg: make a file executable
212 msg: make a file executable
213 M /c
213 M /c
214 #if execbit
214 #if execbit
215 $ test -x a-hg-wc/c
215 $ test -x a-hg-wc/c
216 #endif
216 #endif
217
217
218 #if symlink
218 #if symlink
219
219
220 Symlinks
220 Symlinks
221
221
222 $ ln -s a/missing a/link
222 $ ln -s a/missing a/link
223 $ hg --cwd a commit -Am 'add symlink'
223 $ hg --cwd a commit -Am 'add symlink'
224 adding link
224 adding link
225 $ hg --cwd a mv link newlink
225 $ hg --cwd a mv link newlink
226 $ hg --cwd a commit -m 'move symlink'
226 $ hg --cwd a commit -m 'move symlink'
227 $ hg convert -d svn a
227 $ hg convert -d svn a
228 assuming destination a-hg
228 assuming destination a-hg
229 initializing svn working copy 'a-hg-wc'
229 initializing svn working copy 'a-hg-wc'
230 scanning source...
230 scanning source...
231 sorting...
231 sorting...
232 converting...
232 converting...
233 1 add symlink
233 1 add symlink
234 0 move symlink
234 0 move symlink
235 $ svnupanddisplay a-hg-wc 1
235 $ svnupanddisplay a-hg-wc 1
236 8 1 test d1
236 8 1 test d1
237 8 1 test d1/d2
237 8 1 test d1/d2
238 8 1 test d1/d2/b
238 8 1 test d1/d2/b
239 8 6 test c
239 8 6 test c
240 8 8 test .
240 8 8 test .
241 8 8 test newlink
241 8 8 test newlink
242 revision: 8
242 revision: 8
243 author: test
243 author: test
244 msg: move symlink
244 msg: move symlink
245 D /link
245 D /link
246 A /newlink (from /link@7)
246 A /newlink (from /link@7)
247
247
248 #endif
248 #endif
249
249
250 $ rm -rf a a-hg a-hg-wc
250 $ rm -rf a a-hg a-hg-wc
251
251
252
252
253 Executable in new directory
253 Executable in new directory
254
254
255 $ hg init a
255 $ hg init a
256
256
257 $ mkdir a/d1
257 $ mkdir a/d1
258 $ echo a > a/d1/a
258 $ echo a > a/d1/a
259 #if execbit
259 #if execbit
260 $ chmod +x a/d1/a
260 $ chmod +x a/d1/a
261 #else
261 #else
262 $ echo fake >> a/d1/a
262 $ echo fake >> a/d1/a
263 #endif
263 #endif
264 $ hg --cwd a ci -d '0 0' -A -m 'add executable file in new directory'
264 $ hg --cwd a ci -d '0 0' -A -m 'add executable file in new directory'
265 adding d1/a
265 adding d1/a
266
266
267 $ hg convert -d svn a
267 $ hg convert -d svn a
268 assuming destination a-hg
268 assuming destination a-hg
269 initializing svn repository 'a-hg'
269 initializing svn repository 'a-hg'
270 initializing svn working copy 'a-hg-wc'
270 initializing svn working copy 'a-hg-wc'
271 scanning source...
271 scanning source...
272 sorting...
272 sorting...
273 converting...
273 converting...
274 0 add executable file in new directory
274 0 add executable file in new directory
275 $ svnupanddisplay a-hg-wc 1
275 $ svnupanddisplay a-hg-wc 1
276 1 1 test .
276 1 1 test .
277 1 1 test d1
277 1 1 test d1
278 1 1 test d1/a (glob)
278 1 1 test d1/a (glob)
279 revision: 1
279 revision: 1
280 author: test
280 author: test
281 msg: add executable file in new directory
281 msg: add executable file in new directory
282 A /d1
282 A /d1
283 A /d1/a
283 A /d1/a
284 #if execbit
284 #if execbit
285 $ test -x a-hg-wc/d1/a
285 $ test -x a-hg-wc/d1/a
286 #endif
286 #endif
287
287
288 Copy to new directory
288 Copy to new directory
289
289
290 $ mkdir a/d2
290 $ mkdir a/d2
291 $ hg --cwd a cp d1/a d2/a
291 $ hg --cwd a cp d1/a d2/a
292 $ hg --cwd a ci -d '1 0' -A -m 'copy file to new directory'
292 $ hg --cwd a ci -d '1 0' -A -m 'copy file to new directory'
293
293
294 $ hg convert -d svn a
294 $ hg convert -d svn a
295 assuming destination a-hg
295 assuming destination a-hg
296 initializing svn working copy 'a-hg-wc'
296 initializing svn working copy 'a-hg-wc'
297 scanning source...
297 scanning source...
298 sorting...
298 sorting...
299 converting...
299 converting...
300 0 copy file to new directory
300 0 copy file to new directory
301 $ svnupanddisplay a-hg-wc 1
301 $ svnupanddisplay a-hg-wc 1
302 2 1 test d1
302 2 1 test d1
303 2 1 test d1/a (glob)
303 2 1 test d1/a (glob)
304 2 2 test .
304 2 2 test .
305 2 2 test d2
305 2 2 test d2
306 2 2 test d2/a (glob)
306 2 2 test d2/a (glob)
307 revision: 2
307 revision: 2
308 author: test
308 author: test
309 msg: copy file to new directory
309 msg: copy file to new directory
310 A /d2
310 A /d2
311 A /d2/a (from /d1/a@1)
311 A /d2/a (from /d1/a@1)
312
312
313 Branchy history
313 Branchy history
314
314
315 $ hg init b
315 $ hg init b
316 $ echo base > b/b
316 $ echo base > b/b
317 $ hg --cwd b ci -d '0 0' -Ambase
317 $ hg --cwd b ci -d '0 0' -Ambase
318 adding b
318 adding b
319
319
320 $ "$TESTDIR/svn-safe-append.py" left-1 b/b
320 $ "$TESTDIR/svn-safe-append.py" left-1 b/b
321 $ echo left-1 > b/left-1
321 $ echo left-1 > b/left-1
322 $ hg --cwd b ci -d '1 0' -Amleft-1
322 $ hg --cwd b ci -d '1 0' -Amleft-1
323 adding left-1
323 adding left-1
324
324
325 $ "$TESTDIR/svn-safe-append.py" left-2 b/b
325 $ "$TESTDIR/svn-safe-append.py" left-2 b/b
326 $ echo left-2 > b/left-2
326 $ echo left-2 > b/left-2
327 $ hg --cwd b ci -d '2 0' -Amleft-2
327 $ hg --cwd b ci -d '2 0' -Amleft-2
328 adding left-2
328 adding left-2
329
329
330 $ hg --cwd b up 0
330 $ hg --cwd b up 0
331 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
331 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
332
332
333 $ "$TESTDIR/svn-safe-append.py" right-1 b/b
333 $ "$TESTDIR/svn-safe-append.py" right-1 b/b
334 $ echo right-1 > b/right-1
334 $ echo right-1 > b/right-1
335 $ hg --cwd b ci -d '3 0' -Amright-1
335 $ hg --cwd b ci -d '3 0' -Amright-1
336 adding right-1
336 adding right-1
337 created new head
337 created new head
338
338
339 $ "$TESTDIR/svn-safe-append.py" right-2 b/b
339 $ "$TESTDIR/svn-safe-append.py" right-2 b/b
340 $ echo right-2 > b/right-2
340 $ echo right-2 > b/right-2
341 $ hg --cwd b ci -d '4 0' -Amright-2
341 $ hg --cwd b ci -d '4 0' -Amright-2
342 adding right-2
342 adding right-2
343
343
344 $ hg --cwd b up -C 2
344 $ hg --cwd b up -C 2
345 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
345 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
346 $ hg --cwd b merge
346 $ hg --cwd b merge
347 merging b
347 merging b
348 warning: conflicts during merge.
348 warning: conflicts during merge.
349 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
349 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
350 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
350 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
351 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
351 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
352 [1]
352 [1]
353 $ hg --cwd b revert -r 2 b
353 $ hg --cwd b revert -r 2 b
354 $ hg --cwd b resolve -m b
354 $ hg --cwd b resolve -m b
355 no more unresolved files
355 (no more unresolved files)
356 $ hg --cwd b ci -d '5 0' -m 'merge'
356 $ hg --cwd b ci -d '5 0' -m 'merge'
357
357
358 Expect 4 changes
358 Expect 4 changes
359
359
360 $ hg convert -d svn b
360 $ hg convert -d svn b
361 assuming destination b-hg
361 assuming destination b-hg
362 initializing svn repository 'b-hg'
362 initializing svn repository 'b-hg'
363 initializing svn working copy 'b-hg-wc'
363 initializing svn working copy 'b-hg-wc'
364 scanning source...
364 scanning source...
365 sorting...
365 sorting...
366 converting...
366 converting...
367 5 base
367 5 base
368 4 left-1
368 4 left-1
369 3 left-2
369 3 left-2
370 2 right-1
370 2 right-1
371 1 right-2
371 1 right-2
372 0 merge
372 0 merge
373
373
374 $ svnupanddisplay b-hg-wc 0
374 $ svnupanddisplay b-hg-wc 0
375 4 2 test left-1
375 4 2 test left-1
376 4 3 test b
376 4 3 test b
377 4 3 test left-2
377 4 3 test left-2
378 4 4 test .
378 4 4 test .
379 4 4 test right-1
379 4 4 test right-1
380 4 4 test right-2
380 4 4 test right-2
381 revision: 4
381 revision: 4
382 author: test
382 author: test
383 msg: merge
383 msg: merge
384 A /right-1
384 A /right-1
385 A /right-2
385 A /right-2
386 revision: 3
386 revision: 3
387 author: test
387 author: test
388 msg: left-2
388 msg: left-2
389 M /b
389 M /b
390 A /left-2
390 A /left-2
391 revision: 2
391 revision: 2
392 author: test
392 author: test
393 msg: left-1
393 msg: left-1
394 M /b
394 M /b
395 A /left-1
395 A /left-1
396 revision: 1
396 revision: 1
397 author: test
397 author: test
398 msg: base
398 msg: base
399 A /b
399 A /b
400
400
401 Tags are not supported, but must not break conversion
401 Tags are not supported, but must not break conversion
402
402
403 $ rm -rf a a-hg a-hg-wc
403 $ rm -rf a a-hg a-hg-wc
404 $ hg init a
404 $ hg init a
405 $ echo a > a/a
405 $ echo a > a/a
406 $ hg --cwd a ci -d '0 0' -A -m 'Add file a'
406 $ hg --cwd a ci -d '0 0' -A -m 'Add file a'
407 adding a
407 adding a
408 $ hg --cwd a tag -d '1 0' -m 'Tagged as v1.0' v1.0
408 $ hg --cwd a tag -d '1 0' -m 'Tagged as v1.0' v1.0
409
409
410 $ hg convert -d svn a
410 $ hg convert -d svn a
411 assuming destination a-hg
411 assuming destination a-hg
412 initializing svn repository 'a-hg'
412 initializing svn repository 'a-hg'
413 initializing svn working copy 'a-hg-wc'
413 initializing svn working copy 'a-hg-wc'
414 scanning source...
414 scanning source...
415 sorting...
415 sorting...
416 converting...
416 converting...
417 1 Add file a
417 1 Add file a
418 0 Tagged as v1.0
418 0 Tagged as v1.0
419 writing Subversion tags is not yet implemented
419 writing Subversion tags is not yet implemented
420 $ svnupanddisplay a-hg-wc 2
420 $ svnupanddisplay a-hg-wc 2
421 2 1 test a
421 2 1 test a
422 2 2 test .
422 2 2 test .
423 2 2 test .hgtags
423 2 2 test .hgtags
424 revision: 2
424 revision: 2
425 author: test
425 author: test
426 msg: Tagged as v1.0
426 msg: Tagged as v1.0
427 A /.hgtags
427 A /.hgtags
428 revision: 1
428 revision: 1
429 author: test
429 author: test
430 msg: Add file a
430 msg: Add file a
431 A /a
431 A /a
432 $ rm -rf a a-hg a-hg-wc
432 $ rm -rf a a-hg a-hg-wc
@@ -1,248 +1,248 b''
1 $ fileset() {
1 $ fileset() {
2 > hg debugfileset "$@"
2 > hg debugfileset "$@"
3 > }
3 > }
4
4
5 $ hg init repo
5 $ hg init repo
6 $ cd repo
6 $ cd repo
7 $ echo a > a1
7 $ echo a > a1
8 $ echo a > a2
8 $ echo a > a2
9 $ echo b > b1
9 $ echo b > b1
10 $ echo b > b2
10 $ echo b > b2
11 $ hg ci -Am addfiles
11 $ hg ci -Am addfiles
12 adding a1
12 adding a1
13 adding a2
13 adding a2
14 adding b1
14 adding b1
15 adding b2
15 adding b2
16
16
17 Test operators and basic patterns
17 Test operators and basic patterns
18
18
19 $ fileset a1
19 $ fileset a1
20 a1
20 a1
21 $ fileset 'a*'
21 $ fileset 'a*'
22 a1
22 a1
23 a2
23 a2
24 $ fileset '"re:a\d"'
24 $ fileset '"re:a\d"'
25 a1
25 a1
26 a2
26 a2
27 $ fileset 'a1 or a2'
27 $ fileset 'a1 or a2'
28 a1
28 a1
29 a2
29 a2
30 $ fileset 'a1 | a2'
30 $ fileset 'a1 | a2'
31 a1
31 a1
32 a2
32 a2
33 $ fileset 'a* and "*1"'
33 $ fileset 'a* and "*1"'
34 a1
34 a1
35 $ fileset 'a* & "*1"'
35 $ fileset 'a* & "*1"'
36 a1
36 a1
37 $ fileset 'not (r"a*")'
37 $ fileset 'not (r"a*")'
38 b1
38 b1
39 b2
39 b2
40 $ fileset '! ("a*")'
40 $ fileset '! ("a*")'
41 b1
41 b1
42 b2
42 b2
43 $ fileset 'a* - a1'
43 $ fileset 'a* - a1'
44 a2
44 a2
45 $ fileset 'a_b'
45 $ fileset 'a_b'
46
46
47 Test files status
47 Test files status
48
48
49 $ rm a1
49 $ rm a1
50 $ hg rm a2
50 $ hg rm a2
51 $ echo b >> b2
51 $ echo b >> b2
52 $ hg cp b1 c1
52 $ hg cp b1 c1
53 $ echo c > c2
53 $ echo c > c2
54 $ echo c > c3
54 $ echo c > c3
55 $ cat > .hgignore <<EOF
55 $ cat > .hgignore <<EOF
56 > \.hgignore
56 > \.hgignore
57 > 2$
57 > 2$
58 > EOF
58 > EOF
59 $ fileset 'modified()'
59 $ fileset 'modified()'
60 b2
60 b2
61 $ fileset 'added()'
61 $ fileset 'added()'
62 c1
62 c1
63 $ fileset 'removed()'
63 $ fileset 'removed()'
64 a2
64 a2
65 $ fileset 'deleted()'
65 $ fileset 'deleted()'
66 a1
66 a1
67 $ fileset 'unknown()'
67 $ fileset 'unknown()'
68 c3
68 c3
69 $ fileset 'ignored()'
69 $ fileset 'ignored()'
70 .hgignore
70 .hgignore
71 c2
71 c2
72 $ fileset 'hgignore()'
72 $ fileset 'hgignore()'
73 a2
73 a2
74 b2
74 b2
75 $ fileset 'clean()'
75 $ fileset 'clean()'
76 b1
76 b1
77 $ fileset 'copied()'
77 $ fileset 'copied()'
78 c1
78 c1
79
79
80 Test files properties
80 Test files properties
81
81
82 >>> file('bin', 'wb').write('\0a')
82 >>> file('bin', 'wb').write('\0a')
83 $ fileset 'binary()'
83 $ fileset 'binary()'
84 $ fileset 'binary() and unknown()'
84 $ fileset 'binary() and unknown()'
85 bin
85 bin
86 $ echo '^bin$' >> .hgignore
86 $ echo '^bin$' >> .hgignore
87 $ fileset 'binary() and ignored()'
87 $ fileset 'binary() and ignored()'
88 bin
88 bin
89 $ hg add bin
89 $ hg add bin
90 $ fileset 'binary()'
90 $ fileset 'binary()'
91 bin
91 bin
92
92
93 $ fileset 'grep("b{1}")'
93 $ fileset 'grep("b{1}")'
94 b2
94 b2
95 c1
95 c1
96 b1
96 b1
97 $ fileset 'grep("missingparens(")'
97 $ fileset 'grep("missingparens(")'
98 hg: parse error: invalid match pattern: unbalanced parenthesis
98 hg: parse error: invalid match pattern: unbalanced parenthesis
99 [255]
99 [255]
100
100
101 #if execbit
101 #if execbit
102 $ chmod +x b2
102 $ chmod +x b2
103 $ fileset 'exec()'
103 $ fileset 'exec()'
104 b2
104 b2
105 #endif
105 #endif
106
106
107 #if symlink
107 #if symlink
108 $ ln -s b2 b2link
108 $ ln -s b2 b2link
109 $ fileset 'symlink() and unknown()'
109 $ fileset 'symlink() and unknown()'
110 b2link
110 b2link
111 $ hg add b2link
111 $ hg add b2link
112 #endif
112 #endif
113
113
114 >>> file('1k', 'wb').write(' '*1024)
114 >>> file('1k', 'wb').write(' '*1024)
115 >>> file('2k', 'wb').write(' '*2048)
115 >>> file('2k', 'wb').write(' '*2048)
116 $ hg add 1k 2k
116 $ hg add 1k 2k
117 $ fileset 'size("bar")'
117 $ fileset 'size("bar")'
118 hg: parse error: couldn't parse size: bar
118 hg: parse error: couldn't parse size: bar
119 [255]
119 [255]
120 $ fileset 'size(1k)'
120 $ fileset 'size(1k)'
121 1k
121 1k
122 $ fileset '(1k or 2k) and size("< 2k")'
122 $ fileset '(1k or 2k) and size("< 2k")'
123 1k
123 1k
124 $ fileset '(1k or 2k) and size("<=2k")'
124 $ fileset '(1k or 2k) and size("<=2k")'
125 1k
125 1k
126 2k
126 2k
127 $ fileset '(1k or 2k) and size("> 1k")'
127 $ fileset '(1k or 2k) and size("> 1k")'
128 2k
128 2k
129 $ fileset '(1k or 2k) and size(">=1K")'
129 $ fileset '(1k or 2k) and size(">=1K")'
130 1k
130 1k
131 2k
131 2k
132 $ fileset '(1k or 2k) and size(".5KB - 1.5kB")'
132 $ fileset '(1k or 2k) and size(".5KB - 1.5kB")'
133 1k
133 1k
134
134
135 Test merge states
135 Test merge states
136
136
137 $ hg ci -m manychanges
137 $ hg ci -m manychanges
138 $ hg up -C 0
138 $ hg up -C 0
139 * files updated, 0 files merged, * files removed, 0 files unresolved (glob)
139 * files updated, 0 files merged, * files removed, 0 files unresolved (glob)
140 $ echo c >> b2
140 $ echo c >> b2
141 $ hg ci -m diverging b2
141 $ hg ci -m diverging b2
142 created new head
142 created new head
143 $ fileset 'resolved()'
143 $ fileset 'resolved()'
144 $ fileset 'unresolved()'
144 $ fileset 'unresolved()'
145 $ hg merge
145 $ hg merge
146 merging b2
146 merging b2
147 warning: conflicts during merge.
147 warning: conflicts during merge.
148 merging b2 incomplete! (edit conflicts, then use 'hg resolve --mark')
148 merging b2 incomplete! (edit conflicts, then use 'hg resolve --mark')
149 * files updated, 0 files merged, * files removed, 1 files unresolved (glob)
149 * files updated, 0 files merged, * files removed, 1 files unresolved (glob)
150 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
150 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
151 [1]
151 [1]
152 $ fileset 'resolved()'
152 $ fileset 'resolved()'
153 $ fileset 'unresolved()'
153 $ fileset 'unresolved()'
154 b2
154 b2
155 $ echo e > b2
155 $ echo e > b2
156 $ hg resolve -m b2
156 $ hg resolve -m b2
157 no more unresolved files
157 (no more unresolved files)
158 $ fileset 'resolved()'
158 $ fileset 'resolved()'
159 b2
159 b2
160 $ fileset 'unresolved()'
160 $ fileset 'unresolved()'
161 $ hg ci -m merge
161 $ hg ci -m merge
162
162
163 Test subrepo predicate
163 Test subrepo predicate
164
164
165 $ hg init sub
165 $ hg init sub
166 $ echo a > sub/suba
166 $ echo a > sub/suba
167 $ hg -R sub add sub/suba
167 $ hg -R sub add sub/suba
168 $ hg -R sub ci -m sub
168 $ hg -R sub ci -m sub
169 $ echo 'sub = sub' > .hgsub
169 $ echo 'sub = sub' > .hgsub
170 $ fileset 'subrepo()'
170 $ fileset 'subrepo()'
171 $ hg add .hgsub
171 $ hg add .hgsub
172 $ fileset 'subrepo()'
172 $ fileset 'subrepo()'
173 sub
173 sub
174 $ fileset 'subrepo("sub")'
174 $ fileset 'subrepo("sub")'
175 sub
175 sub
176 $ fileset 'subrepo("glob:*")'
176 $ fileset 'subrepo("glob:*")'
177 sub
177 sub
178 $ hg ci -m subrepo
178 $ hg ci -m subrepo
179
179
180 Test with a revision
180 Test with a revision
181
181
182 $ hg log -G --template '{rev} {desc}\n'
182 $ hg log -G --template '{rev} {desc}\n'
183 @ 4 subrepo
183 @ 4 subrepo
184 |
184 |
185 o 3 merge
185 o 3 merge
186 |\
186 |\
187 | o 2 diverging
187 | o 2 diverging
188 | |
188 | |
189 o | 1 manychanges
189 o | 1 manychanges
190 |/
190 |/
191 o 0 addfiles
191 o 0 addfiles
192
192
193 $ echo unknown > unknown
193 $ echo unknown > unknown
194 $ fileset -r1 'modified()'
194 $ fileset -r1 'modified()'
195 b2
195 b2
196 $ fileset -r1 'added() and c1'
196 $ fileset -r1 'added() and c1'
197 c1
197 c1
198 $ fileset -r1 'removed()'
198 $ fileset -r1 'removed()'
199 a2
199 a2
200 $ fileset -r1 'deleted()'
200 $ fileset -r1 'deleted()'
201 $ fileset -r1 'unknown()'
201 $ fileset -r1 'unknown()'
202 $ fileset -r1 'ignored()'
202 $ fileset -r1 'ignored()'
203 $ fileset -r1 'hgignore()'
203 $ fileset -r1 'hgignore()'
204 b2
204 b2
205 bin
205 bin
206 $ fileset -r1 'binary()'
206 $ fileset -r1 'binary()'
207 bin
207 bin
208 $ fileset -r1 'size(1k)'
208 $ fileset -r1 'size(1k)'
209 1k
209 1k
210 $ fileset -r3 'resolved()'
210 $ fileset -r3 'resolved()'
211 $ fileset -r3 'unresolved()'
211 $ fileset -r3 'unresolved()'
212
212
213 #if execbit
213 #if execbit
214 $ fileset -r1 'exec()'
214 $ fileset -r1 'exec()'
215 b2
215 b2
216 #endif
216 #endif
217
217
218 #if symlink
218 #if symlink
219 $ fileset -r1 'symlink()'
219 $ fileset -r1 'symlink()'
220 b2link
220 b2link
221 #endif
221 #endif
222
222
223 $ fileset -r4 'subrepo("re:su.*")'
223 $ fileset -r4 'subrepo("re:su.*")'
224 sub
224 sub
225 $ fileset -r4 'subrepo("sub")'
225 $ fileset -r4 'subrepo("sub")'
226 sub
226 sub
227 $ fileset -r4 'b2 or c1'
227 $ fileset -r4 'b2 or c1'
228 b2
228 b2
229 c1
229 c1
230
230
231 >>> open('dos', 'wb').write("dos\r\n")
231 >>> open('dos', 'wb').write("dos\r\n")
232 >>> open('mixed', 'wb').write("dos\r\nunix\n")
232 >>> open('mixed', 'wb').write("dos\r\nunix\n")
233 >>> open('mac', 'wb').write("mac\r")
233 >>> open('mac', 'wb').write("mac\r")
234 $ hg add dos mixed mac
234 $ hg add dos mixed mac
235
235
236 $ fileset 'eol(dos)'
236 $ fileset 'eol(dos)'
237 dos
237 dos
238 mixed
238 mixed
239 $ fileset 'eol(unix)'
239 $ fileset 'eol(unix)'
240 .hgsub
240 .hgsub
241 .hgsubstate
241 .hgsubstate
242 a1
242 a1
243 b1
243 b1
244 b2
244 b2
245 c1
245 c1
246 mixed
246 mixed
247 $ fileset 'eol(mac)'
247 $ fileset 'eol(mac)'
248 mac
248 mac
@@ -1,633 +1,633 b''
1 Create a repo with some stuff in it:
1 Create a repo with some stuff in it:
2
2
3 $ hg init a
3 $ hg init a
4 $ cd a
4 $ cd a
5 $ echo a > a
5 $ echo a > a
6 $ echo a > d
6 $ echo a > d
7 $ echo a > e
7 $ echo a > e
8 $ hg ci -qAm0
8 $ hg ci -qAm0
9 $ echo b > a
9 $ echo b > a
10 $ hg ci -m1 -u bar
10 $ hg ci -m1 -u bar
11 $ hg mv a b
11 $ hg mv a b
12 $ hg ci -m2
12 $ hg ci -m2
13 $ hg cp b c
13 $ hg cp b c
14 $ hg ci -m3 -u baz
14 $ hg ci -m3 -u baz
15 $ echo b > d
15 $ echo b > d
16 $ echo f > e
16 $ echo f > e
17 $ hg ci -m4
17 $ hg ci -m4
18 $ hg up -q 3
18 $ hg up -q 3
19 $ echo b > e
19 $ echo b > e
20 $ hg branch -q stable
20 $ hg branch -q stable
21 $ hg ci -m5
21 $ hg ci -m5
22 $ hg merge -q default --tool internal:local
22 $ hg merge -q default --tool internal:local
23 $ hg branch -q default
23 $ hg branch -q default
24 $ hg ci -m6
24 $ hg ci -m6
25 $ hg phase --public 3
25 $ hg phase --public 3
26 $ hg phase --force --secret 6
26 $ hg phase --force --secret 6
27
27
28 $ hg log -G --template '{author}@{rev}.{phase}: {desc}\n'
28 $ hg log -G --template '{author}@{rev}.{phase}: {desc}\n'
29 @ test@6.secret: 6
29 @ test@6.secret: 6
30 |\
30 |\
31 | o test@5.draft: 5
31 | o test@5.draft: 5
32 | |
32 | |
33 o | test@4.draft: 4
33 o | test@4.draft: 4
34 |/
34 |/
35 o baz@3.public: 3
35 o baz@3.public: 3
36 |
36 |
37 o test@2.public: 2
37 o test@2.public: 2
38 |
38 |
39 o bar@1.public: 1
39 o bar@1.public: 1
40 |
40 |
41 o test@0.public: 0
41 o test@0.public: 0
42
42
43
43
44 Need to specify a rev:
44 Need to specify a rev:
45
45
46 $ hg graft
46 $ hg graft
47 abort: no revisions specified
47 abort: no revisions specified
48 [255]
48 [255]
49
49
50 Can't graft ancestor:
50 Can't graft ancestor:
51
51
52 $ hg graft 1 2
52 $ hg graft 1 2
53 skipping ancestor revision 1
53 skipping ancestor revision 1
54 skipping ancestor revision 2
54 skipping ancestor revision 2
55 [255]
55 [255]
56
56
57 Specify revisions with -r:
57 Specify revisions with -r:
58
58
59 $ hg graft -r 1 -r 2
59 $ hg graft -r 1 -r 2
60 skipping ancestor revision 1
60 skipping ancestor revision 1
61 skipping ancestor revision 2
61 skipping ancestor revision 2
62 [255]
62 [255]
63
63
64 $ hg graft -r 1 2
64 $ hg graft -r 1 2
65 skipping ancestor revision 2
65 skipping ancestor revision 2
66 skipping ancestor revision 1
66 skipping ancestor revision 1
67 [255]
67 [255]
68
68
69 Can't graft with dirty wd:
69 Can't graft with dirty wd:
70
70
71 $ hg up -q 0
71 $ hg up -q 0
72 $ echo foo > a
72 $ echo foo > a
73 $ hg graft 1
73 $ hg graft 1
74 abort: uncommitted changes
74 abort: uncommitted changes
75 [255]
75 [255]
76 $ hg revert a
76 $ hg revert a
77
77
78 Graft a rename:
78 Graft a rename:
79 (this also tests that editor is invoked if '--edit' is specified)
79 (this also tests that editor is invoked if '--edit' is specified)
80
80
81 $ hg status --rev "2^1" --rev 2
81 $ hg status --rev "2^1" --rev 2
82 A b
82 A b
83 R a
83 R a
84 $ HGEDITOR=cat hg graft 2 -u foo --edit
84 $ HGEDITOR=cat hg graft 2 -u foo --edit
85 grafting revision 2
85 grafting revision 2
86 merging a and b to b
86 merging a and b to b
87 2
87 2
88
88
89
89
90 HG: Enter commit message. Lines beginning with 'HG:' are removed.
90 HG: Enter commit message. Lines beginning with 'HG:' are removed.
91 HG: Leave message empty to abort commit.
91 HG: Leave message empty to abort commit.
92 HG: --
92 HG: --
93 HG: user: foo
93 HG: user: foo
94 HG: branch 'default'
94 HG: branch 'default'
95 HG: changed b
95 HG: changed b
96 HG: removed a
96 HG: removed a
97 $ hg export tip --git
97 $ hg export tip --git
98 # HG changeset patch
98 # HG changeset patch
99 # User foo
99 # User foo
100 # Date 0 0
100 # Date 0 0
101 # Thu Jan 01 00:00:00 1970 +0000
101 # Thu Jan 01 00:00:00 1970 +0000
102 # Node ID ef0ef43d49e79e81ddafdc7997401ba0041efc82
102 # Node ID ef0ef43d49e79e81ddafdc7997401ba0041efc82
103 # Parent 68795b066622ca79a25816a662041d8f78f3cd9e
103 # Parent 68795b066622ca79a25816a662041d8f78f3cd9e
104 2
104 2
105
105
106 diff --git a/a b/b
106 diff --git a/a b/b
107 rename from a
107 rename from a
108 rename to b
108 rename to b
109
109
110 Look for extra:source
110 Look for extra:source
111
111
112 $ hg log --debug -r tip
112 $ hg log --debug -r tip
113 changeset: 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
113 changeset: 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
114 tag: tip
114 tag: tip
115 phase: draft
115 phase: draft
116 parent: 0:68795b066622ca79a25816a662041d8f78f3cd9e
116 parent: 0:68795b066622ca79a25816a662041d8f78f3cd9e
117 parent: -1:0000000000000000000000000000000000000000
117 parent: -1:0000000000000000000000000000000000000000
118 manifest: 7:e59b6b228f9cbf9903d5e9abf996e083a1f533eb
118 manifest: 7:e59b6b228f9cbf9903d5e9abf996e083a1f533eb
119 user: foo
119 user: foo
120 date: Thu Jan 01 00:00:00 1970 +0000
120 date: Thu Jan 01 00:00:00 1970 +0000
121 files+: b
121 files+: b
122 files-: a
122 files-: a
123 extra: branch=default
123 extra: branch=default
124 extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
124 extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
125 description:
125 description:
126 2
126 2
127
127
128
128
129
129
130 Graft out of order, skipping a merge and a duplicate
130 Graft out of order, skipping a merge and a duplicate
131 (this also tests that editor is not invoked if '--edit' is not specified)
131 (this also tests that editor is not invoked if '--edit' is not specified)
132
132
133 $ hg graft 1 5 4 3 'merge()' 2 -n
133 $ hg graft 1 5 4 3 'merge()' 2 -n
134 skipping ungraftable merge revision 6
134 skipping ungraftable merge revision 6
135 skipping revision 2 (already grafted to 7)
135 skipping revision 2 (already grafted to 7)
136 grafting revision 1
136 grafting revision 1
137 grafting revision 5
137 grafting revision 5
138 grafting revision 4
138 grafting revision 4
139 grafting revision 3
139 grafting revision 3
140
140
141 $ HGEDITOR=cat hg graft 1 5 4 3 'merge()' 2 --debug
141 $ HGEDITOR=cat hg graft 1 5 4 3 'merge()' 2 --debug
142 skipping ungraftable merge revision 6
142 skipping ungraftable merge revision 6
143 scanning for duplicate grafts
143 scanning for duplicate grafts
144 skipping revision 2 (already grafted to 7)
144 skipping revision 2 (already grafted to 7)
145 grafting revision 1
145 grafting revision 1
146 searching for copies back to rev 1
146 searching for copies back to rev 1
147 unmatched files in local:
147 unmatched files in local:
148 b
148 b
149 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
149 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
150 src: 'a' -> dst: 'b' *
150 src: 'a' -> dst: 'b' *
151 checking for directory renames
151 checking for directory renames
152 resolving manifests
152 resolving manifests
153 branchmerge: True, force: True, partial: False
153 branchmerge: True, force: True, partial: False
154 ancestor: 68795b066622, local: ef0ef43d49e7+, remote: 5d205f8b35b6
154 ancestor: 68795b066622, local: ef0ef43d49e7+, remote: 5d205f8b35b6
155 preserving b for resolve of b
155 preserving b for resolve of b
156 b: local copied/moved from a -> m
156 b: local copied/moved from a -> m
157 updating: b 1/1 files (100.00%)
157 updating: b 1/1 files (100.00%)
158 picked tool 'internal:merge' for b (binary False symlink False)
158 picked tool 'internal:merge' for b (binary False symlink False)
159 merging b and a to b
159 merging b and a to b
160 my b@ef0ef43d49e7+ other a@5d205f8b35b6 ancestor a@68795b066622
160 my b@ef0ef43d49e7+ other a@5d205f8b35b6 ancestor a@68795b066622
161 premerge successful
161 premerge successful
162 b
162 b
163 grafting revision 5
163 grafting revision 5
164 searching for copies back to rev 1
164 searching for copies back to rev 1
165 resolving manifests
165 resolving manifests
166 branchmerge: True, force: True, partial: False
166 branchmerge: True, force: True, partial: False
167 ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746
167 ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746
168 e: remote is newer -> g
168 e: remote is newer -> g
169 getting e
169 getting e
170 updating: e 1/1 files (100.00%)
170 updating: e 1/1 files (100.00%)
171 b: keep -> k
171 b: keep -> k
172 e
172 e
173 grafting revision 4
173 grafting revision 4
174 searching for copies back to rev 1
174 searching for copies back to rev 1
175 resolving manifests
175 resolving manifests
176 branchmerge: True, force: True, partial: False
176 branchmerge: True, force: True, partial: False
177 ancestor: 4c60f11aa304, local: 1905859650ec+, remote: 9c233e8e184d
177 ancestor: 4c60f11aa304, local: 1905859650ec+, remote: 9c233e8e184d
178 preserving e for resolve of e
178 preserving e for resolve of e
179 d: remote is newer -> g
179 d: remote is newer -> g
180 getting d
180 getting d
181 updating: d 1/2 files (50.00%)
181 updating: d 1/2 files (50.00%)
182 b: keep -> k
182 b: keep -> k
183 e: versions differ -> m
183 e: versions differ -> m
184 updating: e 2/2 files (100.00%)
184 updating: e 2/2 files (100.00%)
185 picked tool 'internal:merge' for e (binary False symlink False)
185 picked tool 'internal:merge' for e (binary False symlink False)
186 merging e
186 merging e
187 my e@1905859650ec+ other e@9c233e8e184d ancestor e@68795b066622
187 my e@1905859650ec+ other e@9c233e8e184d ancestor e@68795b066622
188 warning: conflicts during merge.
188 warning: conflicts during merge.
189 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
189 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
190 abort: unresolved conflicts, can't continue
190 abort: unresolved conflicts, can't continue
191 (use hg resolve and hg graft --continue)
191 (use hg resolve and hg graft --continue)
192 [255]
192 [255]
193
193
194 Commit while interrupted should fail:
194 Commit while interrupted should fail:
195
195
196 $ hg ci -m 'commit interrupted graft'
196 $ hg ci -m 'commit interrupted graft'
197 abort: graft in progress
197 abort: graft in progress
198 (use 'hg graft --continue' or 'hg update' to abort)
198 (use 'hg graft --continue' or 'hg update' to abort)
199 [255]
199 [255]
200
200
201 Abort the graft and try committing:
201 Abort the graft and try committing:
202
202
203 $ hg up -C .
203 $ hg up -C .
204 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
204 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
205 $ echo c >> e
205 $ echo c >> e
206 $ hg ci -mtest
206 $ hg ci -mtest
207
207
208 $ hg strip . --config extensions.mq=
208 $ hg strip . --config extensions.mq=
209 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
209 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
210 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
210 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
211
211
212 Graft again:
212 Graft again:
213
213
214 $ hg graft 1 5 4 3 'merge()' 2
214 $ hg graft 1 5 4 3 'merge()' 2
215 skipping ungraftable merge revision 6
215 skipping ungraftable merge revision 6
216 skipping revision 2 (already grafted to 7)
216 skipping revision 2 (already grafted to 7)
217 skipping revision 1 (already grafted to 8)
217 skipping revision 1 (already grafted to 8)
218 skipping revision 5 (already grafted to 9)
218 skipping revision 5 (already grafted to 9)
219 grafting revision 4
219 grafting revision 4
220 merging e
220 merging e
221 warning: conflicts during merge.
221 warning: conflicts during merge.
222 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
222 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
223 abort: unresolved conflicts, can't continue
223 abort: unresolved conflicts, can't continue
224 (use hg resolve and hg graft --continue)
224 (use hg resolve and hg graft --continue)
225 [255]
225 [255]
226
226
227 Continue without resolve should fail:
227 Continue without resolve should fail:
228
228
229 $ hg graft -c
229 $ hg graft -c
230 grafting revision 4
230 grafting revision 4
231 abort: unresolved merge conflicts (see hg help resolve)
231 abort: unresolved merge conflicts (see hg help resolve)
232 [255]
232 [255]
233
233
234 Fix up:
234 Fix up:
235
235
236 $ echo b > e
236 $ echo b > e
237 $ hg resolve -m e
237 $ hg resolve -m e
238 no more unresolved files
238 (no more unresolved files)
239
239
240 Continue with a revision should fail:
240 Continue with a revision should fail:
241
241
242 $ hg graft -c 6
242 $ hg graft -c 6
243 abort: can't specify --continue and revisions
243 abort: can't specify --continue and revisions
244 [255]
244 [255]
245
245
246 $ hg graft -c -r 6
246 $ hg graft -c -r 6
247 abort: can't specify --continue and revisions
247 abort: can't specify --continue and revisions
248 [255]
248 [255]
249
249
250 Continue for real, clobber usernames
250 Continue for real, clobber usernames
251
251
252 $ hg graft -c -U
252 $ hg graft -c -U
253 grafting revision 4
253 grafting revision 4
254 grafting revision 3
254 grafting revision 3
255
255
256 Compare with original:
256 Compare with original:
257
257
258 $ hg diff -r 6
258 $ hg diff -r 6
259 $ hg status --rev 0:. -C
259 $ hg status --rev 0:. -C
260 M d
260 M d
261 M e
261 M e
262 A b
262 A b
263 a
263 a
264 A c
264 A c
265 a
265 a
266 R a
266 R a
267
267
268 View graph:
268 View graph:
269
269
270 $ hg log -G --template '{author}@{rev}.{phase}: {desc}\n'
270 $ hg log -G --template '{author}@{rev}.{phase}: {desc}\n'
271 @ test@11.draft: 3
271 @ test@11.draft: 3
272 |
272 |
273 o test@10.draft: 4
273 o test@10.draft: 4
274 |
274 |
275 o test@9.draft: 5
275 o test@9.draft: 5
276 |
276 |
277 o bar@8.draft: 1
277 o bar@8.draft: 1
278 |
278 |
279 o foo@7.draft: 2
279 o foo@7.draft: 2
280 |
280 |
281 | o test@6.secret: 6
281 | o test@6.secret: 6
282 | |\
282 | |\
283 | | o test@5.draft: 5
283 | | o test@5.draft: 5
284 | | |
284 | | |
285 | o | test@4.draft: 4
285 | o | test@4.draft: 4
286 | |/
286 | |/
287 | o baz@3.public: 3
287 | o baz@3.public: 3
288 | |
288 | |
289 | o test@2.public: 2
289 | o test@2.public: 2
290 | |
290 | |
291 | o bar@1.public: 1
291 | o bar@1.public: 1
292 |/
292 |/
293 o test@0.public: 0
293 o test@0.public: 0
294
294
295 Graft again onto another branch should preserve the original source
295 Graft again onto another branch should preserve the original source
296 $ hg up -q 0
296 $ hg up -q 0
297 $ echo 'g'>g
297 $ echo 'g'>g
298 $ hg add g
298 $ hg add g
299 $ hg ci -m 7
299 $ hg ci -m 7
300 created new head
300 created new head
301 $ hg graft 7
301 $ hg graft 7
302 grafting revision 7
302 grafting revision 7
303
303
304 $ hg log -r 7 --template '{rev}:{node}\n'
304 $ hg log -r 7 --template '{rev}:{node}\n'
305 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
305 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
306 $ hg log -r 2 --template '{rev}:{node}\n'
306 $ hg log -r 2 --template '{rev}:{node}\n'
307 2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
307 2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
308
308
309 $ hg log --debug -r tip
309 $ hg log --debug -r tip
310 changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d
310 changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d
311 tag: tip
311 tag: tip
312 phase: draft
312 phase: draft
313 parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
313 parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
314 parent: -1:0000000000000000000000000000000000000000
314 parent: -1:0000000000000000000000000000000000000000
315 manifest: 13:dc313617b8c32457c0d589e0dbbedfe71f3cd637
315 manifest: 13:dc313617b8c32457c0d589e0dbbedfe71f3cd637
316 user: foo
316 user: foo
317 date: Thu Jan 01 00:00:00 1970 +0000
317 date: Thu Jan 01 00:00:00 1970 +0000
318 files+: b
318 files+: b
319 files-: a
319 files-: a
320 extra: branch=default
320 extra: branch=default
321 extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
321 extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
322 description:
322 description:
323 2
323 2
324
324
325
325
326 Disallow grafting an already grafted cset onto its original branch
326 Disallow grafting an already grafted cset onto its original branch
327 $ hg up -q 6
327 $ hg up -q 6
328 $ hg graft 7
328 $ hg graft 7
329 skipping already grafted revision 7 (was grafted from 2)
329 skipping already grafted revision 7 (was grafted from 2)
330 [255]
330 [255]
331
331
332 Disallow grafting already grafted csets with the same origin onto each other
332 Disallow grafting already grafted csets with the same origin onto each other
333 $ hg up -q 13
333 $ hg up -q 13
334 $ hg graft 2
334 $ hg graft 2
335 skipping revision 2 (already grafted to 13)
335 skipping revision 2 (already grafted to 13)
336 [255]
336 [255]
337 $ hg graft 7
337 $ hg graft 7
338 skipping already grafted revision 7 (13 also has origin 2)
338 skipping already grafted revision 7 (13 also has origin 2)
339 [255]
339 [255]
340
340
341 $ hg up -q 7
341 $ hg up -q 7
342 $ hg graft 2
342 $ hg graft 2
343 skipping revision 2 (already grafted to 7)
343 skipping revision 2 (already grafted to 7)
344 [255]
344 [255]
345 $ hg graft tip
345 $ hg graft tip
346 skipping already grafted revision 13 (7 also has origin 2)
346 skipping already grafted revision 13 (7 also has origin 2)
347 [255]
347 [255]
348
348
349 Graft with --log
349 Graft with --log
350
350
351 $ hg up -Cq 1
351 $ hg up -Cq 1
352 $ hg graft 3 --log -u foo
352 $ hg graft 3 --log -u foo
353 grafting revision 3
353 grafting revision 3
354 warning: can't find ancestor for 'c' copied from 'b'!
354 warning: can't find ancestor for 'c' copied from 'b'!
355 $ hg log --template '{rev} {parents} {desc}\n' -r tip
355 $ hg log --template '{rev} {parents} {desc}\n' -r tip
356 14 1:5d205f8b35b6 3
356 14 1:5d205f8b35b6 3
357 (grafted from 4c60f11aa304a54ae1c199feb94e7fc771e51ed8)
357 (grafted from 4c60f11aa304a54ae1c199feb94e7fc771e51ed8)
358
358
359 Resolve conflicted graft
359 Resolve conflicted graft
360 $ hg up -q 0
360 $ hg up -q 0
361 $ echo b > a
361 $ echo b > a
362 $ hg ci -m 8
362 $ hg ci -m 8
363 created new head
363 created new head
364 $ echo a > a
364 $ echo a > a
365 $ hg ci -m 9
365 $ hg ci -m 9
366 $ hg graft 1 --tool internal:fail
366 $ hg graft 1 --tool internal:fail
367 grafting revision 1
367 grafting revision 1
368 abort: unresolved conflicts, can't continue
368 abort: unresolved conflicts, can't continue
369 (use hg resolve and hg graft --continue)
369 (use hg resolve and hg graft --continue)
370 [255]
370 [255]
371 $ hg resolve --all
371 $ hg resolve --all
372 merging a
372 merging a
373 no more unresolved files
373 (no more unresolved files)
374 $ hg graft -c
374 $ hg graft -c
375 grafting revision 1
375 grafting revision 1
376 $ hg export tip --git
376 $ hg export tip --git
377 # HG changeset patch
377 # HG changeset patch
378 # User bar
378 # User bar
379 # Date 0 0
379 # Date 0 0
380 # Thu Jan 01 00:00:00 1970 +0000
380 # Thu Jan 01 00:00:00 1970 +0000
381 # Node ID 64ecd9071ce83c6e62f538d8ce7709d53f32ebf7
381 # Node ID 64ecd9071ce83c6e62f538d8ce7709d53f32ebf7
382 # Parent 4bdb9a9d0b84ffee1d30f0dfc7744cade17aa19c
382 # Parent 4bdb9a9d0b84ffee1d30f0dfc7744cade17aa19c
383 1
383 1
384
384
385 diff --git a/a b/a
385 diff --git a/a b/a
386 --- a/a
386 --- a/a
387 +++ b/a
387 +++ b/a
388 @@ -1,1 +1,1 @@
388 @@ -1,1 +1,1 @@
389 -a
389 -a
390 +b
390 +b
391
391
392 Resolve conflicted graft with rename
392 Resolve conflicted graft with rename
393 $ echo c > a
393 $ echo c > a
394 $ hg ci -m 10
394 $ hg ci -m 10
395 $ hg graft 2 --tool internal:fail
395 $ hg graft 2 --tool internal:fail
396 grafting revision 2
396 grafting revision 2
397 abort: unresolved conflicts, can't continue
397 abort: unresolved conflicts, can't continue
398 (use hg resolve and hg graft --continue)
398 (use hg resolve and hg graft --continue)
399 [255]
399 [255]
400 $ hg resolve --all
400 $ hg resolve --all
401 merging a and b to b
401 merging a and b to b
402 no more unresolved files
402 (no more unresolved files)
403 $ hg graft -c
403 $ hg graft -c
404 grafting revision 2
404 grafting revision 2
405 $ hg export tip --git
405 $ hg export tip --git
406 # HG changeset patch
406 # HG changeset patch
407 # User test
407 # User test
408 # Date 0 0
408 # Date 0 0
409 # Thu Jan 01 00:00:00 1970 +0000
409 # Thu Jan 01 00:00:00 1970 +0000
410 # Node ID 2e80e1351d6ed50302fe1e05f8bd1d4d412b6e11
410 # Node ID 2e80e1351d6ed50302fe1e05f8bd1d4d412b6e11
411 # Parent e5a51ae854a8bbaaf25cc5c6a57ff46042dadbb4
411 # Parent e5a51ae854a8bbaaf25cc5c6a57ff46042dadbb4
412 2
412 2
413
413
414 diff --git a/a b/b
414 diff --git a/a b/b
415 rename from a
415 rename from a
416 rename to b
416 rename to b
417
417
418 Test simple origin(), with and without args
418 Test simple origin(), with and without args
419 $ hg log -r 'origin()'
419 $ hg log -r 'origin()'
420 changeset: 1:5d205f8b35b6
420 changeset: 1:5d205f8b35b6
421 user: bar
421 user: bar
422 date: Thu Jan 01 00:00:00 1970 +0000
422 date: Thu Jan 01 00:00:00 1970 +0000
423 summary: 1
423 summary: 1
424
424
425 changeset: 2:5c095ad7e90f
425 changeset: 2:5c095ad7e90f
426 user: test
426 user: test
427 date: Thu Jan 01 00:00:00 1970 +0000
427 date: Thu Jan 01 00:00:00 1970 +0000
428 summary: 2
428 summary: 2
429
429
430 changeset: 3:4c60f11aa304
430 changeset: 3:4c60f11aa304
431 user: baz
431 user: baz
432 date: Thu Jan 01 00:00:00 1970 +0000
432 date: Thu Jan 01 00:00:00 1970 +0000
433 summary: 3
433 summary: 3
434
434
435 changeset: 4:9c233e8e184d
435 changeset: 4:9c233e8e184d
436 user: test
436 user: test
437 date: Thu Jan 01 00:00:00 1970 +0000
437 date: Thu Jan 01 00:00:00 1970 +0000
438 summary: 4
438 summary: 4
439
439
440 changeset: 5:97f8bfe72746
440 changeset: 5:97f8bfe72746
441 branch: stable
441 branch: stable
442 parent: 3:4c60f11aa304
442 parent: 3:4c60f11aa304
443 user: test
443 user: test
444 date: Thu Jan 01 00:00:00 1970 +0000
444 date: Thu Jan 01 00:00:00 1970 +0000
445 summary: 5
445 summary: 5
446
446
447 $ hg log -r 'origin(7)'
447 $ hg log -r 'origin(7)'
448 changeset: 2:5c095ad7e90f
448 changeset: 2:5c095ad7e90f
449 user: test
449 user: test
450 date: Thu Jan 01 00:00:00 1970 +0000
450 date: Thu Jan 01 00:00:00 1970 +0000
451 summary: 2
451 summary: 2
452
452
453 Now transplant a graft to test following through copies
453 Now transplant a graft to test following through copies
454 $ hg up -q 0
454 $ hg up -q 0
455 $ hg branch -q dev
455 $ hg branch -q dev
456 $ hg ci -qm "dev branch"
456 $ hg ci -qm "dev branch"
457 $ hg --config extensions.transplant= transplant -q 7
457 $ hg --config extensions.transplant= transplant -q 7
458 $ hg log -r 'origin(.)'
458 $ hg log -r 'origin(.)'
459 changeset: 2:5c095ad7e90f
459 changeset: 2:5c095ad7e90f
460 user: test
460 user: test
461 date: Thu Jan 01 00:00:00 1970 +0000
461 date: Thu Jan 01 00:00:00 1970 +0000
462 summary: 2
462 summary: 2
463
463
464 Test that the graft and transplant markers in extra are converted, allowing
464 Test that the graft and transplant markers in extra are converted, allowing
465 origin() to still work. Note that these recheck the immediately preceeding two
465 origin() to still work. Note that these recheck the immediately preceeding two
466 tests.
466 tests.
467 $ hg --quiet --config extensions.convert= --config convert.hg.saverev=True convert . ../converted
467 $ hg --quiet --config extensions.convert= --config convert.hg.saverev=True convert . ../converted
468
468
469 The graft case
469 The graft case
470 $ hg -R ../converted log -r 7 --template "{rev}: {node}\n{join(extras, '\n')}\n"
470 $ hg -R ../converted log -r 7 --template "{rev}: {node}\n{join(extras, '\n')}\n"
471 7: 7ae846e9111fc8f57745634250c7b9ac0a60689b
471 7: 7ae846e9111fc8f57745634250c7b9ac0a60689b
472 branch=default
472 branch=default
473 convert_revision=ef0ef43d49e79e81ddafdc7997401ba0041efc82
473 convert_revision=ef0ef43d49e79e81ddafdc7997401ba0041efc82
474 source=e0213322b2c1a5d5d236c74e79666441bee67a7d
474 source=e0213322b2c1a5d5d236c74e79666441bee67a7d
475 $ hg -R ../converted log -r 'origin(7)'
475 $ hg -R ../converted log -r 'origin(7)'
476 changeset: 2:e0213322b2c1
476 changeset: 2:e0213322b2c1
477 user: test
477 user: test
478 date: Thu Jan 01 00:00:00 1970 +0000
478 date: Thu Jan 01 00:00:00 1970 +0000
479 summary: 2
479 summary: 2
480
480
481 The transplant case
481 The transplant case
482 $ hg -R ../converted log -r tip --template "{rev}: {node}\n{join(extras, '\n')}\n"
482 $ hg -R ../converted log -r tip --template "{rev}: {node}\n{join(extras, '\n')}\n"
483 21: fbb6c5cc81002f2b4b49c9d731404688bcae5ade
483 21: fbb6c5cc81002f2b4b49c9d731404688bcae5ade
484 branch=dev
484 branch=dev
485 convert_revision=7e61b508e709a11d28194a5359bc3532d910af21
485 convert_revision=7e61b508e709a11d28194a5359bc3532d910af21
486 transplant_source=z\xe8F\xe9\x11\x1f\xc8\xf5wEcBP\xc7\xb9\xac (esc)
486 transplant_source=z\xe8F\xe9\x11\x1f\xc8\xf5wEcBP\xc7\xb9\xac (esc)
487 `h\x9b (esc)
487 `h\x9b (esc)
488 $ hg -R ../converted log -r 'origin(tip)'
488 $ hg -R ../converted log -r 'origin(tip)'
489 changeset: 2:e0213322b2c1
489 changeset: 2:e0213322b2c1
490 user: test
490 user: test
491 date: Thu Jan 01 00:00:00 1970 +0000
491 date: Thu Jan 01 00:00:00 1970 +0000
492 summary: 2
492 summary: 2
493
493
494
494
495 Test simple destination
495 Test simple destination
496 $ hg log -r 'destination()'
496 $ hg log -r 'destination()'
497 changeset: 7:ef0ef43d49e7
497 changeset: 7:ef0ef43d49e7
498 parent: 0:68795b066622
498 parent: 0:68795b066622
499 user: foo
499 user: foo
500 date: Thu Jan 01 00:00:00 1970 +0000
500 date: Thu Jan 01 00:00:00 1970 +0000
501 summary: 2
501 summary: 2
502
502
503 changeset: 8:6b9e5368ca4e
503 changeset: 8:6b9e5368ca4e
504 user: bar
504 user: bar
505 date: Thu Jan 01 00:00:00 1970 +0000
505 date: Thu Jan 01 00:00:00 1970 +0000
506 summary: 1
506 summary: 1
507
507
508 changeset: 9:1905859650ec
508 changeset: 9:1905859650ec
509 user: test
509 user: test
510 date: Thu Jan 01 00:00:00 1970 +0000
510 date: Thu Jan 01 00:00:00 1970 +0000
511 summary: 5
511 summary: 5
512
512
513 changeset: 10:52dc0b4c6907
513 changeset: 10:52dc0b4c6907
514 user: test
514 user: test
515 date: Thu Jan 01 00:00:00 1970 +0000
515 date: Thu Jan 01 00:00:00 1970 +0000
516 summary: 4
516 summary: 4
517
517
518 changeset: 11:882b35362a6b
518 changeset: 11:882b35362a6b
519 user: test
519 user: test
520 date: Thu Jan 01 00:00:00 1970 +0000
520 date: Thu Jan 01 00:00:00 1970 +0000
521 summary: 3
521 summary: 3
522
522
523 changeset: 13:9db0f28fd374
523 changeset: 13:9db0f28fd374
524 user: foo
524 user: foo
525 date: Thu Jan 01 00:00:00 1970 +0000
525 date: Thu Jan 01 00:00:00 1970 +0000
526 summary: 2
526 summary: 2
527
527
528 changeset: 14:f64defefacee
528 changeset: 14:f64defefacee
529 parent: 1:5d205f8b35b6
529 parent: 1:5d205f8b35b6
530 user: foo
530 user: foo
531 date: Thu Jan 01 00:00:00 1970 +0000
531 date: Thu Jan 01 00:00:00 1970 +0000
532 summary: 3
532 summary: 3
533
533
534 changeset: 17:64ecd9071ce8
534 changeset: 17:64ecd9071ce8
535 user: bar
535 user: bar
536 date: Thu Jan 01 00:00:00 1970 +0000
536 date: Thu Jan 01 00:00:00 1970 +0000
537 summary: 1
537 summary: 1
538
538
539 changeset: 19:2e80e1351d6e
539 changeset: 19:2e80e1351d6e
540 user: test
540 user: test
541 date: Thu Jan 01 00:00:00 1970 +0000
541 date: Thu Jan 01 00:00:00 1970 +0000
542 summary: 2
542 summary: 2
543
543
544 changeset: 21:7e61b508e709
544 changeset: 21:7e61b508e709
545 branch: dev
545 branch: dev
546 tag: tip
546 tag: tip
547 user: foo
547 user: foo
548 date: Thu Jan 01 00:00:00 1970 +0000
548 date: Thu Jan 01 00:00:00 1970 +0000
549 summary: 2
549 summary: 2
550
550
551 $ hg log -r 'destination(2)'
551 $ hg log -r 'destination(2)'
552 changeset: 7:ef0ef43d49e7
552 changeset: 7:ef0ef43d49e7
553 parent: 0:68795b066622
553 parent: 0:68795b066622
554 user: foo
554 user: foo
555 date: Thu Jan 01 00:00:00 1970 +0000
555 date: Thu Jan 01 00:00:00 1970 +0000
556 summary: 2
556 summary: 2
557
557
558 changeset: 13:9db0f28fd374
558 changeset: 13:9db0f28fd374
559 user: foo
559 user: foo
560 date: Thu Jan 01 00:00:00 1970 +0000
560 date: Thu Jan 01 00:00:00 1970 +0000
561 summary: 2
561 summary: 2
562
562
563 changeset: 19:2e80e1351d6e
563 changeset: 19:2e80e1351d6e
564 user: test
564 user: test
565 date: Thu Jan 01 00:00:00 1970 +0000
565 date: Thu Jan 01 00:00:00 1970 +0000
566 summary: 2
566 summary: 2
567
567
568 changeset: 21:7e61b508e709
568 changeset: 21:7e61b508e709
569 branch: dev
569 branch: dev
570 tag: tip
570 tag: tip
571 user: foo
571 user: foo
572 date: Thu Jan 01 00:00:00 1970 +0000
572 date: Thu Jan 01 00:00:00 1970 +0000
573 summary: 2
573 summary: 2
574
574
575 Transplants of grafts can find a destination...
575 Transplants of grafts can find a destination...
576 $ hg log -r 'destination(7)'
576 $ hg log -r 'destination(7)'
577 changeset: 21:7e61b508e709
577 changeset: 21:7e61b508e709
578 branch: dev
578 branch: dev
579 tag: tip
579 tag: tip
580 user: foo
580 user: foo
581 date: Thu Jan 01 00:00:00 1970 +0000
581 date: Thu Jan 01 00:00:00 1970 +0000
582 summary: 2
582 summary: 2
583
583
584 ... grafts of grafts unfortunately can't
584 ... grafts of grafts unfortunately can't
585 $ hg graft -q 13
585 $ hg graft -q 13
586 $ hg log -r 'destination(13)'
586 $ hg log -r 'destination(13)'
587 All copies of a cset
587 All copies of a cset
588 $ hg log -r 'origin(13) or destination(origin(13))'
588 $ hg log -r 'origin(13) or destination(origin(13))'
589 changeset: 2:5c095ad7e90f
589 changeset: 2:5c095ad7e90f
590 user: test
590 user: test
591 date: Thu Jan 01 00:00:00 1970 +0000
591 date: Thu Jan 01 00:00:00 1970 +0000
592 summary: 2
592 summary: 2
593
593
594 changeset: 7:ef0ef43d49e7
594 changeset: 7:ef0ef43d49e7
595 parent: 0:68795b066622
595 parent: 0:68795b066622
596 user: foo
596 user: foo
597 date: Thu Jan 01 00:00:00 1970 +0000
597 date: Thu Jan 01 00:00:00 1970 +0000
598 summary: 2
598 summary: 2
599
599
600 changeset: 13:9db0f28fd374
600 changeset: 13:9db0f28fd374
601 user: foo
601 user: foo
602 date: Thu Jan 01 00:00:00 1970 +0000
602 date: Thu Jan 01 00:00:00 1970 +0000
603 summary: 2
603 summary: 2
604
604
605 changeset: 19:2e80e1351d6e
605 changeset: 19:2e80e1351d6e
606 user: test
606 user: test
607 date: Thu Jan 01 00:00:00 1970 +0000
607 date: Thu Jan 01 00:00:00 1970 +0000
608 summary: 2
608 summary: 2
609
609
610 changeset: 21:7e61b508e709
610 changeset: 21:7e61b508e709
611 branch: dev
611 branch: dev
612 user: foo
612 user: foo
613 date: Thu Jan 01 00:00:00 1970 +0000
613 date: Thu Jan 01 00:00:00 1970 +0000
614 summary: 2
614 summary: 2
615
615
616 changeset: 22:1313d0a825e2
616 changeset: 22:1313d0a825e2
617 branch: dev
617 branch: dev
618 tag: tip
618 tag: tip
619 user: foo
619 user: foo
620 date: Thu Jan 01 00:00:00 1970 +0000
620 date: Thu Jan 01 00:00:00 1970 +0000
621 summary: 2
621 summary: 2
622
622
623
623
624 graft works on complex revset
624 graft works on complex revset
625
625
626 $ hg graft 'origin(13) or destination(origin(13))'
626 $ hg graft 'origin(13) or destination(origin(13))'
627 skipping ancestor revision 21
627 skipping ancestor revision 21
628 skipping ancestor revision 22
628 skipping ancestor revision 22
629 skipping revision 2 (already grafted to 22)
629 skipping revision 2 (already grafted to 22)
630 grafting revision 7
630 grafting revision 7
631 grafting revision 13
631 grafting revision 13
632 grafting revision 19
632 grafting revision 19
633 merging b
633 merging b
@@ -1,185 +1,185 b''
1 $ . "$TESTDIR/histedit-helpers.sh"
1 $ . "$TESTDIR/histedit-helpers.sh"
2
2
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > histedit=
5 > histedit=
6 > EOF
6 > EOF
7
7
8 $ initrepo ()
8 $ initrepo ()
9 > {
9 > {
10 > hg init $1
10 > hg init $1
11 > cd $1
11 > cd $1
12 > for x in a b c d e f ; do
12 > for x in a b c d e f ; do
13 > echo $x$x$x$x$x > $x
13 > echo $x$x$x$x$x > $x
14 > hg add $x
14 > hg add $x
15 > done
15 > done
16 > hg ci -m 'Initial commit'
16 > hg ci -m 'Initial commit'
17 > for x in a b c d e f ; do
17 > for x in a b c d e f ; do
18 > echo $x > $x
18 > echo $x > $x
19 > hg ci -m $x
19 > hg ci -m $x
20 > done
20 > done
21 > echo 'I can haz no commute' > e
21 > echo 'I can haz no commute' > e
22 > hg ci -m 'does not commute with e'
22 > hg ci -m 'does not commute with e'
23 > cd ..
23 > cd ..
24 > }
24 > }
25
25
26 $ initrepo r
26 $ initrepo r
27 $ cd r
27 $ cd r
28 Initial generation of the command files
28 Initial generation of the command files
29
29
30 $ EDITED="$TESTTMP/editedhistory"
30 $ EDITED="$TESTTMP/editedhistory"
31 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
31 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
32 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
32 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
33 $ hg log --template 'fold {node|short} {rev} {desc}\n' -r 7 >> $EDITED
33 $ hg log --template 'fold {node|short} {rev} {desc}\n' -r 7 >> $EDITED
34 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
34 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
35 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
35 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
36 $ cat $EDITED
36 $ cat $EDITED
37 pick 65a9a84f33fd 3 c
37 pick 65a9a84f33fd 3 c
38 pick 00f1c5383965 4 d
38 pick 00f1c5383965 4 d
39 fold 39522b764e3d 7 does not commute with e
39 fold 39522b764e3d 7 does not commute with e
40 pick 7b4e2f4b7bcd 5 e
40 pick 7b4e2f4b7bcd 5 e
41 pick 500cac37a696 6 f
41 pick 500cac37a696 6 f
42
42
43 log before edit
43 log before edit
44 $ hg log --graph
44 $ hg log --graph
45 @ changeset: 7:39522b764e3d
45 @ changeset: 7:39522b764e3d
46 | tag: tip
46 | tag: tip
47 | user: test
47 | user: test
48 | date: Thu Jan 01 00:00:00 1970 +0000
48 | date: Thu Jan 01 00:00:00 1970 +0000
49 | summary: does not commute with e
49 | summary: does not commute with e
50 |
50 |
51 o changeset: 6:500cac37a696
51 o changeset: 6:500cac37a696
52 | user: test
52 | user: test
53 | date: Thu Jan 01 00:00:00 1970 +0000
53 | date: Thu Jan 01 00:00:00 1970 +0000
54 | summary: f
54 | summary: f
55 |
55 |
56 o changeset: 5:7b4e2f4b7bcd
56 o changeset: 5:7b4e2f4b7bcd
57 | user: test
57 | user: test
58 | date: Thu Jan 01 00:00:00 1970 +0000
58 | date: Thu Jan 01 00:00:00 1970 +0000
59 | summary: e
59 | summary: e
60 |
60 |
61 o changeset: 4:00f1c5383965
61 o changeset: 4:00f1c5383965
62 | user: test
62 | user: test
63 | date: Thu Jan 01 00:00:00 1970 +0000
63 | date: Thu Jan 01 00:00:00 1970 +0000
64 | summary: d
64 | summary: d
65 |
65 |
66 o changeset: 3:65a9a84f33fd
66 o changeset: 3:65a9a84f33fd
67 | user: test
67 | user: test
68 | date: Thu Jan 01 00:00:00 1970 +0000
68 | date: Thu Jan 01 00:00:00 1970 +0000
69 | summary: c
69 | summary: c
70 |
70 |
71 o changeset: 2:da6535b52e45
71 o changeset: 2:da6535b52e45
72 | user: test
72 | user: test
73 | date: Thu Jan 01 00:00:00 1970 +0000
73 | date: Thu Jan 01 00:00:00 1970 +0000
74 | summary: b
74 | summary: b
75 |
75 |
76 o changeset: 1:c1f09da44841
76 o changeset: 1:c1f09da44841
77 | user: test
77 | user: test
78 | date: Thu Jan 01 00:00:00 1970 +0000
78 | date: Thu Jan 01 00:00:00 1970 +0000
79 | summary: a
79 | summary: a
80 |
80 |
81 o changeset: 0:1715188a53c7
81 o changeset: 0:1715188a53c7
82 user: test
82 user: test
83 date: Thu Jan 01 00:00:00 1970 +0000
83 date: Thu Jan 01 00:00:00 1970 +0000
84 summary: Initial commit
84 summary: Initial commit
85
85
86
86
87 edit the history
87 edit the history
88 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
88 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
89 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
89 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
90 merging e
90 merging e
91 warning: conflicts during merge.
91 warning: conflicts during merge.
92 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
92 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
93 Fix up the change and run hg histedit --continue
93 Fix up the change and run hg histedit --continue
94
94
95 fix up
95 fix up
96 $ echo 'I can haz no commute' > e
96 $ echo 'I can haz no commute' > e
97 $ hg resolve --mark e
97 $ hg resolve --mark e
98 no more unresolved files
98 (no more unresolved files)
99 $ cat > cat.py <<EOF
99 $ cat > cat.py <<EOF
100 > import sys
100 > import sys
101 > print open(sys.argv[1]).read()
101 > print open(sys.argv[1]).read()
102 > print
102 > print
103 > print
103 > print
104 > EOF
104 > EOF
105 $ HGEDITOR="python cat.py" hg histedit --continue 2>&1 | fixbundle | grep -v '2 files removed'
105 $ HGEDITOR="python cat.py" hg histedit --continue 2>&1 | fixbundle | grep -v '2 files removed'
106 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
106 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
107 d
107 d
108 ***
108 ***
109 does not commute with e
109 does not commute with e
110
110
111
111
112
112
113 HG: Enter commit message. Lines beginning with 'HG:' are removed.
113 HG: Enter commit message. Lines beginning with 'HG:' are removed.
114 HG: Leave message empty to abort commit.
114 HG: Leave message empty to abort commit.
115 HG: --
115 HG: --
116 HG: user: test
116 HG: user: test
117 HG: branch 'default'
117 HG: branch 'default'
118 HG: changed d
118 HG: changed d
119 HG: changed e
119 HG: changed e
120
120
121
121
122
122
123 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
123 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
124 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
124 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
125 merging e
125 merging e
126 warning: conflicts during merge.
126 warning: conflicts during merge.
127 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
127 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
128 Fix up the change and run hg histedit --continue
128 Fix up the change and run hg histedit --continue
129
129
130 just continue this time
130 just continue this time
131 $ hg revert -r 'p1()' e
131 $ hg revert -r 'p1()' e
132 $ hg resolve --mark e
132 $ hg resolve --mark e
133 no more unresolved files
133 (no more unresolved files)
134 $ hg histedit --continue 2>&1 | fixbundle
134 $ hg histedit --continue 2>&1 | fixbundle
135 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
135 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
136 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
136 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
137
137
138 log after edit
138 log after edit
139 $ hg log --graph
139 $ hg log --graph
140 @ changeset: 5:d9cf42e54966
140 @ changeset: 5:d9cf42e54966
141 | tag: tip
141 | tag: tip
142 | user: test
142 | user: test
143 | date: Thu Jan 01 00:00:00 1970 +0000
143 | date: Thu Jan 01 00:00:00 1970 +0000
144 | summary: f
144 | summary: f
145 |
145 |
146 o changeset: 4:10486af2e984
146 o changeset: 4:10486af2e984
147 | user: test
147 | user: test
148 | date: Thu Jan 01 00:00:00 1970 +0000
148 | date: Thu Jan 01 00:00:00 1970 +0000
149 | summary: d
149 | summary: d
150 |
150 |
151 o changeset: 3:65a9a84f33fd
151 o changeset: 3:65a9a84f33fd
152 | user: test
152 | user: test
153 | date: Thu Jan 01 00:00:00 1970 +0000
153 | date: Thu Jan 01 00:00:00 1970 +0000
154 | summary: c
154 | summary: c
155 |
155 |
156 o changeset: 2:da6535b52e45
156 o changeset: 2:da6535b52e45
157 | user: test
157 | user: test
158 | date: Thu Jan 01 00:00:00 1970 +0000
158 | date: Thu Jan 01 00:00:00 1970 +0000
159 | summary: b
159 | summary: b
160 |
160 |
161 o changeset: 1:c1f09da44841
161 o changeset: 1:c1f09da44841
162 | user: test
162 | user: test
163 | date: Thu Jan 01 00:00:00 1970 +0000
163 | date: Thu Jan 01 00:00:00 1970 +0000
164 | summary: a
164 | summary: a
165 |
165 |
166 o changeset: 0:1715188a53c7
166 o changeset: 0:1715188a53c7
167 user: test
167 user: test
168 date: Thu Jan 01 00:00:00 1970 +0000
168 date: Thu Jan 01 00:00:00 1970 +0000
169 summary: Initial commit
169 summary: Initial commit
170
170
171
171
172 contents of e
172 contents of e
173 $ hg cat e
173 $ hg cat e
174 I can haz no commute
174 I can haz no commute
175
175
176 manifest
176 manifest
177 $ hg manifest
177 $ hg manifest
178 a
178 a
179 b
179 b
180 c
180 c
181 d
181 d
182 e
182 e
183 f
183 f
184
184
185 $ cd ..
185 $ cd ..
@@ -1,366 +1,366 b''
1 Test histedit extension: Fold commands
1 Test histedit extension: Fold commands
2 ======================================
2 ======================================
3
3
4 This test file is dedicated to testing the fold command in non conflicting
4 This test file is dedicated to testing the fold command in non conflicting
5 case.
5 case.
6
6
7 Initialization
7 Initialization
8 ---------------
8 ---------------
9
9
10
10
11 $ . "$TESTDIR/histedit-helpers.sh"
11 $ . "$TESTDIR/histedit-helpers.sh"
12
12
13 $ cat >> $HGRCPATH <<EOF
13 $ cat >> $HGRCPATH <<EOF
14 > [alias]
14 > [alias]
15 > logt = log --template '{rev}:{node|short} {desc|firstline}\n'
15 > logt = log --template '{rev}:{node|short} {desc|firstline}\n'
16 > [extensions]
16 > [extensions]
17 > histedit=
17 > histedit=
18 > EOF
18 > EOF
19
19
20
20
21 Simple folding
21 Simple folding
22 --------------------
22 --------------------
23 $ initrepo ()
23 $ initrepo ()
24 > {
24 > {
25 > hg init r
25 > hg init r
26 > cd r
26 > cd r
27 > for x in a b c d e f ; do
27 > for x in a b c d e f ; do
28 > echo $x > $x
28 > echo $x > $x
29 > hg add $x
29 > hg add $x
30 > hg ci -m $x
30 > hg ci -m $x
31 > done
31 > done
32 > }
32 > }
33
33
34 $ initrepo
34 $ initrepo
35
35
36 log before edit
36 log before edit
37 $ hg logt --graph
37 $ hg logt --graph
38 @ 5:652413bf663e f
38 @ 5:652413bf663e f
39 |
39 |
40 o 4:e860deea161a e
40 o 4:e860deea161a e
41 |
41 |
42 o 3:055a42cdd887 d
42 o 3:055a42cdd887 d
43 |
43 |
44 o 2:177f92b77385 c
44 o 2:177f92b77385 c
45 |
45 |
46 o 1:d2ae7f538514 b
46 o 1:d2ae7f538514 b
47 |
47 |
48 o 0:cb9a9f314b8b a
48 o 0:cb9a9f314b8b a
49
49
50
50
51 $ hg histedit 177f92b77385 --commands - 2>&1 <<EOF | fixbundle
51 $ hg histedit 177f92b77385 --commands - 2>&1 <<EOF | fixbundle
52 > pick e860deea161a e
52 > pick e860deea161a e
53 > pick 652413bf663e f
53 > pick 652413bf663e f
54 > fold 177f92b77385 c
54 > fold 177f92b77385 c
55 > pick 055a42cdd887 d
55 > pick 055a42cdd887 d
56 > EOF
56 > EOF
57 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
57 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
58 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
58 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
59 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
59 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
60 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
60 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
61 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
62 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
62 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
63 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
63 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
64
64
65 log after edit
65 log after edit
66 $ hg logt --graph
66 $ hg logt --graph
67 @ 4:9c277da72c9b d
67 @ 4:9c277da72c9b d
68 |
68 |
69 o 3:6de59d13424a f
69 o 3:6de59d13424a f
70 |
70 |
71 o 2:ee283cb5f2d5 e
71 o 2:ee283cb5f2d5 e
72 |
72 |
73 o 1:d2ae7f538514 b
73 o 1:d2ae7f538514 b
74 |
74 |
75 o 0:cb9a9f314b8b a
75 o 0:cb9a9f314b8b a
76
76
77
77
78 post-fold manifest
78 post-fold manifest
79 $ hg manifest
79 $ hg manifest
80 a
80 a
81 b
81 b
82 c
82 c
83 d
83 d
84 e
84 e
85 f
85 f
86
86
87
87
88 check histedit_source
88 check histedit_source
89
89
90 $ hg log --debug --rev 3
90 $ hg log --debug --rev 3
91 changeset: 3:6de59d13424a8a13acd3e975514aed29dd0d9b2d
91 changeset: 3:6de59d13424a8a13acd3e975514aed29dd0d9b2d
92 phase: draft
92 phase: draft
93 parent: 2:ee283cb5f2d5955443f23a27b697a04339e9a39a
93 parent: 2:ee283cb5f2d5955443f23a27b697a04339e9a39a
94 parent: -1:0000000000000000000000000000000000000000
94 parent: -1:0000000000000000000000000000000000000000
95 manifest: 3:81eede616954057198ead0b2c73b41d1f392829a
95 manifest: 3:81eede616954057198ead0b2c73b41d1f392829a
96 user: test
96 user: test
97 date: Thu Jan 01 00:00:00 1970 +0000
97 date: Thu Jan 01 00:00:00 1970 +0000
98 files+: c f
98 files+: c f
99 extra: branch=default
99 extra: branch=default
100 extra: histedit_source=a4f7421b80f79fcc59fff01bcbf4a53d127dd6d3,177f92b773850b59254aa5e923436f921b55483b
100 extra: histedit_source=a4f7421b80f79fcc59fff01bcbf4a53d127dd6d3,177f92b773850b59254aa5e923436f921b55483b
101 description:
101 description:
102 f
102 f
103 ***
103 ***
104 c
104 c
105
105
106
106
107
107
108 check saving last-message.txt
108 check saving last-message.txt
109
109
110 $ cat > $TESTTMP/abortfolding.py <<EOF
110 $ cat > $TESTTMP/abortfolding.py <<EOF
111 > from mercurial import util
111 > from mercurial import util
112 > def abortfolding(ui, repo, hooktype, **kwargs):
112 > def abortfolding(ui, repo, hooktype, **kwargs):
113 > ctx = repo[kwargs.get('node')]
113 > ctx = repo[kwargs.get('node')]
114 > if set(ctx.files()) == set(['c', 'd', 'f']):
114 > if set(ctx.files()) == set(['c', 'd', 'f']):
115 > return True # abort folding commit only
115 > return True # abort folding commit only
116 > ui.warn('allow non-folding commit\\n')
116 > ui.warn('allow non-folding commit\\n')
117 > EOF
117 > EOF
118 $ cat > .hg/hgrc <<EOF
118 $ cat > .hg/hgrc <<EOF
119 > [hooks]
119 > [hooks]
120 > pretxncommit.abortfolding = python:$TESTTMP/abortfolding.py:abortfolding
120 > pretxncommit.abortfolding = python:$TESTTMP/abortfolding.py:abortfolding
121 > EOF
121 > EOF
122
122
123 $ cat > $TESTTMP/editor.sh << EOF
123 $ cat > $TESTTMP/editor.sh << EOF
124 > echo "==== before editing"
124 > echo "==== before editing"
125 > cat \$1
125 > cat \$1
126 > echo "===="
126 > echo "===="
127 > echo "check saving last-message.txt" >> \$1
127 > echo "check saving last-message.txt" >> \$1
128 > EOF
128 > EOF
129
129
130 $ rm -f .hg/last-message.txt
130 $ rm -f .hg/last-message.txt
131 $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 6de59d13424a --commands - 2>&1 <<EOF | fixbundle
131 $ HGEDITOR="sh $TESTTMP/editor.sh" hg histedit 6de59d13424a --commands - 2>&1 <<EOF | fixbundle
132 > pick 6de59d13424a f
132 > pick 6de59d13424a f
133 > fold 9c277da72c9b d
133 > fold 9c277da72c9b d
134 > EOF
134 > EOF
135 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
135 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
136 allow non-folding commit
136 allow non-folding commit
137 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
137 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
138 ==== before editing
138 ==== before editing
139 f
139 f
140 ***
140 ***
141 c
141 c
142 ***
142 ***
143 d
143 d
144
144
145
145
146
146
147 HG: Enter commit message. Lines beginning with 'HG:' are removed.
147 HG: Enter commit message. Lines beginning with 'HG:' are removed.
148 HG: Leave message empty to abort commit.
148 HG: Leave message empty to abort commit.
149 HG: --
149 HG: --
150 HG: user: test
150 HG: user: test
151 HG: branch 'default'
151 HG: branch 'default'
152 HG: changed c
152 HG: changed c
153 HG: changed d
153 HG: changed d
154 HG: changed f
154 HG: changed f
155 ====
155 ====
156 transaction abort!
156 transaction abort!
157 rollback completed
157 rollback completed
158 abort: pretxncommit.abortfolding hook failed
158 abort: pretxncommit.abortfolding hook failed
159
159
160 $ cat .hg/last-message.txt
160 $ cat .hg/last-message.txt
161 f
161 f
162 ***
162 ***
163 c
163 c
164 ***
164 ***
165 d
165 d
166
166
167
167
168
168
169 check saving last-message.txt
169 check saving last-message.txt
170
170
171 $ cd ..
171 $ cd ..
172
172
173 folding and creating no new change doesn't break:
173 folding and creating no new change doesn't break:
174 -------------------------------------------------
174 -------------------------------------------------
175
175
176 folded content is dropped during a merge. The folded commit should properly disappear.
176 folded content is dropped during a merge. The folded commit should properly disappear.
177
177
178 $ mkdir fold-to-empty-test
178 $ mkdir fold-to-empty-test
179 $ cd fold-to-empty-test
179 $ cd fold-to-empty-test
180 $ hg init
180 $ hg init
181 $ printf "1\n2\n3\n" > file
181 $ printf "1\n2\n3\n" > file
182 $ hg add file
182 $ hg add file
183 $ hg commit -m '1+2+3'
183 $ hg commit -m '1+2+3'
184 $ echo 4 >> file
184 $ echo 4 >> file
185 $ hg commit -m '+4'
185 $ hg commit -m '+4'
186 $ echo 5 >> file
186 $ echo 5 >> file
187 $ hg commit -m '+5'
187 $ hg commit -m '+5'
188 $ echo 6 >> file
188 $ echo 6 >> file
189 $ hg commit -m '+6'
189 $ hg commit -m '+6'
190 $ hg logt --graph
190 $ hg logt --graph
191 @ 3:251d831eeec5 +6
191 @ 3:251d831eeec5 +6
192 |
192 |
193 o 2:888f9082bf99 +5
193 o 2:888f9082bf99 +5
194 |
194 |
195 o 1:617f94f13c0f +4
195 o 1:617f94f13c0f +4
196 |
196 |
197 o 0:0189ba417d34 1+2+3
197 o 0:0189ba417d34 1+2+3
198
198
199
199
200 $ hg histedit 1 --commands - << EOF
200 $ hg histedit 1 --commands - << EOF
201 > pick 617f94f13c0f 1 +4
201 > pick 617f94f13c0f 1 +4
202 > drop 888f9082bf99 2 +5
202 > drop 888f9082bf99 2 +5
203 > fold 251d831eeec5 3 +6
203 > fold 251d831eeec5 3 +6
204 > EOF
204 > EOF
205 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
205 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
206 merging file
206 merging file
207 warning: conflicts during merge.
207 warning: conflicts during merge.
208 merging file incomplete! (edit conflicts, then use 'hg resolve --mark')
208 merging file incomplete! (edit conflicts, then use 'hg resolve --mark')
209 Fix up the change and run hg histedit --continue
209 Fix up the change and run hg histedit --continue
210 [1]
210 [1]
211 There were conflicts, we keep P1 content. This
211 There were conflicts, we keep P1 content. This
212 should effectively drop the changes from +6.
212 should effectively drop the changes from +6.
213 $ hg status
213 $ hg status
214 M file
214 M file
215 ? file.orig
215 ? file.orig
216 $ hg resolve -l
216 $ hg resolve -l
217 U file
217 U file
218 $ hg revert -r 'p1()' file
218 $ hg revert -r 'p1()' file
219 $ hg resolve --mark file
219 $ hg resolve --mark file
220 no more unresolved files
220 (no more unresolved files)
221 $ hg histedit --continue
221 $ hg histedit --continue
222 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
222 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
223 saved backup bundle to $TESTTMP/*-backup.hg (glob)
223 saved backup bundle to $TESTTMP/*-backup.hg (glob)
224 $ hg logt --graph
224 $ hg logt --graph
225 @ 1:617f94f13c0f +4
225 @ 1:617f94f13c0f +4
226 |
226 |
227 o 0:0189ba417d34 1+2+3
227 o 0:0189ba417d34 1+2+3
228
228
229
229
230 $ cd ..
230 $ cd ..
231
231
232
232
233 Test fold through dropped
233 Test fold through dropped
234 -------------------------
234 -------------------------
235
235
236
236
237 Test corner case where folded revision is separated from its parent by a
237 Test corner case where folded revision is separated from its parent by a
238 dropped revision.
238 dropped revision.
239
239
240
240
241 $ hg init fold-with-dropped
241 $ hg init fold-with-dropped
242 $ cd fold-with-dropped
242 $ cd fold-with-dropped
243 $ printf "1\n2\n3\n" > file
243 $ printf "1\n2\n3\n" > file
244 $ hg commit -Am '1+2+3'
244 $ hg commit -Am '1+2+3'
245 adding file
245 adding file
246 $ echo 4 >> file
246 $ echo 4 >> file
247 $ hg commit -m '+4'
247 $ hg commit -m '+4'
248 $ echo 5 >> file
248 $ echo 5 >> file
249 $ hg commit -m '+5'
249 $ hg commit -m '+5'
250 $ echo 6 >> file
250 $ echo 6 >> file
251 $ hg commit -m '+6'
251 $ hg commit -m '+6'
252 $ hg logt -G
252 $ hg logt -G
253 @ 3:251d831eeec5 +6
253 @ 3:251d831eeec5 +6
254 |
254 |
255 o 2:888f9082bf99 +5
255 o 2:888f9082bf99 +5
256 |
256 |
257 o 1:617f94f13c0f +4
257 o 1:617f94f13c0f +4
258 |
258 |
259 o 0:0189ba417d34 1+2+3
259 o 0:0189ba417d34 1+2+3
260
260
261 $ hg histedit 1 --commands - << EOF
261 $ hg histedit 1 --commands - << EOF
262 > pick 617f94f13c0f 1 +4
262 > pick 617f94f13c0f 1 +4
263 > drop 888f9082bf99 2 +5
263 > drop 888f9082bf99 2 +5
264 > fold 251d831eeec5 3 +6
264 > fold 251d831eeec5 3 +6
265 > EOF
265 > EOF
266 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
267 merging file
267 merging file
268 warning: conflicts during merge.
268 warning: conflicts during merge.
269 merging file incomplete! (edit conflicts, then use 'hg resolve --mark')
269 merging file incomplete! (edit conflicts, then use 'hg resolve --mark')
270 Fix up the change and run hg histedit --continue
270 Fix up the change and run hg histedit --continue
271 [1]
271 [1]
272 $ cat > file << EOF
272 $ cat > file << EOF
273 > 1
273 > 1
274 > 2
274 > 2
275 > 3
275 > 3
276 > 4
276 > 4
277 > 5
277 > 5
278 > EOF
278 > EOF
279 $ hg resolve --mark file
279 $ hg resolve --mark file
280 no more unresolved files
280 (no more unresolved files)
281 $ hg commit -m '+5.2'
281 $ hg commit -m '+5.2'
282 created new head
282 created new head
283 $ echo 6 >> file
283 $ echo 6 >> file
284 $ HGEDITOR=cat hg histedit --continue
284 $ HGEDITOR=cat hg histedit --continue
285 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
285 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
286 +4
286 +4
287 ***
287 ***
288 +5.2
288 +5.2
289 ***
289 ***
290 +6
290 +6
291
291
292
292
293
293
294 HG: Enter commit message. Lines beginning with 'HG:' are removed.
294 HG: Enter commit message. Lines beginning with 'HG:' are removed.
295 HG: Leave message empty to abort commit.
295 HG: Leave message empty to abort commit.
296 HG: --
296 HG: --
297 HG: user: test
297 HG: user: test
298 HG: branch 'default'
298 HG: branch 'default'
299 HG: changed file
299 HG: changed file
300 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
300 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
301 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
301 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
302 saved backup bundle to $TESTTMP/fold-with-dropped/.hg/strip-backup/617f94f13c0f-backup.hg (glob)
302 saved backup bundle to $TESTTMP/fold-with-dropped/.hg/strip-backup/617f94f13c0f-backup.hg (glob)
303 $ hg logt -G
303 $ hg logt -G
304 @ 1:10c647b2cdd5 +4
304 @ 1:10c647b2cdd5 +4
305 |
305 |
306 o 0:0189ba417d34 1+2+3
306 o 0:0189ba417d34 1+2+3
307
307
308 $ hg export tip
308 $ hg export tip
309 # HG changeset patch
309 # HG changeset patch
310 # User test
310 # User test
311 # Date 0 0
311 # Date 0 0
312 # Thu Jan 01 00:00:00 1970 +0000
312 # Thu Jan 01 00:00:00 1970 +0000
313 # Node ID 10c647b2cdd54db0603ecb99b2ff5ce66d5a5323
313 # Node ID 10c647b2cdd54db0603ecb99b2ff5ce66d5a5323
314 # Parent 0189ba417d34df9dda55f88b637dcae9917b5964
314 # Parent 0189ba417d34df9dda55f88b637dcae9917b5964
315 +4
315 +4
316 ***
316 ***
317 +5.2
317 +5.2
318 ***
318 ***
319 +6
319 +6
320
320
321 diff -r 0189ba417d34 -r 10c647b2cdd5 file
321 diff -r 0189ba417d34 -r 10c647b2cdd5 file
322 --- a/file Thu Jan 01 00:00:00 1970 +0000
322 --- a/file Thu Jan 01 00:00:00 1970 +0000
323 +++ b/file Thu Jan 01 00:00:00 1970 +0000
323 +++ b/file Thu Jan 01 00:00:00 1970 +0000
324 @@ -1,3 +1,6 @@
324 @@ -1,3 +1,6 @@
325 1
325 1
326 2
326 2
327 3
327 3
328 +4
328 +4
329 +5
329 +5
330 +6
330 +6
331 $ cd ..
331 $ cd ..
332
332
333
333
334 Folding with initial rename (issue3729)
334 Folding with initial rename (issue3729)
335 ---------------------------------------
335 ---------------------------------------
336
336
337 $ hg init fold-rename
337 $ hg init fold-rename
338 $ cd fold-rename
338 $ cd fold-rename
339 $ echo a > a.txt
339 $ echo a > a.txt
340 $ hg add a.txt
340 $ hg add a.txt
341 $ hg commit -m a
341 $ hg commit -m a
342 $ hg rename a.txt b.txt
342 $ hg rename a.txt b.txt
343 $ hg commit -m rename
343 $ hg commit -m rename
344 $ echo b >> b.txt
344 $ echo b >> b.txt
345 $ hg commit -m b
345 $ hg commit -m b
346
346
347 $ hg logt --follow b.txt
347 $ hg logt --follow b.txt
348 2:e0371e0426bc b
348 2:e0371e0426bc b
349 1:1c4f440a8085 rename
349 1:1c4f440a8085 rename
350 0:6c795aa153cb a
350 0:6c795aa153cb a
351
351
352 $ hg histedit 1c4f440a8085 --commands - 2>&1 << EOF | fixbundle
352 $ hg histedit 1c4f440a8085 --commands - 2>&1 << EOF | fixbundle
353 > pick 1c4f440a8085 rename
353 > pick 1c4f440a8085 rename
354 > fold e0371e0426bc b
354 > fold e0371e0426bc b
355 > EOF
355 > EOF
356 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
356 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
357 reverting b.txt
357 reverting b.txt
358 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
358 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
359 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
359 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
360 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
360 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
361
361
362 $ hg logt --follow b.txt
362 $ hg logt --follow b.txt
363 1:cf858d235c76 rename
363 1:cf858d235c76 rename
364 0:6c795aa153cb a
364 0:6c795aa153cb a
365
365
366 $ cd ..
366 $ cd ..
@@ -1,298 +1,298 b''
1 $ . "$TESTDIR/histedit-helpers.sh"
1 $ . "$TESTDIR/histedit-helpers.sh"
2
2
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > histedit=
5 > histedit=
6 > EOF
6 > EOF
7
7
8 $ initrepo ()
8 $ initrepo ()
9 > {
9 > {
10 > hg init $1
10 > hg init $1
11 > cd $1
11 > cd $1
12 > for x in a b c d e f ; do
12 > for x in a b c d e f ; do
13 > echo $x$x$x$x$x > $x
13 > echo $x$x$x$x$x > $x
14 > hg add $x
14 > hg add $x
15 > done
15 > done
16 > hg ci -m 'Initial commit'
16 > hg ci -m 'Initial commit'
17 > for x in a b c d e f ; do
17 > for x in a b c d e f ; do
18 > echo $x > $x
18 > echo $x > $x
19 > hg ci -m $x
19 > hg ci -m $x
20 > done
20 > done
21 > echo 'I can haz no commute' > e
21 > echo 'I can haz no commute' > e
22 > hg ci -m 'does not commute with e'
22 > hg ci -m 'does not commute with e'
23 > cd ..
23 > cd ..
24 > }
24 > }
25
25
26 $ initrepo r1
26 $ initrepo r1
27 $ cd r1
27 $ cd r1
28
28
29 Initial generation of the command files
29 Initial generation of the command files
30
30
31 $ EDITED="$TESTTMP/editedhistory"
31 $ EDITED="$TESTTMP/editedhistory"
32 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
32 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
33 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
33 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
34 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 7 >> $EDITED
34 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 7 >> $EDITED
35 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
35 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
36 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
36 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
37 $ cat $EDITED
37 $ cat $EDITED
38 pick 65a9a84f33fd 3 c
38 pick 65a9a84f33fd 3 c
39 pick 00f1c5383965 4 d
39 pick 00f1c5383965 4 d
40 pick 39522b764e3d 7 does not commute with e
40 pick 39522b764e3d 7 does not commute with e
41 pick 7b4e2f4b7bcd 5 e
41 pick 7b4e2f4b7bcd 5 e
42 pick 500cac37a696 6 f
42 pick 500cac37a696 6 f
43
43
44 log before edit
44 log before edit
45 $ hg log --graph
45 $ hg log --graph
46 @ changeset: 7:39522b764e3d
46 @ changeset: 7:39522b764e3d
47 | tag: tip
47 | tag: tip
48 | user: test
48 | user: test
49 | date: Thu Jan 01 00:00:00 1970 +0000
49 | date: Thu Jan 01 00:00:00 1970 +0000
50 | summary: does not commute with e
50 | summary: does not commute with e
51 |
51 |
52 o changeset: 6:500cac37a696
52 o changeset: 6:500cac37a696
53 | user: test
53 | user: test
54 | date: Thu Jan 01 00:00:00 1970 +0000
54 | date: Thu Jan 01 00:00:00 1970 +0000
55 | summary: f
55 | summary: f
56 |
56 |
57 o changeset: 5:7b4e2f4b7bcd
57 o changeset: 5:7b4e2f4b7bcd
58 | user: test
58 | user: test
59 | date: Thu Jan 01 00:00:00 1970 +0000
59 | date: Thu Jan 01 00:00:00 1970 +0000
60 | summary: e
60 | summary: e
61 |
61 |
62 o changeset: 4:00f1c5383965
62 o changeset: 4:00f1c5383965
63 | user: test
63 | user: test
64 | date: Thu Jan 01 00:00:00 1970 +0000
64 | date: Thu Jan 01 00:00:00 1970 +0000
65 | summary: d
65 | summary: d
66 |
66 |
67 o changeset: 3:65a9a84f33fd
67 o changeset: 3:65a9a84f33fd
68 | user: test
68 | user: test
69 | date: Thu Jan 01 00:00:00 1970 +0000
69 | date: Thu Jan 01 00:00:00 1970 +0000
70 | summary: c
70 | summary: c
71 |
71 |
72 o changeset: 2:da6535b52e45
72 o changeset: 2:da6535b52e45
73 | user: test
73 | user: test
74 | date: Thu Jan 01 00:00:00 1970 +0000
74 | date: Thu Jan 01 00:00:00 1970 +0000
75 | summary: b
75 | summary: b
76 |
76 |
77 o changeset: 1:c1f09da44841
77 o changeset: 1:c1f09da44841
78 | user: test
78 | user: test
79 | date: Thu Jan 01 00:00:00 1970 +0000
79 | date: Thu Jan 01 00:00:00 1970 +0000
80 | summary: a
80 | summary: a
81 |
81 |
82 o changeset: 0:1715188a53c7
82 o changeset: 0:1715188a53c7
83 user: test
83 user: test
84 date: Thu Jan 01 00:00:00 1970 +0000
84 date: Thu Jan 01 00:00:00 1970 +0000
85 summary: Initial commit
85 summary: Initial commit
86
86
87
87
88 edit the history
88 edit the history
89 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
89 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
90 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
90 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
91 merging e
91 merging e
92 warning: conflicts during merge.
92 warning: conflicts during merge.
93 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
93 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
94 Fix up the change and run hg histedit --continue
94 Fix up the change and run hg histedit --continue
95
95
96 abort the edit
96 abort the edit
97 $ hg histedit --abort 2>&1 | fixbundle
97 $ hg histedit --abort 2>&1 | fixbundle
98 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
98 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
99
99
100
100
101 second edit set
101 second edit set
102
102
103 $ hg log --graph
103 $ hg log --graph
104 @ changeset: 7:39522b764e3d
104 @ changeset: 7:39522b764e3d
105 | tag: tip
105 | tag: tip
106 | user: test
106 | user: test
107 | date: Thu Jan 01 00:00:00 1970 +0000
107 | date: Thu Jan 01 00:00:00 1970 +0000
108 | summary: does not commute with e
108 | summary: does not commute with e
109 |
109 |
110 o changeset: 6:500cac37a696
110 o changeset: 6:500cac37a696
111 | user: test
111 | user: test
112 | date: Thu Jan 01 00:00:00 1970 +0000
112 | date: Thu Jan 01 00:00:00 1970 +0000
113 | summary: f
113 | summary: f
114 |
114 |
115 o changeset: 5:7b4e2f4b7bcd
115 o changeset: 5:7b4e2f4b7bcd
116 | user: test
116 | user: test
117 | date: Thu Jan 01 00:00:00 1970 +0000
117 | date: Thu Jan 01 00:00:00 1970 +0000
118 | summary: e
118 | summary: e
119 |
119 |
120 o changeset: 4:00f1c5383965
120 o changeset: 4:00f1c5383965
121 | user: test
121 | user: test
122 | date: Thu Jan 01 00:00:00 1970 +0000
122 | date: Thu Jan 01 00:00:00 1970 +0000
123 | summary: d
123 | summary: d
124 |
124 |
125 o changeset: 3:65a9a84f33fd
125 o changeset: 3:65a9a84f33fd
126 | user: test
126 | user: test
127 | date: Thu Jan 01 00:00:00 1970 +0000
127 | date: Thu Jan 01 00:00:00 1970 +0000
128 | summary: c
128 | summary: c
129 |
129 |
130 o changeset: 2:da6535b52e45
130 o changeset: 2:da6535b52e45
131 | user: test
131 | user: test
132 | date: Thu Jan 01 00:00:00 1970 +0000
132 | date: Thu Jan 01 00:00:00 1970 +0000
133 | summary: b
133 | summary: b
134 |
134 |
135 o changeset: 1:c1f09da44841
135 o changeset: 1:c1f09da44841
136 | user: test
136 | user: test
137 | date: Thu Jan 01 00:00:00 1970 +0000
137 | date: Thu Jan 01 00:00:00 1970 +0000
138 | summary: a
138 | summary: a
139 |
139 |
140 o changeset: 0:1715188a53c7
140 o changeset: 0:1715188a53c7
141 user: test
141 user: test
142 date: Thu Jan 01 00:00:00 1970 +0000
142 date: Thu Jan 01 00:00:00 1970 +0000
143 summary: Initial commit
143 summary: Initial commit
144
144
145
145
146 edit the history
146 edit the history
147 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
147 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
148 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
148 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
149 merging e
149 merging e
150 warning: conflicts during merge.
150 warning: conflicts during merge.
151 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
151 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
152 Fix up the change and run hg histedit --continue
152 Fix up the change and run hg histedit --continue
153
153
154 fix up
154 fix up
155 $ echo 'I can haz no commute' > e
155 $ echo 'I can haz no commute' > e
156 $ hg resolve --mark e
156 $ hg resolve --mark e
157 no more unresolved files
157 (no more unresolved files)
158 $ hg histedit --continue 2>&1 | fixbundle
158 $ hg histedit --continue 2>&1 | fixbundle
159 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
159 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
160 merging e
160 merging e
161 warning: conflicts during merge.
161 warning: conflicts during merge.
162 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
162 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
163 Fix up the change and run hg histedit --continue
163 Fix up the change and run hg histedit --continue
164
164
165 This failure is caused by 7b4e2f4b7bcd "e" not rebasing the non commutative
165 This failure is caused by 7b4e2f4b7bcd "e" not rebasing the non commutative
166 former children.
166 former children.
167
167
168 just continue this time
168 just continue this time
169 $ hg revert -r 'p1()' e
169 $ hg revert -r 'p1()' e
170 $ hg resolve --mark e
170 $ hg resolve --mark e
171 no more unresolved files
171 (no more unresolved files)
172 $ hg histedit --continue 2>&1 | fixbundle
172 $ hg histedit --continue 2>&1 | fixbundle
173 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
173 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
174 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
174 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
175
175
176 log after edit
176 log after edit
177 $ hg log --graph
177 $ hg log --graph
178 @ changeset: 6:7efe1373e4bc
178 @ changeset: 6:7efe1373e4bc
179 | tag: tip
179 | tag: tip
180 | user: test
180 | user: test
181 | date: Thu Jan 01 00:00:00 1970 +0000
181 | date: Thu Jan 01 00:00:00 1970 +0000
182 | summary: f
182 | summary: f
183 |
183 |
184 o changeset: 5:e334d87a1e55
184 o changeset: 5:e334d87a1e55
185 | user: test
185 | user: test
186 | date: Thu Jan 01 00:00:00 1970 +0000
186 | date: Thu Jan 01 00:00:00 1970 +0000
187 | summary: does not commute with e
187 | summary: does not commute with e
188 |
188 |
189 o changeset: 4:00f1c5383965
189 o changeset: 4:00f1c5383965
190 | user: test
190 | user: test
191 | date: Thu Jan 01 00:00:00 1970 +0000
191 | date: Thu Jan 01 00:00:00 1970 +0000
192 | summary: d
192 | summary: d
193 |
193 |
194 o changeset: 3:65a9a84f33fd
194 o changeset: 3:65a9a84f33fd
195 | user: test
195 | user: test
196 | date: Thu Jan 01 00:00:00 1970 +0000
196 | date: Thu Jan 01 00:00:00 1970 +0000
197 | summary: c
197 | summary: c
198 |
198 |
199 o changeset: 2:da6535b52e45
199 o changeset: 2:da6535b52e45
200 | user: test
200 | user: test
201 | date: Thu Jan 01 00:00:00 1970 +0000
201 | date: Thu Jan 01 00:00:00 1970 +0000
202 | summary: b
202 | summary: b
203 |
203 |
204 o changeset: 1:c1f09da44841
204 o changeset: 1:c1f09da44841
205 | user: test
205 | user: test
206 | date: Thu Jan 01 00:00:00 1970 +0000
206 | date: Thu Jan 01 00:00:00 1970 +0000
207 | summary: a
207 | summary: a
208 |
208 |
209 o changeset: 0:1715188a53c7
209 o changeset: 0:1715188a53c7
210 user: test
210 user: test
211 date: Thu Jan 01 00:00:00 1970 +0000
211 date: Thu Jan 01 00:00:00 1970 +0000
212 summary: Initial commit
212 summary: Initial commit
213
213
214
214
215 start over
215 start over
216
216
217 $ cd ..
217 $ cd ..
218
218
219 $ initrepo r2
219 $ initrepo r2
220 $ cd r2
220 $ cd r2
221 $ rm $EDITED
221 $ rm $EDITED
222 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
222 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 3 >> $EDITED
223 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
223 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 4 >> $EDITED
224 $ hg log --template 'mess {node|short} {rev} {desc}\n' -r 7 >> $EDITED
224 $ hg log --template 'mess {node|short} {rev} {desc}\n' -r 7 >> $EDITED
225 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
225 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 5 >> $EDITED
226 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
226 $ hg log --template 'pick {node|short} {rev} {desc}\n' -r 6 >> $EDITED
227 $ cat $EDITED
227 $ cat $EDITED
228 pick 65a9a84f33fd 3 c
228 pick 65a9a84f33fd 3 c
229 pick 00f1c5383965 4 d
229 pick 00f1c5383965 4 d
230 mess 39522b764e3d 7 does not commute with e
230 mess 39522b764e3d 7 does not commute with e
231 pick 7b4e2f4b7bcd 5 e
231 pick 7b4e2f4b7bcd 5 e
232 pick 500cac37a696 6 f
232 pick 500cac37a696 6 f
233
233
234 edit the history, this time with a fold action
234 edit the history, this time with a fold action
235 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
235 $ hg histedit 3 --commands $EDITED 2>&1 | fixbundle
236 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
236 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
237 merging e
237 merging e
238 warning: conflicts during merge.
238 warning: conflicts during merge.
239 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
239 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
240 Fix up the change and run hg histedit --continue
240 Fix up the change and run hg histedit --continue
241
241
242 $ echo 'I can haz no commute' > e
242 $ echo 'I can haz no commute' > e
243 $ hg resolve --mark e
243 $ hg resolve --mark e
244 no more unresolved files
244 (no more unresolved files)
245 $ hg histedit --continue 2>&1 | fixbundle
245 $ hg histedit --continue 2>&1 | fixbundle
246 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
246 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
247 merging e
247 merging e
248 warning: conflicts during merge.
248 warning: conflicts during merge.
249 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
249 merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
250 Fix up the change and run hg histedit --continue
250 Fix up the change and run hg histedit --continue
251 second edit also fails, but just continue
251 second edit also fails, but just continue
252 $ hg revert -r 'p1()' e
252 $ hg revert -r 'p1()' e
253 $ hg resolve --mark e
253 $ hg resolve --mark e
254 no more unresolved files
254 (no more unresolved files)
255 $ hg histedit --continue 2>&1 | fixbundle
255 $ hg histedit --continue 2>&1 | fixbundle
256 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
256 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
257 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
257 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
258
258
259 post message fix
259 post message fix
260 $ hg log --graph
260 $ hg log --graph
261 @ changeset: 6:7efe1373e4bc
261 @ changeset: 6:7efe1373e4bc
262 | tag: tip
262 | tag: tip
263 | user: test
263 | user: test
264 | date: Thu Jan 01 00:00:00 1970 +0000
264 | date: Thu Jan 01 00:00:00 1970 +0000
265 | summary: f
265 | summary: f
266 |
266 |
267 o changeset: 5:e334d87a1e55
267 o changeset: 5:e334d87a1e55
268 | user: test
268 | user: test
269 | date: Thu Jan 01 00:00:00 1970 +0000
269 | date: Thu Jan 01 00:00:00 1970 +0000
270 | summary: does not commute with e
270 | summary: does not commute with e
271 |
271 |
272 o changeset: 4:00f1c5383965
272 o changeset: 4:00f1c5383965
273 | user: test
273 | user: test
274 | date: Thu Jan 01 00:00:00 1970 +0000
274 | date: Thu Jan 01 00:00:00 1970 +0000
275 | summary: d
275 | summary: d
276 |
276 |
277 o changeset: 3:65a9a84f33fd
277 o changeset: 3:65a9a84f33fd
278 | user: test
278 | user: test
279 | date: Thu Jan 01 00:00:00 1970 +0000
279 | date: Thu Jan 01 00:00:00 1970 +0000
280 | summary: c
280 | summary: c
281 |
281 |
282 o changeset: 2:da6535b52e45
282 o changeset: 2:da6535b52e45
283 | user: test
283 | user: test
284 | date: Thu Jan 01 00:00:00 1970 +0000
284 | date: Thu Jan 01 00:00:00 1970 +0000
285 | summary: b
285 | summary: b
286 |
286 |
287 o changeset: 1:c1f09da44841
287 o changeset: 1:c1f09da44841
288 | user: test
288 | user: test
289 | date: Thu Jan 01 00:00:00 1970 +0000
289 | date: Thu Jan 01 00:00:00 1970 +0000
290 | summary: a
290 | summary: a
291 |
291 |
292 o changeset: 0:1715188a53c7
292 o changeset: 0:1715188a53c7
293 user: test
293 user: test
294 date: Thu Jan 01 00:00:00 1970 +0000
294 date: Thu Jan 01 00:00:00 1970 +0000
295 summary: Initial commit
295 summary: Initial commit
296
296
297
297
298 $ cd ..
298 $ cd ..
@@ -1,1310 +1,1310 b''
1 $ cat <<EOF >> $HGRCPATH
1 $ cat <<EOF >> $HGRCPATH
2 > [extensions]
2 > [extensions]
3 > keyword =
3 > keyword =
4 > mq =
4 > mq =
5 > notify =
5 > notify =
6 > record =
6 > record =
7 > transplant =
7 > transplant =
8 > [ui]
8 > [ui]
9 > interactive = true
9 > interactive = true
10 > EOF
10 > EOF
11
11
12 hide outer repo
12 hide outer repo
13 $ hg init
13 $ hg init
14
14
15 Run kwdemo before [keyword] files are set up
15 Run kwdemo before [keyword] files are set up
16 as it would succeed without uisetup otherwise
16 as it would succeed without uisetup otherwise
17
17
18 $ hg --quiet kwdemo
18 $ hg --quiet kwdemo
19 [extensions]
19 [extensions]
20 keyword =
20 keyword =
21 [keyword]
21 [keyword]
22 demo.txt =
22 demo.txt =
23 [keywordset]
23 [keywordset]
24 svn = False
24 svn = False
25 [keywordmaps]
25 [keywordmaps]
26 Author = {author|user}
26 Author = {author|user}
27 Date = {date|utcdate}
27 Date = {date|utcdate}
28 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
28 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
29 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
29 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
30 RCSFile = {file|basename},v
30 RCSFile = {file|basename},v
31 RCSfile = {file|basename},v
31 RCSfile = {file|basename},v
32 Revision = {node|short}
32 Revision = {node|short}
33 Source = {root}/{file},v
33 Source = {root}/{file},v
34 $Author: test $
34 $Author: test $
35 $Date: ????/??/?? ??:??:?? $ (glob)
35 $Date: ????/??/?? ??:??:?? $ (glob)
36 $Header: */demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
36 $Header: */demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
37 $Id: demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
37 $Id: demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
38 $RCSFile: demo.txt,v $
38 $RCSFile: demo.txt,v $
39 $RCSfile: demo.txt,v $
39 $RCSfile: demo.txt,v $
40 $Revision: ???????????? $ (glob)
40 $Revision: ???????????? $ (glob)
41 $Source: */demo.txt,v $ (glob)
41 $Source: */demo.txt,v $ (glob)
42
42
43 $ hg --quiet kwdemo "Branch = {branches}"
43 $ hg --quiet kwdemo "Branch = {branches}"
44 [extensions]
44 [extensions]
45 keyword =
45 keyword =
46 [keyword]
46 [keyword]
47 demo.txt =
47 demo.txt =
48 [keywordset]
48 [keywordset]
49 svn = False
49 svn = False
50 [keywordmaps]
50 [keywordmaps]
51 Branch = {branches}
51 Branch = {branches}
52 $Branch: demobranch $
52 $Branch: demobranch $
53
53
54 $ cat <<EOF >> $HGRCPATH
54 $ cat <<EOF >> $HGRCPATH
55 > [keyword]
55 > [keyword]
56 > ** =
56 > ** =
57 > b = ignore
57 > b = ignore
58 > i = ignore
58 > i = ignore
59 > [hooks]
59 > [hooks]
60 > EOF
60 > EOF
61 $ cp $HGRCPATH $HGRCPATH.nohooks
61 $ cp $HGRCPATH $HGRCPATH.nohooks
62 > cat <<EOF >> $HGRCPATH
62 > cat <<EOF >> $HGRCPATH
63 > commit=
63 > commit=
64 > commit.test=cp a hooktest
64 > commit.test=cp a hooktest
65 > EOF
65 > EOF
66
66
67 $ hg init Test-bndl
67 $ hg init Test-bndl
68 $ cd Test-bndl
68 $ cd Test-bndl
69
69
70 kwshrink should exit silently in empty/invalid repo
70 kwshrink should exit silently in empty/invalid repo
71
71
72 $ hg kwshrink
72 $ hg kwshrink
73
73
74 Symlinks cannot be created on Windows.
74 Symlinks cannot be created on Windows.
75 A bundle to test this was made with:
75 A bundle to test this was made with:
76 hg init t
76 hg init t
77 cd t
77 cd t
78 echo a > a
78 echo a > a
79 ln -s a sym
79 ln -s a sym
80 hg add sym
80 hg add sym
81 hg ci -m addsym -u mercurial
81 hg ci -m addsym -u mercurial
82 hg bundle --base null ../test-keyword.hg
82 hg bundle --base null ../test-keyword.hg
83
83
84 $ hg pull -u "$TESTDIR"/bundles/test-keyword.hg
84 $ hg pull -u "$TESTDIR"/bundles/test-keyword.hg
85 pulling from *test-keyword.hg (glob)
85 pulling from *test-keyword.hg (glob)
86 requesting all changes
86 requesting all changes
87 adding changesets
87 adding changesets
88 adding manifests
88 adding manifests
89 adding file changes
89 adding file changes
90 added 1 changesets with 1 changes to 1 files
90 added 1 changesets with 1 changes to 1 files
91 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
91 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
92
92
93 $ echo 'expand $Id$' > a
93 $ echo 'expand $Id$' > a
94 $ echo 'do not process $Id:' >> a
94 $ echo 'do not process $Id:' >> a
95 $ echo 'xxx $' >> a
95 $ echo 'xxx $' >> a
96 $ echo 'ignore $Id$' > b
96 $ echo 'ignore $Id$' > b
97
97
98 Output files as they were created
98 Output files as they were created
99
99
100 $ cat a b
100 $ cat a b
101 expand $Id$
101 expand $Id$
102 do not process $Id:
102 do not process $Id:
103 xxx $
103 xxx $
104 ignore $Id$
104 ignore $Id$
105
105
106 no kwfiles
106 no kwfiles
107
107
108 $ hg kwfiles
108 $ hg kwfiles
109
109
110 untracked candidates
110 untracked candidates
111
111
112 $ hg -v kwfiles --unknown
112 $ hg -v kwfiles --unknown
113 k a
113 k a
114
114
115 Add files and check status
115 Add files and check status
116
116
117 $ hg addremove
117 $ hg addremove
118 adding a
118 adding a
119 adding b
119 adding b
120 $ hg status
120 $ hg status
121 A a
121 A a
122 A b
122 A b
123
123
124
124
125 Default keyword expansion including commit hook
125 Default keyword expansion including commit hook
126 Interrupted commit should not change state or run commit hook
126 Interrupted commit should not change state or run commit hook
127
127
128 $ hg --debug commit
128 $ hg --debug commit
129 abort: empty commit message
129 abort: empty commit message
130 [255]
130 [255]
131 $ hg status
131 $ hg status
132 A a
132 A a
133 A b
133 A b
134
134
135 Commit with several checks
135 Commit with several checks
136
136
137 $ hg --debug commit -mabsym -u 'User Name <user@example.com>'
137 $ hg --debug commit -mabsym -u 'User Name <user@example.com>'
138 a
138 a
139 b
139 b
140 overwriting a expanding keywords
140 overwriting a expanding keywords
141 running hook commit.test: cp a hooktest
141 running hook commit.test: cp a hooktest
142 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
142 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
143 $ hg status
143 $ hg status
144 ? hooktest
144 ? hooktest
145 $ hg debugrebuildstate
145 $ hg debugrebuildstate
146 $ hg --quiet identify
146 $ hg --quiet identify
147 ef63ca68695b
147 ef63ca68695b
148
148
149 cat files in working directory with keywords expanded
149 cat files in working directory with keywords expanded
150
150
151 $ cat a b
151 $ cat a b
152 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
152 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
153 do not process $Id:
153 do not process $Id:
154 xxx $
154 xxx $
155 ignore $Id$
155 ignore $Id$
156
156
157 hg cat files and symlink, no expansion
157 hg cat files and symlink, no expansion
158
158
159 $ hg cat sym a b && echo
159 $ hg cat sym a b && echo
160 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
160 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
161 do not process $Id:
161 do not process $Id:
162 xxx $
162 xxx $
163 ignore $Id$
163 ignore $Id$
164 a
164 a
165
165
166 $ diff a hooktest
166 $ diff a hooktest
167
167
168 $ cp $HGRCPATH.nohooks $HGRCPATH
168 $ cp $HGRCPATH.nohooks $HGRCPATH
169 $ rm hooktest
169 $ rm hooktest
170
170
171 hg status of kw-ignored binary file starting with '\1\n'
171 hg status of kw-ignored binary file starting with '\1\n'
172
172
173 >>> open("i", "wb").write("\1\nfoo")
173 >>> open("i", "wb").write("\1\nfoo")
174 $ hg -q commit -Am metasep i
174 $ hg -q commit -Am metasep i
175 $ hg status
175 $ hg status
176 >>> open("i", "wb").write("\1\nbar")
176 >>> open("i", "wb").write("\1\nbar")
177 $ hg status
177 $ hg status
178 M i
178 M i
179 $ hg -q commit -m "modify metasep" i
179 $ hg -q commit -m "modify metasep" i
180 $ hg status --rev 2:3
180 $ hg status --rev 2:3
181 M i
181 M i
182 $ touch empty
182 $ touch empty
183 $ hg -q commit -A -m "another file"
183 $ hg -q commit -A -m "another file"
184 $ hg status -A --rev 3:4 i
184 $ hg status -A --rev 3:4 i
185 C i
185 C i
186
186
187 $ hg -q strip -n 2
187 $ hg -q strip -n 2
188
188
189 Test hook execution
189 Test hook execution
190
190
191 bundle
191 bundle
192
192
193 $ hg bundle --base null ../kw.hg
193 $ hg bundle --base null ../kw.hg
194 2 changesets found
194 2 changesets found
195 $ cd ..
195 $ cd ..
196 $ hg init Test
196 $ hg init Test
197 $ cd Test
197 $ cd Test
198
198
199 Notify on pull to check whether keywords stay as is in email
199 Notify on pull to check whether keywords stay as is in email
200 ie. if patch.diff wrapper acts as it should
200 ie. if patch.diff wrapper acts as it should
201
201
202 $ cat <<EOF >> $HGRCPATH
202 $ cat <<EOF >> $HGRCPATH
203 > [hooks]
203 > [hooks]
204 > incoming.notify = python:hgext.notify.hook
204 > incoming.notify = python:hgext.notify.hook
205 > [notify]
205 > [notify]
206 > sources = pull
206 > sources = pull
207 > diffstat = False
207 > diffstat = False
208 > maxsubject = 15
208 > maxsubject = 15
209 > [reposubs]
209 > [reposubs]
210 > * = Test
210 > * = Test
211 > EOF
211 > EOF
212
212
213 Pull from bundle and trigger notify
213 Pull from bundle and trigger notify
214
214
215 $ hg pull -u ../kw.hg
215 $ hg pull -u ../kw.hg
216 pulling from ../kw.hg
216 pulling from ../kw.hg
217 requesting all changes
217 requesting all changes
218 adding changesets
218 adding changesets
219 adding manifests
219 adding manifests
220 adding file changes
220 adding file changes
221 added 2 changesets with 3 changes to 3 files
221 added 2 changesets with 3 changes to 3 files
222 Content-Type: text/plain; charset="us-ascii"
222 Content-Type: text/plain; charset="us-ascii"
223 MIME-Version: 1.0
223 MIME-Version: 1.0
224 Content-Transfer-Encoding: 7bit
224 Content-Transfer-Encoding: 7bit
225 Date: * (glob)
225 Date: * (glob)
226 Subject: changeset in...
226 Subject: changeset in...
227 From: mercurial
227 From: mercurial
228 X-Hg-Notification: changeset a2392c293916
228 X-Hg-Notification: changeset a2392c293916
229 Message-Id: <hg.a2392c293916*> (glob)
229 Message-Id: <hg.a2392c293916*> (glob)
230 To: Test
230 To: Test
231
231
232 changeset a2392c293916 in $TESTTMP/Test (glob)
232 changeset a2392c293916 in $TESTTMP/Test (glob)
233 details: $TESTTMP/Test?cmd=changeset;node=a2392c293916
233 details: $TESTTMP/Test?cmd=changeset;node=a2392c293916
234 description:
234 description:
235 addsym
235 addsym
236
236
237 diffs (6 lines):
237 diffs (6 lines):
238
238
239 diff -r 000000000000 -r a2392c293916 sym
239 diff -r 000000000000 -r a2392c293916 sym
240 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
240 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
241 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
241 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
242 @@ -0,0 +1,1 @@
242 @@ -0,0 +1,1 @@
243 +a
243 +a
244 \ No newline at end of file
244 \ No newline at end of file
245 Content-Type: text/plain; charset="us-ascii"
245 Content-Type: text/plain; charset="us-ascii"
246 MIME-Version: 1.0
246 MIME-Version: 1.0
247 Content-Transfer-Encoding: 7bit
247 Content-Transfer-Encoding: 7bit
248 Date:* (glob)
248 Date:* (glob)
249 Subject: changeset in...
249 Subject: changeset in...
250 From: User Name <user@example.com>
250 From: User Name <user@example.com>
251 X-Hg-Notification: changeset ef63ca68695b
251 X-Hg-Notification: changeset ef63ca68695b
252 Message-Id: <hg.ef63ca68695b*> (glob)
252 Message-Id: <hg.ef63ca68695b*> (glob)
253 To: Test
253 To: Test
254
254
255 changeset ef63ca68695b in $TESTTMP/Test (glob)
255 changeset ef63ca68695b in $TESTTMP/Test (glob)
256 details: $TESTTMP/Test?cmd=changeset;node=ef63ca68695b
256 details: $TESTTMP/Test?cmd=changeset;node=ef63ca68695b
257 description:
257 description:
258 absym
258 absym
259
259
260 diffs (12 lines):
260 diffs (12 lines):
261
261
262 diff -r a2392c293916 -r ef63ca68695b a
262 diff -r a2392c293916 -r ef63ca68695b a
263 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
263 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
264 +++ b/a Thu Jan 01 00:00:00 1970 +0000
264 +++ b/a Thu Jan 01 00:00:00 1970 +0000
265 @@ -0,0 +1,3 @@
265 @@ -0,0 +1,3 @@
266 +expand $Id$
266 +expand $Id$
267 +do not process $Id:
267 +do not process $Id:
268 +xxx $
268 +xxx $
269 diff -r a2392c293916 -r ef63ca68695b b
269 diff -r a2392c293916 -r ef63ca68695b b
270 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
270 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
271 +++ b/b Thu Jan 01 00:00:00 1970 +0000
271 +++ b/b Thu Jan 01 00:00:00 1970 +0000
272 @@ -0,0 +1,1 @@
272 @@ -0,0 +1,1 @@
273 +ignore $Id$
273 +ignore $Id$
274 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
274 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
275
275
276 $ cp $HGRCPATH.nohooks $HGRCPATH
276 $ cp $HGRCPATH.nohooks $HGRCPATH
277
277
278 Touch files and check with status
278 Touch files and check with status
279
279
280 $ touch a b
280 $ touch a b
281 $ hg status
281 $ hg status
282
282
283 Update and expand
283 Update and expand
284
284
285 $ rm sym a b
285 $ rm sym a b
286 $ hg update -C
286 $ hg update -C
287 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
287 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
288 $ cat a b
288 $ cat a b
289 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
289 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
290 do not process $Id:
290 do not process $Id:
291 xxx $
291 xxx $
292 ignore $Id$
292 ignore $Id$
293
293
294 Check whether expansion is filewise and file mode is preserved
294 Check whether expansion is filewise and file mode is preserved
295
295
296 $ echo '$Id$' > c
296 $ echo '$Id$' > c
297 $ echo 'tests for different changenodes' >> c
297 $ echo 'tests for different changenodes' >> c
298 #if unix-permissions
298 #if unix-permissions
299 $ chmod 600 c
299 $ chmod 600 c
300 $ ls -l c | cut -b 1-10
300 $ ls -l c | cut -b 1-10
301 -rw-------
301 -rw-------
302 #endif
302 #endif
303
303
304 commit file c
304 commit file c
305
305
306 $ hg commit -A -mcndiff -d '1 0' -u 'User Name <user@example.com>'
306 $ hg commit -A -mcndiff -d '1 0' -u 'User Name <user@example.com>'
307 adding c
307 adding c
308 #if unix-permissions
308 #if unix-permissions
309 $ ls -l c | cut -b 1-10
309 $ ls -l c | cut -b 1-10
310 -rw-------
310 -rw-------
311 #endif
311 #endif
312
312
313 force expansion
313 force expansion
314
314
315 $ hg -v kwexpand
315 $ hg -v kwexpand
316 overwriting a expanding keywords
316 overwriting a expanding keywords
317 overwriting c expanding keywords
317 overwriting c expanding keywords
318
318
319 compare changenodes in a and c
319 compare changenodes in a and c
320
320
321 $ cat a c
321 $ cat a c
322 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
322 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
323 do not process $Id:
323 do not process $Id:
324 xxx $
324 xxx $
325 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
325 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
326 tests for different changenodes
326 tests for different changenodes
327
327
328 record
328 record
329
329
330 $ echo '$Id$' > r
330 $ echo '$Id$' > r
331 $ hg add r
331 $ hg add r
332
332
333 record chunk
333 record chunk
334
334
335 >>> lines = open('a', 'rb').readlines()
335 >>> lines = open('a', 'rb').readlines()
336 >>> lines.insert(1, 'foo\n')
336 >>> lines.insert(1, 'foo\n')
337 >>> lines.append('bar\n')
337 >>> lines.append('bar\n')
338 >>> open('a', 'wb').writelines(lines)
338 >>> open('a', 'wb').writelines(lines)
339 $ hg record -d '10 1' -m rectest a<<EOF
339 $ hg record -d '10 1' -m rectest a<<EOF
340 > y
340 > y
341 > y
341 > y
342 > n
342 > n
343 > EOF
343 > EOF
344 diff --git a/a b/a
344 diff --git a/a b/a
345 2 hunks, 2 lines changed
345 2 hunks, 2 lines changed
346 examine changes to 'a'? [Ynesfdaq?]
346 examine changes to 'a'? [Ynesfdaq?]
347 @@ -1,3 +1,4 @@
347 @@ -1,3 +1,4 @@
348 expand $Id$
348 expand $Id$
349 +foo
349 +foo
350 do not process $Id:
350 do not process $Id:
351 xxx $
351 xxx $
352 record change 1/2 to 'a'? [Ynesfdaq?]
352 record change 1/2 to 'a'? [Ynesfdaq?]
353 @@ -2,2 +3,3 @@
353 @@ -2,2 +3,3 @@
354 do not process $Id:
354 do not process $Id:
355 xxx $
355 xxx $
356 +bar
356 +bar
357 record change 2/2 to 'a'? [Ynesfdaq?]
357 record change 2/2 to 'a'? [Ynesfdaq?]
358
358
359 $ hg identify
359 $ hg identify
360 5f5eb23505c3+ tip
360 5f5eb23505c3+ tip
361 $ hg status
361 $ hg status
362 M a
362 M a
363 A r
363 A r
364
364
365 Cat modified file a
365 Cat modified file a
366
366
367 $ cat a
367 $ cat a
368 expand $Id: a,v 5f5eb23505c3 1970/01/01 00:00:10 test $
368 expand $Id: a,v 5f5eb23505c3 1970/01/01 00:00:10 test $
369 foo
369 foo
370 do not process $Id:
370 do not process $Id:
371 xxx $
371 xxx $
372 bar
372 bar
373
373
374 Diff remaining chunk
374 Diff remaining chunk
375
375
376 $ hg diff a
376 $ hg diff a
377 diff -r 5f5eb23505c3 a
377 diff -r 5f5eb23505c3 a
378 --- a/a Thu Jan 01 00:00:09 1970 -0000
378 --- a/a Thu Jan 01 00:00:09 1970 -0000
379 +++ b/a * (glob)
379 +++ b/a * (glob)
380 @@ -2,3 +2,4 @@
380 @@ -2,3 +2,4 @@
381 foo
381 foo
382 do not process $Id:
382 do not process $Id:
383 xxx $
383 xxx $
384 +bar
384 +bar
385
385
386 $ hg rollback
386 $ hg rollback
387 repository tip rolled back to revision 2 (undo commit)
387 repository tip rolled back to revision 2 (undo commit)
388 working directory now based on revision 2
388 working directory now based on revision 2
389
389
390 Record all chunks in file a
390 Record all chunks in file a
391
391
392 $ echo foo > msg
392 $ echo foo > msg
393
393
394 - do not use "hg record -m" here!
394 - do not use "hg record -m" here!
395
395
396 $ hg record -l msg -d '11 1' a<<EOF
396 $ hg record -l msg -d '11 1' a<<EOF
397 > y
397 > y
398 > y
398 > y
399 > y
399 > y
400 > EOF
400 > EOF
401 diff --git a/a b/a
401 diff --git a/a b/a
402 2 hunks, 2 lines changed
402 2 hunks, 2 lines changed
403 examine changes to 'a'? [Ynesfdaq?]
403 examine changes to 'a'? [Ynesfdaq?]
404 @@ -1,3 +1,4 @@
404 @@ -1,3 +1,4 @@
405 expand $Id$
405 expand $Id$
406 +foo
406 +foo
407 do not process $Id:
407 do not process $Id:
408 xxx $
408 xxx $
409 record change 1/2 to 'a'? [Ynesfdaq?]
409 record change 1/2 to 'a'? [Ynesfdaq?]
410 @@ -2,2 +3,3 @@
410 @@ -2,2 +3,3 @@
411 do not process $Id:
411 do not process $Id:
412 xxx $
412 xxx $
413 +bar
413 +bar
414 record change 2/2 to 'a'? [Ynesfdaq?]
414 record change 2/2 to 'a'? [Ynesfdaq?]
415
415
416 File a should be clean
416 File a should be clean
417
417
418 $ hg status -A a
418 $ hg status -A a
419 C a
419 C a
420
420
421 rollback and revert expansion
421 rollback and revert expansion
422
422
423 $ cat a
423 $ cat a
424 expand $Id: a,v 78e0a02d76aa 1970/01/01 00:00:11 test $
424 expand $Id: a,v 78e0a02d76aa 1970/01/01 00:00:11 test $
425 foo
425 foo
426 do not process $Id:
426 do not process $Id:
427 xxx $
427 xxx $
428 bar
428 bar
429 $ hg --verbose rollback
429 $ hg --verbose rollback
430 repository tip rolled back to revision 2 (undo commit)
430 repository tip rolled back to revision 2 (undo commit)
431 working directory now based on revision 2
431 working directory now based on revision 2
432 overwriting a expanding keywords
432 overwriting a expanding keywords
433 $ hg status a
433 $ hg status a
434 M a
434 M a
435 $ cat a
435 $ cat a
436 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
436 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
437 foo
437 foo
438 do not process $Id:
438 do not process $Id:
439 xxx $
439 xxx $
440 bar
440 bar
441 $ echo '$Id$' > y
441 $ echo '$Id$' > y
442 $ echo '$Id$' > z
442 $ echo '$Id$' > z
443 $ hg add y
443 $ hg add y
444 $ hg commit -Am "rollback only" z
444 $ hg commit -Am "rollback only" z
445 $ cat z
445 $ cat z
446 $Id: z,v 45a5d3adce53 1970/01/01 00:00:00 test $
446 $Id: z,v 45a5d3adce53 1970/01/01 00:00:00 test $
447 $ hg --verbose rollback
447 $ hg --verbose rollback
448 repository tip rolled back to revision 2 (undo commit)
448 repository tip rolled back to revision 2 (undo commit)
449 working directory now based on revision 2
449 working directory now based on revision 2
450 overwriting z shrinking keywords
450 overwriting z shrinking keywords
451
451
452 Only z should be overwritten
452 Only z should be overwritten
453
453
454 $ hg status a y z
454 $ hg status a y z
455 M a
455 M a
456 A y
456 A y
457 A z
457 A z
458 $ cat z
458 $ cat z
459 $Id$
459 $Id$
460 $ hg forget y z
460 $ hg forget y z
461 $ rm y z
461 $ rm y z
462
462
463 record added file alone
463 record added file alone
464
464
465 $ hg -v record -l msg -d '12 2' r<<EOF
465 $ hg -v record -l msg -d '12 2' r<<EOF
466 > y
466 > y
467 > EOF
467 > EOF
468 diff --git a/r b/r
468 diff --git a/r b/r
469 new file mode 100644
469 new file mode 100644
470 examine changes to 'r'? [Ynesfdaq?]
470 examine changes to 'r'? [Ynesfdaq?]
471 r
471 r
472 committed changeset 3:82a2f715724d
472 committed changeset 3:82a2f715724d
473 overwriting r expanding keywords
473 overwriting r expanding keywords
474 - status call required for dirstate.normallookup() check
474 - status call required for dirstate.normallookup() check
475 $ hg status r
475 $ hg status r
476 $ hg --verbose rollback
476 $ hg --verbose rollback
477 repository tip rolled back to revision 2 (undo commit)
477 repository tip rolled back to revision 2 (undo commit)
478 working directory now based on revision 2
478 working directory now based on revision 2
479 overwriting r shrinking keywords
479 overwriting r shrinking keywords
480 $ hg forget r
480 $ hg forget r
481 $ rm msg r
481 $ rm msg r
482 $ hg update -C
482 $ hg update -C
483 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
483 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
484
484
485 record added keyword ignored file
485 record added keyword ignored file
486
486
487 $ echo '$Id$' > i
487 $ echo '$Id$' > i
488 $ hg add i
488 $ hg add i
489 $ hg --verbose record -d '13 1' -m recignored<<EOF
489 $ hg --verbose record -d '13 1' -m recignored<<EOF
490 > y
490 > y
491 > EOF
491 > EOF
492 diff --git a/i b/i
492 diff --git a/i b/i
493 new file mode 100644
493 new file mode 100644
494 examine changes to 'i'? [Ynesfdaq?]
494 examine changes to 'i'? [Ynesfdaq?]
495 i
495 i
496 committed changeset 3:9f40ceb5a072
496 committed changeset 3:9f40ceb5a072
497 $ cat i
497 $ cat i
498 $Id$
498 $Id$
499 $ hg -q rollback
499 $ hg -q rollback
500 $ hg forget i
500 $ hg forget i
501 $ rm i
501 $ rm i
502
502
503 amend
503 amend
504
504
505 $ echo amend >> a
505 $ echo amend >> a
506 $ echo amend >> b
506 $ echo amend >> b
507 $ hg -q commit -d '14 1' -m 'prepare amend'
507 $ hg -q commit -d '14 1' -m 'prepare amend'
508
508
509 $ hg --debug commit --amend -d '15 1' -m 'amend without changes' | grep keywords
509 $ hg --debug commit --amend -d '15 1' -m 'amend without changes' | grep keywords
510 overwriting a expanding keywords
510 overwriting a expanding keywords
511 $ hg -q id
511 $ hg -q id
512 67d8c481a6be
512 67d8c481a6be
513 $ head -1 a
513 $ head -1 a
514 expand $Id: a,v 67d8c481a6be 1970/01/01 00:00:15 test $
514 expand $Id: a,v 67d8c481a6be 1970/01/01 00:00:15 test $
515
515
516 $ hg -q strip -n tip
516 $ hg -q strip -n tip
517
517
518 Test patch queue repo
518 Test patch queue repo
519
519
520 $ hg init --mq
520 $ hg init --mq
521 $ hg qimport -r tip -n mqtest.diff
521 $ hg qimport -r tip -n mqtest.diff
522 $ hg commit --mq -m mqtest
522 $ hg commit --mq -m mqtest
523
523
524 Keywords should not be expanded in patch
524 Keywords should not be expanded in patch
525
525
526 $ cat .hg/patches/mqtest.diff
526 $ cat .hg/patches/mqtest.diff
527 # HG changeset patch
527 # HG changeset patch
528 # User User Name <user@example.com>
528 # User User Name <user@example.com>
529 # Date 1 0
529 # Date 1 0
530 # Thu Jan 01 00:00:01 1970 +0000
530 # Thu Jan 01 00:00:01 1970 +0000
531 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
531 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
532 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
532 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
533 cndiff
533 cndiff
534
534
535 diff -r ef63ca68695b -r 40a904bbbe4c c
535 diff -r ef63ca68695b -r 40a904bbbe4c c
536 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
536 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
537 +++ b/c Thu Jan 01 00:00:01 1970 +0000
537 +++ b/c Thu Jan 01 00:00:01 1970 +0000
538 @@ -0,0 +1,2 @@
538 @@ -0,0 +1,2 @@
539 +$Id$
539 +$Id$
540 +tests for different changenodes
540 +tests for different changenodes
541
541
542 $ hg qpop
542 $ hg qpop
543 popping mqtest.diff
543 popping mqtest.diff
544 patch queue now empty
544 patch queue now empty
545
545
546 qgoto, implying qpush, should expand
546 qgoto, implying qpush, should expand
547
547
548 $ hg qgoto mqtest.diff
548 $ hg qgoto mqtest.diff
549 applying mqtest.diff
549 applying mqtest.diff
550 now at: mqtest.diff
550 now at: mqtest.diff
551 $ cat c
551 $ cat c
552 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
552 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
553 tests for different changenodes
553 tests for different changenodes
554 $ hg cat c
554 $ hg cat c
555 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
555 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
556 tests for different changenodes
556 tests for different changenodes
557
557
558 Keywords should not be expanded in filelog
558 Keywords should not be expanded in filelog
559
559
560 $ hg --config 'extensions.keyword=!' cat c
560 $ hg --config 'extensions.keyword=!' cat c
561 $Id$
561 $Id$
562 tests for different changenodes
562 tests for different changenodes
563
563
564 qpop and move on
564 qpop and move on
565
565
566 $ hg qpop
566 $ hg qpop
567 popping mqtest.diff
567 popping mqtest.diff
568 patch queue now empty
568 patch queue now empty
569
569
570 Copy and show added kwfiles
570 Copy and show added kwfiles
571
571
572 $ hg cp a c
572 $ hg cp a c
573 $ hg kwfiles
573 $ hg kwfiles
574 a
574 a
575 c
575 c
576
576
577 Commit and show expansion in original and copy
577 Commit and show expansion in original and copy
578
578
579 $ hg --debug commit -ma2c -d '1 0' -u 'User Name <user@example.com>'
579 $ hg --debug commit -ma2c -d '1 0' -u 'User Name <user@example.com>'
580 invalid branchheads cache (served): tip differs
580 invalid branchheads cache (served): tip differs
581 c
581 c
582 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
582 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
583 invalid branchheads cache (served): tip differs
583 invalid branchheads cache (served): tip differs
584 overwriting c expanding keywords
584 overwriting c expanding keywords
585 committed changeset 2:25736cf2f5cbe41f6be4e6784ef6ecf9f3bbcc7d
585 committed changeset 2:25736cf2f5cbe41f6be4e6784ef6ecf9f3bbcc7d
586 $ cat a c
586 $ cat a c
587 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
587 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
588 do not process $Id:
588 do not process $Id:
589 xxx $
589 xxx $
590 expand $Id: c,v 25736cf2f5cb 1970/01/01 00:00:01 user $
590 expand $Id: c,v 25736cf2f5cb 1970/01/01 00:00:01 user $
591 do not process $Id:
591 do not process $Id:
592 xxx $
592 xxx $
593
593
594 Touch copied c and check its status
594 Touch copied c and check its status
595
595
596 $ touch c
596 $ touch c
597 $ hg status
597 $ hg status
598
598
599 Copy kwfile to keyword ignored file unexpanding keywords
599 Copy kwfile to keyword ignored file unexpanding keywords
600
600
601 $ hg --verbose copy a i
601 $ hg --verbose copy a i
602 copying a to i
602 copying a to i
603 overwriting i shrinking keywords
603 overwriting i shrinking keywords
604 $ head -n 1 i
604 $ head -n 1 i
605 expand $Id$
605 expand $Id$
606 $ hg forget i
606 $ hg forget i
607 $ rm i
607 $ rm i
608
608
609 Copy ignored file to ignored file: no overwriting
609 Copy ignored file to ignored file: no overwriting
610
610
611 $ hg --verbose copy b i
611 $ hg --verbose copy b i
612 copying b to i
612 copying b to i
613 $ hg forget i
613 $ hg forget i
614 $ rm i
614 $ rm i
615
615
616 cp symlink file; hg cp -A symlink file (part1)
616 cp symlink file; hg cp -A symlink file (part1)
617 - copied symlink points to kwfile: overwrite
617 - copied symlink points to kwfile: overwrite
618
618
619 #if symlink
619 #if symlink
620 $ cp sym i
620 $ cp sym i
621 $ ls -l i
621 $ ls -l i
622 -rw-r--r--* (glob)
622 -rw-r--r--* (glob)
623 $ head -1 i
623 $ head -1 i
624 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
624 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
625 $ hg copy --after --verbose sym i
625 $ hg copy --after --verbose sym i
626 copying sym to i
626 copying sym to i
627 overwriting i shrinking keywords
627 overwriting i shrinking keywords
628 $ head -1 i
628 $ head -1 i
629 expand $Id$
629 expand $Id$
630 $ hg forget i
630 $ hg forget i
631 $ rm i
631 $ rm i
632 #endif
632 #endif
633
633
634 Test different options of hg kwfiles
634 Test different options of hg kwfiles
635
635
636 $ hg kwfiles
636 $ hg kwfiles
637 a
637 a
638 c
638 c
639 $ hg -v kwfiles --ignore
639 $ hg -v kwfiles --ignore
640 I b
640 I b
641 I sym
641 I sym
642 $ hg kwfiles --all
642 $ hg kwfiles --all
643 K a
643 K a
644 K c
644 K c
645 I b
645 I b
646 I sym
646 I sym
647
647
648 Diff specific revision
648 Diff specific revision
649
649
650 $ hg diff --rev 1
650 $ hg diff --rev 1
651 diff -r ef63ca68695b c
651 diff -r ef63ca68695b c
652 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
652 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
653 +++ b/c * (glob)
653 +++ b/c * (glob)
654 @@ -0,0 +1,3 @@
654 @@ -0,0 +1,3 @@
655 +expand $Id$
655 +expand $Id$
656 +do not process $Id:
656 +do not process $Id:
657 +xxx $
657 +xxx $
658
658
659 Status after rollback:
659 Status after rollback:
660
660
661 $ hg rollback
661 $ hg rollback
662 repository tip rolled back to revision 1 (undo commit)
662 repository tip rolled back to revision 1 (undo commit)
663 working directory now based on revision 1
663 working directory now based on revision 1
664 $ hg status
664 $ hg status
665 A c
665 A c
666 $ hg update --clean
666 $ hg update --clean
667 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
667 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
668
668
669 #if symlink
669 #if symlink
670
670
671 cp symlink file; hg cp -A symlink file (part2)
671 cp symlink file; hg cp -A symlink file (part2)
672 - copied symlink points to kw ignored file: do not overwrite
672 - copied symlink points to kw ignored file: do not overwrite
673
673
674 $ cat a > i
674 $ cat a > i
675 $ ln -s i symignored
675 $ ln -s i symignored
676 $ hg commit -Am 'fake expansion in ignored and symlink' i symignored
676 $ hg commit -Am 'fake expansion in ignored and symlink' i symignored
677 $ cp symignored x
677 $ cp symignored x
678 $ hg copy --after --verbose symignored x
678 $ hg copy --after --verbose symignored x
679 copying symignored to x
679 copying symignored to x
680 $ head -n 1 x
680 $ head -n 1 x
681 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
681 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
682 $ hg forget x
682 $ hg forget x
683 $ rm x
683 $ rm x
684
684
685 $ hg rollback
685 $ hg rollback
686 repository tip rolled back to revision 1 (undo commit)
686 repository tip rolled back to revision 1 (undo commit)
687 working directory now based on revision 1
687 working directory now based on revision 1
688 $ hg update --clean
688 $ hg update --clean
689 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
689 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
690 $ rm i symignored
690 $ rm i symignored
691
691
692 #endif
692 #endif
693
693
694 Custom keywordmaps as argument to kwdemo
694 Custom keywordmaps as argument to kwdemo
695
695
696 $ hg --quiet kwdemo "Xinfo = {author}: {desc}"
696 $ hg --quiet kwdemo "Xinfo = {author}: {desc}"
697 [extensions]
697 [extensions]
698 keyword =
698 keyword =
699 [keyword]
699 [keyword]
700 ** =
700 ** =
701 b = ignore
701 b = ignore
702 demo.txt =
702 demo.txt =
703 i = ignore
703 i = ignore
704 [keywordset]
704 [keywordset]
705 svn = False
705 svn = False
706 [keywordmaps]
706 [keywordmaps]
707 Xinfo = {author}: {desc}
707 Xinfo = {author}: {desc}
708 $Xinfo: test: hg keyword configuration and expansion example $
708 $Xinfo: test: hg keyword configuration and expansion example $
709
709
710 Configure custom keywordmaps
710 Configure custom keywordmaps
711
711
712 $ cat <<EOF >>$HGRCPATH
712 $ cat <<EOF >>$HGRCPATH
713 > [keywordmaps]
713 > [keywordmaps]
714 > Id = {file} {node|short} {date|rfc822date} {author|user}
714 > Id = {file} {node|short} {date|rfc822date} {author|user}
715 > Xinfo = {author}: {desc}
715 > Xinfo = {author}: {desc}
716 > EOF
716 > EOF
717
717
718 Cat and hg cat files before custom expansion
718 Cat and hg cat files before custom expansion
719
719
720 $ cat a b
720 $ cat a b
721 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
721 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
722 do not process $Id:
722 do not process $Id:
723 xxx $
723 xxx $
724 ignore $Id$
724 ignore $Id$
725 $ hg cat sym a b && echo
725 $ hg cat sym a b && echo
726 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
726 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
727 do not process $Id:
727 do not process $Id:
728 xxx $
728 xxx $
729 ignore $Id$
729 ignore $Id$
730 a
730 a
731
731
732 Write custom keyword and prepare multi-line commit message
732 Write custom keyword and prepare multi-line commit message
733
733
734 $ echo '$Xinfo$' >> a
734 $ echo '$Xinfo$' >> a
735 $ cat <<EOF >> log
735 $ cat <<EOF >> log
736 > firstline
736 > firstline
737 > secondline
737 > secondline
738 > EOF
738 > EOF
739
739
740 Interrupted commit should not change state
740 Interrupted commit should not change state
741
741
742 $ hg commit
742 $ hg commit
743 abort: empty commit message
743 abort: empty commit message
744 [255]
744 [255]
745 $ hg status
745 $ hg status
746 M a
746 M a
747 ? c
747 ? c
748 ? log
748 ? log
749
749
750 Commit with multi-line message and custom expansion
750 Commit with multi-line message and custom expansion
751
751
752 |Note:
752 |Note:
753 |
753 |
754 | After the last rollback, the "served" branchheads cache became invalid, but
754 | After the last rollback, the "served" branchheads cache became invalid, but
755 | all changesets in the repo were public. For filtering this means:
755 | all changesets in the repo were public. For filtering this means:
756 | "immutable" == "served" == ΓΈ.
756 | "immutable" == "served" == ΓΈ.
757 |
757 |
758 | As the "served" cache is invalid, we fall back to the "immutable" cache. But
758 | As the "served" cache is invalid, we fall back to the "immutable" cache. But
759 | no update is needed between "immutable" and "served" and the "served" cache
759 | no update is needed between "immutable" and "served" and the "served" cache
760 | is not updated on disk. The on-disk version therefore stays invalid for some
760 | is not updated on disk. The on-disk version therefore stays invalid for some
761 | time. This explains why the "served" branchheads cache is detected as
761 | time. This explains why the "served" branchheads cache is detected as
762 | invalid here.
762 | invalid here.
763
763
764 $ hg --debug commit -l log -d '2 0' -u 'User Name <user@example.com>'
764 $ hg --debug commit -l log -d '2 0' -u 'User Name <user@example.com>'
765 invalid branchheads cache (served): tip differs
765 invalid branchheads cache (served): tip differs
766 a
766 a
767 invalid branchheads cache (served): tip differs
767 invalid branchheads cache (served): tip differs
768 overwriting a expanding keywords
768 overwriting a expanding keywords
769 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
769 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
770 $ rm log
770 $ rm log
771
771
772 Stat, verify and show custom expansion (firstline)
772 Stat, verify and show custom expansion (firstline)
773
773
774 $ hg status
774 $ hg status
775 ? c
775 ? c
776 $ hg verify
776 $ hg verify
777 checking changesets
777 checking changesets
778 checking manifests
778 checking manifests
779 crosschecking files in changesets and manifests
779 crosschecking files in changesets and manifests
780 checking files
780 checking files
781 3 files, 3 changesets, 4 total revisions
781 3 files, 3 changesets, 4 total revisions
782 $ cat a b
782 $ cat a b
783 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
783 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
784 do not process $Id:
784 do not process $Id:
785 xxx $
785 xxx $
786 $Xinfo: User Name <user@example.com>: firstline $
786 $Xinfo: User Name <user@example.com>: firstline $
787 ignore $Id$
787 ignore $Id$
788 $ hg cat sym a b && echo
788 $ hg cat sym a b && echo
789 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
789 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
790 do not process $Id:
790 do not process $Id:
791 xxx $
791 xxx $
792 $Xinfo: User Name <user@example.com>: firstline $
792 $Xinfo: User Name <user@example.com>: firstline $
793 ignore $Id$
793 ignore $Id$
794 a
794 a
795
795
796 annotate
796 annotate
797
797
798 $ hg annotate a
798 $ hg annotate a
799 1: expand $Id$
799 1: expand $Id$
800 1: do not process $Id:
800 1: do not process $Id:
801 1: xxx $
801 1: xxx $
802 2: $Xinfo$
802 2: $Xinfo$
803
803
804 remove with status checks
804 remove with status checks
805
805
806 $ hg debugrebuildstate
806 $ hg debugrebuildstate
807 $ hg remove a
807 $ hg remove a
808 $ hg --debug commit -m rma
808 $ hg --debug commit -m rma
809 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
809 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
810 $ hg status
810 $ hg status
811 ? c
811 ? c
812
812
813 Rollback, revert, and check expansion
813 Rollback, revert, and check expansion
814
814
815 $ hg rollback
815 $ hg rollback
816 repository tip rolled back to revision 2 (undo commit)
816 repository tip rolled back to revision 2 (undo commit)
817 working directory now based on revision 2
817 working directory now based on revision 2
818 $ hg status
818 $ hg status
819 R a
819 R a
820 ? c
820 ? c
821 $ hg revert --no-backup --rev tip a
821 $ hg revert --no-backup --rev tip a
822 $ cat a
822 $ cat a
823 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
823 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
824 do not process $Id:
824 do not process $Id:
825 xxx $
825 xxx $
826 $Xinfo: User Name <user@example.com>: firstline $
826 $Xinfo: User Name <user@example.com>: firstline $
827
827
828 Clone to test global and local configurations
828 Clone to test global and local configurations
829
829
830 $ cd ..
830 $ cd ..
831
831
832 Expansion in destination with global configuration
832 Expansion in destination with global configuration
833
833
834 $ hg --quiet clone Test globalconf
834 $ hg --quiet clone Test globalconf
835 $ cat globalconf/a
835 $ cat globalconf/a
836 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
836 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
837 do not process $Id:
837 do not process $Id:
838 xxx $
838 xxx $
839 $Xinfo: User Name <user@example.com>: firstline $
839 $Xinfo: User Name <user@example.com>: firstline $
840
840
841 No expansion in destination with local configuration in origin only
841 No expansion in destination with local configuration in origin only
842
842
843 $ hg --quiet --config 'keyword.**=ignore' clone Test localconf
843 $ hg --quiet --config 'keyword.**=ignore' clone Test localconf
844 $ cat localconf/a
844 $ cat localconf/a
845 expand $Id$
845 expand $Id$
846 do not process $Id:
846 do not process $Id:
847 xxx $
847 xxx $
848 $Xinfo$
848 $Xinfo$
849
849
850 Clone to test incoming
850 Clone to test incoming
851
851
852 $ hg clone -r1 Test Test-a
852 $ hg clone -r1 Test Test-a
853 adding changesets
853 adding changesets
854 adding manifests
854 adding manifests
855 adding file changes
855 adding file changes
856 added 2 changesets with 3 changes to 3 files
856 added 2 changesets with 3 changes to 3 files
857 updating to branch default
857 updating to branch default
858 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
858 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
859 $ cd Test-a
859 $ cd Test-a
860 $ cat <<EOF >> .hg/hgrc
860 $ cat <<EOF >> .hg/hgrc
861 > [paths]
861 > [paths]
862 > default = ../Test
862 > default = ../Test
863 > EOF
863 > EOF
864 $ hg incoming
864 $ hg incoming
865 comparing with $TESTTMP/Test (glob)
865 comparing with $TESTTMP/Test (glob)
866 searching for changes
866 searching for changes
867 changeset: 2:bb948857c743
867 changeset: 2:bb948857c743
868 tag: tip
868 tag: tip
869 user: User Name <user@example.com>
869 user: User Name <user@example.com>
870 date: Thu Jan 01 00:00:02 1970 +0000
870 date: Thu Jan 01 00:00:02 1970 +0000
871 summary: firstline
871 summary: firstline
872
872
873 Imported patch should not be rejected
873 Imported patch should not be rejected
874
874
875 >>> import re
875 >>> import re
876 >>> text = re.sub(r'(Id.*)', r'\1 rejecttest', open('a').read())
876 >>> text = re.sub(r'(Id.*)', r'\1 rejecttest', open('a').read())
877 >>> open('a', 'wb').write(text)
877 >>> open('a', 'wb').write(text)
878 $ hg --debug commit -m'rejects?' -d '3 0' -u 'User Name <user@example.com>'
878 $ hg --debug commit -m'rejects?' -d '3 0' -u 'User Name <user@example.com>'
879 a
879 a
880 overwriting a expanding keywords
880 overwriting a expanding keywords
881 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
881 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
882 $ hg export -o ../rejecttest.diff tip
882 $ hg export -o ../rejecttest.diff tip
883 $ cd ../Test
883 $ cd ../Test
884 $ hg import ../rejecttest.diff
884 $ hg import ../rejecttest.diff
885 applying ../rejecttest.diff
885 applying ../rejecttest.diff
886 $ cat a b
886 $ cat a b
887 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
887 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
888 do not process $Id: rejecttest
888 do not process $Id: rejecttest
889 xxx $
889 xxx $
890 $Xinfo: User Name <user@example.com>: rejects? $
890 $Xinfo: User Name <user@example.com>: rejects? $
891 ignore $Id$
891 ignore $Id$
892
892
893 $ hg rollback
893 $ hg rollback
894 repository tip rolled back to revision 2 (undo import)
894 repository tip rolled back to revision 2 (undo import)
895 working directory now based on revision 2
895 working directory now based on revision 2
896 $ hg update --clean
896 $ hg update --clean
897 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
897 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
898
898
899 kwexpand/kwshrink on selected files
899 kwexpand/kwshrink on selected files
900
900
901 $ mkdir x
901 $ mkdir x
902 $ hg copy a x/a
902 $ hg copy a x/a
903 $ hg --verbose kwshrink a
903 $ hg --verbose kwshrink a
904 overwriting a shrinking keywords
904 overwriting a shrinking keywords
905 - sleep required for dirstate.normal() check
905 - sleep required for dirstate.normal() check
906 $ sleep 1
906 $ sleep 1
907 $ hg status a
907 $ hg status a
908 $ hg --verbose kwexpand a
908 $ hg --verbose kwexpand a
909 overwriting a expanding keywords
909 overwriting a expanding keywords
910 $ hg status a
910 $ hg status a
911
911
912 kwexpand x/a should abort
912 kwexpand x/a should abort
913
913
914 $ hg --verbose kwexpand x/a
914 $ hg --verbose kwexpand x/a
915 abort: outstanding uncommitted changes
915 abort: outstanding uncommitted changes
916 [255]
916 [255]
917 $ cd x
917 $ cd x
918 $ hg --debug commit -m xa -d '3 0' -u 'User Name <user@example.com>'
918 $ hg --debug commit -m xa -d '3 0' -u 'User Name <user@example.com>'
919 x/a
919 x/a
920 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
920 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
921 overwriting x/a expanding keywords
921 overwriting x/a expanding keywords
922 committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4
922 committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4
923 $ cat a
923 $ cat a
924 expand $Id: x/a b4560182a3f9 Thu, 01 Jan 1970 00:00:03 +0000 user $
924 expand $Id: x/a b4560182a3f9 Thu, 01 Jan 1970 00:00:03 +0000 user $
925 do not process $Id:
925 do not process $Id:
926 xxx $
926 xxx $
927 $Xinfo: User Name <user@example.com>: xa $
927 $Xinfo: User Name <user@example.com>: xa $
928
928
929 kwshrink a inside directory x
929 kwshrink a inside directory x
930
930
931 $ hg --verbose kwshrink a
931 $ hg --verbose kwshrink a
932 overwriting x/a shrinking keywords
932 overwriting x/a shrinking keywords
933 $ cat a
933 $ cat a
934 expand $Id$
934 expand $Id$
935 do not process $Id:
935 do not process $Id:
936 xxx $
936 xxx $
937 $Xinfo$
937 $Xinfo$
938 $ cd ..
938 $ cd ..
939
939
940 kwexpand nonexistent
940 kwexpand nonexistent
941
941
942 $ hg kwexpand nonexistent
942 $ hg kwexpand nonexistent
943 nonexistent:* (glob)
943 nonexistent:* (glob)
944
944
945
945
946 #if serve
946 #if serve
947 hg serve
947 hg serve
948 - expand with hgweb file
948 - expand with hgweb file
949 - no expansion with hgweb annotate/changeset/filediff
949 - no expansion with hgweb annotate/changeset/filediff
950 - check errors
950 - check errors
951
951
952 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
952 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
953 $ cat hg.pid >> $DAEMON_PIDS
953 $ cat hg.pid >> $DAEMON_PIDS
954 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/a/?style=raw'
954 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/a/?style=raw'
955 200 Script output follows
955 200 Script output follows
956
956
957 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
957 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
958 do not process $Id:
958 do not process $Id:
959 xxx $
959 xxx $
960 $Xinfo: User Name <user@example.com>: firstline $
960 $Xinfo: User Name <user@example.com>: firstline $
961 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'annotate/tip/a/?style=raw'
961 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'annotate/tip/a/?style=raw'
962 200 Script output follows
962 200 Script output follows
963
963
964
964
965 user@1: expand $Id$
965 user@1: expand $Id$
966 user@1: do not process $Id:
966 user@1: do not process $Id:
967 user@1: xxx $
967 user@1: xxx $
968 user@2: $Xinfo$
968 user@2: $Xinfo$
969
969
970
970
971
971
972
972
973 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/tip/?style=raw'
973 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/tip/?style=raw'
974 200 Script output follows
974 200 Script output follows
975
975
976
976
977 # HG changeset patch
977 # HG changeset patch
978 # User User Name <user@example.com>
978 # User User Name <user@example.com>
979 # Date 3 0
979 # Date 3 0
980 # Node ID b4560182a3f9a358179fd2d835c15e9da379c1e4
980 # Node ID b4560182a3f9a358179fd2d835c15e9da379c1e4
981 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
981 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
982 xa
982 xa
983
983
984 diff -r bb948857c743 -r b4560182a3f9 x/a
984 diff -r bb948857c743 -r b4560182a3f9 x/a
985 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
985 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
986 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
986 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
987 @@ -0,0 +1,4 @@
987 @@ -0,0 +1,4 @@
988 +expand $Id$
988 +expand $Id$
989 +do not process $Id:
989 +do not process $Id:
990 +xxx $
990 +xxx $
991 +$Xinfo$
991 +$Xinfo$
992
992
993 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/bb948857c743/a?style=raw'
993 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/bb948857c743/a?style=raw'
994 200 Script output follows
994 200 Script output follows
995
995
996
996
997 diff -r ef63ca68695b -r bb948857c743 a
997 diff -r ef63ca68695b -r bb948857c743 a
998 --- a/a Thu Jan 01 00:00:00 1970 +0000
998 --- a/a Thu Jan 01 00:00:00 1970 +0000
999 +++ b/a Thu Jan 01 00:00:02 1970 +0000
999 +++ b/a Thu Jan 01 00:00:02 1970 +0000
1000 @@ -1,3 +1,4 @@
1000 @@ -1,3 +1,4 @@
1001 expand $Id$
1001 expand $Id$
1002 do not process $Id:
1002 do not process $Id:
1003 xxx $
1003 xxx $
1004 +$Xinfo$
1004 +$Xinfo$
1005
1005
1006
1006
1007
1007
1008
1008
1009 $ cat errors.log
1009 $ cat errors.log
1010 #endif
1010 #endif
1011
1011
1012 Prepare merge and resolve tests
1012 Prepare merge and resolve tests
1013
1013
1014 $ echo '$Id$' > m
1014 $ echo '$Id$' > m
1015 $ hg add m
1015 $ hg add m
1016 $ hg commit -m 4kw
1016 $ hg commit -m 4kw
1017 $ echo foo >> m
1017 $ echo foo >> m
1018 $ hg commit -m 5foo
1018 $ hg commit -m 5foo
1019
1019
1020 simplemerge
1020 simplemerge
1021
1021
1022 $ hg update 4
1022 $ hg update 4
1023 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1023 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1024 $ echo foo >> m
1024 $ echo foo >> m
1025 $ hg commit -m 6foo
1025 $ hg commit -m 6foo
1026 created new head
1026 created new head
1027 $ hg merge
1027 $ hg merge
1028 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1028 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1029 (branch merge, don't forget to commit)
1029 (branch merge, don't forget to commit)
1030 $ hg commit -m simplemerge
1030 $ hg commit -m simplemerge
1031 $ cat m
1031 $ cat m
1032 $Id: m 27d48ee14f67 Thu, 01 Jan 1970 00:00:00 +0000 test $
1032 $Id: m 27d48ee14f67 Thu, 01 Jan 1970 00:00:00 +0000 test $
1033 foo
1033 foo
1034
1034
1035 conflict: keyword should stay outside conflict zone
1035 conflict: keyword should stay outside conflict zone
1036
1036
1037 $ hg update 4
1037 $ hg update 4
1038 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1038 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1039 $ echo bar >> m
1039 $ echo bar >> m
1040 $ hg commit -m 8bar
1040 $ hg commit -m 8bar
1041 created new head
1041 created new head
1042 $ hg merge
1042 $ hg merge
1043 merging m
1043 merging m
1044 warning: conflicts during merge.
1044 warning: conflicts during merge.
1045 merging m incomplete! (edit conflicts, then use 'hg resolve --mark')
1045 merging m incomplete! (edit conflicts, then use 'hg resolve --mark')
1046 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1046 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1047 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1047 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1048 [1]
1048 [1]
1049 $ cat m
1049 $ cat m
1050 $Id$
1050 $Id$
1051 <<<<<<< local: 88a80c8d172e - test: 8bar
1051 <<<<<<< local: 88a80c8d172e - test: 8bar
1052 bar
1052 bar
1053 =======
1053 =======
1054 foo
1054 foo
1055 >>>>>>> other: 85d2d2d732a5 - test: simplemerge
1055 >>>>>>> other: 85d2d2d732a5 - test: simplemerge
1056
1056
1057 resolve to local
1057 resolve to local
1058
1058
1059 $ HGMERGE=internal:local hg resolve -a
1059 $ HGMERGE=internal:local hg resolve -a
1060 no more unresolved files
1060 (no more unresolved files)
1061 $ hg commit -m localresolve
1061 $ hg commit -m localresolve
1062 $ cat m
1062 $ cat m
1063 $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
1063 $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
1064 bar
1064 bar
1065
1065
1066 Test restricted mode with transplant -b
1066 Test restricted mode with transplant -b
1067
1067
1068 $ hg update 6
1068 $ hg update 6
1069 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1069 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1070 $ hg branch foo
1070 $ hg branch foo
1071 marked working directory as branch foo
1071 marked working directory as branch foo
1072 (branches are permanent and global, did you want a bookmark?)
1072 (branches are permanent and global, did you want a bookmark?)
1073 $ mv a a.bak
1073 $ mv a a.bak
1074 $ echo foobranch > a
1074 $ echo foobranch > a
1075 $ cat a.bak >> a
1075 $ cat a.bak >> a
1076 $ rm a.bak
1076 $ rm a.bak
1077 $ hg commit -m 9foobranch
1077 $ hg commit -m 9foobranch
1078 $ hg update default
1078 $ hg update default
1079 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1079 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1080 $ hg -y transplant -b foo tip
1080 $ hg -y transplant -b foo tip
1081 applying 4aa30d025d50
1081 applying 4aa30d025d50
1082 4aa30d025d50 transplanted to e00abbf63521
1082 4aa30d025d50 transplanted to e00abbf63521
1083
1083
1084 Expansion in changeset but not in file
1084 Expansion in changeset but not in file
1085
1085
1086 $ hg tip -p
1086 $ hg tip -p
1087 changeset: 11:e00abbf63521
1087 changeset: 11:e00abbf63521
1088 tag: tip
1088 tag: tip
1089 parent: 9:800511b3a22d
1089 parent: 9:800511b3a22d
1090 user: test
1090 user: test
1091 date: Thu Jan 01 00:00:00 1970 +0000
1091 date: Thu Jan 01 00:00:00 1970 +0000
1092 summary: 9foobranch
1092 summary: 9foobranch
1093
1093
1094 diff -r 800511b3a22d -r e00abbf63521 a
1094 diff -r 800511b3a22d -r e00abbf63521 a
1095 --- a/a Thu Jan 01 00:00:00 1970 +0000
1095 --- a/a Thu Jan 01 00:00:00 1970 +0000
1096 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1096 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1097 @@ -1,3 +1,4 @@
1097 @@ -1,3 +1,4 @@
1098 +foobranch
1098 +foobranch
1099 expand $Id$
1099 expand $Id$
1100 do not process $Id:
1100 do not process $Id:
1101 xxx $
1101 xxx $
1102
1102
1103 $ head -n 2 a
1103 $ head -n 2 a
1104 foobranch
1104 foobranch
1105 expand $Id: a e00abbf63521 Thu, 01 Jan 1970 00:00:00 +0000 test $
1105 expand $Id: a e00abbf63521 Thu, 01 Jan 1970 00:00:00 +0000 test $
1106
1106
1107 Turn off expansion
1107 Turn off expansion
1108
1108
1109 $ hg -q rollback
1109 $ hg -q rollback
1110 $ hg -q update -C
1110 $ hg -q update -C
1111
1111
1112 kwshrink with unknown file u
1112 kwshrink with unknown file u
1113
1113
1114 $ cp a u
1114 $ cp a u
1115 $ hg --verbose kwshrink
1115 $ hg --verbose kwshrink
1116 overwriting a shrinking keywords
1116 overwriting a shrinking keywords
1117 overwriting m shrinking keywords
1117 overwriting m shrinking keywords
1118 overwriting x/a shrinking keywords
1118 overwriting x/a shrinking keywords
1119
1119
1120 Keywords shrunk in working directory, but not yet disabled
1120 Keywords shrunk in working directory, but not yet disabled
1121 - cat shows unexpanded keywords
1121 - cat shows unexpanded keywords
1122 - hg cat shows expanded keywords
1122 - hg cat shows expanded keywords
1123
1123
1124 $ cat a b
1124 $ cat a b
1125 expand $Id$
1125 expand $Id$
1126 do not process $Id:
1126 do not process $Id:
1127 xxx $
1127 xxx $
1128 $Xinfo$
1128 $Xinfo$
1129 ignore $Id$
1129 ignore $Id$
1130 $ hg cat sym a b && echo
1130 $ hg cat sym a b && echo
1131 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
1131 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
1132 do not process $Id:
1132 do not process $Id:
1133 xxx $
1133 xxx $
1134 $Xinfo: User Name <user@example.com>: firstline $
1134 $Xinfo: User Name <user@example.com>: firstline $
1135 ignore $Id$
1135 ignore $Id$
1136 a
1136 a
1137
1137
1138 Now disable keyword expansion
1138 Now disable keyword expansion
1139
1139
1140 $ cp $HGRCPATH $HGRCPATH.backup
1140 $ cp $HGRCPATH $HGRCPATH.backup
1141 $ rm "$HGRCPATH"
1141 $ rm "$HGRCPATH"
1142 $ cat a b
1142 $ cat a b
1143 expand $Id$
1143 expand $Id$
1144 do not process $Id:
1144 do not process $Id:
1145 xxx $
1145 xxx $
1146 $Xinfo$
1146 $Xinfo$
1147 ignore $Id$
1147 ignore $Id$
1148 $ hg cat sym a b && echo
1148 $ hg cat sym a b && echo
1149 expand $Id$
1149 expand $Id$
1150 do not process $Id:
1150 do not process $Id:
1151 xxx $
1151 xxx $
1152 $Xinfo$
1152 $Xinfo$
1153 ignore $Id$
1153 ignore $Id$
1154 a
1154 a
1155
1155
1156 enable keyword expansion again
1156 enable keyword expansion again
1157
1157
1158 $ cat $HGRCPATH.backup >> $HGRCPATH
1158 $ cat $HGRCPATH.backup >> $HGRCPATH
1159
1159
1160 Test restricted mode with unshelve
1160 Test restricted mode with unshelve
1161
1161
1162 $ cat <<EOF >> $HGRCPATH
1162 $ cat <<EOF >> $HGRCPATH
1163 > [extensions]
1163 > [extensions]
1164 > shelve =
1164 > shelve =
1165 > EOF
1165 > EOF
1166
1166
1167 $ echo xxxx >> a
1167 $ echo xxxx >> a
1168 $ hg diff
1168 $ hg diff
1169 diff -r 800511b3a22d a
1169 diff -r 800511b3a22d a
1170 --- a/a Thu Jan 01 00:00:00 1970 +0000
1170 --- a/a Thu Jan 01 00:00:00 1970 +0000
1171 +++ b/a * (glob)
1171 +++ b/a * (glob)
1172 @@ -2,3 +2,4 @@
1172 @@ -2,3 +2,4 @@
1173 do not process $Id:
1173 do not process $Id:
1174 xxx $
1174 xxx $
1175 $Xinfo$
1175 $Xinfo$
1176 +xxxx
1176 +xxxx
1177 $ hg shelve -q --name tmp
1177 $ hg shelve -q --name tmp
1178 $ hg shelve --list --patch
1178 $ hg shelve --list --patch
1179 tmp (*) changes to 'localresolve' (glob)
1179 tmp (*) changes to 'localresolve' (glob)
1180
1180
1181 diff --git a/a b/a
1181 diff --git a/a b/a
1182 --- a/a
1182 --- a/a
1183 +++ b/a
1183 +++ b/a
1184 @@ -2,3 +2,4 @@
1184 @@ -2,3 +2,4 @@
1185 do not process $Id:
1185 do not process $Id:
1186 xxx $
1186 xxx $
1187 $Xinfo$
1187 $Xinfo$
1188 +xxxx
1188 +xxxx
1189
1189
1190 $ hg update -q -C 10
1190 $ hg update -q -C 10
1191 $ hg unshelve -q tmp
1191 $ hg unshelve -q tmp
1192 $ hg diff
1192 $ hg diff
1193 diff -r 4aa30d025d50 a
1193 diff -r 4aa30d025d50 a
1194 --- a/a Thu Jan 01 00:00:00 1970 +0000
1194 --- a/a Thu Jan 01 00:00:00 1970 +0000
1195 +++ b/a * (glob)
1195 +++ b/a * (glob)
1196 @@ -3,3 +3,4 @@
1196 @@ -3,3 +3,4 @@
1197 do not process $Id:
1197 do not process $Id:
1198 xxx $
1198 xxx $
1199 $Xinfo$
1199 $Xinfo$
1200 +xxxx
1200 +xxxx
1201
1201
1202 Test restricted mode with rebase
1202 Test restricted mode with rebase
1203
1203
1204 $ cat <<EOF >> $HGRCPATH
1204 $ cat <<EOF >> $HGRCPATH
1205 > [extensions]
1205 > [extensions]
1206 > rebase =
1206 > rebase =
1207 > EOF
1207 > EOF
1208
1208
1209 $ hg update -q -C 9
1209 $ hg update -q -C 9
1210
1210
1211 $ echo xxxx >> a
1211 $ echo xxxx >> a
1212 $ hg commit -m '#11'
1212 $ hg commit -m '#11'
1213 $ hg diff -c 11
1213 $ hg diff -c 11
1214 diff -r 800511b3a22d -r b07670694489 a
1214 diff -r 800511b3a22d -r b07670694489 a
1215 --- a/a Thu Jan 01 00:00:00 1970 +0000
1215 --- a/a Thu Jan 01 00:00:00 1970 +0000
1216 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1216 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1217 @@ -2,3 +2,4 @@
1217 @@ -2,3 +2,4 @@
1218 do not process $Id:
1218 do not process $Id:
1219 xxx $
1219 xxx $
1220 $Xinfo$
1220 $Xinfo$
1221 +xxxx
1221 +xxxx
1222
1222
1223 $ hg diff -c 10
1223 $ hg diff -c 10
1224 diff -r 27d48ee14f67 -r 4aa30d025d50 a
1224 diff -r 27d48ee14f67 -r 4aa30d025d50 a
1225 --- a/a Thu Jan 01 00:00:00 1970 +0000
1225 --- a/a Thu Jan 01 00:00:00 1970 +0000
1226 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1226 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1227 @@ -1,3 +1,4 @@
1227 @@ -1,3 +1,4 @@
1228 +foobranch
1228 +foobranch
1229 expand $Id$
1229 expand $Id$
1230 do not process $Id:
1230 do not process $Id:
1231 xxx $
1231 xxx $
1232
1232
1233 $ hg rebase -q -s 10 -d 11 --keep
1233 $ hg rebase -q -s 10 -d 11 --keep
1234 $ hg diff -r 9 -r 12 a
1234 $ hg diff -r 9 -r 12 a
1235 diff -r 800511b3a22d -r 1939b927726c a
1235 diff -r 800511b3a22d -r 1939b927726c a
1236 --- a/a Thu Jan 01 00:00:00 1970 +0000
1236 --- a/a Thu Jan 01 00:00:00 1970 +0000
1237 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1237 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1238 @@ -1,4 +1,6 @@
1238 @@ -1,4 +1,6 @@
1239 +foobranch
1239 +foobranch
1240 expand $Id$
1240 expand $Id$
1241 do not process $Id:
1241 do not process $Id:
1242 xxx $
1242 xxx $
1243 $Xinfo$
1243 $Xinfo$
1244 +xxxx
1244 +xxxx
1245
1245
1246 Test restricted mode with graft
1246 Test restricted mode with graft
1247
1247
1248 $ hg graft -q 10
1248 $ hg graft -q 10
1249 $ hg diff -r 9 -r 13 a
1249 $ hg diff -r 9 -r 13 a
1250 diff -r 800511b3a22d -r 01a68de1003a a
1250 diff -r 800511b3a22d -r 01a68de1003a a
1251 --- a/a Thu Jan 01 00:00:00 1970 +0000
1251 --- a/a Thu Jan 01 00:00:00 1970 +0000
1252 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1252 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1253 @@ -1,4 +1,6 @@
1253 @@ -1,4 +1,6 @@
1254 +foobranch
1254 +foobranch
1255 expand $Id$
1255 expand $Id$
1256 do not process $Id:
1256 do not process $Id:
1257 xxx $
1257 xxx $
1258 $Xinfo$
1258 $Xinfo$
1259 +xxxx
1259 +xxxx
1260
1260
1261 Test restricted mode with backout
1261 Test restricted mode with backout
1262
1262
1263 $ hg backout -q 11
1263 $ hg backout -q 11
1264 $ hg diff a
1264 $ hg diff a
1265 diff -r 01a68de1003a a
1265 diff -r 01a68de1003a a
1266 --- a/a Thu Jan 01 00:00:00 1970 +0000
1266 --- a/a Thu Jan 01 00:00:00 1970 +0000
1267 +++ b/a * (glob)
1267 +++ b/a * (glob)
1268 @@ -3,4 +3,3 @@
1268 @@ -3,4 +3,3 @@
1269 do not process $Id:
1269 do not process $Id:
1270 xxx $
1270 xxx $
1271 $Xinfo$
1271 $Xinfo$
1272 -xxxx
1272 -xxxx
1273
1273
1274 Test restricted mode with histedit
1274 Test restricted mode with histedit
1275
1275
1276 $ cat <<EOF >> $HGRCPATH
1276 $ cat <<EOF >> $HGRCPATH
1277 > [extensions]
1277 > [extensions]
1278 > histedit =
1278 > histedit =
1279 > EOF
1279 > EOF
1280
1280
1281 $ hg commit -m 'backout #11'
1281 $ hg commit -m 'backout #11'
1282 $ hg histedit -q --command - 13 <<EOF
1282 $ hg histedit -q --command - 13 <<EOF
1283 > pick 49f5f2d940c3 14 backout #11
1283 > pick 49f5f2d940c3 14 backout #11
1284 > pick 01a68de1003a 13 9foobranch
1284 > pick 01a68de1003a 13 9foobranch
1285 > EOF
1285 > EOF
1286
1286
1287 Test restricted mode with fetch (with merge)
1287 Test restricted mode with fetch (with merge)
1288
1288
1289 $ cat <<EOF >> $HGRCPATH
1289 $ cat <<EOF >> $HGRCPATH
1290 > [extensions]
1290 > [extensions]
1291 > fetch =
1291 > fetch =
1292 > EOF
1292 > EOF
1293
1293
1294 $ hg clone -q -r 9 . ../fetch-merge
1294 $ hg clone -q -r 9 . ../fetch-merge
1295 $ cd ../fetch-merge
1295 $ cd ../fetch-merge
1296 $ hg -R ../Test export 10 | hg import -q -
1296 $ hg -R ../Test export 10 | hg import -q -
1297 $ hg fetch -q -r 11
1297 $ hg fetch -q -r 11
1298 $ hg diff -r 9 a
1298 $ hg diff -r 9 a
1299 diff -r 800511b3a22d a
1299 diff -r 800511b3a22d a
1300 --- a/a Thu Jan 01 00:00:00 1970 +0000
1300 --- a/a Thu Jan 01 00:00:00 1970 +0000
1301 +++ b/a * (glob)
1301 +++ b/a * (glob)
1302 @@ -1,4 +1,6 @@
1302 @@ -1,4 +1,6 @@
1303 +foobranch
1303 +foobranch
1304 expand $Id$
1304 expand $Id$
1305 do not process $Id:
1305 do not process $Id:
1306 xxx $
1306 xxx $
1307 $Xinfo$
1307 $Xinfo$
1308 +xxxx
1308 +xxxx
1309
1309
1310 $ cd ..
1310 $ cd ..
@@ -1,350 +1,350 b''
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
2 $ mkdir "${USERCACHE}"
2 $ mkdir "${USERCACHE}"
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > largefiles =
5 > largefiles =
6 > share =
6 > share =
7 > strip =
7 > strip =
8 > convert =
8 > convert =
9 > [largefiles]
9 > [largefiles]
10 > minsize = 0.5
10 > minsize = 0.5
11 > patterns = **.other
11 > patterns = **.other
12 > **.dat
12 > **.dat
13 > usercache=${USERCACHE}
13 > usercache=${USERCACHE}
14 > EOF
14 > EOF
15
15
16 "lfconvert" works
16 "lfconvert" works
17 $ hg init bigfile-repo
17 $ hg init bigfile-repo
18 $ cd bigfile-repo
18 $ cd bigfile-repo
19 $ cat >> .hg/hgrc <<EOF
19 $ cat >> .hg/hgrc <<EOF
20 > [extensions]
20 > [extensions]
21 > largefiles = !
21 > largefiles = !
22 > EOF
22 > EOF
23 $ mkdir sub
23 $ mkdir sub
24 $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
24 $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
25 $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
25 $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
26 $ echo normal > normal1
26 $ echo normal > normal1
27 $ echo alsonormal > sub/normal2
27 $ echo alsonormal > sub/normal2
28 $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
28 $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
29 $ hg addremove
29 $ hg addremove
30 adding large
30 adding large
31 adding large2
31 adding large2
32 adding normal1
32 adding normal1
33 adding sub/maybelarge.dat
33 adding sub/maybelarge.dat
34 adding sub/normal2
34 adding sub/normal2
35 $ hg commit -m"add large, normal1" large normal1
35 $ hg commit -m"add large, normal1" large normal1
36 $ hg commit -m"add sub/*" sub
36 $ hg commit -m"add sub/*" sub
37
37
38 Test tag parsing
38 Test tag parsing
39 $ cat >> .hgtags <<EOF
39 $ cat >> .hgtags <<EOF
40 > IncorrectlyFormattedTag!
40 > IncorrectlyFormattedTag!
41 > invalidhash sometag
41 > invalidhash sometag
42 > 0123456789abcdef anothertag
42 > 0123456789abcdef anothertag
43 > EOF
43 > EOF
44 $ hg add .hgtags
44 $ hg add .hgtags
45 $ hg commit -m"add large2" large2 .hgtags
45 $ hg commit -m"add large2" large2 .hgtags
46
46
47 Test link+rename largefile codepath
47 Test link+rename largefile codepath
48 $ [ -d .hg/largefiles ] && echo fail || echo pass
48 $ [ -d .hg/largefiles ] && echo fail || echo pass
49 pass
49 pass
50 $ cd ..
50 $ cd ..
51 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
51 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
52 initializing destination largefiles-repo
52 initializing destination largefiles-repo
53 skipping incorrectly formatted tag IncorrectlyFormattedTag!
53 skipping incorrectly formatted tag IncorrectlyFormattedTag!
54 skipping incorrectly formatted id invalidhash
54 skipping incorrectly formatted id invalidhash
55 no mapping for id 0123456789abcdef
55 no mapping for id 0123456789abcdef
56 #if symlink
56 #if symlink
57 $ hg --cwd bigfile-repo rename large2 large3
57 $ hg --cwd bigfile-repo rename large2 large3
58 $ ln -sf large bigfile-repo/large3
58 $ ln -sf large bigfile-repo/large3
59 $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
59 $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
60 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
60 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
61 initializing destination largefiles-repo-symlink
61 initializing destination largefiles-repo-symlink
62 skipping incorrectly formatted tag IncorrectlyFormattedTag!
62 skipping incorrectly formatted tag IncorrectlyFormattedTag!
63 skipping incorrectly formatted id invalidhash
63 skipping incorrectly formatted id invalidhash
64 no mapping for id 0123456789abcdef
64 no mapping for id 0123456789abcdef
65 abort: renamed/copied largefile large3 becomes symlink
65 abort: renamed/copied largefile large3 becomes symlink
66 [255]
66 [255]
67 #endif
67 #endif
68 $ cd bigfile-repo
68 $ cd bigfile-repo
69 $ hg strip --no-backup 2
69 $ hg strip --no-backup 2
70 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
70 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
71 $ cd ..
71 $ cd ..
72 $ rm -rf largefiles-repo largefiles-repo-symlink
72 $ rm -rf largefiles-repo largefiles-repo-symlink
73
73
74 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
74 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
75 initializing destination largefiles-repo
75 initializing destination largefiles-repo
76
76
77 "lfconvert" converts content correctly
77 "lfconvert" converts content correctly
78 $ cd largefiles-repo
78 $ cd largefiles-repo
79 $ hg up
79 $ hg up
80 getting changed largefiles
80 getting changed largefiles
81 2 largefiles updated, 0 removed
81 2 largefiles updated, 0 removed
82 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
82 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
83 $ hg locate
83 $ hg locate
84 .hglf/large
84 .hglf/large
85 .hglf/sub/maybelarge.dat
85 .hglf/sub/maybelarge.dat
86 normal1
86 normal1
87 sub/normal2
87 sub/normal2
88 $ cat normal1
88 $ cat normal1
89 normal
89 normal
90 $ cat sub/normal2
90 $ cat sub/normal2
91 alsonormal
91 alsonormal
92 $ "$TESTDIR/md5sum.py" large sub/maybelarge.dat
92 $ "$TESTDIR/md5sum.py" large sub/maybelarge.dat
93 ec87a838931d4d5d2e94a04644788a55 large
93 ec87a838931d4d5d2e94a04644788a55 large
94 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
94 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
95
95
96 "lfconvert" adds 'largefiles' to .hg/requires.
96 "lfconvert" adds 'largefiles' to .hg/requires.
97 $ cat .hg/requires
97 $ cat .hg/requires
98 dotencode
98 dotencode
99 fncache
99 fncache
100 largefiles
100 largefiles
101 revlogv1
101 revlogv1
102 store
102 store
103
103
104 "lfconvert" includes a newline at the end of the standin files.
104 "lfconvert" includes a newline at the end of the standin files.
105 $ cat .hglf/large .hglf/sub/maybelarge.dat
105 $ cat .hglf/large .hglf/sub/maybelarge.dat
106 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
106 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
107 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
107 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
108 $ cd ..
108 $ cd ..
109
109
110 add some changesets to rename/remove/merge
110 add some changesets to rename/remove/merge
111 $ cd bigfile-repo
111 $ cd bigfile-repo
112 $ hg mv -q sub stuff
112 $ hg mv -q sub stuff
113 $ hg commit -m"rename sub/ to stuff/"
113 $ hg commit -m"rename sub/ to stuff/"
114 $ hg update -q 1
114 $ hg update -q 1
115 $ echo blah >> normal3
115 $ echo blah >> normal3
116 $ echo blah >> sub/normal2
116 $ echo blah >> sub/normal2
117 $ echo blah >> sub/maybelarge.dat
117 $ echo blah >> sub/maybelarge.dat
118 $ "$TESTDIR/md5sum.py" sub/maybelarge.dat
118 $ "$TESTDIR/md5sum.py" sub/maybelarge.dat
119 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
119 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
120 $ hg commit -A -m"add normal3, modify sub/*"
120 $ hg commit -A -m"add normal3, modify sub/*"
121 adding normal3
121 adding normal3
122 created new head
122 created new head
123 $ hg rm large normal3
123 $ hg rm large normal3
124 $ hg commit -q -m"remove large, normal3"
124 $ hg commit -q -m"remove large, normal3"
125 $ hg merge
125 $ hg merge
126 merging sub/maybelarge.dat and stuff/maybelarge.dat to stuff/maybelarge.dat
126 merging sub/maybelarge.dat and stuff/maybelarge.dat to stuff/maybelarge.dat
127 warning: $TESTTMP/bigfile-repo/stuff/maybelarge.dat looks like a binary file. (glob)
127 warning: $TESTTMP/bigfile-repo/stuff/maybelarge.dat looks like a binary file. (glob)
128 merging stuff/maybelarge.dat incomplete! (edit conflicts, then use 'hg resolve --mark')
128 merging stuff/maybelarge.dat incomplete! (edit conflicts, then use 'hg resolve --mark')
129 merging sub/normal2 and stuff/normal2 to stuff/normal2
129 merging sub/normal2 and stuff/normal2 to stuff/normal2
130 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
130 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
131 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
131 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
132 [1]
132 [1]
133 $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
133 $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
134 $ hg resolve -m stuff/maybelarge.dat
134 $ hg resolve -m stuff/maybelarge.dat
135 no more unresolved files
135 (no more unresolved files)
136 $ hg commit -m"merge"
136 $ hg commit -m"merge"
137 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
137 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
138 @ 5:4884f215abda merge
138 @ 5:4884f215abda merge
139 |\
139 |\
140 | o 4:7285f817b77e remove large, normal3
140 | o 4:7285f817b77e remove large, normal3
141 | |
141 | |
142 | o 3:67e3892e3534 add normal3, modify sub/*
142 | o 3:67e3892e3534 add normal3, modify sub/*
143 | |
143 | |
144 o | 2:c96c8beb5d56 rename sub/ to stuff/
144 o | 2:c96c8beb5d56 rename sub/ to stuff/
145 |/
145 |/
146 o 1:020c65d24e11 add sub/*
146 o 1:020c65d24e11 add sub/*
147 |
147 |
148 o 0:117b8328f97a add large, normal1
148 o 0:117b8328f97a add large, normal1
149
149
150 $ cd ..
150 $ cd ..
151
151
152 lfconvert with rename, merge, and remove
152 lfconvert with rename, merge, and remove
153 $ rm -rf largefiles-repo
153 $ rm -rf largefiles-repo
154 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
154 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
155 initializing destination largefiles-repo
155 initializing destination largefiles-repo
156 $ cd largefiles-repo
156 $ cd largefiles-repo
157 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
157 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
158 o 5:8e05f5f2b77e merge
158 o 5:8e05f5f2b77e merge
159 |\
159 |\
160 | o 4:a5a02de7a8e4 remove large, normal3
160 | o 4:a5a02de7a8e4 remove large, normal3
161 | |
161 | |
162 | o 3:55759520c76f add normal3, modify sub/*
162 | o 3:55759520c76f add normal3, modify sub/*
163 | |
163 | |
164 o | 2:261ad3f3f037 rename sub/ to stuff/
164 o | 2:261ad3f3f037 rename sub/ to stuff/
165 |/
165 |/
166 o 1:334e5237836d add sub/*
166 o 1:334e5237836d add sub/*
167 |
167 |
168 o 0:d4892ec57ce2 add large, normal1
168 o 0:d4892ec57ce2 add large, normal1
169
169
170 $ hg locate -r 2
170 $ hg locate -r 2
171 .hglf/large
171 .hglf/large
172 .hglf/stuff/maybelarge.dat
172 .hglf/stuff/maybelarge.dat
173 normal1
173 normal1
174 stuff/normal2
174 stuff/normal2
175 $ hg locate -r 3
175 $ hg locate -r 3
176 .hglf/large
176 .hglf/large
177 .hglf/sub/maybelarge.dat
177 .hglf/sub/maybelarge.dat
178 normal1
178 normal1
179 normal3
179 normal3
180 sub/normal2
180 sub/normal2
181 $ hg locate -r 4
181 $ hg locate -r 4
182 .hglf/sub/maybelarge.dat
182 .hglf/sub/maybelarge.dat
183 normal1
183 normal1
184 sub/normal2
184 sub/normal2
185 $ hg locate -r 5
185 $ hg locate -r 5
186 .hglf/stuff/maybelarge.dat
186 .hglf/stuff/maybelarge.dat
187 normal1
187 normal1
188 stuff/normal2
188 stuff/normal2
189 $ hg update
189 $ hg update
190 getting changed largefiles
190 getting changed largefiles
191 1 largefiles updated, 0 removed
191 1 largefiles updated, 0 removed
192 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
192 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
193 $ cat stuff/normal2
193 $ cat stuff/normal2
194 alsonormal
194 alsonormal
195 blah
195 blah
196 $ "$TESTDIR/md5sum.py" stuff/maybelarge.dat
196 $ "$TESTDIR/md5sum.py" stuff/maybelarge.dat
197 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
197 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
198 $ cat .hglf/stuff/maybelarge.dat
198 $ cat .hglf/stuff/maybelarge.dat
199 76236b6a2c6102826c61af4297dd738fb3b1de38
199 76236b6a2c6102826c61af4297dd738fb3b1de38
200 $ cd ..
200 $ cd ..
201
201
202 "lfconvert" error cases
202 "lfconvert" error cases
203 $ hg lfconvert http://localhost/foo foo
203 $ hg lfconvert http://localhost/foo foo
204 abort: http://localhost/foo is not a local Mercurial repo
204 abort: http://localhost/foo is not a local Mercurial repo
205 [255]
205 [255]
206 $ hg lfconvert foo ssh://localhost/foo
206 $ hg lfconvert foo ssh://localhost/foo
207 abort: ssh://localhost/foo is not a local Mercurial repo
207 abort: ssh://localhost/foo is not a local Mercurial repo
208 [255]
208 [255]
209 $ hg lfconvert nosuchrepo foo
209 $ hg lfconvert nosuchrepo foo
210 abort: repository nosuchrepo not found!
210 abort: repository nosuchrepo not found!
211 [255]
211 [255]
212 $ hg share -q -U bigfile-repo shared
212 $ hg share -q -U bigfile-repo shared
213 $ printf 'bogus' > shared/.hg/sharedpath
213 $ printf 'bogus' > shared/.hg/sharedpath
214 $ hg lfconvert shared foo
214 $ hg lfconvert shared foo
215 abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus! (glob)
215 abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus! (glob)
216 [255]
216 [255]
217 $ hg lfconvert bigfile-repo largefiles-repo
217 $ hg lfconvert bigfile-repo largefiles-repo
218 initializing destination largefiles-repo
218 initializing destination largefiles-repo
219 abort: repository largefiles-repo already exists!
219 abort: repository largefiles-repo already exists!
220 [255]
220 [255]
221
221
222 add another largefile to the new largefiles repo
222 add another largefile to the new largefiles repo
223 $ cd largefiles-repo
223 $ cd largefiles-repo
224 $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
224 $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
225 $ hg add --lfsize=1 anotherlarge
225 $ hg add --lfsize=1 anotherlarge
226 $ hg commit -m "add anotherlarge (should be a largefile)"
226 $ hg commit -m "add anotherlarge (should be a largefile)"
227 $ cat .hglf/anotherlarge
227 $ cat .hglf/anotherlarge
228 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
228 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
229 $ cd ..
229 $ cd ..
230
230
231 round-trip: converting back to a normal (non-largefiles) repo with
231 round-trip: converting back to a normal (non-largefiles) repo with
232 "lfconvert --to-normal" should give the same as ../bigfile-repo
232 "lfconvert --to-normal" should give the same as ../bigfile-repo
233 $ cd largefiles-repo
233 $ cd largefiles-repo
234 $ hg lfconvert --to-normal . ../normal-repo
234 $ hg lfconvert --to-normal . ../normal-repo
235 initializing destination ../normal-repo
235 initializing destination ../normal-repo
236 $ cd ../normal-repo
236 $ cd ../normal-repo
237 $ cat >> .hg/hgrc <<EOF
237 $ cat >> .hg/hgrc <<EOF
238 > [extensions]
238 > [extensions]
239 > largefiles = !
239 > largefiles = !
240 > EOF
240 > EOF
241
241
242 # Hmmm: the changeset ID for rev 5 is different from the original
242 # Hmmm: the changeset ID for rev 5 is different from the original
243 # normal repo (../bigfile-repo), because the changelog filelist
243 # normal repo (../bigfile-repo), because the changelog filelist
244 # differs between the two incarnations of rev 5: this repo includes
244 # differs between the two incarnations of rev 5: this repo includes
245 # 'large' in the list, but ../bigfile-repo does not. Since rev 5
245 # 'large' in the list, but ../bigfile-repo does not. Since rev 5
246 # removes 'large' relative to the first parent in both repos, it seems
246 # removes 'large' relative to the first parent in both repos, it seems
247 # to me that lfconvert is doing a *better* job than
247 # to me that lfconvert is doing a *better* job than
248 # "hg remove" + "hg merge" + "hg commit".
248 # "hg remove" + "hg merge" + "hg commit".
249 # $ hg -R ../bigfile-repo debugdata -c 5
249 # $ hg -R ../bigfile-repo debugdata -c 5
250 # $ hg debugdata -c 5
250 # $ hg debugdata -c 5
251 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
251 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
252 o 6:1635824e6f59 add anotherlarge (should be a largefile)
252 o 6:1635824e6f59 add anotherlarge (should be a largefile)
253 |
253 |
254 o 5:7215f8deeaaf merge
254 o 5:7215f8deeaaf merge
255 |\
255 |\
256 | o 4:7285f817b77e remove large, normal3
256 | o 4:7285f817b77e remove large, normal3
257 | |
257 | |
258 | o 3:67e3892e3534 add normal3, modify sub/*
258 | o 3:67e3892e3534 add normal3, modify sub/*
259 | |
259 | |
260 o | 2:c96c8beb5d56 rename sub/ to stuff/
260 o | 2:c96c8beb5d56 rename sub/ to stuff/
261 |/
261 |/
262 o 1:020c65d24e11 add sub/*
262 o 1:020c65d24e11 add sub/*
263 |
263 |
264 o 0:117b8328f97a add large, normal1
264 o 0:117b8328f97a add large, normal1
265
265
266 $ hg update
266 $ hg update
267 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
267 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
268 $ hg locate
268 $ hg locate
269 anotherlarge
269 anotherlarge
270 normal1
270 normal1
271 stuff/maybelarge.dat
271 stuff/maybelarge.dat
272 stuff/normal2
272 stuff/normal2
273 $ [ -d .hg/largefiles ] && echo fail || echo pass
273 $ [ -d .hg/largefiles ] && echo fail || echo pass
274 pass
274 pass
275
275
276 $ cd ..
276 $ cd ..
277
277
278 Clearing the usercache ensures that commitctx doesn't try to cache largefiles
278 Clearing the usercache ensures that commitctx doesn't try to cache largefiles
279 from the working dir on a convert.
279 from the working dir on a convert.
280 $ rm "${USERCACHE}"/*
280 $ rm "${USERCACHE}"/*
281 $ hg convert largefiles-repo
281 $ hg convert largefiles-repo
282 assuming destination largefiles-repo-hg
282 assuming destination largefiles-repo-hg
283 initializing destination largefiles-repo-hg repository
283 initializing destination largefiles-repo-hg repository
284 scanning source...
284 scanning source...
285 sorting...
285 sorting...
286 converting...
286 converting...
287 6 add large, normal1
287 6 add large, normal1
288 5 add sub/*
288 5 add sub/*
289 4 rename sub/ to stuff/
289 4 rename sub/ to stuff/
290 3 add normal3, modify sub/*
290 3 add normal3, modify sub/*
291 2 remove large, normal3
291 2 remove large, normal3
292 1 merge
292 1 merge
293 0 add anotherlarge (should be a largefile)
293 0 add anotherlarge (should be a largefile)
294
294
295 $ hg -R largefiles-repo-hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
295 $ hg -R largefiles-repo-hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
296 o 6:17126745edfd add anotherlarge (should be a largefile)
296 o 6:17126745edfd add anotherlarge (should be a largefile)
297 |
297 |
298 o 5:9cc5aa7204f0 merge
298 o 5:9cc5aa7204f0 merge
299 |\
299 |\
300 | o 4:a5a02de7a8e4 remove large, normal3
300 | o 4:a5a02de7a8e4 remove large, normal3
301 | |
301 | |
302 | o 3:55759520c76f add normal3, modify sub/*
302 | o 3:55759520c76f add normal3, modify sub/*
303 | |
303 | |
304 o | 2:261ad3f3f037 rename sub/ to stuff/
304 o | 2:261ad3f3f037 rename sub/ to stuff/
305 |/
305 |/
306 o 1:334e5237836d add sub/*
306 o 1:334e5237836d add sub/*
307 |
307 |
308 o 0:d4892ec57ce2 add large, normal1
308 o 0:d4892ec57ce2 add large, normal1
309
309
310 Verify will fail (for now) if the usercache is purged before converting, since
310 Verify will fail (for now) if the usercache is purged before converting, since
311 largefiles are not cached in the converted repo's local store by the conversion
311 largefiles are not cached in the converted repo's local store by the conversion
312 process.
312 process.
313 $ hg -R largefiles-repo-hg verify --large --lfa
313 $ hg -R largefiles-repo-hg verify --large --lfa
314 checking changesets
314 checking changesets
315 checking manifests
315 checking manifests
316 crosschecking files in changesets and manifests
316 crosschecking files in changesets and manifests
317 checking files
317 checking files
318 8 files, 7 changesets, 12 total revisions
318 8 files, 7 changesets, 12 total revisions
319 searching 7 changesets for largefiles
319 searching 7 changesets for largefiles
320 changeset 0:d4892ec57ce2: large references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/2e000fa7e85759c7f4c254d4d9c33ef481e459a7 (glob)
320 changeset 0:d4892ec57ce2: large references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/2e000fa7e85759c7f4c254d4d9c33ef481e459a7 (glob)
321 changeset 1:334e5237836d: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c (glob)
321 changeset 1:334e5237836d: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c (glob)
322 changeset 2:261ad3f3f037: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c (glob)
322 changeset 2:261ad3f3f037: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c (glob)
323 changeset 3:55759520c76f: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38 (glob)
323 changeset 3:55759520c76f: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38 (glob)
324 changeset 5:9cc5aa7204f0: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38 (glob)
324 changeset 5:9cc5aa7204f0: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38 (glob)
325 changeset 6:17126745edfd: anotherlarge references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 (glob)
325 changeset 6:17126745edfd: anotherlarge references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 (glob)
326 verified existence of 6 revisions of 4 largefiles
326 verified existence of 6 revisions of 4 largefiles
327 [1]
327 [1]
328 $ hg -R largefiles-repo-hg showconfig paths
328 $ hg -R largefiles-repo-hg showconfig paths
329
329
330
330
331 Avoid a traceback if a largefile isn't available (issue3519)
331 Avoid a traceback if a largefile isn't available (issue3519)
332
332
333 Ensure the largefile can be cached in the source if necessary
333 Ensure the largefile can be cached in the source if necessary
334 $ hg clone -U largefiles-repo issue3519
334 $ hg clone -U largefiles-repo issue3519
335 $ rm -f "${USERCACHE}"/*
335 $ rm -f "${USERCACHE}"/*
336 $ hg lfconvert --to-normal issue3519 normalized3519
336 $ hg lfconvert --to-normal issue3519 normalized3519
337 initializing destination normalized3519
337 initializing destination normalized3519
338
338
339 Ensure the abort message is useful if a largefile is entirely unavailable
339 Ensure the abort message is useful if a largefile is entirely unavailable
340 $ rm -rf normalized3519
340 $ rm -rf normalized3519
341 $ rm "${USERCACHE}"/*
341 $ rm "${USERCACHE}"/*
342 $ rm issue3519/.hg/largefiles/*
342 $ rm issue3519/.hg/largefiles/*
343 $ rm largefiles-repo/.hg/largefiles/*
343 $ rm largefiles-repo/.hg/largefiles/*
344 $ hg lfconvert --to-normal issue3519 normalized3519
344 $ hg lfconvert --to-normal issue3519 normalized3519
345 initializing destination normalized3519
345 initializing destination normalized3519
346 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
346 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
347 abort: missing largefile 'large' from revision d4892ec57ce212905215fad1d9018f56b99202ad
347 abort: missing largefile 'large' from revision d4892ec57ce212905215fad1d9018f56b99202ad
348 [255]
348 [255]
349
349
350
350
@@ -1,1414 +1,1414 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 $ hg log a
48 $ hg log a
49 changeset: 0:9161b9aeaf16
49 changeset: 0:9161b9aeaf16
50 user: test
50 user: test
51 date: Thu Jan 01 00:00:01 1970 +0000
51 date: Thu Jan 01 00:00:01 1970 +0000
52 summary: a
52 summary: a
53
53
54 log on directory
54 log on directory
55
55
56 $ hg log dir
56 $ hg log dir
57 changeset: 4:7e4639b4691b
57 changeset: 4:7e4639b4691b
58 tag: tip
58 tag: tip
59 user: test
59 user: test
60 date: Thu Jan 01 00:00:05 1970 +0000
60 date: Thu Jan 01 00:00:05 1970 +0000
61 summary: e
61 summary: e
62
62
63 changeset: 2:f8954cd4dc1f
63 changeset: 2:f8954cd4dc1f
64 user: test
64 user: test
65 date: Thu Jan 01 00:00:03 1970 +0000
65 date: Thu Jan 01 00:00:03 1970 +0000
66 summary: c
66 summary: c
67
67
68 $ hg log somethingthatdoesntexist dir
68 $ hg log somethingthatdoesntexist dir
69 changeset: 4:7e4639b4691b
69 changeset: 4:7e4639b4691b
70 tag: tip
70 tag: tip
71 user: test
71 user: test
72 date: Thu Jan 01 00:00:05 1970 +0000
72 date: Thu Jan 01 00:00:05 1970 +0000
73 summary: e
73 summary: e
74
74
75 changeset: 2:f8954cd4dc1f
75 changeset: 2:f8954cd4dc1f
76 user: test
76 user: test
77 date: Thu Jan 01 00:00:03 1970 +0000
77 date: Thu Jan 01 00:00:03 1970 +0000
78 summary: c
78 summary: c
79
79
80
80
81 -f, directory
81 -f, directory
82
82
83 $ hg log -f dir
83 $ hg log -f dir
84 abort: cannot follow file not in parent revision: "dir"
84 abort: cannot follow file not in parent revision: "dir"
85 [255]
85 [255]
86
86
87 -f, a wrong style
87 -f, a wrong style
88
88
89 $ hg log -f -l1 --style something
89 $ hg log -f -l1 --style something
90 abort: style 'something' not found
90 abort: style 'something' not found
91 (available styles: bisect, changelog, compact, default, phases, xml)
91 (available styles: bisect, changelog, compact, default, phases, xml)
92 [255]
92 [255]
93
93
94 -f, phases style
94 -f, phases style
95
95
96
96
97 $ hg log -f -l1 --style phases
97 $ hg log -f -l1 --style phases
98 changeset: 4:7e4639b4691b
98 changeset: 4:7e4639b4691b
99 tag: tip
99 tag: tip
100 phase: draft
100 phase: draft
101 user: test
101 user: test
102 date: Thu Jan 01 00:00:05 1970 +0000
102 date: Thu Jan 01 00:00:05 1970 +0000
103 summary: e
103 summary: e
104
104
105
105
106 -f, but no args
106 -f, but no args
107
107
108 $ hg log -f
108 $ hg log -f
109 changeset: 4:7e4639b4691b
109 changeset: 4:7e4639b4691b
110 tag: tip
110 tag: tip
111 user: test
111 user: test
112 date: Thu Jan 01 00:00:05 1970 +0000
112 date: Thu Jan 01 00:00:05 1970 +0000
113 summary: e
113 summary: e
114
114
115 changeset: 3:2ca5ba701980
115 changeset: 3:2ca5ba701980
116 user: test
116 user: test
117 date: Thu Jan 01 00:00:04 1970 +0000
117 date: Thu Jan 01 00:00:04 1970 +0000
118 summary: d
118 summary: d
119
119
120 changeset: 2:f8954cd4dc1f
120 changeset: 2:f8954cd4dc1f
121 user: test
121 user: test
122 date: Thu Jan 01 00:00:03 1970 +0000
122 date: Thu Jan 01 00:00:03 1970 +0000
123 summary: c
123 summary: c
124
124
125 changeset: 1:d89b0a12d229
125 changeset: 1:d89b0a12d229
126 user: test
126 user: test
127 date: Thu Jan 01 00:00:02 1970 +0000
127 date: Thu Jan 01 00:00:02 1970 +0000
128 summary: b
128 summary: b
129
129
130 changeset: 0:9161b9aeaf16
130 changeset: 0:9161b9aeaf16
131 user: test
131 user: test
132 date: Thu Jan 01 00:00:01 1970 +0000
132 date: Thu Jan 01 00:00:01 1970 +0000
133 summary: a
133 summary: a
134
134
135
135
136 one rename
136 one rename
137
137
138 $ hg up -q 2
138 $ hg up -q 2
139 $ hg log -vf a
139 $ hg log -vf a
140 changeset: 0:9161b9aeaf16
140 changeset: 0:9161b9aeaf16
141 user: test
141 user: test
142 date: Thu Jan 01 00:00:01 1970 +0000
142 date: Thu Jan 01 00:00:01 1970 +0000
143 files: a f
143 files: a f
144 description:
144 description:
145 a
145 a
146
146
147
147
148
148
149 many renames
149 many renames
150
150
151 $ hg up -q tip
151 $ hg up -q tip
152 $ hg log -vf e
152 $ hg log -vf e
153 changeset: 4:7e4639b4691b
153 changeset: 4:7e4639b4691b
154 tag: tip
154 tag: tip
155 user: test
155 user: test
156 date: Thu Jan 01 00:00:05 1970 +0000
156 date: Thu Jan 01 00:00:05 1970 +0000
157 files: dir/b e
157 files: dir/b e
158 description:
158 description:
159 e
159 e
160
160
161
161
162 changeset: 2:f8954cd4dc1f
162 changeset: 2:f8954cd4dc1f
163 user: test
163 user: test
164 date: Thu Jan 01 00:00:03 1970 +0000
164 date: Thu Jan 01 00:00:03 1970 +0000
165 files: b dir/b f g
165 files: b dir/b f g
166 description:
166 description:
167 c
167 c
168
168
169
169
170 changeset: 1:d89b0a12d229
170 changeset: 1:d89b0a12d229
171 user: test
171 user: test
172 date: Thu Jan 01 00:00:02 1970 +0000
172 date: Thu Jan 01 00:00:02 1970 +0000
173 files: b g
173 files: b g
174 description:
174 description:
175 b
175 b
176
176
177
177
178 changeset: 0:9161b9aeaf16
178 changeset: 0:9161b9aeaf16
179 user: test
179 user: test
180 date: Thu Jan 01 00:00:01 1970 +0000
180 date: Thu Jan 01 00:00:01 1970 +0000
181 files: a f
181 files: a f
182 description:
182 description:
183 a
183 a
184
184
185
185
186
186
187
187
188 log -pf dir/b
188 log -pf dir/b
189
189
190 $ hg up -q 3
190 $ hg up -q 3
191 $ hg log -pf dir/b
191 $ hg log -pf dir/b
192 changeset: 2:f8954cd4dc1f
192 changeset: 2:f8954cd4dc1f
193 user: test
193 user: test
194 date: Thu Jan 01 00:00:03 1970 +0000
194 date: Thu Jan 01 00:00:03 1970 +0000
195 summary: c
195 summary: c
196
196
197 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
197 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
198 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
198 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
199 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
199 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
200 @@ -0,0 +1,1 @@
200 @@ -0,0 +1,1 @@
201 +a
201 +a
202
202
203 changeset: 1:d89b0a12d229
203 changeset: 1:d89b0a12d229
204 user: test
204 user: test
205 date: Thu Jan 01 00:00:02 1970 +0000
205 date: Thu Jan 01 00:00:02 1970 +0000
206 summary: b
206 summary: b
207
207
208 diff -r 9161b9aeaf16 -r d89b0a12d229 b
208 diff -r 9161b9aeaf16 -r d89b0a12d229 b
209 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
209 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
210 +++ b/b Thu Jan 01 00:00:02 1970 +0000
210 +++ b/b Thu Jan 01 00:00:02 1970 +0000
211 @@ -0,0 +1,1 @@
211 @@ -0,0 +1,1 @@
212 +a
212 +a
213
213
214 changeset: 0:9161b9aeaf16
214 changeset: 0:9161b9aeaf16
215 user: test
215 user: test
216 date: Thu Jan 01 00:00:01 1970 +0000
216 date: Thu Jan 01 00:00:01 1970 +0000
217 summary: a
217 summary: a
218
218
219 diff -r 000000000000 -r 9161b9aeaf16 a
219 diff -r 000000000000 -r 9161b9aeaf16 a
220 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
220 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
221 +++ b/a Thu Jan 01 00:00:01 1970 +0000
221 +++ b/a Thu Jan 01 00:00:01 1970 +0000
222 @@ -0,0 +1,1 @@
222 @@ -0,0 +1,1 @@
223 +a
223 +a
224
224
225
225
226 log -pf b inside dir
226 log -pf b inside dir
227
227
228 $ hg --cwd=dir log -pf b
228 $ hg --cwd=dir log -pf b
229 changeset: 2:f8954cd4dc1f
229 changeset: 2:f8954cd4dc1f
230 user: test
230 user: test
231 date: Thu Jan 01 00:00:03 1970 +0000
231 date: Thu Jan 01 00:00:03 1970 +0000
232 summary: c
232 summary: c
233
233
234 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
234 diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
235 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
235 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
236 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
236 +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
237 @@ -0,0 +1,1 @@
237 @@ -0,0 +1,1 @@
238 +a
238 +a
239
239
240 changeset: 1:d89b0a12d229
240 changeset: 1:d89b0a12d229
241 user: test
241 user: test
242 date: Thu Jan 01 00:00:02 1970 +0000
242 date: Thu Jan 01 00:00:02 1970 +0000
243 summary: b
243 summary: b
244
244
245 diff -r 9161b9aeaf16 -r d89b0a12d229 b
245 diff -r 9161b9aeaf16 -r d89b0a12d229 b
246 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
246 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
247 +++ b/b Thu Jan 01 00:00:02 1970 +0000
247 +++ b/b Thu Jan 01 00:00:02 1970 +0000
248 @@ -0,0 +1,1 @@
248 @@ -0,0 +1,1 @@
249 +a
249 +a
250
250
251 changeset: 0:9161b9aeaf16
251 changeset: 0:9161b9aeaf16
252 user: test
252 user: test
253 date: Thu Jan 01 00:00:01 1970 +0000
253 date: Thu Jan 01 00:00:01 1970 +0000
254 summary: a
254 summary: a
255
255
256 diff -r 000000000000 -r 9161b9aeaf16 a
256 diff -r 000000000000 -r 9161b9aeaf16 a
257 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
257 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
258 +++ b/a Thu Jan 01 00:00:01 1970 +0000
258 +++ b/a Thu Jan 01 00:00:01 1970 +0000
259 @@ -0,0 +1,1 @@
259 @@ -0,0 +1,1 @@
260 +a
260 +a
261
261
262
262
263 log -vf dir/b
263 log -vf dir/b
264
264
265 $ hg log -vf dir/b
265 $ hg log -vf dir/b
266 changeset: 2:f8954cd4dc1f
266 changeset: 2:f8954cd4dc1f
267 user: test
267 user: test
268 date: Thu Jan 01 00:00:03 1970 +0000
268 date: Thu Jan 01 00:00:03 1970 +0000
269 files: b dir/b f g
269 files: b dir/b f g
270 description:
270 description:
271 c
271 c
272
272
273
273
274 changeset: 1:d89b0a12d229
274 changeset: 1:d89b0a12d229
275 user: test
275 user: test
276 date: Thu Jan 01 00:00:02 1970 +0000
276 date: Thu Jan 01 00:00:02 1970 +0000
277 files: b g
277 files: b g
278 description:
278 description:
279 b
279 b
280
280
281
281
282 changeset: 0:9161b9aeaf16
282 changeset: 0:9161b9aeaf16
283 user: test
283 user: test
284 date: Thu Jan 01 00:00:01 1970 +0000
284 date: Thu Jan 01 00:00:01 1970 +0000
285 files: a f
285 files: a f
286 description:
286 description:
287 a
287 a
288
288
289
289
290
290
291
291
292 -f and multiple filelog heads
292 -f and multiple filelog heads
293
293
294 $ hg up -q 2
294 $ hg up -q 2
295 $ hg log -f g --template '{rev}\n'
295 $ hg log -f g --template '{rev}\n'
296 2
296 2
297 1
297 1
298 0
298 0
299 $ hg up -q tip
299 $ hg up -q tip
300 $ hg log -f g --template '{rev}\n'
300 $ hg log -f g --template '{rev}\n'
301 3
301 3
302 2
302 2
303 0
303 0
304
304
305
305
306 log copies with --copies
306 log copies with --copies
307
307
308 $ hg log -vC --template '{rev} {file_copies}\n'
308 $ hg log -vC --template '{rev} {file_copies}\n'
309 4 e (dir/b)
309 4 e (dir/b)
310 3 b (a)g (f)
310 3 b (a)g (f)
311 2 dir/b (b)
311 2 dir/b (b)
312 1 b (a)g (f)
312 1 b (a)g (f)
313 0
313 0
314
314
315 log copies switch without --copies, with old filecopy template
315 log copies switch without --copies, with old filecopy template
316
316
317 $ hg log -v --template '{rev} {file_copies_switch%filecopy}\n'
317 $ hg log -v --template '{rev} {file_copies_switch%filecopy}\n'
318 4
318 4
319 3
319 3
320 2
320 2
321 1
321 1
322 0
322 0
323
323
324 log copies switch with --copies
324 log copies switch with --copies
325
325
326 $ hg log -vC --template '{rev} {file_copies_switch}\n'
326 $ hg log -vC --template '{rev} {file_copies_switch}\n'
327 4 e (dir/b)
327 4 e (dir/b)
328 3 b (a)g (f)
328 3 b (a)g (f)
329 2 dir/b (b)
329 2 dir/b (b)
330 1 b (a)g (f)
330 1 b (a)g (f)
331 0
331 0
332
332
333
333
334 log copies with hardcoded style and with --style=default
334 log copies with hardcoded style and with --style=default
335
335
336 $ hg log -vC -r4
336 $ hg log -vC -r4
337 changeset: 4:7e4639b4691b
337 changeset: 4:7e4639b4691b
338 tag: tip
338 tag: tip
339 user: test
339 user: test
340 date: Thu Jan 01 00:00:05 1970 +0000
340 date: Thu Jan 01 00:00:05 1970 +0000
341 files: dir/b e
341 files: dir/b e
342 copies: e (dir/b)
342 copies: e (dir/b)
343 description:
343 description:
344 e
344 e
345
345
346
346
347 $ hg log -vC -r4 --style=default
347 $ hg log -vC -r4 --style=default
348 changeset: 4:7e4639b4691b
348 changeset: 4:7e4639b4691b
349 tag: tip
349 tag: tip
350 user: test
350 user: test
351 date: Thu Jan 01 00:00:05 1970 +0000
351 date: Thu Jan 01 00:00:05 1970 +0000
352 files: dir/b e
352 files: dir/b e
353 copies: e (dir/b)
353 copies: e (dir/b)
354 description:
354 description:
355 e
355 e
356
356
357
357
358
358
359
359
360 log copies, non-linear manifest
360 log copies, non-linear manifest
361
361
362 $ hg up -C 3
362 $ hg up -C 3
363 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
363 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
364 $ hg mv dir/b e
364 $ hg mv dir/b e
365 $ echo foo > foo
365 $ echo foo > foo
366 $ hg ci -Ame2 -d '6 0'
366 $ hg ci -Ame2 -d '6 0'
367 adding foo
367 adding foo
368 created new head
368 created new head
369 $ hg log -v --template '{rev} {file_copies}\n' -r 5
369 $ hg log -v --template '{rev} {file_copies}\n' -r 5
370 5 e (dir/b)
370 5 e (dir/b)
371
371
372
372
373 log copies, execute bit set
373 log copies, execute bit set
374
374
375 #if execbit
375 #if execbit
376 $ chmod +x e
376 $ chmod +x e
377 $ hg ci -me3 -d '7 0'
377 $ hg ci -me3 -d '7 0'
378 $ hg log -v --template '{rev} {file_copies}\n' -r 6
378 $ hg log -v --template '{rev} {file_copies}\n' -r 6
379 6
379 6
380 #endif
380 #endif
381
381
382
382
383 log -p d
383 log -p d
384
384
385 $ hg log -pv d
385 $ hg log -pv d
386 changeset: 3:2ca5ba701980
386 changeset: 3:2ca5ba701980
387 user: test
387 user: test
388 date: Thu Jan 01 00:00:04 1970 +0000
388 date: Thu Jan 01 00:00:04 1970 +0000
389 files: a b d g
389 files: a b d g
390 description:
390 description:
391 d
391 d
392
392
393
393
394 diff -r f8954cd4dc1f -r 2ca5ba701980 d
394 diff -r f8954cd4dc1f -r 2ca5ba701980 d
395 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
395 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
396 +++ b/d Thu Jan 01 00:00:04 1970 +0000
396 +++ b/d Thu Jan 01 00:00:04 1970 +0000
397 @@ -0,0 +1,1 @@
397 @@ -0,0 +1,1 @@
398 +a
398 +a
399
399
400
400
401
401
402 log --removed file
402 log --removed file
403
403
404 $ hg log --removed -v a
404 $ hg log --removed -v a
405 changeset: 3:2ca5ba701980
405 changeset: 3:2ca5ba701980
406 user: test
406 user: test
407 date: Thu Jan 01 00:00:04 1970 +0000
407 date: Thu Jan 01 00:00:04 1970 +0000
408 files: a b d g
408 files: a b d g
409 description:
409 description:
410 d
410 d
411
411
412
412
413 changeset: 0:9161b9aeaf16
413 changeset: 0:9161b9aeaf16
414 user: test
414 user: test
415 date: Thu Jan 01 00:00:01 1970 +0000
415 date: Thu Jan 01 00:00:01 1970 +0000
416 files: a f
416 files: a f
417 description:
417 description:
418 a
418 a
419
419
420
420
421
421
422 log --removed revrange file
422 log --removed revrange file
423
423
424 $ hg log --removed -v -r0:2 a
424 $ hg log --removed -v -r0:2 a
425 changeset: 0:9161b9aeaf16
425 changeset: 0:9161b9aeaf16
426 user: test
426 user: test
427 date: Thu Jan 01 00:00:01 1970 +0000
427 date: Thu Jan 01 00:00:01 1970 +0000
428 files: a f
428 files: a f
429 description:
429 description:
430 a
430 a
431
431
432
432
433 $ cd ..
433 $ cd ..
434
434
435 log --follow tests
435 log --follow tests
436
436
437 $ hg init follow
437 $ hg init follow
438 $ cd follow
438 $ cd follow
439
439
440 $ echo base > base
440 $ echo base > base
441 $ hg ci -Ambase -d '1 0'
441 $ hg ci -Ambase -d '1 0'
442 adding base
442 adding base
443
443
444 $ echo r1 >> base
444 $ echo r1 >> base
445 $ hg ci -Amr1 -d '1 0'
445 $ hg ci -Amr1 -d '1 0'
446 $ echo r2 >> base
446 $ echo r2 >> base
447 $ hg ci -Amr2 -d '1 0'
447 $ hg ci -Amr2 -d '1 0'
448
448
449 $ hg up -C 1
449 $ hg up -C 1
450 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
450 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
451 $ echo b1 > b1
451 $ echo b1 > b1
452 $ hg ci -Amb1 -d '1 0'
452 $ hg ci -Amb1 -d '1 0'
453 adding b1
453 adding b1
454 created new head
454 created new head
455
455
456
456
457 log -f
457 log -f
458
458
459 $ hg log -f
459 $ hg log -f
460 changeset: 3:e62f78d544b4
460 changeset: 3:e62f78d544b4
461 tag: tip
461 tag: tip
462 parent: 1:3d5bf5654eda
462 parent: 1:3d5bf5654eda
463 user: test
463 user: test
464 date: Thu Jan 01 00:00:01 1970 +0000
464 date: Thu Jan 01 00:00:01 1970 +0000
465 summary: b1
465 summary: b1
466
466
467 changeset: 1:3d5bf5654eda
467 changeset: 1:3d5bf5654eda
468 user: test
468 user: test
469 date: Thu Jan 01 00:00:01 1970 +0000
469 date: Thu Jan 01 00:00:01 1970 +0000
470 summary: r1
470 summary: r1
471
471
472 changeset: 0:67e992f2c4f3
472 changeset: 0:67e992f2c4f3
473 user: test
473 user: test
474 date: Thu Jan 01 00:00:01 1970 +0000
474 date: Thu Jan 01 00:00:01 1970 +0000
475 summary: base
475 summary: base
476
476
477
477
478
478
479 log -f -r 1:tip
479 log -f -r 1:tip
480
480
481 $ hg up -C 0
481 $ hg up -C 0
482 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
482 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
483 $ echo b2 > b2
483 $ echo b2 > b2
484 $ hg ci -Amb2 -d '1 0'
484 $ hg ci -Amb2 -d '1 0'
485 adding b2
485 adding b2
486 created new head
486 created new head
487 $ hg log -f -r 1:tip
487 $ hg log -f -r 1:tip
488 changeset: 1:3d5bf5654eda
488 changeset: 1:3d5bf5654eda
489 user: test
489 user: test
490 date: Thu Jan 01 00:00:01 1970 +0000
490 date: Thu Jan 01 00:00:01 1970 +0000
491 summary: r1
491 summary: r1
492
492
493 changeset: 2:60c670bf5b30
493 changeset: 2:60c670bf5b30
494 user: test
494 user: test
495 date: Thu Jan 01 00:00:01 1970 +0000
495 date: Thu Jan 01 00:00:01 1970 +0000
496 summary: r2
496 summary: r2
497
497
498 changeset: 3:e62f78d544b4
498 changeset: 3:e62f78d544b4
499 parent: 1:3d5bf5654eda
499 parent: 1:3d5bf5654eda
500 user: test
500 user: test
501 date: Thu Jan 01 00:00:01 1970 +0000
501 date: Thu Jan 01 00:00:01 1970 +0000
502 summary: b1
502 summary: b1
503
503
504
504
505
505
506 log -r . with two parents
506 log -r . with two parents
507
507
508 $ hg up -C 3
508 $ hg up -C 3
509 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
509 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
510 $ hg merge tip
510 $ hg merge tip
511 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
511 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
512 (branch merge, don't forget to commit)
512 (branch merge, don't forget to commit)
513 $ hg log -r .
513 $ hg log -r .
514 changeset: 3:e62f78d544b4
514 changeset: 3:e62f78d544b4
515 parent: 1:3d5bf5654eda
515 parent: 1:3d5bf5654eda
516 user: test
516 user: test
517 date: Thu Jan 01 00:00:01 1970 +0000
517 date: Thu Jan 01 00:00:01 1970 +0000
518 summary: b1
518 summary: b1
519
519
520
520
521
521
522 log -r . with one parent
522 log -r . with one parent
523
523
524 $ hg ci -mm12 -d '1 0'
524 $ hg ci -mm12 -d '1 0'
525 $ hg log -r .
525 $ hg log -r .
526 changeset: 5:302e9dd6890d
526 changeset: 5:302e9dd6890d
527 tag: tip
527 tag: tip
528 parent: 3:e62f78d544b4
528 parent: 3:e62f78d544b4
529 parent: 4:ddb82e70d1a1
529 parent: 4:ddb82e70d1a1
530 user: test
530 user: test
531 date: Thu Jan 01 00:00:01 1970 +0000
531 date: Thu Jan 01 00:00:01 1970 +0000
532 summary: m12
532 summary: m12
533
533
534
534
535 $ echo postm >> b1
535 $ echo postm >> b1
536 $ hg ci -Amb1.1 -d'1 0'
536 $ hg ci -Amb1.1 -d'1 0'
537
537
538
538
539 log --follow-first
539 log --follow-first
540
540
541 $ hg log --follow-first
541 $ hg log --follow-first
542 changeset: 6:2404bbcab562
542 changeset: 6:2404bbcab562
543 tag: tip
543 tag: tip
544 user: test
544 user: test
545 date: Thu Jan 01 00:00:01 1970 +0000
545 date: Thu Jan 01 00:00:01 1970 +0000
546 summary: b1.1
546 summary: b1.1
547
547
548 changeset: 5:302e9dd6890d
548 changeset: 5:302e9dd6890d
549 parent: 3:e62f78d544b4
549 parent: 3:e62f78d544b4
550 parent: 4:ddb82e70d1a1
550 parent: 4:ddb82e70d1a1
551 user: test
551 user: test
552 date: Thu Jan 01 00:00:01 1970 +0000
552 date: Thu Jan 01 00:00:01 1970 +0000
553 summary: m12
553 summary: m12
554
554
555 changeset: 3:e62f78d544b4
555 changeset: 3:e62f78d544b4
556 parent: 1:3d5bf5654eda
556 parent: 1:3d5bf5654eda
557 user: test
557 user: test
558 date: Thu Jan 01 00:00:01 1970 +0000
558 date: Thu Jan 01 00:00:01 1970 +0000
559 summary: b1
559 summary: b1
560
560
561 changeset: 1:3d5bf5654eda
561 changeset: 1:3d5bf5654eda
562 user: test
562 user: test
563 date: Thu Jan 01 00:00:01 1970 +0000
563 date: Thu Jan 01 00:00:01 1970 +0000
564 summary: r1
564 summary: r1
565
565
566 changeset: 0:67e992f2c4f3
566 changeset: 0:67e992f2c4f3
567 user: test
567 user: test
568 date: Thu Jan 01 00:00:01 1970 +0000
568 date: Thu Jan 01 00:00:01 1970 +0000
569 summary: base
569 summary: base
570
570
571
571
572
572
573 log -P 2
573 log -P 2
574
574
575 $ hg log -P 2
575 $ hg log -P 2
576 changeset: 6:2404bbcab562
576 changeset: 6:2404bbcab562
577 tag: tip
577 tag: tip
578 user: test
578 user: test
579 date: Thu Jan 01 00:00:01 1970 +0000
579 date: Thu Jan 01 00:00:01 1970 +0000
580 summary: b1.1
580 summary: b1.1
581
581
582 changeset: 5:302e9dd6890d
582 changeset: 5:302e9dd6890d
583 parent: 3:e62f78d544b4
583 parent: 3:e62f78d544b4
584 parent: 4:ddb82e70d1a1
584 parent: 4:ddb82e70d1a1
585 user: test
585 user: test
586 date: Thu Jan 01 00:00:01 1970 +0000
586 date: Thu Jan 01 00:00:01 1970 +0000
587 summary: m12
587 summary: m12
588
588
589 changeset: 4:ddb82e70d1a1
589 changeset: 4:ddb82e70d1a1
590 parent: 0:67e992f2c4f3
590 parent: 0:67e992f2c4f3
591 user: test
591 user: test
592 date: Thu Jan 01 00:00:01 1970 +0000
592 date: Thu Jan 01 00:00:01 1970 +0000
593 summary: b2
593 summary: b2
594
594
595 changeset: 3:e62f78d544b4
595 changeset: 3:e62f78d544b4
596 parent: 1:3d5bf5654eda
596 parent: 1:3d5bf5654eda
597 user: test
597 user: test
598 date: Thu Jan 01 00:00:01 1970 +0000
598 date: Thu Jan 01 00:00:01 1970 +0000
599 summary: b1
599 summary: b1
600
600
601
601
602
602
603 log -r tip -p --git
603 log -r tip -p --git
604
604
605 $ hg log -r tip -p --git
605 $ hg log -r tip -p --git
606 changeset: 6:2404bbcab562
606 changeset: 6:2404bbcab562
607 tag: tip
607 tag: tip
608 user: test
608 user: test
609 date: Thu Jan 01 00:00:01 1970 +0000
609 date: Thu Jan 01 00:00:01 1970 +0000
610 summary: b1.1
610 summary: b1.1
611
611
612 diff --git a/b1 b/b1
612 diff --git a/b1 b/b1
613 --- a/b1
613 --- a/b1
614 +++ b/b1
614 +++ b/b1
615 @@ -1,1 +1,2 @@
615 @@ -1,1 +1,2 @@
616 b1
616 b1
617 +postm
617 +postm
618
618
619
619
620
620
621 log -r ""
621 log -r ""
622
622
623 $ hg log -r ''
623 $ hg log -r ''
624 hg: parse error: empty query
624 hg: parse error: empty query
625 [255]
625 [255]
626
626
627 log -r <some unknown node id>
627 log -r <some unknown node id>
628
628
629 $ hg log -r 1000000000000000000000000000000000000000
629 $ hg log -r 1000000000000000000000000000000000000000
630 abort: unknown revision '1000000000000000000000000000000000000000'!
630 abort: unknown revision '1000000000000000000000000000000000000000'!
631 [255]
631 [255]
632
632
633 log -k r1
633 log -k r1
634
634
635 $ hg log -k r1
635 $ hg log -k r1
636 changeset: 1:3d5bf5654eda
636 changeset: 1:3d5bf5654eda
637 user: test
637 user: test
638 date: Thu Jan 01 00:00:01 1970 +0000
638 date: Thu Jan 01 00:00:01 1970 +0000
639 summary: r1
639 summary: r1
640
640
641 log -p -l2 --color=always
641 log -p -l2 --color=always
642
642
643 $ hg --config extensions.color= --config color.mode=ansi \
643 $ hg --config extensions.color= --config color.mode=ansi \
644 > log -p -l2 --color=always
644 > log -p -l2 --color=always
645 \x1b[0;33mchangeset: 6:2404bbcab562\x1b[0m (esc)
645 \x1b[0;33mchangeset: 6:2404bbcab562\x1b[0m (esc)
646 tag: tip
646 tag: tip
647 user: test
647 user: test
648 date: Thu Jan 01 00:00:01 1970 +0000
648 date: Thu Jan 01 00:00:01 1970 +0000
649 summary: b1.1
649 summary: b1.1
650
650
651 \x1b[0;1mdiff -r 302e9dd6890d -r 2404bbcab562 b1\x1b[0m (esc)
651 \x1b[0;1mdiff -r 302e9dd6890d -r 2404bbcab562 b1\x1b[0m (esc)
652 \x1b[0;31;1m--- a/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
652 \x1b[0;31;1m--- a/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
653 \x1b[0;32;1m+++ b/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
653 \x1b[0;32;1m+++ b/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
654 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
654 \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
655 b1
655 b1
656 \x1b[0;32m+postm\x1b[0m (esc)
656 \x1b[0;32m+postm\x1b[0m (esc)
657
657
658 \x1b[0;33mchangeset: 5:302e9dd6890d\x1b[0m (esc)
658 \x1b[0;33mchangeset: 5:302e9dd6890d\x1b[0m (esc)
659 parent: 3:e62f78d544b4
659 parent: 3:e62f78d544b4
660 parent: 4:ddb82e70d1a1
660 parent: 4:ddb82e70d1a1
661 user: test
661 user: test
662 date: Thu Jan 01 00:00:01 1970 +0000
662 date: Thu Jan 01 00:00:01 1970 +0000
663 summary: m12
663 summary: m12
664
664
665 \x1b[0;1mdiff -r e62f78d544b4 -r 302e9dd6890d b2\x1b[0m (esc)
665 \x1b[0;1mdiff -r e62f78d544b4 -r 302e9dd6890d b2\x1b[0m (esc)
666 \x1b[0;31;1m--- /dev/null Thu Jan 01 00:00:00 1970 +0000\x1b[0m (esc)
666 \x1b[0;31;1m--- /dev/null Thu Jan 01 00:00:00 1970 +0000\x1b[0m (esc)
667 \x1b[0;32;1m+++ b/b2 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
667 \x1b[0;32;1m+++ b/b2 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
668 \x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m (esc)
668 \x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m (esc)
669 \x1b[0;32m+b2\x1b[0m (esc)
669 \x1b[0;32m+b2\x1b[0m (esc)
670
670
671
671
672
672
673 log -r tip --stat
673 log -r tip --stat
674
674
675 $ hg log -r tip --stat
675 $ hg log -r tip --stat
676 changeset: 6:2404bbcab562
676 changeset: 6:2404bbcab562
677 tag: tip
677 tag: tip
678 user: test
678 user: test
679 date: Thu Jan 01 00:00:01 1970 +0000
679 date: Thu Jan 01 00:00:01 1970 +0000
680 summary: b1.1
680 summary: b1.1
681
681
682 b1 | 1 +
682 b1 | 1 +
683 1 files changed, 1 insertions(+), 0 deletions(-)
683 1 files changed, 1 insertions(+), 0 deletions(-)
684
684
685
685
686 $ cd ..
686 $ cd ..
687
687
688
688
689 User
689 User
690
690
691 $ hg init usertest
691 $ hg init usertest
692 $ cd usertest
692 $ cd usertest
693
693
694 $ echo a > a
694 $ echo a > a
695 $ hg ci -A -m "a" -u "User One <user1@example.org>"
695 $ hg ci -A -m "a" -u "User One <user1@example.org>"
696 adding a
696 adding a
697 $ echo b > b
697 $ echo b > b
698 $ hg ci -A -m "b" -u "User Two <user2@example.org>"
698 $ hg ci -A -m "b" -u "User Two <user2@example.org>"
699 adding b
699 adding b
700
700
701 $ hg log -u "User One <user1@example.org>"
701 $ hg log -u "User One <user1@example.org>"
702 changeset: 0:29a4c94f1924
702 changeset: 0:29a4c94f1924
703 user: User One <user1@example.org>
703 user: User One <user1@example.org>
704 date: Thu Jan 01 00:00:00 1970 +0000
704 date: Thu Jan 01 00:00:00 1970 +0000
705 summary: a
705 summary: a
706
706
707 $ hg log -u "user1" -u "user2"
707 $ hg log -u "user1" -u "user2"
708 changeset: 1:e834b5e69c0e
708 changeset: 1:e834b5e69c0e
709 tag: tip
709 tag: tip
710 user: User Two <user2@example.org>
710 user: User Two <user2@example.org>
711 date: Thu Jan 01 00:00:00 1970 +0000
711 date: Thu Jan 01 00:00:00 1970 +0000
712 summary: b
712 summary: b
713
713
714 changeset: 0:29a4c94f1924
714 changeset: 0:29a4c94f1924
715 user: User One <user1@example.org>
715 user: User One <user1@example.org>
716 date: Thu Jan 01 00:00:00 1970 +0000
716 date: Thu Jan 01 00:00:00 1970 +0000
717 summary: a
717 summary: a
718
718
719 $ hg log -u "user3"
719 $ hg log -u "user3"
720
720
721 $ cd ..
721 $ cd ..
722
722
723 $ hg init branches
723 $ hg init branches
724 $ cd branches
724 $ cd branches
725
725
726 $ echo a > a
726 $ echo a > a
727 $ hg ci -A -m "commit on default"
727 $ hg ci -A -m "commit on default"
728 adding a
728 adding a
729 $ hg branch test
729 $ hg branch test
730 marked working directory as branch test
730 marked working directory as branch test
731 (branches are permanent and global, did you want a bookmark?)
731 (branches are permanent and global, did you want a bookmark?)
732 $ echo b > b
732 $ echo b > b
733 $ hg ci -A -m "commit on test"
733 $ hg ci -A -m "commit on test"
734 adding b
734 adding b
735
735
736 $ hg up default
736 $ hg up default
737 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
737 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
738 $ echo c > c
738 $ echo c > c
739 $ hg ci -A -m "commit on default"
739 $ hg ci -A -m "commit on default"
740 adding c
740 adding c
741 $ hg up test
741 $ hg up test
742 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
742 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
743 $ echo c > c
743 $ echo c > c
744 $ hg ci -A -m "commit on test"
744 $ hg ci -A -m "commit on test"
745 adding c
745 adding c
746
746
747
747
748 log -b default
748 log -b default
749
749
750 $ hg log -b default
750 $ hg log -b default
751 changeset: 2:c3a4f03cc9a7
751 changeset: 2:c3a4f03cc9a7
752 parent: 0:24427303d56f
752 parent: 0:24427303d56f
753 user: test
753 user: test
754 date: Thu Jan 01 00:00:00 1970 +0000
754 date: Thu Jan 01 00:00:00 1970 +0000
755 summary: commit on default
755 summary: commit on default
756
756
757 changeset: 0:24427303d56f
757 changeset: 0:24427303d56f
758 user: test
758 user: test
759 date: Thu Jan 01 00:00:00 1970 +0000
759 date: Thu Jan 01 00:00:00 1970 +0000
760 summary: commit on default
760 summary: commit on default
761
761
762
762
763
763
764 log -b test
764 log -b test
765
765
766 $ hg log -b test
766 $ hg log -b test
767 changeset: 3:f5d8de11c2e2
767 changeset: 3:f5d8de11c2e2
768 branch: test
768 branch: test
769 tag: tip
769 tag: tip
770 parent: 1:d32277701ccb
770 parent: 1:d32277701ccb
771 user: test
771 user: test
772 date: Thu Jan 01 00:00:00 1970 +0000
772 date: Thu Jan 01 00:00:00 1970 +0000
773 summary: commit on test
773 summary: commit on test
774
774
775 changeset: 1:d32277701ccb
775 changeset: 1:d32277701ccb
776 branch: test
776 branch: test
777 user: test
777 user: test
778 date: Thu Jan 01 00:00:00 1970 +0000
778 date: Thu Jan 01 00:00:00 1970 +0000
779 summary: commit on test
779 summary: commit on test
780
780
781
781
782
782
783 log -b dummy
783 log -b dummy
784
784
785 $ hg log -b dummy
785 $ hg log -b dummy
786 abort: unknown revision 'dummy'!
786 abort: unknown revision 'dummy'!
787 [255]
787 [255]
788
788
789
789
790 log -b .
790 log -b .
791
791
792 $ hg log -b .
792 $ hg log -b .
793 changeset: 3:f5d8de11c2e2
793 changeset: 3:f5d8de11c2e2
794 branch: test
794 branch: test
795 tag: tip
795 tag: tip
796 parent: 1:d32277701ccb
796 parent: 1:d32277701ccb
797 user: test
797 user: test
798 date: Thu Jan 01 00:00:00 1970 +0000
798 date: Thu Jan 01 00:00:00 1970 +0000
799 summary: commit on test
799 summary: commit on test
800
800
801 changeset: 1:d32277701ccb
801 changeset: 1:d32277701ccb
802 branch: test
802 branch: test
803 user: test
803 user: test
804 date: Thu Jan 01 00:00:00 1970 +0000
804 date: Thu Jan 01 00:00:00 1970 +0000
805 summary: commit on test
805 summary: commit on test
806
806
807
807
808
808
809 log -b default -b test
809 log -b default -b test
810
810
811 $ hg log -b default -b test
811 $ hg log -b default -b test
812 changeset: 3:f5d8de11c2e2
812 changeset: 3:f5d8de11c2e2
813 branch: test
813 branch: test
814 tag: tip
814 tag: tip
815 parent: 1:d32277701ccb
815 parent: 1:d32277701ccb
816 user: test
816 user: test
817 date: Thu Jan 01 00:00:00 1970 +0000
817 date: Thu Jan 01 00:00:00 1970 +0000
818 summary: commit on test
818 summary: commit on test
819
819
820 changeset: 2:c3a4f03cc9a7
820 changeset: 2:c3a4f03cc9a7
821 parent: 0:24427303d56f
821 parent: 0:24427303d56f
822 user: test
822 user: test
823 date: Thu Jan 01 00:00:00 1970 +0000
823 date: Thu Jan 01 00:00:00 1970 +0000
824 summary: commit on default
824 summary: commit on default
825
825
826 changeset: 1:d32277701ccb
826 changeset: 1:d32277701ccb
827 branch: test
827 branch: test
828 user: test
828 user: test
829 date: Thu Jan 01 00:00:00 1970 +0000
829 date: Thu Jan 01 00:00:00 1970 +0000
830 summary: commit on test
830 summary: commit on test
831
831
832 changeset: 0:24427303d56f
832 changeset: 0:24427303d56f
833 user: test
833 user: test
834 date: Thu Jan 01 00:00:00 1970 +0000
834 date: Thu Jan 01 00:00:00 1970 +0000
835 summary: commit on default
835 summary: commit on default
836
836
837
837
838
838
839 log -b default -b .
839 log -b default -b .
840
840
841 $ hg log -b default -b .
841 $ hg log -b default -b .
842 changeset: 3:f5d8de11c2e2
842 changeset: 3:f5d8de11c2e2
843 branch: test
843 branch: test
844 tag: tip
844 tag: tip
845 parent: 1:d32277701ccb
845 parent: 1:d32277701ccb
846 user: test
846 user: test
847 date: Thu Jan 01 00:00:00 1970 +0000
847 date: Thu Jan 01 00:00:00 1970 +0000
848 summary: commit on test
848 summary: commit on test
849
849
850 changeset: 2:c3a4f03cc9a7
850 changeset: 2:c3a4f03cc9a7
851 parent: 0:24427303d56f
851 parent: 0:24427303d56f
852 user: test
852 user: test
853 date: Thu Jan 01 00:00:00 1970 +0000
853 date: Thu Jan 01 00:00:00 1970 +0000
854 summary: commit on default
854 summary: commit on default
855
855
856 changeset: 1:d32277701ccb
856 changeset: 1:d32277701ccb
857 branch: test
857 branch: test
858 user: test
858 user: test
859 date: Thu Jan 01 00:00:00 1970 +0000
859 date: Thu Jan 01 00:00:00 1970 +0000
860 summary: commit on test
860 summary: commit on test
861
861
862 changeset: 0:24427303d56f
862 changeset: 0:24427303d56f
863 user: test
863 user: test
864 date: Thu Jan 01 00:00:00 1970 +0000
864 date: Thu Jan 01 00:00:00 1970 +0000
865 summary: commit on default
865 summary: commit on default
866
866
867
867
868
868
869 log -b . -b test
869 log -b . -b test
870
870
871 $ hg log -b . -b test
871 $ hg log -b . -b test
872 changeset: 3:f5d8de11c2e2
872 changeset: 3:f5d8de11c2e2
873 branch: test
873 branch: test
874 tag: tip
874 tag: tip
875 parent: 1:d32277701ccb
875 parent: 1:d32277701ccb
876 user: test
876 user: test
877 date: Thu Jan 01 00:00:00 1970 +0000
877 date: Thu Jan 01 00:00:00 1970 +0000
878 summary: commit on test
878 summary: commit on test
879
879
880 changeset: 1:d32277701ccb
880 changeset: 1:d32277701ccb
881 branch: test
881 branch: test
882 user: test
882 user: test
883 date: Thu Jan 01 00:00:00 1970 +0000
883 date: Thu Jan 01 00:00:00 1970 +0000
884 summary: commit on test
884 summary: commit on test
885
885
886
886
887
887
888 log -b 2
888 log -b 2
889
889
890 $ hg log -b 2
890 $ hg log -b 2
891 changeset: 2:c3a4f03cc9a7
891 changeset: 2:c3a4f03cc9a7
892 parent: 0:24427303d56f
892 parent: 0:24427303d56f
893 user: test
893 user: test
894 date: Thu Jan 01 00:00:00 1970 +0000
894 date: Thu Jan 01 00:00:00 1970 +0000
895 summary: commit on default
895 summary: commit on default
896
896
897 changeset: 0:24427303d56f
897 changeset: 0:24427303d56f
898 user: test
898 user: test
899 date: Thu Jan 01 00:00:00 1970 +0000
899 date: Thu Jan 01 00:00:00 1970 +0000
900 summary: commit on default
900 summary: commit on default
901
901
902
902
903
903
904 log -p --cwd dir (in subdir)
904 log -p --cwd dir (in subdir)
905
905
906 $ mkdir dir
906 $ mkdir dir
907 $ hg log -p --cwd dir
907 $ hg log -p --cwd dir
908 changeset: 3:f5d8de11c2e2
908 changeset: 3:f5d8de11c2e2
909 branch: test
909 branch: test
910 tag: tip
910 tag: tip
911 parent: 1:d32277701ccb
911 parent: 1:d32277701ccb
912 user: test
912 user: test
913 date: Thu Jan 01 00:00:00 1970 +0000
913 date: Thu Jan 01 00:00:00 1970 +0000
914 summary: commit on test
914 summary: commit on test
915
915
916 diff -r d32277701ccb -r f5d8de11c2e2 c
916 diff -r d32277701ccb -r f5d8de11c2e2 c
917 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
917 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
918 +++ b/c Thu Jan 01 00:00:00 1970 +0000
918 +++ b/c Thu Jan 01 00:00:00 1970 +0000
919 @@ -0,0 +1,1 @@
919 @@ -0,0 +1,1 @@
920 +c
920 +c
921
921
922 changeset: 2:c3a4f03cc9a7
922 changeset: 2:c3a4f03cc9a7
923 parent: 0:24427303d56f
923 parent: 0:24427303d56f
924 user: test
924 user: test
925 date: Thu Jan 01 00:00:00 1970 +0000
925 date: Thu Jan 01 00:00:00 1970 +0000
926 summary: commit on default
926 summary: commit on default
927
927
928 diff -r 24427303d56f -r c3a4f03cc9a7 c
928 diff -r 24427303d56f -r c3a4f03cc9a7 c
929 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
929 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
930 +++ b/c Thu Jan 01 00:00:00 1970 +0000
930 +++ b/c Thu Jan 01 00:00:00 1970 +0000
931 @@ -0,0 +1,1 @@
931 @@ -0,0 +1,1 @@
932 +c
932 +c
933
933
934 changeset: 1:d32277701ccb
934 changeset: 1:d32277701ccb
935 branch: test
935 branch: test
936 user: test
936 user: test
937 date: Thu Jan 01 00:00:00 1970 +0000
937 date: Thu Jan 01 00:00:00 1970 +0000
938 summary: commit on test
938 summary: commit on test
939
939
940 diff -r 24427303d56f -r d32277701ccb b
940 diff -r 24427303d56f -r d32277701ccb b
941 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
941 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
942 +++ b/b Thu Jan 01 00:00:00 1970 +0000
942 +++ b/b Thu Jan 01 00:00:00 1970 +0000
943 @@ -0,0 +1,1 @@
943 @@ -0,0 +1,1 @@
944 +b
944 +b
945
945
946 changeset: 0:24427303d56f
946 changeset: 0:24427303d56f
947 user: test
947 user: test
948 date: Thu Jan 01 00:00:00 1970 +0000
948 date: Thu Jan 01 00:00:00 1970 +0000
949 summary: commit on default
949 summary: commit on default
950
950
951 diff -r 000000000000 -r 24427303d56f a
951 diff -r 000000000000 -r 24427303d56f a
952 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
952 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
953 +++ b/a Thu Jan 01 00:00:00 1970 +0000
953 +++ b/a Thu Jan 01 00:00:00 1970 +0000
954 @@ -0,0 +1,1 @@
954 @@ -0,0 +1,1 @@
955 +a
955 +a
956
956
957
957
958
958
959 log -p -R repo
959 log -p -R repo
960
960
961 $ cd dir
961 $ cd dir
962 $ hg log -p -R .. ../a
962 $ hg log -p -R .. ../a
963 changeset: 0:24427303d56f
963 changeset: 0:24427303d56f
964 user: test
964 user: test
965 date: Thu Jan 01 00:00:00 1970 +0000
965 date: Thu Jan 01 00:00:00 1970 +0000
966 summary: commit on default
966 summary: commit on default
967
967
968 diff -r 000000000000 -r 24427303d56f a
968 diff -r 000000000000 -r 24427303d56f a
969 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
969 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
970 +++ b/a Thu Jan 01 00:00:00 1970 +0000
970 +++ b/a Thu Jan 01 00:00:00 1970 +0000
971 @@ -0,0 +1,1 @@
971 @@ -0,0 +1,1 @@
972 +a
972 +a
973
973
974
974
975 $ cd ../..
975 $ cd ../..
976
976
977 $ hg init follow2
977 $ hg init follow2
978 $ cd follow2
978 $ cd follow2
979
979
980 # Build the following history:
980 # Build the following history:
981 # tip - o - x - o - x - x
981 # tip - o - x - o - x - x
982 # \ /
982 # \ /
983 # o - o - o - x
983 # o - o - o - x
984 # \ /
984 # \ /
985 # o
985 # o
986 #
986 #
987 # Where "o" is a revision containing "foo" and
987 # Where "o" is a revision containing "foo" and
988 # "x" is a revision without "foo"
988 # "x" is a revision without "foo"
989
989
990 $ touch init
990 $ touch init
991 $ hg ci -A -m "init, unrelated"
991 $ hg ci -A -m "init, unrelated"
992 adding init
992 adding init
993 $ echo 'foo' > init
993 $ echo 'foo' > init
994 $ hg ci -m "change, unrelated"
994 $ hg ci -m "change, unrelated"
995 $ echo 'foo' > foo
995 $ echo 'foo' > foo
996 $ hg ci -A -m "add unrelated old foo"
996 $ hg ci -A -m "add unrelated old foo"
997 adding foo
997 adding foo
998 $ hg rm foo
998 $ hg rm foo
999 $ hg ci -m "delete foo, unrelated"
999 $ hg ci -m "delete foo, unrelated"
1000 $ echo 'related' > foo
1000 $ echo 'related' > foo
1001 $ hg ci -A -m "add foo, related"
1001 $ hg ci -A -m "add foo, related"
1002 adding foo
1002 adding foo
1003
1003
1004 $ hg up 0
1004 $ hg up 0
1005 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1005 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1006 $ touch branch
1006 $ touch branch
1007 $ hg ci -A -m "first branch, unrelated"
1007 $ hg ci -A -m "first branch, unrelated"
1008 adding branch
1008 adding branch
1009 created new head
1009 created new head
1010 $ touch foo
1010 $ touch foo
1011 $ hg ci -A -m "create foo, related"
1011 $ hg ci -A -m "create foo, related"
1012 adding foo
1012 adding foo
1013 $ echo 'change' > foo
1013 $ echo 'change' > foo
1014 $ hg ci -m "change foo, related"
1014 $ hg ci -m "change foo, related"
1015
1015
1016 $ hg up 6
1016 $ hg up 6
1017 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1017 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1018 $ echo 'change foo in branch' > foo
1018 $ echo 'change foo in branch' > foo
1019 $ hg ci -m "change foo in branch, related"
1019 $ hg ci -m "change foo in branch, related"
1020 created new head
1020 created new head
1021 $ hg merge 7
1021 $ hg merge 7
1022 merging foo
1022 merging foo
1023 warning: conflicts during merge.
1023 warning: conflicts during merge.
1024 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1024 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1025 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1025 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1026 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1026 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1027 [1]
1027 [1]
1028 $ echo 'merge 1' > foo
1028 $ echo 'merge 1' > foo
1029 $ hg resolve -m foo
1029 $ hg resolve -m foo
1030 no more unresolved files
1030 (no more unresolved files)
1031 $ hg ci -m "First merge, related"
1031 $ hg ci -m "First merge, related"
1032
1032
1033 $ hg merge 4
1033 $ hg merge 4
1034 merging foo
1034 merging foo
1035 warning: conflicts during merge.
1035 warning: conflicts during merge.
1036 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1036 merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
1037 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
1037 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
1038 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1038 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
1039 [1]
1039 [1]
1040 $ echo 'merge 2' > foo
1040 $ echo 'merge 2' > foo
1041 $ hg resolve -m foo
1041 $ hg resolve -m foo
1042 no more unresolved files
1042 (no more unresolved files)
1043 $ hg ci -m "Last merge, related"
1043 $ hg ci -m "Last merge, related"
1044
1044
1045 $ hg log --graph
1045 $ hg log --graph
1046 @ changeset: 10:4dae8563d2c5
1046 @ changeset: 10:4dae8563d2c5
1047 |\ tag: tip
1047 |\ tag: tip
1048 | | parent: 9:7b35701b003e
1048 | | parent: 9:7b35701b003e
1049 | | parent: 4:88176d361b69
1049 | | parent: 4:88176d361b69
1050 | | user: test
1050 | | user: test
1051 | | date: Thu Jan 01 00:00:00 1970 +0000
1051 | | date: Thu Jan 01 00:00:00 1970 +0000
1052 | | summary: Last merge, related
1052 | | summary: Last merge, related
1053 | |
1053 | |
1054 | o changeset: 9:7b35701b003e
1054 | o changeset: 9:7b35701b003e
1055 | |\ parent: 8:e5416ad8a855
1055 | |\ parent: 8:e5416ad8a855
1056 | | | parent: 7:87fe3144dcfa
1056 | | | parent: 7:87fe3144dcfa
1057 | | | user: test
1057 | | | user: test
1058 | | | date: Thu Jan 01 00:00:00 1970 +0000
1058 | | | date: Thu Jan 01 00:00:00 1970 +0000
1059 | | | summary: First merge, related
1059 | | | summary: First merge, related
1060 | | |
1060 | | |
1061 | | o changeset: 8:e5416ad8a855
1061 | | o changeset: 8:e5416ad8a855
1062 | | | parent: 6:dc6c325fe5ee
1062 | | | parent: 6:dc6c325fe5ee
1063 | | | user: test
1063 | | | user: test
1064 | | | date: Thu Jan 01 00:00:00 1970 +0000
1064 | | | date: Thu Jan 01 00:00:00 1970 +0000
1065 | | | summary: change foo in branch, related
1065 | | | summary: change foo in branch, related
1066 | | |
1066 | | |
1067 | o | changeset: 7:87fe3144dcfa
1067 | o | changeset: 7:87fe3144dcfa
1068 | |/ user: test
1068 | |/ user: test
1069 | | date: Thu Jan 01 00:00:00 1970 +0000
1069 | | date: Thu Jan 01 00:00:00 1970 +0000
1070 | | summary: change foo, related
1070 | | summary: change foo, related
1071 | |
1071 | |
1072 | o changeset: 6:dc6c325fe5ee
1072 | o changeset: 6:dc6c325fe5ee
1073 | | user: test
1073 | | user: test
1074 | | date: Thu Jan 01 00:00:00 1970 +0000
1074 | | date: Thu Jan 01 00:00:00 1970 +0000
1075 | | summary: create foo, related
1075 | | summary: create foo, related
1076 | |
1076 | |
1077 | o changeset: 5:73db34516eb9
1077 | o changeset: 5:73db34516eb9
1078 | | parent: 0:e87515fd044a
1078 | | parent: 0:e87515fd044a
1079 | | user: test
1079 | | user: test
1080 | | date: Thu Jan 01 00:00:00 1970 +0000
1080 | | date: Thu Jan 01 00:00:00 1970 +0000
1081 | | summary: first branch, unrelated
1081 | | summary: first branch, unrelated
1082 | |
1082 | |
1083 o | changeset: 4:88176d361b69
1083 o | changeset: 4:88176d361b69
1084 | | user: test
1084 | | user: test
1085 | | date: Thu Jan 01 00:00:00 1970 +0000
1085 | | date: Thu Jan 01 00:00:00 1970 +0000
1086 | | summary: add foo, related
1086 | | summary: add foo, related
1087 | |
1087 | |
1088 o | changeset: 3:dd78ae4afb56
1088 o | changeset: 3:dd78ae4afb56
1089 | | user: test
1089 | | user: test
1090 | | date: Thu Jan 01 00:00:00 1970 +0000
1090 | | date: Thu Jan 01 00:00:00 1970 +0000
1091 | | summary: delete foo, unrelated
1091 | | summary: delete foo, unrelated
1092 | |
1092 | |
1093 o | changeset: 2:c4c64aedf0f7
1093 o | changeset: 2:c4c64aedf0f7
1094 | | user: test
1094 | | user: test
1095 | | date: Thu Jan 01 00:00:00 1970 +0000
1095 | | date: Thu Jan 01 00:00:00 1970 +0000
1096 | | summary: add unrelated old foo
1096 | | summary: add unrelated old foo
1097 | |
1097 | |
1098 o | changeset: 1:e5faa7440653
1098 o | changeset: 1:e5faa7440653
1099 |/ user: test
1099 |/ user: test
1100 | date: Thu Jan 01 00:00:00 1970 +0000
1100 | date: Thu Jan 01 00:00:00 1970 +0000
1101 | summary: change, unrelated
1101 | summary: change, unrelated
1102 |
1102 |
1103 o changeset: 0:e87515fd044a
1103 o changeset: 0:e87515fd044a
1104 user: test
1104 user: test
1105 date: Thu Jan 01 00:00:00 1970 +0000
1105 date: Thu Jan 01 00:00:00 1970 +0000
1106 summary: init, unrelated
1106 summary: init, unrelated
1107
1107
1108
1108
1109 $ hg --traceback log -f foo
1109 $ hg --traceback log -f foo
1110 changeset: 10:4dae8563d2c5
1110 changeset: 10:4dae8563d2c5
1111 tag: tip
1111 tag: tip
1112 parent: 9:7b35701b003e
1112 parent: 9:7b35701b003e
1113 parent: 4:88176d361b69
1113 parent: 4:88176d361b69
1114 user: test
1114 user: test
1115 date: Thu Jan 01 00:00:00 1970 +0000
1115 date: Thu Jan 01 00:00:00 1970 +0000
1116 summary: Last merge, related
1116 summary: Last merge, related
1117
1117
1118 changeset: 9:7b35701b003e
1118 changeset: 9:7b35701b003e
1119 parent: 8:e5416ad8a855
1119 parent: 8:e5416ad8a855
1120 parent: 7:87fe3144dcfa
1120 parent: 7:87fe3144dcfa
1121 user: test
1121 user: test
1122 date: Thu Jan 01 00:00:00 1970 +0000
1122 date: Thu Jan 01 00:00:00 1970 +0000
1123 summary: First merge, related
1123 summary: First merge, related
1124
1124
1125 changeset: 8:e5416ad8a855
1125 changeset: 8:e5416ad8a855
1126 parent: 6:dc6c325fe5ee
1126 parent: 6:dc6c325fe5ee
1127 user: test
1127 user: test
1128 date: Thu Jan 01 00:00:00 1970 +0000
1128 date: Thu Jan 01 00:00:00 1970 +0000
1129 summary: change foo in branch, related
1129 summary: change foo in branch, related
1130
1130
1131 changeset: 7:87fe3144dcfa
1131 changeset: 7:87fe3144dcfa
1132 user: test
1132 user: test
1133 date: Thu Jan 01 00:00:00 1970 +0000
1133 date: Thu Jan 01 00:00:00 1970 +0000
1134 summary: change foo, related
1134 summary: change foo, related
1135
1135
1136 changeset: 6:dc6c325fe5ee
1136 changeset: 6:dc6c325fe5ee
1137 user: test
1137 user: test
1138 date: Thu Jan 01 00:00:00 1970 +0000
1138 date: Thu Jan 01 00:00:00 1970 +0000
1139 summary: create foo, related
1139 summary: create foo, related
1140
1140
1141 changeset: 4:88176d361b69
1141 changeset: 4:88176d361b69
1142 user: test
1142 user: test
1143 date: Thu Jan 01 00:00:00 1970 +0000
1143 date: Thu Jan 01 00:00:00 1970 +0000
1144 summary: add foo, related
1144 summary: add foo, related
1145
1145
1146
1146
1147 Also check when maxrev < lastrevfilelog
1147 Also check when maxrev < lastrevfilelog
1148
1148
1149 $ hg --traceback log -f -r4 foo
1149 $ hg --traceback log -f -r4 foo
1150 changeset: 4:88176d361b69
1150 changeset: 4:88176d361b69
1151 user: test
1151 user: test
1152 date: Thu Jan 01 00:00:00 1970 +0000
1152 date: Thu Jan 01 00:00:00 1970 +0000
1153 summary: add foo, related
1153 summary: add foo, related
1154
1154
1155 $ cd ..
1155 $ cd ..
1156
1156
1157 Issue2383: hg log showing _less_ differences than hg diff
1157 Issue2383: hg log showing _less_ differences than hg diff
1158
1158
1159 $ hg init issue2383
1159 $ hg init issue2383
1160 $ cd issue2383
1160 $ cd issue2383
1161
1161
1162 Create a test repo:
1162 Create a test repo:
1163
1163
1164 $ echo a > a
1164 $ echo a > a
1165 $ hg ci -Am0
1165 $ hg ci -Am0
1166 adding a
1166 adding a
1167 $ echo b > b
1167 $ echo b > b
1168 $ hg ci -Am1
1168 $ hg ci -Am1
1169 adding b
1169 adding b
1170 $ hg co 0
1170 $ hg co 0
1171 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1171 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1172 $ echo b > a
1172 $ echo b > a
1173 $ hg ci -m2
1173 $ hg ci -m2
1174 created new head
1174 created new head
1175
1175
1176 Merge:
1176 Merge:
1177
1177
1178 $ hg merge
1178 $ hg merge
1179 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1179 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1180 (branch merge, don't forget to commit)
1180 (branch merge, don't forget to commit)
1181
1181
1182 Make sure there's a file listed in the merge to trigger the bug:
1182 Make sure there's a file listed in the merge to trigger the bug:
1183
1183
1184 $ echo c > a
1184 $ echo c > a
1185 $ hg ci -m3
1185 $ hg ci -m3
1186
1186
1187 Two files shown here in diff:
1187 Two files shown here in diff:
1188
1188
1189 $ hg diff --rev 2:3
1189 $ hg diff --rev 2:3
1190 diff -r b09be438c43a -r 8e07aafe1edc a
1190 diff -r b09be438c43a -r 8e07aafe1edc a
1191 --- a/a Thu Jan 01 00:00:00 1970 +0000
1191 --- a/a Thu Jan 01 00:00:00 1970 +0000
1192 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1192 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1193 @@ -1,1 +1,1 @@
1193 @@ -1,1 +1,1 @@
1194 -b
1194 -b
1195 +c
1195 +c
1196 diff -r b09be438c43a -r 8e07aafe1edc b
1196 diff -r b09be438c43a -r 8e07aafe1edc b
1197 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1197 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1198 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1198 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1199 @@ -0,0 +1,1 @@
1199 @@ -0,0 +1,1 @@
1200 +b
1200 +b
1201
1201
1202 Diff here should be the same:
1202 Diff here should be the same:
1203
1203
1204 $ hg log -vpr 3
1204 $ hg log -vpr 3
1205 changeset: 3:8e07aafe1edc
1205 changeset: 3:8e07aafe1edc
1206 tag: tip
1206 tag: tip
1207 parent: 2:b09be438c43a
1207 parent: 2:b09be438c43a
1208 parent: 1:925d80f479bb
1208 parent: 1:925d80f479bb
1209 user: test
1209 user: test
1210 date: Thu Jan 01 00:00:00 1970 +0000
1210 date: Thu Jan 01 00:00:00 1970 +0000
1211 files: a
1211 files: a
1212 description:
1212 description:
1213 3
1213 3
1214
1214
1215
1215
1216 diff -r b09be438c43a -r 8e07aafe1edc a
1216 diff -r b09be438c43a -r 8e07aafe1edc a
1217 --- a/a Thu Jan 01 00:00:00 1970 +0000
1217 --- a/a Thu Jan 01 00:00:00 1970 +0000
1218 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1218 +++ b/a Thu Jan 01 00:00:00 1970 +0000
1219 @@ -1,1 +1,1 @@
1219 @@ -1,1 +1,1 @@
1220 -b
1220 -b
1221 +c
1221 +c
1222 diff -r b09be438c43a -r 8e07aafe1edc b
1222 diff -r b09be438c43a -r 8e07aafe1edc b
1223 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1223 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1224 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1224 +++ b/b Thu Jan 01 00:00:00 1970 +0000
1225 @@ -0,0 +1,1 @@
1225 @@ -0,0 +1,1 @@
1226 +b
1226 +b
1227
1227
1228 $ cd ..
1228 $ cd ..
1229
1229
1230 'hg log -r rev fn' when last(filelog(fn)) != rev
1230 'hg log -r rev fn' when last(filelog(fn)) != rev
1231
1231
1232 $ hg init simplelog
1232 $ hg init simplelog
1233 $ cd simplelog
1233 $ cd simplelog
1234 $ echo f > a
1234 $ echo f > a
1235 $ hg ci -Am'a' -d '0 0'
1235 $ hg ci -Am'a' -d '0 0'
1236 adding a
1236 adding a
1237 $ echo f >> a
1237 $ echo f >> a
1238 $ hg ci -Am'a bis' -d '1 0'
1238 $ hg ci -Am'a bis' -d '1 0'
1239
1239
1240 $ hg log -r0 a
1240 $ hg log -r0 a
1241 changeset: 0:9f758d63dcde
1241 changeset: 0:9f758d63dcde
1242 user: test
1242 user: test
1243 date: Thu Jan 01 00:00:00 1970 +0000
1243 date: Thu Jan 01 00:00:00 1970 +0000
1244 summary: a
1244 summary: a
1245
1245
1246 enable obsolete to test hidden feature
1246 enable obsolete to test hidden feature
1247
1247
1248 $ cat > ${TESTTMP}/obs.py << EOF
1248 $ cat > ${TESTTMP}/obs.py << EOF
1249 > import mercurial.obsolete
1249 > import mercurial.obsolete
1250 > mercurial.obsolete._enabled = True
1250 > mercurial.obsolete._enabled = True
1251 > EOF
1251 > EOF
1252 $ echo '[extensions]' >> $HGRCPATH
1252 $ echo '[extensions]' >> $HGRCPATH
1253 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
1253 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
1254
1254
1255 $ hg log --template='{rev}:{node}\n'
1255 $ hg log --template='{rev}:{node}\n'
1256 1:a765632148dc55d38c35c4f247c618701886cb2f
1256 1:a765632148dc55d38c35c4f247c618701886cb2f
1257 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1257 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1258 $ hg debugobsolete a765632148dc55d38c35c4f247c618701886cb2f
1258 $ hg debugobsolete a765632148dc55d38c35c4f247c618701886cb2f
1259 $ hg up null -q
1259 $ hg up null -q
1260 $ hg log --template='{rev}:{node}\n'
1260 $ hg log --template='{rev}:{node}\n'
1261 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1261 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1262 $ hg log --template='{rev}:{node}\n' --hidden
1262 $ hg log --template='{rev}:{node}\n' --hidden
1263 1:a765632148dc55d38c35c4f247c618701886cb2f
1263 1:a765632148dc55d38c35c4f247c618701886cb2f
1264 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1264 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1265 $ hg log -r a
1265 $ hg log -r a
1266 abort: unknown revision 'a'!
1266 abort: unknown revision 'a'!
1267 [255]
1267 [255]
1268
1268
1269 test that parent prevent a changeset to be hidden
1269 test that parent prevent a changeset to be hidden
1270
1270
1271 $ hg up 1 -q --hidden
1271 $ hg up 1 -q --hidden
1272 $ hg log --template='{rev}:{node}\n'
1272 $ hg log --template='{rev}:{node}\n'
1273 1:a765632148dc55d38c35c4f247c618701886cb2f
1273 1:a765632148dc55d38c35c4f247c618701886cb2f
1274 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1274 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1275
1275
1276 test that second parent prevent a changeset to be hidden too
1276 test that second parent prevent a changeset to be hidden too
1277
1277
1278 $ hg debugsetparents 0 1 # nothing suitable to merge here
1278 $ hg debugsetparents 0 1 # nothing suitable to merge here
1279 $ hg log --template='{rev}:{node}\n'
1279 $ hg log --template='{rev}:{node}\n'
1280 1:a765632148dc55d38c35c4f247c618701886cb2f
1280 1:a765632148dc55d38c35c4f247c618701886cb2f
1281 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1281 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1282 $ hg debugsetparents 1
1282 $ hg debugsetparents 1
1283 $ hg up -q null
1283 $ hg up -q null
1284
1284
1285 bookmarks prevent a changeset being hidden
1285 bookmarks prevent a changeset being hidden
1286
1286
1287 $ hg bookmark --hidden -r 1 X
1287 $ hg bookmark --hidden -r 1 X
1288 $ hg log --template '{rev}:{node}\n'
1288 $ hg log --template '{rev}:{node}\n'
1289 1:a765632148dc55d38c35c4f247c618701886cb2f
1289 1:a765632148dc55d38c35c4f247c618701886cb2f
1290 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1290 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1291 $ hg bookmark -d X
1291 $ hg bookmark -d X
1292
1292
1293 divergent bookmarks are not hidden
1293 divergent bookmarks are not hidden
1294
1294
1295 $ hg bookmark --hidden -r 1 X@foo
1295 $ hg bookmark --hidden -r 1 X@foo
1296 $ hg log --template '{rev}:{node}\n'
1296 $ hg log --template '{rev}:{node}\n'
1297 1:a765632148dc55d38c35c4f247c618701886cb2f
1297 1:a765632148dc55d38c35c4f247c618701886cb2f
1298 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1298 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
1299
1299
1300 clear extensions configuration
1300 clear extensions configuration
1301 $ echo '[extensions]' >> $HGRCPATH
1301 $ echo '[extensions]' >> $HGRCPATH
1302 $ echo "obs=!" >> $HGRCPATH
1302 $ echo "obs=!" >> $HGRCPATH
1303 $ cd ..
1303 $ cd ..
1304
1304
1305 test -u/-k for problematic encoding
1305 test -u/-k for problematic encoding
1306 # unicode: cp932:
1306 # unicode: cp932:
1307 # u30A2 0x83 0x41(= 'A')
1307 # u30A2 0x83 0x41(= 'A')
1308 # u30C2 0x83 0x61(= 'a')
1308 # u30C2 0x83 0x61(= 'a')
1309
1309
1310 $ hg init problematicencoding
1310 $ hg init problematicencoding
1311 $ cd problematicencoding
1311 $ cd problematicencoding
1312
1312
1313 $ python > setup.sh <<EOF
1313 $ python > setup.sh <<EOF
1314 > print u'''
1314 > print u'''
1315 > echo a > text
1315 > echo a > text
1316 > hg add text
1316 > hg add text
1317 > hg --encoding utf-8 commit -u '\u30A2' -m none
1317 > hg --encoding utf-8 commit -u '\u30A2' -m none
1318 > echo b > text
1318 > echo b > text
1319 > hg --encoding utf-8 commit -u '\u30C2' -m none
1319 > hg --encoding utf-8 commit -u '\u30C2' -m none
1320 > echo c > text
1320 > echo c > text
1321 > hg --encoding utf-8 commit -u none -m '\u30A2'
1321 > hg --encoding utf-8 commit -u none -m '\u30A2'
1322 > echo d > text
1322 > echo d > text
1323 > hg --encoding utf-8 commit -u none -m '\u30C2'
1323 > hg --encoding utf-8 commit -u none -m '\u30C2'
1324 > '''.encode('utf-8')
1324 > '''.encode('utf-8')
1325 > EOF
1325 > EOF
1326 $ sh < setup.sh
1326 $ sh < setup.sh
1327
1327
1328 test in problematic encoding
1328 test in problematic encoding
1329 $ python > test.sh <<EOF
1329 $ python > test.sh <<EOF
1330 > print u'''
1330 > print u'''
1331 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2'
1331 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2'
1332 > echo ====
1332 > echo ====
1333 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2'
1333 > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2'
1334 > echo ====
1334 > echo ====
1335 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2'
1335 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2'
1336 > echo ====
1336 > echo ====
1337 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2'
1337 > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2'
1338 > '''.encode('cp932')
1338 > '''.encode('cp932')
1339 > EOF
1339 > EOF
1340 $ sh < test.sh
1340 $ sh < test.sh
1341 0
1341 0
1342 ====
1342 ====
1343 1
1343 1
1344 ====
1344 ====
1345 2
1345 2
1346 0
1346 0
1347 ====
1347 ====
1348 3
1348 3
1349 1
1349 1
1350
1350
1351 $ cd ..
1351 $ cd ..
1352
1352
1353 test hg log on non-existent files and on directories
1353 test hg log on non-existent files and on directories
1354 $ hg init issue1340
1354 $ hg init issue1340
1355 $ cd issue1340
1355 $ cd issue1340
1356 $ mkdir d1; mkdir D2; mkdir D3.i; mkdir d4.hg; mkdir d5.d; mkdir .d6
1356 $ mkdir d1; mkdir D2; mkdir D3.i; mkdir d4.hg; mkdir d5.d; mkdir .d6
1357 $ echo 1 > d1/f1
1357 $ echo 1 > d1/f1
1358 $ echo 1 > D2/f1
1358 $ echo 1 > D2/f1
1359 $ echo 1 > D3.i/f1
1359 $ echo 1 > D3.i/f1
1360 $ echo 1 > d4.hg/f1
1360 $ echo 1 > d4.hg/f1
1361 $ echo 1 > d5.d/f1
1361 $ echo 1 > d5.d/f1
1362 $ echo 1 > .d6/f1
1362 $ echo 1 > .d6/f1
1363 $ hg -q add .
1363 $ hg -q add .
1364 $ hg commit -m "a bunch of weird directories"
1364 $ hg commit -m "a bunch of weird directories"
1365 $ hg log -l1 d1/f1 | grep changeset
1365 $ hg log -l1 d1/f1 | grep changeset
1366 changeset: 0:65624cd9070a
1366 changeset: 0:65624cd9070a
1367 $ hg log -l1 f1
1367 $ hg log -l1 f1
1368 $ hg log -l1 . | grep changeset
1368 $ hg log -l1 . | grep changeset
1369 changeset: 0:65624cd9070a
1369 changeset: 0:65624cd9070a
1370 $ hg log -l1 ./ | grep changeset
1370 $ hg log -l1 ./ | grep changeset
1371 changeset: 0:65624cd9070a
1371 changeset: 0:65624cd9070a
1372 $ hg log -l1 d1 | grep changeset
1372 $ hg log -l1 d1 | grep changeset
1373 changeset: 0:65624cd9070a
1373 changeset: 0:65624cd9070a
1374 $ hg log -l1 D2 | grep changeset
1374 $ hg log -l1 D2 | grep changeset
1375 changeset: 0:65624cd9070a
1375 changeset: 0:65624cd9070a
1376 $ hg log -l1 D2/f1 | grep changeset
1376 $ hg log -l1 D2/f1 | grep changeset
1377 changeset: 0:65624cd9070a
1377 changeset: 0:65624cd9070a
1378 $ hg log -l1 D3.i | grep changeset
1378 $ hg log -l1 D3.i | grep changeset
1379 changeset: 0:65624cd9070a
1379 changeset: 0:65624cd9070a
1380 $ hg log -l1 D3.i/f1 | grep changeset
1380 $ hg log -l1 D3.i/f1 | grep changeset
1381 changeset: 0:65624cd9070a
1381 changeset: 0:65624cd9070a
1382 $ hg log -l1 d4.hg | grep changeset
1382 $ hg log -l1 d4.hg | grep changeset
1383 changeset: 0:65624cd9070a
1383 changeset: 0:65624cd9070a
1384 $ hg log -l1 d4.hg/f1 | grep changeset
1384 $ hg log -l1 d4.hg/f1 | grep changeset
1385 changeset: 0:65624cd9070a
1385 changeset: 0:65624cd9070a
1386 $ hg log -l1 d5.d | grep changeset
1386 $ hg log -l1 d5.d | grep changeset
1387 changeset: 0:65624cd9070a
1387 changeset: 0:65624cd9070a
1388 $ hg log -l1 d5.d/f1 | grep changeset
1388 $ hg log -l1 d5.d/f1 | grep changeset
1389 changeset: 0:65624cd9070a
1389 changeset: 0:65624cd9070a
1390 $ hg log -l1 .d6 | grep changeset
1390 $ hg log -l1 .d6 | grep changeset
1391 changeset: 0:65624cd9070a
1391 changeset: 0:65624cd9070a
1392 $ hg log -l1 .d6/f1 | grep changeset
1392 $ hg log -l1 .d6/f1 | grep changeset
1393 changeset: 0:65624cd9070a
1393 changeset: 0:65624cd9070a
1394
1394
1395 issue3772: hg log -r :null showing revision 0 as well
1395 issue3772: hg log -r :null showing revision 0 as well
1396
1396
1397 $ hg log -r :null
1397 $ hg log -r :null
1398 changeset: 0:65624cd9070a
1398 changeset: 0:65624cd9070a
1399 tag: tip
1399 tag: tip
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: a bunch of weird directories
1402 summary: a bunch of weird directories
1403
1403
1404 changeset: -1:000000000000
1404 changeset: -1:000000000000
1405 user:
1405 user:
1406 date: Thu Jan 01 00:00:00 1970 +0000
1406 date: Thu Jan 01 00:00:00 1970 +0000
1407
1407
1408 $ hg log -r null:null
1408 $ hg log -r null:null
1409 changeset: -1:000000000000
1409 changeset: -1:000000000000
1410 user:
1410 user:
1411 date: Thu Jan 01 00:00:00 1970 +0000
1411 date: Thu Jan 01 00:00:00 1970 +0000
1412
1412
1413
1413
1414 $ cd ..
1414 $ cd ..
@@ -1,379 +1,379 b''
1 $ "$TESTDIR/hghave" symlink execbit || exit 80
1 $ "$TESTDIR/hghave" symlink execbit || exit 80
2
2
3 $ tellmeabout() {
3 $ tellmeabout() {
4 > if [ -h $1 ]; then
4 > if [ -h $1 ]; then
5 > echo $1 is a symlink:
5 > echo $1 is a symlink:
6 > $TESTDIR/readlink.py $1
6 > $TESTDIR/readlink.py $1
7 > elif [ -x $1 ]; then
7 > elif [ -x $1 ]; then
8 > echo $1 is an executable file with content:
8 > echo $1 is an executable file with content:
9 > cat $1
9 > cat $1
10 > else
10 > else
11 > echo $1 is a plain file with content:
11 > echo $1 is a plain file with content:
12 > cat $1
12 > cat $1
13 > fi
13 > fi
14 > }
14 > }
15
15
16 $ hg init test1
16 $ hg init test1
17 $ cd test1
17 $ cd test1
18
18
19 $ echo a > a
19 $ echo a > a
20 $ hg ci -Aqmadd
20 $ hg ci -Aqmadd
21 $ chmod +x a
21 $ chmod +x a
22 $ hg ci -mexecutable
22 $ hg ci -mexecutable
23
23
24 $ hg up -q 0
24 $ hg up -q 0
25 $ rm a
25 $ rm a
26 $ ln -s symlink a
26 $ ln -s symlink a
27 $ hg ci -msymlink
27 $ hg ci -msymlink
28 created new head
28 created new head
29
29
30 Symlink is local parent, executable is other:
30 Symlink is local parent, executable is other:
31
31
32 $ hg merge --debug
32 $ hg merge --debug
33 searching for copies back to rev 1
33 searching for copies back to rev 1
34 resolving manifests
34 resolving manifests
35 branchmerge: True, force: False, partial: False
35 branchmerge: True, force: False, partial: False
36 ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
36 ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
37 preserving a for resolve of a
37 preserving a for resolve of a
38 a: versions differ -> m
38 a: versions differ -> m
39 updating: a 1/1 files (100.00%)
39 updating: a 1/1 files (100.00%)
40 picked tool 'internal:merge' for a (binary False symlink True)
40 picked tool 'internal:merge' for a (binary False symlink True)
41 merging a
41 merging a
42 my a@521a1e40188f+ other a@3574f3e69b1c ancestor a@c334dc3be0da
42 my a@521a1e40188f+ other a@3574f3e69b1c ancestor a@c334dc3be0da
43 warning: internal:merge cannot merge symlinks for a
43 warning: internal:merge cannot merge symlinks for a
44 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
44 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
45 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
45 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
46 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
46 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
47 [1]
47 [1]
48
48
49 $ tellmeabout a
49 $ tellmeabout a
50 a is a symlink:
50 a is a symlink:
51 a -> symlink
51 a -> symlink
52 $ hg resolve a --tool internal:other
52 $ hg resolve a --tool internal:other
53 no more unresolved files
53 (no more unresolved files)
54 $ tellmeabout a
54 $ tellmeabout a
55 a is an executable file with content:
55 a is an executable file with content:
56 a
56 a
57 $ hg st
57 $ hg st
58 M a
58 M a
59 ? a.orig
59 ? a.orig
60
60
61 Symlink is other parent, executable is local:
61 Symlink is other parent, executable is local:
62
62
63 $ hg update -C 1
63 $ hg update -C 1
64 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
64 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
65
65
66 $ hg merge --debug
66 $ hg merge --debug
67 searching for copies back to rev 1
67 searching for copies back to rev 1
68 resolving manifests
68 resolving manifests
69 branchmerge: True, force: False, partial: False
69 branchmerge: True, force: False, partial: False
70 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
70 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
71 preserving a for resolve of a
71 preserving a for resolve of a
72 a: versions differ -> m
72 a: versions differ -> m
73 updating: a 1/1 files (100.00%)
73 updating: a 1/1 files (100.00%)
74 picked tool 'internal:merge' for a (binary False symlink True)
74 picked tool 'internal:merge' for a (binary False symlink True)
75 merging a
75 merging a
76 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
76 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
77 warning: internal:merge cannot merge symlinks for a
77 warning: internal:merge cannot merge symlinks for a
78 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
78 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
79 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
79 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
80 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
80 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
81 [1]
81 [1]
82
82
83 $ tellmeabout a
83 $ tellmeabout a
84 a is an executable file with content:
84 a is an executable file with content:
85 a
85 a
86
86
87 Update to link without local change should get us a symlink (issue3316):
87 Update to link without local change should get us a symlink (issue3316):
88
88
89 $ hg up -C 0
89 $ hg up -C 0
90 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
90 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
91 $ hg up
91 $ hg up
92 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
92 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
93 $ hg st
93 $ hg st
94 ? a.orig
94 ? a.orig
95
95
96 Update to link with local change should cause a merge prompt (issue3200):
96 Update to link with local change should cause a merge prompt (issue3200):
97
97
98 $ hg up -Cq 0
98 $ hg up -Cq 0
99 $ echo data > a
99 $ echo data > a
100 $ HGMERGE= hg up -y --debug
100 $ HGMERGE= hg up -y --debug
101 searching for copies back to rev 2
101 searching for copies back to rev 2
102 resolving manifests
102 resolving manifests
103 branchmerge: False, force: False, partial: False
103 branchmerge: False, force: False, partial: False
104 ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
104 ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
105 preserving a for resolve of a
105 preserving a for resolve of a
106 a: versions differ -> m
106 a: versions differ -> m
107 updating: a 1/1 files (100.00%)
107 updating: a 1/1 files (100.00%)
108 (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
108 (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
109 picked tool 'internal:prompt' for a (binary False symlink True)
109 picked tool 'internal:prompt' for a (binary False symlink True)
110 no tool found to merge a
110 no tool found to merge a
111 keep (l)ocal or take (o)ther? l
111 keep (l)ocal or take (o)ther? l
112 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
112 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
113 $ hg diff --git
113 $ hg diff --git
114 diff --git a/a b/a
114 diff --git a/a b/a
115 old mode 120000
115 old mode 120000
116 new mode 100644
116 new mode 100644
117 --- a/a
117 --- a/a
118 +++ b/a
118 +++ b/a
119 @@ -1,1 +1,1 @@
119 @@ -1,1 +1,1 @@
120 -symlink
120 -symlink
121 \ No newline at end of file
121 \ No newline at end of file
122 +data
122 +data
123
123
124
124
125 Test only 'l' change - happens rarely, except when recovering from situations
125 Test only 'l' change - happens rarely, except when recovering from situations
126 where that was what happened.
126 where that was what happened.
127
127
128 $ hg init test2
128 $ hg init test2
129 $ cd test2
129 $ cd test2
130 $ printf base > f
130 $ printf base > f
131 $ hg ci -Aqm0
131 $ hg ci -Aqm0
132 $ echo file > f
132 $ echo file > f
133 $ echo content >> f
133 $ echo content >> f
134 $ hg ci -qm1
134 $ hg ci -qm1
135 $ hg up -qr0
135 $ hg up -qr0
136 $ rm f
136 $ rm f
137 $ ln -s base f
137 $ ln -s base f
138 $ hg ci -qm2
138 $ hg ci -qm2
139 $ hg merge
139 $ hg merge
140 merging f
140 merging f
141 warning: internal:merge cannot merge symlinks for f
141 warning: internal:merge cannot merge symlinks for f
142 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
142 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
143 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
143 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
144 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
144 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
145 [1]
145 [1]
146 $ tellmeabout f
146 $ tellmeabout f
147 f is a symlink:
147 f is a symlink:
148 f -> base
148 f -> base
149
149
150 $ hg up -Cqr1
150 $ hg up -Cqr1
151 $ hg merge
151 $ hg merge
152 merging f
152 merging f
153 warning: internal:merge cannot merge symlinks for f
153 warning: internal:merge cannot merge symlinks for f
154 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
154 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
155 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
155 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
156 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
156 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
157 [1]
157 [1]
158 $ tellmeabout f
158 $ tellmeabout f
159 f is a plain file with content:
159 f is a plain file with content:
160 file
160 file
161 content
161 content
162
162
163 $ cd ..
163 $ cd ..
164
164
165 Test removed 'x' flag merged with change to symlink
165 Test removed 'x' flag merged with change to symlink
166
166
167 $ hg init test3
167 $ hg init test3
168 $ cd test3
168 $ cd test3
169 $ echo f > f
169 $ echo f > f
170 $ chmod +x f
170 $ chmod +x f
171 $ hg ci -Aqm0
171 $ hg ci -Aqm0
172 $ chmod -x f
172 $ chmod -x f
173 $ hg ci -qm1
173 $ hg ci -qm1
174 $ hg up -qr0
174 $ hg up -qr0
175 $ rm f
175 $ rm f
176 $ ln -s dangling f
176 $ ln -s dangling f
177 $ hg ci -qm2
177 $ hg ci -qm2
178 $ hg merge
178 $ hg merge
179 merging f
179 merging f
180 warning: internal:merge cannot merge symlinks for f
180 warning: internal:merge cannot merge symlinks for f
181 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
181 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
182 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
182 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
183 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
183 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
184 [1]
184 [1]
185 $ tellmeabout f
185 $ tellmeabout f
186 f is a symlink:
186 f is a symlink:
187 f -> dangling
187 f -> dangling
188
188
189 $ hg up -Cqr1
189 $ hg up -Cqr1
190 $ hg merge
190 $ hg merge
191 merging f
191 merging f
192 warning: internal:merge cannot merge symlinks for f
192 warning: internal:merge cannot merge symlinks for f
193 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
193 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
194 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
194 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
195 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
195 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
196 [1]
196 [1]
197 $ tellmeabout f
197 $ tellmeabout f
198 f is a plain file with content:
198 f is a plain file with content:
199 f
199 f
200
200
201 Test removed 'x' flag merged with content change - both ways
201 Test removed 'x' flag merged with content change - both ways
202
202
203 $ hg up -Cqr0
203 $ hg up -Cqr0
204 $ echo change > f
204 $ echo change > f
205 $ hg ci -qm3
205 $ hg ci -qm3
206 $ hg merge -r1
206 $ hg merge -r1
207 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
207 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
208 (branch merge, don't forget to commit)
208 (branch merge, don't forget to commit)
209 $ tellmeabout f
209 $ tellmeabout f
210 f is a plain file with content:
210 f is a plain file with content:
211 change
211 change
212
212
213 $ hg up -qCr1
213 $ hg up -qCr1
214 $ hg merge -r3
214 $ hg merge -r3
215 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
215 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
216 (branch merge, don't forget to commit)
216 (branch merge, don't forget to commit)
217 $ tellmeabout f
217 $ tellmeabout f
218 f is a plain file with content:
218 f is a plain file with content:
219 change
219 change
220
220
221 $ cd ..
221 $ cd ..
222
222
223 Test merge with no common ancestor:
223 Test merge with no common ancestor:
224 a: just different
224 a: just different
225 b: x vs -, different (cannot calculate x, cannot ask merge tool)
225 b: x vs -, different (cannot calculate x, cannot ask merge tool)
226 c: x vs -, same (cannot calculate x, merge tool is no good)
226 c: x vs -, same (cannot calculate x, merge tool is no good)
227 d: x vs l, different
227 d: x vs l, different
228 e: x vs l, same
228 e: x vs l, same
229 f: - vs l, different
229 f: - vs l, different
230 g: - vs l, same
230 g: - vs l, same
231 h: l vs l, different
231 h: l vs l, different
232 (where same means the filelog entry is shared and there thus is an ancestor!)
232 (where same means the filelog entry is shared and there thus is an ancestor!)
233
233
234 $ hg init test4
234 $ hg init test4
235 $ cd test4
235 $ cd test4
236 $ echo 0 > 0
236 $ echo 0 > 0
237 $ hg ci -Aqm0
237 $ hg ci -Aqm0
238
238
239 $ echo 1 > a
239 $ echo 1 > a
240 $ echo 1 > b
240 $ echo 1 > b
241 $ chmod +x b
241 $ chmod +x b
242 $ echo x > c
242 $ echo x > c
243 $ chmod +x c
243 $ chmod +x c
244 $ echo 1 > d
244 $ echo 1 > d
245 $ chmod +x d
245 $ chmod +x d
246 $ printf x > e
246 $ printf x > e
247 $ chmod +x e
247 $ chmod +x e
248 $ echo 1 > f
248 $ echo 1 > f
249 $ printf x > g
249 $ printf x > g
250 $ ln -s 1 h
250 $ ln -s 1 h
251 $ hg ci -qAm1
251 $ hg ci -qAm1
252
252
253 $ hg up -qr0
253 $ hg up -qr0
254 $ echo 2 > a
254 $ echo 2 > a
255 $ echo 2 > b
255 $ echo 2 > b
256 $ echo x > c
256 $ echo x > c
257 $ ln -s 2 d
257 $ ln -s 2 d
258 $ ln -s x e
258 $ ln -s x e
259 $ ln -s 2 f
259 $ ln -s 2 f
260 $ ln -s x g
260 $ ln -s x g
261 $ ln -s 2 h
261 $ ln -s 2 h
262 $ hg ci -Aqm2
262 $ hg ci -Aqm2
263
263
264 $ hg merge
264 $ hg merge
265 merging a
265 merging a
266 warning: conflicts during merge.
266 warning: conflicts during merge.
267 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
267 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
268 warning: cannot merge flags for b
268 warning: cannot merge flags for b
269 merging b
269 merging b
270 warning: conflicts during merge.
270 warning: conflicts during merge.
271 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
271 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
272 warning: cannot merge flags for c
272 warning: cannot merge flags for c
273 merging d
273 merging d
274 warning: internal:merge cannot merge symlinks for d
274 warning: internal:merge cannot merge symlinks for d
275 merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
275 merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
276 merging f
276 merging f
277 warning: internal:merge cannot merge symlinks for f
277 warning: internal:merge cannot merge symlinks for f
278 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
278 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
279 merging h
279 merging h
280 warning: internal:merge cannot merge symlinks for h
280 warning: internal:merge cannot merge symlinks for h
281 merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
281 merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
282 3 files updated, 0 files merged, 0 files removed, 5 files unresolved
282 3 files updated, 0 files merged, 0 files removed, 5 files unresolved
283 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
283 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
284 [1]
284 [1]
285 $ hg resolve -l
285 $ hg resolve -l
286 U a
286 U a
287 U b
287 U b
288 U d
288 U d
289 U f
289 U f
290 U h
290 U h
291 $ tellmeabout a
291 $ tellmeabout a
292 a is a plain file with content:
292 a is a plain file with content:
293 <<<<<<< local: 0139c5610547 - test: 2
293 <<<<<<< local: 0139c5610547 - test: 2
294 2
294 2
295 =======
295 =======
296 1
296 1
297 >>>>>>> other: 97e29675e796 - test: 1
297 >>>>>>> other: 97e29675e796 - test: 1
298 $ tellmeabout b
298 $ tellmeabout b
299 b is a plain file with content:
299 b is a plain file with content:
300 <<<<<<< local: 0139c5610547 - test: 2
300 <<<<<<< local: 0139c5610547 - test: 2
301 2
301 2
302 =======
302 =======
303 1
303 1
304 >>>>>>> other: 97e29675e796 - test: 1
304 >>>>>>> other: 97e29675e796 - test: 1
305 $ tellmeabout c
305 $ tellmeabout c
306 c is a plain file with content:
306 c is a plain file with content:
307 x
307 x
308 $ tellmeabout d
308 $ tellmeabout d
309 d is a symlink:
309 d is a symlink:
310 d -> 2
310 d -> 2
311 $ tellmeabout e
311 $ tellmeabout e
312 e is a symlink:
312 e is a symlink:
313 e -> x
313 e -> x
314 $ tellmeabout f
314 $ tellmeabout f
315 f is a symlink:
315 f is a symlink:
316 f -> 2
316 f -> 2
317 $ tellmeabout g
317 $ tellmeabout g
318 g is a symlink:
318 g is a symlink:
319 g -> x
319 g -> x
320 $ tellmeabout h
320 $ tellmeabout h
321 h is a symlink:
321 h is a symlink:
322 h -> 2
322 h -> 2
323
323
324 $ hg up -Cqr1
324 $ hg up -Cqr1
325 $ hg merge
325 $ hg merge
326 merging a
326 merging a
327 warning: conflicts during merge.
327 warning: conflicts during merge.
328 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
328 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
329 warning: cannot merge flags for b
329 warning: cannot merge flags for b
330 merging b
330 merging b
331 warning: conflicts during merge.
331 warning: conflicts during merge.
332 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
332 merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
333 warning: cannot merge flags for c
333 warning: cannot merge flags for c
334 merging d
334 merging d
335 warning: internal:merge cannot merge symlinks for d
335 warning: internal:merge cannot merge symlinks for d
336 merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
336 merging d incomplete! (edit conflicts, then use 'hg resolve --mark')
337 merging f
337 merging f
338 warning: internal:merge cannot merge symlinks for f
338 warning: internal:merge cannot merge symlinks for f
339 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
339 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
340 merging h
340 merging h
341 warning: internal:merge cannot merge symlinks for h
341 warning: internal:merge cannot merge symlinks for h
342 merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
342 merging h incomplete! (edit conflicts, then use 'hg resolve --mark')
343 3 files updated, 0 files merged, 0 files removed, 5 files unresolved
343 3 files updated, 0 files merged, 0 files removed, 5 files unresolved
344 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
344 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
345 [1]
345 [1]
346 $ tellmeabout a
346 $ tellmeabout a
347 a is a plain file with content:
347 a is a plain file with content:
348 <<<<<<< local: 97e29675e796 - test: 1
348 <<<<<<< local: 97e29675e796 - test: 1
349 1
349 1
350 =======
350 =======
351 2
351 2
352 >>>>>>> other: 0139c5610547 - test: 2
352 >>>>>>> other: 0139c5610547 - test: 2
353 $ tellmeabout b
353 $ tellmeabout b
354 b is an executable file with content:
354 b is an executable file with content:
355 <<<<<<< local: 97e29675e796 - test: 1
355 <<<<<<< local: 97e29675e796 - test: 1
356 1
356 1
357 =======
357 =======
358 2
358 2
359 >>>>>>> other: 0139c5610547 - test: 2
359 >>>>>>> other: 0139c5610547 - test: 2
360 $ tellmeabout c
360 $ tellmeabout c
361 c is an executable file with content:
361 c is an executable file with content:
362 x
362 x
363 $ tellmeabout d
363 $ tellmeabout d
364 d is an executable file with content:
364 d is an executable file with content:
365 1
365 1
366 $ tellmeabout e
366 $ tellmeabout e
367 e is an executable file with content:
367 e is an executable file with content:
368 x (no-eol)
368 x (no-eol)
369 $ tellmeabout f
369 $ tellmeabout f
370 f is a plain file with content:
370 f is a plain file with content:
371 1
371 1
372 $ tellmeabout g
372 $ tellmeabout g
373 g is a plain file with content:
373 g is a plain file with content:
374 x (no-eol)
374 x (no-eol)
375 $ tellmeabout h
375 $ tellmeabout h
376 h is a symlink:
376 h is a symlink:
377 h -> 1
377 h -> 1
378
378
379 $ cd ..
379 $ cd ..
@@ -1,148 +1,148 b''
1 initial
1 initial
2 $ hg init test-a
2 $ hg init test-a
3 $ cd test-a
3 $ cd test-a
4 $ cat >test.txt <<"EOF"
4 $ cat >test.txt <<"EOF"
5 > 1
5 > 1
6 > 2
6 > 2
7 > 3
7 > 3
8 > EOF
8 > EOF
9 $ hg add test.txt
9 $ hg add test.txt
10 $ hg commit -m "Initial"
10 $ hg commit -m "Initial"
11
11
12 clone
12 clone
13 $ cd ..
13 $ cd ..
14 $ hg clone test-a test-b
14 $ hg clone test-a test-b
15 updating to branch default
15 updating to branch default
16 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
17
17
18 change test-a
18 change test-a
19 $ cd test-a
19 $ cd test-a
20 $ cat >test.txt <<"EOF"
20 $ cat >test.txt <<"EOF"
21 > one
21 > one
22 > two
22 > two
23 > three
23 > three
24 > EOF
24 > EOF
25 $ hg commit -m "Numbers as words"
25 $ hg commit -m "Numbers as words"
26
26
27 change test-b
27 change test-b
28 $ cd ../test-b
28 $ cd ../test-b
29 $ cat >test.txt <<"EOF"
29 $ cat >test.txt <<"EOF"
30 > 1
30 > 1
31 > 2.5
31 > 2.5
32 > 3
32 > 3
33 > EOF
33 > EOF
34 $ hg commit -m "2 -> 2.5"
34 $ hg commit -m "2 -> 2.5"
35
35
36 now pull and merge from test-a
36 now pull and merge from test-a
37 $ hg pull ../test-a
37 $ hg pull ../test-a
38 pulling from ../test-a
38 pulling from ../test-a
39 searching for changes
39 searching for changes
40 adding changesets
40 adding changesets
41 adding manifests
41 adding manifests
42 adding file changes
42 adding file changes
43 added 1 changesets with 1 changes to 1 files (+1 heads)
43 added 1 changesets with 1 changes to 1 files (+1 heads)
44 (run 'hg heads' to see heads, 'hg merge' to merge)
44 (run 'hg heads' to see heads, 'hg merge' to merge)
45 $ hg merge
45 $ hg merge
46 merging test.txt
46 merging test.txt
47 warning: conflicts during merge.
47 warning: conflicts during merge.
48 merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
48 merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
49 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
49 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
50 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
50 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
51 [1]
51 [1]
52 resolve conflict
52 resolve conflict
53 $ cat >test.txt <<"EOF"
53 $ cat >test.txt <<"EOF"
54 > one
54 > one
55 > two-point-five
55 > two-point-five
56 > three
56 > three
57 > EOF
57 > EOF
58 $ rm -f *.orig
58 $ rm -f *.orig
59 $ hg resolve -m test.txt
59 $ hg resolve -m test.txt
60 no more unresolved files
60 (no more unresolved files)
61 $ hg commit -m "Merge 1"
61 $ hg commit -m "Merge 1"
62
62
63 change test-a again
63 change test-a again
64 $ cd ../test-a
64 $ cd ../test-a
65 $ cat >test.txt <<"EOF"
65 $ cat >test.txt <<"EOF"
66 > one
66 > one
67 > two-point-one
67 > two-point-one
68 > three
68 > three
69 > EOF
69 > EOF
70 $ hg commit -m "two -> two-point-one"
70 $ hg commit -m "two -> two-point-one"
71
71
72 pull and merge from test-a again
72 pull and merge from test-a again
73 $ cd ../test-b
73 $ cd ../test-b
74 $ hg pull ../test-a
74 $ hg pull ../test-a
75 pulling from ../test-a
75 pulling from ../test-a
76 searching for changes
76 searching for changes
77 adding changesets
77 adding changesets
78 adding manifests
78 adding manifests
79 adding file changes
79 adding file changes
80 added 1 changesets with 1 changes to 1 files (+1 heads)
80 added 1 changesets with 1 changes to 1 files (+1 heads)
81 (run 'hg heads' to see heads, 'hg merge' to merge)
81 (run 'hg heads' to see heads, 'hg merge' to merge)
82 $ hg merge --debug
82 $ hg merge --debug
83 searching for copies back to rev 1
83 searching for copies back to rev 1
84 resolving manifests
84 resolving manifests
85 branchmerge: True, force: False, partial: False
85 branchmerge: True, force: False, partial: False
86 ancestor: 96b70246a118, local: 50c3a7e29886+, remote: 40d11a4173a8
86 ancestor: 96b70246a118, local: 50c3a7e29886+, remote: 40d11a4173a8
87 preserving test.txt for resolve of test.txt
87 preserving test.txt for resolve of test.txt
88 test.txt: versions differ -> m
88 test.txt: versions differ -> m
89 updating: test.txt 1/1 files (100.00%)
89 updating: test.txt 1/1 files (100.00%)
90 picked tool 'internal:merge' for test.txt (binary False symlink False)
90 picked tool 'internal:merge' for test.txt (binary False symlink False)
91 merging test.txt
91 merging test.txt
92 my test.txt@50c3a7e29886+ other test.txt@40d11a4173a8 ancestor test.txt@96b70246a118
92 my test.txt@50c3a7e29886+ other test.txt@40d11a4173a8 ancestor test.txt@96b70246a118
93 warning: conflicts during merge.
93 warning: conflicts during merge.
94 merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
94 merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
95 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
95 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
96 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
96 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
97 [1]
97 [1]
98
98
99 $ cat test.txt
99 $ cat test.txt
100 one
100 one
101 <<<<<<< local: 50c3a7e29886 - test: Merge 1
101 <<<<<<< local: 50c3a7e29886 - test: Merge 1
102 two-point-five
102 two-point-five
103 =======
103 =======
104 two-point-one
104 two-point-one
105 >>>>>>> other: 40d11a4173a8 - test: two -> two-point-one
105 >>>>>>> other: 40d11a4173a8 - test: two -> two-point-one
106 three
106 three
107
107
108 $ hg debugindex test.txt
108 $ hg debugindex test.txt
109 rev offset length ..... linkrev nodeid p1 p2 (re)
109 rev offset length ..... linkrev nodeid p1 p2 (re)
110 0 0 7 ..... 0 01365c4cca56 000000000000 000000000000 (re)
110 0 0 7 ..... 0 01365c4cca56 000000000000 000000000000 (re)
111 1 7 9 ..... 1 7b013192566a 01365c4cca56 000000000000 (re)
111 1 7 9 ..... 1 7b013192566a 01365c4cca56 000000000000 (re)
112 2 16 15 ..... 2 8fe46a3eb557 01365c4cca56 000000000000 (re)
112 2 16 15 ..... 2 8fe46a3eb557 01365c4cca56 000000000000 (re)
113 3 31 2. ..... 3 fc3148072371 7b013192566a 8fe46a3eb557 (re)
113 3 31 2. ..... 3 fc3148072371 7b013192566a 8fe46a3eb557 (re)
114 4 5. 25 ..... 4 d40249267ae3 8fe46a3eb557 000000000000 (re)
114 4 5. 25 ..... 4 d40249267ae3 8fe46a3eb557 000000000000 (re)
115
115
116 $ hg log
116 $ hg log
117 changeset: 4:40d11a4173a8
117 changeset: 4:40d11a4173a8
118 tag: tip
118 tag: tip
119 parent: 2:96b70246a118
119 parent: 2:96b70246a118
120 user: test
120 user: test
121 date: Thu Jan 01 00:00:00 1970 +0000
121 date: Thu Jan 01 00:00:00 1970 +0000
122 summary: two -> two-point-one
122 summary: two -> two-point-one
123
123
124 changeset: 3:50c3a7e29886
124 changeset: 3:50c3a7e29886
125 parent: 1:d1e159716d41
125 parent: 1:d1e159716d41
126 parent: 2:96b70246a118
126 parent: 2:96b70246a118
127 user: test
127 user: test
128 date: Thu Jan 01 00:00:00 1970 +0000
128 date: Thu Jan 01 00:00:00 1970 +0000
129 summary: Merge 1
129 summary: Merge 1
130
130
131 changeset: 2:96b70246a118
131 changeset: 2:96b70246a118
132 parent: 0:b1832b9d912a
132 parent: 0:b1832b9d912a
133 user: test
133 user: test
134 date: Thu Jan 01 00:00:00 1970 +0000
134 date: Thu Jan 01 00:00:00 1970 +0000
135 summary: Numbers as words
135 summary: Numbers as words
136
136
137 changeset: 1:d1e159716d41
137 changeset: 1:d1e159716d41
138 user: test
138 user: test
139 date: Thu Jan 01 00:00:00 1970 +0000
139 date: Thu Jan 01 00:00:00 1970 +0000
140 summary: 2 -> 2.5
140 summary: 2 -> 2.5
141
141
142 changeset: 0:b1832b9d912a
142 changeset: 0:b1832b9d912a
143 user: test
143 user: test
144 date: Thu Jan 01 00:00:00 1970 +0000
144 date: Thu Jan 01 00:00:00 1970 +0000
145 summary: Initial
145 summary: Initial
146
146
147
147
148 $ cd ..
148 $ cd ..
@@ -1,343 +1,343 b''
1
1
2 $ catpatch() {
2 $ catpatch() {
3 > cat $1 | sed -e "s/^\(# Parent \).*/\1/"
3 > cat $1 | sed -e "s/^\(# Parent \).*/\1/"
4 > }
4 > }
5 $ echo "[extensions]" >> $HGRCPATH
5 $ echo "[extensions]" >> $HGRCPATH
6 $ echo "mq=" >> $HGRCPATH
6 $ echo "mq=" >> $HGRCPATH
7 $ runtest() {
7 $ runtest() {
8 > hg init mq
8 > hg init mq
9 > cd mq
9 > cd mq
10 >
10 >
11 > echo a > a
11 > echo a > a
12 > hg ci -Ama
12 > hg ci -Ama
13 >
13 >
14 > echo '% qnew should refuse bad patch names'
14 > echo '% qnew should refuse bad patch names'
15 > hg qnew series
15 > hg qnew series
16 > hg qnew status
16 > hg qnew status
17 > hg qnew guards
17 > hg qnew guards
18 > hg qnew .
18 > hg qnew .
19 > hg qnew ..
19 > hg qnew ..
20 > hg qnew .hgignore
20 > hg qnew .hgignore
21 > hg qnew .mqfoo
21 > hg qnew .mqfoo
22 > hg qnew 'foo#bar'
22 > hg qnew 'foo#bar'
23 > hg qnew 'foo:bar'
23 > hg qnew 'foo:bar'
24 >
24 >
25 > hg qinit -c
25 > hg qinit -c
26 >
26 >
27 > echo '% qnew with name containing slash'
27 > echo '% qnew with name containing slash'
28 > hg qnew foo/
28 > hg qnew foo/
29 > hg qnew foo/bar.patch
29 > hg qnew foo/bar.patch
30 > hg qnew foo
30 > hg qnew foo
31 > hg qseries
31 > hg qseries
32 > hg qpop
32 > hg qpop
33 > hg qdelete foo/bar.patch
33 > hg qdelete foo/bar.patch
34 >
34 >
35 > echo '% qnew with uncommitted changes'
35 > echo '% qnew with uncommitted changes'
36 > echo a > somefile
36 > echo a > somefile
37 > hg add somefile
37 > hg add somefile
38 > hg qnew uncommitted.patch
38 > hg qnew uncommitted.patch
39 > hg st
39 > hg st
40 > hg qseries
40 > hg qseries
41 >
41 >
42 > echo '% qnew implies add'
42 > echo '% qnew implies add'
43 > hg -R .hg/patches st
43 > hg -R .hg/patches st
44 >
44 >
45 > echo '% qnew missing'
45 > echo '% qnew missing'
46 > hg qnew missing.patch missing
46 > hg qnew missing.patch missing
47 >
47 >
48 > echo '% qnew -m'
48 > echo '% qnew -m'
49 > hg qnew -m 'foo bar' mtest.patch
49 > hg qnew -m 'foo bar' mtest.patch
50 > catpatch .hg/patches/mtest.patch
50 > catpatch .hg/patches/mtest.patch
51 >
51 >
52 > echo '% qnew twice'
52 > echo '% qnew twice'
53 > hg qnew first.patch
53 > hg qnew first.patch
54 > hg qnew first.patch
54 > hg qnew first.patch
55 >
55 >
56 > touch ../first.patch
56 > touch ../first.patch
57 > hg qimport ../first.patch
57 > hg qimport ../first.patch
58 >
58 >
59 > echo '% qnew -f from a subdirectory'
59 > echo '% qnew -f from a subdirectory'
60 > hg qpop -a
60 > hg qpop -a
61 > mkdir d
61 > mkdir d
62 > cd d
62 > cd d
63 > echo b > b
63 > echo b > b
64 > hg ci -Am t
64 > hg ci -Am t
65 > echo b >> b
65 > echo b >> b
66 > hg st
66 > hg st
67 > hg qnew -g -f p
67 > hg qnew -g -f p
68 > catpatch ../.hg/patches/p
68 > catpatch ../.hg/patches/p
69 >
69 >
70 > echo '% qnew -u with no username configured'
70 > echo '% qnew -u with no username configured'
71 > HGUSER= hg qnew -u blue red
71 > HGUSER= hg qnew -u blue red
72 > catpatch ../.hg/patches/red
72 > catpatch ../.hg/patches/red
73 >
73 >
74 > echo '% qnew -e -u with no username configured'
74 > echo '% qnew -e -u with no username configured'
75 > HGUSER= hg qnew -e -u chartreuse fucsia
75 > HGUSER= hg qnew -e -u chartreuse fucsia
76 > catpatch ../.hg/patches/fucsia
76 > catpatch ../.hg/patches/fucsia
77 >
77 >
78 > echo '% fail when trying to import a merge'
78 > echo '% fail when trying to import a merge'
79 > hg init merge
79 > hg init merge
80 > cd merge
80 > cd merge
81 > touch a
81 > touch a
82 > hg ci -Am null
82 > hg ci -Am null
83 > echo a >> a
83 > echo a >> a
84 > hg ci -m a
84 > hg ci -m a
85 > hg up -r 0
85 > hg up -r 0
86 > echo b >> a
86 > echo b >> a
87 > hg ci -m b
87 > hg ci -m b
88 > hg merge -f 1
88 > hg merge -f 1
89 > hg resolve --mark a
89 > hg resolve --mark a
90 > hg qnew -f merge
90 > hg qnew -f merge
91 >
91 >
92 > cd ../../..
92 > cd ../../..
93 > rm -r mq
93 > rm -r mq
94 > }
94 > }
95
95
96 plain headers
96 plain headers
97
97
98 $ echo "[mq]" >> $HGRCPATH
98 $ echo "[mq]" >> $HGRCPATH
99 $ echo "plain=true" >> $HGRCPATH
99 $ echo "plain=true" >> $HGRCPATH
100 $ mkdir sandbox
100 $ mkdir sandbox
101 $ (cd sandbox ; runtest)
101 $ (cd sandbox ; runtest)
102 adding a
102 adding a
103 % qnew should refuse bad patch names
103 % qnew should refuse bad patch names
104 abort: "series" cannot be used as the name of a patch
104 abort: "series" cannot be used as the name of a patch
105 abort: "status" cannot be used as the name of a patch
105 abort: "status" cannot be used as the name of a patch
106 abort: "guards" cannot be used as the name of a patch
106 abort: "guards" cannot be used as the name of a patch
107 abort: "." cannot be used as the name of a patch
107 abort: "." cannot be used as the name of a patch
108 abort: ".." cannot be used as the name of a patch
108 abort: ".." cannot be used as the name of a patch
109 abort: patch name cannot begin with ".hg"
109 abort: patch name cannot begin with ".hg"
110 abort: patch name cannot begin with ".mq"
110 abort: patch name cannot begin with ".mq"
111 abort: "#" cannot be used in the name of a patch
111 abort: "#" cannot be used in the name of a patch
112 abort: ":" cannot be used in the name of a patch
112 abort: ":" cannot be used in the name of a patch
113 % qnew with name containing slash
113 % qnew with name containing slash
114 abort: path ends in directory separator: foo/ (glob)
114 abort: path ends in directory separator: foo/ (glob)
115 abort: "foo" already exists as a directory
115 abort: "foo" already exists as a directory
116 foo/bar.patch
116 foo/bar.patch
117 popping foo/bar.patch
117 popping foo/bar.patch
118 patch queue now empty
118 patch queue now empty
119 % qnew with uncommitted changes
119 % qnew with uncommitted changes
120 uncommitted.patch
120 uncommitted.patch
121 % qnew implies add
121 % qnew implies add
122 A .hgignore
122 A .hgignore
123 A series
123 A series
124 A uncommitted.patch
124 A uncommitted.patch
125 % qnew missing
125 % qnew missing
126 abort: missing: * (glob)
126 abort: missing: * (glob)
127 % qnew -m
127 % qnew -m
128 foo bar
128 foo bar
129
129
130 % qnew twice
130 % qnew twice
131 abort: patch "first.patch" already exists
131 abort: patch "first.patch" already exists
132 abort: patch "first.patch" already exists
132 abort: patch "first.patch" already exists
133 % qnew -f from a subdirectory
133 % qnew -f from a subdirectory
134 popping first.patch
134 popping first.patch
135 popping mtest.patch
135 popping mtest.patch
136 popping uncommitted.patch
136 popping uncommitted.patch
137 patch queue now empty
137 patch queue now empty
138 adding d/b
138 adding d/b
139 M d/b
139 M d/b
140 diff --git a/d/b b/d/b
140 diff --git a/d/b b/d/b
141 --- a/d/b
141 --- a/d/b
142 +++ b/d/b
142 +++ b/d/b
143 @@ -1,1 +1,2 @@
143 @@ -1,1 +1,2 @@
144 b
144 b
145 +b
145 +b
146 % qnew -u with no username configured
146 % qnew -u with no username configured
147 From: blue
147 From: blue
148
148
149 % qnew -e -u with no username configured
149 % qnew -e -u with no username configured
150 From: chartreuse
150 From: chartreuse
151
151
152 % fail when trying to import a merge
152 % fail when trying to import a merge
153 adding a
153 adding a
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
155 created new head
155 created new head
156 merging a
156 merging a
157 warning: conflicts during merge.
157 warning: conflicts during merge.
158 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
158 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
159 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
159 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
160 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
160 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
161 no more unresolved files
161 (no more unresolved files)
162 abort: cannot manage merge changesets
162 abort: cannot manage merge changesets
163 $ rm -r sandbox
163 $ rm -r sandbox
164
164
165 hg headers
165 hg headers
166
166
167 $ echo "plain=false" >> $HGRCPATH
167 $ echo "plain=false" >> $HGRCPATH
168 $ mkdir sandbox
168 $ mkdir sandbox
169 $ (cd sandbox ; runtest)
169 $ (cd sandbox ; runtest)
170 adding a
170 adding a
171 % qnew should refuse bad patch names
171 % qnew should refuse bad patch names
172 abort: "series" cannot be used as the name of a patch
172 abort: "series" cannot be used as the name of a patch
173 abort: "status" cannot be used as the name of a patch
173 abort: "status" cannot be used as the name of a patch
174 abort: "guards" cannot be used as the name of a patch
174 abort: "guards" cannot be used as the name of a patch
175 abort: "." cannot be used as the name of a patch
175 abort: "." cannot be used as the name of a patch
176 abort: ".." cannot be used as the name of a patch
176 abort: ".." cannot be used as the name of a patch
177 abort: patch name cannot begin with ".hg"
177 abort: patch name cannot begin with ".hg"
178 abort: patch name cannot begin with ".mq"
178 abort: patch name cannot begin with ".mq"
179 abort: "#" cannot be used in the name of a patch
179 abort: "#" cannot be used in the name of a patch
180 abort: ":" cannot be used in the name of a patch
180 abort: ":" cannot be used in the name of a patch
181 % qnew with name containing slash
181 % qnew with name containing slash
182 abort: path ends in directory separator: foo/ (glob)
182 abort: path ends in directory separator: foo/ (glob)
183 abort: "foo" already exists as a directory
183 abort: "foo" already exists as a directory
184 foo/bar.patch
184 foo/bar.patch
185 popping foo/bar.patch
185 popping foo/bar.patch
186 patch queue now empty
186 patch queue now empty
187 % qnew with uncommitted changes
187 % qnew with uncommitted changes
188 uncommitted.patch
188 uncommitted.patch
189 % qnew implies add
189 % qnew implies add
190 A .hgignore
190 A .hgignore
191 A series
191 A series
192 A uncommitted.patch
192 A uncommitted.patch
193 % qnew missing
193 % qnew missing
194 abort: missing: * (glob)
194 abort: missing: * (glob)
195 % qnew -m
195 % qnew -m
196 # HG changeset patch
196 # HG changeset patch
197 # Parent
197 # Parent
198 foo bar
198 foo bar
199
199
200 % qnew twice
200 % qnew twice
201 abort: patch "first.patch" already exists
201 abort: patch "first.patch" already exists
202 abort: patch "first.patch" already exists
202 abort: patch "first.patch" already exists
203 % qnew -f from a subdirectory
203 % qnew -f from a subdirectory
204 popping first.patch
204 popping first.patch
205 popping mtest.patch
205 popping mtest.patch
206 popping uncommitted.patch
206 popping uncommitted.patch
207 patch queue now empty
207 patch queue now empty
208 adding d/b
208 adding d/b
209 M d/b
209 M d/b
210 # HG changeset patch
210 # HG changeset patch
211 # Parent
211 # Parent
212 diff --git a/d/b b/d/b
212 diff --git a/d/b b/d/b
213 --- a/d/b
213 --- a/d/b
214 +++ b/d/b
214 +++ b/d/b
215 @@ -1,1 +1,2 @@
215 @@ -1,1 +1,2 @@
216 b
216 b
217 +b
217 +b
218 % qnew -u with no username configured
218 % qnew -u with no username configured
219 # HG changeset patch
219 # HG changeset patch
220 # Parent
220 # Parent
221 # User blue
221 # User blue
222 % qnew -e -u with no username configured
222 % qnew -e -u with no username configured
223 # HG changeset patch
223 # HG changeset patch
224 # Parent
224 # Parent
225 # User chartreuse
225 # User chartreuse
226 % fail when trying to import a merge
226 % fail when trying to import a merge
227 adding a
227 adding a
228 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
228 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
229 created new head
229 created new head
230 merging a
230 merging a
231 warning: conflicts during merge.
231 warning: conflicts during merge.
232 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
232 merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
233 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
233 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
234 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
234 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
235 no more unresolved files
235 (no more unresolved files)
236 abort: cannot manage merge changesets
236 abort: cannot manage merge changesets
237 $ rm -r sandbox
237 $ rm -r sandbox
238
238
239 Test saving last-message.txt
239 Test saving last-message.txt
240
240
241 $ hg init repo
241 $ hg init repo
242 $ cd repo
242 $ cd repo
243
243
244 $ cat > $TESTTMP/commitfailure.py <<EOF
244 $ cat > $TESTTMP/commitfailure.py <<EOF
245 > from mercurial import util
245 > from mercurial import util
246 > def reposetup(ui, repo):
246 > def reposetup(ui, repo):
247 > class commitfailure(repo.__class__):
247 > class commitfailure(repo.__class__):
248 > def commit(self, *args, **kwargs):
248 > def commit(self, *args, **kwargs):
249 > raise util.Abort('emulating unexpected abort')
249 > raise util.Abort('emulating unexpected abort')
250 > repo.__class__ = commitfailure
250 > repo.__class__ = commitfailure
251 > EOF
251 > EOF
252 $ cat >> .hg/hgrc <<EOF
252 $ cat >> .hg/hgrc <<EOF
253 > [extensions]
253 > [extensions]
254 > # this failure occurs before editor invocation
254 > # this failure occurs before editor invocation
255 > commitfailure = $TESTTMP/commitfailure.py
255 > commitfailure = $TESTTMP/commitfailure.py
256 > EOF
256 > EOF
257
257
258 $ cat > $TESTTMP/editor.sh << EOF
258 $ cat > $TESTTMP/editor.sh << EOF
259 > echo "==== before editing"
259 > echo "==== before editing"
260 > cat \$1
260 > cat \$1
261 > echo "===="
261 > echo "===="
262 > echo "test saving last-message.txt" >> \$1
262 > echo "test saving last-message.txt" >> \$1
263 > EOF
263 > EOF
264
264
265 (test that editor is not invoked before transaction starting)
265 (test that editor is not invoked before transaction starting)
266
266
267 $ rm -f .hg/last-message.txt
267 $ rm -f .hg/last-message.txt
268 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e patch
268 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e patch
269 abort: emulating unexpected abort
269 abort: emulating unexpected abort
270 [255]
270 [255]
271 $ test -f .hg/last-message.txt
271 $ test -f .hg/last-message.txt
272 [1]
272 [1]
273
273
274 (test that editor is invoked and commit message is saved into
274 (test that editor is invoked and commit message is saved into
275 "last-message.txt")
275 "last-message.txt")
276
276
277 $ cat >> .hg/hgrc <<EOF
277 $ cat >> .hg/hgrc <<EOF
278 > [extensions]
278 > [extensions]
279 > commitfailure = !
279 > commitfailure = !
280 > [hooks]
280 > [hooks]
281 > # this failure occurs after editor invocation
281 > # this failure occurs after editor invocation
282 > pretxncommit.unexpectedabort = false
282 > pretxncommit.unexpectedabort = false
283 > EOF
283 > EOF
284
284
285 $ rm -f .hg/last-message.txt
285 $ rm -f .hg/last-message.txt
286 $ hg status
286 $ hg status
287 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e patch
287 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e patch
288 ==== before editing
288 ==== before editing
289
289
290
290
291 HG: Enter commit message. Lines beginning with 'HG:' are removed.
291 HG: Enter commit message. Lines beginning with 'HG:' are removed.
292 HG: Leave message empty to use default message.
292 HG: Leave message empty to use default message.
293 HG: --
293 HG: --
294 HG: user: test
294 HG: user: test
295 HG: branch 'default'
295 HG: branch 'default'
296 HG: no files changed
296 HG: no files changed
297 ====
297 ====
298 transaction abort!
298 transaction abort!
299 rollback completed
299 rollback completed
300 note: commit message saved in .hg/last-message.txt
300 note: commit message saved in .hg/last-message.txt
301 abort: pretxncommit.unexpectedabort hook exited with status 1
301 abort: pretxncommit.unexpectedabort hook exited with status 1
302 [255]
302 [255]
303 $ cat .hg/last-message.txt
303 $ cat .hg/last-message.txt
304
304
305
305
306 test saving last-message.txt
306 test saving last-message.txt
307
307
308 $ cat >> .hg/hgrc <<EOF
308 $ cat >> .hg/hgrc <<EOF
309 > [hooks]
309 > [hooks]
310 > pretxncommit.unexpectedabort =
310 > pretxncommit.unexpectedabort =
311 > EOF
311 > EOF
312
312
313 #if unix-permissions
313 #if unix-permissions
314
314
315 Test handling default message with the patch filename with tail whitespaces
315 Test handling default message with the patch filename with tail whitespaces
316
316
317 $ cat > $TESTTMP/editor.sh << EOF
317 $ cat > $TESTTMP/editor.sh << EOF
318 > echo "==== before editing"
318 > echo "==== before editing"
319 > cat \$1
319 > cat \$1
320 > echo "===="
320 > echo "===="
321 > echo "[mq]: patch " > \$1
321 > echo "[mq]: patch " > \$1
322 > EOF
322 > EOF
323
323
324 $ rm -f .hg/last-message.txt
324 $ rm -f .hg/last-message.txt
325 $ hg status
325 $ hg status
326 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e "patch "
326 $ HGEDITOR="sh $TESTTMP/editor.sh" hg qnew -e "patch "
327 ==== before editing
327 ==== before editing
328
328
329
329
330 HG: Enter commit message. Lines beginning with 'HG:' are removed.
330 HG: Enter commit message. Lines beginning with 'HG:' are removed.
331 HG: Leave message empty to use default message.
331 HG: Leave message empty to use default message.
332 HG: --
332 HG: --
333 HG: user: test
333 HG: user: test
334 HG: branch 'default'
334 HG: branch 'default'
335 HG: no files changed
335 HG: no files changed
336 ====
336 ====
337 $ cat ".hg/patches/patch "
337 $ cat ".hg/patches/patch "
338 # HG changeset patch
338 # HG changeset patch
339 # Parent 0000000000000000000000000000000000000000
339 # Parent 0000000000000000000000000000000000000000
340
340
341 $ cd ..
341 $ cd ..
342
342
343 #endif
343 #endif
@@ -1,201 +1,201 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}: '{desc}' bookmarks: {bookmarks}\n"
9 > tglog = log -G --template "{rev}: '{desc}' bookmarks: {bookmarks}\n"
10 > EOF
10 > EOF
11
11
12 Create a repo with several bookmarks
12 Create a repo with several bookmarks
13 $ hg init a
13 $ hg init a
14 $ cd a
14 $ cd a
15
15
16 $ echo a > a
16 $ echo a > a
17 $ hg ci -Am A
17 $ hg ci -Am A
18 adding a
18 adding a
19
19
20 $ echo b > b
20 $ echo b > b
21 $ hg ci -Am B
21 $ hg ci -Am B
22 adding b
22 adding b
23 $ hg book 'X'
23 $ hg book 'X'
24 $ hg book 'Y'
24 $ hg book 'Y'
25
25
26 $ echo c > c
26 $ echo c > c
27 $ hg ci -Am C
27 $ hg ci -Am C
28 adding c
28 adding c
29 $ hg book 'Z'
29 $ hg book 'Z'
30
30
31 $ hg up -q 0
31 $ hg up -q 0
32
32
33 $ echo d > d
33 $ echo d > d
34 $ hg ci -Am D
34 $ hg ci -Am D
35 adding d
35 adding d
36 created new head
36 created new head
37
37
38 $ hg book W
38 $ hg book W
39
39
40 $ hg tglog
40 $ hg tglog
41 @ 3: 'D' bookmarks: W
41 @ 3: 'D' bookmarks: W
42 |
42 |
43 | o 2: 'C' bookmarks: Y Z
43 | o 2: 'C' bookmarks: Y Z
44 | |
44 | |
45 | o 1: 'B' bookmarks: X
45 | o 1: 'B' bookmarks: X
46 |/
46 |/
47 o 0: 'A' bookmarks:
47 o 0: 'A' bookmarks:
48
48
49
49
50 Move only rebased bookmarks
50 Move only rebased bookmarks
51
51
52 $ cd ..
52 $ cd ..
53 $ hg clone -q a a1
53 $ hg clone -q a a1
54
54
55 $ cd a1
55 $ cd a1
56 $ hg up -q Z
56 $ hg up -q Z
57
57
58 Test deleting divergent bookmarks from dest (issue3685)
58 Test deleting divergent bookmarks from dest (issue3685)
59
59
60 $ hg book -r 3 Z@diverge
60 $ hg book -r 3 Z@diverge
61
61
62 ... and also test that bookmarks not on dest or not being moved aren't deleted
62 ... and also test that bookmarks not on dest or not being moved aren't deleted
63
63
64 $ hg book -r 3 X@diverge
64 $ hg book -r 3 X@diverge
65 $ hg book -r 0 Y@diverge
65 $ hg book -r 0 Y@diverge
66
66
67 $ hg tglog
67 $ hg tglog
68 o 3: 'D' bookmarks: W X@diverge Z@diverge
68 o 3: 'D' bookmarks: W X@diverge Z@diverge
69 |
69 |
70 | @ 2: 'C' bookmarks: Y Z
70 | @ 2: 'C' bookmarks: Y Z
71 | |
71 | |
72 | o 1: 'B' bookmarks: X
72 | o 1: 'B' bookmarks: X
73 |/
73 |/
74 o 0: 'A' bookmarks: Y@diverge
74 o 0: 'A' bookmarks: Y@diverge
75
75
76 $ hg rebase -s Y -d 3
76 $ hg rebase -s Y -d 3
77 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
77 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
78
78
79 $ hg tglog
79 $ hg tglog
80 @ 3: 'C' bookmarks: Y Z
80 @ 3: 'C' bookmarks: Y Z
81 |
81 |
82 o 2: 'D' bookmarks: W X@diverge
82 o 2: 'D' bookmarks: W X@diverge
83 |
83 |
84 | o 1: 'B' bookmarks: X
84 | o 1: 'B' bookmarks: X
85 |/
85 |/
86 o 0: 'A' bookmarks: Y@diverge
86 o 0: 'A' bookmarks: Y@diverge
87
87
88 Do not try to keep active but deleted divergent bookmark
88 Do not try to keep active but deleted divergent bookmark
89
89
90 $ cd ..
90 $ cd ..
91 $ hg clone -q a a4
91 $ hg clone -q a a4
92
92
93 $ cd a4
93 $ cd a4
94 $ hg up -q 2
94 $ hg up -q 2
95 $ hg book W@diverge
95 $ hg book W@diverge
96
96
97 $ hg rebase -s W -d .
97 $ hg rebase -s W -d .
98 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
98 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
99
99
100 $ hg bookmarks
100 $ hg bookmarks
101 W 3:0d3554f74897
101 W 3:0d3554f74897
102 X 1:6c81ed0049f8
102 X 1:6c81ed0049f8
103 Y 2:49cb3485fa0c
103 Y 2:49cb3485fa0c
104 Z 2:49cb3485fa0c
104 Z 2:49cb3485fa0c
105
105
106 Keep bookmarks to the correct rebased changeset
106 Keep bookmarks to the correct rebased changeset
107
107
108 $ cd ..
108 $ cd ..
109 $ hg clone -q a a2
109 $ hg clone -q a a2
110
110
111 $ cd a2
111 $ cd a2
112 $ hg up -q Z
112 $ hg up -q Z
113
113
114 $ hg rebase -s 1 -d 3
114 $ hg rebase -s 1 -d 3
115 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
115 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
116
116
117 $ hg tglog
117 $ hg tglog
118 @ 3: 'C' bookmarks: Y Z
118 @ 3: 'C' bookmarks: Y Z
119 |
119 |
120 o 2: 'B' bookmarks: X
120 o 2: 'B' bookmarks: X
121 |
121 |
122 o 1: 'D' bookmarks: W
122 o 1: 'D' bookmarks: W
123 |
123 |
124 o 0: 'A' bookmarks:
124 o 0: 'A' bookmarks:
125
125
126
126
127 Keep active bookmark on the correct changeset
127 Keep active bookmark on the correct changeset
128
128
129 $ cd ..
129 $ cd ..
130 $ hg clone -q a a3
130 $ hg clone -q a a3
131
131
132 $ cd a3
132 $ cd a3
133 $ hg up -q X
133 $ hg up -q X
134
134
135 $ hg rebase -d W
135 $ hg rebase -d W
136 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
136 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
137
137
138 $ hg tglog
138 $ hg tglog
139 o 3: 'C' bookmarks: Y Z
139 o 3: 'C' bookmarks: Y Z
140 |
140 |
141 @ 2: 'B' bookmarks: X
141 @ 2: 'B' bookmarks: X
142 |
142 |
143 o 1: 'D' bookmarks: W
143 o 1: 'D' bookmarks: W
144 |
144 |
145 o 0: 'A' bookmarks:
145 o 0: 'A' bookmarks:
146
146
147 $ hg bookmarks
147 $ hg bookmarks
148 W 1:41acb9dca9eb
148 W 1:41acb9dca9eb
149 * X 2:e926fccfa8ec
149 * X 2:e926fccfa8ec
150 Y 3:3d5fa227f4b5
150 Y 3:3d5fa227f4b5
151 Z 3:3d5fa227f4b5
151 Z 3:3d5fa227f4b5
152
152
153 rebase --continue with bookmarks present (issue3802)
153 rebase --continue with bookmarks present (issue3802)
154
154
155 $ hg up 2
155 $ hg up 2
156 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
156 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
157 (leaving bookmark X)
157 (leaving bookmark X)
158 $ echo 'C' > c
158 $ echo 'C' > c
159 $ hg add c
159 $ hg add c
160 $ hg ci -m 'other C'
160 $ hg ci -m 'other C'
161 created new head
161 created new head
162 $ hg up 3
162 $ hg up 3
163 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
163 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
164 $ hg rebase
164 $ hg rebase
165 merging c
165 merging c
166 warning: conflicts during merge.
166 warning: conflicts during merge.
167 merging c incomplete! (edit conflicts, then use 'hg resolve --mark')
167 merging c incomplete! (edit conflicts, then use 'hg resolve --mark')
168 unresolved conflicts (see hg resolve, then hg rebase --continue)
168 unresolved conflicts (see hg resolve, then hg rebase --continue)
169 [1]
169 [1]
170 $ echo 'c' > c
170 $ echo 'c' > c
171 $ hg resolve --mark c
171 $ hg resolve --mark c
172 no more unresolved files
172 (no more unresolved files)
173 $ hg rebase --continue
173 $ hg rebase --continue
174 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/3d5fa227f4b5-backup.hg (glob)
174 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/3d5fa227f4b5-backup.hg (glob)
175 $ hg tglog
175 $ hg tglog
176 @ 4: 'C' bookmarks: Y Z
176 @ 4: 'C' bookmarks: Y Z
177 |
177 |
178 o 3: 'other C' bookmarks:
178 o 3: 'other C' bookmarks:
179 |
179 |
180 o 2: 'B' bookmarks: X
180 o 2: 'B' bookmarks: X
181 |
181 |
182 o 1: 'D' bookmarks: W
182 o 1: 'D' bookmarks: W
183 |
183 |
184 o 0: 'A' bookmarks:
184 o 0: 'A' bookmarks:
185
185
186
186
187 ensure that bookmarks given the names of revset functions can be used
187 ensure that bookmarks given the names of revset functions can be used
188 as --rev arguments (issue3950)
188 as --rev arguments (issue3950)
189
189
190 $ hg update -q 3
190 $ hg update -q 3
191 $ echo bimble > bimble
191 $ echo bimble > bimble
192 $ hg add bimble
192 $ hg add bimble
193 $ hg commit -q -m 'bisect'
193 $ hg commit -q -m 'bisect'
194 $ echo e >> bimble
194 $ echo e >> bimble
195 $ hg ci -m bisect2
195 $ hg ci -m bisect2
196 $ echo e >> bimble
196 $ echo e >> bimble
197 $ hg ci -m bisect3
197 $ hg ci -m bisect3
198 $ hg book bisect
198 $ hg book bisect
199 $ hg update -q Y
199 $ hg update -q Y
200 $ hg rebase -r '"bisect"^^::"bisect"^' -r bisect -d Z
200 $ hg rebase -r '"bisect"^^::"bisect"^' -r bisect -d Z
201 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/345c90f326a4-backup.hg (glob)
201 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/345c90f326a4-backup.hg (glob)
@@ -1,151 +1,151 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
9 > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
10 > EOF
10 > EOF
11
11
12
12
13 $ hg init a
13 $ hg init a
14 $ cd a
14 $ cd a
15
15
16 $ echo A > A
16 $ echo A > A
17 $ hg add A
17 $ hg add A
18 $ hg ci -m A
18 $ hg ci -m A
19
19
20 $ echo 'B' > B
20 $ echo 'B' > B
21 $ hg add B
21 $ hg add B
22 $ hg ci -m B
22 $ hg ci -m B
23
23
24 $ echo C >> A
24 $ echo C >> A
25 $ hg ci -m C
25 $ hg ci -m C
26
26
27 $ hg up -q -C 0
27 $ hg up -q -C 0
28
28
29 $ echo D >> A
29 $ echo D >> A
30 $ hg ci -m D
30 $ hg ci -m D
31 created new head
31 created new head
32
32
33 $ echo E > E
33 $ echo E > E
34 $ hg add E
34 $ hg add E
35 $ hg ci -m E
35 $ hg ci -m E
36
36
37 $ hg up -q -C 0
37 $ hg up -q -C 0
38
38
39 $ hg branch 'notdefault'
39 $ hg branch 'notdefault'
40 marked working directory as branch notdefault
40 marked working directory as branch notdefault
41 (branches are permanent and global, did you want a bookmark?)
41 (branches are permanent and global, did you want a bookmark?)
42 $ echo F >> A
42 $ echo F >> A
43 $ hg ci -m F
43 $ hg ci -m F
44
44
45 $ cd ..
45 $ cd ..
46
46
47
47
48 Rebasing B onto E - check keep: and phases
48 Rebasing B onto E - check keep: and phases
49
49
50 $ hg clone -q -u . a a1
50 $ hg clone -q -u . a a1
51 $ cd a1
51 $ cd a1
52 $ hg phase --force --secret 2
52 $ hg phase --force --secret 2
53
53
54 $ hg tglog
54 $ hg tglog
55 @ 5:draft 'F' notdefault
55 @ 5:draft 'F' notdefault
56 |
56 |
57 | o 4:draft 'E'
57 | o 4:draft 'E'
58 | |
58 | |
59 | o 3:draft 'D'
59 | o 3:draft 'D'
60 |/
60 |/
61 | o 2:secret 'C'
61 | o 2:secret 'C'
62 | |
62 | |
63 | o 1:draft 'B'
63 | o 1:draft 'B'
64 |/
64 |/
65 o 0:draft 'A'
65 o 0:draft 'A'
66
66
67 $ hg rebase -s 1 -d 4 --keep
67 $ hg rebase -s 1 -d 4 --keep
68 merging A
68 merging A
69 warning: conflicts during merge.
69 warning: conflicts during merge.
70 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
70 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
71 unresolved conflicts (see hg resolve, then hg rebase --continue)
71 unresolved conflicts (see hg resolve, then hg rebase --continue)
72 [1]
72 [1]
73
73
74 Solve the conflict and go on:
74 Solve the conflict and go on:
75
75
76 $ echo 'conflict solved' > A
76 $ echo 'conflict solved' > A
77 $ rm A.orig
77 $ rm A.orig
78 $ hg resolve -m A
78 $ hg resolve -m A
79 no more unresolved files
79 (no more unresolved files)
80 $ hg rebase --continue
80 $ hg rebase --continue
81
81
82 $ hg tglog
82 $ hg tglog
83 o 7:secret 'C'
83 o 7:secret 'C'
84 |
84 |
85 o 6:draft 'B'
85 o 6:draft 'B'
86 |
86 |
87 | @ 5:draft 'F' notdefault
87 | @ 5:draft 'F' notdefault
88 | |
88 | |
89 o | 4:draft 'E'
89 o | 4:draft 'E'
90 | |
90 | |
91 o | 3:draft 'D'
91 o | 3:draft 'D'
92 |/
92 |/
93 | o 2:secret 'C'
93 | o 2:secret 'C'
94 | |
94 | |
95 | o 1:draft 'B'
95 | o 1:draft 'B'
96 |/
96 |/
97 o 0:draft 'A'
97 o 0:draft 'A'
98
98
99 $ cd ..
99 $ cd ..
100
100
101
101
102 Rebase F onto E - check keepbranches:
102 Rebase F onto E - check keepbranches:
103
103
104 $ hg clone -q -u . a a2
104 $ hg clone -q -u . a a2
105 $ cd a2
105 $ cd a2
106 $ hg phase --force --secret 2
106 $ hg phase --force --secret 2
107
107
108 $ hg tglog
108 $ hg tglog
109 @ 5:draft 'F' notdefault
109 @ 5:draft 'F' notdefault
110 |
110 |
111 | o 4:draft 'E'
111 | o 4:draft 'E'
112 | |
112 | |
113 | o 3:draft 'D'
113 | o 3:draft 'D'
114 |/
114 |/
115 | o 2:secret 'C'
115 | o 2:secret 'C'
116 | |
116 | |
117 | o 1:draft 'B'
117 | o 1:draft 'B'
118 |/
118 |/
119 o 0:draft 'A'
119 o 0:draft 'A'
120
120
121 $ hg rebase -s 5 -d 4 --keepbranches
121 $ hg rebase -s 5 -d 4 --keepbranches
122 merging A
122 merging A
123 warning: conflicts during merge.
123 warning: conflicts during merge.
124 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
124 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
125 unresolved conflicts (see hg resolve, then hg rebase --continue)
125 unresolved conflicts (see hg resolve, then hg rebase --continue)
126 [1]
126 [1]
127
127
128 Solve the conflict and go on:
128 Solve the conflict and go on:
129
129
130 $ echo 'conflict solved' > A
130 $ echo 'conflict solved' > A
131 $ rm A.orig
131 $ rm A.orig
132 $ hg resolve -m A
132 $ hg resolve -m A
133 no more unresolved files
133 (no more unresolved files)
134 $ hg rebase --continue
134 $ hg rebase --continue
135 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
135 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
136
136
137 $ hg tglog
137 $ hg tglog
138 @ 5:draft 'F' notdefault
138 @ 5:draft 'F' notdefault
139 |
139 |
140 o 4:draft 'E'
140 o 4:draft 'E'
141 |
141 |
142 o 3:draft 'D'
142 o 3:draft 'D'
143 |
143 |
144 | o 2:secret 'C'
144 | o 2:secret 'C'
145 | |
145 | |
146 | o 1:draft 'B'
146 | o 1:draft 'B'
147 |/
147 |/
148 o 0:draft 'A'
148 o 0:draft 'A'
149
149
150
150
151 $ cd ..
151 $ cd ..
@@ -1,307 +1,307 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}:{phase} '{desc}' {branches} {bookmarks}\n"
9 > tglog = log -G --template "{rev}:{phase} '{desc}' {branches} {bookmarks}\n"
10 > EOF
10 > EOF
11
11
12 $ hg init a
12 $ hg init a
13 $ cd a
13 $ cd a
14 $ echo c1 >common
14 $ echo c1 >common
15 $ hg add common
15 $ hg add common
16 $ hg ci -m C1
16 $ hg ci -m C1
17
17
18 $ echo c2 >>common
18 $ echo c2 >>common
19 $ hg ci -m C2
19 $ hg ci -m C2
20
20
21 $ echo c3 >>common
21 $ echo c3 >>common
22 $ hg ci -m C3
22 $ hg ci -m C3
23
23
24 $ hg up -q -C 1
24 $ hg up -q -C 1
25
25
26 $ echo l1 >>extra
26 $ echo l1 >>extra
27 $ hg add extra
27 $ hg add extra
28 $ hg ci -m L1
28 $ hg ci -m L1
29 created new head
29 created new head
30
30
31 $ sed -e 's/c2/l2/' common > common.new
31 $ sed -e 's/c2/l2/' common > common.new
32 $ mv common.new common
32 $ mv common.new common
33 $ hg ci -m L2
33 $ hg ci -m L2
34
34
35 $ echo l3 >> extra2
35 $ echo l3 >> extra2
36 $ hg add extra2
36 $ hg add extra2
37 $ hg ci -m L3
37 $ hg ci -m L3
38 $ hg bookmark mybook
38 $ hg bookmark mybook
39
39
40 $ hg phase --force --secret 4
40 $ hg phase --force --secret 4
41
41
42 $ hg tglog
42 $ hg tglog
43 @ 5:secret 'L3' mybook
43 @ 5:secret 'L3' mybook
44 |
44 |
45 o 4:secret 'L2'
45 o 4:secret 'L2'
46 |
46 |
47 o 3:draft 'L1'
47 o 3:draft 'L1'
48 |
48 |
49 | o 2:draft 'C3'
49 | o 2:draft 'C3'
50 |/
50 |/
51 o 1:draft 'C2'
51 o 1:draft 'C2'
52 |
52 |
53 o 0:draft 'C1'
53 o 0:draft 'C1'
54
54
55 Try to call --continue:
55 Try to call --continue:
56
56
57 $ hg rebase --continue
57 $ hg rebase --continue
58 abort: no rebase in progress
58 abort: no rebase in progress
59 [255]
59 [255]
60
60
61 Conflicting rebase:
61 Conflicting rebase:
62
62
63 $ hg rebase -s 3 -d 2
63 $ hg rebase -s 3 -d 2
64 merging common
64 merging common
65 warning: conflicts during merge.
65 warning: conflicts during merge.
66 merging common incomplete! (edit conflicts, then use 'hg resolve --mark')
66 merging common incomplete! (edit conflicts, then use 'hg resolve --mark')
67 unresolved conflicts (see hg resolve, then hg rebase --continue)
67 unresolved conflicts (see hg resolve, then hg rebase --continue)
68 [1]
68 [1]
69
69
70 Try to continue without solving the conflict:
70 Try to continue without solving the conflict:
71
71
72 $ hg rebase --continue
72 $ hg rebase --continue
73 abort: unresolved merge conflicts (see hg help resolve)
73 abort: unresolved merge conflicts (see hg help resolve)
74 [255]
74 [255]
75
75
76 Conclude rebase:
76 Conclude rebase:
77
77
78 $ echo 'resolved merge' >common
78 $ echo 'resolved merge' >common
79 $ hg resolve -m common
79 $ hg resolve -m common
80 no more unresolved files
80 (no more unresolved files)
81 $ hg rebase --continue
81 $ hg rebase --continue
82 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
82 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
83
83
84 $ hg tglog
84 $ hg tglog
85 @ 5:secret 'L3' mybook
85 @ 5:secret 'L3' mybook
86 |
86 |
87 o 4:secret 'L2'
87 o 4:secret 'L2'
88 |
88 |
89 o 3:draft 'L1'
89 o 3:draft 'L1'
90 |
90 |
91 o 2:draft 'C3'
91 o 2:draft 'C3'
92 |
92 |
93 o 1:draft 'C2'
93 o 1:draft 'C2'
94 |
94 |
95 o 0:draft 'C1'
95 o 0:draft 'C1'
96
96
97 Check correctness:
97 Check correctness:
98
98
99 $ hg cat -r 0 common
99 $ hg cat -r 0 common
100 c1
100 c1
101
101
102 $ hg cat -r 1 common
102 $ hg cat -r 1 common
103 c1
103 c1
104 c2
104 c2
105
105
106 $ hg cat -r 2 common
106 $ hg cat -r 2 common
107 c1
107 c1
108 c2
108 c2
109 c3
109 c3
110
110
111 $ hg cat -r 3 common
111 $ hg cat -r 3 common
112 c1
112 c1
113 c2
113 c2
114 c3
114 c3
115
115
116 $ hg cat -r 4 common
116 $ hg cat -r 4 common
117 resolved merge
117 resolved merge
118
118
119 $ hg cat -r 5 common
119 $ hg cat -r 5 common
120 resolved merge
120 resolved merge
121
121
122 Bookmark stays active after --continue
122 Bookmark stays active after --continue
123 $ hg bookmarks
123 $ hg bookmarks
124 * mybook 5:d67b21408fc0
124 * mybook 5:d67b21408fc0
125
125
126 $ cd ..
126 $ cd ..
127
127
128 Check that the right ancestors is used while rebasing a merge (issue4041)
128 Check that the right ancestors is used while rebasing a merge (issue4041)
129
129
130 $ hg clone "$TESTDIR/bundles/issue4041.hg" issue4041
130 $ hg clone "$TESTDIR/bundles/issue4041.hg" issue4041
131 requesting all changes
131 requesting all changes
132 adding changesets
132 adding changesets
133 adding manifests
133 adding manifests
134 adding file changes
134 adding file changes
135 added 11 changesets with 8 changes to 3 files (+1 heads)
135 added 11 changesets with 8 changes to 3 files (+1 heads)
136 updating to branch default
136 updating to branch default
137 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
137 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
138 $ cd issue4041
138 $ cd issue4041
139 $ hg phase --draft --force 9
139 $ hg phase --draft --force 9
140 $ hg log -G
140 $ hg log -G
141 o changeset: 10:2f2496ddf49d
141 o changeset: 10:2f2496ddf49d
142 |\ branch: f1
142 |\ branch: f1
143 | | tag: tip
143 | | tag: tip
144 | | parent: 7:4c9fbe56a16f
144 | | parent: 7:4c9fbe56a16f
145 | | parent: 9:e31216eec445
145 | | parent: 9:e31216eec445
146 | | user: szhang
146 | | user: szhang
147 | | date: Thu Sep 05 12:59:39 2013 -0400
147 | | date: Thu Sep 05 12:59:39 2013 -0400
148 | | summary: merge
148 | | summary: merge
149 | |
149 | |
150 | o changeset: 9:e31216eec445
150 | o changeset: 9:e31216eec445
151 | | branch: f1
151 | | branch: f1
152 | | user: szhang
152 | | user: szhang
153 | | date: Thu Sep 05 12:59:10 2013 -0400
153 | | date: Thu Sep 05 12:59:10 2013 -0400
154 | | summary: more changes to f1
154 | | summary: more changes to f1
155 | |
155 | |
156 | o changeset: 8:8e4e2c1a07ae
156 | o changeset: 8:8e4e2c1a07ae
157 | |\ branch: f1
157 | |\ branch: f1
158 | | | parent: 2:4bc80088dc6b
158 | | | parent: 2:4bc80088dc6b
159 | | | parent: 6:400110238667
159 | | | parent: 6:400110238667
160 | | | user: szhang
160 | | | user: szhang
161 | | | date: Thu Sep 05 12:57:59 2013 -0400
161 | | | date: Thu Sep 05 12:57:59 2013 -0400
162 | | | summary: bad merge
162 | | | summary: bad merge
163 | | |
163 | | |
164 o | | changeset: 7:4c9fbe56a16f
164 o | | changeset: 7:4c9fbe56a16f
165 |/ / branch: f1
165 |/ / branch: f1
166 | | parent: 2:4bc80088dc6b
166 | | parent: 2:4bc80088dc6b
167 | | user: szhang
167 | | user: szhang
168 | | date: Thu Sep 05 12:54:00 2013 -0400
168 | | date: Thu Sep 05 12:54:00 2013 -0400
169 | | summary: changed f1
169 | | summary: changed f1
170 | |
170 | |
171 | o changeset: 6:400110238667
171 | o changeset: 6:400110238667
172 | | branch: f2
172 | | branch: f2
173 | | parent: 4:12e8ec6bb010
173 | | parent: 4:12e8ec6bb010
174 | | user: szhang
174 | | user: szhang
175 | | date: Tue Sep 03 13:58:02 2013 -0400
175 | | date: Tue Sep 03 13:58:02 2013 -0400
176 | | summary: changed f2 on f2
176 | | summary: changed f2 on f2
177 | |
177 | |
178 | | @ changeset: 5:d79e2059b5c0
178 | | @ changeset: 5:d79e2059b5c0
179 | | | parent: 3:8a951942e016
179 | | | parent: 3:8a951942e016
180 | | | user: szhang
180 | | | user: szhang
181 | | | date: Tue Sep 03 13:57:39 2013 -0400
181 | | | date: Tue Sep 03 13:57:39 2013 -0400
182 | | | summary: changed f2 on default
182 | | | summary: changed f2 on default
183 | | |
183 | | |
184 | o | changeset: 4:12e8ec6bb010
184 | o | changeset: 4:12e8ec6bb010
185 | |/ branch: f2
185 | |/ branch: f2
186 | | user: szhang
186 | | user: szhang
187 | | date: Tue Sep 03 13:57:18 2013 -0400
187 | | date: Tue Sep 03 13:57:18 2013 -0400
188 | | summary: created f2 branch
188 | | summary: created f2 branch
189 | |
189 | |
190 | o changeset: 3:8a951942e016
190 | o changeset: 3:8a951942e016
191 | | parent: 0:24797d4f68de
191 | | parent: 0:24797d4f68de
192 | | user: szhang
192 | | user: szhang
193 | | date: Tue Sep 03 13:57:11 2013 -0400
193 | | date: Tue Sep 03 13:57:11 2013 -0400
194 | | summary: added f2.txt
194 | | summary: added f2.txt
195 | |
195 | |
196 o | changeset: 2:4bc80088dc6b
196 o | changeset: 2:4bc80088dc6b
197 | | branch: f1
197 | | branch: f1
198 | | user: szhang
198 | | user: szhang
199 | | date: Tue Sep 03 13:56:20 2013 -0400
199 | | date: Tue Sep 03 13:56:20 2013 -0400
200 | | summary: added f1.txt
200 | | summary: added f1.txt
201 | |
201 | |
202 o | changeset: 1:ef53c9e6b608
202 o | changeset: 1:ef53c9e6b608
203 |/ branch: f1
203 |/ branch: f1
204 | user: szhang
204 | user: szhang
205 | date: Tue Sep 03 13:55:26 2013 -0400
205 | date: Tue Sep 03 13:55:26 2013 -0400
206 | summary: created f1 branch
206 | summary: created f1 branch
207 |
207 |
208 o changeset: 0:24797d4f68de
208 o changeset: 0:24797d4f68de
209 user: szhang
209 user: szhang
210 date: Tue Sep 03 13:55:08 2013 -0400
210 date: Tue Sep 03 13:55:08 2013 -0400
211 summary: added default.txt
211 summary: added default.txt
212
212
213 $ hg rebase -s9 -d2 --debug # use debug to really check merge base used
213 $ hg rebase -s9 -d2 --debug # use debug to really check merge base used
214 rebase onto 2 starting from e31216eec445
214 rebase onto 2 starting from e31216eec445
215 rebasing: 9:e31216eec445 5/6 changesets (83.33%)
215 rebasing: 9:e31216eec445 5/6 changesets (83.33%)
216 future parents are 2 and -1
216 future parents are 2 and -1
217 rebase status stored
217 rebase status stored
218 update to 2:4bc80088dc6b
218 update to 2:4bc80088dc6b
219 resolving manifests
219 resolving manifests
220 branchmerge: False, force: True, partial: False
220 branchmerge: False, force: True, partial: False
221 ancestor: d79e2059b5c0+, local: d79e2059b5c0+, remote: 4bc80088dc6b
221 ancestor: d79e2059b5c0+, local: d79e2059b5c0+, remote: 4bc80088dc6b
222 f2.txt: other deleted -> r
222 f2.txt: other deleted -> r
223 removing f2.txt
223 removing f2.txt
224 updating: f2.txt 1/2 files (50.00%)
224 updating: f2.txt 1/2 files (50.00%)
225 f1.txt: remote created -> g
225 f1.txt: remote created -> g
226 getting f1.txt
226 getting f1.txt
227 updating: f1.txt 2/2 files (100.00%)
227 updating: f1.txt 2/2 files (100.00%)
228 merge against 9:e31216eec445
228 merge against 9:e31216eec445
229 detach base 8:8e4e2c1a07ae
229 detach base 8:8e4e2c1a07ae
230 searching for copies back to rev 3
230 searching for copies back to rev 3
231 resolving manifests
231 resolving manifests
232 branchmerge: True, force: True, partial: False
232 branchmerge: True, force: True, partial: False
233 ancestor: 8e4e2c1a07ae, local: 4bc80088dc6b+, remote: e31216eec445
233 ancestor: 8e4e2c1a07ae, local: 4bc80088dc6b+, remote: e31216eec445
234 f1.txt: remote is newer -> g
234 f1.txt: remote is newer -> g
235 getting f1.txt
235 getting f1.txt
236 updating: f1.txt 1/1 files (100.00%)
236 updating: f1.txt 1/1 files (100.00%)
237 f1.txt
237 f1.txt
238 rebasing: 10:2f2496ddf49d 6/6 changesets (100.00%)
238 rebasing: 10:2f2496ddf49d 6/6 changesets (100.00%)
239 future parents are 11 and 7
239 future parents are 11 and 7
240 rebase status stored
240 rebase status stored
241 already in target
241 already in target
242 merge against 10:2f2496ddf49d
242 merge against 10:2f2496ddf49d
243 detach base 9:e31216eec445
243 detach base 9:e31216eec445
244 searching for copies back to rev 3
244 searching for copies back to rev 3
245 resolving manifests
245 resolving manifests
246 branchmerge: True, force: True, partial: False
246 branchmerge: True, force: True, partial: False
247 ancestor: e31216eec445, local: 19c888675e13+, remote: 2f2496ddf49d
247 ancestor: e31216eec445, local: 19c888675e13+, remote: 2f2496ddf49d
248 f1.txt: remote is newer -> g
248 f1.txt: remote is newer -> g
249 getting f1.txt
249 getting f1.txt
250 updating: f1.txt 1/1 files (100.00%)
250 updating: f1.txt 1/1 files (100.00%)
251 f1.txt
251 f1.txt
252 rebase merging completed
252 rebase merging completed
253 update back to initial working directory parent
253 update back to initial working directory parent
254 resolving manifests
254 resolving manifests
255 branchmerge: False, force: False, partial: False
255 branchmerge: False, force: False, partial: False
256 ancestor: 2a7f09cac94c, local: 2a7f09cac94c+, remote: d79e2059b5c0
256 ancestor: 2a7f09cac94c, local: 2a7f09cac94c+, remote: d79e2059b5c0
257 f1.txt: other deleted -> r
257 f1.txt: other deleted -> r
258 removing f1.txt
258 removing f1.txt
259 updating: f1.txt 1/2 files (50.00%)
259 updating: f1.txt 1/2 files (50.00%)
260 f2.txt: remote created -> g
260 f2.txt: remote created -> g
261 getting f2.txt
261 getting f2.txt
262 updating: f2.txt 2/2 files (100.00%)
262 updating: f2.txt 2/2 files (100.00%)
263 3 changesets found
263 3 changesets found
264 list of changesets:
264 list of changesets:
265 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
265 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
266 e31216eec445e44352c5f01588856059466a24c9
266 e31216eec445e44352c5f01588856059466a24c9
267 2f2496ddf49d69b5ef23ad8cf9fb2e0e4faf0ac2
267 2f2496ddf49d69b5ef23ad8cf9fb2e0e4faf0ac2
268 bundling: 1/3 changesets (33.33%)
268 bundling: 1/3 changesets (33.33%)
269 bundling: 2/3 changesets (66.67%)
269 bundling: 2/3 changesets (66.67%)
270 bundling: 3/3 changesets (100.00%)
270 bundling: 3/3 changesets (100.00%)
271 bundling: 1/3 manifests (33.33%)
271 bundling: 1/3 manifests (33.33%)
272 bundling: 2/3 manifests (66.67%)
272 bundling: 2/3 manifests (66.67%)
273 bundling: 3/3 manifests (100.00%)
273 bundling: 3/3 manifests (100.00%)
274 bundling: f1.txt 1/1 files (100.00%)
274 bundling: f1.txt 1/1 files (100.00%)
275 saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-backup.hg (glob)
275 saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-backup.hg (glob)
276 3 changesets found
276 3 changesets found
277 list of changesets:
277 list of changesets:
278 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
278 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c
279 19c888675e133ab5dff84516926a65672eaf04d9
279 19c888675e133ab5dff84516926a65672eaf04d9
280 2a7f09cac94c7f4b73ebd5cd1a62d3b2e8e336bf
280 2a7f09cac94c7f4b73ebd5cd1a62d3b2e8e336bf
281 bundling: 1/3 changesets (33.33%)
281 bundling: 1/3 changesets (33.33%)
282 bundling: 2/3 changesets (66.67%)
282 bundling: 2/3 changesets (66.67%)
283 bundling: 3/3 changesets (100.00%)
283 bundling: 3/3 changesets (100.00%)
284 bundling: 1/3 manifests (33.33%)
284 bundling: 1/3 manifests (33.33%)
285 bundling: 2/3 manifests (66.67%)
285 bundling: 2/3 manifests (66.67%)
286 bundling: 3/3 manifests (100.00%)
286 bundling: 3/3 manifests (100.00%)
287 bundling: f1.txt 1/1 files (100.00%)
287 bundling: f1.txt 1/1 files (100.00%)
288 adding branch
288 adding branch
289 adding changesets
289 adding changesets
290 changesets: 1 chunks
290 changesets: 1 chunks
291 add changeset 4c9fbe56a16f
291 add changeset 4c9fbe56a16f
292 changesets: 2 chunks
292 changesets: 2 chunks
293 add changeset 19c888675e13
293 add changeset 19c888675e13
294 changesets: 3 chunks
294 changesets: 3 chunks
295 add changeset 2a7f09cac94c
295 add changeset 2a7f09cac94c
296 adding manifests
296 adding manifests
297 manifests: 1/2 chunks (50.00%)
297 manifests: 1/2 chunks (50.00%)
298 manifests: 2/2 chunks (100.00%)
298 manifests: 2/2 chunks (100.00%)
299 manifests: 3/2 chunks (150.00%)
299 manifests: 3/2 chunks (150.00%)
300 adding file changes
300 adding file changes
301 adding f1.txt revisions
301 adding f1.txt revisions
302 files: 1/1 chunks (100.00%)
302 files: 1/1 chunks (100.00%)
303 added 2 changesets with 2 changes to 1 files
303 added 2 changesets with 2 changes to 1 files
304 removing unknown node e31216eec445 from 1-phase boundary
304 removing unknown node e31216eec445 from 1-phase boundary
305 invalid branchheads cache (served): tip differs
305 invalid branchheads cache (served): tip differs
306 rebase completed
306 rebase completed
307 updating the branch cache
307 updating the branch cache
@@ -1,398 +1,398 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
10 > EOF
10 > EOF
11
11
12
12
13 $ hg init a
13 $ hg init a
14 $ cd a
14 $ cd a
15 $ hg unbundle "$TESTDIR/bundles/rebase.hg"
15 $ hg unbundle "$TESTDIR/bundles/rebase.hg"
16 adding changesets
16 adding changesets
17 adding manifests
17 adding manifests
18 adding file changes
18 adding file changes
19 added 8 changesets with 7 changes to 7 files (+2 heads)
19 added 8 changesets with 7 changes to 7 files (+2 heads)
20 (run 'hg heads' to see heads, 'hg merge' to merge)
20 (run 'hg heads' to see heads, 'hg merge' to merge)
21 $ hg up tip
21 $ hg up tip
22 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
23
23
24 $ cd ..
24 $ cd ..
25
25
26
26
27 Rebasing D onto H detaching from C:
27 Rebasing D onto H detaching from C:
28
28
29 $ hg clone -q -u . a a1
29 $ hg clone -q -u . a a1
30 $ cd a1
30 $ cd a1
31
31
32 $ hg tglog
32 $ hg tglog
33 @ 7: 'H'
33 @ 7: 'H'
34 |
34 |
35 | o 6: 'G'
35 | o 6: 'G'
36 |/|
36 |/|
37 o | 5: 'F'
37 o | 5: 'F'
38 | |
38 | |
39 | o 4: 'E'
39 | o 4: 'E'
40 |/
40 |/
41 | o 3: 'D'
41 | o 3: 'D'
42 | |
42 | |
43 | o 2: 'C'
43 | o 2: 'C'
44 | |
44 | |
45 | o 1: 'B'
45 | o 1: 'B'
46 |/
46 |/
47 o 0: 'A'
47 o 0: 'A'
48
48
49 $ hg phase --force --secret 3
49 $ hg phase --force --secret 3
50 $ hg rebase -s 3 -d 7
50 $ hg rebase -s 3 -d 7
51 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
51 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
52
52
53 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
53 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
54 o 7:secret 'D'
54 o 7:secret 'D'
55 |
55 |
56 @ 6:draft 'H'
56 @ 6:draft 'H'
57 |
57 |
58 | o 5:draft 'G'
58 | o 5:draft 'G'
59 |/|
59 |/|
60 o | 4:draft 'F'
60 o | 4:draft 'F'
61 | |
61 | |
62 | o 3:draft 'E'
62 | o 3:draft 'E'
63 |/
63 |/
64 | o 2:draft 'C'
64 | o 2:draft 'C'
65 | |
65 | |
66 | o 1:draft 'B'
66 | o 1:draft 'B'
67 |/
67 |/
68 o 0:draft 'A'
68 o 0:draft 'A'
69
69
70 $ hg manifest --rev tip
70 $ hg manifest --rev tip
71 A
71 A
72 D
72 D
73 F
73 F
74 H
74 H
75
75
76 $ cd ..
76 $ cd ..
77
77
78
78
79 Rebasing C onto H detaching from B:
79 Rebasing C onto H detaching from B:
80
80
81 $ hg clone -q -u . a a2
81 $ hg clone -q -u . a a2
82 $ cd a2
82 $ cd a2
83
83
84 $ hg tglog
84 $ hg tglog
85 @ 7: 'H'
85 @ 7: 'H'
86 |
86 |
87 | o 6: 'G'
87 | o 6: 'G'
88 |/|
88 |/|
89 o | 5: 'F'
89 o | 5: 'F'
90 | |
90 | |
91 | o 4: 'E'
91 | o 4: 'E'
92 |/
92 |/
93 | o 3: 'D'
93 | o 3: 'D'
94 | |
94 | |
95 | o 2: 'C'
95 | o 2: 'C'
96 | |
96 | |
97 | o 1: 'B'
97 | o 1: 'B'
98 |/
98 |/
99 o 0: 'A'
99 o 0: 'A'
100
100
101 $ hg rebase -s 2 -d 7
101 $ hg rebase -s 2 -d 7
102 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
102 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
103
103
104 $ hg tglog
104 $ hg tglog
105 o 7: 'D'
105 o 7: 'D'
106 |
106 |
107 o 6: 'C'
107 o 6: 'C'
108 |
108 |
109 @ 5: 'H'
109 @ 5: 'H'
110 |
110 |
111 | o 4: 'G'
111 | o 4: 'G'
112 |/|
112 |/|
113 o | 3: 'F'
113 o | 3: 'F'
114 | |
114 | |
115 | o 2: 'E'
115 | o 2: 'E'
116 |/
116 |/
117 | o 1: 'B'
117 | o 1: 'B'
118 |/
118 |/
119 o 0: 'A'
119 o 0: 'A'
120
120
121 $ hg manifest --rev tip
121 $ hg manifest --rev tip
122 A
122 A
123 C
123 C
124 D
124 D
125 F
125 F
126 H
126 H
127
127
128 $ cd ..
128 $ cd ..
129
129
130
130
131 Rebasing B onto H using detach (same as not using it):
131 Rebasing B onto H using detach (same as not using it):
132
132
133 $ hg clone -q -u . a a3
133 $ hg clone -q -u . a a3
134 $ cd a3
134 $ cd a3
135
135
136 $ hg tglog
136 $ hg tglog
137 @ 7: 'H'
137 @ 7: 'H'
138 |
138 |
139 | o 6: 'G'
139 | o 6: 'G'
140 |/|
140 |/|
141 o | 5: 'F'
141 o | 5: 'F'
142 | |
142 | |
143 | o 4: 'E'
143 | o 4: 'E'
144 |/
144 |/
145 | o 3: 'D'
145 | o 3: 'D'
146 | |
146 | |
147 | o 2: 'C'
147 | o 2: 'C'
148 | |
148 | |
149 | o 1: 'B'
149 | o 1: 'B'
150 |/
150 |/
151 o 0: 'A'
151 o 0: 'A'
152
152
153 $ hg rebase -s 1 -d 7
153 $ hg rebase -s 1 -d 7
154 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
154 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
155
155
156 $ hg tglog
156 $ hg tglog
157 o 7: 'D'
157 o 7: 'D'
158 |
158 |
159 o 6: 'C'
159 o 6: 'C'
160 |
160 |
161 o 5: 'B'
161 o 5: 'B'
162 |
162 |
163 @ 4: 'H'
163 @ 4: 'H'
164 |
164 |
165 | o 3: 'G'
165 | o 3: 'G'
166 |/|
166 |/|
167 o | 2: 'F'
167 o | 2: 'F'
168 | |
168 | |
169 | o 1: 'E'
169 | o 1: 'E'
170 |/
170 |/
171 o 0: 'A'
171 o 0: 'A'
172
172
173 $ hg manifest --rev tip
173 $ hg manifest --rev tip
174 A
174 A
175 B
175 B
176 C
176 C
177 D
177 D
178 F
178 F
179 H
179 H
180
180
181 $ cd ..
181 $ cd ..
182
182
183
183
184 Rebasing C onto H detaching from B and collapsing:
184 Rebasing C onto H detaching from B and collapsing:
185
185
186 $ hg clone -q -u . a a4
186 $ hg clone -q -u . a a4
187 $ cd a4
187 $ cd a4
188 $ hg phase --force --secret 3
188 $ hg phase --force --secret 3
189
189
190 $ hg tglog
190 $ hg tglog
191 @ 7: 'H'
191 @ 7: 'H'
192 |
192 |
193 | o 6: 'G'
193 | o 6: 'G'
194 |/|
194 |/|
195 o | 5: 'F'
195 o | 5: 'F'
196 | |
196 | |
197 | o 4: 'E'
197 | o 4: 'E'
198 |/
198 |/
199 | o 3: 'D'
199 | o 3: 'D'
200 | |
200 | |
201 | o 2: 'C'
201 | o 2: 'C'
202 | |
202 | |
203 | o 1: 'B'
203 | o 1: 'B'
204 |/
204 |/
205 o 0: 'A'
205 o 0: 'A'
206
206
207 $ hg rebase --collapse -s 2 -d 7
207 $ hg rebase --collapse -s 2 -d 7
208 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
208 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
209
209
210 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
210 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
211 o 6:secret 'Collapsed revision
211 o 6:secret 'Collapsed revision
212 | * C
212 | * C
213 | * D'
213 | * D'
214 @ 5:draft 'H'
214 @ 5:draft 'H'
215 |
215 |
216 | o 4:draft 'G'
216 | o 4:draft 'G'
217 |/|
217 |/|
218 o | 3:draft 'F'
218 o | 3:draft 'F'
219 | |
219 | |
220 | o 2:draft 'E'
220 | o 2:draft 'E'
221 |/
221 |/
222 | o 1:draft 'B'
222 | o 1:draft 'B'
223 |/
223 |/
224 o 0:draft 'A'
224 o 0:draft 'A'
225
225
226 $ hg manifest --rev tip
226 $ hg manifest --rev tip
227 A
227 A
228 C
228 C
229 D
229 D
230 F
230 F
231 H
231 H
232
232
233 $ cd ..
233 $ cd ..
234
234
235 Rebasing across null as ancestor
235 Rebasing across null as ancestor
236 $ hg clone -q -U a a5
236 $ hg clone -q -U a a5
237
237
238 $ cd a5
238 $ cd a5
239
239
240 $ echo x > x
240 $ echo x > x
241
241
242 $ hg add x
242 $ hg add x
243
243
244 $ hg ci -m "extra branch"
244 $ hg ci -m "extra branch"
245 created new head
245 created new head
246
246
247 $ hg tglog
247 $ hg tglog
248 @ 8: 'extra branch'
248 @ 8: 'extra branch'
249
249
250 o 7: 'H'
250 o 7: 'H'
251 |
251 |
252 | o 6: 'G'
252 | o 6: 'G'
253 |/|
253 |/|
254 o | 5: 'F'
254 o | 5: 'F'
255 | |
255 | |
256 | o 4: 'E'
256 | o 4: 'E'
257 |/
257 |/
258 | o 3: 'D'
258 | o 3: 'D'
259 | |
259 | |
260 | o 2: 'C'
260 | o 2: 'C'
261 | |
261 | |
262 | o 1: 'B'
262 | o 1: 'B'
263 |/
263 |/
264 o 0: 'A'
264 o 0: 'A'
265
265
266 $ hg rebase -s 1 -d tip
266 $ hg rebase -s 1 -d tip
267 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
267 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
268
268
269 $ hg tglog
269 $ hg tglog
270 o 8: 'D'
270 o 8: 'D'
271 |
271 |
272 o 7: 'C'
272 o 7: 'C'
273 |
273 |
274 o 6: 'B'
274 o 6: 'B'
275 |
275 |
276 @ 5: 'extra branch'
276 @ 5: 'extra branch'
277
277
278 o 4: 'H'
278 o 4: 'H'
279 |
279 |
280 | o 3: 'G'
280 | o 3: 'G'
281 |/|
281 |/|
282 o | 2: 'F'
282 o | 2: 'F'
283 | |
283 | |
284 | o 1: 'E'
284 | o 1: 'E'
285 |/
285 |/
286 o 0: 'A'
286 o 0: 'A'
287
287
288
288
289 $ hg rebase -d 5 -s 7
289 $ hg rebase -d 5 -s 7
290 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/13547172c9c0-backup.hg (glob)
290 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/13547172c9c0-backup.hg (glob)
291 $ hg tglog
291 $ hg tglog
292 o 8: 'D'
292 o 8: 'D'
293 |
293 |
294 o 7: 'C'
294 o 7: 'C'
295 |
295 |
296 | o 6: 'B'
296 | o 6: 'B'
297 |/
297 |/
298 @ 5: 'extra branch'
298 @ 5: 'extra branch'
299
299
300 o 4: 'H'
300 o 4: 'H'
301 |
301 |
302 | o 3: 'G'
302 | o 3: 'G'
303 |/|
303 |/|
304 o | 2: 'F'
304 o | 2: 'F'
305 | |
305 | |
306 | o 1: 'E'
306 | o 1: 'E'
307 |/
307 |/
308 o 0: 'A'
308 o 0: 'A'
309
309
310 $ cd ..
310 $ cd ..
311
311
312 Verify that target is not selected as external rev (issue3085)
312 Verify that target is not selected as external rev (issue3085)
313
313
314 $ hg clone -q -U a a6
314 $ hg clone -q -U a a6
315 $ cd a6
315 $ cd a6
316 $ hg up -q 6
316 $ hg up -q 6
317
317
318 $ echo "I" >> E
318 $ echo "I" >> E
319 $ hg ci -m "I"
319 $ hg ci -m "I"
320 $ hg merge 7
320 $ hg merge 7
321 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
321 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
322 (branch merge, don't forget to commit)
322 (branch merge, don't forget to commit)
323 $ hg ci -m "Merge"
323 $ hg ci -m "Merge"
324 $ echo "J" >> F
324 $ echo "J" >> F
325 $ hg ci -m "J"
325 $ hg ci -m "J"
326
326
327 $ hg rebase -s 8 -d 7 --collapse --config ui.merge=internal:other
327 $ hg rebase -s 8 -d 7 --collapse --config ui.merge=internal:other
328 saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
328 saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
329
329
330 $ hg tglog
330 $ hg tglog
331 @ 8: 'Collapsed revision
331 @ 8: 'Collapsed revision
332 | * I
332 | * I
333 | * Merge
333 | * Merge
334 | * J'
334 | * J'
335 o 7: 'H'
335 o 7: 'H'
336 |
336 |
337 | o 6: 'G'
337 | o 6: 'G'
338 |/|
338 |/|
339 o | 5: 'F'
339 o | 5: 'F'
340 | |
340 | |
341 | o 4: 'E'
341 | o 4: 'E'
342 |/
342 |/
343 | o 3: 'D'
343 | o 3: 'D'
344 | |
344 | |
345 | o 2: 'C'
345 | o 2: 'C'
346 | |
346 | |
347 | o 1: 'B'
347 | o 1: 'B'
348 |/
348 |/
349 o 0: 'A'
349 o 0: 'A'
350
350
351
351
352 $ hg log --rev tip
352 $ hg log --rev tip
353 changeset: 8:9472f4b1d736
353 changeset: 8:9472f4b1d736
354 tag: tip
354 tag: tip
355 user: test
355 user: test
356 date: Thu Jan 01 00:00:00 1970 +0000
356 date: Thu Jan 01 00:00:00 1970 +0000
357 summary: Collapsed revision
357 summary: Collapsed revision
358
358
359
359
360 $ cd ..
360 $ cd ..
361
361
362 Ensure --continue restores a correct state (issue3046) and phase:
362 Ensure --continue restores a correct state (issue3046) and phase:
363 $ hg clone -q a a7
363 $ hg clone -q a a7
364 $ cd a7
364 $ cd a7
365 $ hg up -q 3
365 $ hg up -q 3
366 $ echo 'H2' > H
366 $ echo 'H2' > H
367 $ hg ci -A -m 'H2'
367 $ hg ci -A -m 'H2'
368 adding H
368 adding H
369 $ hg phase --force --secret 8
369 $ hg phase --force --secret 8
370 $ hg rebase -s 8 -d 7 --config ui.merge=internal:fail
370 $ hg rebase -s 8 -d 7 --config ui.merge=internal:fail
371 merging H
371 merging H
372 warning: conflicts during merge.
372 warning: conflicts during merge.
373 merging H incomplete! (edit conflicts, then use 'hg resolve --mark')
373 merging H incomplete! (edit conflicts, then use 'hg resolve --mark')
374 unresolved conflicts (see hg resolve, then hg rebase --continue)
374 unresolved conflicts (see hg resolve, then hg rebase --continue)
375 [1]
375 [1]
376 $ hg resolve --all -t internal:local
376 $ hg resolve --all -t internal:local
377 no more unresolved files
377 (no more unresolved files)
378 $ hg rebase -c
378 $ hg rebase -c
379 saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
379 saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
380 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
380 $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
381 @ 7:draft 'H'
381 @ 7:draft 'H'
382 |
382 |
383 | o 6:draft 'G'
383 | o 6:draft 'G'
384 |/|
384 |/|
385 o | 5:draft 'F'
385 o | 5:draft 'F'
386 | |
386 | |
387 | o 4:draft 'E'
387 | o 4:draft 'E'
388 |/
388 |/
389 | o 3:draft 'D'
389 | o 3:draft 'D'
390 | |
390 | |
391 | o 2:draft 'C'
391 | o 2:draft 'C'
392 | |
392 | |
393 | o 1:draft 'B'
393 | o 1:draft 'B'
394 |/
394 |/
395 o 0:draft 'A'
395 o 0:draft 'A'
396
396
397
397
398 $ cd ..
398 $ cd ..
@@ -1,267 +1,267 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
10 > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
10 > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
11 > EOF
11 > EOF
12
12
13
13
14 $ hg init a
14 $ hg init a
15 $ cd a
15 $ cd a
16
16
17 $ echo A > A
17 $ echo A > A
18 $ hg ci -Am A
18 $ hg ci -Am A
19 adding A
19 adding A
20
20
21 $ echo B > B
21 $ echo B > B
22 $ hg ci -Am B
22 $ hg ci -Am B
23 adding B
23 adding B
24
24
25 $ echo C >> A
25 $ echo C >> A
26 $ hg ci -m C
26 $ hg ci -m C
27
27
28 $ hg up -q -C 0
28 $ hg up -q -C 0
29
29
30 $ echo D >> A
30 $ echo D >> A
31 $ hg ci -m D
31 $ hg ci -m D
32 created new head
32 created new head
33
33
34 $ echo E > E
34 $ echo E > E
35 $ hg ci -Am E
35 $ hg ci -Am E
36 adding E
36 adding E
37
37
38 $ cd ..
38 $ cd ..
39
39
40
40
41 Changes during an interruption - continue:
41 Changes during an interruption - continue:
42
42
43 $ hg clone -q -u . a a1
43 $ hg clone -q -u . a a1
44 $ cd a1
44 $ cd a1
45
45
46 $ hg tglog
46 $ hg tglog
47 @ 4: 'E'
47 @ 4: 'E'
48 |
48 |
49 o 3: 'D'
49 o 3: 'D'
50 |
50 |
51 | o 2: 'C'
51 | o 2: 'C'
52 | |
52 | |
53 | o 1: 'B'
53 | o 1: 'B'
54 |/
54 |/
55 o 0: 'A'
55 o 0: 'A'
56
56
57 Rebasing B onto E:
57 Rebasing B onto E:
58
58
59 $ hg rebase -s 1 -d 4
59 $ hg rebase -s 1 -d 4
60 merging A
60 merging A
61 warning: conflicts during merge.
61 warning: conflicts during merge.
62 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
62 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
63 unresolved conflicts (see hg resolve, then hg rebase --continue)
63 unresolved conflicts (see hg resolve, then hg rebase --continue)
64 [1]
64 [1]
65
65
66 Force a commit on C during the interruption:
66 Force a commit on C during the interruption:
67
67
68 $ hg up -q -C 2 --config 'extensions.rebase=!'
68 $ hg up -q -C 2 --config 'extensions.rebase=!'
69
69
70 $ echo 'Extra' > Extra
70 $ echo 'Extra' > Extra
71 $ hg add Extra
71 $ hg add Extra
72 $ hg ci -m 'Extra' --config 'extensions.rebase=!'
72 $ hg ci -m 'Extra' --config 'extensions.rebase=!'
73
73
74 Force this commit onto secret phase
74 Force this commit onto secret phase
75
75
76 $ hg phase --force --secret 6
76 $ hg phase --force --secret 6
77
77
78 $ hg tglogp
78 $ hg tglogp
79 @ 6:secret 'Extra'
79 @ 6:secret 'Extra'
80 |
80 |
81 | o 5:draft 'B'
81 | o 5:draft 'B'
82 | |
82 | |
83 | o 4:draft 'E'
83 | o 4:draft 'E'
84 | |
84 | |
85 | o 3:draft 'D'
85 | o 3:draft 'D'
86 | |
86 | |
87 o | 2:draft 'C'
87 o | 2:draft 'C'
88 | |
88 | |
89 o | 1:draft 'B'
89 o | 1:draft 'B'
90 |/
90 |/
91 o 0:draft 'A'
91 o 0:draft 'A'
92
92
93 Resume the rebasing:
93 Resume the rebasing:
94
94
95 $ hg rebase --continue
95 $ hg rebase --continue
96 merging A
96 merging A
97 warning: conflicts during merge.
97 warning: conflicts during merge.
98 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
98 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
99 unresolved conflicts (see hg resolve, then hg rebase --continue)
99 unresolved conflicts (see hg resolve, then hg rebase --continue)
100 [1]
100 [1]
101
101
102 Solve the conflict and go on:
102 Solve the conflict and go on:
103
103
104 $ echo 'conflict solved' > A
104 $ echo 'conflict solved' > A
105 $ rm A.orig
105 $ rm A.orig
106 $ hg resolve -m A
106 $ hg resolve -m A
107 no more unresolved files
107 (no more unresolved files)
108
108
109 $ hg rebase --continue
109 $ hg rebase --continue
110 warning: new changesets detected on source branch, not stripping
110 warning: new changesets detected on source branch, not stripping
111
111
112 $ hg tglogp
112 $ hg tglogp
113 o 7:draft 'C'
113 o 7:draft 'C'
114 |
114 |
115 | o 6:secret 'Extra'
115 | o 6:secret 'Extra'
116 | |
116 | |
117 o | 5:draft 'B'
117 o | 5:draft 'B'
118 | |
118 | |
119 @ | 4:draft 'E'
119 @ | 4:draft 'E'
120 | |
120 | |
121 o | 3:draft 'D'
121 o | 3:draft 'D'
122 | |
122 | |
123 | o 2:draft 'C'
123 | o 2:draft 'C'
124 | |
124 | |
125 | o 1:draft 'B'
125 | o 1:draft 'B'
126 |/
126 |/
127 o 0:draft 'A'
127 o 0:draft 'A'
128
128
129 $ cd ..
129 $ cd ..
130
130
131
131
132 Changes during an interruption - abort:
132 Changes during an interruption - abort:
133
133
134 $ hg clone -q -u . a a2
134 $ hg clone -q -u . a a2
135 $ cd a2
135 $ cd a2
136
136
137 $ hg tglog
137 $ hg tglog
138 @ 4: 'E'
138 @ 4: 'E'
139 |
139 |
140 o 3: 'D'
140 o 3: 'D'
141 |
141 |
142 | o 2: 'C'
142 | o 2: 'C'
143 | |
143 | |
144 | o 1: 'B'
144 | o 1: 'B'
145 |/
145 |/
146 o 0: 'A'
146 o 0: 'A'
147
147
148 Rebasing B onto E:
148 Rebasing B onto E:
149
149
150 $ hg rebase -s 1 -d 4
150 $ hg rebase -s 1 -d 4
151 merging A
151 merging A
152 warning: conflicts during merge.
152 warning: conflicts during merge.
153 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
153 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
154 unresolved conflicts (see hg resolve, then hg rebase --continue)
154 unresolved conflicts (see hg resolve, then hg rebase --continue)
155 [1]
155 [1]
156
156
157 Force a commit on B' during the interruption:
157 Force a commit on B' during the interruption:
158
158
159 $ hg up -q -C 5 --config 'extensions.rebase=!'
159 $ hg up -q -C 5 --config 'extensions.rebase=!'
160
160
161 $ echo 'Extra' > Extra
161 $ echo 'Extra' > Extra
162 $ hg add Extra
162 $ hg add Extra
163 $ hg ci -m 'Extra' --config 'extensions.rebase=!'
163 $ hg ci -m 'Extra' --config 'extensions.rebase=!'
164
164
165 $ hg tglog
165 $ hg tglog
166 @ 6: 'Extra'
166 @ 6: 'Extra'
167 |
167 |
168 o 5: 'B'
168 o 5: 'B'
169 |
169 |
170 o 4: 'E'
170 o 4: 'E'
171 |
171 |
172 o 3: 'D'
172 o 3: 'D'
173 |
173 |
174 | o 2: 'C'
174 | o 2: 'C'
175 | |
175 | |
176 | o 1: 'B'
176 | o 1: 'B'
177 |/
177 |/
178 o 0: 'A'
178 o 0: 'A'
179
179
180 Abort the rebasing:
180 Abort the rebasing:
181
181
182 $ hg rebase --abort
182 $ hg rebase --abort
183 warning: new changesets detected on target branch, can't strip
183 warning: new changesets detected on target branch, can't strip
184 rebase aborted
184 rebase aborted
185
185
186 $ hg tglog
186 $ hg tglog
187 @ 6: 'Extra'
187 @ 6: 'Extra'
188 |
188 |
189 o 5: 'B'
189 o 5: 'B'
190 |
190 |
191 o 4: 'E'
191 o 4: 'E'
192 |
192 |
193 o 3: 'D'
193 o 3: 'D'
194 |
194 |
195 | o 2: 'C'
195 | o 2: 'C'
196 | |
196 | |
197 | o 1: 'B'
197 | o 1: 'B'
198 |/
198 |/
199 o 0: 'A'
199 o 0: 'A'
200
200
201 $ cd ..
201 $ cd ..
202
202
203 Changes during an interruption - abort (again):
203 Changes during an interruption - abort (again):
204
204
205 $ hg clone -q -u . a a3
205 $ hg clone -q -u . a a3
206 $ cd a3
206 $ cd a3
207
207
208 $ hg tglogp
208 $ hg tglogp
209 @ 4:draft 'E'
209 @ 4:draft 'E'
210 |
210 |
211 o 3:draft 'D'
211 o 3:draft 'D'
212 |
212 |
213 | o 2:draft 'C'
213 | o 2:draft 'C'
214 | |
214 | |
215 | o 1:draft 'B'
215 | o 1:draft 'B'
216 |/
216 |/
217 o 0:draft 'A'
217 o 0:draft 'A'
218
218
219 Rebasing B onto E:
219 Rebasing B onto E:
220
220
221 $ hg rebase -s 1 -d 4
221 $ hg rebase -s 1 -d 4
222 merging A
222 merging A
223 warning: conflicts during merge.
223 warning: conflicts during merge.
224 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
224 merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
225 unresolved conflicts (see hg resolve, then hg rebase --continue)
225 unresolved conflicts (see hg resolve, then hg rebase --continue)
226 [1]
226 [1]
227
227
228 Change phase on B and B'
228 Change phase on B and B'
229
229
230 $ hg up -q -C 5 --config 'extensions.rebase=!'
230 $ hg up -q -C 5 --config 'extensions.rebase=!'
231 $ hg phase --public 1
231 $ hg phase --public 1
232 $ hg phase --public 5
232 $ hg phase --public 5
233 $ hg phase --secret -f 2
233 $ hg phase --secret -f 2
234
234
235 $ hg tglogp
235 $ hg tglogp
236 @ 5:public 'B'
236 @ 5:public 'B'
237 |
237 |
238 o 4:public 'E'
238 o 4:public 'E'
239 |
239 |
240 o 3:public 'D'
240 o 3:public 'D'
241 |
241 |
242 | o 2:secret 'C'
242 | o 2:secret 'C'
243 | |
243 | |
244 | o 1:public 'B'
244 | o 1:public 'B'
245 |/
245 |/
246 o 0:public 'A'
246 o 0:public 'A'
247
247
248 Abort the rebasing:
248 Abort the rebasing:
249
249
250 $ hg rebase --abort
250 $ hg rebase --abort
251 warning: can't clean up immutable changesets 45396c49d53b
251 warning: can't clean up immutable changesets 45396c49d53b
252 rebase aborted
252 rebase aborted
253
253
254 $ hg tglogp
254 $ hg tglogp
255 @ 5:public 'B'
255 @ 5:public 'B'
256 |
256 |
257 o 4:public 'E'
257 o 4:public 'E'
258 |
258 |
259 o 3:public 'D'
259 o 3:public 'D'
260 |
260 |
261 | o 2:secret 'C'
261 | o 2:secret 'C'
262 | |
262 | |
263 | o 1:public 'B'
263 | o 1:public 'B'
264 |/
264 |/
265 o 0:public 'A'
265 o 0:public 'A'
266
266
267 $ cd ..
267 $ cd ..
@@ -1,139 +1,139 b''
1 This emulates the effects of an hg pull --rebase in which the remote repo
1 This emulates the effects of an hg pull --rebase in which the remote repo
2 already has one local mq patch
2 already has one local mq patch
3
3
4 $ cat >> $HGRCPATH <<EOF
4 $ cat >> $HGRCPATH <<EOF
5 > [extensions]
5 > [extensions]
6 > rebase=
6 > rebase=
7 > mq=
7 > mq=
8 >
8 >
9 > [phases]
9 > [phases]
10 > publish=False
10 > publish=False
11 >
11 >
12 > [alias]
12 > [alias]
13 > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
13 > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
14 > EOF
14 > EOF
15
15
16
16
17 $ hg init a
17 $ hg init a
18 $ cd a
18 $ cd a
19 $ hg qinit -c
19 $ hg qinit -c
20
20
21 $ echo c1 > c1
21 $ echo c1 > c1
22 $ hg add c1
22 $ hg add c1
23 $ hg ci -m C1
23 $ hg ci -m C1
24
24
25 $ echo r1 > r1
25 $ echo r1 > r1
26 $ hg add r1
26 $ hg add r1
27 $ hg ci -m R1
27 $ hg ci -m R1
28
28
29 $ hg up -q 0
29 $ hg up -q 0
30
30
31 $ hg qnew p0.patch
31 $ hg qnew p0.patch
32 $ echo p0 > p0
32 $ echo p0 > p0
33 $ hg add p0
33 $ hg add p0
34 $ hg qref -m P0
34 $ hg qref -m P0
35
35
36 $ hg qnew p1.patch
36 $ hg qnew p1.patch
37 $ echo p1 > p1
37 $ echo p1 > p1
38 $ hg add p1
38 $ hg add p1
39 $ hg qref -m P1
39 $ hg qref -m P1
40
40
41 $ hg export qtip > p1.patch
41 $ hg export qtip > p1.patch
42
42
43 $ hg up -q -C 1
43 $ hg up -q -C 1
44
44
45 $ hg import p1.patch
45 $ hg import p1.patch
46 applying p1.patch
46 applying p1.patch
47
47
48 $ rm p1.patch
48 $ rm p1.patch
49
49
50 $ hg up -q -C qtip
50 $ hg up -q -C qtip
51
51
52 $ hg rebase
52 $ hg rebase
53 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
53 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
54
54
55 $ hg tglog
55 $ hg tglog
56 @ 3: 'P0' tags: p0.patch qbase qtip tip
56 @ 3: 'P0' tags: p0.patch qbase qtip tip
57 |
57 |
58 o 2: 'P1' tags: qparent
58 o 2: 'P1' tags: qparent
59 |
59 |
60 o 1: 'R1' tags:
60 o 1: 'R1' tags:
61 |
61 |
62 o 0: 'C1' tags:
62 o 0: 'C1' tags:
63
63
64 $ cd ..
64 $ cd ..
65
65
66
66
67 $ hg init b
67 $ hg init b
68 $ cd b
68 $ cd b
69 $ hg qinit -c
69 $ hg qinit -c
70
70
71 $ for i in r0 r1 r2 r3 r4 r5 r6;
71 $ for i in r0 r1 r2 r3 r4 r5 r6;
72 > do
72 > do
73 > echo $i > $i
73 > echo $i > $i
74 > hg ci -Am $i
74 > hg ci -Am $i
75 > done
75 > done
76 adding r0
76 adding r0
77 adding r1
77 adding r1
78 adding r2
78 adding r2
79 adding r3
79 adding r3
80 adding r4
80 adding r4
81 adding r5
81 adding r5
82 adding r6
82 adding r6
83
83
84 $ hg qimport -r 1:tip
84 $ hg qimport -r 1:tip
85
85
86 $ hg up -q 0
86 $ hg up -q 0
87
87
88 $ for i in r1 r3 r7 r8;
88 $ for i in r1 r3 r7 r8;
89 > do
89 > do
90 > echo $i > $i
90 > echo $i > $i
91 > hg ci -Am branch2-$i
91 > hg ci -Am branch2-$i
92 > done
92 > done
93 adding r1
93 adding r1
94 created new head
94 created new head
95 adding r3
95 adding r3
96 adding r7
96 adding r7
97 adding r8
97 adding r8
98
98
99 $ echo somethingelse > r4
99 $ echo somethingelse > r4
100 $ hg ci -Am branch2-r4
100 $ hg ci -Am branch2-r4
101 adding r4
101 adding r4
102
102
103 $ echo r6 > r6
103 $ echo r6 > r6
104 $ hg ci -Am branch2-r6
104 $ hg ci -Am branch2-r6
105 adding r6
105 adding r6
106
106
107 $ hg up -q qtip
107 $ hg up -q qtip
108
108
109 $ HGMERGE=internal:fail hg rebase
109 $ HGMERGE=internal:fail hg rebase
110 unresolved conflicts (see hg resolve, then hg rebase --continue)
110 unresolved conflicts (see hg resolve, then hg rebase --continue)
111 [1]
111 [1]
112
112
113 $ HGMERGE=internal:local hg resolve --all
113 $ HGMERGE=internal:local hg resolve --all
114 no more unresolved files
114 (no more unresolved files)
115
115
116 $ hg rebase --continue
116 $ hg rebase --continue
117 saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
117 saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
118
118
119 $ hg tglog
119 $ hg tglog
120 @ 8: 'r5' tags: 5.diff qtip tip
120 @ 8: 'r5' tags: 5.diff qtip tip
121 |
121 |
122 o 7: 'r2' tags: 2.diff qbase
122 o 7: 'r2' tags: 2.diff qbase
123 |
123 |
124 o 6: 'branch2-r6' tags: qparent
124 o 6: 'branch2-r6' tags: qparent
125 |
125 |
126 o 5: 'branch2-r4' tags:
126 o 5: 'branch2-r4' tags:
127 |
127 |
128 o 4: 'branch2-r8' tags:
128 o 4: 'branch2-r8' tags:
129 |
129 |
130 o 3: 'branch2-r7' tags:
130 o 3: 'branch2-r7' tags:
131 |
131 |
132 o 2: 'branch2-r3' tags:
132 o 2: 'branch2-r3' tags:
133 |
133 |
134 o 1: 'branch2-r1' tags:
134 o 1: 'branch2-r1' tags:
135 |
135 |
136 o 0: 'r0' tags:
136 o 0: 'r0' tags:
137
137
138
138
139 $ cd ..
139 $ cd ..
@@ -1,348 +1,348 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 > mq=
4 > mq=
5 >
5 >
6 > [mq]
6 > [mq]
7 > plain=true
7 > plain=true
8 >
8 >
9 > [alias]
9 > [alias]
10 > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
10 > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
11 > EOF
11 > EOF
12
12
13
13
14 $ hg init a
14 $ hg init a
15 $ cd a
15 $ cd a
16 $ hg qinit -c
16 $ hg qinit -c
17
17
18 $ echo c1 > f
18 $ echo c1 > f
19 $ hg add f
19 $ hg add f
20 $ hg ci -m C1
20 $ hg ci -m C1
21
21
22 $ echo r1 > f
22 $ echo r1 > f
23 $ hg ci -m R1
23 $ hg ci -m R1
24
24
25 $ hg up -q 0
25 $ hg up -q 0
26
26
27 $ hg qnew f.patch
27 $ hg qnew f.patch
28 $ echo mq1 > f
28 $ echo mq1 > f
29 $ hg qref -m P0
29 $ hg qref -m P0
30
30
31 $ hg qnew f2.patch
31 $ hg qnew f2.patch
32 $ echo mq2 > f
32 $ echo mq2 > f
33 $ hg qref -m P1
33 $ hg qref -m P1
34
34
35 $ hg tglog
35 $ hg tglog
36 @ 3: 'P1' tags: f2.patch qtip tip
36 @ 3: 'P1' tags: f2.patch qtip tip
37 |
37 |
38 o 2: 'P0' tags: f.patch qbase
38 o 2: 'P0' tags: f.patch qbase
39 |
39 |
40 | o 1: 'R1' tags:
40 | o 1: 'R1' tags:
41 |/
41 |/
42 o 0: 'C1' tags: qparent
42 o 0: 'C1' tags: qparent
43
43
44
44
45 Rebase - try to rebase on an applied mq patch:
45 Rebase - try to rebase on an applied mq patch:
46
46
47 $ hg rebase -s 1 -d 3
47 $ hg rebase -s 1 -d 3
48 abort: cannot rebase onto an applied mq patch
48 abort: cannot rebase onto an applied mq patch
49 [255]
49 [255]
50
50
51 Rebase - same thing, but mq patch is default dest:
51 Rebase - same thing, but mq patch is default dest:
52
52
53 $ hg up -q 1
53 $ hg up -q 1
54 $ hg rebase
54 $ hg rebase
55 abort: cannot rebase onto an applied mq patch
55 abort: cannot rebase onto an applied mq patch
56 [255]
56 [255]
57 $ hg up -q qtip
57 $ hg up -q qtip
58
58
59 Rebase - generate a conflict:
59 Rebase - generate a conflict:
60
60
61 $ hg rebase -s 2 -d 1
61 $ hg rebase -s 2 -d 1
62 merging f
62 merging f
63 warning: conflicts during merge.
63 warning: conflicts during merge.
64 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
64 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
65 unresolved conflicts (see hg resolve, then hg rebase --continue)
65 unresolved conflicts (see hg resolve, then hg rebase --continue)
66 [1]
66 [1]
67
67
68 Fix the 1st conflict:
68 Fix the 1st conflict:
69
69
70 $ echo mq1r1 > f
70 $ echo mq1r1 > f
71 $ hg resolve -m f
71 $ hg resolve -m f
72 no more unresolved files
72 (no more unresolved files)
73 $ hg rebase -c
73 $ hg rebase -c
74 merging f
74 merging f
75 warning: conflicts during merge.
75 warning: conflicts during merge.
76 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
76 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
77 unresolved conflicts (see hg resolve, then hg rebase --continue)
77 unresolved conflicts (see hg resolve, then hg rebase --continue)
78 [1]
78 [1]
79
79
80 Fix the 2nd conflict:
80 Fix the 2nd conflict:
81
81
82 $ echo mq1r1mq2 > f
82 $ echo mq1r1mq2 > f
83 $ hg resolve -m f
83 $ hg resolve -m f
84 no more unresolved files
84 (no more unresolved files)
85 $ hg rebase -c
85 $ hg rebase -c
86 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
86 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
87
87
88 $ hg tglog
88 $ hg tglog
89 @ 3: 'P1' tags: f2.patch qtip tip
89 @ 3: 'P1' tags: f2.patch qtip tip
90 |
90 |
91 o 2: 'P0' tags: f.patch qbase
91 o 2: 'P0' tags: f.patch qbase
92 |
92 |
93 o 1: 'R1' tags: qparent
93 o 1: 'R1' tags: qparent
94 |
94 |
95 o 0: 'C1' tags:
95 o 0: 'C1' tags:
96
96
97 $ hg up -q qbase
97 $ hg up -q qbase
98
98
99 $ cat f
99 $ cat f
100 mq1r1
100 mq1r1
101
101
102 $ cat .hg/patches/f.patch
102 $ cat .hg/patches/f.patch
103 # HG changeset patch
103 # HG changeset patch
104 # User test
104 # User test
105 # Date ?????????? ? (glob)
105 # Date ?????????? ? (glob)
106 # * (glob)
106 # * (glob)
107 # Node ID ???????????????????????????????????????? (glob)
107 # Node ID ???????????????????????????????????????? (glob)
108 # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
108 # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
109 P0
109 P0
110
110
111 diff -r bac9ed9960d8 -r ???????????? f (glob)
111 diff -r bac9ed9960d8 -r ???????????? f (glob)
112 --- a/f Thu Jan 01 00:00:00 1970 +0000
112 --- a/f Thu Jan 01 00:00:00 1970 +0000
113 +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
113 +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
114 @@ -1,1 +1,1 @@
114 @@ -1,1 +1,1 @@
115 -r1
115 -r1
116 +mq1r1
116 +mq1r1
117
117
118 Update to qtip:
118 Update to qtip:
119
119
120 $ hg up -q qtip
120 $ hg up -q qtip
121
121
122 $ cat f
122 $ cat f
123 mq1r1mq2
123 mq1r1mq2
124
124
125 $ cat .hg/patches/f2.patch
125 $ cat .hg/patches/f2.patch
126 # HG changeset patch
126 # HG changeset patch
127 # User test
127 # User test
128 # Date ?????????? ? (glob)
128 # Date ?????????? ? (glob)
129 # * (glob)
129 # * (glob)
130 # Node ID ???????????????????????????????????????? (glob)
130 # Node ID ???????????????????????????????????????? (glob)
131 # Parent ???????????????????????????????????????? (glob)
131 # Parent ???????????????????????????????????????? (glob)
132 P1
132 P1
133
133
134 diff -r ???????????? -r ???????????? f (glob)
134 diff -r ???????????? -r ???????????? f (glob)
135 --- a/f ??? ??? ?? ??:??:?? ???? ????? (glob)
135 --- a/f ??? ??? ?? ??:??:?? ???? ????? (glob)
136 +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
136 +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
137 @@ -1,1 +1,1 @@
137 @@ -1,1 +1,1 @@
138 -mq1r1
138 -mq1r1
139 +mq1r1mq2
139 +mq1r1mq2
140
140
141 Adding one git-style patch and one normal:
141 Adding one git-style patch and one normal:
142
142
143 $ hg qpop -a
143 $ hg qpop -a
144 popping f2.patch
144 popping f2.patch
145 popping f.patch
145 popping f.patch
146 patch queue now empty
146 patch queue now empty
147
147
148 $ rm -fr .hg/patches
148 $ rm -fr .hg/patches
149 $ hg qinit -c
149 $ hg qinit -c
150
150
151 $ hg up -q 0
151 $ hg up -q 0
152
152
153 $ hg qnew --git f_git.patch
153 $ hg qnew --git f_git.patch
154 $ echo mq1 > p
154 $ echo mq1 > p
155 $ hg add p
155 $ hg add p
156 $ hg qref --git -m 'P0 (git)'
156 $ hg qref --git -m 'P0 (git)'
157
157
158 $ hg qnew f.patch
158 $ hg qnew f.patch
159 $ echo mq2 > p
159 $ echo mq2 > p
160 $ hg qref -m P1
160 $ hg qref -m P1
161 $ hg qci -m 'save patch state'
161 $ hg qci -m 'save patch state'
162
162
163 $ hg qseries -s
163 $ hg qseries -s
164 f_git.patch: P0 (git)
164 f_git.patch: P0 (git)
165 f.patch: P1
165 f.patch: P1
166
166
167 $ hg -R .hg/patches manifest
167 $ hg -R .hg/patches manifest
168 .hgignore
168 .hgignore
169 f.patch
169 f.patch
170 f_git.patch
170 f_git.patch
171 series
171 series
172
172
173 $ cat .hg/patches/f_git.patch
173 $ cat .hg/patches/f_git.patch
174 P0 (git)
174 P0 (git)
175
175
176 diff --git a/p b/p
176 diff --git a/p b/p
177 new file mode 100644
177 new file mode 100644
178 --- /dev/null
178 --- /dev/null
179 +++ b/p
179 +++ b/p
180 @@ -0,0 +1,1 @@
180 @@ -0,0 +1,1 @@
181 +mq1
181 +mq1
182
182
183 $ cat .hg/patches/f.patch
183 $ cat .hg/patches/f.patch
184 P1
184 P1
185
185
186 diff -r ???????????? p (glob)
186 diff -r ???????????? p (glob)
187 --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
187 --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
188 +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
188 +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
189 @@ -1,1 +1,1 @@
189 @@ -1,1 +1,1 @@
190 -mq1
190 -mq1
191 +mq2
191 +mq2
192
192
193
193
194 Rebase the applied mq patches:
194 Rebase the applied mq patches:
195
195
196 $ hg rebase -s 2 -d 1
196 $ hg rebase -s 2 -d 1
197 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
197 saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
198
198
199 $ hg qci -m 'save patch state'
199 $ hg qci -m 'save patch state'
200
200
201 $ hg qseries -s
201 $ hg qseries -s
202 f_git.patch: P0 (git)
202 f_git.patch: P0 (git)
203 f.patch: P1
203 f.patch: P1
204
204
205 $ hg -R .hg/patches manifest
205 $ hg -R .hg/patches manifest
206 .hgignore
206 .hgignore
207 f.patch
207 f.patch
208 f_git.patch
208 f_git.patch
209 series
209 series
210
210
211 $ cat .hg/patches/f_git.patch
211 $ cat .hg/patches/f_git.patch
212 # HG changeset patch
212 # HG changeset patch
213 # User test
213 # User test
214 # Date ?????????? ? (glob)
214 # Date ?????????? ? (glob)
215 # * (glob)
215 # * (glob)
216 # Node ID ???????????????????????????????????????? (glob)
216 # Node ID ???????????????????????????????????????? (glob)
217 # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
217 # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
218 P0 (git)
218 P0 (git)
219
219
220 diff --git a/p b/p
220 diff --git a/p b/p
221 new file mode 100644
221 new file mode 100644
222 --- /dev/null
222 --- /dev/null
223 +++ b/p
223 +++ b/p
224 @@ -0,0 +1,1 @@
224 @@ -0,0 +1,1 @@
225 +mq1
225 +mq1
226
226
227 $ cat .hg/patches/f.patch
227 $ cat .hg/patches/f.patch
228 # HG changeset patch
228 # HG changeset patch
229 # User test
229 # User test
230 # Date ?????????? ? (glob)
230 # Date ?????????? ? (glob)
231 # * (glob)
231 # * (glob)
232 # Node ID ???????????????????????????????????????? (glob)
232 # Node ID ???????????????????????????????????????? (glob)
233 # Parent ???????????????????????????????????????? (glob)
233 # Parent ???????????????????????????????????????? (glob)
234 P1
234 P1
235
235
236 diff -r ???????????? -r ???????????? p (glob)
236 diff -r ???????????? -r ???????????? p (glob)
237 --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
237 --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
238 +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
238 +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
239 @@ -1,1 +1,1 @@
239 @@ -1,1 +1,1 @@
240 -mq1
240 -mq1
241 +mq2
241 +mq2
242
242
243 $ cd ..
243 $ cd ..
244
244
245 Rebase with guards
245 Rebase with guards
246
246
247 $ hg init foo
247 $ hg init foo
248 $ cd foo
248 $ cd foo
249 $ echo a > a
249 $ echo a > a
250 $ hg ci -Am a
250 $ hg ci -Am a
251 adding a
251 adding a
252
252
253 Create mq repo with guarded patches foo and bar and empty patch:
253 Create mq repo with guarded patches foo and bar and empty patch:
254
254
255 $ hg qinit
255 $ hg qinit
256 $ echo guarded > guarded
256 $ echo guarded > guarded
257 $ hg add guarded
257 $ hg add guarded
258 $ hg qnew guarded
258 $ hg qnew guarded
259 $ hg qnew empty-important -m 'important commit message'
259 $ hg qnew empty-important -m 'important commit message'
260 $ echo bar > bar
260 $ echo bar > bar
261 $ hg add bar
261 $ hg add bar
262 $ hg qnew bar
262 $ hg qnew bar
263 $ echo foo > foo
263 $ echo foo > foo
264 $ hg add foo
264 $ hg add foo
265 $ hg qnew foo
265 $ hg qnew foo
266 $ hg qpop -a
266 $ hg qpop -a
267 popping foo
267 popping foo
268 popping bar
268 popping bar
269 popping empty-important
269 popping empty-important
270 popping guarded
270 popping guarded
271 patch queue now empty
271 patch queue now empty
272 $ hg qguard guarded +guarded
272 $ hg qguard guarded +guarded
273 $ hg qguard bar +baz
273 $ hg qguard bar +baz
274 $ hg qguard foo +baz
274 $ hg qguard foo +baz
275 $ hg qselect baz
275 $ hg qselect baz
276 number of unguarded, unapplied patches has changed from 1 to 3
276 number of unguarded, unapplied patches has changed from 1 to 3
277 $ hg qpush bar
277 $ hg qpush bar
278 applying empty-important
278 applying empty-important
279 patch empty-important is empty
279 patch empty-important is empty
280 applying bar
280 applying bar
281 now at: bar
281 now at: bar
282
282
283 $ hg qguard -l
283 $ hg qguard -l
284 guarded: +guarded
284 guarded: +guarded
285 empty-important: unguarded
285 empty-important: unguarded
286 bar: +baz
286 bar: +baz
287 foo: +baz
287 foo: +baz
288
288
289 $ hg tglog
289 $ hg tglog
290 @ 2: 'imported patch bar' tags: bar qtip tip
290 @ 2: 'imported patch bar' tags: bar qtip tip
291 |
291 |
292 o 1: 'important commit message' tags: empty-important qbase
292 o 1: 'important commit message' tags: empty-important qbase
293 |
293 |
294 o 0: 'a' tags: qparent
294 o 0: 'a' tags: qparent
295
295
296 Create new head to rebase bar onto:
296 Create new head to rebase bar onto:
297
297
298 $ hg up -C 0
298 $ hg up -C 0
299 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
299 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
300 $ echo b > b
300 $ echo b > b
301 $ hg add b
301 $ hg add b
302 $ hg ci -m b
302 $ hg ci -m b
303 created new head
303 created new head
304 $ hg up -C 2
304 $ hg up -C 2
305 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
305 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
306 $ echo a >> a
306 $ echo a >> a
307 $ hg qref
307 $ hg qref
308
308
309 $ hg tglog
309 $ hg tglog
310 @ 3: '[mq]: bar' tags: bar qtip tip
310 @ 3: '[mq]: bar' tags: bar qtip tip
311 |
311 |
312 | o 2: 'b' tags:
312 | o 2: 'b' tags:
313 | |
313 | |
314 o | 1: 'important commit message' tags: empty-important qbase
314 o | 1: 'important commit message' tags: empty-important qbase
315 |/
315 |/
316 o 0: 'a' tags: qparent
316 o 0: 'a' tags: qparent
317
317
318
318
319 Rebase bar (make sure series order is preserved and empty-important also is
319 Rebase bar (make sure series order is preserved and empty-important also is
320 removed from the series):
320 removed from the series):
321
321
322 $ hg qseries
322 $ hg qseries
323 guarded
323 guarded
324 empty-important
324 empty-important
325 bar
325 bar
326 foo
326 foo
327 $ [ -f .hg/patches/empty-important ]
327 $ [ -f .hg/patches/empty-important ]
328 $ hg -q rebase -d 2
328 $ hg -q rebase -d 2
329 $ hg qseries
329 $ hg qseries
330 guarded
330 guarded
331 bar
331 bar
332 foo
332 foo
333 $ [ -f .hg/patches/empty-important ]
333 $ [ -f .hg/patches/empty-important ]
334 [1]
334 [1]
335
335
336 $ hg qguard -l
336 $ hg qguard -l
337 guarded: +guarded
337 guarded: +guarded
338 bar: +baz
338 bar: +baz
339 foo: +baz
339 foo: +baz
340
340
341 $ hg tglog
341 $ hg tglog
342 @ 2:* '[mq]: bar' tags: bar qbase qtip tip (glob)
342 @ 2:* '[mq]: bar' tags: bar qbase qtip tip (glob)
343 |
343 |
344 o 1:* 'b' tags: qparent (glob)
344 o 1:* 'b' tags: qparent (glob)
345 |
345 |
346 o 0:* 'a' tags: (glob)
346 o 0:* 'a' tags: (glob)
347
347
348 $ cd ..
348 $ cd ..
@@ -1,462 +1,462 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 >
4 >
5 > [phases]
5 > [phases]
6 > publish=False
6 > publish=False
7 >
7 >
8 > [alias]
8 > [alias]
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
9 > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
10 > EOF
10 > EOF
11
11
12
12
13 $ hg init a
13 $ hg init a
14 $ cd a
14 $ cd a
15 $ hg unbundle "$TESTDIR/bundles/rebase.hg"
15 $ hg unbundle "$TESTDIR/bundles/rebase.hg"
16 adding changesets
16 adding changesets
17 adding manifests
17 adding manifests
18 adding file changes
18 adding file changes
19 added 8 changesets with 7 changes to 7 files (+2 heads)
19 added 8 changesets with 7 changes to 7 files (+2 heads)
20 (run 'hg heads' to see heads, 'hg merge' to merge)
20 (run 'hg heads' to see heads, 'hg merge' to merge)
21 $ hg up tip
21 $ hg up tip
22 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
23
23
24 $ echo I > I
24 $ echo I > I
25 $ hg ci -AmI
25 $ hg ci -AmI
26 adding I
26 adding I
27
27
28 $ hg tglog
28 $ hg tglog
29 @ 8: 'I'
29 @ 8: 'I'
30 |
30 |
31 o 7: 'H'
31 o 7: 'H'
32 |
32 |
33 | o 6: 'G'
33 | o 6: 'G'
34 |/|
34 |/|
35 o | 5: 'F'
35 o | 5: 'F'
36 | |
36 | |
37 | o 4: 'E'
37 | o 4: 'E'
38 |/
38 |/
39 | o 3: 'D'
39 | o 3: 'D'
40 | |
40 | |
41 | o 2: 'C'
41 | o 2: 'C'
42 | |
42 | |
43 | o 1: 'B'
43 | o 1: 'B'
44 |/
44 |/
45 o 0: 'A'
45 o 0: 'A'
46
46
47 $ cd ..
47 $ cd ..
48
48
49
49
50 These fail:
50 These fail:
51
51
52 $ hg clone -q -u . a a1
52 $ hg clone -q -u . a a1
53 $ cd a1
53 $ cd a1
54
54
55 $ hg rebase -s 8 -d 7
55 $ hg rebase -s 8 -d 7
56 nothing to rebase
56 nothing to rebase
57 [1]
57 [1]
58
58
59 $ hg rebase --continue --abort
59 $ hg rebase --continue --abort
60 abort: cannot use both abort and continue
60 abort: cannot use both abort and continue
61 [255]
61 [255]
62
62
63 $ hg rebase --continue --collapse
63 $ hg rebase --continue --collapse
64 abort: cannot use collapse with continue or abort
64 abort: cannot use collapse with continue or abort
65 [255]
65 [255]
66
66
67 $ hg rebase --continue --dest 4
67 $ hg rebase --continue --dest 4
68 abort: abort and continue do not allow specifying revisions
68 abort: abort and continue do not allow specifying revisions
69 [255]
69 [255]
70
70
71 $ hg rebase --base 5 --source 4
71 $ hg rebase --base 5 --source 4
72 abort: cannot specify both a source and a base
72 abort: cannot specify both a source and a base
73 [255]
73 [255]
74
74
75 $ hg rebase --rev 5 --source 4
75 $ hg rebase --rev 5 --source 4
76 abort: cannot specify both a revision and a source
76 abort: cannot specify both a revision and a source
77 [255]
77 [255]
78 $ hg rebase --base 5 --rev 4
78 $ hg rebase --base 5 --rev 4
79 abort: cannot specify both a revision and a base
79 abort: cannot specify both a revision and a base
80 [255]
80 [255]
81
81
82 $ hg rebase --rev '1 & !1'
82 $ hg rebase --rev '1 & !1'
83 empty "rev" revision set - nothing to rebase
83 empty "rev" revision set - nothing to rebase
84 [1]
84 [1]
85
85
86 $ hg rebase --source '1 & !1'
86 $ hg rebase --source '1 & !1'
87 empty "source" revision set - nothing to rebase
87 empty "source" revision set - nothing to rebase
88 [1]
88 [1]
89
89
90 $ hg rebase --base '1 & !1'
90 $ hg rebase --base '1 & !1'
91 empty "base" revision set - can't compute rebase set
91 empty "base" revision set - can't compute rebase set
92 [1]
92 [1]
93
93
94 $ hg rebase
94 $ hg rebase
95 nothing to rebase - working directory parent is also destination
95 nothing to rebase - working directory parent is also destination
96 [1]
96 [1]
97
97
98 $ hg rebase -b.
98 $ hg rebase -b.
99 nothing to rebase - e7ec4e813ba6 is both "base" and destination
99 nothing to rebase - e7ec4e813ba6 is both "base" and destination
100 [1]
100 [1]
101
101
102 $ hg up -q 7
102 $ hg up -q 7
103
103
104 $ hg rebase --traceback
104 $ hg rebase --traceback
105 nothing to rebase - working directory parent is already an ancestor of destination e7ec4e813ba6
105 nothing to rebase - working directory parent is already an ancestor of destination e7ec4e813ba6
106 [1]
106 [1]
107
107
108 $ hg rebase -b.
108 $ hg rebase -b.
109 nothing to rebase - "base" 02de42196ebe is already an ancestor of destination e7ec4e813ba6
109 nothing to rebase - "base" 02de42196ebe is already an ancestor of destination e7ec4e813ba6
110 [1]
110 [1]
111
111
112 $ hg rebase --dest '1 & !1'
112 $ hg rebase --dest '1 & !1'
113 abort: empty revision set
113 abort: empty revision set
114 [255]
114 [255]
115
115
116 These work:
116 These work:
117
117
118 Rebase with no arguments (from 3 onto 8):
118 Rebase with no arguments (from 3 onto 8):
119
119
120 $ hg up -q -C 3
120 $ hg up -q -C 3
121
121
122 $ hg rebase
122 $ hg rebase
123 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
123 saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
124
124
125 $ hg tglog
125 $ hg tglog
126 @ 8: 'D'
126 @ 8: 'D'
127 |
127 |
128 o 7: 'C'
128 o 7: 'C'
129 |
129 |
130 o 6: 'B'
130 o 6: 'B'
131 |
131 |
132 o 5: 'I'
132 o 5: 'I'
133 |
133 |
134 o 4: 'H'
134 o 4: 'H'
135 |
135 |
136 | o 3: 'G'
136 | o 3: 'G'
137 |/|
137 |/|
138 o | 2: 'F'
138 o | 2: 'F'
139 | |
139 | |
140 | o 1: 'E'
140 | o 1: 'E'
141 |/
141 |/
142 o 0: 'A'
142 o 0: 'A'
143
143
144 Try to rollback after a rebase (fail):
144 Try to rollback after a rebase (fail):
145
145
146 $ hg rollback
146 $ hg rollback
147 no rollback information available
147 no rollback information available
148 [1]
148 [1]
149
149
150 $ cd ..
150 $ cd ..
151
151
152 Rebase with base == '.' => same as no arguments (from 3 onto 8):
152 Rebase with base == '.' => same as no arguments (from 3 onto 8):
153
153
154 $ hg clone -q -u 3 a a2
154 $ hg clone -q -u 3 a a2
155 $ cd a2
155 $ cd a2
156
156
157 $ hg rebase --base .
157 $ hg rebase --base .
158 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
158 saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
159
159
160 $ hg tglog
160 $ hg tglog
161 @ 8: 'D'
161 @ 8: 'D'
162 |
162 |
163 o 7: 'C'
163 o 7: 'C'
164 |
164 |
165 o 6: 'B'
165 o 6: 'B'
166 |
166 |
167 o 5: 'I'
167 o 5: 'I'
168 |
168 |
169 o 4: 'H'
169 o 4: 'H'
170 |
170 |
171 | o 3: 'G'
171 | o 3: 'G'
172 |/|
172 |/|
173 o | 2: 'F'
173 o | 2: 'F'
174 | |
174 | |
175 | o 1: 'E'
175 | o 1: 'E'
176 |/
176 |/
177 o 0: 'A'
177 o 0: 'A'
178
178
179 $ cd ..
179 $ cd ..
180
180
181
181
182 Rebase with dest == branch(.) => same as no arguments (from 3 onto 8):
182 Rebase with dest == branch(.) => same as no arguments (from 3 onto 8):
183
183
184 $ hg clone -q -u 3 a a3
184 $ hg clone -q -u 3 a a3
185 $ cd a3
185 $ cd a3
186
186
187 $ hg rebase --dest 'branch(.)'
187 $ hg rebase --dest 'branch(.)'
188 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
188 saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
189
189
190 $ hg tglog
190 $ hg tglog
191 @ 8: 'D'
191 @ 8: 'D'
192 |
192 |
193 o 7: 'C'
193 o 7: 'C'
194 |
194 |
195 o 6: 'B'
195 o 6: 'B'
196 |
196 |
197 o 5: 'I'
197 o 5: 'I'
198 |
198 |
199 o 4: 'H'
199 o 4: 'H'
200 |
200 |
201 | o 3: 'G'
201 | o 3: 'G'
202 |/|
202 |/|
203 o | 2: 'F'
203 o | 2: 'F'
204 | |
204 | |
205 | o 1: 'E'
205 | o 1: 'E'
206 |/
206 |/
207 o 0: 'A'
207 o 0: 'A'
208
208
209 $ cd ..
209 $ cd ..
210
210
211
211
212 Specify only source (from 2 onto 8):
212 Specify only source (from 2 onto 8):
213
213
214 $ hg clone -q -u . a a4
214 $ hg clone -q -u . a a4
215 $ cd a4
215 $ cd a4
216
216
217 $ hg rebase --source 'desc("C")'
217 $ hg rebase --source 'desc("C")'
218 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
218 saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
219
219
220 $ hg tglog
220 $ hg tglog
221 o 8: 'D'
221 o 8: 'D'
222 |
222 |
223 o 7: 'C'
223 o 7: 'C'
224 |
224 |
225 @ 6: 'I'
225 @ 6: 'I'
226 |
226 |
227 o 5: 'H'
227 o 5: 'H'
228 |
228 |
229 | o 4: 'G'
229 | o 4: 'G'
230 |/|
230 |/|
231 o | 3: 'F'
231 o | 3: 'F'
232 | |
232 | |
233 | o 2: 'E'
233 | o 2: 'E'
234 |/
234 |/
235 | o 1: 'B'
235 | o 1: 'B'
236 |/
236 |/
237 o 0: 'A'
237 o 0: 'A'
238
238
239 $ cd ..
239 $ cd ..
240
240
241
241
242 Specify only dest (from 3 onto 6):
242 Specify only dest (from 3 onto 6):
243
243
244 $ hg clone -q -u 3 a a5
244 $ hg clone -q -u 3 a a5
245 $ cd a5
245 $ cd a5
246
246
247 $ hg rebase --dest 6
247 $ hg rebase --dest 6
248 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
248 saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
249
249
250 $ hg tglog
250 $ hg tglog
251 @ 8: 'D'
251 @ 8: 'D'
252 |
252 |
253 o 7: 'C'
253 o 7: 'C'
254 |
254 |
255 o 6: 'B'
255 o 6: 'B'
256 |
256 |
257 | o 5: 'I'
257 | o 5: 'I'
258 | |
258 | |
259 | o 4: 'H'
259 | o 4: 'H'
260 | |
260 | |
261 o | 3: 'G'
261 o | 3: 'G'
262 |\|
262 |\|
263 | o 2: 'F'
263 | o 2: 'F'
264 | |
264 | |
265 o | 1: 'E'
265 o | 1: 'E'
266 |/
266 |/
267 o 0: 'A'
267 o 0: 'A'
268
268
269 $ cd ..
269 $ cd ..
270
270
271
271
272 Specify only base (from 1 onto 8):
272 Specify only base (from 1 onto 8):
273
273
274 $ hg clone -q -u . a a6
274 $ hg clone -q -u . a a6
275 $ cd a6
275 $ cd a6
276
276
277 $ hg rebase --base 'desc("D")'
277 $ hg rebase --base 'desc("D")'
278 saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
278 saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
279
279
280 $ hg tglog
280 $ hg tglog
281 o 8: 'D'
281 o 8: 'D'
282 |
282 |
283 o 7: 'C'
283 o 7: 'C'
284 |
284 |
285 o 6: 'B'
285 o 6: 'B'
286 |
286 |
287 @ 5: 'I'
287 @ 5: 'I'
288 |
288 |
289 o 4: 'H'
289 o 4: 'H'
290 |
290 |
291 | o 3: 'G'
291 | o 3: 'G'
292 |/|
292 |/|
293 o | 2: 'F'
293 o | 2: 'F'
294 | |
294 | |
295 | o 1: 'E'
295 | o 1: 'E'
296 |/
296 |/
297 o 0: 'A'
297 o 0: 'A'
298
298
299 $ cd ..
299 $ cd ..
300
300
301
301
302 Specify source and dest (from 2 onto 7):
302 Specify source and dest (from 2 onto 7):
303
303
304 $ hg clone -q -u . a a7
304 $ hg clone -q -u . a a7
305 $ cd a7
305 $ cd a7
306
306
307 $ hg rebase --source 2 --dest 7
307 $ hg rebase --source 2 --dest 7
308 saved backup bundle to $TESTTMP/a7/.hg/strip-backup/*-backup.hg (glob)
308 saved backup bundle to $TESTTMP/a7/.hg/strip-backup/*-backup.hg (glob)
309
309
310 $ hg tglog
310 $ hg tglog
311 o 8: 'D'
311 o 8: 'D'
312 |
312 |
313 o 7: 'C'
313 o 7: 'C'
314 |
314 |
315 | @ 6: 'I'
315 | @ 6: 'I'
316 |/
316 |/
317 o 5: 'H'
317 o 5: 'H'
318 |
318 |
319 | o 4: 'G'
319 | o 4: 'G'
320 |/|
320 |/|
321 o | 3: 'F'
321 o | 3: 'F'
322 | |
322 | |
323 | o 2: 'E'
323 | o 2: 'E'
324 |/
324 |/
325 | o 1: 'B'
325 | o 1: 'B'
326 |/
326 |/
327 o 0: 'A'
327 o 0: 'A'
328
328
329 $ cd ..
329 $ cd ..
330
330
331
331
332 Specify base and dest (from 1 onto 7):
332 Specify base and dest (from 1 onto 7):
333
333
334 $ hg clone -q -u . a a8
334 $ hg clone -q -u . a a8
335 $ cd a8
335 $ cd a8
336
336
337 $ hg rebase --base 3 --dest 7
337 $ hg rebase --base 3 --dest 7
338 saved backup bundle to $TESTTMP/a8/.hg/strip-backup/*-backup.hg (glob)
338 saved backup bundle to $TESTTMP/a8/.hg/strip-backup/*-backup.hg (glob)
339
339
340 $ hg tglog
340 $ hg tglog
341 o 8: 'D'
341 o 8: 'D'
342 |
342 |
343 o 7: 'C'
343 o 7: 'C'
344 |
344 |
345 o 6: 'B'
345 o 6: 'B'
346 |
346 |
347 | @ 5: 'I'
347 | @ 5: 'I'
348 |/
348 |/
349 o 4: 'H'
349 o 4: 'H'
350 |
350 |
351 | o 3: 'G'
351 | o 3: 'G'
352 |/|
352 |/|
353 o | 2: 'F'
353 o | 2: 'F'
354 | |
354 | |
355 | o 1: 'E'
355 | o 1: 'E'
356 |/
356 |/
357 o 0: 'A'
357 o 0: 'A'
358
358
359 $ cd ..
359 $ cd ..
360
360
361
361
362 Specify only revs (from 2 onto 8)
362 Specify only revs (from 2 onto 8)
363
363
364 $ hg clone -q -u . a a9
364 $ hg clone -q -u . a a9
365 $ cd a9
365 $ cd a9
366
366
367 $ hg rebase --rev 'desc("C")::'
367 $ hg rebase --rev 'desc("C")::'
368 saved backup bundle to $TESTTMP/a9/.hg/strip-backup/*-backup.hg (glob)
368 saved backup bundle to $TESTTMP/a9/.hg/strip-backup/*-backup.hg (glob)
369
369
370 $ hg tglog
370 $ hg tglog
371 o 8: 'D'
371 o 8: 'D'
372 |
372 |
373 o 7: 'C'
373 o 7: 'C'
374 |
374 |
375 @ 6: 'I'
375 @ 6: 'I'
376 |
376 |
377 o 5: 'H'
377 o 5: 'H'
378 |
378 |
379 | o 4: 'G'
379 | o 4: 'G'
380 |/|
380 |/|
381 o | 3: 'F'
381 o | 3: 'F'
382 | |
382 | |
383 | o 2: 'E'
383 | o 2: 'E'
384 |/
384 |/
385 | o 1: 'B'
385 | o 1: 'B'
386 |/
386 |/
387 o 0: 'A'
387 o 0: 'A'
388
388
389 $ cd ..
389 $ cd ..
390
390
391 Test --tool parameter:
391 Test --tool parameter:
392
392
393 $ hg init b
393 $ hg init b
394 $ cd b
394 $ cd b
395
395
396 $ echo c1 > c1
396 $ echo c1 > c1
397 $ hg ci -Am c1
397 $ hg ci -Am c1
398 adding c1
398 adding c1
399
399
400 $ echo c2 > c2
400 $ echo c2 > c2
401 $ hg ci -Am c2
401 $ hg ci -Am c2
402 adding c2
402 adding c2
403
403
404 $ hg up -q 0
404 $ hg up -q 0
405 $ echo c2b > c2
405 $ echo c2b > c2
406 $ hg ci -Am c2b
406 $ hg ci -Am c2b
407 adding c2
407 adding c2
408 created new head
408 created new head
409
409
410 $ cd ..
410 $ cd ..
411
411
412 $ hg clone -q -u . b b1
412 $ hg clone -q -u . b b1
413 $ cd b1
413 $ cd b1
414
414
415 $ hg rebase -s 2 -d 1 --tool internal:local
415 $ hg rebase -s 2 -d 1 --tool internal:local
416 saved backup bundle to $TESTTMP/b1/.hg/strip-backup/*-backup.hg (glob)
416 saved backup bundle to $TESTTMP/b1/.hg/strip-backup/*-backup.hg (glob)
417
417
418 $ hg cat c2
418 $ hg cat c2
419 c2
419 c2
420
420
421 $ cd ..
421 $ cd ..
422
422
423
423
424 $ hg clone -q -u . b b2
424 $ hg clone -q -u . b b2
425 $ cd b2
425 $ cd b2
426
426
427 $ hg rebase -s 2 -d 1 --tool internal:other
427 $ hg rebase -s 2 -d 1 --tool internal:other
428 saved backup bundle to $TESTTMP/b2/.hg/strip-backup/*-backup.hg (glob)
428 saved backup bundle to $TESTTMP/b2/.hg/strip-backup/*-backup.hg (glob)
429
429
430 $ hg cat c2
430 $ hg cat c2
431 c2b
431 c2b
432
432
433 $ cd ..
433 $ cd ..
434
434
435
435
436 $ hg clone -q -u . b b3
436 $ hg clone -q -u . b b3
437 $ cd b3
437 $ cd b3
438
438
439 $ hg rebase -s 2 -d 1 --tool internal:fail
439 $ hg rebase -s 2 -d 1 --tool internal:fail
440 unresolved conflicts (see hg resolve, then hg rebase --continue)
440 unresolved conflicts (see hg resolve, then hg rebase --continue)
441 [1]
441 [1]
442
442
443 $ hg summary
443 $ hg summary
444 parent: 1:56daeba07f4b
444 parent: 1:56daeba07f4b
445 c2
445 c2
446 parent: 2:e4e3f3546619 tip
446 parent: 2:e4e3f3546619 tip
447 c2b
447 c2b
448 branch: default
448 branch: default
449 commit: 1 modified, 1 unresolved (merge)
449 commit: 1 modified, 1 unresolved (merge)
450 update: (current)
450 update: (current)
451 rebase: 0 rebased, 1 remaining (rebase --continue)
451 rebase: 0 rebased, 1 remaining (rebase --continue)
452
452
453 $ hg resolve -l
453 $ hg resolve -l
454 U c2
454 U c2
455
455
456 $ hg resolve -m c2
456 $ hg resolve -m c2
457 no more unresolved files
457 (no more unresolved files)
458 $ hg rebase -c --tool internal:fail
458 $ hg rebase -c --tool internal:fail
459 tool option will be ignored
459 tool option will be ignored
460 saved backup bundle to $TESTTMP/b3/.hg/strip-backup/*-backup.hg (glob)
460 saved backup bundle to $TESTTMP/b3/.hg/strip-backup/*-backup.hg (glob)
461
461
462 $ cd ..
462 $ cd ..
@@ -1,63 +1,63 b''
1 test that a commit clears the merge state.
1 test that a commit clears the merge state.
2
2
3 $ hg init repo
3 $ hg init repo
4 $ cd repo
4 $ cd repo
5
5
6 $ echo foo > file
6 $ echo foo > file
7 $ hg commit -Am 'add file'
7 $ hg commit -Am 'add file'
8 adding file
8 adding file
9
9
10 $ echo bar >> file
10 $ echo bar >> file
11 $ hg commit -Am 'append bar'
11 $ hg commit -Am 'append bar'
12
12
13
13
14 create a second head
14 create a second head
15
15
16 $ hg up -C 0
16 $ hg up -C 0
17 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
17 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
18 $ echo baz >> file
18 $ echo baz >> file
19 $ hg commit -Am 'append baz'
19 $ hg commit -Am 'append baz'
20 created new head
20 created new head
21
21
22 failing merge
22 failing merge
23
23
24 $ hg merge --tool=internal:fail
24 $ hg merge --tool=internal:fail
25 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
25 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
26 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
26 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
27 [1]
27 [1]
28
28
29 resolve -l should contain an unresolved entry
29 resolve -l should contain an unresolved entry
30
30
31 $ hg resolve -l
31 $ hg resolve -l
32 U file
32 U file
33
33
34 resolving an unknown path emits a warning
34 resolving an unknown path emits a warning
35 $ hg resolve -m does-not-exist
35 $ hg resolve -m does-not-exist
36 arguments do not match paths that need resolving
36 arguments do not match paths that need resolving
37
37
38 resolve the failure
38 resolve the failure
39
39
40 $ echo resolved > file
40 $ echo resolved > file
41 $ hg resolve -m file
41 $ hg resolve -m file
42 no more unresolved files
42 (no more unresolved files)
43 $ hg commit -m 'resolved'
43 $ hg commit -m 'resolved'
44
44
45 resolve -l should be empty
45 resolve -l should be empty
46
46
47 $ hg resolve -l
47 $ hg resolve -l
48
48
49 resolve -m should abort since no merge in progress
49 resolve -m should abort since no merge in progress
50 $ hg resolve -m
50 $ hg resolve -m
51 abort: resolve command not applicable when not merging
51 abort: resolve command not applicable when not merging
52 [255]
52 [255]
53
53
54 test crashed merge with empty mergestate
54 test crashed merge with empty mergestate
55
55
56 $ mkdir .hg/merge
56 $ mkdir .hg/merge
57 $ touch .hg/merge/state
57 $ touch .hg/merge/state
58
58
59 resolve -l, should be empty
59 resolve -l, should be empty
60
60
61 $ hg resolve -l
61 $ hg resolve -l
62
62
63 $ cd ..
63 $ cd ..
@@ -1,700 +1,700 b''
1 $ echo "[extensions]" >> $HGRCPATH
1 $ echo "[extensions]" >> $HGRCPATH
2 $ echo "mq=" >> $HGRCPATH
2 $ echo "mq=" >> $HGRCPATH
3 $ echo "shelve=" >> $HGRCPATH
3 $ echo "shelve=" >> $HGRCPATH
4 $ echo "[defaults]" >> $HGRCPATH
4 $ echo "[defaults]" >> $HGRCPATH
5 $ echo "diff = --nodates --git" >> $HGRCPATH
5 $ echo "diff = --nodates --git" >> $HGRCPATH
6 $ echo "qnew = --date '0 0'" >> $HGRCPATH
6 $ echo "qnew = --date '0 0'" >> $HGRCPATH
7
7
8 $ hg init repo
8 $ hg init repo
9 $ cd repo
9 $ cd repo
10 $ mkdir a b
10 $ mkdir a b
11 $ echo a > a/a
11 $ echo a > a/a
12 $ echo b > b/b
12 $ echo b > b/b
13 $ echo c > c
13 $ echo c > c
14 $ echo d > d
14 $ echo d > d
15 $ echo x > x
15 $ echo x > x
16 $ hg addremove -q
16 $ hg addremove -q
17
17
18 shelving in an empty repo should be possible
18 shelving in an empty repo should be possible
19 (this tests also that editor is not invoked, if '--edit' is not
19 (this tests also that editor is not invoked, if '--edit' is not
20 specified)
20 specified)
21
21
22 $ HGEDITOR=cat hg shelve
22 $ HGEDITOR=cat hg shelve
23 shelved as default
23 shelved as default
24 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
24 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
25
25
26 $ hg unshelve
26 $ hg unshelve
27 unshelving change 'default'
27 unshelving change 'default'
28
28
29 $ hg commit -q -m 'initial commit'
29 $ hg commit -q -m 'initial commit'
30
30
31 $ hg shelve
31 $ hg shelve
32 nothing changed
32 nothing changed
33 [1]
33 [1]
34
34
35 create an mq patch - shelving should work fine with a patch applied
35 create an mq patch - shelving should work fine with a patch applied
36
36
37 $ echo n > n
37 $ echo n > n
38 $ hg add n
38 $ hg add n
39 $ hg commit n -m second
39 $ hg commit n -m second
40 $ hg qnew second.patch
40 $ hg qnew second.patch
41
41
42 shelve a change that we will delete later
42 shelve a change that we will delete later
43
43
44 $ echo a >> a/a
44 $ echo a >> a/a
45 $ hg shelve
45 $ hg shelve
46 shelved as default
46 shelved as default
47 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
47 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
48
48
49 set up some more complex changes to shelve
49 set up some more complex changes to shelve
50
50
51 $ echo a >> a/a
51 $ echo a >> a/a
52 $ hg mv b b.rename
52 $ hg mv b b.rename
53 moving b/b to b.rename/b (glob)
53 moving b/b to b.rename/b (glob)
54 $ hg cp c c.copy
54 $ hg cp c c.copy
55 $ hg status -C
55 $ hg status -C
56 M a/a
56 M a/a
57 A b.rename/b
57 A b.rename/b
58 b/b
58 b/b
59 A c.copy
59 A c.copy
60 c
60 c
61 R b/b
61 R b/b
62
62
63 prevent some foot-shooting
63 prevent some foot-shooting
64
64
65 $ hg shelve -n foo/bar
65 $ hg shelve -n foo/bar
66 abort: shelved change names may not contain slashes
66 abort: shelved change names may not contain slashes
67 [255]
67 [255]
68 $ hg shelve -n .baz
68 $ hg shelve -n .baz
69 abort: shelved change names may not start with '.'
69 abort: shelved change names may not start with '.'
70 [255]
70 [255]
71
71
72 the common case - no options or filenames
72 the common case - no options or filenames
73
73
74 $ hg shelve
74 $ hg shelve
75 shelved as default-01
75 shelved as default-01
76 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
76 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
77 $ hg status -C
77 $ hg status -C
78
78
79 ensure that our shelved changes exist
79 ensure that our shelved changes exist
80
80
81 $ hg shelve -l
81 $ hg shelve -l
82 default-01 (*) changes to '[mq]: second.patch' (glob)
82 default-01 (*) changes to '[mq]: second.patch' (glob)
83 default (*) changes to '[mq]: second.patch' (glob)
83 default (*) changes to '[mq]: second.patch' (glob)
84
84
85 $ hg shelve -l -p default
85 $ hg shelve -l -p default
86 default (*) changes to '[mq]: second.patch' (glob)
86 default (*) changes to '[mq]: second.patch' (glob)
87
87
88 diff --git a/a/a b/a/a
88 diff --git a/a/a b/a/a
89 --- a/a/a
89 --- a/a/a
90 +++ b/a/a
90 +++ b/a/a
91 @@ -1,1 +1,2 @@
91 @@ -1,1 +1,2 @@
92 a
92 a
93 +a
93 +a
94
94
95 $ hg shelve --list --addremove
95 $ hg shelve --list --addremove
96 abort: options '--list' and '--addremove' may not be used together
96 abort: options '--list' and '--addremove' may not be used together
97 [255]
97 [255]
98
98
99 delete our older shelved change
99 delete our older shelved change
100
100
101 $ hg shelve -d default
101 $ hg shelve -d default
102 $ hg qfinish -a -q
102 $ hg qfinish -a -q
103
103
104 local edits should not prevent a shelved change from applying
104 local edits should not prevent a shelved change from applying
105
105
106 $ printf "z\na\n" > a/a
106 $ printf "z\na\n" > a/a
107 $ hg unshelve --keep
107 $ hg unshelve --keep
108 unshelving change 'default-01'
108 unshelving change 'default-01'
109 temporarily committing pending changes (restore with 'hg unshelve --abort')
109 temporarily committing pending changes (restore with 'hg unshelve --abort')
110 rebasing shelved changes
110 rebasing shelved changes
111 merging a/a
111 merging a/a
112
112
113 $ hg revert --all -q
113 $ hg revert --all -q
114 $ rm a/a.orig b.rename/b c.copy
114 $ rm a/a.orig b.rename/b c.copy
115
115
116 apply it and make sure our state is as expected
116 apply it and make sure our state is as expected
117
117
118 $ hg unshelve
118 $ hg unshelve
119 unshelving change 'default-01'
119 unshelving change 'default-01'
120 $ hg status -C
120 $ hg status -C
121 M a/a
121 M a/a
122 A b.rename/b
122 A b.rename/b
123 b/b
123 b/b
124 A c.copy
124 A c.copy
125 c
125 c
126 R b/b
126 R b/b
127 $ hg shelve -l
127 $ hg shelve -l
128
128
129 $ hg unshelve
129 $ hg unshelve
130 abort: no shelved changes to apply!
130 abort: no shelved changes to apply!
131 [255]
131 [255]
132 $ hg unshelve foo
132 $ hg unshelve foo
133 abort: shelved change 'foo' not found
133 abort: shelved change 'foo' not found
134 [255]
134 [255]
135
135
136 named shelves, specific filenames, and "commit messages" should all work
136 named shelves, specific filenames, and "commit messages" should all work
137 (this tests also that editor is invoked, if '--edit' is specified)
137 (this tests also that editor is invoked, if '--edit' is specified)
138
138
139 $ hg status -C
139 $ hg status -C
140 M a/a
140 M a/a
141 A b.rename/b
141 A b.rename/b
142 b/b
142 b/b
143 A c.copy
143 A c.copy
144 c
144 c
145 R b/b
145 R b/b
146 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
146 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
147 wat
147 wat
148
148
149
149
150 HG: Enter commit message. Lines beginning with 'HG:' are removed.
150 HG: Enter commit message. Lines beginning with 'HG:' are removed.
151 HG: Leave message empty to abort commit.
151 HG: Leave message empty to abort commit.
152 HG: --
152 HG: --
153 HG: user: shelve@localhost
153 HG: user: shelve@localhost
154 HG: branch 'default'
154 HG: branch 'default'
155 HG: changed a/a
155 HG: changed a/a
156
156
157 expect "a" to no longer be present, but status otherwise unchanged
157 expect "a" to no longer be present, but status otherwise unchanged
158
158
159 $ hg status -C
159 $ hg status -C
160 A b.rename/b
160 A b.rename/b
161 b/b
161 b/b
162 A c.copy
162 A c.copy
163 c
163 c
164 R b/b
164 R b/b
165 $ hg shelve -l --stat
165 $ hg shelve -l --stat
166 wibble (*) wat (glob)
166 wibble (*) wat (glob)
167 a/a | 1 +
167 a/a | 1 +
168 1 files changed, 1 insertions(+), 0 deletions(-)
168 1 files changed, 1 insertions(+), 0 deletions(-)
169
169
170 and now "a/a" should reappear
170 and now "a/a" should reappear
171
171
172 $ cd a
172 $ cd a
173 $ hg unshelve -q wibble
173 $ hg unshelve -q wibble
174 $ cd ..
174 $ cd ..
175 $ hg status -C
175 $ hg status -C
176 M a/a
176 M a/a
177 A b.rename/b
177 A b.rename/b
178 b/b
178 b/b
179 A c.copy
179 A c.copy
180 c
180 c
181 R b/b
181 R b/b
182
182
183 cause unshelving to result in a merge with 'a' conflicting
183 cause unshelving to result in a merge with 'a' conflicting
184
184
185 $ hg shelve -q
185 $ hg shelve -q
186 $ echo c>>a/a
186 $ echo c>>a/a
187 $ hg commit -m second
187 $ hg commit -m second
188 $ hg tip --template '{files}\n'
188 $ hg tip --template '{files}\n'
189 a/a
189 a/a
190
190
191 add an unrelated change that should be preserved
191 add an unrelated change that should be preserved
192
192
193 $ mkdir foo
193 $ mkdir foo
194 $ echo foo > foo/foo
194 $ echo foo > foo/foo
195 $ hg add foo/foo
195 $ hg add foo/foo
196
196
197 force a conflicted merge to occur
197 force a conflicted merge to occur
198
198
199 $ hg unshelve
199 $ hg unshelve
200 unshelving change 'default'
200 unshelving change 'default'
201 temporarily committing pending changes (restore with 'hg unshelve --abort')
201 temporarily committing pending changes (restore with 'hg unshelve --abort')
202 rebasing shelved changes
202 rebasing shelved changes
203 merging a/a
203 merging a/a
204 warning: conflicts during merge.
204 warning: conflicts during merge.
205 merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
205 merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
206 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
206 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
207 [1]
207 [1]
208
208
209 ensure that we have a merge with unresolved conflicts
209 ensure that we have a merge with unresolved conflicts
210
210
211 $ hg heads -q --template '{rev}\n'
211 $ hg heads -q --template '{rev}\n'
212 5
212 5
213 4
213 4
214 $ hg parents -q --template '{rev}\n'
214 $ hg parents -q --template '{rev}\n'
215 4
215 4
216 5
216 5
217 $ hg status
217 $ hg status
218 M a/a
218 M a/a
219 M b.rename/b
219 M b.rename/b
220 M c.copy
220 M c.copy
221 R b/b
221 R b/b
222 ? a/a.orig
222 ? a/a.orig
223 $ hg diff
223 $ hg diff
224 diff --git a/a/a b/a/a
224 diff --git a/a/a b/a/a
225 --- a/a/a
225 --- a/a/a
226 +++ b/a/a
226 +++ b/a/a
227 @@ -1,2 +1,6 @@
227 @@ -1,2 +1,6 @@
228 a
228 a
229 +<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
229 +<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
230 c
230 c
231 +=======
231 +=======
232 +a
232 +a
233 +>>>>>>> source: 4702e8911fe0 - shelve: changes to '[mq]: second.patch'
233 +>>>>>>> source: 4702e8911fe0 - shelve: changes to '[mq]: second.patch'
234 diff --git a/b.rename/b b/b.rename/b
234 diff --git a/b.rename/b b/b.rename/b
235 new file mode 100644
235 new file mode 100644
236 --- /dev/null
236 --- /dev/null
237 +++ b/b.rename/b
237 +++ b/b.rename/b
238 @@ -0,0 +1,1 @@
238 @@ -0,0 +1,1 @@
239 +b
239 +b
240 diff --git a/b/b b/b/b
240 diff --git a/b/b b/b/b
241 deleted file mode 100644
241 deleted file mode 100644
242 --- a/b/b
242 --- a/b/b
243 +++ /dev/null
243 +++ /dev/null
244 @@ -1,1 +0,0 @@
244 @@ -1,1 +0,0 @@
245 -b
245 -b
246 diff --git a/c.copy b/c.copy
246 diff --git a/c.copy b/c.copy
247 new file mode 100644
247 new file mode 100644
248 --- /dev/null
248 --- /dev/null
249 +++ b/c.copy
249 +++ b/c.copy
250 @@ -0,0 +1,1 @@
250 @@ -0,0 +1,1 @@
251 +c
251 +c
252 $ hg resolve -l
252 $ hg resolve -l
253 U a/a
253 U a/a
254
254
255 $ hg shelve
255 $ hg shelve
256 abort: unshelve already in progress
256 abort: unshelve already in progress
257 (use 'hg unshelve --continue' or 'hg unshelve --abort')
257 (use 'hg unshelve --continue' or 'hg unshelve --abort')
258 [255]
258 [255]
259
259
260 abort the unshelve and be happy
260 abort the unshelve and be happy
261
261
262 $ hg status
262 $ hg status
263 M a/a
263 M a/a
264 M b.rename/b
264 M b.rename/b
265 M c.copy
265 M c.copy
266 R b/b
266 R b/b
267 ? a/a.orig
267 ? a/a.orig
268 $ hg unshelve -a
268 $ hg unshelve -a
269 rebase aborted
269 rebase aborted
270 unshelve of 'default' aborted
270 unshelve of 'default' aborted
271 $ hg heads -q
271 $ hg heads -q
272 3:2e69b451d1ea
272 3:2e69b451d1ea
273 $ hg parents
273 $ hg parents
274 changeset: 3:2e69b451d1ea
274 changeset: 3:2e69b451d1ea
275 tag: tip
275 tag: tip
276 user: test
276 user: test
277 date: Thu Jan 01 00:00:00 1970 +0000
277 date: Thu Jan 01 00:00:00 1970 +0000
278 summary: second
278 summary: second
279
279
280 $ hg resolve -l
280 $ hg resolve -l
281 $ hg status
281 $ hg status
282 A foo/foo
282 A foo/foo
283 ? a/a.orig
283 ? a/a.orig
284
284
285 try to continue with no unshelve underway
285 try to continue with no unshelve underway
286
286
287 $ hg unshelve -c
287 $ hg unshelve -c
288 abort: no unshelve operation underway
288 abort: no unshelve operation underway
289 [255]
289 [255]
290 $ hg status
290 $ hg status
291 A foo/foo
291 A foo/foo
292 ? a/a.orig
292 ? a/a.orig
293
293
294 redo the unshelve to get a conflict
294 redo the unshelve to get a conflict
295
295
296 $ hg unshelve -q
296 $ hg unshelve -q
297 warning: conflicts during merge.
297 warning: conflicts during merge.
298 merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
298 merging a/a incomplete! (edit conflicts, then use 'hg resolve --mark')
299 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
299 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
300 [1]
300 [1]
301
301
302 attempt to continue
302 attempt to continue
303
303
304 $ hg unshelve -c
304 $ hg unshelve -c
305 abort: unresolved conflicts, can't continue
305 abort: unresolved conflicts, can't continue
306 (see 'hg resolve', then 'hg unshelve --continue')
306 (see 'hg resolve', then 'hg unshelve --continue')
307 [255]
307 [255]
308
308
309 $ hg revert -r . a/a
309 $ hg revert -r . a/a
310 $ hg resolve -m a/a
310 $ hg resolve -m a/a
311 no more unresolved files
311 (no more unresolved files)
312
312
313 $ hg commit -m 'commit while unshelve in progress'
313 $ hg commit -m 'commit while unshelve in progress'
314 abort: unshelve already in progress
314 abort: unshelve already in progress
315 (use 'hg unshelve --continue' or 'hg unshelve --abort')
315 (use 'hg unshelve --continue' or 'hg unshelve --abort')
316 [255]
316 [255]
317
317
318 $ hg unshelve -c
318 $ hg unshelve -c
319 unshelve of 'default' complete
319 unshelve of 'default' complete
320
320
321 ensure the repo is as we hope
321 ensure the repo is as we hope
322
322
323 $ hg parents
323 $ hg parents
324 changeset: 3:2e69b451d1ea
324 changeset: 3:2e69b451d1ea
325 tag: tip
325 tag: tip
326 user: test
326 user: test
327 date: Thu Jan 01 00:00:00 1970 +0000
327 date: Thu Jan 01 00:00:00 1970 +0000
328 summary: second
328 summary: second
329
329
330 $ hg heads -q
330 $ hg heads -q
331 3:2e69b451d1ea
331 3:2e69b451d1ea
332
332
333 $ hg status -C
333 $ hg status -C
334 A b.rename/b
334 A b.rename/b
335 b/b
335 b/b
336 A c.copy
336 A c.copy
337 c
337 c
338 A foo/foo
338 A foo/foo
339 R b/b
339 R b/b
340 ? a/a.orig
340 ? a/a.orig
341
341
342 there should be no shelves left
342 there should be no shelves left
343
343
344 $ hg shelve -l
344 $ hg shelve -l
345
345
346 #if execbit
346 #if execbit
347
347
348 ensure that metadata-only changes are shelved
348 ensure that metadata-only changes are shelved
349
349
350 $ chmod +x a/a
350 $ chmod +x a/a
351 $ hg shelve -q -n execbit a/a
351 $ hg shelve -q -n execbit a/a
352 $ hg status a/a
352 $ hg status a/a
353 $ hg unshelve -q execbit
353 $ hg unshelve -q execbit
354 $ hg status a/a
354 $ hg status a/a
355 M a/a
355 M a/a
356 $ hg revert a/a
356 $ hg revert a/a
357
357
358 #endif
358 #endif
359
359
360 #if symlink
360 #if symlink
361
361
362 $ rm a/a
362 $ rm a/a
363 $ ln -s foo a/a
363 $ ln -s foo a/a
364 $ hg shelve -q -n symlink a/a
364 $ hg shelve -q -n symlink a/a
365 $ hg status a/a
365 $ hg status a/a
366 $ hg unshelve -q symlink
366 $ hg unshelve -q symlink
367 $ hg status a/a
367 $ hg status a/a
368 M a/a
368 M a/a
369 $ hg revert a/a
369 $ hg revert a/a
370
370
371 #endif
371 #endif
372
372
373 set up another conflict between a commit and a shelved change
373 set up another conflict between a commit and a shelved change
374
374
375 $ hg revert -q -C -a
375 $ hg revert -q -C -a
376 $ rm a/a.orig b.rename/b c.copy
376 $ rm a/a.orig b.rename/b c.copy
377 $ echo a >> a/a
377 $ echo a >> a/a
378 $ hg shelve -q
378 $ hg shelve -q
379 $ echo x >> a/a
379 $ echo x >> a/a
380 $ hg ci -m 'create conflict'
380 $ hg ci -m 'create conflict'
381 $ hg add foo/foo
381 $ hg add foo/foo
382
382
383 if we resolve a conflict while unshelving, the unshelve should succeed
383 if we resolve a conflict while unshelving, the unshelve should succeed
384
384
385 $ HGMERGE=true hg unshelve
385 $ HGMERGE=true hg unshelve
386 unshelving change 'default'
386 unshelving change 'default'
387 temporarily committing pending changes (restore with 'hg unshelve --abort')
387 temporarily committing pending changes (restore with 'hg unshelve --abort')
388 rebasing shelved changes
388 rebasing shelved changes
389 merging a/a
389 merging a/a
390 $ hg parents -q
390 $ hg parents -q
391 4:33f7f61e6c5e
391 4:33f7f61e6c5e
392 $ hg shelve -l
392 $ hg shelve -l
393 $ hg status
393 $ hg status
394 A foo/foo
394 A foo/foo
395 $ cat a/a
395 $ cat a/a
396 a
396 a
397 c
397 c
398 x
398 x
399
399
400 test keep and cleanup
400 test keep and cleanup
401
401
402 $ hg shelve
402 $ hg shelve
403 shelved as default
403 shelved as default
404 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
404 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
405 $ hg shelve --list
405 $ hg shelve --list
406 default (*) changes to 'create conflict' (glob)
406 default (*) changes to 'create conflict' (glob)
407 $ hg unshelve --keep
407 $ hg unshelve --keep
408 unshelving change 'default'
408 unshelving change 'default'
409 $ hg shelve --list
409 $ hg shelve --list
410 default (*) changes to 'create conflict' (glob)
410 default (*) changes to 'create conflict' (glob)
411 $ hg shelve --cleanup
411 $ hg shelve --cleanup
412 $ hg shelve --list
412 $ hg shelve --list
413
413
414 $ hg shelve --cleanup --delete
414 $ hg shelve --cleanup --delete
415 abort: options '--cleanup' and '--delete' may not be used together
415 abort: options '--cleanup' and '--delete' may not be used together
416 [255]
416 [255]
417 $ hg shelve --cleanup --patch
417 $ hg shelve --cleanup --patch
418 abort: options '--cleanup' and '--patch' may not be used together
418 abort: options '--cleanup' and '--patch' may not be used together
419 [255]
419 [255]
420 $ hg shelve --cleanup --message MESSAGE
420 $ hg shelve --cleanup --message MESSAGE
421 abort: options '--cleanup' and '--message' may not be used together
421 abort: options '--cleanup' and '--message' may not be used together
422 [255]
422 [255]
423
423
424 test bookmarks
424 test bookmarks
425
425
426 $ hg bookmark test
426 $ hg bookmark test
427 $ hg bookmark
427 $ hg bookmark
428 * test 4:33f7f61e6c5e
428 * test 4:33f7f61e6c5e
429 $ hg shelve
429 $ hg shelve
430 shelved as test
430 shelved as test
431 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
431 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
432 $ hg bookmark
432 $ hg bookmark
433 * test 4:33f7f61e6c5e
433 * test 4:33f7f61e6c5e
434 $ hg unshelve
434 $ hg unshelve
435 unshelving change 'test'
435 unshelving change 'test'
436 $ hg bookmark
436 $ hg bookmark
437 * test 4:33f7f61e6c5e
437 * test 4:33f7f61e6c5e
438
438
439 shelve should still work even if mq is disabled
439 shelve should still work even if mq is disabled
440
440
441 $ hg --config extensions.mq=! shelve
441 $ hg --config extensions.mq=! shelve
442 shelved as test
442 shelved as test
443 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
443 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
444 $ hg --config extensions.mq=! shelve --list
444 $ hg --config extensions.mq=! shelve --list
445 test (*) changes to 'create conflict' (glob)
445 test (*) changes to 'create conflict' (glob)
446 $ hg --config extensions.mq=! unshelve
446 $ hg --config extensions.mq=! unshelve
447 unshelving change 'test'
447 unshelving change 'test'
448
448
449 shelve should leave dirstate clean (issue 4055)
449 shelve should leave dirstate clean (issue 4055)
450
450
451 $ cd ..
451 $ cd ..
452 $ hg init shelverebase
452 $ hg init shelverebase
453 $ cd shelverebase
453 $ cd shelverebase
454 $ printf 'x\ny\n' > x
454 $ printf 'x\ny\n' > x
455 $ echo z > z
455 $ echo z > z
456 $ hg commit -Aqm xy
456 $ hg commit -Aqm xy
457 $ echo z >> x
457 $ echo z >> x
458 $ hg commit -Aqm z
458 $ hg commit -Aqm z
459 $ hg up 0
459 $ hg up 0
460 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
460 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
461 $ printf 'a\nx\ny\nz\n' > x
461 $ printf 'a\nx\ny\nz\n' > x
462 $ hg commit -Aqm xyz
462 $ hg commit -Aqm xyz
463 $ echo c >> z
463 $ echo c >> z
464 $ hg shelve
464 $ hg shelve
465 shelved as default
465 shelved as default
466 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
466 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
467 $ hg rebase -d 1 --config extensions.rebase=
467 $ hg rebase -d 1 --config extensions.rebase=
468 merging x
468 merging x
469 saved backup bundle to $TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-backup.hg (glob)
469 saved backup bundle to $TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-backup.hg (glob)
470 $ hg unshelve
470 $ hg unshelve
471 unshelving change 'default'
471 unshelving change 'default'
472 rebasing shelved changes
472 rebasing shelved changes
473 $ hg status
473 $ hg status
474 M z
474 M z
475
475
476 $ cd ..
476 $ cd ..
477
477
478 shelve should only unshelve pending changes (issue 4068)
478 shelve should only unshelve pending changes (issue 4068)
479
479
480 $ hg init onlypendingchanges
480 $ hg init onlypendingchanges
481 $ cd onlypendingchanges
481 $ cd onlypendingchanges
482 $ touch a
482 $ touch a
483 $ hg ci -Aqm a
483 $ hg ci -Aqm a
484 $ touch b
484 $ touch b
485 $ hg ci -Aqm b
485 $ hg ci -Aqm b
486 $ hg up -q 0
486 $ hg up -q 0
487 $ touch c
487 $ touch c
488 $ hg ci -Aqm c
488 $ hg ci -Aqm c
489
489
490 $ touch d
490 $ touch d
491 $ hg add d
491 $ hg add d
492 $ hg shelve
492 $ hg shelve
493 shelved as default
493 shelved as default
494 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
494 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
495 $ hg up -q 1
495 $ hg up -q 1
496 $ hg unshelve
496 $ hg unshelve
497 unshelving change 'default'
497 unshelving change 'default'
498 rebasing shelved changes
498 rebasing shelved changes
499 $ hg status
499 $ hg status
500 A d
500 A d
501
501
502 unshelve should work on an ancestor of the original commit
502 unshelve should work on an ancestor of the original commit
503
503
504 $ hg shelve
504 $ hg shelve
505 shelved as default
505 shelved as default
506 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
506 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
507 $ hg up 0
507 $ hg up 0
508 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
508 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
509 $ hg unshelve
509 $ hg unshelve
510 unshelving change 'default'
510 unshelving change 'default'
511 rebasing shelved changes
511 rebasing shelved changes
512 $ hg status
512 $ hg status
513 A d
513 A d
514
514
515 test bug 4073 we need to enable obsolete markers for it
515 test bug 4073 we need to enable obsolete markers for it
516
516
517 $ cat > ../obs.py << EOF
517 $ cat > ../obs.py << EOF
518 > import mercurial.obsolete
518 > import mercurial.obsolete
519 > mercurial.obsolete._enabled = True
519 > mercurial.obsolete._enabled = True
520 > EOF
520 > EOF
521 $ echo '[extensions]' >> $HGRCPATH
521 $ echo '[extensions]' >> $HGRCPATH
522 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
522 $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
523 $ hg shelve
523 $ hg shelve
524 shelved as default
524 shelved as default
525 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
525 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
526 $ hg debugobsolete `hg --debug id -i -r 1`
526 $ hg debugobsolete `hg --debug id -i -r 1`
527 $ hg unshelve
527 $ hg unshelve
528 unshelving change 'default'
528 unshelving change 'default'
529
529
530 unshelve should leave unknown files alone (issue4113)
530 unshelve should leave unknown files alone (issue4113)
531
531
532 $ echo e > e
532 $ echo e > e
533 $ hg shelve
533 $ hg shelve
534 shelved as default
534 shelved as default
535 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
535 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
536 $ hg status
536 $ hg status
537 ? e
537 ? e
538 $ hg unshelve
538 $ hg unshelve
539 unshelving change 'default'
539 unshelving change 'default'
540 $ hg status
540 $ hg status
541 A d
541 A d
542 ? e
542 ? e
543 $ cat e
543 $ cat e
544 e
544 e
545
545
546 unshelve should keep a copy of unknown files
546 unshelve should keep a copy of unknown files
547
547
548 $ hg add e
548 $ hg add e
549 $ hg shelve
549 $ hg shelve
550 shelved as default
550 shelved as default
551 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
551 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
552 $ echo z > e
552 $ echo z > e
553 $ hg unshelve
553 $ hg unshelve
554 unshelving change 'default'
554 unshelving change 'default'
555 $ cat e
555 $ cat e
556 e
556 e
557 $ cat e.orig
557 $ cat e.orig
558 z
558 z
559
559
560
560
561 unshelve and conflicts with tracked and untracked files
561 unshelve and conflicts with tracked and untracked files
562
562
563 preparing:
563 preparing:
564
564
565 $ rm *.orig
565 $ rm *.orig
566 $ hg ci -qm 'commit stuff'
566 $ hg ci -qm 'commit stuff'
567 $ hg phase -p null:
567 $ hg phase -p null:
568
568
569 no other changes - no merge:
569 no other changes - no merge:
570
570
571 $ echo f > f
571 $ echo f > f
572 $ hg add f
572 $ hg add f
573 $ hg shelve
573 $ hg shelve
574 shelved as default
574 shelved as default
575 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
575 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
576 $ echo g > f
576 $ echo g > f
577 $ hg unshelve
577 $ hg unshelve
578 unshelving change 'default'
578 unshelving change 'default'
579 $ hg st
579 $ hg st
580 A f
580 A f
581 ? f.orig
581 ? f.orig
582 $ cat f
582 $ cat f
583 f
583 f
584 $ cat f.orig
584 $ cat f.orig
585 g
585 g
586
586
587 other uncommitted changes - merge:
587 other uncommitted changes - merge:
588
588
589 $ hg st
589 $ hg st
590 A f
590 A f
591 ? f.orig
591 ? f.orig
592 $ hg shelve
592 $ hg shelve
593 shelved as default
593 shelved as default
594 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
594 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
595 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
595 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
596 o 4 changes to 'commit stuff' shelve@localhost
596 o 4 changes to 'commit stuff' shelve@localhost
597 |
597 |
598 $ hg log -G --template '{rev} {desc|firstline} {author}'
598 $ hg log -G --template '{rev} {desc|firstline} {author}'
599 @ 3 commit stuff test
599 @ 3 commit stuff test
600 |
600 |
601 | o 2 c test
601 | o 2 c test
602 |/
602 |/
603 o 0 a test
603 o 0 a test
604
604
605 $ mv f.orig f
605 $ mv f.orig f
606 $ echo 1 > a
606 $ echo 1 > a
607 $ hg unshelve --date '1073741824 0'
607 $ hg unshelve --date '1073741824 0'
608 unshelving change 'default'
608 unshelving change 'default'
609 temporarily committing pending changes (restore with 'hg unshelve --abort')
609 temporarily committing pending changes (restore with 'hg unshelve --abort')
610 rebasing shelved changes
610 rebasing shelved changes
611 merging f
611 merging f
612 warning: conflicts during merge.
612 warning: conflicts during merge.
613 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
613 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
614 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
614 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
615 [1]
615 [1]
616 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
616 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
617 @ 5 changes to 'commit stuff' shelve@localhost 1970-01-01 00:00 +0000
617 @ 5 changes to 'commit stuff' shelve@localhost 1970-01-01 00:00 +0000
618 |
618 |
619 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
619 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
620 |/
620 |/
621 o 3 commit stuff test 1970-01-01 00:00 +0000
621 o 3 commit stuff test 1970-01-01 00:00 +0000
622 |
622 |
623 | o 2 c test 1970-01-01 00:00 +0000
623 | o 2 c test 1970-01-01 00:00 +0000
624 |/
624 |/
625 o 0 a test 1970-01-01 00:00 +0000
625 o 0 a test 1970-01-01 00:00 +0000
626
626
627 $ hg st
627 $ hg st
628 M f
628 M f
629 ? f.orig
629 ? f.orig
630 $ cat f
630 $ cat f
631 <<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
631 <<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
632 g
632 g
633 =======
633 =======
634 f
634 f
635 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
635 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
636 $ cat f.orig
636 $ cat f.orig
637 g
637 g
638 $ hg unshelve --abort
638 $ hg unshelve --abort
639 rebase aborted
639 rebase aborted
640 unshelve of 'default' aborted
640 unshelve of 'default' aborted
641 $ hg st
641 $ hg st
642 M a
642 M a
643 ? f.orig
643 ? f.orig
644 $ cat f.orig
644 $ cat f.orig
645 g
645 g
646 $ hg unshelve
646 $ hg unshelve
647 unshelving change 'default'
647 unshelving change 'default'
648 temporarily committing pending changes (restore with 'hg unshelve --abort')
648 temporarily committing pending changes (restore with 'hg unshelve --abort')
649 rebasing shelved changes
649 rebasing shelved changes
650 $ hg st
650 $ hg st
651 M a
651 M a
652 A f
652 A f
653 ? f.orig
653 ? f.orig
654
654
655 other committed changes - merge:
655 other committed changes - merge:
656
656
657 $ hg shelve f
657 $ hg shelve f
658 shelved as default
658 shelved as default
659 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
659 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
660 $ hg ci a -m 'intermediate other change'
660 $ hg ci a -m 'intermediate other change'
661 $ mv f.orig f
661 $ mv f.orig f
662 $ hg unshelve
662 $ hg unshelve
663 unshelving change 'default'
663 unshelving change 'default'
664 rebasing shelved changes
664 rebasing shelved changes
665 merging f
665 merging f
666 warning: conflicts during merge.
666 warning: conflicts during merge.
667 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
667 merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
668 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
668 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
669 [1]
669 [1]
670 $ hg st
670 $ hg st
671 M f
671 M f
672 ? f.orig
672 ? f.orig
673 $ cat f
673 $ cat f
674 <<<<<<< dest: * - test: intermediate other change (glob)
674 <<<<<<< dest: * - test: intermediate other change (glob)
675 g
675 g
676 =======
676 =======
677 f
677 f
678 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
678 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
679 $ cat f.orig
679 $ cat f.orig
680 g
680 g
681 $ hg unshelve --abort
681 $ hg unshelve --abort
682 rebase aborted
682 rebase aborted
683 no changes needed to a
683 no changes needed to a
684 no changes needed to d
684 no changes needed to d
685 no changes needed to e
685 no changes needed to e
686 unshelve of 'default' aborted
686 unshelve of 'default' aborted
687 $ hg st
687 $ hg st
688 ? f.orig
688 ? f.orig
689 $ cat f.orig
689 $ cat f.orig
690 g
690 g
691 $ hg shelve --delete default
691 $ hg shelve --delete default
692
692
693 $ hg shelve --delete --stat
693 $ hg shelve --delete --stat
694 abort: options '--delete' and '--stat' may not be used together
694 abort: options '--delete' and '--stat' may not be used together
695 [255]
695 [255]
696 $ hg shelve --delete --name NAME
696 $ hg shelve --delete --name NAME
697 abort: options '--delete' and '--name' may not be used together
697 abort: options '--delete' and '--name' may not be used together
698 [255]
698 [255]
699
699
700 $ cd ..
700 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now