##// END OF EJS Templates
commit: note new branch heads rather than topological heads...
Matt Mackall -
r11173:5b48d819 default
parent child Browse files
Show More
@@ -1,3952 +1,3951 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, nullid, nullrev, short
8 from node import hex, nullid, nullrev, short
9 from lock import release
9 from lock import release
10 from i18n import _, gettext
10 from i18n import _, gettext
11 import os, re, sys, difflib, time, tempfile
11 import os, re, sys, difflib, time, tempfile
12 import hg, util, revlog, bundlerepo, extensions, copies, error
12 import hg, util, revlog, bundlerepo, extensions, copies, error
13 import patch, help, mdiff, url, encoding, templatekw
13 import patch, help, mdiff, url, encoding, templatekw
14 import archival, changegroup, cmdutil, sshserver, hbisect, hgweb, hgweb.server
14 import archival, changegroup, cmdutil, sshserver, hbisect, hgweb, hgweb.server
15 import merge as mergemod
15 import merge as mergemod
16 import minirst
16 import minirst
17
17
18 # Commands start here, listed alphabetically
18 # Commands start here, listed alphabetically
19
19
20 def add(ui, repo, *pats, **opts):
20 def add(ui, repo, *pats, **opts):
21 """add the specified files on the next commit
21 """add the specified files on the next commit
22
22
23 Schedule files to be version controlled and added to the
23 Schedule files to be version controlled and added to the
24 repository.
24 repository.
25
25
26 The files will be added to the repository at the next commit. To
26 The files will be added to the repository at the next commit. To
27 undo an add before that, see hg forget.
27 undo an add before that, see hg forget.
28
28
29 If no names are given, add all files to the repository.
29 If no names are given, add all files to the repository.
30
30
31 .. container:: verbose
31 .. container:: verbose
32
32
33 An example showing how new (unknown) files are added
33 An example showing how new (unknown) files are added
34 automatically by :hg:`add`::
34 automatically by :hg:`add`::
35
35
36 $ ls
36 $ ls
37 foo.c
37 foo.c
38 $ hg status
38 $ hg status
39 ? foo.c
39 ? foo.c
40 $ hg add
40 $ hg add
41 adding foo.c
41 adding foo.c
42 $ hg status
42 $ hg status
43 A foo.c
43 A foo.c
44 """
44 """
45
45
46 bad = []
46 bad = []
47 names = []
47 names = []
48 m = cmdutil.match(repo, pats, opts)
48 m = cmdutil.match(repo, pats, opts)
49 oldbad = m.bad
49 oldbad = m.bad
50 m.bad = lambda x, y: bad.append(x) or oldbad(x, y)
50 m.bad = lambda x, y: bad.append(x) or oldbad(x, y)
51
51
52 for f in repo.walk(m):
52 for f in repo.walk(m):
53 exact = m.exact(f)
53 exact = m.exact(f)
54 if exact or f not in repo.dirstate:
54 if exact or f not in repo.dirstate:
55 names.append(f)
55 names.append(f)
56 if ui.verbose or not exact:
56 if ui.verbose or not exact:
57 ui.status(_('adding %s\n') % m.rel(f))
57 ui.status(_('adding %s\n') % m.rel(f))
58 if not opts.get('dry_run'):
58 if not opts.get('dry_run'):
59 bad += [f for f in repo.add(names) if f in m.files()]
59 bad += [f for f in repo.add(names) if f in m.files()]
60 return bad and 1 or 0
60 return bad and 1 or 0
61
61
62 def addremove(ui, repo, *pats, **opts):
62 def addremove(ui, repo, *pats, **opts):
63 """add all new files, delete all missing files
63 """add all new files, delete all missing files
64
64
65 Add all new files and remove all missing files from the
65 Add all new files and remove all missing files from the
66 repository.
66 repository.
67
67
68 New files are ignored if they match any of the patterns in
68 New files are ignored if they match any of the patterns in
69 .hgignore. As with add, these changes take effect at the next
69 .hgignore. As with add, these changes take effect at the next
70 commit.
70 commit.
71
71
72 Use the -s/--similarity option to detect renamed files. With a
72 Use the -s/--similarity option to detect renamed files. With a
73 parameter greater than 0, this compares every removed file with
73 parameter greater than 0, this compares every removed file with
74 every added file and records those similar enough as renames. This
74 every added file and records those similar enough as renames. This
75 option takes a percentage between 0 (disabled) and 100 (files must
75 option takes a percentage between 0 (disabled) and 100 (files must
76 be identical) as its parameter. Detecting renamed files this way
76 be identical) as its parameter. Detecting renamed files this way
77 can be expensive.
77 can be expensive.
78 """
78 """
79 try:
79 try:
80 sim = float(opts.get('similarity') or 0)
80 sim = float(opts.get('similarity') or 0)
81 except ValueError:
81 except ValueError:
82 raise util.Abort(_('similarity must be a number'))
82 raise util.Abort(_('similarity must be a number'))
83 if sim < 0 or sim > 100:
83 if sim < 0 or sim > 100:
84 raise util.Abort(_('similarity must be between 0 and 100'))
84 raise util.Abort(_('similarity must be between 0 and 100'))
85 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
85 return cmdutil.addremove(repo, pats, opts, similarity=sim / 100.0)
86
86
87 def annotate(ui, repo, *pats, **opts):
87 def annotate(ui, repo, *pats, **opts):
88 """show changeset information by line for each file
88 """show changeset information by line for each file
89
89
90 List changes in files, showing the revision id responsible for
90 List changes in files, showing the revision id responsible for
91 each line
91 each line
92
92
93 This command is useful for discovering when a change was made and
93 This command is useful for discovering when a change was made and
94 by whom.
94 by whom.
95
95
96 Without the -a/--text option, annotate will avoid processing files
96 Without the -a/--text option, annotate will avoid processing files
97 it detects as binary. With -a, annotate will annotate the file
97 it detects as binary. With -a, annotate will annotate the file
98 anyway, although the results will probably be neither useful
98 anyway, although the results will probably be neither useful
99 nor desirable.
99 nor desirable.
100 """
100 """
101 if opts.get('follow'):
101 if opts.get('follow'):
102 # --follow is deprecated and now just an alias for -f/--file
102 # --follow is deprecated and now just an alias for -f/--file
103 # to mimic the behavior of Mercurial before version 1.5
103 # to mimic the behavior of Mercurial before version 1.5
104 opts['file'] = 1
104 opts['file'] = 1
105
105
106 datefunc = ui.quiet and util.shortdate or util.datestr
106 datefunc = ui.quiet and util.shortdate or util.datestr
107 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
107 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
108
108
109 if not pats:
109 if not pats:
110 raise util.Abort(_('at least one filename or pattern is required'))
110 raise util.Abort(_('at least one filename or pattern is required'))
111
111
112 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
112 opmap = [('user', lambda x: ui.shortuser(x[0].user())),
113 ('number', lambda x: str(x[0].rev())),
113 ('number', lambda x: str(x[0].rev())),
114 ('changeset', lambda x: short(x[0].node())),
114 ('changeset', lambda x: short(x[0].node())),
115 ('date', getdate),
115 ('date', getdate),
116 ('file', lambda x: x[0].path()),
116 ('file', lambda x: x[0].path()),
117 ]
117 ]
118
118
119 if (not opts.get('user') and not opts.get('changeset')
119 if (not opts.get('user') and not opts.get('changeset')
120 and not opts.get('date') and not opts.get('file')):
120 and not opts.get('date') and not opts.get('file')):
121 opts['number'] = 1
121 opts['number'] = 1
122
122
123 linenumber = opts.get('line_number') is not None
123 linenumber = opts.get('line_number') is not None
124 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
124 if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
125 raise util.Abort(_('at least one of -n/-c is required for -l'))
125 raise util.Abort(_('at least one of -n/-c is required for -l'))
126
126
127 funcmap = [func for op, func in opmap if opts.get(op)]
127 funcmap = [func for op, func in opmap if opts.get(op)]
128 if linenumber:
128 if linenumber:
129 lastfunc = funcmap[-1]
129 lastfunc = funcmap[-1]
130 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
130 funcmap[-1] = lambda x: "%s:%s" % (lastfunc(x), x[1])
131
131
132 ctx = repo[opts.get('rev')]
132 ctx = repo[opts.get('rev')]
133 m = cmdutil.match(repo, pats, opts)
133 m = cmdutil.match(repo, pats, opts)
134 follow = not opts.get('no_follow')
134 follow = not opts.get('no_follow')
135 for abs in ctx.walk(m):
135 for abs in ctx.walk(m):
136 fctx = ctx[abs]
136 fctx = ctx[abs]
137 if not opts.get('text') and util.binary(fctx.data()):
137 if not opts.get('text') and util.binary(fctx.data()):
138 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
138 ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
139 continue
139 continue
140
140
141 lines = fctx.annotate(follow=follow, linenumber=linenumber)
141 lines = fctx.annotate(follow=follow, linenumber=linenumber)
142 pieces = []
142 pieces = []
143
143
144 for f in funcmap:
144 for f in funcmap:
145 l = [f(n) for n, dummy in lines]
145 l = [f(n) for n, dummy in lines]
146 if l:
146 if l:
147 ml = max(map(len, l))
147 ml = max(map(len, l))
148 pieces.append(["%*s" % (ml, x) for x in l])
148 pieces.append(["%*s" % (ml, x) for x in l])
149
149
150 if pieces:
150 if pieces:
151 for p, l in zip(zip(*pieces), lines):
151 for p, l in zip(zip(*pieces), lines):
152 ui.write("%s: %s" % (" ".join(p), l[1]))
152 ui.write("%s: %s" % (" ".join(p), l[1]))
153
153
154 def archive(ui, repo, dest, **opts):
154 def archive(ui, repo, dest, **opts):
155 '''create an unversioned archive of a repository revision
155 '''create an unversioned archive of a repository revision
156
156
157 By default, the revision used is the parent of the working
157 By default, the revision used is the parent of the working
158 directory; use -r/--rev to specify a different revision.
158 directory; use -r/--rev to specify a different revision.
159
159
160 The archive type is automatically detected based on file
160 The archive type is automatically detected based on file
161 extension (or override using -t/--type).
161 extension (or override using -t/--type).
162
162
163 Valid types are:
163 Valid types are:
164
164
165 :``files``: a directory full of files (default)
165 :``files``: a directory full of files (default)
166 :``tar``: tar archive, uncompressed
166 :``tar``: tar archive, uncompressed
167 :``tbz2``: tar archive, compressed using bzip2
167 :``tbz2``: tar archive, compressed using bzip2
168 :``tgz``: tar archive, compressed using gzip
168 :``tgz``: tar archive, compressed using gzip
169 :``uzip``: zip archive, uncompressed
169 :``uzip``: zip archive, uncompressed
170 :``zip``: zip archive, compressed using deflate
170 :``zip``: zip archive, compressed using deflate
171
171
172 The exact name of the destination archive or directory is given
172 The exact name of the destination archive or directory is given
173 using a format string; see :hg:`help export` for details.
173 using a format string; see :hg:`help export` for details.
174
174
175 Each member added to an archive file has a directory prefix
175 Each member added to an archive file has a directory prefix
176 prepended. Use -p/--prefix to specify a format string for the
176 prepended. Use -p/--prefix to specify a format string for the
177 prefix. The default is the basename of the archive, with suffixes
177 prefix. The default is the basename of the archive, with suffixes
178 removed.
178 removed.
179 '''
179 '''
180
180
181 ctx = repo[opts.get('rev')]
181 ctx = repo[opts.get('rev')]
182 if not ctx:
182 if not ctx:
183 raise util.Abort(_('no working directory: please specify a revision'))
183 raise util.Abort(_('no working directory: please specify a revision'))
184 node = ctx.node()
184 node = ctx.node()
185 dest = cmdutil.make_filename(repo, dest, node)
185 dest = cmdutil.make_filename(repo, dest, node)
186 if os.path.realpath(dest) == repo.root:
186 if os.path.realpath(dest) == repo.root:
187 raise util.Abort(_('repository root cannot be destination'))
187 raise util.Abort(_('repository root cannot be destination'))
188
188
189 def guess_type():
189 def guess_type():
190 exttypes = {
190 exttypes = {
191 'tar': ['.tar'],
191 'tar': ['.tar'],
192 'tbz2': ['.tbz2', '.tar.bz2'],
192 'tbz2': ['.tbz2', '.tar.bz2'],
193 'tgz': ['.tgz', '.tar.gz'],
193 'tgz': ['.tgz', '.tar.gz'],
194 'zip': ['.zip'],
194 'zip': ['.zip'],
195 }
195 }
196
196
197 for type, extensions in exttypes.items():
197 for type, extensions in exttypes.items():
198 if util.any(dest.endswith(ext) for ext in extensions):
198 if util.any(dest.endswith(ext) for ext in extensions):
199 return type
199 return type
200 return None
200 return None
201
201
202 kind = opts.get('type') or guess_type() or 'files'
202 kind = opts.get('type') or guess_type() or 'files'
203 prefix = opts.get('prefix')
203 prefix = opts.get('prefix')
204
204
205 if dest == '-':
205 if dest == '-':
206 if kind == 'files':
206 if kind == 'files':
207 raise util.Abort(_('cannot archive plain files to stdout'))
207 raise util.Abort(_('cannot archive plain files to stdout'))
208 dest = sys.stdout
208 dest = sys.stdout
209 if not prefix:
209 if not prefix:
210 prefix = os.path.basename(repo.root) + '-%h'
210 prefix = os.path.basename(repo.root) + '-%h'
211
211
212 prefix = cmdutil.make_filename(repo, prefix, node)
212 prefix = cmdutil.make_filename(repo, prefix, node)
213 matchfn = cmdutil.match(repo, [], opts)
213 matchfn = cmdutil.match(repo, [], opts)
214 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
214 archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
215 matchfn, prefix)
215 matchfn, prefix)
216
216
217 def backout(ui, repo, node=None, rev=None, **opts):
217 def backout(ui, repo, node=None, rev=None, **opts):
218 '''reverse effect of earlier changeset
218 '''reverse effect of earlier changeset
219
219
220 Commit the backed out changes as a new changeset. The new
220 Commit the backed out changes as a new changeset. The new
221 changeset is a child of the backed out changeset.
221 changeset is a child of the backed out changeset.
222
222
223 If you backout a changeset other than the tip, a new head is
223 If you backout a changeset other than the tip, a new head is
224 created. This head will be the new tip and you should merge this
224 created. This head will be the new tip and you should merge this
225 backout changeset with another head.
225 backout changeset with another head.
226
226
227 The --merge option remembers the parent of the working directory
227 The --merge option remembers the parent of the working directory
228 before starting the backout, then merges the new head with that
228 before starting the backout, then merges the new head with that
229 changeset afterwards. This saves you from doing the merge by hand.
229 changeset afterwards. This saves you from doing the merge by hand.
230 The result of this merge is not committed, as with a normal merge.
230 The result of this merge is not committed, as with a normal merge.
231
231
232 See :hg:`help dates` for a list of formats valid for -d/--date.
232 See :hg:`help dates` for a list of formats valid for -d/--date.
233 '''
233 '''
234 if rev and node:
234 if rev and node:
235 raise util.Abort(_("please specify just one revision"))
235 raise util.Abort(_("please specify just one revision"))
236
236
237 if not rev:
237 if not rev:
238 rev = node
238 rev = node
239
239
240 if not rev:
240 if not rev:
241 raise util.Abort(_("please specify a revision to backout"))
241 raise util.Abort(_("please specify a revision to backout"))
242
242
243 date = opts.get('date')
243 date = opts.get('date')
244 if date:
244 if date:
245 opts['date'] = util.parsedate(date)
245 opts['date'] = util.parsedate(date)
246
246
247 cmdutil.bail_if_changed(repo)
247 cmdutil.bail_if_changed(repo)
248 node = repo.lookup(rev)
248 node = repo.lookup(rev)
249
249
250 op1, op2 = repo.dirstate.parents()
250 op1, op2 = repo.dirstate.parents()
251 a = repo.changelog.ancestor(op1, node)
251 a = repo.changelog.ancestor(op1, node)
252 if a != node:
252 if a != node:
253 raise util.Abort(_('cannot backout change on a different branch'))
253 raise util.Abort(_('cannot backout change on a different branch'))
254
254
255 p1, p2 = repo.changelog.parents(node)
255 p1, p2 = repo.changelog.parents(node)
256 if p1 == nullid:
256 if p1 == nullid:
257 raise util.Abort(_('cannot backout a change with no parents'))
257 raise util.Abort(_('cannot backout a change with no parents'))
258 if p2 != nullid:
258 if p2 != nullid:
259 if not opts.get('parent'):
259 if not opts.get('parent'):
260 raise util.Abort(_('cannot backout a merge changeset without '
260 raise util.Abort(_('cannot backout a merge changeset without '
261 '--parent'))
261 '--parent'))
262 p = repo.lookup(opts['parent'])
262 p = repo.lookup(opts['parent'])
263 if p not in (p1, p2):
263 if p not in (p1, p2):
264 raise util.Abort(_('%s is not a parent of %s') %
264 raise util.Abort(_('%s is not a parent of %s') %
265 (short(p), short(node)))
265 (short(p), short(node)))
266 parent = p
266 parent = p
267 else:
267 else:
268 if opts.get('parent'):
268 if opts.get('parent'):
269 raise util.Abort(_('cannot use --parent on non-merge changeset'))
269 raise util.Abort(_('cannot use --parent on non-merge changeset'))
270 parent = p1
270 parent = p1
271
271
272 # the backout should appear on the same branch
272 # the backout should appear on the same branch
273 branch = repo.dirstate.branch()
273 branch = repo.dirstate.branch()
274 hg.clean(repo, node, show_stats=False)
274 hg.clean(repo, node, show_stats=False)
275 repo.dirstate.setbranch(branch)
275 repo.dirstate.setbranch(branch)
276 revert_opts = opts.copy()
276 revert_opts = opts.copy()
277 revert_opts['date'] = None
277 revert_opts['date'] = None
278 revert_opts['all'] = True
278 revert_opts['all'] = True
279 revert_opts['rev'] = hex(parent)
279 revert_opts['rev'] = hex(parent)
280 revert_opts['no_backup'] = None
280 revert_opts['no_backup'] = None
281 revert(ui, repo, **revert_opts)
281 revert(ui, repo, **revert_opts)
282 commit_opts = opts.copy()
282 commit_opts = opts.copy()
283 commit_opts['addremove'] = False
283 commit_opts['addremove'] = False
284 if not commit_opts['message'] and not commit_opts['logfile']:
284 if not commit_opts['message'] and not commit_opts['logfile']:
285 # we don't translate commit messages
285 # we don't translate commit messages
286 commit_opts['message'] = "Backed out changeset %s" % short(node)
286 commit_opts['message'] = "Backed out changeset %s" % short(node)
287 commit_opts['force_editor'] = True
287 commit_opts['force_editor'] = True
288 commit(ui, repo, **commit_opts)
288 commit(ui, repo, **commit_opts)
289 def nice(node):
289 def nice(node):
290 return '%d:%s' % (repo.changelog.rev(node), short(node))
290 return '%d:%s' % (repo.changelog.rev(node), short(node))
291 ui.status(_('changeset %s backs out changeset %s\n') %
291 ui.status(_('changeset %s backs out changeset %s\n') %
292 (nice(repo.changelog.tip()), nice(node)))
292 (nice(repo.changelog.tip()), nice(node)))
293 if op1 != node:
293 if op1 != node:
294 hg.clean(repo, op1, show_stats=False)
294 hg.clean(repo, op1, show_stats=False)
295 if opts.get('merge'):
295 if opts.get('merge'):
296 ui.status(_('merging with changeset %s\n')
296 ui.status(_('merging with changeset %s\n')
297 % nice(repo.changelog.tip()))
297 % nice(repo.changelog.tip()))
298 hg.merge(repo, hex(repo.changelog.tip()))
298 hg.merge(repo, hex(repo.changelog.tip()))
299 else:
299 else:
300 ui.status(_('the backout changeset is a new head - '
300 ui.status(_('the backout changeset is a new head - '
301 'do not forget to merge\n'))
301 'do not forget to merge\n'))
302 ui.status(_('(use "backout --merge" '
302 ui.status(_('(use "backout --merge" '
303 'if you want to auto-merge)\n'))
303 'if you want to auto-merge)\n'))
304
304
305 def bisect(ui, repo, rev=None, extra=None, command=None,
305 def bisect(ui, repo, rev=None, extra=None, command=None,
306 reset=None, good=None, bad=None, skip=None, noupdate=None):
306 reset=None, good=None, bad=None, skip=None, noupdate=None):
307 """subdivision search of changesets
307 """subdivision search of changesets
308
308
309 This command helps to find changesets which introduce problems. To
309 This command helps to find changesets which introduce problems. To
310 use, mark the earliest changeset you know exhibits the problem as
310 use, mark the earliest changeset you know exhibits the problem as
311 bad, then mark the latest changeset which is free from the problem
311 bad, then mark the latest changeset which is free from the problem
312 as good. Bisect will update your working directory to a revision
312 as good. Bisect will update your working directory to a revision
313 for testing (unless the -U/--noupdate option is specified). Once
313 for testing (unless the -U/--noupdate option is specified). Once
314 you have performed tests, mark the working directory as good or
314 you have performed tests, mark the working directory as good or
315 bad, and bisect will either update to another candidate changeset
315 bad, and bisect will either update to another candidate changeset
316 or announce that it has found the bad revision.
316 or announce that it has found the bad revision.
317
317
318 As a shortcut, you can also use the revision argument to mark a
318 As a shortcut, you can also use the revision argument to mark a
319 revision as good or bad without checking it out first.
319 revision as good or bad without checking it out first.
320
320
321 If you supply a command, it will be used for automatic bisection.
321 If you supply a command, it will be used for automatic bisection.
322 Its exit status will be used to mark revisions as good or bad:
322 Its exit status will be used to mark revisions as good or bad:
323 status 0 means good, 125 means to skip the revision, 127
323 status 0 means good, 125 means to skip the revision, 127
324 (command not found) will abort the bisection, and any other
324 (command not found) will abort the bisection, and any other
325 non-zero exit status means the revision is bad.
325 non-zero exit status means the revision is bad.
326 """
326 """
327 def print_result(nodes, good):
327 def print_result(nodes, good):
328 displayer = cmdutil.show_changeset(ui, repo, {})
328 displayer = cmdutil.show_changeset(ui, repo, {})
329 if len(nodes) == 1:
329 if len(nodes) == 1:
330 # narrowed it down to a single revision
330 # narrowed it down to a single revision
331 if good:
331 if good:
332 ui.write(_("The first good revision is:\n"))
332 ui.write(_("The first good revision is:\n"))
333 else:
333 else:
334 ui.write(_("The first bad revision is:\n"))
334 ui.write(_("The first bad revision is:\n"))
335 displayer.show(repo[nodes[0]])
335 displayer.show(repo[nodes[0]])
336 else:
336 else:
337 # multiple possible revisions
337 # multiple possible revisions
338 if good:
338 if good:
339 ui.write(_("Due to skipped revisions, the first "
339 ui.write(_("Due to skipped revisions, the first "
340 "good revision could be any of:\n"))
340 "good revision could be any of:\n"))
341 else:
341 else:
342 ui.write(_("Due to skipped revisions, the first "
342 ui.write(_("Due to skipped revisions, the first "
343 "bad revision could be any of:\n"))
343 "bad revision could be any of:\n"))
344 for n in nodes:
344 for n in nodes:
345 displayer.show(repo[n])
345 displayer.show(repo[n])
346 displayer.close()
346 displayer.close()
347
347
348 def check_state(state, interactive=True):
348 def check_state(state, interactive=True):
349 if not state['good'] or not state['bad']:
349 if not state['good'] or not state['bad']:
350 if (good or bad or skip or reset) and interactive:
350 if (good or bad or skip or reset) and interactive:
351 return
351 return
352 if not state['good']:
352 if not state['good']:
353 raise util.Abort(_('cannot bisect (no known good revisions)'))
353 raise util.Abort(_('cannot bisect (no known good revisions)'))
354 else:
354 else:
355 raise util.Abort(_('cannot bisect (no known bad revisions)'))
355 raise util.Abort(_('cannot bisect (no known bad revisions)'))
356 return True
356 return True
357
357
358 # backward compatibility
358 # backward compatibility
359 if rev in "good bad reset init".split():
359 if rev in "good bad reset init".split():
360 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
360 ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
361 cmd, rev, extra = rev, extra, None
361 cmd, rev, extra = rev, extra, None
362 if cmd == "good":
362 if cmd == "good":
363 good = True
363 good = True
364 elif cmd == "bad":
364 elif cmd == "bad":
365 bad = True
365 bad = True
366 else:
366 else:
367 reset = True
367 reset = True
368 elif extra or good + bad + skip + reset + bool(command) > 1:
368 elif extra or good + bad + skip + reset + bool(command) > 1:
369 raise util.Abort(_('incompatible arguments'))
369 raise util.Abort(_('incompatible arguments'))
370
370
371 if reset:
371 if reset:
372 p = repo.join("bisect.state")
372 p = repo.join("bisect.state")
373 if os.path.exists(p):
373 if os.path.exists(p):
374 os.unlink(p)
374 os.unlink(p)
375 return
375 return
376
376
377 state = hbisect.load_state(repo)
377 state = hbisect.load_state(repo)
378
378
379 if command:
379 if command:
380 changesets = 1
380 changesets = 1
381 try:
381 try:
382 while changesets:
382 while changesets:
383 # update state
383 # update state
384 status = util.system(command)
384 status = util.system(command)
385 if status == 125:
385 if status == 125:
386 transition = "skip"
386 transition = "skip"
387 elif status == 0:
387 elif status == 0:
388 transition = "good"
388 transition = "good"
389 # status < 0 means process was killed
389 # status < 0 means process was killed
390 elif status == 127:
390 elif status == 127:
391 raise util.Abort(_("failed to execute %s") % command)
391 raise util.Abort(_("failed to execute %s") % command)
392 elif status < 0:
392 elif status < 0:
393 raise util.Abort(_("%s killed") % command)
393 raise util.Abort(_("%s killed") % command)
394 else:
394 else:
395 transition = "bad"
395 transition = "bad"
396 ctx = repo[rev or '.']
396 ctx = repo[rev or '.']
397 state[transition].append(ctx.node())
397 state[transition].append(ctx.node())
398 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
398 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition))
399 check_state(state, interactive=False)
399 check_state(state, interactive=False)
400 # bisect
400 # bisect
401 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
401 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
402 # update to next check
402 # update to next check
403 cmdutil.bail_if_changed(repo)
403 cmdutil.bail_if_changed(repo)
404 hg.clean(repo, nodes[0], show_stats=False)
404 hg.clean(repo, nodes[0], show_stats=False)
405 finally:
405 finally:
406 hbisect.save_state(repo, state)
406 hbisect.save_state(repo, state)
407 return print_result(nodes, good)
407 return print_result(nodes, good)
408
408
409 # update state
409 # update state
410 node = repo.lookup(rev or '.')
410 node = repo.lookup(rev or '.')
411 if good or bad or skip:
411 if good or bad or skip:
412 if good:
412 if good:
413 state['good'].append(node)
413 state['good'].append(node)
414 elif bad:
414 elif bad:
415 state['bad'].append(node)
415 state['bad'].append(node)
416 elif skip:
416 elif skip:
417 state['skip'].append(node)
417 state['skip'].append(node)
418 hbisect.save_state(repo, state)
418 hbisect.save_state(repo, state)
419
419
420 if not check_state(state):
420 if not check_state(state):
421 return
421 return
422
422
423 # actually bisect
423 # actually bisect
424 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
424 nodes, changesets, good = hbisect.bisect(repo.changelog, state)
425 if changesets == 0:
425 if changesets == 0:
426 print_result(nodes, good)
426 print_result(nodes, good)
427 else:
427 else:
428 assert len(nodes) == 1 # only a single node can be tested next
428 assert len(nodes) == 1 # only a single node can be tested next
429 node = nodes[0]
429 node = nodes[0]
430 # compute the approximate number of remaining tests
430 # compute the approximate number of remaining tests
431 tests, size = 0, 2
431 tests, size = 0, 2
432 while size <= changesets:
432 while size <= changesets:
433 tests, size = tests + 1, size * 2
433 tests, size = tests + 1, size * 2
434 rev = repo.changelog.rev(node)
434 rev = repo.changelog.rev(node)
435 ui.write(_("Testing changeset %d:%s "
435 ui.write(_("Testing changeset %d:%s "
436 "(%d changesets remaining, ~%d tests)\n")
436 "(%d changesets remaining, ~%d tests)\n")
437 % (rev, short(node), changesets, tests))
437 % (rev, short(node), changesets, tests))
438 if not noupdate:
438 if not noupdate:
439 cmdutil.bail_if_changed(repo)
439 cmdutil.bail_if_changed(repo)
440 return hg.clean(repo, node)
440 return hg.clean(repo, node)
441
441
442 def branch(ui, repo, label=None, **opts):
442 def branch(ui, repo, label=None, **opts):
443 """set or show the current branch name
443 """set or show the current branch name
444
444
445 With no argument, show the current branch name. With one argument,
445 With no argument, show the current branch name. With one argument,
446 set the working directory branch name (the branch will not exist
446 set the working directory branch name (the branch will not exist
447 in the repository until the next commit). Standard practice
447 in the repository until the next commit). Standard practice
448 recommends that primary development take place on the 'default'
448 recommends that primary development take place on the 'default'
449 branch.
449 branch.
450
450
451 Unless -f/--force is specified, branch will not let you set a
451 Unless -f/--force is specified, branch will not let you set a
452 branch name that already exists, even if it's inactive.
452 branch name that already exists, even if it's inactive.
453
453
454 Use -C/--clean to reset the working directory branch to that of
454 Use -C/--clean to reset the working directory branch to that of
455 the parent of the working directory, negating a previous branch
455 the parent of the working directory, negating a previous branch
456 change.
456 change.
457
457
458 Use the command :hg:`update` to switch to an existing branch. Use
458 Use the command :hg:`update` to switch to an existing branch. Use
459 :hg:`commit --close-branch` to mark this branch as closed.
459 :hg:`commit --close-branch` to mark this branch as closed.
460 """
460 """
461
461
462 if opts.get('clean'):
462 if opts.get('clean'):
463 label = repo[None].parents()[0].branch()
463 label = repo[None].parents()[0].branch()
464 repo.dirstate.setbranch(label)
464 repo.dirstate.setbranch(label)
465 ui.status(_('reset working directory to branch %s\n') % label)
465 ui.status(_('reset working directory to branch %s\n') % label)
466 elif label:
466 elif label:
467 utflabel = encoding.fromlocal(label)
467 utflabel = encoding.fromlocal(label)
468 if not opts.get('force') and utflabel in repo.branchtags():
468 if not opts.get('force') and utflabel in repo.branchtags():
469 if label not in [p.branch() for p in repo.parents()]:
469 if label not in [p.branch() for p in repo.parents()]:
470 raise util.Abort(_('a branch of the same name already exists'
470 raise util.Abort(_('a branch of the same name already exists'
471 " (use 'hg update' to switch to it)"))
471 " (use 'hg update' to switch to it)"))
472 repo.dirstate.setbranch(utflabel)
472 repo.dirstate.setbranch(utflabel)
473 ui.status(_('marked working directory as branch %s\n') % label)
473 ui.status(_('marked working directory as branch %s\n') % label)
474 else:
474 else:
475 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
475 ui.write("%s\n" % encoding.tolocal(repo.dirstate.branch()))
476
476
477 def branches(ui, repo, active=False, closed=False):
477 def branches(ui, repo, active=False, closed=False):
478 """list repository named branches
478 """list repository named branches
479
479
480 List the repository's named branches, indicating which ones are
480 List the repository's named branches, indicating which ones are
481 inactive. If -c/--closed is specified, also list branches which have
481 inactive. If -c/--closed is specified, also list branches which have
482 been marked closed (see hg commit --close-branch).
482 been marked closed (see hg commit --close-branch).
483
483
484 If -a/--active is specified, only show active branches. A branch
484 If -a/--active is specified, only show active branches. A branch
485 is considered active if it contains repository heads.
485 is considered active if it contains repository heads.
486
486
487 Use the command :hg:`update` to switch to an existing branch.
487 Use the command :hg:`update` to switch to an existing branch.
488 """
488 """
489
489
490 hexfunc = ui.debugflag and hex or short
490 hexfunc = ui.debugflag and hex or short
491 activebranches = [repo[n].branch() for n in repo.heads()]
491 activebranches = [repo[n].branch() for n in repo.heads()]
492 def testactive(tag, node):
492 def testactive(tag, node):
493 realhead = tag in activebranches
493 realhead = tag in activebranches
494 open = node in repo.branchheads(tag, closed=False)
494 open = node in repo.branchheads(tag, closed=False)
495 return realhead and open
495 return realhead and open
496 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
496 branches = sorted([(testactive(tag, node), repo.changelog.rev(node), tag)
497 for tag, node in repo.branchtags().items()],
497 for tag, node in repo.branchtags().items()],
498 reverse=True)
498 reverse=True)
499
499
500 for isactive, node, tag in branches:
500 for isactive, node, tag in branches:
501 if (not active) or isactive:
501 if (not active) or isactive:
502 encodedtag = encoding.tolocal(tag)
502 encodedtag = encoding.tolocal(tag)
503 if ui.quiet:
503 if ui.quiet:
504 ui.write("%s\n" % encodedtag)
504 ui.write("%s\n" % encodedtag)
505 else:
505 else:
506 hn = repo.lookup(node)
506 hn = repo.lookup(node)
507 if isactive:
507 if isactive:
508 notice = ''
508 notice = ''
509 elif hn not in repo.branchheads(tag, closed=False):
509 elif hn not in repo.branchheads(tag, closed=False):
510 if not closed:
510 if not closed:
511 continue
511 continue
512 notice = _(' (closed)')
512 notice = _(' (closed)')
513 else:
513 else:
514 notice = _(' (inactive)')
514 notice = _(' (inactive)')
515 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
515 rev = str(node).rjust(31 - encoding.colwidth(encodedtag))
516 data = encodedtag, rev, hexfunc(hn), notice
516 data = encodedtag, rev, hexfunc(hn), notice
517 ui.write("%s %s:%s%s\n" % data)
517 ui.write("%s %s:%s%s\n" % data)
518
518
519 def bundle(ui, repo, fname, dest=None, **opts):
519 def bundle(ui, repo, fname, dest=None, **opts):
520 """create a changegroup file
520 """create a changegroup file
521
521
522 Generate a compressed changegroup file collecting changesets not
522 Generate a compressed changegroup file collecting changesets not
523 known to be in another repository.
523 known to be in another repository.
524
524
525 If you omit the destination repository, then hg assumes the
525 If you omit the destination repository, then hg assumes the
526 destination will have all the nodes you specify with --base
526 destination will have all the nodes you specify with --base
527 parameters. To create a bundle containing all changesets, use
527 parameters. To create a bundle containing all changesets, use
528 -a/--all (or --base null).
528 -a/--all (or --base null).
529
529
530 You can change compression method with the -t/--type option.
530 You can change compression method with the -t/--type option.
531 The available compression methods are: none, bzip2, and
531 The available compression methods are: none, bzip2, and
532 gzip (by default, bundles are compressed using bzip2).
532 gzip (by default, bundles are compressed using bzip2).
533
533
534 The bundle file can then be transferred using conventional means
534 The bundle file can then be transferred using conventional means
535 and applied to another repository with the unbundle or pull
535 and applied to another repository with the unbundle or pull
536 command. This is useful when direct push and pull are not
536 command. This is useful when direct push and pull are not
537 available or when exporting an entire repository is undesirable.
537 available or when exporting an entire repository is undesirable.
538
538
539 Applying bundles preserves all changeset contents including
539 Applying bundles preserves all changeset contents including
540 permissions, copy/rename information, and revision history.
540 permissions, copy/rename information, and revision history.
541 """
541 """
542 revs = opts.get('rev') or None
542 revs = opts.get('rev') or None
543 if revs:
543 if revs:
544 revs = [repo.lookup(rev) for rev in revs]
544 revs = [repo.lookup(rev) for rev in revs]
545 if opts.get('all'):
545 if opts.get('all'):
546 base = ['null']
546 base = ['null']
547 else:
547 else:
548 base = opts.get('base')
548 base = opts.get('base')
549 if base:
549 if base:
550 if dest:
550 if dest:
551 raise util.Abort(_("--base is incompatible with specifying "
551 raise util.Abort(_("--base is incompatible with specifying "
552 "a destination"))
552 "a destination"))
553 base = [repo.lookup(rev) for rev in base]
553 base = [repo.lookup(rev) for rev in base]
554 # create the right base
554 # create the right base
555 # XXX: nodesbetween / changegroup* should be "fixed" instead
555 # XXX: nodesbetween / changegroup* should be "fixed" instead
556 o = []
556 o = []
557 has = set((nullid,))
557 has = set((nullid,))
558 for n in base:
558 for n in base:
559 has.update(repo.changelog.reachable(n))
559 has.update(repo.changelog.reachable(n))
560 if revs:
560 if revs:
561 visit = list(revs)
561 visit = list(revs)
562 has.difference_update(revs)
562 has.difference_update(revs)
563 else:
563 else:
564 visit = repo.changelog.heads()
564 visit = repo.changelog.heads()
565 seen = {}
565 seen = {}
566 while visit:
566 while visit:
567 n = visit.pop(0)
567 n = visit.pop(0)
568 parents = [p for p in repo.changelog.parents(n) if p not in has]
568 parents = [p for p in repo.changelog.parents(n) if p not in has]
569 if len(parents) == 0:
569 if len(parents) == 0:
570 if n not in has:
570 if n not in has:
571 o.append(n)
571 o.append(n)
572 else:
572 else:
573 for p in parents:
573 for p in parents:
574 if p not in seen:
574 if p not in seen:
575 seen[p] = 1
575 seen[p] = 1
576 visit.append(p)
576 visit.append(p)
577 else:
577 else:
578 dest = ui.expandpath(dest or 'default-push', dest or 'default')
578 dest = ui.expandpath(dest or 'default-push', dest or 'default')
579 dest, branches = hg.parseurl(dest, opts.get('branch'))
579 dest, branches = hg.parseurl(dest, opts.get('branch'))
580 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
580 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
581 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
581 revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
582 o = repo.findoutgoing(other, force=opts.get('force'))
582 o = repo.findoutgoing(other, force=opts.get('force'))
583
583
584 if not o:
584 if not o:
585 ui.status(_("no changes found\n"))
585 ui.status(_("no changes found\n"))
586 return
586 return
587
587
588 if revs:
588 if revs:
589 cg = repo.changegroupsubset(o, revs, 'bundle')
589 cg = repo.changegroupsubset(o, revs, 'bundle')
590 else:
590 else:
591 cg = repo.changegroup(o, 'bundle')
591 cg = repo.changegroup(o, 'bundle')
592
592
593 bundletype = opts.get('type', 'bzip2').lower()
593 bundletype = opts.get('type', 'bzip2').lower()
594 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
594 btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
595 bundletype = btypes.get(bundletype)
595 bundletype = btypes.get(bundletype)
596 if bundletype not in changegroup.bundletypes:
596 if bundletype not in changegroup.bundletypes:
597 raise util.Abort(_('unknown bundle type specified with --type'))
597 raise util.Abort(_('unknown bundle type specified with --type'))
598
598
599 changegroup.writebundle(cg, fname, bundletype)
599 changegroup.writebundle(cg, fname, bundletype)
600
600
601 def cat(ui, repo, file1, *pats, **opts):
601 def cat(ui, repo, file1, *pats, **opts):
602 """output the current or given revision of files
602 """output the current or given revision of files
603
603
604 Print the specified files as they were at the given revision. If
604 Print the specified files as they were at the given revision. If
605 no revision is given, the parent of the working directory is used,
605 no revision is given, the parent of the working directory is used,
606 or tip if no revision is checked out.
606 or tip if no revision is checked out.
607
607
608 Output may be to a file, in which case the name of the file is
608 Output may be to a file, in which case the name of the file is
609 given using a format string. The formatting rules are the same as
609 given using a format string. The formatting rules are the same as
610 for the export command, with the following additions:
610 for the export command, with the following additions:
611
611
612 :``%s``: basename of file being printed
612 :``%s``: basename of file being printed
613 :``%d``: dirname of file being printed, or '.' if in repository root
613 :``%d``: dirname of file being printed, or '.' if in repository root
614 :``%p``: root-relative path name of file being printed
614 :``%p``: root-relative path name of file being printed
615 """
615 """
616 ctx = repo[opts.get('rev')]
616 ctx = repo[opts.get('rev')]
617 err = 1
617 err = 1
618 m = cmdutil.match(repo, (file1,) + pats, opts)
618 m = cmdutil.match(repo, (file1,) + pats, opts)
619 for abs in ctx.walk(m):
619 for abs in ctx.walk(m):
620 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
620 fp = cmdutil.make_file(repo, opts.get('output'), ctx.node(), pathname=abs)
621 data = ctx[abs].data()
621 data = ctx[abs].data()
622 if opts.get('decode'):
622 if opts.get('decode'):
623 data = repo.wwritedata(abs, data)
623 data = repo.wwritedata(abs, data)
624 fp.write(data)
624 fp.write(data)
625 err = 0
625 err = 0
626 return err
626 return err
627
627
628 def clone(ui, source, dest=None, **opts):
628 def clone(ui, source, dest=None, **opts):
629 """make a copy of an existing repository
629 """make a copy of an existing repository
630
630
631 Create a copy of an existing repository in a new directory.
631 Create a copy of an existing repository in a new directory.
632
632
633 If no destination directory name is specified, it defaults to the
633 If no destination directory name is specified, it defaults to the
634 basename of the source.
634 basename of the source.
635
635
636 The location of the source is added to the new repository's
636 The location of the source is added to the new repository's
637 .hg/hgrc file, as the default to be used for future pulls.
637 .hg/hgrc file, as the default to be used for future pulls.
638
638
639 See :hg:`help urls` for valid source format details.
639 See :hg:`help urls` for valid source format details.
640
640
641 It is possible to specify an ``ssh://`` URL as the destination, but no
641 It is possible to specify an ``ssh://`` URL as the destination, but no
642 .hg/hgrc and working directory will be created on the remote side.
642 .hg/hgrc and working directory will be created on the remote side.
643 Please see :hg:`help urls` for important details about ``ssh://`` URLs.
643 Please see :hg:`help urls` for important details about ``ssh://`` URLs.
644
644
645 A set of changesets (tags, or branch names) to pull may be specified
645 A set of changesets (tags, or branch names) to pull may be specified
646 by listing each changeset (tag, or branch name) with -r/--rev.
646 by listing each changeset (tag, or branch name) with -r/--rev.
647 If -r/--rev is used, the cloned repository will contain only a subset
647 If -r/--rev is used, the cloned repository will contain only a subset
648 of the changesets of the source repository. Only the set of changesets
648 of the changesets of the source repository. Only the set of changesets
649 defined by all -r/--rev options (including all their ancestors)
649 defined by all -r/--rev options (including all their ancestors)
650 will be pulled into the destination repository.
650 will be pulled into the destination repository.
651 No subsequent changesets (including subsequent tags) will be present
651 No subsequent changesets (including subsequent tags) will be present
652 in the destination.
652 in the destination.
653
653
654 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
654 Using -r/--rev (or 'clone src#rev dest') implies --pull, even for
655 local source repositories.
655 local source repositories.
656
656
657 For efficiency, hardlinks are used for cloning whenever the source
657 For efficiency, hardlinks are used for cloning whenever the source
658 and destination are on the same filesystem (note this applies only
658 and destination are on the same filesystem (note this applies only
659 to the repository data, not to the working directory). Some
659 to the repository data, not to the working directory). Some
660 filesystems, such as AFS, implement hardlinking incorrectly, but
660 filesystems, such as AFS, implement hardlinking incorrectly, but
661 do not report errors. In these cases, use the --pull option to
661 do not report errors. In these cases, use the --pull option to
662 avoid hardlinking.
662 avoid hardlinking.
663
663
664 In some cases, you can clone repositories and the working directory
664 In some cases, you can clone repositories and the working directory
665 using full hardlinks with ::
665 using full hardlinks with ::
666
666
667 $ cp -al REPO REPOCLONE
667 $ cp -al REPO REPOCLONE
668
668
669 This is the fastest way to clone, but it is not always safe. The
669 This is the fastest way to clone, but it is not always safe. The
670 operation is not atomic (making sure REPO is not modified during
670 operation is not atomic (making sure REPO is not modified during
671 the operation is up to you) and you have to make sure your editor
671 the operation is up to you) and you have to make sure your editor
672 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
672 breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,
673 this is not compatible with certain extensions that place their
673 this is not compatible with certain extensions that place their
674 metadata under the .hg directory, such as mq.
674 metadata under the .hg directory, such as mq.
675
675
676 Mercurial will update the working directory to the first applicable
676 Mercurial will update the working directory to the first applicable
677 revision from this list:
677 revision from this list:
678
678
679 a) null if -U or the source repository has no changesets
679 a) null if -U or the source repository has no changesets
680 b) if -u . and the source repository is local, the first parent of
680 b) if -u . and the source repository is local, the first parent of
681 the source repository's working directory
681 the source repository's working directory
682 c) the changeset specified with -u (if a branch name, this means the
682 c) the changeset specified with -u (if a branch name, this means the
683 latest head of that branch)
683 latest head of that branch)
684 d) the changeset specified with -r
684 d) the changeset specified with -r
685 e) the tipmost head specified with -b
685 e) the tipmost head specified with -b
686 f) the tipmost head specified with the url#branch source syntax
686 f) the tipmost head specified with the url#branch source syntax
687 g) the tipmost head of the default branch
687 g) the tipmost head of the default branch
688 h) tip
688 h) tip
689 """
689 """
690 if opts.get('noupdate') and opts.get('updaterev'):
690 if opts.get('noupdate') and opts.get('updaterev'):
691 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
691 raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
692
692
693 hg.clone(cmdutil.remoteui(ui, opts), source, dest,
693 hg.clone(cmdutil.remoteui(ui, opts), source, dest,
694 pull=opts.get('pull'),
694 pull=opts.get('pull'),
695 stream=opts.get('uncompressed'),
695 stream=opts.get('uncompressed'),
696 rev=opts.get('rev'),
696 rev=opts.get('rev'),
697 update=opts.get('updaterev') or not opts.get('noupdate'),
697 update=opts.get('updaterev') or not opts.get('noupdate'),
698 branch=opts.get('branch'))
698 branch=opts.get('branch'))
699
699
700 def commit(ui, repo, *pats, **opts):
700 def commit(ui, repo, *pats, **opts):
701 """commit the specified files or all outstanding changes
701 """commit the specified files or all outstanding changes
702
702
703 Commit changes to the given files into the repository. Unlike a
703 Commit changes to the given files into the repository. Unlike a
704 centralized RCS, this operation is a local operation. See hg push
704 centralized RCS, this operation is a local operation. See hg push
705 for a way to actively distribute your changes.
705 for a way to actively distribute your changes.
706
706
707 If a list of files is omitted, all changes reported by :hg:`status`
707 If a list of files is omitted, all changes reported by :hg:`status`
708 will be committed.
708 will be committed.
709
709
710 If you are committing the result of a merge, do not provide any
710 If you are committing the result of a merge, do not provide any
711 filenames or -I/-X filters.
711 filenames or -I/-X filters.
712
712
713 If no commit message is specified, the configured editor is
713 If no commit message is specified, the configured editor is
714 started to prompt you for a message.
714 started to prompt you for a message.
715
715
716 See :hg:`help dates` for a list of formats valid for -d/--date.
716 See :hg:`help dates` for a list of formats valid for -d/--date.
717 """
717 """
718 extra = {}
718 extra = {}
719 if opts.get('close_branch'):
719 if opts.get('close_branch'):
720 if repo['.'].node() not in repo.branchheads():
720 if repo['.'].node() not in repo.branchheads():
721 # The topo heads set is included in the branch heads set of the
721 # The topo heads set is included in the branch heads set of the
722 # current branch, so it's sufficient to test branchheads
722 # current branch, so it's sufficient to test branchheads
723 raise util.Abort(_('can only close branch heads'))
723 raise util.Abort(_('can only close branch heads'))
724 extra['close'] = 1
724 extra['close'] = 1
725 e = cmdutil.commiteditor
725 e = cmdutil.commiteditor
726 if opts.get('force_editor'):
726 if opts.get('force_editor'):
727 e = cmdutil.commitforceeditor
727 e = cmdutil.commitforceeditor
728
728
729 def commitfunc(ui, repo, message, match, opts):
729 def commitfunc(ui, repo, message, match, opts):
730 return repo.commit(message, opts.get('user'), opts.get('date'), match,
730 return repo.commit(message, opts.get('user'), opts.get('date'), match,
731 editor=e, extra=extra)
731 editor=e, extra=extra)
732
732
733 branch = repo[None].branch()
734 bheads = repo.branchheads(branch)
735
733 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
736 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
734 if not node:
737 if not node:
735 ui.status(_("nothing changed\n"))
738 ui.status(_("nothing changed\n"))
736 return
739 return
737 cl = repo.changelog
740
738 rev = cl.rev(node)
741 ctx = repo[node]
739 parents = cl.parentrevs(rev)
742 parents = ctx.parents()
740 if rev - 1 in parents:
743
741 # one of the parents was the old tip
744 if bheads and [x for x in parents if x.node() not in bheads]:
742 pass
743 elif (parents == (nullrev, nullrev) or
744 len(cl.heads(cl.node(parents[0]))) > 1 and
745 (parents[1] == nullrev or len(cl.heads(cl.node(parents[1]))) > 1)):
746 ui.status(_('created new head\n'))
745 ui.status(_('created new head\n'))
747
746
748 if not opts.get('close_branch'):
747 if not opts.get('close_branch'):
749 for r in parents:
748 for r in parents:
750 if repo[r].extra().get('close'):
749 if r.extra().get('close'):
751 ui.status(_('reopening closed branch head %d\n') % r)
750 ui.status(_('reopening closed branch head %d\n') % r)
752
751
753 if ui.debugflag:
752 if ui.debugflag:
754 ui.write(_('committed changeset %d:%s\n') % (rev, hex(node)))
753 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx.hex()))
755 elif ui.verbose:
754 elif ui.verbose:
756 ui.write(_('committed changeset %d:%s\n') % (rev, short(node)))
755 ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx))
757
756
758 def copy(ui, repo, *pats, **opts):
757 def copy(ui, repo, *pats, **opts):
759 """mark files as copied for the next commit
758 """mark files as copied for the next commit
760
759
761 Mark dest as having copies of source files. If dest is a
760 Mark dest as having copies of source files. If dest is a
762 directory, copies are put in that directory. If dest is a file,
761 directory, copies are put in that directory. If dest is a file,
763 the source must be a single file.
762 the source must be a single file.
764
763
765 By default, this command copies the contents of files as they
764 By default, this command copies the contents of files as they
766 exist in the working directory. If invoked with -A/--after, the
765 exist in the working directory. If invoked with -A/--after, the
767 operation is recorded, but no copying is performed.
766 operation is recorded, but no copying is performed.
768
767
769 This command takes effect with the next commit. To undo a copy
768 This command takes effect with the next commit. To undo a copy
770 before that, see hg revert.
769 before that, see hg revert.
771 """
770 """
772 wlock = repo.wlock(False)
771 wlock = repo.wlock(False)
773 try:
772 try:
774 return cmdutil.copy(ui, repo, pats, opts)
773 return cmdutil.copy(ui, repo, pats, opts)
775 finally:
774 finally:
776 wlock.release()
775 wlock.release()
777
776
778 def debugancestor(ui, repo, *args):
777 def debugancestor(ui, repo, *args):
779 """find the ancestor revision of two revisions in a given index"""
778 """find the ancestor revision of two revisions in a given index"""
780 if len(args) == 3:
779 if len(args) == 3:
781 index, rev1, rev2 = args
780 index, rev1, rev2 = args
782 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
781 r = revlog.revlog(util.opener(os.getcwd(), audit=False), index)
783 lookup = r.lookup
782 lookup = r.lookup
784 elif len(args) == 2:
783 elif len(args) == 2:
785 if not repo:
784 if not repo:
786 raise util.Abort(_("There is no Mercurial repository here "
785 raise util.Abort(_("There is no Mercurial repository here "
787 "(.hg not found)"))
786 "(.hg not found)"))
788 rev1, rev2 = args
787 rev1, rev2 = args
789 r = repo.changelog
788 r = repo.changelog
790 lookup = repo.lookup
789 lookup = repo.lookup
791 else:
790 else:
792 raise util.Abort(_('either two or three arguments required'))
791 raise util.Abort(_('either two or three arguments required'))
793 a = r.ancestor(lookup(rev1), lookup(rev2))
792 a = r.ancestor(lookup(rev1), lookup(rev2))
794 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
793 ui.write("%d:%s\n" % (r.rev(a), hex(a)))
795
794
796 def debugcommands(ui, cmd='', *args):
795 def debugcommands(ui, cmd='', *args):
797 for cmd, vals in sorted(table.iteritems()):
796 for cmd, vals in sorted(table.iteritems()):
798 cmd = cmd.split('|')[0].strip('^')
797 cmd = cmd.split('|')[0].strip('^')
799 opts = ', '.join([i[1] for i in vals[1]])
798 opts = ', '.join([i[1] for i in vals[1]])
800 ui.write('%s: %s\n' % (cmd, opts))
799 ui.write('%s: %s\n' % (cmd, opts))
801
800
802 def debugcomplete(ui, cmd='', **opts):
801 def debugcomplete(ui, cmd='', **opts):
803 """returns the completion list associated with the given command"""
802 """returns the completion list associated with the given command"""
804
803
805 if opts.get('options'):
804 if opts.get('options'):
806 options = []
805 options = []
807 otables = [globalopts]
806 otables = [globalopts]
808 if cmd:
807 if cmd:
809 aliases, entry = cmdutil.findcmd(cmd, table, False)
808 aliases, entry = cmdutil.findcmd(cmd, table, False)
810 otables.append(entry[1])
809 otables.append(entry[1])
811 for t in otables:
810 for t in otables:
812 for o in t:
811 for o in t:
813 if "(DEPRECATED)" in o[3]:
812 if "(DEPRECATED)" in o[3]:
814 continue
813 continue
815 if o[0]:
814 if o[0]:
816 options.append('-%s' % o[0])
815 options.append('-%s' % o[0])
817 options.append('--%s' % o[1])
816 options.append('--%s' % o[1])
818 ui.write("%s\n" % "\n".join(options))
817 ui.write("%s\n" % "\n".join(options))
819 return
818 return
820
819
821 cmdlist = cmdutil.findpossible(cmd, table)
820 cmdlist = cmdutil.findpossible(cmd, table)
822 if ui.verbose:
821 if ui.verbose:
823 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
822 cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
824 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
823 ui.write("%s\n" % "\n".join(sorted(cmdlist)))
825
824
826 def debugfsinfo(ui, path = "."):
825 def debugfsinfo(ui, path = "."):
827 open('.debugfsinfo', 'w').write('')
826 open('.debugfsinfo', 'w').write('')
828 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
827 ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
829 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
828 ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
830 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
829 ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
831 and 'yes' or 'no'))
830 and 'yes' or 'no'))
832 os.unlink('.debugfsinfo')
831 os.unlink('.debugfsinfo')
833
832
834 def debugrebuildstate(ui, repo, rev="tip"):
833 def debugrebuildstate(ui, repo, rev="tip"):
835 """rebuild the dirstate as it would look like for the given revision"""
834 """rebuild the dirstate as it would look like for the given revision"""
836 ctx = repo[rev]
835 ctx = repo[rev]
837 wlock = repo.wlock()
836 wlock = repo.wlock()
838 try:
837 try:
839 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
838 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
840 finally:
839 finally:
841 wlock.release()
840 wlock.release()
842
841
843 def debugcheckstate(ui, repo):
842 def debugcheckstate(ui, repo):
844 """validate the correctness of the current dirstate"""
843 """validate the correctness of the current dirstate"""
845 parent1, parent2 = repo.dirstate.parents()
844 parent1, parent2 = repo.dirstate.parents()
846 m1 = repo[parent1].manifest()
845 m1 = repo[parent1].manifest()
847 m2 = repo[parent2].manifest()
846 m2 = repo[parent2].manifest()
848 errors = 0
847 errors = 0
849 for f in repo.dirstate:
848 for f in repo.dirstate:
850 state = repo.dirstate[f]
849 state = repo.dirstate[f]
851 if state in "nr" and f not in m1:
850 if state in "nr" and f not in m1:
852 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
851 ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
853 errors += 1
852 errors += 1
854 if state in "a" and f in m1:
853 if state in "a" and f in m1:
855 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
854 ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
856 errors += 1
855 errors += 1
857 if state in "m" and f not in m1 and f not in m2:
856 if state in "m" and f not in m1 and f not in m2:
858 ui.warn(_("%s in state %s, but not in either manifest\n") %
857 ui.warn(_("%s in state %s, but not in either manifest\n") %
859 (f, state))
858 (f, state))
860 errors += 1
859 errors += 1
861 for f in m1:
860 for f in m1:
862 state = repo.dirstate[f]
861 state = repo.dirstate[f]
863 if state not in "nrm":
862 if state not in "nrm":
864 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
863 ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
865 errors += 1
864 errors += 1
866 if errors:
865 if errors:
867 error = _(".hg/dirstate inconsistent with current parent's manifest")
866 error = _(".hg/dirstate inconsistent with current parent's manifest")
868 raise util.Abort(error)
867 raise util.Abort(error)
869
868
870 def showconfig(ui, repo, *values, **opts):
869 def showconfig(ui, repo, *values, **opts):
871 """show combined config settings from all hgrc files
870 """show combined config settings from all hgrc files
872
871
873 With no arguments, print names and values of all config items.
872 With no arguments, print names and values of all config items.
874
873
875 With one argument of the form section.name, print just the value
874 With one argument of the form section.name, print just the value
876 of that config item.
875 of that config item.
877
876
878 With multiple arguments, print names and values of all config
877 With multiple arguments, print names and values of all config
879 items with matching section names.
878 items with matching section names.
880
879
881 With --debug, the source (filename and line number) is printed
880 With --debug, the source (filename and line number) is printed
882 for each config item.
881 for each config item.
883 """
882 """
884
883
885 for f in util.rcpath():
884 for f in util.rcpath():
886 ui.debug(_('read config from: %s\n') % f)
885 ui.debug(_('read config from: %s\n') % f)
887 untrusted = bool(opts.get('untrusted'))
886 untrusted = bool(opts.get('untrusted'))
888 if values:
887 if values:
889 if len([v for v in values if '.' in v]) > 1:
888 if len([v for v in values if '.' in v]) > 1:
890 raise util.Abort(_('only one config item permitted'))
889 raise util.Abort(_('only one config item permitted'))
891 for section, name, value in ui.walkconfig(untrusted=untrusted):
890 for section, name, value in ui.walkconfig(untrusted=untrusted):
892 sectname = section + '.' + name
891 sectname = section + '.' + name
893 if values:
892 if values:
894 for v in values:
893 for v in values:
895 if v == section:
894 if v == section:
896 ui.debug('%s: ' %
895 ui.debug('%s: ' %
897 ui.configsource(section, name, untrusted))
896 ui.configsource(section, name, untrusted))
898 ui.write('%s=%s\n' % (sectname, value))
897 ui.write('%s=%s\n' % (sectname, value))
899 elif v == sectname:
898 elif v == sectname:
900 ui.debug('%s: ' %
899 ui.debug('%s: ' %
901 ui.configsource(section, name, untrusted))
900 ui.configsource(section, name, untrusted))
902 ui.write(value, '\n')
901 ui.write(value, '\n')
903 else:
902 else:
904 ui.debug('%s: ' %
903 ui.debug('%s: ' %
905 ui.configsource(section, name, untrusted))
904 ui.configsource(section, name, untrusted))
906 ui.write('%s=%s\n' % (sectname, value))
905 ui.write('%s=%s\n' % (sectname, value))
907
906
908 def debugsetparents(ui, repo, rev1, rev2=None):
907 def debugsetparents(ui, repo, rev1, rev2=None):
909 """manually set the parents of the current working directory
908 """manually set the parents of the current working directory
910
909
911 This is useful for writing repository conversion tools, but should
910 This is useful for writing repository conversion tools, but should
912 be used with care.
911 be used with care.
913 """
912 """
914
913
915 if not rev2:
914 if not rev2:
916 rev2 = hex(nullid)
915 rev2 = hex(nullid)
917
916
918 wlock = repo.wlock()
917 wlock = repo.wlock()
919 try:
918 try:
920 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
919 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
921 finally:
920 finally:
922 wlock.release()
921 wlock.release()
923
922
924 def debugstate(ui, repo, nodates=None):
923 def debugstate(ui, repo, nodates=None):
925 """show the contents of the current dirstate"""
924 """show the contents of the current dirstate"""
926 timestr = ""
925 timestr = ""
927 showdate = not nodates
926 showdate = not nodates
928 for file_, ent in sorted(repo.dirstate._map.iteritems()):
927 for file_, ent in sorted(repo.dirstate._map.iteritems()):
929 if showdate:
928 if showdate:
930 if ent[3] == -1:
929 if ent[3] == -1:
931 # Pad or slice to locale representation
930 # Pad or slice to locale representation
932 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
931 locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
933 time.localtime(0)))
932 time.localtime(0)))
934 timestr = 'unset'
933 timestr = 'unset'
935 timestr = (timestr[:locale_len] +
934 timestr = (timestr[:locale_len] +
936 ' ' * (locale_len - len(timestr)))
935 ' ' * (locale_len - len(timestr)))
937 else:
936 else:
938 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
937 timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
939 time.localtime(ent[3]))
938 time.localtime(ent[3]))
940 if ent[1] & 020000:
939 if ent[1] & 020000:
941 mode = 'lnk'
940 mode = 'lnk'
942 else:
941 else:
943 mode = '%3o' % (ent[1] & 0777)
942 mode = '%3o' % (ent[1] & 0777)
944 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
943 ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
945 for f in repo.dirstate.copies():
944 for f in repo.dirstate.copies():
946 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
945 ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
947
946
948 def debugsub(ui, repo, rev=None):
947 def debugsub(ui, repo, rev=None):
949 if rev == '':
948 if rev == '':
950 rev = None
949 rev = None
951 for k, v in sorted(repo[rev].substate.items()):
950 for k, v in sorted(repo[rev].substate.items()):
952 ui.write('path %s\n' % k)
951 ui.write('path %s\n' % k)
953 ui.write(' source %s\n' % v[0])
952 ui.write(' source %s\n' % v[0])
954 ui.write(' revision %s\n' % v[1])
953 ui.write(' revision %s\n' % v[1])
955
954
956 def debugdata(ui, file_, rev):
955 def debugdata(ui, file_, rev):
957 """dump the contents of a data file revision"""
956 """dump the contents of a data file revision"""
958 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
957 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_[:-2] + ".i")
959 try:
958 try:
960 ui.write(r.revision(r.lookup(rev)))
959 ui.write(r.revision(r.lookup(rev)))
961 except KeyError:
960 except KeyError:
962 raise util.Abort(_('invalid revision identifier %s') % rev)
961 raise util.Abort(_('invalid revision identifier %s') % rev)
963
962
964 def debugdate(ui, date, range=None, **opts):
963 def debugdate(ui, date, range=None, **opts):
965 """parse and display a date"""
964 """parse and display a date"""
966 if opts["extended"]:
965 if opts["extended"]:
967 d = util.parsedate(date, util.extendeddateformats)
966 d = util.parsedate(date, util.extendeddateformats)
968 else:
967 else:
969 d = util.parsedate(date)
968 d = util.parsedate(date)
970 ui.write("internal: %s %s\n" % d)
969 ui.write("internal: %s %s\n" % d)
971 ui.write("standard: %s\n" % util.datestr(d))
970 ui.write("standard: %s\n" % util.datestr(d))
972 if range:
971 if range:
973 m = util.matchdate(range)
972 m = util.matchdate(range)
974 ui.write("match: %s\n" % m(d[0]))
973 ui.write("match: %s\n" % m(d[0]))
975
974
976 def debugindex(ui, file_):
975 def debugindex(ui, file_):
977 """dump the contents of an index file"""
976 """dump the contents of an index file"""
978 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
977 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
979 ui.write(" rev offset length base linkrev"
978 ui.write(" rev offset length base linkrev"
980 " nodeid p1 p2\n")
979 " nodeid p1 p2\n")
981 for i in r:
980 for i in r:
982 node = r.node(i)
981 node = r.node(i)
983 try:
982 try:
984 pp = r.parents(node)
983 pp = r.parents(node)
985 except:
984 except:
986 pp = [nullid, nullid]
985 pp = [nullid, nullid]
987 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
986 ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
988 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
987 i, r.start(i), r.length(i), r.base(i), r.linkrev(i),
989 short(node), short(pp[0]), short(pp[1])))
988 short(node), short(pp[0]), short(pp[1])))
990
989
991 def debugindexdot(ui, file_):
990 def debugindexdot(ui, file_):
992 """dump an index DAG as a graphviz dot file"""
991 """dump an index DAG as a graphviz dot file"""
993 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
992 r = revlog.revlog(util.opener(os.getcwd(), audit=False), file_)
994 ui.write("digraph G {\n")
993 ui.write("digraph G {\n")
995 for i in r:
994 for i in r:
996 node = r.node(i)
995 node = r.node(i)
997 pp = r.parents(node)
996 pp = r.parents(node)
998 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
997 ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
999 if pp[1] != nullid:
998 if pp[1] != nullid:
1000 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
999 ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
1001 ui.write("}\n")
1000 ui.write("}\n")
1002
1001
1003 def debuginstall(ui):
1002 def debuginstall(ui):
1004 '''test Mercurial installation'''
1003 '''test Mercurial installation'''
1005
1004
1006 def writetemp(contents):
1005 def writetemp(contents):
1007 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
1006 (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
1008 f = os.fdopen(fd, "wb")
1007 f = os.fdopen(fd, "wb")
1009 f.write(contents)
1008 f.write(contents)
1010 f.close()
1009 f.close()
1011 return name
1010 return name
1012
1011
1013 problems = 0
1012 problems = 0
1014
1013
1015 # encoding
1014 # encoding
1016 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
1015 ui.status(_("Checking encoding (%s)...\n") % encoding.encoding)
1017 try:
1016 try:
1018 encoding.fromlocal("test")
1017 encoding.fromlocal("test")
1019 except util.Abort, inst:
1018 except util.Abort, inst:
1020 ui.write(" %s\n" % inst)
1019 ui.write(" %s\n" % inst)
1021 ui.write(_(" (check that your locale is properly set)\n"))
1020 ui.write(_(" (check that your locale is properly set)\n"))
1022 problems += 1
1021 problems += 1
1023
1022
1024 # compiled modules
1023 # compiled modules
1025 ui.status(_("Checking extensions...\n"))
1024 ui.status(_("Checking extensions...\n"))
1026 try:
1025 try:
1027 import bdiff, mpatch, base85
1026 import bdiff, mpatch, base85
1028 except Exception, inst:
1027 except Exception, inst:
1029 ui.write(" %s\n" % inst)
1028 ui.write(" %s\n" % inst)
1030 ui.write(_(" One or more extensions could not be found"))
1029 ui.write(_(" One or more extensions could not be found"))
1031 ui.write(_(" (check that you compiled the extensions)\n"))
1030 ui.write(_(" (check that you compiled the extensions)\n"))
1032 problems += 1
1031 problems += 1
1033
1032
1034 # templates
1033 # templates
1035 ui.status(_("Checking templates...\n"))
1034 ui.status(_("Checking templates...\n"))
1036 try:
1035 try:
1037 import templater
1036 import templater
1038 templater.templater(templater.templatepath("map-cmdline.default"))
1037 templater.templater(templater.templatepath("map-cmdline.default"))
1039 except Exception, inst:
1038 except Exception, inst:
1040 ui.write(" %s\n" % inst)
1039 ui.write(" %s\n" % inst)
1041 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
1040 ui.write(_(" (templates seem to have been installed incorrectly)\n"))
1042 problems += 1
1041 problems += 1
1043
1042
1044 # patch
1043 # patch
1045 ui.status(_("Checking patch...\n"))
1044 ui.status(_("Checking patch...\n"))
1046 patchproblems = 0
1045 patchproblems = 0
1047 a = "1\n2\n3\n4\n"
1046 a = "1\n2\n3\n4\n"
1048 b = "1\n2\n3\ninsert\n4\n"
1047 b = "1\n2\n3\ninsert\n4\n"
1049 fa = writetemp(a)
1048 fa = writetemp(a)
1050 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
1049 d = mdiff.unidiff(a, None, b, None, os.path.basename(fa),
1051 os.path.basename(fa))
1050 os.path.basename(fa))
1052 fd = writetemp(d)
1051 fd = writetemp(d)
1053
1052
1054 files = {}
1053 files = {}
1055 try:
1054 try:
1056 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1055 patch.patch(fd, ui, cwd=os.path.dirname(fa), files=files)
1057 except util.Abort, e:
1056 except util.Abort, e:
1058 ui.write(_(" patch call failed:\n"))
1057 ui.write(_(" patch call failed:\n"))
1059 ui.write(" " + str(e) + "\n")
1058 ui.write(" " + str(e) + "\n")
1060 patchproblems += 1
1059 patchproblems += 1
1061 else:
1060 else:
1062 if list(files) != [os.path.basename(fa)]:
1061 if list(files) != [os.path.basename(fa)]:
1063 ui.write(_(" unexpected patch output!\n"))
1062 ui.write(_(" unexpected patch output!\n"))
1064 patchproblems += 1
1063 patchproblems += 1
1065 a = open(fa).read()
1064 a = open(fa).read()
1066 if a != b:
1065 if a != b:
1067 ui.write(_(" patch test failed!\n"))
1066 ui.write(_(" patch test failed!\n"))
1068 patchproblems += 1
1067 patchproblems += 1
1069
1068
1070 if patchproblems:
1069 if patchproblems:
1071 if ui.config('ui', 'patch'):
1070 if ui.config('ui', 'patch'):
1072 ui.write(_(" (Current patch tool may be incompatible with patch,"
1071 ui.write(_(" (Current patch tool may be incompatible with patch,"
1073 " or misconfigured. Please check your .hgrc file)\n"))
1072 " or misconfigured. Please check your .hgrc file)\n"))
1074 else:
1073 else:
1075 ui.write(_(" Internal patcher failure, please report this error"
1074 ui.write(_(" Internal patcher failure, please report this error"
1076 " to http://mercurial.selenic.com/bts/\n"))
1075 " to http://mercurial.selenic.com/bts/\n"))
1077 problems += patchproblems
1076 problems += patchproblems
1078
1077
1079 os.unlink(fa)
1078 os.unlink(fa)
1080 os.unlink(fd)
1079 os.unlink(fd)
1081
1080
1082 # editor
1081 # editor
1083 ui.status(_("Checking commit editor...\n"))
1082 ui.status(_("Checking commit editor...\n"))
1084 editor = ui.geteditor()
1083 editor = ui.geteditor()
1085 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1084 cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
1086 if not cmdpath:
1085 if not cmdpath:
1087 if editor == 'vi':
1086 if editor == 'vi':
1088 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1087 ui.write(_(" No commit editor set and can't find vi in PATH\n"))
1089 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1088 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1090 else:
1089 else:
1091 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1090 ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
1092 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1091 ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
1093 problems += 1
1092 problems += 1
1094
1093
1095 # check username
1094 # check username
1096 ui.status(_("Checking username...\n"))
1095 ui.status(_("Checking username...\n"))
1097 try:
1096 try:
1098 user = ui.username()
1097 user = ui.username()
1099 except util.Abort, e:
1098 except util.Abort, e:
1100 ui.write(" %s\n" % e)
1099 ui.write(" %s\n" % e)
1101 ui.write(_(" (specify a username in your .hgrc file)\n"))
1100 ui.write(_(" (specify a username in your .hgrc file)\n"))
1102 problems += 1
1101 problems += 1
1103
1102
1104 if not problems:
1103 if not problems:
1105 ui.status(_("No problems detected\n"))
1104 ui.status(_("No problems detected\n"))
1106 else:
1105 else:
1107 ui.write(_("%s problems detected,"
1106 ui.write(_("%s problems detected,"
1108 " please check your install!\n") % problems)
1107 " please check your install!\n") % problems)
1109
1108
1110 return problems
1109 return problems
1111
1110
1112 def debugrename(ui, repo, file1, *pats, **opts):
1111 def debugrename(ui, repo, file1, *pats, **opts):
1113 """dump rename information"""
1112 """dump rename information"""
1114
1113
1115 ctx = repo[opts.get('rev')]
1114 ctx = repo[opts.get('rev')]
1116 m = cmdutil.match(repo, (file1,) + pats, opts)
1115 m = cmdutil.match(repo, (file1,) + pats, opts)
1117 for abs in ctx.walk(m):
1116 for abs in ctx.walk(m):
1118 fctx = ctx[abs]
1117 fctx = ctx[abs]
1119 o = fctx.filelog().renamed(fctx.filenode())
1118 o = fctx.filelog().renamed(fctx.filenode())
1120 rel = m.rel(abs)
1119 rel = m.rel(abs)
1121 if o:
1120 if o:
1122 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1121 ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
1123 else:
1122 else:
1124 ui.write(_("%s not renamed\n") % rel)
1123 ui.write(_("%s not renamed\n") % rel)
1125
1124
1126 def debugwalk(ui, repo, *pats, **opts):
1125 def debugwalk(ui, repo, *pats, **opts):
1127 """show how files match on given patterns"""
1126 """show how files match on given patterns"""
1128 m = cmdutil.match(repo, pats, opts)
1127 m = cmdutil.match(repo, pats, opts)
1129 items = list(repo.walk(m))
1128 items = list(repo.walk(m))
1130 if not items:
1129 if not items:
1131 return
1130 return
1132 fmt = 'f %%-%ds %%-%ds %%s' % (
1131 fmt = 'f %%-%ds %%-%ds %%s' % (
1133 max([len(abs) for abs in items]),
1132 max([len(abs) for abs in items]),
1134 max([len(m.rel(abs)) for abs in items]))
1133 max([len(m.rel(abs)) for abs in items]))
1135 for abs in items:
1134 for abs in items:
1136 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1135 line = fmt % (abs, m.rel(abs), m.exact(abs) and 'exact' or '')
1137 ui.write("%s\n" % line.rstrip())
1136 ui.write("%s\n" % line.rstrip())
1138
1137
1139 def diff(ui, repo, *pats, **opts):
1138 def diff(ui, repo, *pats, **opts):
1140 """diff repository (or selected files)
1139 """diff repository (or selected files)
1141
1140
1142 Show differences between revisions for the specified files.
1141 Show differences between revisions for the specified files.
1143
1142
1144 Differences between files are shown using the unified diff format.
1143 Differences between files are shown using the unified diff format.
1145
1144
1146 NOTE: diff may generate unexpected results for merges, as it will
1145 NOTE: diff may generate unexpected results for merges, as it will
1147 default to comparing against the working directory's first parent
1146 default to comparing against the working directory's first parent
1148 changeset if no revisions are specified.
1147 changeset if no revisions are specified.
1149
1148
1150 When two revision arguments are given, then changes are shown
1149 When two revision arguments are given, then changes are shown
1151 between those revisions. If only one revision is specified then
1150 between those revisions. If only one revision is specified then
1152 that revision is compared to the working directory, and, when no
1151 that revision is compared to the working directory, and, when no
1153 revisions are specified, the working directory files are compared
1152 revisions are specified, the working directory files are compared
1154 to its parent.
1153 to its parent.
1155
1154
1156 Alternatively you can specify -c/--change with a revision to see
1155 Alternatively you can specify -c/--change with a revision to see
1157 the changes in that changeset relative to its first parent.
1156 the changes in that changeset relative to its first parent.
1158
1157
1159 Without the -a/--text option, diff will avoid generating diffs of
1158 Without the -a/--text option, diff will avoid generating diffs of
1160 files it detects as binary. With -a, diff will generate a diff
1159 files it detects as binary. With -a, diff will generate a diff
1161 anyway, probably with undesirable results.
1160 anyway, probably with undesirable results.
1162
1161
1163 Use the -g/--git option to generate diffs in the git extended diff
1162 Use the -g/--git option to generate diffs in the git extended diff
1164 format. For more information, read :hg:`help diffs`.
1163 format. For more information, read :hg:`help diffs`.
1165 """
1164 """
1166
1165
1167 revs = opts.get('rev')
1166 revs = opts.get('rev')
1168 change = opts.get('change')
1167 change = opts.get('change')
1169 stat = opts.get('stat')
1168 stat = opts.get('stat')
1170 reverse = opts.get('reverse')
1169 reverse = opts.get('reverse')
1171
1170
1172 if revs and change:
1171 if revs and change:
1173 msg = _('cannot specify --rev and --change at the same time')
1172 msg = _('cannot specify --rev and --change at the same time')
1174 raise util.Abort(msg)
1173 raise util.Abort(msg)
1175 elif change:
1174 elif change:
1176 node2 = repo.lookup(change)
1175 node2 = repo.lookup(change)
1177 node1 = repo[node2].parents()[0].node()
1176 node1 = repo[node2].parents()[0].node()
1178 else:
1177 else:
1179 node1, node2 = cmdutil.revpair(repo, revs)
1178 node1, node2 = cmdutil.revpair(repo, revs)
1180
1179
1181 if reverse:
1180 if reverse:
1182 node1, node2 = node2, node1
1181 node1, node2 = node2, node1
1183
1182
1184 diffopts = patch.diffopts(ui, opts)
1183 diffopts = patch.diffopts(ui, opts)
1185 m = cmdutil.match(repo, pats, opts)
1184 m = cmdutil.match(repo, pats, opts)
1186 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat)
1185 cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat)
1187
1186
1188 def export(ui, repo, *changesets, **opts):
1187 def export(ui, repo, *changesets, **opts):
1189 """dump the header and diffs for one or more changesets
1188 """dump the header and diffs for one or more changesets
1190
1189
1191 Print the changeset header and diffs for one or more revisions.
1190 Print the changeset header and diffs for one or more revisions.
1192
1191
1193 The information shown in the changeset header is: author, date,
1192 The information shown in the changeset header is: author, date,
1194 branch name (if non-default), changeset hash, parent(s) and commit
1193 branch name (if non-default), changeset hash, parent(s) and commit
1195 comment.
1194 comment.
1196
1195
1197 NOTE: export may generate unexpected diff output for merge
1196 NOTE: export may generate unexpected diff output for merge
1198 changesets, as it will compare the merge changeset against its
1197 changesets, as it will compare the merge changeset against its
1199 first parent only.
1198 first parent only.
1200
1199
1201 Output may be to a file, in which case the name of the file is
1200 Output may be to a file, in which case the name of the file is
1202 given using a format string. The formatting rules are as follows:
1201 given using a format string. The formatting rules are as follows:
1203
1202
1204 :``%%``: literal "%" character
1203 :``%%``: literal "%" character
1205 :``%H``: changeset hash (40 bytes of hexadecimal)
1204 :``%H``: changeset hash (40 bytes of hexadecimal)
1206 :``%N``: number of patches being generated
1205 :``%N``: number of patches being generated
1207 :``%R``: changeset revision number
1206 :``%R``: changeset revision number
1208 :``%b``: basename of the exporting repository
1207 :``%b``: basename of the exporting repository
1209 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1208 :``%h``: short-form changeset hash (12 bytes of hexadecimal)
1210 :``%n``: zero-padded sequence number, starting at 1
1209 :``%n``: zero-padded sequence number, starting at 1
1211 :``%r``: zero-padded changeset revision number
1210 :``%r``: zero-padded changeset revision number
1212
1211
1213 Without the -a/--text option, export will avoid generating diffs
1212 Without the -a/--text option, export will avoid generating diffs
1214 of files it detects as binary. With -a, export will generate a
1213 of files it detects as binary. With -a, export will generate a
1215 diff anyway, probably with undesirable results.
1214 diff anyway, probably with undesirable results.
1216
1215
1217 Use the -g/--git option to generate diffs in the git extended diff
1216 Use the -g/--git option to generate diffs in the git extended diff
1218 format. See :hg:`help diffs` for more information.
1217 format. See :hg:`help diffs` for more information.
1219
1218
1220 With the --switch-parent option, the diff will be against the
1219 With the --switch-parent option, the diff will be against the
1221 second parent. It can be useful to review a merge.
1220 second parent. It can be useful to review a merge.
1222 """
1221 """
1223 changesets += tuple(opts.get('rev', []))
1222 changesets += tuple(opts.get('rev', []))
1224 if not changesets:
1223 if not changesets:
1225 raise util.Abort(_("export requires at least one changeset"))
1224 raise util.Abort(_("export requires at least one changeset"))
1226 revs = cmdutil.revrange(repo, changesets)
1225 revs = cmdutil.revrange(repo, changesets)
1227 if len(revs) > 1:
1226 if len(revs) > 1:
1228 ui.note(_('exporting patches:\n'))
1227 ui.note(_('exporting patches:\n'))
1229 else:
1228 else:
1230 ui.note(_('exporting patch:\n'))
1229 ui.note(_('exporting patch:\n'))
1231 cmdutil.export(repo, revs, template=opts.get('output'),
1230 cmdutil.export(repo, revs, template=opts.get('output'),
1232 switch_parent=opts.get('switch_parent'),
1231 switch_parent=opts.get('switch_parent'),
1233 opts=patch.diffopts(ui, opts))
1232 opts=patch.diffopts(ui, opts))
1234
1233
1235 def forget(ui, repo, *pats, **opts):
1234 def forget(ui, repo, *pats, **opts):
1236 """forget the specified files on the next commit
1235 """forget the specified files on the next commit
1237
1236
1238 Mark the specified files so they will no longer be tracked
1237 Mark the specified files so they will no longer be tracked
1239 after the next commit.
1238 after the next commit.
1240
1239
1241 This only removes files from the current branch, not from the
1240 This only removes files from the current branch, not from the
1242 entire project history, and it does not delete them from the
1241 entire project history, and it does not delete them from the
1243 working directory.
1242 working directory.
1244
1243
1245 To undo a forget before the next commit, see hg add.
1244 To undo a forget before the next commit, see hg add.
1246 """
1245 """
1247
1246
1248 if not pats:
1247 if not pats:
1249 raise util.Abort(_('no files specified'))
1248 raise util.Abort(_('no files specified'))
1250
1249
1251 m = cmdutil.match(repo, pats, opts)
1250 m = cmdutil.match(repo, pats, opts)
1252 s = repo.status(match=m, clean=True)
1251 s = repo.status(match=m, clean=True)
1253 forget = sorted(s[0] + s[1] + s[3] + s[6])
1252 forget = sorted(s[0] + s[1] + s[3] + s[6])
1254
1253
1255 for f in m.files():
1254 for f in m.files():
1256 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1255 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
1257 ui.warn(_('not removing %s: file is already untracked\n')
1256 ui.warn(_('not removing %s: file is already untracked\n')
1258 % m.rel(f))
1257 % m.rel(f))
1259
1258
1260 for f in forget:
1259 for f in forget:
1261 if ui.verbose or not m.exact(f):
1260 if ui.verbose or not m.exact(f):
1262 ui.status(_('removing %s\n') % m.rel(f))
1261 ui.status(_('removing %s\n') % m.rel(f))
1263
1262
1264 repo.remove(forget, unlink=False)
1263 repo.remove(forget, unlink=False)
1265
1264
1266 def grep(ui, repo, pattern, *pats, **opts):
1265 def grep(ui, repo, pattern, *pats, **opts):
1267 """search for a pattern in specified files and revisions
1266 """search for a pattern in specified files and revisions
1268
1267
1269 Search revisions of files for a regular expression.
1268 Search revisions of files for a regular expression.
1270
1269
1271 This command behaves differently than Unix grep. It only accepts
1270 This command behaves differently than Unix grep. It only accepts
1272 Python/Perl regexps. It searches repository history, not the
1271 Python/Perl regexps. It searches repository history, not the
1273 working directory. It always prints the revision number in which a
1272 working directory. It always prints the revision number in which a
1274 match appears.
1273 match appears.
1275
1274
1276 By default, grep only prints output for the first revision of a
1275 By default, grep only prints output for the first revision of a
1277 file in which it finds a match. To get it to print every revision
1276 file in which it finds a match. To get it to print every revision
1278 that contains a change in match status ("-" for a match that
1277 that contains a change in match status ("-" for a match that
1279 becomes a non-match, or "+" for a non-match that becomes a match),
1278 becomes a non-match, or "+" for a non-match that becomes a match),
1280 use the --all flag.
1279 use the --all flag.
1281 """
1280 """
1282 reflags = 0
1281 reflags = 0
1283 if opts.get('ignore_case'):
1282 if opts.get('ignore_case'):
1284 reflags |= re.I
1283 reflags |= re.I
1285 try:
1284 try:
1286 regexp = re.compile(pattern, reflags)
1285 regexp = re.compile(pattern, reflags)
1287 except Exception, inst:
1286 except Exception, inst:
1288 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1287 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
1289 return None
1288 return None
1290 sep, eol = ':', '\n'
1289 sep, eol = ':', '\n'
1291 if opts.get('print0'):
1290 if opts.get('print0'):
1292 sep = eol = '\0'
1291 sep = eol = '\0'
1293
1292
1294 getfile = util.lrucachefunc(repo.file)
1293 getfile = util.lrucachefunc(repo.file)
1295
1294
1296 def matchlines(body):
1295 def matchlines(body):
1297 begin = 0
1296 begin = 0
1298 linenum = 0
1297 linenum = 0
1299 while True:
1298 while True:
1300 match = regexp.search(body, begin)
1299 match = regexp.search(body, begin)
1301 if not match:
1300 if not match:
1302 break
1301 break
1303 mstart, mend = match.span()
1302 mstart, mend = match.span()
1304 linenum += body.count('\n', begin, mstart) + 1
1303 linenum += body.count('\n', begin, mstart) + 1
1305 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1304 lstart = body.rfind('\n', begin, mstart) + 1 or begin
1306 begin = body.find('\n', mend) + 1 or len(body)
1305 begin = body.find('\n', mend) + 1 or len(body)
1307 lend = begin - 1
1306 lend = begin - 1
1308 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1307 yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
1309
1308
1310 class linestate(object):
1309 class linestate(object):
1311 def __init__(self, line, linenum, colstart, colend):
1310 def __init__(self, line, linenum, colstart, colend):
1312 self.line = line
1311 self.line = line
1313 self.linenum = linenum
1312 self.linenum = linenum
1314 self.colstart = colstart
1313 self.colstart = colstart
1315 self.colend = colend
1314 self.colend = colend
1316
1315
1317 def __hash__(self):
1316 def __hash__(self):
1318 return hash((self.linenum, self.line))
1317 return hash((self.linenum, self.line))
1319
1318
1320 def __eq__(self, other):
1319 def __eq__(self, other):
1321 return self.line == other.line
1320 return self.line == other.line
1322
1321
1323 matches = {}
1322 matches = {}
1324 copies = {}
1323 copies = {}
1325 def grepbody(fn, rev, body):
1324 def grepbody(fn, rev, body):
1326 matches[rev].setdefault(fn, [])
1325 matches[rev].setdefault(fn, [])
1327 m = matches[rev][fn]
1326 m = matches[rev][fn]
1328 for lnum, cstart, cend, line in matchlines(body):
1327 for lnum, cstart, cend, line in matchlines(body):
1329 s = linestate(line, lnum, cstart, cend)
1328 s = linestate(line, lnum, cstart, cend)
1330 m.append(s)
1329 m.append(s)
1331
1330
1332 def difflinestates(a, b):
1331 def difflinestates(a, b):
1333 sm = difflib.SequenceMatcher(None, a, b)
1332 sm = difflib.SequenceMatcher(None, a, b)
1334 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1333 for tag, alo, ahi, blo, bhi in sm.get_opcodes():
1335 if tag == 'insert':
1334 if tag == 'insert':
1336 for i in xrange(blo, bhi):
1335 for i in xrange(blo, bhi):
1337 yield ('+', b[i])
1336 yield ('+', b[i])
1338 elif tag == 'delete':
1337 elif tag == 'delete':
1339 for i in xrange(alo, ahi):
1338 for i in xrange(alo, ahi):
1340 yield ('-', a[i])
1339 yield ('-', a[i])
1341 elif tag == 'replace':
1340 elif tag == 'replace':
1342 for i in xrange(alo, ahi):
1341 for i in xrange(alo, ahi):
1343 yield ('-', a[i])
1342 yield ('-', a[i])
1344 for i in xrange(blo, bhi):
1343 for i in xrange(blo, bhi):
1345 yield ('+', b[i])
1344 yield ('+', b[i])
1346
1345
1347 def display(fn, ctx, pstates, states):
1346 def display(fn, ctx, pstates, states):
1348 rev = ctx.rev()
1347 rev = ctx.rev()
1349 datefunc = ui.quiet and util.shortdate or util.datestr
1348 datefunc = ui.quiet and util.shortdate or util.datestr
1350 found = False
1349 found = False
1351 filerevmatches = {}
1350 filerevmatches = {}
1352 if opts.get('all'):
1351 if opts.get('all'):
1353 iter = difflinestates(pstates, states)
1352 iter = difflinestates(pstates, states)
1354 else:
1353 else:
1355 iter = [('', l) for l in states]
1354 iter = [('', l) for l in states]
1356 for change, l in iter:
1355 for change, l in iter:
1357 cols = [fn, str(rev)]
1356 cols = [fn, str(rev)]
1358 before, match, after = None, None, None
1357 before, match, after = None, None, None
1359 if opts.get('line_number'):
1358 if opts.get('line_number'):
1360 cols.append(str(l.linenum))
1359 cols.append(str(l.linenum))
1361 if opts.get('all'):
1360 if opts.get('all'):
1362 cols.append(change)
1361 cols.append(change)
1363 if opts.get('user'):
1362 if opts.get('user'):
1364 cols.append(ui.shortuser(ctx.user()))
1363 cols.append(ui.shortuser(ctx.user()))
1365 if opts.get('date'):
1364 if opts.get('date'):
1366 cols.append(datefunc(ctx.date()))
1365 cols.append(datefunc(ctx.date()))
1367 if opts.get('files_with_matches'):
1366 if opts.get('files_with_matches'):
1368 c = (fn, rev)
1367 c = (fn, rev)
1369 if c in filerevmatches:
1368 if c in filerevmatches:
1370 continue
1369 continue
1371 filerevmatches[c] = 1
1370 filerevmatches[c] = 1
1372 else:
1371 else:
1373 before = l.line[:l.colstart]
1372 before = l.line[:l.colstart]
1374 match = l.line[l.colstart:l.colend]
1373 match = l.line[l.colstart:l.colend]
1375 after = l.line[l.colend:]
1374 after = l.line[l.colend:]
1376 ui.write(sep.join(cols))
1375 ui.write(sep.join(cols))
1377 if before is not None:
1376 if before is not None:
1378 ui.write(sep + before)
1377 ui.write(sep + before)
1379 ui.write(match, label='grep.match')
1378 ui.write(match, label='grep.match')
1380 ui.write(after)
1379 ui.write(after)
1381 ui.write(eol)
1380 ui.write(eol)
1382 found = True
1381 found = True
1383 return found
1382 return found
1384
1383
1385 skip = {}
1384 skip = {}
1386 revfiles = {}
1385 revfiles = {}
1387 matchfn = cmdutil.match(repo, pats, opts)
1386 matchfn = cmdutil.match(repo, pats, opts)
1388 found = False
1387 found = False
1389 follow = opts.get('follow')
1388 follow = opts.get('follow')
1390
1389
1391 def prep(ctx, fns):
1390 def prep(ctx, fns):
1392 rev = ctx.rev()
1391 rev = ctx.rev()
1393 pctx = ctx.parents()[0]
1392 pctx = ctx.parents()[0]
1394 parent = pctx.rev()
1393 parent = pctx.rev()
1395 matches.setdefault(rev, {})
1394 matches.setdefault(rev, {})
1396 matches.setdefault(parent, {})
1395 matches.setdefault(parent, {})
1397 files = revfiles.setdefault(rev, [])
1396 files = revfiles.setdefault(rev, [])
1398 for fn in fns:
1397 for fn in fns:
1399 flog = getfile(fn)
1398 flog = getfile(fn)
1400 try:
1399 try:
1401 fnode = ctx.filenode(fn)
1400 fnode = ctx.filenode(fn)
1402 except error.LookupError:
1401 except error.LookupError:
1403 continue
1402 continue
1404
1403
1405 copied = flog.renamed(fnode)
1404 copied = flog.renamed(fnode)
1406 copy = follow and copied and copied[0]
1405 copy = follow and copied and copied[0]
1407 if copy:
1406 if copy:
1408 copies.setdefault(rev, {})[fn] = copy
1407 copies.setdefault(rev, {})[fn] = copy
1409 if fn in skip:
1408 if fn in skip:
1410 if copy:
1409 if copy:
1411 skip[copy] = True
1410 skip[copy] = True
1412 continue
1411 continue
1413 files.append(fn)
1412 files.append(fn)
1414
1413
1415 if fn not in matches[rev]:
1414 if fn not in matches[rev]:
1416 grepbody(fn, rev, flog.read(fnode))
1415 grepbody(fn, rev, flog.read(fnode))
1417
1416
1418 pfn = copy or fn
1417 pfn = copy or fn
1419 if pfn not in matches[parent]:
1418 if pfn not in matches[parent]:
1420 try:
1419 try:
1421 fnode = pctx.filenode(pfn)
1420 fnode = pctx.filenode(pfn)
1422 grepbody(pfn, parent, flog.read(fnode))
1421 grepbody(pfn, parent, flog.read(fnode))
1423 except error.LookupError:
1422 except error.LookupError:
1424 pass
1423 pass
1425
1424
1426 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1425 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
1427 rev = ctx.rev()
1426 rev = ctx.rev()
1428 parent = ctx.parents()[0].rev()
1427 parent = ctx.parents()[0].rev()
1429 for fn in sorted(revfiles.get(rev, [])):
1428 for fn in sorted(revfiles.get(rev, [])):
1430 states = matches[rev][fn]
1429 states = matches[rev][fn]
1431 copy = copies.get(rev, {}).get(fn)
1430 copy = copies.get(rev, {}).get(fn)
1432 if fn in skip:
1431 if fn in skip:
1433 if copy:
1432 if copy:
1434 skip[copy] = True
1433 skip[copy] = True
1435 continue
1434 continue
1436 pstates = matches.get(parent, {}).get(copy or fn, [])
1435 pstates = matches.get(parent, {}).get(copy or fn, [])
1437 if pstates or states:
1436 if pstates or states:
1438 r = display(fn, ctx, pstates, states)
1437 r = display(fn, ctx, pstates, states)
1439 found = found or r
1438 found = found or r
1440 if r and not opts.get('all'):
1439 if r and not opts.get('all'):
1441 skip[fn] = True
1440 skip[fn] = True
1442 if copy:
1441 if copy:
1443 skip[copy] = True
1442 skip[copy] = True
1444 del matches[rev]
1443 del matches[rev]
1445 del revfiles[rev]
1444 del revfiles[rev]
1446
1445
1447 def heads(ui, repo, *branchrevs, **opts):
1446 def heads(ui, repo, *branchrevs, **opts):
1448 """show current repository heads or show branch heads
1447 """show current repository heads or show branch heads
1449
1448
1450 With no arguments, show all repository branch heads.
1449 With no arguments, show all repository branch heads.
1451
1450
1452 Repository "heads" are changesets with no child changesets. They are
1451 Repository "heads" are changesets with no child changesets. They are
1453 where development generally takes place and are the usual targets
1452 where development generally takes place and are the usual targets
1454 for update and merge operations. Branch heads are changesets that have
1453 for update and merge operations. Branch heads are changesets that have
1455 no child changeset on the same branch.
1454 no child changeset on the same branch.
1456
1455
1457 If one or more REVs are given, only branch heads on the branches
1456 If one or more REVs are given, only branch heads on the branches
1458 associated with the specified changesets are shown.
1457 associated with the specified changesets are shown.
1459
1458
1460 If -c/--closed is specified, also show branch heads marked closed
1459 If -c/--closed is specified, also show branch heads marked closed
1461 (see hg commit --close-branch).
1460 (see hg commit --close-branch).
1462
1461
1463 If STARTREV is specified, only those heads that are descendants of
1462 If STARTREV is specified, only those heads that are descendants of
1464 STARTREV will be displayed.
1463 STARTREV will be displayed.
1465
1464
1466 If -t/--topo is specified, named branch mechanics will be ignored and only
1465 If -t/--topo is specified, named branch mechanics will be ignored and only
1467 changesets without children will be shown.
1466 changesets without children will be shown.
1468 """
1467 """
1469
1468
1470 if opts.get('rev'):
1469 if opts.get('rev'):
1471 start = repo.lookup(opts['rev'])
1470 start = repo.lookup(opts['rev'])
1472 else:
1471 else:
1473 start = None
1472 start = None
1474
1473
1475 if opts.get('topo'):
1474 if opts.get('topo'):
1476 heads = [repo[h] for h in repo.heads(start)]
1475 heads = [repo[h] for h in repo.heads(start)]
1477 else:
1476 else:
1478 heads = []
1477 heads = []
1479 for b, ls in repo.branchmap().iteritems():
1478 for b, ls in repo.branchmap().iteritems():
1480 if start is None:
1479 if start is None:
1481 heads += [repo[h] for h in ls]
1480 heads += [repo[h] for h in ls]
1482 continue
1481 continue
1483 startrev = repo.changelog.rev(start)
1482 startrev = repo.changelog.rev(start)
1484 descendants = set(repo.changelog.descendants(startrev))
1483 descendants = set(repo.changelog.descendants(startrev))
1485 descendants.add(startrev)
1484 descendants.add(startrev)
1486 rev = repo.changelog.rev
1485 rev = repo.changelog.rev
1487 heads += [repo[h] for h in ls if rev(h) in descendants]
1486 heads += [repo[h] for h in ls if rev(h) in descendants]
1488
1487
1489 if branchrevs:
1488 if branchrevs:
1490 decode, encode = encoding.fromlocal, encoding.tolocal
1489 decode, encode = encoding.fromlocal, encoding.tolocal
1491 branches = set(repo[decode(br)].branch() for br in branchrevs)
1490 branches = set(repo[decode(br)].branch() for br in branchrevs)
1492 heads = [h for h in heads if h.branch() in branches]
1491 heads = [h for h in heads if h.branch() in branches]
1493
1492
1494 if not opts.get('closed'):
1493 if not opts.get('closed'):
1495 heads = [h for h in heads if not h.extra().get('close')]
1494 heads = [h for h in heads if not h.extra().get('close')]
1496
1495
1497 if opts.get('active') and branchrevs:
1496 if opts.get('active') and branchrevs:
1498 dagheads = repo.heads(start)
1497 dagheads = repo.heads(start)
1499 heads = [h for h in heads if h.node() in dagheads]
1498 heads = [h for h in heads if h.node() in dagheads]
1500
1499
1501 if branchrevs:
1500 if branchrevs:
1502 haveheads = set(h.branch() for h in heads)
1501 haveheads = set(h.branch() for h in heads)
1503 if branches - haveheads:
1502 if branches - haveheads:
1504 headless = ', '.join(encode(b) for b in branches - haveheads)
1503 headless = ', '.join(encode(b) for b in branches - haveheads)
1505 msg = _('no open branch heads found on branches %s')
1504 msg = _('no open branch heads found on branches %s')
1506 if opts.get('rev'):
1505 if opts.get('rev'):
1507 msg += _(' (started at %s)' % opts['rev'])
1506 msg += _(' (started at %s)' % opts['rev'])
1508 ui.warn((msg + '\n') % headless)
1507 ui.warn((msg + '\n') % headless)
1509
1508
1510 if not heads:
1509 if not heads:
1511 return 1
1510 return 1
1512
1511
1513 heads = sorted(heads, key=lambda x: -x.rev())
1512 heads = sorted(heads, key=lambda x: -x.rev())
1514 displayer = cmdutil.show_changeset(ui, repo, opts)
1513 displayer = cmdutil.show_changeset(ui, repo, opts)
1515 for ctx in heads:
1514 for ctx in heads:
1516 displayer.show(ctx)
1515 displayer.show(ctx)
1517 displayer.close()
1516 displayer.close()
1518
1517
1519 def help_(ui, name=None, with_version=False, unknowncmd=False):
1518 def help_(ui, name=None, with_version=False, unknowncmd=False):
1520 """show help for a given topic or a help overview
1519 """show help for a given topic or a help overview
1521
1520
1522 With no arguments, print a list of commands with short help messages.
1521 With no arguments, print a list of commands with short help messages.
1523
1522
1524 Given a topic, extension, or command name, print help for that
1523 Given a topic, extension, or command name, print help for that
1525 topic."""
1524 topic."""
1526 option_lists = []
1525 option_lists = []
1527 textwidth = util.termwidth() - 2
1526 textwidth = util.termwidth() - 2
1528
1527
1529 def addglobalopts(aliases):
1528 def addglobalopts(aliases):
1530 if ui.verbose:
1529 if ui.verbose:
1531 option_lists.append((_("global options:"), globalopts))
1530 option_lists.append((_("global options:"), globalopts))
1532 if name == 'shortlist':
1531 if name == 'shortlist':
1533 option_lists.append((_('use "hg help" for the full list '
1532 option_lists.append((_('use "hg help" for the full list '
1534 'of commands'), ()))
1533 'of commands'), ()))
1535 else:
1534 else:
1536 if name == 'shortlist':
1535 if name == 'shortlist':
1537 msg = _('use "hg help" for the full list of commands '
1536 msg = _('use "hg help" for the full list of commands '
1538 'or "hg -v" for details')
1537 'or "hg -v" for details')
1539 elif aliases:
1538 elif aliases:
1540 msg = _('use "hg -v help%s" to show aliases and '
1539 msg = _('use "hg -v help%s" to show aliases and '
1541 'global options') % (name and " " + name or "")
1540 'global options') % (name and " " + name or "")
1542 else:
1541 else:
1543 msg = _('use "hg -v help %s" to show global options') % name
1542 msg = _('use "hg -v help %s" to show global options') % name
1544 option_lists.append((msg, ()))
1543 option_lists.append((msg, ()))
1545
1544
1546 def helpcmd(name):
1545 def helpcmd(name):
1547 if with_version:
1546 if with_version:
1548 version_(ui)
1547 version_(ui)
1549 ui.write('\n')
1548 ui.write('\n')
1550
1549
1551 try:
1550 try:
1552 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1551 aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
1553 except error.AmbiguousCommand, inst:
1552 except error.AmbiguousCommand, inst:
1554 # py3k fix: except vars can't be used outside the scope of the
1553 # py3k fix: except vars can't be used outside the scope of the
1555 # except block, nor can be used inside a lambda. python issue4617
1554 # except block, nor can be used inside a lambda. python issue4617
1556 prefix = inst.args[0]
1555 prefix = inst.args[0]
1557 select = lambda c: c.lstrip('^').startswith(prefix)
1556 select = lambda c: c.lstrip('^').startswith(prefix)
1558 helplist(_('list of commands:\n\n'), select)
1557 helplist(_('list of commands:\n\n'), select)
1559 return
1558 return
1560
1559
1561 # check if it's an invalid alias and display its error if it is
1560 # check if it's an invalid alias and display its error if it is
1562 if getattr(entry[0], 'badalias', False):
1561 if getattr(entry[0], 'badalias', False):
1563 if not unknowncmd:
1562 if not unknowncmd:
1564 entry[0](ui)
1563 entry[0](ui)
1565 return
1564 return
1566
1565
1567 # synopsis
1566 # synopsis
1568 if len(entry) > 2:
1567 if len(entry) > 2:
1569 if entry[2].startswith('hg'):
1568 if entry[2].startswith('hg'):
1570 ui.write("%s\n" % entry[2])
1569 ui.write("%s\n" % entry[2])
1571 else:
1570 else:
1572 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1571 ui.write('hg %s %s\n' % (aliases[0], entry[2]))
1573 else:
1572 else:
1574 ui.write('hg %s\n' % aliases[0])
1573 ui.write('hg %s\n' % aliases[0])
1575
1574
1576 # aliases
1575 # aliases
1577 if not ui.quiet and len(aliases) > 1:
1576 if not ui.quiet and len(aliases) > 1:
1578 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1577 ui.write(_("\naliases: %s\n") % ', '.join(aliases[1:]))
1579
1578
1580 # description
1579 # description
1581 doc = gettext(entry[0].__doc__)
1580 doc = gettext(entry[0].__doc__)
1582 if not doc:
1581 if not doc:
1583 doc = _("(no help text available)")
1582 doc = _("(no help text available)")
1584 if hasattr(entry[0], 'definition'): # aliased command
1583 if hasattr(entry[0], 'definition'): # aliased command
1585 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
1584 doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
1586 if ui.quiet:
1585 if ui.quiet:
1587 doc = doc.splitlines()[0]
1586 doc = doc.splitlines()[0]
1588 keep = ui.verbose and ['verbose'] or []
1587 keep = ui.verbose and ['verbose'] or []
1589 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1588 formatted, pruned = minirst.format(doc, textwidth, keep=keep)
1590 ui.write("\n%s\n" % formatted)
1589 ui.write("\n%s\n" % formatted)
1591 if pruned:
1590 if pruned:
1592 ui.write(_('\nuse "hg -v help %s" to show verbose help\n') % name)
1591 ui.write(_('\nuse "hg -v help %s" to show verbose help\n') % name)
1593
1592
1594 if not ui.quiet:
1593 if not ui.quiet:
1595 # options
1594 # options
1596 if entry[1]:
1595 if entry[1]:
1597 option_lists.append((_("options:\n"), entry[1]))
1596 option_lists.append((_("options:\n"), entry[1]))
1598
1597
1599 addglobalopts(False)
1598 addglobalopts(False)
1600
1599
1601 def helplist(header, select=None):
1600 def helplist(header, select=None):
1602 h = {}
1601 h = {}
1603 cmds = {}
1602 cmds = {}
1604 for c, e in table.iteritems():
1603 for c, e in table.iteritems():
1605 f = c.split("|", 1)[0]
1604 f = c.split("|", 1)[0]
1606 if select and not select(f):
1605 if select and not select(f):
1607 continue
1606 continue
1608 if (not select and name != 'shortlist' and
1607 if (not select and name != 'shortlist' and
1609 e[0].__module__ != __name__):
1608 e[0].__module__ != __name__):
1610 continue
1609 continue
1611 if name == "shortlist" and not f.startswith("^"):
1610 if name == "shortlist" and not f.startswith("^"):
1612 continue
1611 continue
1613 f = f.lstrip("^")
1612 f = f.lstrip("^")
1614 if not ui.debugflag and f.startswith("debug"):
1613 if not ui.debugflag and f.startswith("debug"):
1615 continue
1614 continue
1616 doc = e[0].__doc__
1615 doc = e[0].__doc__
1617 if doc and 'DEPRECATED' in doc and not ui.verbose:
1616 if doc and 'DEPRECATED' in doc and not ui.verbose:
1618 continue
1617 continue
1619 doc = gettext(doc)
1618 doc = gettext(doc)
1620 if not doc:
1619 if not doc:
1621 doc = _("(no help text available)")
1620 doc = _("(no help text available)")
1622 h[f] = doc.splitlines()[0].rstrip()
1621 h[f] = doc.splitlines()[0].rstrip()
1623 cmds[f] = c.lstrip("^")
1622 cmds[f] = c.lstrip("^")
1624
1623
1625 if not h:
1624 if not h:
1626 ui.status(_('no commands defined\n'))
1625 ui.status(_('no commands defined\n'))
1627 return
1626 return
1628
1627
1629 ui.status(header)
1628 ui.status(header)
1630 fns = sorted(h)
1629 fns = sorted(h)
1631 m = max(map(len, fns))
1630 m = max(map(len, fns))
1632 for f in fns:
1631 for f in fns:
1633 if ui.verbose:
1632 if ui.verbose:
1634 commands = cmds[f].replace("|",", ")
1633 commands = cmds[f].replace("|",", ")
1635 ui.write(" %s:\n %s\n"%(commands, h[f]))
1634 ui.write(" %s:\n %s\n"%(commands, h[f]))
1636 else:
1635 else:
1637 ui.write(' %-*s %s\n' % (m, f, util.wrap(h[f], m + 4)))
1636 ui.write(' %-*s %s\n' % (m, f, util.wrap(h[f], m + 4)))
1638
1637
1639 if not ui.quiet:
1638 if not ui.quiet:
1640 addglobalopts(True)
1639 addglobalopts(True)
1641
1640
1642 def helptopic(name):
1641 def helptopic(name):
1643 for names, header, doc in help.helptable:
1642 for names, header, doc in help.helptable:
1644 if name in names:
1643 if name in names:
1645 break
1644 break
1646 else:
1645 else:
1647 raise error.UnknownCommand(name)
1646 raise error.UnknownCommand(name)
1648
1647
1649 # description
1648 # description
1650 if not doc:
1649 if not doc:
1651 doc = _("(no help text available)")
1650 doc = _("(no help text available)")
1652 if hasattr(doc, '__call__'):
1651 if hasattr(doc, '__call__'):
1653 doc = doc()
1652 doc = doc()
1654
1653
1655 ui.write("%s\n\n" % header)
1654 ui.write("%s\n\n" % header)
1656 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1655 ui.write("%s\n" % minirst.format(doc, textwidth, indent=4))
1657
1656
1658 def helpext(name):
1657 def helpext(name):
1659 try:
1658 try:
1660 mod = extensions.find(name)
1659 mod = extensions.find(name)
1661 doc = gettext(mod.__doc__) or _('no help text available')
1660 doc = gettext(mod.__doc__) or _('no help text available')
1662 except KeyError:
1661 except KeyError:
1663 mod = None
1662 mod = None
1664 doc = extensions.disabledext(name)
1663 doc = extensions.disabledext(name)
1665 if not doc:
1664 if not doc:
1666 raise error.UnknownCommand(name)
1665 raise error.UnknownCommand(name)
1667
1666
1668 if '\n' not in doc:
1667 if '\n' not in doc:
1669 head, tail = doc, ""
1668 head, tail = doc, ""
1670 else:
1669 else:
1671 head, tail = doc.split('\n', 1)
1670 head, tail = doc.split('\n', 1)
1672 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1671 ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head))
1673 if tail:
1672 if tail:
1674 ui.write(minirst.format(tail, textwidth))
1673 ui.write(minirst.format(tail, textwidth))
1675 ui.status('\n\n')
1674 ui.status('\n\n')
1676
1675
1677 if mod:
1676 if mod:
1678 try:
1677 try:
1679 ct = mod.cmdtable
1678 ct = mod.cmdtable
1680 except AttributeError:
1679 except AttributeError:
1681 ct = {}
1680 ct = {}
1682 modcmds = set([c.split('|', 1)[0] for c in ct])
1681 modcmds = set([c.split('|', 1)[0] for c in ct])
1683 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1682 helplist(_('list of commands:\n\n'), modcmds.__contains__)
1684 else:
1683 else:
1685 ui.write(_('use "hg help extensions" for information on enabling '
1684 ui.write(_('use "hg help extensions" for information on enabling '
1686 'extensions\n'))
1685 'extensions\n'))
1687
1686
1688 def helpextcmd(name):
1687 def helpextcmd(name):
1689 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1688 cmd, ext, mod = extensions.disabledcmd(name, ui.config('ui', 'strict'))
1690 doc = gettext(mod.__doc__).splitlines()[0]
1689 doc = gettext(mod.__doc__).splitlines()[0]
1691
1690
1692 msg = help.listexts(_("'%s' is provided by the following "
1691 msg = help.listexts(_("'%s' is provided by the following "
1693 "extension:") % cmd, {ext: doc}, len(ext),
1692 "extension:") % cmd, {ext: doc}, len(ext),
1694 indent=4)
1693 indent=4)
1695 ui.write(minirst.format(msg, textwidth))
1694 ui.write(minirst.format(msg, textwidth))
1696 ui.write('\n\n')
1695 ui.write('\n\n')
1697 ui.write(_('use "hg help extensions" for information on enabling '
1696 ui.write(_('use "hg help extensions" for information on enabling '
1698 'extensions\n'))
1697 'extensions\n'))
1699
1698
1700 if name and name != 'shortlist':
1699 if name and name != 'shortlist':
1701 i = None
1700 i = None
1702 if unknowncmd:
1701 if unknowncmd:
1703 queries = (helpextcmd,)
1702 queries = (helpextcmd,)
1704 else:
1703 else:
1705 queries = (helptopic, helpcmd, helpext, helpextcmd)
1704 queries = (helptopic, helpcmd, helpext, helpextcmd)
1706 for f in queries:
1705 for f in queries:
1707 try:
1706 try:
1708 f(name)
1707 f(name)
1709 i = None
1708 i = None
1710 break
1709 break
1711 except error.UnknownCommand, inst:
1710 except error.UnknownCommand, inst:
1712 i = inst
1711 i = inst
1713 if i:
1712 if i:
1714 raise i
1713 raise i
1715
1714
1716 else:
1715 else:
1717 # program name
1716 # program name
1718 if ui.verbose or with_version:
1717 if ui.verbose or with_version:
1719 version_(ui)
1718 version_(ui)
1720 else:
1719 else:
1721 ui.status(_("Mercurial Distributed SCM\n"))
1720 ui.status(_("Mercurial Distributed SCM\n"))
1722 ui.status('\n')
1721 ui.status('\n')
1723
1722
1724 # list of commands
1723 # list of commands
1725 if name == "shortlist":
1724 if name == "shortlist":
1726 header = _('basic commands:\n\n')
1725 header = _('basic commands:\n\n')
1727 else:
1726 else:
1728 header = _('list of commands:\n\n')
1727 header = _('list of commands:\n\n')
1729
1728
1730 helplist(header)
1729 helplist(header)
1731 if name != 'shortlist':
1730 if name != 'shortlist':
1732 exts, maxlength = extensions.enabled()
1731 exts, maxlength = extensions.enabled()
1733 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1732 text = help.listexts(_('enabled extensions:'), exts, maxlength)
1734 if text:
1733 if text:
1735 ui.write("\n%s\n" % minirst.format(text, textwidth))
1734 ui.write("\n%s\n" % minirst.format(text, textwidth))
1736
1735
1737 # list all option lists
1736 # list all option lists
1738 opt_output = []
1737 opt_output = []
1739 for title, options in option_lists:
1738 for title, options in option_lists:
1740 opt_output.append(("\n%s" % title, None))
1739 opt_output.append(("\n%s" % title, None))
1741 for shortopt, longopt, default, desc in options:
1740 for shortopt, longopt, default, desc in options:
1742 if _("DEPRECATED") in desc and not ui.verbose:
1741 if _("DEPRECATED") in desc and not ui.verbose:
1743 continue
1742 continue
1744 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1743 opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
1745 longopt and " --%s" % longopt),
1744 longopt and " --%s" % longopt),
1746 "%s%s" % (desc,
1745 "%s%s" % (desc,
1747 default
1746 default
1748 and _(" (default: %s)") % default
1747 and _(" (default: %s)") % default
1749 or "")))
1748 or "")))
1750
1749
1751 if not name:
1750 if not name:
1752 ui.write(_("\nadditional help topics:\n\n"))
1751 ui.write(_("\nadditional help topics:\n\n"))
1753 topics = []
1752 topics = []
1754 for names, header, doc in help.helptable:
1753 for names, header, doc in help.helptable:
1755 topics.append((sorted(names, key=len, reverse=True)[0], header))
1754 topics.append((sorted(names, key=len, reverse=True)[0], header))
1756 topics_len = max([len(s[0]) for s in topics])
1755 topics_len = max([len(s[0]) for s in topics])
1757 for t, desc in topics:
1756 for t, desc in topics:
1758 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1757 ui.write(" %-*s %s\n" % (topics_len, t, desc))
1759
1758
1760 if opt_output:
1759 if opt_output:
1761 opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
1760 opts_len = max([len(line[0]) for line in opt_output if line[1]] or [0])
1762 for first, second in opt_output:
1761 for first, second in opt_output:
1763 if second:
1762 if second:
1764 second = util.wrap(second, opts_len + 3)
1763 second = util.wrap(second, opts_len + 3)
1765 ui.write(" %-*s %s\n" % (opts_len, first, second))
1764 ui.write(" %-*s %s\n" % (opts_len, first, second))
1766 else:
1765 else:
1767 ui.write("%s\n" % first)
1766 ui.write("%s\n" % first)
1768
1767
1769 def identify(ui, repo, source=None,
1768 def identify(ui, repo, source=None,
1770 rev=None, num=None, id=None, branch=None, tags=None):
1769 rev=None, num=None, id=None, branch=None, tags=None):
1771 """identify the working copy or specified revision
1770 """identify the working copy or specified revision
1772
1771
1773 With no revision, print a summary of the current state of the
1772 With no revision, print a summary of the current state of the
1774 repository.
1773 repository.
1775
1774
1776 Specifying a path to a repository root or Mercurial bundle will
1775 Specifying a path to a repository root or Mercurial bundle will
1777 cause lookup to operate on that repository/bundle.
1776 cause lookup to operate on that repository/bundle.
1778
1777
1779 This summary identifies the repository state using one or two
1778 This summary identifies the repository state using one or two
1780 parent hash identifiers, followed by a "+" if there are
1779 parent hash identifiers, followed by a "+" if there are
1781 uncommitted changes in the working directory, a list of tags for
1780 uncommitted changes in the working directory, a list of tags for
1782 this revision and a branch name for non-default branches.
1781 this revision and a branch name for non-default branches.
1783 """
1782 """
1784
1783
1785 if not repo and not source:
1784 if not repo and not source:
1786 raise util.Abort(_("There is no Mercurial repository here "
1785 raise util.Abort(_("There is no Mercurial repository here "
1787 "(.hg not found)"))
1786 "(.hg not found)"))
1788
1787
1789 hexfunc = ui.debugflag and hex or short
1788 hexfunc = ui.debugflag and hex or short
1790 default = not (num or id or branch or tags)
1789 default = not (num or id or branch or tags)
1791 output = []
1790 output = []
1792
1791
1793 revs = []
1792 revs = []
1794 if source:
1793 if source:
1795 source, branches = hg.parseurl(ui.expandpath(source))
1794 source, branches = hg.parseurl(ui.expandpath(source))
1796 repo = hg.repository(ui, source)
1795 repo = hg.repository(ui, source)
1797 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1796 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
1798
1797
1799 if not repo.local():
1798 if not repo.local():
1800 if not rev and revs:
1799 if not rev and revs:
1801 rev = revs[0]
1800 rev = revs[0]
1802 if not rev:
1801 if not rev:
1803 rev = "tip"
1802 rev = "tip"
1804 if num or branch or tags:
1803 if num or branch or tags:
1805 raise util.Abort(
1804 raise util.Abort(
1806 "can't query remote revision number, branch, or tags")
1805 "can't query remote revision number, branch, or tags")
1807 output = [hexfunc(repo.lookup(rev))]
1806 output = [hexfunc(repo.lookup(rev))]
1808 elif not rev:
1807 elif not rev:
1809 ctx = repo[None]
1808 ctx = repo[None]
1810 parents = ctx.parents()
1809 parents = ctx.parents()
1811 changed = False
1810 changed = False
1812 if default or id or num:
1811 if default or id or num:
1813 changed = util.any(repo.status())
1812 changed = util.any(repo.status())
1814 if default or id:
1813 if default or id:
1815 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1814 output = ["%s%s" % ('+'.join([hexfunc(p.node()) for p in parents]),
1816 (changed) and "+" or "")]
1815 (changed) and "+" or "")]
1817 if num:
1816 if num:
1818 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
1817 output.append("%s%s" % ('+'.join([str(p.rev()) for p in parents]),
1819 (changed) and "+" or ""))
1818 (changed) and "+" or ""))
1820 else:
1819 else:
1821 ctx = repo[rev]
1820 ctx = repo[rev]
1822 if default or id:
1821 if default or id:
1823 output = [hexfunc(ctx.node())]
1822 output = [hexfunc(ctx.node())]
1824 if num:
1823 if num:
1825 output.append(str(ctx.rev()))
1824 output.append(str(ctx.rev()))
1826
1825
1827 if repo.local() and default and not ui.quiet:
1826 if repo.local() and default and not ui.quiet:
1828 b = encoding.tolocal(ctx.branch())
1827 b = encoding.tolocal(ctx.branch())
1829 if b != 'default':
1828 if b != 'default':
1830 output.append("(%s)" % b)
1829 output.append("(%s)" % b)
1831
1830
1832 # multiple tags for a single parent separated by '/'
1831 # multiple tags for a single parent separated by '/'
1833 t = "/".join(ctx.tags())
1832 t = "/".join(ctx.tags())
1834 if t:
1833 if t:
1835 output.append(t)
1834 output.append(t)
1836
1835
1837 if branch:
1836 if branch:
1838 output.append(encoding.tolocal(ctx.branch()))
1837 output.append(encoding.tolocal(ctx.branch()))
1839
1838
1840 if tags:
1839 if tags:
1841 output.extend(ctx.tags())
1840 output.extend(ctx.tags())
1842
1841
1843 ui.write("%s\n" % ' '.join(output))
1842 ui.write("%s\n" % ' '.join(output))
1844
1843
1845 def import_(ui, repo, patch1, *patches, **opts):
1844 def import_(ui, repo, patch1, *patches, **opts):
1846 """import an ordered set of patches
1845 """import an ordered set of patches
1847
1846
1848 Import a list of patches and commit them individually (unless
1847 Import a list of patches and commit them individually (unless
1849 --no-commit is specified).
1848 --no-commit is specified).
1850
1849
1851 If there are outstanding changes in the working directory, import
1850 If there are outstanding changes in the working directory, import
1852 will abort unless given the -f/--force flag.
1851 will abort unless given the -f/--force flag.
1853
1852
1854 You can import a patch straight from a mail message. Even patches
1853 You can import a patch straight from a mail message. Even patches
1855 as attachments work (to use the body part, it must have type
1854 as attachments work (to use the body part, it must have type
1856 text/plain or text/x-patch). From and Subject headers of email
1855 text/plain or text/x-patch). From and Subject headers of email
1857 message are used as default committer and commit message. All
1856 message are used as default committer and commit message. All
1858 text/plain body parts before first diff are added to commit
1857 text/plain body parts before first diff are added to commit
1859 message.
1858 message.
1860
1859
1861 If the imported patch was generated by hg export, user and
1860 If the imported patch was generated by hg export, user and
1862 description from patch override values from message headers and
1861 description from patch override values from message headers and
1863 body. Values given on command line with -m/--message and -u/--user
1862 body. Values given on command line with -m/--message and -u/--user
1864 override these.
1863 override these.
1865
1864
1866 If --exact is specified, import will set the working directory to
1865 If --exact is specified, import will set the working directory to
1867 the parent of each patch before applying it, and will abort if the
1866 the parent of each patch before applying it, and will abort if the
1868 resulting changeset has a different ID than the one recorded in
1867 resulting changeset has a different ID than the one recorded in
1869 the patch. This may happen due to character set problems or other
1868 the patch. This may happen due to character set problems or other
1870 deficiencies in the text patch format.
1869 deficiencies in the text patch format.
1871
1870
1872 With -s/--similarity, hg will attempt to discover renames and
1871 With -s/--similarity, hg will attempt to discover renames and
1873 copies in the patch in the same way as 'addremove'.
1872 copies in the patch in the same way as 'addremove'.
1874
1873
1875 To read a patch from standard input, use "-" as the patch name. If
1874 To read a patch from standard input, use "-" as the patch name. If
1876 a URL is specified, the patch will be downloaded from it.
1875 a URL is specified, the patch will be downloaded from it.
1877 See :hg:`help dates` for a list of formats valid for -d/--date.
1876 See :hg:`help dates` for a list of formats valid for -d/--date.
1878 """
1877 """
1879 patches = (patch1,) + patches
1878 patches = (patch1,) + patches
1880
1879
1881 date = opts.get('date')
1880 date = opts.get('date')
1882 if date:
1881 if date:
1883 opts['date'] = util.parsedate(date)
1882 opts['date'] = util.parsedate(date)
1884
1883
1885 try:
1884 try:
1886 sim = float(opts.get('similarity') or 0)
1885 sim = float(opts.get('similarity') or 0)
1887 except ValueError:
1886 except ValueError:
1888 raise util.Abort(_('similarity must be a number'))
1887 raise util.Abort(_('similarity must be a number'))
1889 if sim < 0 or sim > 100:
1888 if sim < 0 or sim > 100:
1890 raise util.Abort(_('similarity must be between 0 and 100'))
1889 raise util.Abort(_('similarity must be between 0 and 100'))
1891
1890
1892 if opts.get('exact') or not opts.get('force'):
1891 if opts.get('exact') or not opts.get('force'):
1893 cmdutil.bail_if_changed(repo)
1892 cmdutil.bail_if_changed(repo)
1894
1893
1895 d = opts["base"]
1894 d = opts["base"]
1896 strip = opts["strip"]
1895 strip = opts["strip"]
1897 wlock = lock = None
1896 wlock = lock = None
1898
1897
1899 def tryone(ui, hunk):
1898 def tryone(ui, hunk):
1900 tmpname, message, user, date, branch, nodeid, p1, p2 = \
1899 tmpname, message, user, date, branch, nodeid, p1, p2 = \
1901 patch.extract(ui, hunk)
1900 patch.extract(ui, hunk)
1902
1901
1903 if not tmpname:
1902 if not tmpname:
1904 return None
1903 return None
1905 commitid = _('to working directory')
1904 commitid = _('to working directory')
1906
1905
1907 try:
1906 try:
1908 cmdline_message = cmdutil.logmessage(opts)
1907 cmdline_message = cmdutil.logmessage(opts)
1909 if cmdline_message:
1908 if cmdline_message:
1910 # pickup the cmdline msg
1909 # pickup the cmdline msg
1911 message = cmdline_message
1910 message = cmdline_message
1912 elif message:
1911 elif message:
1913 # pickup the patch msg
1912 # pickup the patch msg
1914 message = message.strip()
1913 message = message.strip()
1915 else:
1914 else:
1916 # launch the editor
1915 # launch the editor
1917 message = None
1916 message = None
1918 ui.debug('message:\n%s\n' % message)
1917 ui.debug('message:\n%s\n' % message)
1919
1918
1920 wp = repo.parents()
1919 wp = repo.parents()
1921 if opts.get('exact'):
1920 if opts.get('exact'):
1922 if not nodeid or not p1:
1921 if not nodeid or not p1:
1923 raise util.Abort(_('not a Mercurial patch'))
1922 raise util.Abort(_('not a Mercurial patch'))
1924 p1 = repo.lookup(p1)
1923 p1 = repo.lookup(p1)
1925 p2 = repo.lookup(p2 or hex(nullid))
1924 p2 = repo.lookup(p2 or hex(nullid))
1926
1925
1927 if p1 != wp[0].node():
1926 if p1 != wp[0].node():
1928 hg.clean(repo, p1)
1927 hg.clean(repo, p1)
1929 repo.dirstate.setparents(p1, p2)
1928 repo.dirstate.setparents(p1, p2)
1930 elif p2:
1929 elif p2:
1931 try:
1930 try:
1932 p1 = repo.lookup(p1)
1931 p1 = repo.lookup(p1)
1933 p2 = repo.lookup(p2)
1932 p2 = repo.lookup(p2)
1934 if p1 == wp[0].node():
1933 if p1 == wp[0].node():
1935 repo.dirstate.setparents(p1, p2)
1934 repo.dirstate.setparents(p1, p2)
1936 except error.RepoError:
1935 except error.RepoError:
1937 pass
1936 pass
1938 if opts.get('exact') or opts.get('import_branch'):
1937 if opts.get('exact') or opts.get('import_branch'):
1939 repo.dirstate.setbranch(branch or 'default')
1938 repo.dirstate.setbranch(branch or 'default')
1940
1939
1941 files = {}
1940 files = {}
1942 try:
1941 try:
1943 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1942 patch.patch(tmpname, ui, strip=strip, cwd=repo.root,
1944 files=files, eolmode=None)
1943 files=files, eolmode=None)
1945 finally:
1944 finally:
1946 files = patch.updatedir(ui, repo, files,
1945 files = patch.updatedir(ui, repo, files,
1947 similarity=sim / 100.0)
1946 similarity=sim / 100.0)
1948 if not opts.get('no_commit'):
1947 if not opts.get('no_commit'):
1949 if opts.get('exact'):
1948 if opts.get('exact'):
1950 m = None
1949 m = None
1951 else:
1950 else:
1952 m = cmdutil.matchfiles(repo, files or [])
1951 m = cmdutil.matchfiles(repo, files or [])
1953 n = repo.commit(message, opts.get('user') or user,
1952 n = repo.commit(message, opts.get('user') or user,
1954 opts.get('date') or date, match=m,
1953 opts.get('date') or date, match=m,
1955 editor=cmdutil.commiteditor)
1954 editor=cmdutil.commiteditor)
1956 if opts.get('exact'):
1955 if opts.get('exact'):
1957 if hex(n) != nodeid:
1956 if hex(n) != nodeid:
1958 repo.rollback()
1957 repo.rollback()
1959 raise util.Abort(_('patch is damaged'
1958 raise util.Abort(_('patch is damaged'
1960 ' or loses information'))
1959 ' or loses information'))
1961 # Force a dirstate write so that the next transaction
1960 # Force a dirstate write so that the next transaction
1962 # backups an up-do-date file.
1961 # backups an up-do-date file.
1963 repo.dirstate.write()
1962 repo.dirstate.write()
1964 if n:
1963 if n:
1965 commitid = short(n)
1964 commitid = short(n)
1966
1965
1967 return commitid
1966 return commitid
1968 finally:
1967 finally:
1969 os.unlink(tmpname)
1968 os.unlink(tmpname)
1970
1969
1971 try:
1970 try:
1972 wlock = repo.wlock()
1971 wlock = repo.wlock()
1973 lock = repo.lock()
1972 lock = repo.lock()
1974 lastcommit = None
1973 lastcommit = None
1975 for p in patches:
1974 for p in patches:
1976 pf = os.path.join(d, p)
1975 pf = os.path.join(d, p)
1977
1976
1978 if pf == '-':
1977 if pf == '-':
1979 ui.status(_("applying patch from stdin\n"))
1978 ui.status(_("applying patch from stdin\n"))
1980 pf = sys.stdin
1979 pf = sys.stdin
1981 else:
1980 else:
1982 ui.status(_("applying %s\n") % p)
1981 ui.status(_("applying %s\n") % p)
1983 pf = url.open(ui, pf)
1982 pf = url.open(ui, pf)
1984
1983
1985 haspatch = False
1984 haspatch = False
1986 for hunk in patch.split(pf):
1985 for hunk in patch.split(pf):
1987 commitid = tryone(ui, hunk)
1986 commitid = tryone(ui, hunk)
1988 if commitid:
1987 if commitid:
1989 haspatch = True
1988 haspatch = True
1990 if lastcommit:
1989 if lastcommit:
1991 ui.status(_('applied %s\n') % lastcommit)
1990 ui.status(_('applied %s\n') % lastcommit)
1992 lastcommit = commitid
1991 lastcommit = commitid
1993
1992
1994 if not haspatch:
1993 if not haspatch:
1995 raise util.Abort(_('no diffs found'))
1994 raise util.Abort(_('no diffs found'))
1996
1995
1997 finally:
1996 finally:
1998 release(lock, wlock)
1997 release(lock, wlock)
1999
1998
2000 def incoming(ui, repo, source="default", **opts):
1999 def incoming(ui, repo, source="default", **opts):
2001 """show new changesets found in source
2000 """show new changesets found in source
2002
2001
2003 Show new changesets found in the specified path/URL or the default
2002 Show new changesets found in the specified path/URL or the default
2004 pull location. These are the changesets that would have been pulled
2003 pull location. These are the changesets that would have been pulled
2005 if a pull at the time you issued this command.
2004 if a pull at the time you issued this command.
2006
2005
2007 For remote repository, using --bundle avoids downloading the
2006 For remote repository, using --bundle avoids downloading the
2008 changesets twice if the incoming is followed by a pull.
2007 changesets twice if the incoming is followed by a pull.
2009
2008
2010 See pull for valid source format details.
2009 See pull for valid source format details.
2011 """
2010 """
2012 limit = cmdutil.loglimit(opts)
2011 limit = cmdutil.loglimit(opts)
2013 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2012 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2014 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2013 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2015 ui.status(_('comparing with %s\n') % url.hidepassword(source))
2014 ui.status(_('comparing with %s\n') % url.hidepassword(source))
2016 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2015 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2017 if revs:
2016 if revs:
2018 revs = [other.lookup(rev) for rev in revs]
2017 revs = [other.lookup(rev) for rev in revs]
2019 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
2018 common, incoming, rheads = repo.findcommonincoming(other, heads=revs,
2020 force=opts["force"])
2019 force=opts["force"])
2021 if not incoming:
2020 if not incoming:
2022 try:
2021 try:
2023 os.unlink(opts["bundle"])
2022 os.unlink(opts["bundle"])
2024 except:
2023 except:
2025 pass
2024 pass
2026 ui.status(_("no changes found\n"))
2025 ui.status(_("no changes found\n"))
2027 return 1
2026 return 1
2028
2027
2029 cleanup = None
2028 cleanup = None
2030 try:
2029 try:
2031 fname = opts["bundle"]
2030 fname = opts["bundle"]
2032 if fname or not other.local():
2031 if fname or not other.local():
2033 # create a bundle (uncompressed if other repo is not local)
2032 # create a bundle (uncompressed if other repo is not local)
2034
2033
2035 if revs is None and other.capable('changegroupsubset'):
2034 if revs is None and other.capable('changegroupsubset'):
2036 revs = rheads
2035 revs = rheads
2037
2036
2038 if revs is None:
2037 if revs is None:
2039 cg = other.changegroup(incoming, "incoming")
2038 cg = other.changegroup(incoming, "incoming")
2040 else:
2039 else:
2041 cg = other.changegroupsubset(incoming, revs, 'incoming')
2040 cg = other.changegroupsubset(incoming, revs, 'incoming')
2042 bundletype = other.local() and "HG10BZ" or "HG10UN"
2041 bundletype = other.local() and "HG10BZ" or "HG10UN"
2043 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
2042 fname = cleanup = changegroup.writebundle(cg, fname, bundletype)
2044 # keep written bundle?
2043 # keep written bundle?
2045 if opts["bundle"]:
2044 if opts["bundle"]:
2046 cleanup = None
2045 cleanup = None
2047 if not other.local():
2046 if not other.local():
2048 # use the created uncompressed bundlerepo
2047 # use the created uncompressed bundlerepo
2049 other = bundlerepo.bundlerepository(ui, repo.root, fname)
2048 other = bundlerepo.bundlerepository(ui, repo.root, fname)
2050
2049
2051 o = other.changelog.nodesbetween(incoming, revs)[0]
2050 o = other.changelog.nodesbetween(incoming, revs)[0]
2052 if opts.get('newest_first'):
2051 if opts.get('newest_first'):
2053 o.reverse()
2052 o.reverse()
2054 displayer = cmdutil.show_changeset(ui, other, opts)
2053 displayer = cmdutil.show_changeset(ui, other, opts)
2055 count = 0
2054 count = 0
2056 for n in o:
2055 for n in o:
2057 if limit is not None and count >= limit:
2056 if limit is not None and count >= limit:
2058 break
2057 break
2059 parents = [p for p in other.changelog.parents(n) if p != nullid]
2058 parents = [p for p in other.changelog.parents(n) if p != nullid]
2060 if opts.get('no_merges') and len(parents) == 2:
2059 if opts.get('no_merges') and len(parents) == 2:
2061 continue
2060 continue
2062 count += 1
2061 count += 1
2063 displayer.show(other[n])
2062 displayer.show(other[n])
2064 displayer.close()
2063 displayer.close()
2065 finally:
2064 finally:
2066 if hasattr(other, 'close'):
2065 if hasattr(other, 'close'):
2067 other.close()
2066 other.close()
2068 if cleanup:
2067 if cleanup:
2069 os.unlink(cleanup)
2068 os.unlink(cleanup)
2070
2069
2071 def init(ui, dest=".", **opts):
2070 def init(ui, dest=".", **opts):
2072 """create a new repository in the given directory
2071 """create a new repository in the given directory
2073
2072
2074 Initialize a new repository in the given directory. If the given
2073 Initialize a new repository in the given directory. If the given
2075 directory does not exist, it will be created.
2074 directory does not exist, it will be created.
2076
2075
2077 If no directory is given, the current directory is used.
2076 If no directory is given, the current directory is used.
2078
2077
2079 It is possible to specify an ``ssh://`` URL as the destination.
2078 It is possible to specify an ``ssh://`` URL as the destination.
2080 See :hg:`help urls` for more information.
2079 See :hg:`help urls` for more information.
2081 """
2080 """
2082 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
2081 hg.repository(cmdutil.remoteui(ui, opts), dest, create=1)
2083
2082
2084 def locate(ui, repo, *pats, **opts):
2083 def locate(ui, repo, *pats, **opts):
2085 """locate files matching specific patterns
2084 """locate files matching specific patterns
2086
2085
2087 Print files under Mercurial control in the working directory whose
2086 Print files under Mercurial control in the working directory whose
2088 names match the given patterns.
2087 names match the given patterns.
2089
2088
2090 By default, this command searches all directories in the working
2089 By default, this command searches all directories in the working
2091 directory. To search just the current directory and its
2090 directory. To search just the current directory and its
2092 subdirectories, use "--include .".
2091 subdirectories, use "--include .".
2093
2092
2094 If no patterns are given to match, this command prints the names
2093 If no patterns are given to match, this command prints the names
2095 of all files under Mercurial control in the working directory.
2094 of all files under Mercurial control in the working directory.
2096
2095
2097 If you want to feed the output of this command into the "xargs"
2096 If you want to feed the output of this command into the "xargs"
2098 command, use the -0 option to both this command and "xargs". This
2097 command, use the -0 option to both this command and "xargs". This
2099 will avoid the problem of "xargs" treating single filenames that
2098 will avoid the problem of "xargs" treating single filenames that
2100 contain whitespace as multiple filenames.
2099 contain whitespace as multiple filenames.
2101 """
2100 """
2102 end = opts.get('print0') and '\0' or '\n'
2101 end = opts.get('print0') and '\0' or '\n'
2103 rev = opts.get('rev') or None
2102 rev = opts.get('rev') or None
2104
2103
2105 ret = 1
2104 ret = 1
2106 m = cmdutil.match(repo, pats, opts, default='relglob')
2105 m = cmdutil.match(repo, pats, opts, default='relglob')
2107 m.bad = lambda x, y: False
2106 m.bad = lambda x, y: False
2108 for abs in repo[rev].walk(m):
2107 for abs in repo[rev].walk(m):
2109 if not rev and abs not in repo.dirstate:
2108 if not rev and abs not in repo.dirstate:
2110 continue
2109 continue
2111 if opts.get('fullpath'):
2110 if opts.get('fullpath'):
2112 ui.write(repo.wjoin(abs), end)
2111 ui.write(repo.wjoin(abs), end)
2113 else:
2112 else:
2114 ui.write(((pats and m.rel(abs)) or abs), end)
2113 ui.write(((pats and m.rel(abs)) or abs), end)
2115 ret = 0
2114 ret = 0
2116
2115
2117 return ret
2116 return ret
2118
2117
2119 def log(ui, repo, *pats, **opts):
2118 def log(ui, repo, *pats, **opts):
2120 """show revision history of entire repository or files
2119 """show revision history of entire repository or files
2121
2120
2122 Print the revision history of the specified files or the entire
2121 Print the revision history of the specified files or the entire
2123 project.
2122 project.
2124
2123
2125 File history is shown without following rename or copy history of
2124 File history is shown without following rename or copy history of
2126 files. Use -f/--follow with a filename to follow history across
2125 files. Use -f/--follow with a filename to follow history across
2127 renames and copies. --follow without a filename will only show
2126 renames and copies. --follow without a filename will only show
2128 ancestors or descendants of the starting revision. --follow-first
2127 ancestors or descendants of the starting revision. --follow-first
2129 only follows the first parent of merge revisions.
2128 only follows the first parent of merge revisions.
2130
2129
2131 If no revision range is specified, the default is tip:0 unless
2130 If no revision range is specified, the default is tip:0 unless
2132 --follow is set, in which case the working directory parent is
2131 --follow is set, in which case the working directory parent is
2133 used as the starting revision.
2132 used as the starting revision.
2134
2133
2135 See :hg:`help dates` for a list of formats valid for -d/--date.
2134 See :hg:`help dates` for a list of formats valid for -d/--date.
2136
2135
2137 By default this command prints revision number and changeset id,
2136 By default this command prints revision number and changeset id,
2138 tags, non-trivial parents, user, date and time, and a summary for
2137 tags, non-trivial parents, user, date and time, and a summary for
2139 each commit. When the -v/--verbose switch is used, the list of
2138 each commit. When the -v/--verbose switch is used, the list of
2140 changed files and full commit message are shown.
2139 changed files and full commit message are shown.
2141
2140
2142 NOTE: log -p/--patch may generate unexpected diff output for merge
2141 NOTE: log -p/--patch may generate unexpected diff output for merge
2143 changesets, as it will only compare the merge changeset against
2142 changesets, as it will only compare the merge changeset against
2144 its first parent. Also, only files different from BOTH parents
2143 its first parent. Also, only files different from BOTH parents
2145 will appear in files:.
2144 will appear in files:.
2146 """
2145 """
2147
2146
2148 matchfn = cmdutil.match(repo, pats, opts)
2147 matchfn = cmdutil.match(repo, pats, opts)
2149 limit = cmdutil.loglimit(opts)
2148 limit = cmdutil.loglimit(opts)
2150 count = 0
2149 count = 0
2151
2150
2152 endrev = None
2151 endrev = None
2153 if opts.get('copies') and opts.get('rev'):
2152 if opts.get('copies') and opts.get('rev'):
2154 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2153 endrev = max(cmdutil.revrange(repo, opts.get('rev'))) + 1
2155
2154
2156 df = False
2155 df = False
2157 if opts["date"]:
2156 if opts["date"]:
2158 df = util.matchdate(opts["date"])
2157 df = util.matchdate(opts["date"])
2159
2158
2160 branches = opts.get('branch', []) + opts.get('only_branch', [])
2159 branches = opts.get('branch', []) + opts.get('only_branch', [])
2161 opts['branch'] = [repo.lookupbranch(b) for b in branches]
2160 opts['branch'] = [repo.lookupbranch(b) for b in branches]
2162
2161
2163 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2162 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2164 def prep(ctx, fns):
2163 def prep(ctx, fns):
2165 rev = ctx.rev()
2164 rev = ctx.rev()
2166 parents = [p for p in repo.changelog.parentrevs(rev)
2165 parents = [p for p in repo.changelog.parentrevs(rev)
2167 if p != nullrev]
2166 if p != nullrev]
2168 if opts.get('no_merges') and len(parents) == 2:
2167 if opts.get('no_merges') and len(parents) == 2:
2169 return
2168 return
2170 if opts.get('only_merges') and len(parents) != 2:
2169 if opts.get('only_merges') and len(parents) != 2:
2171 return
2170 return
2172 if opts.get('branch') and ctx.branch() not in opts['branch']:
2171 if opts.get('branch') and ctx.branch() not in opts['branch']:
2173 return
2172 return
2174 if df and not df(ctx.date()[0]):
2173 if df and not df(ctx.date()[0]):
2175 return
2174 return
2176 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2175 if opts['user'] and not [k for k in opts['user'] if k in ctx.user()]:
2177 return
2176 return
2178 if opts.get('keyword'):
2177 if opts.get('keyword'):
2179 for k in [kw.lower() for kw in opts['keyword']]:
2178 for k in [kw.lower() for kw in opts['keyword']]:
2180 if (k in ctx.user().lower() or
2179 if (k in ctx.user().lower() or
2181 k in ctx.description().lower() or
2180 k in ctx.description().lower() or
2182 k in " ".join(ctx.files()).lower()):
2181 k in " ".join(ctx.files()).lower()):
2183 break
2182 break
2184 else:
2183 else:
2185 return
2184 return
2186
2185
2187 copies = None
2186 copies = None
2188 if opts.get('copies') and rev:
2187 if opts.get('copies') and rev:
2189 copies = []
2188 copies = []
2190 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2189 getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
2191 for fn in ctx.files():
2190 for fn in ctx.files():
2192 rename = getrenamed(fn, rev)
2191 rename = getrenamed(fn, rev)
2193 if rename:
2192 if rename:
2194 copies.append((fn, rename[0]))
2193 copies.append((fn, rename[0]))
2195
2194
2196 displayer.show(ctx, copies=copies)
2195 displayer.show(ctx, copies=copies)
2197
2196
2198 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2197 for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
2199 if count == limit:
2198 if count == limit:
2200 break
2199 break
2201 if displayer.flush(ctx.rev()):
2200 if displayer.flush(ctx.rev()):
2202 count += 1
2201 count += 1
2203 displayer.close()
2202 displayer.close()
2204
2203
2205 def manifest(ui, repo, node=None, rev=None):
2204 def manifest(ui, repo, node=None, rev=None):
2206 """output the current or given revision of the project manifest
2205 """output the current or given revision of the project manifest
2207
2206
2208 Print a list of version controlled files for the given revision.
2207 Print a list of version controlled files for the given revision.
2209 If no revision is given, the first parent of the working directory
2208 If no revision is given, the first parent of the working directory
2210 is used, or the null revision if no revision is checked out.
2209 is used, or the null revision if no revision is checked out.
2211
2210
2212 With -v, print file permissions, symlink and executable bits.
2211 With -v, print file permissions, symlink and executable bits.
2213 With --debug, print file revision hashes.
2212 With --debug, print file revision hashes.
2214 """
2213 """
2215
2214
2216 if rev and node:
2215 if rev and node:
2217 raise util.Abort(_("please specify just one revision"))
2216 raise util.Abort(_("please specify just one revision"))
2218
2217
2219 if not node:
2218 if not node:
2220 node = rev
2219 node = rev
2221
2220
2222 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2221 decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
2223 ctx = repo[node]
2222 ctx = repo[node]
2224 for f in ctx:
2223 for f in ctx:
2225 if ui.debugflag:
2224 if ui.debugflag:
2226 ui.write("%40s " % hex(ctx.manifest()[f]))
2225 ui.write("%40s " % hex(ctx.manifest()[f]))
2227 if ui.verbose:
2226 if ui.verbose:
2228 ui.write(decor[ctx.flags(f)])
2227 ui.write(decor[ctx.flags(f)])
2229 ui.write("%s\n" % f)
2228 ui.write("%s\n" % f)
2230
2229
2231 def merge(ui, repo, node=None, **opts):
2230 def merge(ui, repo, node=None, **opts):
2232 """merge working directory with another revision
2231 """merge working directory with another revision
2233
2232
2234 The current working directory is updated with all changes made in
2233 The current working directory is updated with all changes made in
2235 the requested revision since the last common predecessor revision.
2234 the requested revision since the last common predecessor revision.
2236
2235
2237 Files that changed between either parent are marked as changed for
2236 Files that changed between either parent are marked as changed for
2238 the next commit and a commit must be performed before any further
2237 the next commit and a commit must be performed before any further
2239 updates to the repository are allowed. The next commit will have
2238 updates to the repository are allowed. The next commit will have
2240 two parents.
2239 two parents.
2241
2240
2242 If no revision is specified, the working directory's parent is a
2241 If no revision is specified, the working directory's parent is a
2243 head revision, and the current branch contains exactly one other
2242 head revision, and the current branch contains exactly one other
2244 head, the other head is merged with by default. Otherwise, an
2243 head, the other head is merged with by default. Otherwise, an
2245 explicit revision with which to merge with must be provided.
2244 explicit revision with which to merge with must be provided.
2246 """
2245 """
2247
2246
2248 if opts.get('rev') and node:
2247 if opts.get('rev') and node:
2249 raise util.Abort(_("please specify just one revision"))
2248 raise util.Abort(_("please specify just one revision"))
2250 if not node:
2249 if not node:
2251 node = opts.get('rev')
2250 node = opts.get('rev')
2252
2251
2253 if not node:
2252 if not node:
2254 branch = repo.changectx(None).branch()
2253 branch = repo.changectx(None).branch()
2255 bheads = repo.branchheads(branch)
2254 bheads = repo.branchheads(branch)
2256 if len(bheads) > 2:
2255 if len(bheads) > 2:
2257 ui.warn(_("abort: branch '%s' has %d heads - "
2256 ui.warn(_("abort: branch '%s' has %d heads - "
2258 "please merge with an explicit rev\n")
2257 "please merge with an explicit rev\n")
2259 % (branch, len(bheads)))
2258 % (branch, len(bheads)))
2260 ui.status(_("(run 'hg heads .' to see heads)\n"))
2259 ui.status(_("(run 'hg heads .' to see heads)\n"))
2261 return False
2260 return False
2262
2261
2263 parent = repo.dirstate.parents()[0]
2262 parent = repo.dirstate.parents()[0]
2264 if len(bheads) == 1:
2263 if len(bheads) == 1:
2265 if len(repo.heads()) > 1:
2264 if len(repo.heads()) > 1:
2266 ui.warn(_("abort: branch '%s' has one head - "
2265 ui.warn(_("abort: branch '%s' has one head - "
2267 "please merge with an explicit rev\n" % branch))
2266 "please merge with an explicit rev\n" % branch))
2268 ui.status(_("(run 'hg heads' to see all heads)\n"))
2267 ui.status(_("(run 'hg heads' to see all heads)\n"))
2269 return False
2268 return False
2270 msg = _('there is nothing to merge')
2269 msg = _('there is nothing to merge')
2271 if parent != repo.lookup(repo[None].branch()):
2270 if parent != repo.lookup(repo[None].branch()):
2272 msg = _('%s - use "hg update" instead') % msg
2271 msg = _('%s - use "hg update" instead') % msg
2273 raise util.Abort(msg)
2272 raise util.Abort(msg)
2274
2273
2275 if parent not in bheads:
2274 if parent not in bheads:
2276 raise util.Abort(_('working dir not at a head rev - '
2275 raise util.Abort(_('working dir not at a head rev - '
2277 'use "hg update" or merge with an explicit rev'))
2276 'use "hg update" or merge with an explicit rev'))
2278 node = parent == bheads[0] and bheads[-1] or bheads[0]
2277 node = parent == bheads[0] and bheads[-1] or bheads[0]
2279
2278
2280 if opts.get('preview'):
2279 if opts.get('preview'):
2281 # find nodes that are ancestors of p2 but not of p1
2280 # find nodes that are ancestors of p2 but not of p1
2282 p1 = repo.lookup('.')
2281 p1 = repo.lookup('.')
2283 p2 = repo.lookup(node)
2282 p2 = repo.lookup(node)
2284 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2283 nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
2285
2284
2286 displayer = cmdutil.show_changeset(ui, repo, opts)
2285 displayer = cmdutil.show_changeset(ui, repo, opts)
2287 for node in nodes:
2286 for node in nodes:
2288 displayer.show(repo[node])
2287 displayer.show(repo[node])
2289 displayer.close()
2288 displayer.close()
2290 return 0
2289 return 0
2291
2290
2292 return hg.merge(repo, node, force=opts.get('force'))
2291 return hg.merge(repo, node, force=opts.get('force'))
2293
2292
2294 def outgoing(ui, repo, dest=None, **opts):
2293 def outgoing(ui, repo, dest=None, **opts):
2295 """show changesets not found in the destination
2294 """show changesets not found in the destination
2296
2295
2297 Show changesets not found in the specified destination repository
2296 Show changesets not found in the specified destination repository
2298 or the default push location. These are the changesets that would
2297 or the default push location. These are the changesets that would
2299 be pushed if a push was requested.
2298 be pushed if a push was requested.
2300
2299
2301 See pull for details of valid destination formats.
2300 See pull for details of valid destination formats.
2302 """
2301 """
2303 limit = cmdutil.loglimit(opts)
2302 limit = cmdutil.loglimit(opts)
2304 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2303 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2305 dest, branches = hg.parseurl(dest, opts.get('branch'))
2304 dest, branches = hg.parseurl(dest, opts.get('branch'))
2306 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2305 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2307 if revs:
2306 if revs:
2308 revs = [repo.lookup(rev) for rev in revs]
2307 revs = [repo.lookup(rev) for rev in revs]
2309
2308
2310 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2309 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2311 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2310 ui.status(_('comparing with %s\n') % url.hidepassword(dest))
2312 o = repo.findoutgoing(other, force=opts.get('force'))
2311 o = repo.findoutgoing(other, force=opts.get('force'))
2313 if not o:
2312 if not o:
2314 ui.status(_("no changes found\n"))
2313 ui.status(_("no changes found\n"))
2315 return 1
2314 return 1
2316 o = repo.changelog.nodesbetween(o, revs)[0]
2315 o = repo.changelog.nodesbetween(o, revs)[0]
2317 if opts.get('newest_first'):
2316 if opts.get('newest_first'):
2318 o.reverse()
2317 o.reverse()
2319 displayer = cmdutil.show_changeset(ui, repo, opts)
2318 displayer = cmdutil.show_changeset(ui, repo, opts)
2320 count = 0
2319 count = 0
2321 for n in o:
2320 for n in o:
2322 if limit is not None and count >= limit:
2321 if limit is not None and count >= limit:
2323 break
2322 break
2324 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2323 parents = [p for p in repo.changelog.parents(n) if p != nullid]
2325 if opts.get('no_merges') and len(parents) == 2:
2324 if opts.get('no_merges') and len(parents) == 2:
2326 continue
2325 continue
2327 count += 1
2326 count += 1
2328 displayer.show(repo[n])
2327 displayer.show(repo[n])
2329 displayer.close()
2328 displayer.close()
2330
2329
2331 def parents(ui, repo, file_=None, **opts):
2330 def parents(ui, repo, file_=None, **opts):
2332 """show the parents of the working directory or revision
2331 """show the parents of the working directory or revision
2333
2332
2334 Print the working directory's parent revisions. If a revision is
2333 Print the working directory's parent revisions. If a revision is
2335 given via -r/--rev, the parent of that revision will be printed.
2334 given via -r/--rev, the parent of that revision will be printed.
2336 If a file argument is given, the revision in which the file was
2335 If a file argument is given, the revision in which the file was
2337 last changed (before the working directory revision or the
2336 last changed (before the working directory revision or the
2338 argument to --rev if given) is printed.
2337 argument to --rev if given) is printed.
2339 """
2338 """
2340 rev = opts.get('rev')
2339 rev = opts.get('rev')
2341 if rev:
2340 if rev:
2342 ctx = repo[rev]
2341 ctx = repo[rev]
2343 else:
2342 else:
2344 ctx = repo[None]
2343 ctx = repo[None]
2345
2344
2346 if file_:
2345 if file_:
2347 m = cmdutil.match(repo, (file_,), opts)
2346 m = cmdutil.match(repo, (file_,), opts)
2348 if m.anypats() or len(m.files()) != 1:
2347 if m.anypats() or len(m.files()) != 1:
2349 raise util.Abort(_('can only specify an explicit filename'))
2348 raise util.Abort(_('can only specify an explicit filename'))
2350 file_ = m.files()[0]
2349 file_ = m.files()[0]
2351 filenodes = []
2350 filenodes = []
2352 for cp in ctx.parents():
2351 for cp in ctx.parents():
2353 if not cp:
2352 if not cp:
2354 continue
2353 continue
2355 try:
2354 try:
2356 filenodes.append(cp.filenode(file_))
2355 filenodes.append(cp.filenode(file_))
2357 except error.LookupError:
2356 except error.LookupError:
2358 pass
2357 pass
2359 if not filenodes:
2358 if not filenodes:
2360 raise util.Abort(_("'%s' not found in manifest!") % file_)
2359 raise util.Abort(_("'%s' not found in manifest!") % file_)
2361 fl = repo.file(file_)
2360 fl = repo.file(file_)
2362 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2361 p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
2363 else:
2362 else:
2364 p = [cp.node() for cp in ctx.parents()]
2363 p = [cp.node() for cp in ctx.parents()]
2365
2364
2366 displayer = cmdutil.show_changeset(ui, repo, opts)
2365 displayer = cmdutil.show_changeset(ui, repo, opts)
2367 for n in p:
2366 for n in p:
2368 if n != nullid:
2367 if n != nullid:
2369 displayer.show(repo[n])
2368 displayer.show(repo[n])
2370 displayer.close()
2369 displayer.close()
2371
2370
2372 def paths(ui, repo, search=None):
2371 def paths(ui, repo, search=None):
2373 """show aliases for remote repositories
2372 """show aliases for remote repositories
2374
2373
2375 Show definition of symbolic path name NAME. If no name is given,
2374 Show definition of symbolic path name NAME. If no name is given,
2376 show definition of all available names.
2375 show definition of all available names.
2377
2376
2378 Path names are defined in the [paths] section of
2377 Path names are defined in the [paths] section of
2379 ``/etc/mercurial/hgrc`` and ``$HOME/.hgrc``. If run inside a
2378 ``/etc/mercurial/hgrc`` and ``$HOME/.hgrc``. If run inside a
2380 repository, ``.hg/hgrc`` is used, too.
2379 repository, ``.hg/hgrc`` is used, too.
2381
2380
2382 The path names ``default`` and ``default-push`` have a special
2381 The path names ``default`` and ``default-push`` have a special
2383 meaning. When performing a push or pull operation, they are used
2382 meaning. When performing a push or pull operation, they are used
2384 as fallbacks if no location is specified on the command-line.
2383 as fallbacks if no location is specified on the command-line.
2385 When ``default-push`` is set, it will be used for push and
2384 When ``default-push`` is set, it will be used for push and
2386 ``default`` will be used for pull; otherwise ``default`` is used
2385 ``default`` will be used for pull; otherwise ``default`` is used
2387 as the fallback for both. When cloning a repository, the clone
2386 as the fallback for both. When cloning a repository, the clone
2388 source is written as ``default`` in ``.hg/hgrc``. Note that
2387 source is written as ``default`` in ``.hg/hgrc``. Note that
2389 ``default`` and ``default-push`` apply to all inbound (e.g.
2388 ``default`` and ``default-push`` apply to all inbound (e.g.
2390 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
2389 :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
2391 :hg:`bundle`) operations.
2390 :hg:`bundle`) operations.
2392
2391
2393 See :hg:`help urls` for more information.
2392 See :hg:`help urls` for more information.
2394 """
2393 """
2395 if search:
2394 if search:
2396 for name, path in ui.configitems("paths"):
2395 for name, path in ui.configitems("paths"):
2397 if name == search:
2396 if name == search:
2398 ui.write("%s\n" % url.hidepassword(path))
2397 ui.write("%s\n" % url.hidepassword(path))
2399 return
2398 return
2400 ui.warn(_("not found!\n"))
2399 ui.warn(_("not found!\n"))
2401 return 1
2400 return 1
2402 else:
2401 else:
2403 for name, path in ui.configitems("paths"):
2402 for name, path in ui.configitems("paths"):
2404 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2403 ui.write("%s = %s\n" % (name, url.hidepassword(path)))
2405
2404
2406 def postincoming(ui, repo, modheads, optupdate, checkout):
2405 def postincoming(ui, repo, modheads, optupdate, checkout):
2407 if modheads == 0:
2406 if modheads == 0:
2408 return
2407 return
2409 if optupdate:
2408 if optupdate:
2410 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2409 if (modheads <= 1 or len(repo.branchheads()) == 1) or checkout:
2411 return hg.update(repo, checkout)
2410 return hg.update(repo, checkout)
2412 else:
2411 else:
2413 ui.status(_("not updating, since new heads added\n"))
2412 ui.status(_("not updating, since new heads added\n"))
2414 if modheads > 1:
2413 if modheads > 1:
2415 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2414 ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
2416 else:
2415 else:
2417 ui.status(_("(run 'hg update' to get a working copy)\n"))
2416 ui.status(_("(run 'hg update' to get a working copy)\n"))
2418
2417
2419 def pull(ui, repo, source="default", **opts):
2418 def pull(ui, repo, source="default", **opts):
2420 """pull changes from the specified source
2419 """pull changes from the specified source
2421
2420
2422 Pull changes from a remote repository to a local one.
2421 Pull changes from a remote repository to a local one.
2423
2422
2424 This finds all changes from the repository at the specified path
2423 This finds all changes from the repository at the specified path
2425 or URL and adds them to a local repository (the current one unless
2424 or URL and adds them to a local repository (the current one unless
2426 -R is specified). By default, this does not update the copy of the
2425 -R is specified). By default, this does not update the copy of the
2427 project in the working directory.
2426 project in the working directory.
2428
2427
2429 Use hg incoming if you want to see what would have been added by a
2428 Use hg incoming if you want to see what would have been added by a
2430 pull at the time you issued this command. If you then decide to
2429 pull at the time you issued this command. If you then decide to
2431 added those changes to the repository, you should use pull -r X
2430 added those changes to the repository, you should use pull -r X
2432 where X is the last changeset listed by hg incoming.
2431 where X is the last changeset listed by hg incoming.
2433
2432
2434 If SOURCE is omitted, the 'default' path will be used.
2433 If SOURCE is omitted, the 'default' path will be used.
2435 See :hg:`help urls` for more information.
2434 See :hg:`help urls` for more information.
2436 """
2435 """
2437 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2436 source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
2438 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2437 other = hg.repository(cmdutil.remoteui(repo, opts), source)
2439 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2438 ui.status(_('pulling from %s\n') % url.hidepassword(source))
2440 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2439 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
2441 if revs:
2440 if revs:
2442 try:
2441 try:
2443 revs = [other.lookup(rev) for rev in revs]
2442 revs = [other.lookup(rev) for rev in revs]
2444 except error.CapabilityError:
2443 except error.CapabilityError:
2445 err = _("Other repository doesn't support revision lookup, "
2444 err = _("Other repository doesn't support revision lookup, "
2446 "so a rev cannot be specified.")
2445 "so a rev cannot be specified.")
2447 raise util.Abort(err)
2446 raise util.Abort(err)
2448
2447
2449 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2448 modheads = repo.pull(other, heads=revs, force=opts.get('force'))
2450 if checkout:
2449 if checkout:
2451 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2450 checkout = str(repo.changelog.rev(other.lookup(checkout)))
2452 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2451 return postincoming(ui, repo, modheads, opts.get('update'), checkout)
2453
2452
2454 def push(ui, repo, dest=None, **opts):
2453 def push(ui, repo, dest=None, **opts):
2455 """push changes to the specified destination
2454 """push changes to the specified destination
2456
2455
2457 Push changes from the local repository to the specified destination.
2456 Push changes from the local repository to the specified destination.
2458
2457
2459 This is the symmetrical operation for pull. It moves changes from
2458 This is the symmetrical operation for pull. It moves changes from
2460 the current repository to a different one. If the destination is
2459 the current repository to a different one. If the destination is
2461 local this is identical to a pull in that directory from the
2460 local this is identical to a pull in that directory from the
2462 current one.
2461 current one.
2463
2462
2464 By default, push will refuse to run if it detects the result would
2463 By default, push will refuse to run if it detects the result would
2465 increase the number of remote heads. This generally indicates the
2464 increase the number of remote heads. This generally indicates the
2466 user forgot to pull and merge before pushing.
2465 user forgot to pull and merge before pushing.
2467
2466
2468 If -r/--rev is used, the named revision and all its ancestors will
2467 If -r/--rev is used, the named revision and all its ancestors will
2469 be pushed to the remote repository.
2468 be pushed to the remote repository.
2470
2469
2471 Please see :hg:`help urls` for important details about ``ssh://``
2470 Please see :hg:`help urls` for important details about ``ssh://``
2472 URLs. If DESTINATION is omitted, a default path will be used.
2471 URLs. If DESTINATION is omitted, a default path will be used.
2473 """
2472 """
2474 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2473 dest = ui.expandpath(dest or 'default-push', dest or 'default')
2475 dest, branches = hg.parseurl(dest, opts.get('branch'))
2474 dest, branches = hg.parseurl(dest, opts.get('branch'))
2476 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2475 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
2477 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2476 other = hg.repository(cmdutil.remoteui(repo, opts), dest)
2478 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2477 ui.status(_('pushing to %s\n') % url.hidepassword(dest))
2479 if revs:
2478 if revs:
2480 revs = [repo.lookup(rev) for rev in revs]
2479 revs = [repo.lookup(rev) for rev in revs]
2481
2480
2482 # push subrepos depth-first for coherent ordering
2481 # push subrepos depth-first for coherent ordering
2483 c = repo['']
2482 c = repo['']
2484 subs = c.substate # only repos that are committed
2483 subs = c.substate # only repos that are committed
2485 for s in sorted(subs):
2484 for s in sorted(subs):
2486 if not c.sub(s).push(opts.get('force')):
2485 if not c.sub(s).push(opts.get('force')):
2487 return False
2486 return False
2488
2487
2489 r = repo.push(other, opts.get('force'), revs=revs)
2488 r = repo.push(other, opts.get('force'), revs=revs)
2490 return r == 0
2489 return r == 0
2491
2490
2492 def recover(ui, repo):
2491 def recover(ui, repo):
2493 """roll back an interrupted transaction
2492 """roll back an interrupted transaction
2494
2493
2495 Recover from an interrupted commit or pull.
2494 Recover from an interrupted commit or pull.
2496
2495
2497 This command tries to fix the repository status after an
2496 This command tries to fix the repository status after an
2498 interrupted operation. It should only be necessary when Mercurial
2497 interrupted operation. It should only be necessary when Mercurial
2499 suggests it.
2498 suggests it.
2500 """
2499 """
2501 if repo.recover():
2500 if repo.recover():
2502 return hg.verify(repo)
2501 return hg.verify(repo)
2503 return 1
2502 return 1
2504
2503
2505 def remove(ui, repo, *pats, **opts):
2504 def remove(ui, repo, *pats, **opts):
2506 """remove the specified files on the next commit
2505 """remove the specified files on the next commit
2507
2506
2508 Schedule the indicated files for removal from the repository.
2507 Schedule the indicated files for removal from the repository.
2509
2508
2510 This only removes files from the current branch, not from the
2509 This only removes files from the current branch, not from the
2511 entire project history. -A/--after can be used to remove only
2510 entire project history. -A/--after can be used to remove only
2512 files that have already been deleted, -f/--force can be used to
2511 files that have already been deleted, -f/--force can be used to
2513 force deletion, and -Af can be used to remove files from the next
2512 force deletion, and -Af can be used to remove files from the next
2514 revision without deleting them from the working directory.
2513 revision without deleting them from the working directory.
2515
2514
2516 The following table details the behavior of remove for different
2515 The following table details the behavior of remove for different
2517 file states (columns) and option combinations (rows). The file
2516 file states (columns) and option combinations (rows). The file
2518 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2517 states are Added [A], Clean [C], Modified [M] and Missing [!] (as
2519 reported by hg status). The actions are Warn, Remove (from branch)
2518 reported by hg status). The actions are Warn, Remove (from branch)
2520 and Delete (from disk)::
2519 and Delete (from disk)::
2521
2520
2522 A C M !
2521 A C M !
2523 none W RD W R
2522 none W RD W R
2524 -f R RD RD R
2523 -f R RD RD R
2525 -A W W W R
2524 -A W W W R
2526 -Af R R R R
2525 -Af R R R R
2527
2526
2528 This command schedules the files to be removed at the next commit.
2527 This command schedules the files to be removed at the next commit.
2529 To undo a remove before that, see hg revert.
2528 To undo a remove before that, see hg revert.
2530 """
2529 """
2531
2530
2532 after, force = opts.get('after'), opts.get('force')
2531 after, force = opts.get('after'), opts.get('force')
2533 if not pats and not after:
2532 if not pats and not after:
2534 raise util.Abort(_('no files specified'))
2533 raise util.Abort(_('no files specified'))
2535
2534
2536 m = cmdutil.match(repo, pats, opts)
2535 m = cmdutil.match(repo, pats, opts)
2537 s = repo.status(match=m, clean=True)
2536 s = repo.status(match=m, clean=True)
2538 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2537 modified, added, deleted, clean = s[0], s[1], s[3], s[6]
2539
2538
2540 for f in m.files():
2539 for f in m.files():
2541 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2540 if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
2542 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2541 ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
2543
2542
2544 def warn(files, reason):
2543 def warn(files, reason):
2545 for f in files:
2544 for f in files:
2546 ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
2545 ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
2547 % (m.rel(f), reason))
2546 % (m.rel(f), reason))
2548
2547
2549 if force:
2548 if force:
2550 remove, forget = modified + deleted + clean, added
2549 remove, forget = modified + deleted + clean, added
2551 elif after:
2550 elif after:
2552 remove, forget = deleted, []
2551 remove, forget = deleted, []
2553 warn(modified + added + clean, _('still exists'))
2552 warn(modified + added + clean, _('still exists'))
2554 else:
2553 else:
2555 remove, forget = deleted + clean, []
2554 remove, forget = deleted + clean, []
2556 warn(modified, _('is modified'))
2555 warn(modified, _('is modified'))
2557 warn(added, _('has been marked for add'))
2556 warn(added, _('has been marked for add'))
2558
2557
2559 for f in sorted(remove + forget):
2558 for f in sorted(remove + forget):
2560 if ui.verbose or not m.exact(f):
2559 if ui.verbose or not m.exact(f):
2561 ui.status(_('removing %s\n') % m.rel(f))
2560 ui.status(_('removing %s\n') % m.rel(f))
2562
2561
2563 repo.forget(forget)
2562 repo.forget(forget)
2564 repo.remove(remove, unlink=not after)
2563 repo.remove(remove, unlink=not after)
2565
2564
2566 def rename(ui, repo, *pats, **opts):
2565 def rename(ui, repo, *pats, **opts):
2567 """rename files; equivalent of copy + remove
2566 """rename files; equivalent of copy + remove
2568
2567
2569 Mark dest as copies of sources; mark sources for deletion. If dest
2568 Mark dest as copies of sources; mark sources for deletion. If dest
2570 is a directory, copies are put in that directory. If dest is a
2569 is a directory, copies are put in that directory. If dest is a
2571 file, there can only be one source.
2570 file, there can only be one source.
2572
2571
2573 By default, this command copies the contents of files as they
2572 By default, this command copies the contents of files as they
2574 exist in the working directory. If invoked with -A/--after, the
2573 exist in the working directory. If invoked with -A/--after, the
2575 operation is recorded, but no copying is performed.
2574 operation is recorded, but no copying is performed.
2576
2575
2577 This command takes effect at the next commit. To undo a rename
2576 This command takes effect at the next commit. To undo a rename
2578 before that, see hg revert.
2577 before that, see hg revert.
2579 """
2578 """
2580 wlock = repo.wlock(False)
2579 wlock = repo.wlock(False)
2581 try:
2580 try:
2582 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2581 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2583 finally:
2582 finally:
2584 wlock.release()
2583 wlock.release()
2585
2584
2586 def resolve(ui, repo, *pats, **opts):
2585 def resolve(ui, repo, *pats, **opts):
2587 """various operations to help finish a merge
2586 """various operations to help finish a merge
2588
2587
2589 This command includes several actions that are often useful while
2588 This command includes several actions that are often useful while
2590 performing a merge, after running ``merge`` but before running
2589 performing a merge, after running ``merge`` but before running
2591 ``commit``. (It is only meaningful if your working directory has
2590 ``commit``. (It is only meaningful if your working directory has
2592 two parents.) It is most relevant for merges with unresolved
2591 two parents.) It is most relevant for merges with unresolved
2593 conflicts, which are typically a result of non-interactive merging with
2592 conflicts, which are typically a result of non-interactive merging with
2594 ``internal:merge`` or a command-line merge tool like ``diff3``.
2593 ``internal:merge`` or a command-line merge tool like ``diff3``.
2595
2594
2596 The available actions are:
2595 The available actions are:
2597
2596
2598 1) list files that were merged with conflicts (U, for unresolved)
2597 1) list files that were merged with conflicts (U, for unresolved)
2599 and without conflicts (R, for resolved): ``hg resolve -l``
2598 and without conflicts (R, for resolved): ``hg resolve -l``
2600 (this is like ``status`` for merges)
2599 (this is like ``status`` for merges)
2601 2) record that you have resolved conflicts in certain files:
2600 2) record that you have resolved conflicts in certain files:
2602 ``hg resolve -m [file ...]`` (default: mark all unresolved files)
2601 ``hg resolve -m [file ...]`` (default: mark all unresolved files)
2603 3) forget that you have resolved conflicts in certain files:
2602 3) forget that you have resolved conflicts in certain files:
2604 ``hg resolve -u [file ...]`` (default: unmark all resolved files)
2603 ``hg resolve -u [file ...]`` (default: unmark all resolved files)
2605 4) discard your current attempt(s) at resolving conflicts and
2604 4) discard your current attempt(s) at resolving conflicts and
2606 restart the merge from scratch: ``hg resolve file...``
2605 restart the merge from scratch: ``hg resolve file...``
2607 (or ``-a`` for all unresolved files)
2606 (or ``-a`` for all unresolved files)
2608
2607
2609 Note that Mercurial will not let you commit files with unresolved merge
2608 Note that Mercurial will not let you commit files with unresolved merge
2610 conflicts. You must use ``hg resolve -m ...`` before you can commit
2609 conflicts. You must use ``hg resolve -m ...`` before you can commit
2611 after a conflicting merge.
2610 after a conflicting merge.
2612 """
2611 """
2613
2612
2614 all, mark, unmark, show, nostatus = \
2613 all, mark, unmark, show, nostatus = \
2615 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2614 [opts.get(o) for o in 'all mark unmark list no_status'.split()]
2616
2615
2617 if (show and (mark or unmark)) or (mark and unmark):
2616 if (show and (mark or unmark)) or (mark and unmark):
2618 raise util.Abort(_("too many options specified"))
2617 raise util.Abort(_("too many options specified"))
2619 if pats and all:
2618 if pats and all:
2620 raise util.Abort(_("can't specify --all and patterns"))
2619 raise util.Abort(_("can't specify --all and patterns"))
2621 if not (all or pats or show or mark or unmark):
2620 if not (all or pats or show or mark or unmark):
2622 raise util.Abort(_('no files or directories specified; '
2621 raise util.Abort(_('no files or directories specified; '
2623 'use --all to remerge all files'))
2622 'use --all to remerge all files'))
2624
2623
2625 ms = mergemod.mergestate(repo)
2624 ms = mergemod.mergestate(repo)
2626 m = cmdutil.match(repo, pats, opts)
2625 m = cmdutil.match(repo, pats, opts)
2627
2626
2628 for f in ms:
2627 for f in ms:
2629 if m(f):
2628 if m(f):
2630 if show:
2629 if show:
2631 if nostatus:
2630 if nostatus:
2632 ui.write("%s\n" % f)
2631 ui.write("%s\n" % f)
2633 else:
2632 else:
2634 ui.write("%s %s\n" % (ms[f].upper(), f),
2633 ui.write("%s %s\n" % (ms[f].upper(), f),
2635 label='resolve.' +
2634 label='resolve.' +
2636 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
2635 {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
2637 elif mark:
2636 elif mark:
2638 ms.mark(f, "r")
2637 ms.mark(f, "r")
2639 elif unmark:
2638 elif unmark:
2640 ms.mark(f, "u")
2639 ms.mark(f, "u")
2641 else:
2640 else:
2642 wctx = repo[None]
2641 wctx = repo[None]
2643 mctx = wctx.parents()[-1]
2642 mctx = wctx.parents()[-1]
2644
2643
2645 # backup pre-resolve (merge uses .orig for its own purposes)
2644 # backup pre-resolve (merge uses .orig for its own purposes)
2646 a = repo.wjoin(f)
2645 a = repo.wjoin(f)
2647 util.copyfile(a, a + ".resolve")
2646 util.copyfile(a, a + ".resolve")
2648
2647
2649 # resolve file
2648 # resolve file
2650 ms.resolve(f, wctx, mctx)
2649 ms.resolve(f, wctx, mctx)
2651
2650
2652 # replace filemerge's .orig file with our resolve file
2651 # replace filemerge's .orig file with our resolve file
2653 util.rename(a + ".resolve", a + ".orig")
2652 util.rename(a + ".resolve", a + ".orig")
2654
2653
2655 def revert(ui, repo, *pats, **opts):
2654 def revert(ui, repo, *pats, **opts):
2656 """restore individual files or directories to an earlier state
2655 """restore individual files or directories to an earlier state
2657
2656
2658 (Use update -r to check out earlier revisions, revert does not
2657 (Use update -r to check out earlier revisions, revert does not
2659 change the working directory parents.)
2658 change the working directory parents.)
2660
2659
2661 With no revision specified, revert the named files or directories
2660 With no revision specified, revert the named files or directories
2662 to the contents they had in the parent of the working directory.
2661 to the contents they had in the parent of the working directory.
2663 This restores the contents of the affected files to an unmodified
2662 This restores the contents of the affected files to an unmodified
2664 state and unschedules adds, removes, copies, and renames. If the
2663 state and unschedules adds, removes, copies, and renames. If the
2665 working directory has two parents, you must explicitly specify a
2664 working directory has two parents, you must explicitly specify a
2666 revision.
2665 revision.
2667
2666
2668 Using the -r/--rev option, revert the given files or directories
2667 Using the -r/--rev option, revert the given files or directories
2669 to their contents as of a specific revision. This can be helpful
2668 to their contents as of a specific revision. This can be helpful
2670 to "roll back" some or all of an earlier change. See :hg:`help
2669 to "roll back" some or all of an earlier change. See :hg:`help
2671 dates` for a list of formats valid for -d/--date.
2670 dates` for a list of formats valid for -d/--date.
2672
2671
2673 Revert modifies the working directory. It does not commit any
2672 Revert modifies the working directory. It does not commit any
2674 changes, or change the parent of the working directory. If you
2673 changes, or change the parent of the working directory. If you
2675 revert to a revision other than the parent of the working
2674 revert to a revision other than the parent of the working
2676 directory, the reverted files will thus appear modified
2675 directory, the reverted files will thus appear modified
2677 afterwards.
2676 afterwards.
2678
2677
2679 If a file has been deleted, it is restored. If the executable mode
2678 If a file has been deleted, it is restored. If the executable mode
2680 of a file was changed, it is reset.
2679 of a file was changed, it is reset.
2681
2680
2682 If names are given, all files matching the names are reverted.
2681 If names are given, all files matching the names are reverted.
2683 If no arguments are given, no files are reverted.
2682 If no arguments are given, no files are reverted.
2684
2683
2685 Modified files are saved with a .orig suffix before reverting.
2684 Modified files are saved with a .orig suffix before reverting.
2686 To disable these backups, use --no-backup.
2685 To disable these backups, use --no-backup.
2687 """
2686 """
2688
2687
2689 if opts["date"]:
2688 if opts["date"]:
2690 if opts["rev"]:
2689 if opts["rev"]:
2691 raise util.Abort(_("you can't specify a revision and a date"))
2690 raise util.Abort(_("you can't specify a revision and a date"))
2692 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2691 opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
2693
2692
2694 if not pats and not opts.get('all'):
2693 if not pats and not opts.get('all'):
2695 raise util.Abort(_('no files or directories specified; '
2694 raise util.Abort(_('no files or directories specified; '
2696 'use --all to revert the whole repo'))
2695 'use --all to revert the whole repo'))
2697
2696
2698 parent, p2 = repo.dirstate.parents()
2697 parent, p2 = repo.dirstate.parents()
2699 if not opts.get('rev') and p2 != nullid:
2698 if not opts.get('rev') and p2 != nullid:
2700 raise util.Abort(_('uncommitted merge - please provide a '
2699 raise util.Abort(_('uncommitted merge - please provide a '
2701 'specific revision'))
2700 'specific revision'))
2702 ctx = repo[opts.get('rev')]
2701 ctx = repo[opts.get('rev')]
2703 node = ctx.node()
2702 node = ctx.node()
2704 mf = ctx.manifest()
2703 mf = ctx.manifest()
2705 if node == parent:
2704 if node == parent:
2706 pmf = mf
2705 pmf = mf
2707 else:
2706 else:
2708 pmf = None
2707 pmf = None
2709
2708
2710 # need all matching names in dirstate and manifest of target rev,
2709 # need all matching names in dirstate and manifest of target rev,
2711 # so have to walk both. do not print errors if files exist in one
2710 # so have to walk both. do not print errors if files exist in one
2712 # but not other.
2711 # but not other.
2713
2712
2714 names = {}
2713 names = {}
2715
2714
2716 wlock = repo.wlock()
2715 wlock = repo.wlock()
2717 try:
2716 try:
2718 # walk dirstate.
2717 # walk dirstate.
2719
2718
2720 m = cmdutil.match(repo, pats, opts)
2719 m = cmdutil.match(repo, pats, opts)
2721 m.bad = lambda x, y: False
2720 m.bad = lambda x, y: False
2722 for abs in repo.walk(m):
2721 for abs in repo.walk(m):
2723 names[abs] = m.rel(abs), m.exact(abs)
2722 names[abs] = m.rel(abs), m.exact(abs)
2724
2723
2725 # walk target manifest.
2724 # walk target manifest.
2726
2725
2727 def badfn(path, msg):
2726 def badfn(path, msg):
2728 if path in names:
2727 if path in names:
2729 return
2728 return
2730 path_ = path + '/'
2729 path_ = path + '/'
2731 for f in names:
2730 for f in names:
2732 if f.startswith(path_):
2731 if f.startswith(path_):
2733 return
2732 return
2734 ui.warn("%s: %s\n" % (m.rel(path), msg))
2733 ui.warn("%s: %s\n" % (m.rel(path), msg))
2735
2734
2736 m = cmdutil.match(repo, pats, opts)
2735 m = cmdutil.match(repo, pats, opts)
2737 m.bad = badfn
2736 m.bad = badfn
2738 for abs in repo[node].walk(m):
2737 for abs in repo[node].walk(m):
2739 if abs not in names:
2738 if abs not in names:
2740 names[abs] = m.rel(abs), m.exact(abs)
2739 names[abs] = m.rel(abs), m.exact(abs)
2741
2740
2742 m = cmdutil.matchfiles(repo, names)
2741 m = cmdutil.matchfiles(repo, names)
2743 changes = repo.status(match=m)[:4]
2742 changes = repo.status(match=m)[:4]
2744 modified, added, removed, deleted = map(set, changes)
2743 modified, added, removed, deleted = map(set, changes)
2745
2744
2746 # if f is a rename, also revert the source
2745 # if f is a rename, also revert the source
2747 cwd = repo.getcwd()
2746 cwd = repo.getcwd()
2748 for f in added:
2747 for f in added:
2749 src = repo.dirstate.copied(f)
2748 src = repo.dirstate.copied(f)
2750 if src and src not in names and repo.dirstate[src] == 'r':
2749 if src and src not in names and repo.dirstate[src] == 'r':
2751 removed.add(src)
2750 removed.add(src)
2752 names[src] = (repo.pathto(src, cwd), True)
2751 names[src] = (repo.pathto(src, cwd), True)
2753
2752
2754 def removeforget(abs):
2753 def removeforget(abs):
2755 if repo.dirstate[abs] == 'a':
2754 if repo.dirstate[abs] == 'a':
2756 return _('forgetting %s\n')
2755 return _('forgetting %s\n')
2757 return _('removing %s\n')
2756 return _('removing %s\n')
2758
2757
2759 revert = ([], _('reverting %s\n'))
2758 revert = ([], _('reverting %s\n'))
2760 add = ([], _('adding %s\n'))
2759 add = ([], _('adding %s\n'))
2761 remove = ([], removeforget)
2760 remove = ([], removeforget)
2762 undelete = ([], _('undeleting %s\n'))
2761 undelete = ([], _('undeleting %s\n'))
2763
2762
2764 disptable = (
2763 disptable = (
2765 # dispatch table:
2764 # dispatch table:
2766 # file state
2765 # file state
2767 # action if in target manifest
2766 # action if in target manifest
2768 # action if not in target manifest
2767 # action if not in target manifest
2769 # make backup if in target manifest
2768 # make backup if in target manifest
2770 # make backup if not in target manifest
2769 # make backup if not in target manifest
2771 (modified, revert, remove, True, True),
2770 (modified, revert, remove, True, True),
2772 (added, revert, remove, True, False),
2771 (added, revert, remove, True, False),
2773 (removed, undelete, None, False, False),
2772 (removed, undelete, None, False, False),
2774 (deleted, revert, remove, False, False),
2773 (deleted, revert, remove, False, False),
2775 )
2774 )
2776
2775
2777 for abs, (rel, exact) in sorted(names.items()):
2776 for abs, (rel, exact) in sorted(names.items()):
2778 mfentry = mf.get(abs)
2777 mfentry = mf.get(abs)
2779 target = repo.wjoin(abs)
2778 target = repo.wjoin(abs)
2780 def handle(xlist, dobackup):
2779 def handle(xlist, dobackup):
2781 xlist[0].append(abs)
2780 xlist[0].append(abs)
2782 if dobackup and not opts.get('no_backup') and util.lexists(target):
2781 if dobackup and not opts.get('no_backup') and util.lexists(target):
2783 bakname = "%s.orig" % rel
2782 bakname = "%s.orig" % rel
2784 ui.note(_('saving current version of %s as %s\n') %
2783 ui.note(_('saving current version of %s as %s\n') %
2785 (rel, bakname))
2784 (rel, bakname))
2786 if not opts.get('dry_run'):
2785 if not opts.get('dry_run'):
2787 util.copyfile(target, bakname)
2786 util.copyfile(target, bakname)
2788 if ui.verbose or not exact:
2787 if ui.verbose or not exact:
2789 msg = xlist[1]
2788 msg = xlist[1]
2790 if not isinstance(msg, basestring):
2789 if not isinstance(msg, basestring):
2791 msg = msg(abs)
2790 msg = msg(abs)
2792 ui.status(msg % rel)
2791 ui.status(msg % rel)
2793 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2792 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2794 if abs not in table:
2793 if abs not in table:
2795 continue
2794 continue
2796 # file has changed in dirstate
2795 # file has changed in dirstate
2797 if mfentry:
2796 if mfentry:
2798 handle(hitlist, backuphit)
2797 handle(hitlist, backuphit)
2799 elif misslist is not None:
2798 elif misslist is not None:
2800 handle(misslist, backupmiss)
2799 handle(misslist, backupmiss)
2801 break
2800 break
2802 else:
2801 else:
2803 if abs not in repo.dirstate:
2802 if abs not in repo.dirstate:
2804 if mfentry:
2803 if mfentry:
2805 handle(add, True)
2804 handle(add, True)
2806 elif exact:
2805 elif exact:
2807 ui.warn(_('file not managed: %s\n') % rel)
2806 ui.warn(_('file not managed: %s\n') % rel)
2808 continue
2807 continue
2809 # file has not changed in dirstate
2808 # file has not changed in dirstate
2810 if node == parent:
2809 if node == parent:
2811 if exact:
2810 if exact:
2812 ui.warn(_('no changes needed to %s\n') % rel)
2811 ui.warn(_('no changes needed to %s\n') % rel)
2813 continue
2812 continue
2814 if pmf is None:
2813 if pmf is None:
2815 # only need parent manifest in this unlikely case,
2814 # only need parent manifest in this unlikely case,
2816 # so do not read by default
2815 # so do not read by default
2817 pmf = repo[parent].manifest()
2816 pmf = repo[parent].manifest()
2818 if abs in pmf:
2817 if abs in pmf:
2819 if mfentry:
2818 if mfentry:
2820 # if version of file is same in parent and target
2819 # if version of file is same in parent and target
2821 # manifests, do nothing
2820 # manifests, do nothing
2822 if (pmf[abs] != mfentry or
2821 if (pmf[abs] != mfentry or
2823 pmf.flags(abs) != mf.flags(abs)):
2822 pmf.flags(abs) != mf.flags(abs)):
2824 handle(revert, False)
2823 handle(revert, False)
2825 else:
2824 else:
2826 handle(remove, False)
2825 handle(remove, False)
2827
2826
2828 if not opts.get('dry_run'):
2827 if not opts.get('dry_run'):
2829 def checkout(f):
2828 def checkout(f):
2830 fc = ctx[f]
2829 fc = ctx[f]
2831 repo.wwrite(f, fc.data(), fc.flags())
2830 repo.wwrite(f, fc.data(), fc.flags())
2832
2831
2833 audit_path = util.path_auditor(repo.root)
2832 audit_path = util.path_auditor(repo.root)
2834 for f in remove[0]:
2833 for f in remove[0]:
2835 if repo.dirstate[f] == 'a':
2834 if repo.dirstate[f] == 'a':
2836 repo.dirstate.forget(f)
2835 repo.dirstate.forget(f)
2837 continue
2836 continue
2838 audit_path(f)
2837 audit_path(f)
2839 try:
2838 try:
2840 util.unlink(repo.wjoin(f))
2839 util.unlink(repo.wjoin(f))
2841 except OSError:
2840 except OSError:
2842 pass
2841 pass
2843 repo.dirstate.remove(f)
2842 repo.dirstate.remove(f)
2844
2843
2845 normal = None
2844 normal = None
2846 if node == parent:
2845 if node == parent:
2847 # We're reverting to our parent. If possible, we'd like status
2846 # We're reverting to our parent. If possible, we'd like status
2848 # to report the file as clean. We have to use normallookup for
2847 # to report the file as clean. We have to use normallookup for
2849 # merges to avoid losing information about merged/dirty files.
2848 # merges to avoid losing information about merged/dirty files.
2850 if p2 != nullid:
2849 if p2 != nullid:
2851 normal = repo.dirstate.normallookup
2850 normal = repo.dirstate.normallookup
2852 else:
2851 else:
2853 normal = repo.dirstate.normal
2852 normal = repo.dirstate.normal
2854 for f in revert[0]:
2853 for f in revert[0]:
2855 checkout(f)
2854 checkout(f)
2856 if normal:
2855 if normal:
2857 normal(f)
2856 normal(f)
2858
2857
2859 for f in add[0]:
2858 for f in add[0]:
2860 checkout(f)
2859 checkout(f)
2861 repo.dirstate.add(f)
2860 repo.dirstate.add(f)
2862
2861
2863 normal = repo.dirstate.normallookup
2862 normal = repo.dirstate.normallookup
2864 if node == parent and p2 == nullid:
2863 if node == parent and p2 == nullid:
2865 normal = repo.dirstate.normal
2864 normal = repo.dirstate.normal
2866 for f in undelete[0]:
2865 for f in undelete[0]:
2867 checkout(f)
2866 checkout(f)
2868 normal(f)
2867 normal(f)
2869
2868
2870 finally:
2869 finally:
2871 wlock.release()
2870 wlock.release()
2872
2871
2873 def rollback(ui, repo, **opts):
2872 def rollback(ui, repo, **opts):
2874 """roll back the last transaction (dangerous)
2873 """roll back the last transaction (dangerous)
2875
2874
2876 This command should be used with care. There is only one level of
2875 This command should be used with care. There is only one level of
2877 rollback, and there is no way to undo a rollback. It will also
2876 rollback, and there is no way to undo a rollback. It will also
2878 restore the dirstate at the time of the last transaction, losing
2877 restore the dirstate at the time of the last transaction, losing
2879 any dirstate changes since that time. This command does not alter
2878 any dirstate changes since that time. This command does not alter
2880 the working directory.
2879 the working directory.
2881
2880
2882 Transactions are used to encapsulate the effects of all commands
2881 Transactions are used to encapsulate the effects of all commands
2883 that create new changesets or propagate existing changesets into a
2882 that create new changesets or propagate existing changesets into a
2884 repository. For example, the following commands are transactional,
2883 repository. For example, the following commands are transactional,
2885 and their effects can be rolled back:
2884 and their effects can be rolled back:
2886
2885
2887 - commit
2886 - commit
2888 - import
2887 - import
2889 - pull
2888 - pull
2890 - push (with this repository as the destination)
2889 - push (with this repository as the destination)
2891 - unbundle
2890 - unbundle
2892
2891
2893 This command is not intended for use on public repositories. Once
2892 This command is not intended for use on public repositories. Once
2894 changes are visible for pull by other users, rolling a transaction
2893 changes are visible for pull by other users, rolling a transaction
2895 back locally is ineffective (someone else may already have pulled
2894 back locally is ineffective (someone else may already have pulled
2896 the changes). Furthermore, a race is possible with readers of the
2895 the changes). Furthermore, a race is possible with readers of the
2897 repository; for example an in-progress pull from the repository
2896 repository; for example an in-progress pull from the repository
2898 may fail if a rollback is performed.
2897 may fail if a rollback is performed.
2899 """
2898 """
2900 repo.rollback(opts.get('dry_run'))
2899 repo.rollback(opts.get('dry_run'))
2901
2900
2902 def root(ui, repo):
2901 def root(ui, repo):
2903 """print the root (top) of the current working directory
2902 """print the root (top) of the current working directory
2904
2903
2905 Print the root directory of the current repository.
2904 Print the root directory of the current repository.
2906 """
2905 """
2907 ui.write(repo.root + "\n")
2906 ui.write(repo.root + "\n")
2908
2907
2909 def serve(ui, repo, **opts):
2908 def serve(ui, repo, **opts):
2910 """start stand-alone webserver
2909 """start stand-alone webserver
2911
2910
2912 Start a local HTTP repository browser and pull server. You can use
2911 Start a local HTTP repository browser and pull server. You can use
2913 this for ad-hoc sharing and browing of repositories. It is
2912 this for ad-hoc sharing and browing of repositories. It is
2914 recommended to use a real web server to serve a repository for
2913 recommended to use a real web server to serve a repository for
2915 longer periods of time.
2914 longer periods of time.
2916
2915
2917 Please note that the server does not implement access control.
2916 Please note that the server does not implement access control.
2918 This means that, by default, anybody can read from the server and
2917 This means that, by default, anybody can read from the server and
2919 nobody can write to it by default. Set the ``web.allow_push``
2918 nobody can write to it by default. Set the ``web.allow_push``
2920 option to ``*`` to allow everybody to push to the server. You
2919 option to ``*`` to allow everybody to push to the server. You
2921 should use a real web server if you need to authenticate users.
2920 should use a real web server if you need to authenticate users.
2922
2921
2923 By default, the server logs accesses to stdout and errors to
2922 By default, the server logs accesses to stdout and errors to
2924 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
2923 stderr. Use the -A/--accesslog and -E/--errorlog options to log to
2925 files.
2924 files.
2926
2925
2927 To have the server choose a free port number to listen on, specify
2926 To have the server choose a free port number to listen on, specify
2928 a port number of 0; in this case, the server will print the port
2927 a port number of 0; in this case, the server will print the port
2929 number it uses.
2928 number it uses.
2930 """
2929 """
2931
2930
2932 if opts["stdio"]:
2931 if opts["stdio"]:
2933 if repo is None:
2932 if repo is None:
2934 raise error.RepoError(_("There is no Mercurial repository here"
2933 raise error.RepoError(_("There is no Mercurial repository here"
2935 " (.hg not found)"))
2934 " (.hg not found)"))
2936 s = sshserver.sshserver(ui, repo)
2935 s = sshserver.sshserver(ui, repo)
2937 s.serve_forever()
2936 s.serve_forever()
2938
2937
2939 # this way we can check if something was given in the command-line
2938 # this way we can check if something was given in the command-line
2940 if opts.get('port'):
2939 if opts.get('port'):
2941 opts['port'] = int(opts.get('port'))
2940 opts['port'] = int(opts.get('port'))
2942
2941
2943 baseui = repo and repo.baseui or ui
2942 baseui = repo and repo.baseui or ui
2944 optlist = ("name templates style address port prefix ipv6"
2943 optlist = ("name templates style address port prefix ipv6"
2945 " accesslog errorlog certificate encoding")
2944 " accesslog errorlog certificate encoding")
2946 for o in optlist.split():
2945 for o in optlist.split():
2947 val = opts.get(o, '')
2946 val = opts.get(o, '')
2948 if val in (None, ''): # should check against default options instead
2947 if val in (None, ''): # should check against default options instead
2949 continue
2948 continue
2950 baseui.setconfig("web", o, val)
2949 baseui.setconfig("web", o, val)
2951 if repo and repo.ui != baseui:
2950 if repo and repo.ui != baseui:
2952 repo.ui.setconfig("web", o, val)
2951 repo.ui.setconfig("web", o, val)
2953
2952
2954 o = opts.get('web_conf') or opts.get('webdir_conf')
2953 o = opts.get('web_conf') or opts.get('webdir_conf')
2955 if not o:
2954 if not o:
2956 if not repo:
2955 if not repo:
2957 raise error.RepoError(_("There is no Mercurial repository"
2956 raise error.RepoError(_("There is no Mercurial repository"
2958 " here (.hg not found)"))
2957 " here (.hg not found)"))
2959 o = repo.root
2958 o = repo.root
2960
2959
2961 app = hgweb.hgweb(o, baseui=ui)
2960 app = hgweb.hgweb(o, baseui=ui)
2962
2961
2963 class service(object):
2962 class service(object):
2964 def init(self):
2963 def init(self):
2965 util.set_signal_handler()
2964 util.set_signal_handler()
2966 self.httpd = hgweb.server.create_server(ui, app)
2965 self.httpd = hgweb.server.create_server(ui, app)
2967
2966
2968 if opts['port'] and not ui.verbose:
2967 if opts['port'] and not ui.verbose:
2969 return
2968 return
2970
2969
2971 if self.httpd.prefix:
2970 if self.httpd.prefix:
2972 prefix = self.httpd.prefix.strip('/') + '/'
2971 prefix = self.httpd.prefix.strip('/') + '/'
2973 else:
2972 else:
2974 prefix = ''
2973 prefix = ''
2975
2974
2976 port = ':%d' % self.httpd.port
2975 port = ':%d' % self.httpd.port
2977 if port == ':80':
2976 if port == ':80':
2978 port = ''
2977 port = ''
2979
2978
2980 bindaddr = self.httpd.addr
2979 bindaddr = self.httpd.addr
2981 if bindaddr == '0.0.0.0':
2980 if bindaddr == '0.0.0.0':
2982 bindaddr = '*'
2981 bindaddr = '*'
2983 elif ':' in bindaddr: # IPv6
2982 elif ':' in bindaddr: # IPv6
2984 bindaddr = '[%s]' % bindaddr
2983 bindaddr = '[%s]' % bindaddr
2985
2984
2986 fqaddr = self.httpd.fqaddr
2985 fqaddr = self.httpd.fqaddr
2987 if ':' in fqaddr:
2986 if ':' in fqaddr:
2988 fqaddr = '[%s]' % fqaddr
2987 fqaddr = '[%s]' % fqaddr
2989 if opts['port']:
2988 if opts['port']:
2990 write = ui.status
2989 write = ui.status
2991 else:
2990 else:
2992 write = ui.write
2991 write = ui.write
2993 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
2992 write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
2994 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2993 (fqaddr, port, prefix, bindaddr, self.httpd.port))
2995
2994
2996 def run(self):
2995 def run(self):
2997 self.httpd.serve_forever()
2996 self.httpd.serve_forever()
2998
2997
2999 service = service()
2998 service = service()
3000
2999
3001 cmdutil.service(opts, initfn=service.init, runfn=service.run)
3000 cmdutil.service(opts, initfn=service.init, runfn=service.run)
3002
3001
3003 def status(ui, repo, *pats, **opts):
3002 def status(ui, repo, *pats, **opts):
3004 """show changed files in the working directory
3003 """show changed files in the working directory
3005
3004
3006 Show status of files in the repository. If names are given, only
3005 Show status of files in the repository. If names are given, only
3007 files that match are shown. Files that are clean or ignored or
3006 files that match are shown. Files that are clean or ignored or
3008 the source of a copy/move operation, are not listed unless
3007 the source of a copy/move operation, are not listed unless
3009 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
3008 -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
3010 Unless options described with "show only ..." are given, the
3009 Unless options described with "show only ..." are given, the
3011 options -mardu are used.
3010 options -mardu are used.
3012
3011
3013 Option -q/--quiet hides untracked (unknown and ignored) files
3012 Option -q/--quiet hides untracked (unknown and ignored) files
3014 unless explicitly requested with -u/--unknown or -i/--ignored.
3013 unless explicitly requested with -u/--unknown or -i/--ignored.
3015
3014
3016 NOTE: status may appear to disagree with diff if permissions have
3015 NOTE: status may appear to disagree with diff if permissions have
3017 changed or a merge has occurred. The standard diff format does not
3016 changed or a merge has occurred. The standard diff format does not
3018 report permission changes and diff only reports changes relative
3017 report permission changes and diff only reports changes relative
3019 to one merge parent.
3018 to one merge parent.
3020
3019
3021 If one revision is given, it is used as the base revision.
3020 If one revision is given, it is used as the base revision.
3022 If two revisions are given, the differences between them are
3021 If two revisions are given, the differences between them are
3023 shown. The --change option can also be used as a shortcut to list
3022 shown. The --change option can also be used as a shortcut to list
3024 the changed files of a revision from its first parent.
3023 the changed files of a revision from its first parent.
3025
3024
3026 The codes used to show the status of files are::
3025 The codes used to show the status of files are::
3027
3026
3028 M = modified
3027 M = modified
3029 A = added
3028 A = added
3030 R = removed
3029 R = removed
3031 C = clean
3030 C = clean
3032 ! = missing (deleted by non-hg command, but still tracked)
3031 ! = missing (deleted by non-hg command, but still tracked)
3033 ? = not tracked
3032 ? = not tracked
3034 I = ignored
3033 I = ignored
3035 = origin of the previous file listed as A (added)
3034 = origin of the previous file listed as A (added)
3036 """
3035 """
3037
3036
3038 revs = opts.get('rev')
3037 revs = opts.get('rev')
3039 change = opts.get('change')
3038 change = opts.get('change')
3040
3039
3041 if revs and change:
3040 if revs and change:
3042 msg = _('cannot specify --rev and --change at the same time')
3041 msg = _('cannot specify --rev and --change at the same time')
3043 raise util.Abort(msg)
3042 raise util.Abort(msg)
3044 elif change:
3043 elif change:
3045 node2 = repo.lookup(change)
3044 node2 = repo.lookup(change)
3046 node1 = repo[node2].parents()[0].node()
3045 node1 = repo[node2].parents()[0].node()
3047 else:
3046 else:
3048 node1, node2 = cmdutil.revpair(repo, revs)
3047 node1, node2 = cmdutil.revpair(repo, revs)
3049
3048
3050 cwd = (pats and repo.getcwd()) or ''
3049 cwd = (pats and repo.getcwd()) or ''
3051 end = opts.get('print0') and '\0' or '\n'
3050 end = opts.get('print0') and '\0' or '\n'
3052 copy = {}
3051 copy = {}
3053 states = 'modified added removed deleted unknown ignored clean'.split()
3052 states = 'modified added removed deleted unknown ignored clean'.split()
3054 show = [k for k in states if opts.get(k)]
3053 show = [k for k in states if opts.get(k)]
3055 if opts.get('all'):
3054 if opts.get('all'):
3056 show += ui.quiet and (states[:4] + ['clean']) or states
3055 show += ui.quiet and (states[:4] + ['clean']) or states
3057 if not show:
3056 if not show:
3058 show = ui.quiet and states[:4] or states[:5]
3057 show = ui.quiet and states[:4] or states[:5]
3059
3058
3060 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
3059 stat = repo.status(node1, node2, cmdutil.match(repo, pats, opts),
3061 'ignored' in show, 'clean' in show, 'unknown' in show)
3060 'ignored' in show, 'clean' in show, 'unknown' in show)
3062 changestates = zip(states, 'MAR!?IC', stat)
3061 changestates = zip(states, 'MAR!?IC', stat)
3063
3062
3064 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
3063 if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
3065 ctxn = repo[nullid]
3064 ctxn = repo[nullid]
3066 ctx1 = repo[node1]
3065 ctx1 = repo[node1]
3067 ctx2 = repo[node2]
3066 ctx2 = repo[node2]
3068 added = stat[1]
3067 added = stat[1]
3069 if node2 is None:
3068 if node2 is None:
3070 added = stat[0] + stat[1] # merged?
3069 added = stat[0] + stat[1] # merged?
3071
3070
3072 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
3071 for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
3073 if k in added:
3072 if k in added:
3074 copy[k] = v
3073 copy[k] = v
3075 elif v in added:
3074 elif v in added:
3076 copy[v] = k
3075 copy[v] = k
3077
3076
3078 for state, char, files in changestates:
3077 for state, char, files in changestates:
3079 if state in show:
3078 if state in show:
3080 format = "%s %%s%s" % (char, end)
3079 format = "%s %%s%s" % (char, end)
3081 if opts.get('no_status'):
3080 if opts.get('no_status'):
3082 format = "%%s%s" % end
3081 format = "%%s%s" % end
3083
3082
3084 for f in files:
3083 for f in files:
3085 ui.write(format % repo.pathto(f, cwd),
3084 ui.write(format % repo.pathto(f, cwd),
3086 label='status.' + state)
3085 label='status.' + state)
3087 if f in copy:
3086 if f in copy:
3088 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end),
3087 ui.write(' %s%s' % (repo.pathto(copy[f], cwd), end),
3089 label='status.copied')
3088 label='status.copied')
3090
3089
3091 def summary(ui, repo, **opts):
3090 def summary(ui, repo, **opts):
3092 """summarize working directory state
3091 """summarize working directory state
3093
3092
3094 This generates a brief summary of the working directory state,
3093 This generates a brief summary of the working directory state,
3095 including parents, branch, commit status, and available updates.
3094 including parents, branch, commit status, and available updates.
3096
3095
3097 With the --remote option, this will check the default paths for
3096 With the --remote option, this will check the default paths for
3098 incoming and outgoing changes. This can be time-consuming.
3097 incoming and outgoing changes. This can be time-consuming.
3099 """
3098 """
3100
3099
3101 ctx = repo[None]
3100 ctx = repo[None]
3102 parents = ctx.parents()
3101 parents = ctx.parents()
3103 pnode = parents[0].node()
3102 pnode = parents[0].node()
3104
3103
3105 for p in parents:
3104 for p in parents:
3106 # label with log.changeset (instead of log.parent) since this
3105 # label with log.changeset (instead of log.parent) since this
3107 # shows a working directory parent *changeset*:
3106 # shows a working directory parent *changeset*:
3108 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
3107 ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
3109 label='log.changeset')
3108 label='log.changeset')
3110 ui.write(' '.join(p.tags()), label='log.tag')
3109 ui.write(' '.join(p.tags()), label='log.tag')
3111 if p.rev() == -1:
3110 if p.rev() == -1:
3112 if not len(repo):
3111 if not len(repo):
3113 ui.write(_(' (empty repository)'))
3112 ui.write(_(' (empty repository)'))
3114 else:
3113 else:
3115 ui.write(_(' (no revision checked out)'))
3114 ui.write(_(' (no revision checked out)'))
3116 ui.write('\n')
3115 ui.write('\n')
3117 if p.description():
3116 if p.description():
3118 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
3117 ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
3119 label='log.summary')
3118 label='log.summary')
3120
3119
3121 branch = ctx.branch()
3120 branch = ctx.branch()
3122 bheads = repo.branchheads(branch)
3121 bheads = repo.branchheads(branch)
3123 m = _('branch: %s\n') % branch
3122 m = _('branch: %s\n') % branch
3124 if branch != 'default':
3123 if branch != 'default':
3125 ui.write(m, label='log.branch')
3124 ui.write(m, label='log.branch')
3126 else:
3125 else:
3127 ui.status(m, label='log.branch')
3126 ui.status(m, label='log.branch')
3128
3127
3129 st = list(repo.status(unknown=True))[:6]
3128 st = list(repo.status(unknown=True))[:6]
3130
3129
3131 ms = mergemod.mergestate(repo)
3130 ms = mergemod.mergestate(repo)
3132 st.append([f for f in ms if ms[f] == 'u'])
3131 st.append([f for f in ms if ms[f] == 'u'])
3133
3132
3134 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
3133 subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
3135 st.append(subs)
3134 st.append(subs)
3136
3135
3137 labels = [ui.label(_('%d modified'), 'status.modified'),
3136 labels = [ui.label(_('%d modified'), 'status.modified'),
3138 ui.label(_('%d added'), 'status.added'),
3137 ui.label(_('%d added'), 'status.added'),
3139 ui.label(_('%d removed'), 'status.removed'),
3138 ui.label(_('%d removed'), 'status.removed'),
3140 ui.label(_('%d deleted'), 'status.deleted'),
3139 ui.label(_('%d deleted'), 'status.deleted'),
3141 ui.label(_('%d unknown'), 'status.unknown'),
3140 ui.label(_('%d unknown'), 'status.unknown'),
3142 ui.label(_('%d ignored'), 'status.ignored'),
3141 ui.label(_('%d ignored'), 'status.ignored'),
3143 ui.label(_('%d unresolved'), 'resolve.unresolved'),
3142 ui.label(_('%d unresolved'), 'resolve.unresolved'),
3144 ui.label(_('%d subrepos'), 'status.modified')]
3143 ui.label(_('%d subrepos'), 'status.modified')]
3145 t = []
3144 t = []
3146 for s, l in zip(st, labels):
3145 for s, l in zip(st, labels):
3147 if s:
3146 if s:
3148 t.append(l % len(s))
3147 t.append(l % len(s))
3149
3148
3150 t = ', '.join(t)
3149 t = ', '.join(t)
3151 cleanworkdir = False
3150 cleanworkdir = False
3152
3151
3153 if len(parents) > 1:
3152 if len(parents) > 1:
3154 t += _(' (merge)')
3153 t += _(' (merge)')
3155 elif branch != parents[0].branch():
3154 elif branch != parents[0].branch():
3156 t += _(' (new branch)')
3155 t += _(' (new branch)')
3157 elif (parents[0].extra().get('close') and
3156 elif (parents[0].extra().get('close') and
3158 pnode in repo.branchheads(branch, closed=True)):
3157 pnode in repo.branchheads(branch, closed=True)):
3159 t += _(' (head closed)')
3158 t += _(' (head closed)')
3160 elif (not st[0] and not st[1] and not st[2] and not st[7]):
3159 elif (not st[0] and not st[1] and not st[2] and not st[7]):
3161 t += _(' (clean)')
3160 t += _(' (clean)')
3162 cleanworkdir = True
3161 cleanworkdir = True
3163 elif pnode not in bheads:
3162 elif pnode not in bheads:
3164 t += _(' (new branch head)')
3163 t += _(' (new branch head)')
3165
3164
3166 if cleanworkdir:
3165 if cleanworkdir:
3167 ui.status(_('commit: %s\n') % t.strip())
3166 ui.status(_('commit: %s\n') % t.strip())
3168 else:
3167 else:
3169 ui.write(_('commit: %s\n') % t.strip())
3168 ui.write(_('commit: %s\n') % t.strip())
3170
3169
3171 # all ancestors of branch heads - all ancestors of parent = new csets
3170 # all ancestors of branch heads - all ancestors of parent = new csets
3172 new = [0] * len(repo)
3171 new = [0] * len(repo)
3173 cl = repo.changelog
3172 cl = repo.changelog
3174 for a in [cl.rev(n) for n in bheads]:
3173 for a in [cl.rev(n) for n in bheads]:
3175 new[a] = 1
3174 new[a] = 1
3176 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3175 for a in cl.ancestors(*[cl.rev(n) for n in bheads]):
3177 new[a] = 1
3176 new[a] = 1
3178 for a in [p.rev() for p in parents]:
3177 for a in [p.rev() for p in parents]:
3179 if a >= 0:
3178 if a >= 0:
3180 new[a] = 0
3179 new[a] = 0
3181 for a in cl.ancestors(*[p.rev() for p in parents]):
3180 for a in cl.ancestors(*[p.rev() for p in parents]):
3182 new[a] = 0
3181 new[a] = 0
3183 new = sum(new)
3182 new = sum(new)
3184
3183
3185 if new == 0:
3184 if new == 0:
3186 ui.status(_('update: (current)\n'))
3185 ui.status(_('update: (current)\n'))
3187 elif pnode not in bheads:
3186 elif pnode not in bheads:
3188 ui.write(_('update: %d new changesets (update)\n') % new)
3187 ui.write(_('update: %d new changesets (update)\n') % new)
3189 else:
3188 else:
3190 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3189 ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
3191 (new, len(bheads)))
3190 (new, len(bheads)))
3192
3191
3193 if opts.get('remote'):
3192 if opts.get('remote'):
3194 t = []
3193 t = []
3195 source, branches = hg.parseurl(ui.expandpath('default'))
3194 source, branches = hg.parseurl(ui.expandpath('default'))
3196 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3195 other = hg.repository(cmdutil.remoteui(repo, {}), source)
3197 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3196 revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
3198 ui.debug('comparing with %s\n' % url.hidepassword(source))
3197 ui.debug('comparing with %s\n' % url.hidepassword(source))
3199 repo.ui.pushbuffer()
3198 repo.ui.pushbuffer()
3200 common, incoming, rheads = repo.findcommonincoming(other)
3199 common, incoming, rheads = repo.findcommonincoming(other)
3201 repo.ui.popbuffer()
3200 repo.ui.popbuffer()
3202 if incoming:
3201 if incoming:
3203 t.append(_('1 or more incoming'))
3202 t.append(_('1 or more incoming'))
3204
3203
3205 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3204 dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
3206 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3205 revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
3207 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3206 other = hg.repository(cmdutil.remoteui(repo, {}), dest)
3208 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3207 ui.debug('comparing with %s\n' % url.hidepassword(dest))
3209 repo.ui.pushbuffer()
3208 repo.ui.pushbuffer()
3210 o = repo.findoutgoing(other)
3209 o = repo.findoutgoing(other)
3211 repo.ui.popbuffer()
3210 repo.ui.popbuffer()
3212 o = repo.changelog.nodesbetween(o, None)[0]
3211 o = repo.changelog.nodesbetween(o, None)[0]
3213 if o:
3212 if o:
3214 t.append(_('%d outgoing') % len(o))
3213 t.append(_('%d outgoing') % len(o))
3215
3214
3216 if t:
3215 if t:
3217 ui.write(_('remote: %s\n') % (', '.join(t)))
3216 ui.write(_('remote: %s\n') % (', '.join(t)))
3218 else:
3217 else:
3219 ui.status(_('remote: (synced)\n'))
3218 ui.status(_('remote: (synced)\n'))
3220
3219
3221 def tag(ui, repo, name1, *names, **opts):
3220 def tag(ui, repo, name1, *names, **opts):
3222 """add one or more tags for the current or given revision
3221 """add one or more tags for the current or given revision
3223
3222
3224 Name a particular revision using <name>.
3223 Name a particular revision using <name>.
3225
3224
3226 Tags are used to name particular revisions of the repository and are
3225 Tags are used to name particular revisions of the repository and are
3227 very useful to compare different revisions, to go back to significant
3226 very useful to compare different revisions, to go back to significant
3228 earlier versions or to mark branch points as releases, etc.
3227 earlier versions or to mark branch points as releases, etc.
3229
3228
3230 If no revision is given, the parent of the working directory is
3229 If no revision is given, the parent of the working directory is
3231 used, or tip if no revision is checked out.
3230 used, or tip if no revision is checked out.
3232
3231
3233 To facilitate version control, distribution, and merging of tags,
3232 To facilitate version control, distribution, and merging of tags,
3234 they are stored as a file named ".hgtags" which is managed
3233 they are stored as a file named ".hgtags" which is managed
3235 similarly to other project files and can be hand-edited if
3234 similarly to other project files and can be hand-edited if
3236 necessary. The file '.hg/localtags' is used for local tags (not
3235 necessary. The file '.hg/localtags' is used for local tags (not
3237 shared among repositories).
3236 shared among repositories).
3238
3237
3239 See :hg:`help dates` for a list of formats valid for -d/--date.
3238 See :hg:`help dates` for a list of formats valid for -d/--date.
3240
3239
3241 Since tag names have priority over branch names during revision
3240 Since tag names have priority over branch names during revision
3242 lookup, using an existing branch name as a tag name is discouraged.
3241 lookup, using an existing branch name as a tag name is discouraged.
3243 """
3242 """
3244
3243
3245 rev_ = "."
3244 rev_ = "."
3246 names = [t.strip() for t in (name1,) + names]
3245 names = [t.strip() for t in (name1,) + names]
3247 if len(names) != len(set(names)):
3246 if len(names) != len(set(names)):
3248 raise util.Abort(_('tag names must be unique'))
3247 raise util.Abort(_('tag names must be unique'))
3249 for n in names:
3248 for n in names:
3250 if n in ['tip', '.', 'null']:
3249 if n in ['tip', '.', 'null']:
3251 raise util.Abort(_('the name \'%s\' is reserved') % n)
3250 raise util.Abort(_('the name \'%s\' is reserved') % n)
3252 if opts.get('rev') and opts.get('remove'):
3251 if opts.get('rev') and opts.get('remove'):
3253 raise util.Abort(_("--rev and --remove are incompatible"))
3252 raise util.Abort(_("--rev and --remove are incompatible"))
3254 if opts.get('rev'):
3253 if opts.get('rev'):
3255 rev_ = opts['rev']
3254 rev_ = opts['rev']
3256 message = opts.get('message')
3255 message = opts.get('message')
3257 if opts.get('remove'):
3256 if opts.get('remove'):
3258 expectedtype = opts.get('local') and 'local' or 'global'
3257 expectedtype = opts.get('local') and 'local' or 'global'
3259 for n in names:
3258 for n in names:
3260 if not repo.tagtype(n):
3259 if not repo.tagtype(n):
3261 raise util.Abort(_('tag \'%s\' does not exist') % n)
3260 raise util.Abort(_('tag \'%s\' does not exist') % n)
3262 if repo.tagtype(n) != expectedtype:
3261 if repo.tagtype(n) != expectedtype:
3263 if expectedtype == 'global':
3262 if expectedtype == 'global':
3264 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3263 raise util.Abort(_('tag \'%s\' is not a global tag') % n)
3265 else:
3264 else:
3266 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3265 raise util.Abort(_('tag \'%s\' is not a local tag') % n)
3267 rev_ = nullid
3266 rev_ = nullid
3268 if not message:
3267 if not message:
3269 # we don't translate commit messages
3268 # we don't translate commit messages
3270 message = 'Removed tag %s' % ', '.join(names)
3269 message = 'Removed tag %s' % ', '.join(names)
3271 elif not opts.get('force'):
3270 elif not opts.get('force'):
3272 for n in names:
3271 for n in names:
3273 if n in repo.tags():
3272 if n in repo.tags():
3274 raise util.Abort(_('tag \'%s\' already exists '
3273 raise util.Abort(_('tag \'%s\' already exists '
3275 '(use -f to force)') % n)
3274 '(use -f to force)') % n)
3276 if not rev_ and repo.dirstate.parents()[1] != nullid:
3275 if not rev_ and repo.dirstate.parents()[1] != nullid:
3277 raise util.Abort(_('uncommitted merge - please provide a '
3276 raise util.Abort(_('uncommitted merge - please provide a '
3278 'specific revision'))
3277 'specific revision'))
3279 r = repo[rev_].node()
3278 r = repo[rev_].node()
3280
3279
3281 if not message:
3280 if not message:
3282 # we don't translate commit messages
3281 # we don't translate commit messages
3283 message = ('Added tag %s for changeset %s' %
3282 message = ('Added tag %s for changeset %s' %
3284 (', '.join(names), short(r)))
3283 (', '.join(names), short(r)))
3285
3284
3286 date = opts.get('date')
3285 date = opts.get('date')
3287 if date:
3286 if date:
3288 date = util.parsedate(date)
3287 date = util.parsedate(date)
3289
3288
3290 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3289 repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
3291
3290
3292 def tags(ui, repo):
3291 def tags(ui, repo):
3293 """list repository tags
3292 """list repository tags
3294
3293
3295 This lists both regular and local tags. When the -v/--verbose
3294 This lists both regular and local tags. When the -v/--verbose
3296 switch is used, a third column "local" is printed for local tags.
3295 switch is used, a third column "local" is printed for local tags.
3297 """
3296 """
3298
3297
3299 hexfunc = ui.debugflag and hex or short
3298 hexfunc = ui.debugflag and hex or short
3300 tagtype = ""
3299 tagtype = ""
3301
3300
3302 for t, n in reversed(repo.tagslist()):
3301 for t, n in reversed(repo.tagslist()):
3303 if ui.quiet:
3302 if ui.quiet:
3304 ui.write("%s\n" % t)
3303 ui.write("%s\n" % t)
3305 continue
3304 continue
3306
3305
3307 try:
3306 try:
3308 hn = hexfunc(n)
3307 hn = hexfunc(n)
3309 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3308 r = "%5d:%s" % (repo.changelog.rev(n), hn)
3310 except error.LookupError:
3309 except error.LookupError:
3311 r = " ?:%s" % hn
3310 r = " ?:%s" % hn
3312 else:
3311 else:
3313 spaces = " " * (30 - encoding.colwidth(t))
3312 spaces = " " * (30 - encoding.colwidth(t))
3314 if ui.verbose:
3313 if ui.verbose:
3315 if repo.tagtype(t) == 'local':
3314 if repo.tagtype(t) == 'local':
3316 tagtype = " local"
3315 tagtype = " local"
3317 else:
3316 else:
3318 tagtype = ""
3317 tagtype = ""
3319 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3318 ui.write("%s%s %s%s\n" % (t, spaces, r, tagtype))
3320
3319
3321 def tip(ui, repo, **opts):
3320 def tip(ui, repo, **opts):
3322 """show the tip revision
3321 """show the tip revision
3323
3322
3324 The tip revision (usually just called the tip) is the changeset
3323 The tip revision (usually just called the tip) is the changeset
3325 most recently added to the repository (and therefore the most
3324 most recently added to the repository (and therefore the most
3326 recently changed head).
3325 recently changed head).
3327
3326
3328 If you have just made a commit, that commit will be the tip. If
3327 If you have just made a commit, that commit will be the tip. If
3329 you have just pulled changes from another repository, the tip of
3328 you have just pulled changes from another repository, the tip of
3330 that repository becomes the current tip. The "tip" tag is special
3329 that repository becomes the current tip. The "tip" tag is special
3331 and cannot be renamed or assigned to a different changeset.
3330 and cannot be renamed or assigned to a different changeset.
3332 """
3331 """
3333 displayer = cmdutil.show_changeset(ui, repo, opts)
3332 displayer = cmdutil.show_changeset(ui, repo, opts)
3334 displayer.show(repo[len(repo) - 1])
3333 displayer.show(repo[len(repo) - 1])
3335 displayer.close()
3334 displayer.close()
3336
3335
3337 def unbundle(ui, repo, fname1, *fnames, **opts):
3336 def unbundle(ui, repo, fname1, *fnames, **opts):
3338 """apply one or more changegroup files
3337 """apply one or more changegroup files
3339
3338
3340 Apply one or more compressed changegroup files generated by the
3339 Apply one or more compressed changegroup files generated by the
3341 bundle command.
3340 bundle command.
3342 """
3341 """
3343 fnames = (fname1,) + fnames
3342 fnames = (fname1,) + fnames
3344
3343
3345 lock = repo.lock()
3344 lock = repo.lock()
3346 try:
3345 try:
3347 for fname in fnames:
3346 for fname in fnames:
3348 f = url.open(ui, fname)
3347 f = url.open(ui, fname)
3349 gen = changegroup.readbundle(f, fname)
3348 gen = changegroup.readbundle(f, fname)
3350 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3349 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
3351 finally:
3350 finally:
3352 lock.release()
3351 lock.release()
3353
3352
3354 return postincoming(ui, repo, modheads, opts.get('update'), None)
3353 return postincoming(ui, repo, modheads, opts.get('update'), None)
3355
3354
3356 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3355 def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
3357 """update working directory (or switch revisions)
3356 """update working directory (or switch revisions)
3358
3357
3359 Update the repository's working directory to the specified
3358 Update the repository's working directory to the specified
3360 changeset.
3359 changeset.
3361
3360
3362 If no changeset is specified, attempt to update to the head of the
3361 If no changeset is specified, attempt to update to the head of the
3363 current branch. If this head is a descendant of the working
3362 current branch. If this head is a descendant of the working
3364 directory's parent, update to it, otherwise abort.
3363 directory's parent, update to it, otherwise abort.
3365
3364
3366 The following rules apply when the working directory contains
3365 The following rules apply when the working directory contains
3367 uncommitted changes:
3366 uncommitted changes:
3368
3367
3369 1. If neither -c/--check nor -C/--clean is specified, and if
3368 1. If neither -c/--check nor -C/--clean is specified, and if
3370 the requested changeset is an ancestor or descendant of
3369 the requested changeset is an ancestor or descendant of
3371 the working directory's parent, the uncommitted changes
3370 the working directory's parent, the uncommitted changes
3372 are merged into the requested changeset and the merged
3371 are merged into the requested changeset and the merged
3373 result is left uncommitted. If the requested changeset is
3372 result is left uncommitted. If the requested changeset is
3374 not an ancestor or descendant (that is, it is on another
3373 not an ancestor or descendant (that is, it is on another
3375 branch), the update is aborted and the uncommitted changes
3374 branch), the update is aborted and the uncommitted changes
3376 are preserved.
3375 are preserved.
3377
3376
3378 2. With the -c/--check option, the update is aborted and the
3377 2. With the -c/--check option, the update is aborted and the
3379 uncommitted changes are preserved.
3378 uncommitted changes are preserved.
3380
3379
3381 3. With the -C/--clean option, uncommitted changes are discarded and
3380 3. With the -C/--clean option, uncommitted changes are discarded and
3382 the working directory is updated to the requested changeset.
3381 the working directory is updated to the requested changeset.
3383
3382
3384 Use null as the changeset to remove the working directory (like
3383 Use null as the changeset to remove the working directory (like
3385 :hg:`clone -U`).
3384 :hg:`clone -U`).
3386
3385
3387 If you want to update just one file to an older changeset, use :hg:`revert`.
3386 If you want to update just one file to an older changeset, use :hg:`revert`.
3388
3387
3389 See :hg:`help dates` for a list of formats valid for -d/--date.
3388 See :hg:`help dates` for a list of formats valid for -d/--date.
3390 """
3389 """
3391 if rev and node:
3390 if rev and node:
3392 raise util.Abort(_("please specify just one revision"))
3391 raise util.Abort(_("please specify just one revision"))
3393
3392
3394 if not rev:
3393 if not rev:
3395 rev = node
3394 rev = node
3396
3395
3397 if check and clean:
3396 if check and clean:
3398 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3397 raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
3399
3398
3400 if check:
3399 if check:
3401 # we could use dirty() but we can ignore merge and branch trivia
3400 # we could use dirty() but we can ignore merge and branch trivia
3402 c = repo[None]
3401 c = repo[None]
3403 if c.modified() or c.added() or c.removed():
3402 if c.modified() or c.added() or c.removed():
3404 raise util.Abort(_("uncommitted local changes"))
3403 raise util.Abort(_("uncommitted local changes"))
3405
3404
3406 if date:
3405 if date:
3407 if rev:
3406 if rev:
3408 raise util.Abort(_("you can't specify a revision and a date"))
3407 raise util.Abort(_("you can't specify a revision and a date"))
3409 rev = cmdutil.finddate(ui, repo, date)
3408 rev = cmdutil.finddate(ui, repo, date)
3410
3409
3411 if clean or check:
3410 if clean or check:
3412 return hg.clean(repo, rev)
3411 return hg.clean(repo, rev)
3413 else:
3412 else:
3414 return hg.update(repo, rev)
3413 return hg.update(repo, rev)
3415
3414
3416 def verify(ui, repo):
3415 def verify(ui, repo):
3417 """verify the integrity of the repository
3416 """verify the integrity of the repository
3418
3417
3419 Verify the integrity of the current repository.
3418 Verify the integrity of the current repository.
3420
3419
3421 This will perform an extensive check of the repository's
3420 This will perform an extensive check of the repository's
3422 integrity, validating the hashes and checksums of each entry in
3421 integrity, validating the hashes and checksums of each entry in
3423 the changelog, manifest, and tracked files, as well as the
3422 the changelog, manifest, and tracked files, as well as the
3424 integrity of their crosslinks and indices.
3423 integrity of their crosslinks and indices.
3425 """
3424 """
3426 return hg.verify(repo)
3425 return hg.verify(repo)
3427
3426
3428 def version_(ui):
3427 def version_(ui):
3429 """output version and copyright information"""
3428 """output version and copyright information"""
3430 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3429 ui.write(_("Mercurial Distributed SCM (version %s)\n")
3431 % util.version())
3430 % util.version())
3432 ui.status(_(
3431 ui.status(_(
3433 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3432 "\nCopyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
3434 "This is free software; see the source for copying conditions. "
3433 "This is free software; see the source for copying conditions. "
3435 "There is NO\nwarranty; "
3434 "There is NO\nwarranty; "
3436 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3435 "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
3437 ))
3436 ))
3438
3437
3439 # Command options and aliases are listed here, alphabetically
3438 # Command options and aliases are listed here, alphabetically
3440
3439
3441 globalopts = [
3440 globalopts = [
3442 ('R', 'repository', '',
3441 ('R', 'repository', '',
3443 _('repository root directory or name of overlay bundle file')),
3442 _('repository root directory or name of overlay bundle file')),
3444 ('', 'cwd', '', _('change working directory')),
3443 ('', 'cwd', '', _('change working directory')),
3445 ('y', 'noninteractive', None,
3444 ('y', 'noninteractive', None,
3446 _('do not prompt, assume \'yes\' for any required answers')),
3445 _('do not prompt, assume \'yes\' for any required answers')),
3447 ('q', 'quiet', None, _('suppress output')),
3446 ('q', 'quiet', None, _('suppress output')),
3448 ('v', 'verbose', None, _('enable additional output')),
3447 ('v', 'verbose', None, _('enable additional output')),
3449 ('', 'config', [],
3448 ('', 'config', [],
3450 _('set/override config option (use \'section.name=value\')')),
3449 _('set/override config option (use \'section.name=value\')')),
3451 ('', 'debug', None, _('enable debugging output')),
3450 ('', 'debug', None, _('enable debugging output')),
3452 ('', 'debugger', None, _('start debugger')),
3451 ('', 'debugger', None, _('start debugger')),
3453 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3452 ('', 'encoding', encoding.encoding, _('set the charset encoding')),
3454 ('', 'encodingmode', encoding.encodingmode,
3453 ('', 'encodingmode', encoding.encodingmode,
3455 _('set the charset encoding mode')),
3454 _('set the charset encoding mode')),
3456 ('', 'traceback', None, _('always print a traceback on exception')),
3455 ('', 'traceback', None, _('always print a traceback on exception')),
3457 ('', 'time', None, _('time how long the command takes')),
3456 ('', 'time', None, _('time how long the command takes')),
3458 ('', 'profile', None, _('print command execution profile')),
3457 ('', 'profile', None, _('print command execution profile')),
3459 ('', 'version', None, _('output version information and exit')),
3458 ('', 'version', None, _('output version information and exit')),
3460 ('h', 'help', None, _('display help and exit')),
3459 ('h', 'help', None, _('display help and exit')),
3461 ]
3460 ]
3462
3461
3463 dryrunopts = [('n', 'dry-run', None,
3462 dryrunopts = [('n', 'dry-run', None,
3464 _('do not perform actions, just print output'))]
3463 _('do not perform actions, just print output'))]
3465
3464
3466 remoteopts = [
3465 remoteopts = [
3467 ('e', 'ssh', '', _('specify ssh command to use')),
3466 ('e', 'ssh', '', _('specify ssh command to use')),
3468 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3467 ('', 'remotecmd', '', _('specify hg command to run on the remote side')),
3469 ]
3468 ]
3470
3469
3471 walkopts = [
3470 walkopts = [
3472 ('I', 'include', [], _('include names matching the given patterns')),
3471 ('I', 'include', [], _('include names matching the given patterns')),
3473 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3472 ('X', 'exclude', [], _('exclude names matching the given patterns')),
3474 ]
3473 ]
3475
3474
3476 commitopts = [
3475 commitopts = [
3477 ('m', 'message', '', _('use <text> as commit message')),
3476 ('m', 'message', '', _('use <text> as commit message')),
3478 ('l', 'logfile', '', _('read commit message from <file>')),
3477 ('l', 'logfile', '', _('read commit message from <file>')),
3479 ]
3478 ]
3480
3479
3481 commitopts2 = [
3480 commitopts2 = [
3482 ('d', 'date', '', _('record datecode as commit date')),
3481 ('d', 'date', '', _('record datecode as commit date')),
3483 ('u', 'user', '', _('record the specified user as committer')),
3482 ('u', 'user', '', _('record the specified user as committer')),
3484 ]
3483 ]
3485
3484
3486 templateopts = [
3485 templateopts = [
3487 ('', 'style', '', _('display using template map file')),
3486 ('', 'style', '', _('display using template map file')),
3488 ('', 'template', '', _('display with template')),
3487 ('', 'template', '', _('display with template')),
3489 ]
3488 ]
3490
3489
3491 logopts = [
3490 logopts = [
3492 ('p', 'patch', None, _('show patch')),
3491 ('p', 'patch', None, _('show patch')),
3493 ('g', 'git', None, _('use git extended diff format')),
3492 ('g', 'git', None, _('use git extended diff format')),
3494 ('l', 'limit', '', _('limit number of changes displayed')),
3493 ('l', 'limit', '', _('limit number of changes displayed')),
3495 ('M', 'no-merges', None, _('do not show merges')),
3494 ('M', 'no-merges', None, _('do not show merges')),
3496 ('', 'stat', None, _('output diffstat-style summary of changes')),
3495 ('', 'stat', None, _('output diffstat-style summary of changes')),
3497 ] + templateopts
3496 ] + templateopts
3498
3497
3499 diffopts = [
3498 diffopts = [
3500 ('a', 'text', None, _('treat all files as text')),
3499 ('a', 'text', None, _('treat all files as text')),
3501 ('g', 'git', None, _('use git extended diff format')),
3500 ('g', 'git', None, _('use git extended diff format')),
3502 ('', 'nodates', None, _('omit dates from diff headers'))
3501 ('', 'nodates', None, _('omit dates from diff headers'))
3503 ]
3502 ]
3504
3503
3505 diffopts2 = [
3504 diffopts2 = [
3506 ('p', 'show-function', None, _('show which function each change is in')),
3505 ('p', 'show-function', None, _('show which function each change is in')),
3507 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3506 ('', 'reverse', None, _('produce a diff that undoes the changes')),
3508 ('w', 'ignore-all-space', None,
3507 ('w', 'ignore-all-space', None,
3509 _('ignore white space when comparing lines')),
3508 _('ignore white space when comparing lines')),
3510 ('b', 'ignore-space-change', None,
3509 ('b', 'ignore-space-change', None,
3511 _('ignore changes in the amount of white space')),
3510 _('ignore changes in the amount of white space')),
3512 ('B', 'ignore-blank-lines', None,
3511 ('B', 'ignore-blank-lines', None,
3513 _('ignore changes whose lines are all blank')),
3512 _('ignore changes whose lines are all blank')),
3514 ('U', 'unified', '', _('number of lines of context to show')),
3513 ('U', 'unified', '', _('number of lines of context to show')),
3515 ('', 'stat', None, _('output diffstat-style summary of changes')),
3514 ('', 'stat', None, _('output diffstat-style summary of changes')),
3516 ]
3515 ]
3517
3516
3518 similarityopts = [
3517 similarityopts = [
3519 ('s', 'similarity', '',
3518 ('s', 'similarity', '',
3520 _('guess renamed files by similarity (0<=s<=100)'))
3519 _('guess renamed files by similarity (0<=s<=100)'))
3521 ]
3520 ]
3522
3521
3523 table = {
3522 table = {
3524 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3523 "^add": (add, walkopts + dryrunopts, _('[OPTION]... [FILE]...')),
3525 "addremove":
3524 "addremove":
3526 (addremove, similarityopts + walkopts + dryrunopts,
3525 (addremove, similarityopts + walkopts + dryrunopts,
3527 _('[OPTION]... [FILE]...')),
3526 _('[OPTION]... [FILE]...')),
3528 "^annotate|blame":
3527 "^annotate|blame":
3529 (annotate,
3528 (annotate,
3530 [('r', 'rev', '', _('annotate the specified revision')),
3529 [('r', 'rev', '', _('annotate the specified revision')),
3531 ('', 'follow', None,
3530 ('', 'follow', None,
3532 _('follow copies/renames and list the filename (DEPRECATED)')),
3531 _('follow copies/renames and list the filename (DEPRECATED)')),
3533 ('', 'no-follow', None, _("don't follow copies and renames")),
3532 ('', 'no-follow', None, _("don't follow copies and renames")),
3534 ('a', 'text', None, _('treat all files as text')),
3533 ('a', 'text', None, _('treat all files as text')),
3535 ('u', 'user', None, _('list the author (long with -v)')),
3534 ('u', 'user', None, _('list the author (long with -v)')),
3536 ('f', 'file', None, _('list the filename')),
3535 ('f', 'file', None, _('list the filename')),
3537 ('d', 'date', None, _('list the date (short with -q)')),
3536 ('d', 'date', None, _('list the date (short with -q)')),
3538 ('n', 'number', None, _('list the revision number (default)')),
3537 ('n', 'number', None, _('list the revision number (default)')),
3539 ('c', 'changeset', None, _('list the changeset')),
3538 ('c', 'changeset', None, _('list the changeset')),
3540 ('l', 'line-number', None,
3539 ('l', 'line-number', None,
3541 _('show line number at the first appearance'))
3540 _('show line number at the first appearance'))
3542 ] + walkopts,
3541 ] + walkopts,
3543 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3542 _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
3544 "archive":
3543 "archive":
3545 (archive,
3544 (archive,
3546 [('', 'no-decode', None, _('do not pass files through decoders')),
3545 [('', 'no-decode', None, _('do not pass files through decoders')),
3547 ('p', 'prefix', '', _('directory prefix for files in archive')),
3546 ('p', 'prefix', '', _('directory prefix for files in archive')),
3548 ('r', 'rev', '', _('revision to distribute')),
3547 ('r', 'rev', '', _('revision to distribute')),
3549 ('t', 'type', '', _('type of distribution to create')),
3548 ('t', 'type', '', _('type of distribution to create')),
3550 ] + walkopts,
3549 ] + walkopts,
3551 _('[OPTION]... DEST')),
3550 _('[OPTION]... DEST')),
3552 "backout":
3551 "backout":
3553 (backout,
3552 (backout,
3554 [('', 'merge', None,
3553 [('', 'merge', None,
3555 _('merge with old dirstate parent after backout')),
3554 _('merge with old dirstate parent after backout')),
3556 ('', 'parent', '', _('parent to choose when backing out merge')),
3555 ('', 'parent', '', _('parent to choose when backing out merge')),
3557 ('r', 'rev', '', _('revision to backout')),
3556 ('r', 'rev', '', _('revision to backout')),
3558 ] + walkopts + commitopts + commitopts2,
3557 ] + walkopts + commitopts + commitopts2,
3559 _('[OPTION]... [-r] REV')),
3558 _('[OPTION]... [-r] REV')),
3560 "bisect":
3559 "bisect":
3561 (bisect,
3560 (bisect,
3562 [('r', 'reset', False, _('reset bisect state')),
3561 [('r', 'reset', False, _('reset bisect state')),
3563 ('g', 'good', False, _('mark changeset good')),
3562 ('g', 'good', False, _('mark changeset good')),
3564 ('b', 'bad', False, _('mark changeset bad')),
3563 ('b', 'bad', False, _('mark changeset bad')),
3565 ('s', 'skip', False, _('skip testing changeset')),
3564 ('s', 'skip', False, _('skip testing changeset')),
3566 ('c', 'command', '', _('use command to check changeset state')),
3565 ('c', 'command', '', _('use command to check changeset state')),
3567 ('U', 'noupdate', False, _('do not update to target'))],
3566 ('U', 'noupdate', False, _('do not update to target'))],
3568 _("[-gbsr] [-U] [-c CMD] [REV]")),
3567 _("[-gbsr] [-U] [-c CMD] [REV]")),
3569 "branch":
3568 "branch":
3570 (branch,
3569 (branch,
3571 [('f', 'force', None,
3570 [('f', 'force', None,
3572 _('set branch name even if it shadows an existing branch')),
3571 _('set branch name even if it shadows an existing branch')),
3573 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3572 ('C', 'clean', None, _('reset branch name to parent branch name'))],
3574 _('[-fC] [NAME]')),
3573 _('[-fC] [NAME]')),
3575 "branches":
3574 "branches":
3576 (branches,
3575 (branches,
3577 [('a', 'active', False,
3576 [('a', 'active', False,
3578 _('show only branches that have unmerged heads')),
3577 _('show only branches that have unmerged heads')),
3579 ('c', 'closed', False,
3578 ('c', 'closed', False,
3580 _('show normal and closed branches'))],
3579 _('show normal and closed branches'))],
3581 _('[-ac]')),
3580 _('[-ac]')),
3582 "bundle":
3581 "bundle":
3583 (bundle,
3582 (bundle,
3584 [('f', 'force', None,
3583 [('f', 'force', None,
3585 _('run even when the destination is unrelated')),
3584 _('run even when the destination is unrelated')),
3586 ('r', 'rev', [],
3585 ('r', 'rev', [],
3587 _('a changeset intended to be added to the destination')),
3586 _('a changeset intended to be added to the destination')),
3588 ('b', 'branch', [],
3587 ('b', 'branch', [],
3589 _('a specific branch you would like to bundle')),
3588 _('a specific branch you would like to bundle')),
3590 ('', 'base', [],
3589 ('', 'base', [],
3591 _('a base changeset assumed to be available at the destination')),
3590 _('a base changeset assumed to be available at the destination')),
3592 ('a', 'all', None, _('bundle all changesets in the repository')),
3591 ('a', 'all', None, _('bundle all changesets in the repository')),
3593 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3592 ('t', 'type', 'bzip2', _('bundle compression type to use')),
3594 ] + remoteopts,
3593 ] + remoteopts,
3595 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3594 _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]')),
3596 "cat":
3595 "cat":
3597 (cat,
3596 (cat,
3598 [('o', 'output', '', _('print output to file with formatted name')),
3597 [('o', 'output', '', _('print output to file with formatted name')),
3599 ('r', 'rev', '', _('print the given revision')),
3598 ('r', 'rev', '', _('print the given revision')),
3600 ('', 'decode', None, _('apply any matching decode filter')),
3599 ('', 'decode', None, _('apply any matching decode filter')),
3601 ] + walkopts,
3600 ] + walkopts,
3602 _('[OPTION]... FILE...')),
3601 _('[OPTION]... FILE...')),
3603 "^clone":
3602 "^clone":
3604 (clone,
3603 (clone,
3605 [('U', 'noupdate', None,
3604 [('U', 'noupdate', None,
3606 _('the clone will include an empty working copy (only a repository)')),
3605 _('the clone will include an empty working copy (only a repository)')),
3607 ('u', 'updaterev', '',
3606 ('u', 'updaterev', '',
3608 _('revision, tag or branch to check out')),
3607 _('revision, tag or branch to check out')),
3609 ('r', 'rev', [],
3608 ('r', 'rev', [],
3610 _('include the specified changeset')),
3609 _('include the specified changeset')),
3611 ('b', 'branch', [],
3610 ('b', 'branch', [],
3612 _('clone only the specified branch')),
3611 _('clone only the specified branch')),
3613 ('', 'pull', None, _('use pull protocol to copy metadata')),
3612 ('', 'pull', None, _('use pull protocol to copy metadata')),
3614 ('', 'uncompressed', None,
3613 ('', 'uncompressed', None,
3615 _('use uncompressed transfer (fast over LAN)')),
3614 _('use uncompressed transfer (fast over LAN)')),
3616 ] + remoteopts,
3615 ] + remoteopts,
3617 _('[OPTION]... SOURCE [DEST]')),
3616 _('[OPTION]... SOURCE [DEST]')),
3618 "^commit|ci":
3617 "^commit|ci":
3619 (commit,
3618 (commit,
3620 [('A', 'addremove', None,
3619 [('A', 'addremove', None,
3621 _('mark new/missing files as added/removed before committing')),
3620 _('mark new/missing files as added/removed before committing')),
3622 ('', 'close-branch', None,
3621 ('', 'close-branch', None,
3623 _('mark a branch as closed, hiding it from the branch list')),
3622 _('mark a branch as closed, hiding it from the branch list')),
3624 ] + walkopts + commitopts + commitopts2,
3623 ] + walkopts + commitopts + commitopts2,
3625 _('[OPTION]... [FILE]...')),
3624 _('[OPTION]... [FILE]...')),
3626 "copy|cp":
3625 "copy|cp":
3627 (copy,
3626 (copy,
3628 [('A', 'after', None, _('record a copy that has already occurred')),
3627 [('A', 'after', None, _('record a copy that has already occurred')),
3629 ('f', 'force', None,
3628 ('f', 'force', None,
3630 _('forcibly copy over an existing managed file')),
3629 _('forcibly copy over an existing managed file')),
3631 ] + walkopts + dryrunopts,
3630 ] + walkopts + dryrunopts,
3632 _('[OPTION]... [SOURCE]... DEST')),
3631 _('[OPTION]... [SOURCE]... DEST')),
3633 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3632 "debugancestor": (debugancestor, [], _('[INDEX] REV1 REV2')),
3634 "debugcheckstate": (debugcheckstate, [], ''),
3633 "debugcheckstate": (debugcheckstate, [], ''),
3635 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3634 "debugcommands": (debugcommands, [], _('[COMMAND]')),
3636 "debugcomplete":
3635 "debugcomplete":
3637 (debugcomplete,
3636 (debugcomplete,
3638 [('o', 'options', None, _('show the command options'))],
3637 [('o', 'options', None, _('show the command options'))],
3639 _('[-o] CMD')),
3638 _('[-o] CMD')),
3640 "debugdate":
3639 "debugdate":
3641 (debugdate,
3640 (debugdate,
3642 [('e', 'extended', None, _('try extended date formats'))],
3641 [('e', 'extended', None, _('try extended date formats'))],
3643 _('[-e] DATE [RANGE]')),
3642 _('[-e] DATE [RANGE]')),
3644 "debugdata": (debugdata, [], _('FILE REV')),
3643 "debugdata": (debugdata, [], _('FILE REV')),
3645 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3644 "debugfsinfo": (debugfsinfo, [], _('[PATH]')),
3646 "debugindex": (debugindex, [], _('FILE')),
3645 "debugindex": (debugindex, [], _('FILE')),
3647 "debugindexdot": (debugindexdot, [], _('FILE')),
3646 "debugindexdot": (debugindexdot, [], _('FILE')),
3648 "debuginstall": (debuginstall, [], ''),
3647 "debuginstall": (debuginstall, [], ''),
3649 "debugrebuildstate":
3648 "debugrebuildstate":
3650 (debugrebuildstate,
3649 (debugrebuildstate,
3651 [('r', 'rev', '', _('revision to rebuild to'))],
3650 [('r', 'rev', '', _('revision to rebuild to'))],
3652 _('[-r REV] [REV]')),
3651 _('[-r REV] [REV]')),
3653 "debugrename":
3652 "debugrename":
3654 (debugrename,
3653 (debugrename,
3655 [('r', 'rev', '', _('revision to debug'))],
3654 [('r', 'rev', '', _('revision to debug'))],
3656 _('[-r REV] FILE')),
3655 _('[-r REV] FILE')),
3657 "debugsetparents":
3656 "debugsetparents":
3658 (debugsetparents, [], _('REV1 [REV2]')),
3657 (debugsetparents, [], _('REV1 [REV2]')),
3659 "debugstate":
3658 "debugstate":
3660 (debugstate,
3659 (debugstate,
3661 [('', 'nodates', None, _('do not display the saved mtime'))],
3660 [('', 'nodates', None, _('do not display the saved mtime'))],
3662 _('[OPTION]...')),
3661 _('[OPTION]...')),
3663 "debugsub":
3662 "debugsub":
3664 (debugsub,
3663 (debugsub,
3665 [('r', 'rev', '', _('revision to check'))],
3664 [('r', 'rev', '', _('revision to check'))],
3666 _('[-r REV] [REV]')),
3665 _('[-r REV] [REV]')),
3667 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3666 "debugwalk": (debugwalk, walkopts, _('[OPTION]... [FILE]...')),
3668 "^diff":
3667 "^diff":
3669 (diff,
3668 (diff,
3670 [('r', 'rev', [], _('revision')),
3669 [('r', 'rev', [], _('revision')),
3671 ('c', 'change', '', _('change made by revision'))
3670 ('c', 'change', '', _('change made by revision'))
3672 ] + diffopts + diffopts2 + walkopts,
3671 ] + diffopts + diffopts2 + walkopts,
3673 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...')),
3672 _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...')),
3674 "^export":
3673 "^export":
3675 (export,
3674 (export,
3676 [('o', 'output', '', _('print output to file with formatted name')),
3675 [('o', 'output', '', _('print output to file with formatted name')),
3677 ('', 'switch-parent', None, _('diff against the second parent')),
3676 ('', 'switch-parent', None, _('diff against the second parent')),
3678 ('r', 'rev', [], _('revisions to export')),
3677 ('r', 'rev', [], _('revisions to export')),
3679 ] + diffopts,
3678 ] + diffopts,
3680 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3679 _('[OPTION]... [-o OUTFILESPEC] REV...')),
3681 "^forget":
3680 "^forget":
3682 (forget,
3681 (forget,
3683 [] + walkopts,
3682 [] + walkopts,
3684 _('[OPTION]... FILE...')),
3683 _('[OPTION]... FILE...')),
3685 "grep":
3684 "grep":
3686 (grep,
3685 (grep,
3687 [('0', 'print0', None, _('end fields with NUL')),
3686 [('0', 'print0', None, _('end fields with NUL')),
3688 ('', 'all', None, _('print all revisions that match')),
3687 ('', 'all', None, _('print all revisions that match')),
3689 ('f', 'follow', None,
3688 ('f', 'follow', None,
3690 _('follow changeset history,'
3689 _('follow changeset history,'
3691 ' or file history across copies and renames')),
3690 ' or file history across copies and renames')),
3692 ('i', 'ignore-case', None, _('ignore case when matching')),
3691 ('i', 'ignore-case', None, _('ignore case when matching')),
3693 ('l', 'files-with-matches', None,
3692 ('l', 'files-with-matches', None,
3694 _('print only filenames and revisions that match')),
3693 _('print only filenames and revisions that match')),
3695 ('n', 'line-number', None, _('print matching line numbers')),
3694 ('n', 'line-number', None, _('print matching line numbers')),
3696 ('r', 'rev', [], _('only search files changed within revision range')),
3695 ('r', 'rev', [], _('only search files changed within revision range')),
3697 ('u', 'user', None, _('list the author (long with -v)')),
3696 ('u', 'user', None, _('list the author (long with -v)')),
3698 ('d', 'date', None, _('list the date (short with -q)')),
3697 ('d', 'date', None, _('list the date (short with -q)')),
3699 ] + walkopts,
3698 ] + walkopts,
3700 _('[OPTION]... PATTERN [FILE]...')),
3699 _('[OPTION]... PATTERN [FILE]...')),
3701 "heads":
3700 "heads":
3702 (heads,
3701 (heads,
3703 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3702 [('r', 'rev', '', _('show only heads which are descendants of REV')),
3704 ('t', 'topo', False, _('show topological heads only')),
3703 ('t', 'topo', False, _('show topological heads only')),
3705 ('a', 'active', False,
3704 ('a', 'active', False,
3706 _('show active branchheads only [DEPRECATED]')),
3705 _('show active branchheads only [DEPRECATED]')),
3707 ('c', 'closed', False,
3706 ('c', 'closed', False,
3708 _('show normal and closed branch heads')),
3707 _('show normal and closed branch heads')),
3709 ] + templateopts,
3708 ] + templateopts,
3710 _('[-ac] [-r STARTREV] [REV]...')),
3709 _('[-ac] [-r STARTREV] [REV]...')),
3711 "help": (help_, [], _('[TOPIC]')),
3710 "help": (help_, [], _('[TOPIC]')),
3712 "identify|id":
3711 "identify|id":
3713 (identify,
3712 (identify,
3714 [('r', 'rev', '', _('identify the specified revision')),
3713 [('r', 'rev', '', _('identify the specified revision')),
3715 ('n', 'num', None, _('show local revision number')),
3714 ('n', 'num', None, _('show local revision number')),
3716 ('i', 'id', None, _('show global revision id')),
3715 ('i', 'id', None, _('show global revision id')),
3717 ('b', 'branch', None, _('show branch')),
3716 ('b', 'branch', None, _('show branch')),
3718 ('t', 'tags', None, _('show tags'))],
3717 ('t', 'tags', None, _('show tags'))],
3719 _('[-nibt] [-r REV] [SOURCE]')),
3718 _('[-nibt] [-r REV] [SOURCE]')),
3720 "import|patch":
3719 "import|patch":
3721 (import_,
3720 (import_,
3722 [('p', 'strip', 1,
3721 [('p', 'strip', 1,
3723 _('directory strip option for patch. This has the same '
3722 _('directory strip option for patch. This has the same '
3724 'meaning as the corresponding patch option')),
3723 'meaning as the corresponding patch option')),
3725 ('b', 'base', '', _('base path')),
3724 ('b', 'base', '', _('base path')),
3726 ('f', 'force', None,
3725 ('f', 'force', None,
3727 _('skip check for outstanding uncommitted changes')),
3726 _('skip check for outstanding uncommitted changes')),
3728 ('', 'no-commit', None,
3727 ('', 'no-commit', None,
3729 _("don't commit, just update the working directory")),
3728 _("don't commit, just update the working directory")),
3730 ('', 'exact', None,
3729 ('', 'exact', None,
3731 _('apply patch to the nodes from which it was generated')),
3730 _('apply patch to the nodes from which it was generated')),
3732 ('', 'import-branch', None,
3731 ('', 'import-branch', None,
3733 _('use any branch information in patch (implied by --exact)'))] +
3732 _('use any branch information in patch (implied by --exact)'))] +
3734 commitopts + commitopts2 + similarityopts,
3733 commitopts + commitopts2 + similarityopts,
3735 _('[OPTION]... PATCH...')),
3734 _('[OPTION]... PATCH...')),
3736 "incoming|in":
3735 "incoming|in":
3737 (incoming,
3736 (incoming,
3738 [('f', 'force', None,
3737 [('f', 'force', None,
3739 _('run even if remote repository is unrelated')),
3738 _('run even if remote repository is unrelated')),
3740 ('n', 'newest-first', None, _('show newest record first')),
3739 ('n', 'newest-first', None, _('show newest record first')),
3741 ('', 'bundle', '', _('file to store the bundles into')),
3740 ('', 'bundle', '', _('file to store the bundles into')),
3742 ('r', 'rev', [],
3741 ('r', 'rev', [],
3743 _('a remote changeset intended to be added')),
3742 _('a remote changeset intended to be added')),
3744 ('b', 'branch', [],
3743 ('b', 'branch', [],
3745 _('a specific branch you would like to pull')),
3744 _('a specific branch you would like to pull')),
3746 ] + logopts + remoteopts,
3745 ] + logopts + remoteopts,
3747 _('[-p] [-n] [-M] [-f] [-r REV]...'
3746 _('[-p] [-n] [-M] [-f] [-r REV]...'
3748 ' [--bundle FILENAME] [SOURCE]')),
3747 ' [--bundle FILENAME] [SOURCE]')),
3749 "^init":
3748 "^init":
3750 (init,
3749 (init,
3751 remoteopts,
3750 remoteopts,
3752 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3751 _('[-e CMD] [--remotecmd CMD] [DEST]')),
3753 "locate":
3752 "locate":
3754 (locate,
3753 (locate,
3755 [('r', 'rev', '', _('search the repository as it is in REV')),
3754 [('r', 'rev', '', _('search the repository as it is in REV')),
3756 ('0', 'print0', None,
3755 ('0', 'print0', None,
3757 _('end filenames with NUL, for use with xargs')),
3756 _('end filenames with NUL, for use with xargs')),
3758 ('f', 'fullpath', None,
3757 ('f', 'fullpath', None,
3759 _('print complete paths from the filesystem root')),
3758 _('print complete paths from the filesystem root')),
3760 ] + walkopts,
3759 ] + walkopts,
3761 _('[OPTION]... [PATTERN]...')),
3760 _('[OPTION]... [PATTERN]...')),
3762 "^log|history":
3761 "^log|history":
3763 (log,
3762 (log,
3764 [('f', 'follow', None,
3763 [('f', 'follow', None,
3765 _('follow changeset history,'
3764 _('follow changeset history,'
3766 ' or file history across copies and renames')),
3765 ' or file history across copies and renames')),
3767 ('', 'follow-first', None,
3766 ('', 'follow-first', None,
3768 _('only follow the first parent of merge changesets')),
3767 _('only follow the first parent of merge changesets')),
3769 ('d', 'date', '', _('show revisions matching date spec')),
3768 ('d', 'date', '', _('show revisions matching date spec')),
3770 ('C', 'copies', None, _('show copied files')),
3769 ('C', 'copies', None, _('show copied files')),
3771 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3770 ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
3772 ('r', 'rev', [], _('show the specified revision or range')),
3771 ('r', 'rev', [], _('show the specified revision or range')),
3773 ('', 'removed', None, _('include revisions where files were removed')),
3772 ('', 'removed', None, _('include revisions where files were removed')),
3774 ('m', 'only-merges', None, _('show only merges')),
3773 ('m', 'only-merges', None, _('show only merges')),
3775 ('u', 'user', [], _('revisions committed by user')),
3774 ('u', 'user', [], _('revisions committed by user')),
3776 ('', 'only-branch', [],
3775 ('', 'only-branch', [],
3777 _('show only changesets within the given named branch (DEPRECATED)')),
3776 _('show only changesets within the given named branch (DEPRECATED)')),
3778 ('b', 'branch', [],
3777 ('b', 'branch', [],
3779 _('show changesets within the given named branch')),
3778 _('show changesets within the given named branch')),
3780 ('P', 'prune', [],
3779 ('P', 'prune', [],
3781 _('do not display revision or any of its ancestors')),
3780 _('do not display revision or any of its ancestors')),
3782 ] + logopts + walkopts,
3781 ] + logopts + walkopts,
3783 _('[OPTION]... [FILE]')),
3782 _('[OPTION]... [FILE]')),
3784 "manifest":
3783 "manifest":
3785 (manifest,
3784 (manifest,
3786 [('r', 'rev', '', _('revision to display'))],
3785 [('r', 'rev', '', _('revision to display'))],
3787 _('[-r REV]')),
3786 _('[-r REV]')),
3788 "^merge":
3787 "^merge":
3789 (merge,
3788 (merge,
3790 [('f', 'force', None, _('force a merge with outstanding changes')),
3789 [('f', 'force', None, _('force a merge with outstanding changes')),
3791 ('r', 'rev', '', _('revision to merge')),
3790 ('r', 'rev', '', _('revision to merge')),
3792 ('P', 'preview', None,
3791 ('P', 'preview', None,
3793 _('review revisions to merge (no merge is performed)'))],
3792 _('review revisions to merge (no merge is performed)'))],
3794 _('[-P] [-f] [[-r] REV]')),
3793 _('[-P] [-f] [[-r] REV]')),
3795 "outgoing|out":
3794 "outgoing|out":
3796 (outgoing,
3795 (outgoing,
3797 [('f', 'force', None,
3796 [('f', 'force', None,
3798 _('run even when the destination is unrelated')),
3797 _('run even when the destination is unrelated')),
3799 ('r', 'rev', [],
3798 ('r', 'rev', [],
3800 _('a changeset intended to be included in the destination')),
3799 _('a changeset intended to be included in the destination')),
3801 ('n', 'newest-first', None, _('show newest record first')),
3800 ('n', 'newest-first', None, _('show newest record first')),
3802 ('b', 'branch', [],
3801 ('b', 'branch', [],
3803 _('a specific branch you would like to push')),
3802 _('a specific branch you would like to push')),
3804 ] + logopts + remoteopts,
3803 ] + logopts + remoteopts,
3805 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3804 _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]')),
3806 "parents":
3805 "parents":
3807 (parents,
3806 (parents,
3808 [('r', 'rev', '', _('show parents of the specified revision')),
3807 [('r', 'rev', '', _('show parents of the specified revision')),
3809 ] + templateopts,
3808 ] + templateopts,
3810 _('[-r REV] [FILE]')),
3809 _('[-r REV] [FILE]')),
3811 "paths": (paths, [], _('[NAME]')),
3810 "paths": (paths, [], _('[NAME]')),
3812 "^pull":
3811 "^pull":
3813 (pull,
3812 (pull,
3814 [('u', 'update', None,
3813 [('u', 'update', None,
3815 _('update to new branch head if changesets were pulled')),
3814 _('update to new branch head if changesets were pulled')),
3816 ('f', 'force', None,
3815 ('f', 'force', None,
3817 _('run even when remote repository is unrelated')),
3816 _('run even when remote repository is unrelated')),
3818 ('r', 'rev', [],
3817 ('r', 'rev', [],
3819 _('a remote changeset intended to be added')),
3818 _('a remote changeset intended to be added')),
3820 ('b', 'branch', [],
3819 ('b', 'branch', [],
3821 _('a specific branch you would like to pull')),
3820 _('a specific branch you would like to pull')),
3822 ] + remoteopts,
3821 ] + remoteopts,
3823 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3822 _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]')),
3824 "^push":
3823 "^push":
3825 (push,
3824 (push,
3826 [('f', 'force', None, _('force push')),
3825 [('f', 'force', None, _('force push')),
3827 ('r', 'rev', [],
3826 ('r', 'rev', [],
3828 _('a changeset intended to be included in the destination')),
3827 _('a changeset intended to be included in the destination')),
3829 ('b', 'branch', [],
3828 ('b', 'branch', [],
3830 _('a specific branch you would like to push')),
3829 _('a specific branch you would like to push')),
3831 ] + remoteopts,
3830 ] + remoteopts,
3832 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3831 _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')),
3833 "recover": (recover, []),
3832 "recover": (recover, []),
3834 "^remove|rm":
3833 "^remove|rm":
3835 (remove,
3834 (remove,
3836 [('A', 'after', None, _('record delete for missing files')),
3835 [('A', 'after', None, _('record delete for missing files')),
3837 ('f', 'force', None,
3836 ('f', 'force', None,
3838 _('remove (and delete) file even if added or modified')),
3837 _('remove (and delete) file even if added or modified')),
3839 ] + walkopts,
3838 ] + walkopts,
3840 _('[OPTION]... FILE...')),
3839 _('[OPTION]... FILE...')),
3841 "rename|mv":
3840 "rename|mv":
3842 (rename,
3841 (rename,
3843 [('A', 'after', None, _('record a rename that has already occurred')),
3842 [('A', 'after', None, _('record a rename that has already occurred')),
3844 ('f', 'force', None,
3843 ('f', 'force', None,
3845 _('forcibly copy over an existing managed file')),
3844 _('forcibly copy over an existing managed file')),
3846 ] + walkopts + dryrunopts,
3845 ] + walkopts + dryrunopts,
3847 _('[OPTION]... SOURCE... DEST')),
3846 _('[OPTION]... SOURCE... DEST')),
3848 "resolve":
3847 "resolve":
3849 (resolve,
3848 (resolve,
3850 [('a', 'all', None, _('select all unresolved files')),
3849 [('a', 'all', None, _('select all unresolved files')),
3851 ('l', 'list', None, _('list state of files needing merge')),
3850 ('l', 'list', None, _('list state of files needing merge')),
3852 ('m', 'mark', None, _('mark files as resolved')),
3851 ('m', 'mark', None, _('mark files as resolved')),
3853 ('u', 'unmark', None, _('unmark files as resolved')),
3852 ('u', 'unmark', None, _('unmark files as resolved')),
3854 ('n', 'no-status', None, _('hide status prefix'))]
3853 ('n', 'no-status', None, _('hide status prefix'))]
3855 + walkopts,
3854 + walkopts,
3856 _('[OPTION]... [FILE]...')),
3855 _('[OPTION]... [FILE]...')),
3857 "revert":
3856 "revert":
3858 (revert,
3857 (revert,
3859 [('a', 'all', None, _('revert all changes when no arguments given')),
3858 [('a', 'all', None, _('revert all changes when no arguments given')),
3860 ('d', 'date', '', _('tipmost revision matching date')),
3859 ('d', 'date', '', _('tipmost revision matching date')),
3861 ('r', 'rev', '', _('revert to the specified revision')),
3860 ('r', 'rev', '', _('revert to the specified revision')),
3862 ('', 'no-backup', None, _('do not save backup copies of files')),
3861 ('', 'no-backup', None, _('do not save backup copies of files')),
3863 ] + walkopts + dryrunopts,
3862 ] + walkopts + dryrunopts,
3864 _('[OPTION]... [-r REV] [NAME]...')),
3863 _('[OPTION]... [-r REV] [NAME]...')),
3865 "rollback": (rollback, dryrunopts),
3864 "rollback": (rollback, dryrunopts),
3866 "root": (root, []),
3865 "root": (root, []),
3867 "^serve":
3866 "^serve":
3868 (serve,
3867 (serve,
3869 [('A', 'accesslog', '', _('name of access log file to write to')),
3868 [('A', 'accesslog', '', _('name of access log file to write to')),
3870 ('d', 'daemon', None, _('run server in background')),
3869 ('d', 'daemon', None, _('run server in background')),
3871 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3870 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
3872 ('E', 'errorlog', '', _('name of error log file to write to')),
3871 ('E', 'errorlog', '', _('name of error log file to write to')),
3873 # use string type, then we can check if something was passed
3872 # use string type, then we can check if something was passed
3874 ('p', 'port', '', _('port to listen on (default: 8000)')),
3873 ('p', 'port', '', _('port to listen on (default: 8000)')),
3875 ('a', 'address', '',
3874 ('a', 'address', '',
3876 _('address to listen on (default: all interfaces)')),
3875 _('address to listen on (default: all interfaces)')),
3877 ('', 'prefix', '',
3876 ('', 'prefix', '',
3878 _('prefix path to serve from (default: server root)')),
3877 _('prefix path to serve from (default: server root)')),
3879 ('n', 'name', '',
3878 ('n', 'name', '',
3880 _('name to show in web pages (default: working directory)')),
3879 _('name to show in web pages (default: working directory)')),
3881 ('', 'web-conf', '', _('name of the hgweb config file'
3880 ('', 'web-conf', '', _('name of the hgweb config file'
3882 ' (serve more than one repository)')),
3881 ' (serve more than one repository)')),
3883 ('', 'webdir-conf', '', _('name of the hgweb config file'
3882 ('', 'webdir-conf', '', _('name of the hgweb config file'
3884 ' (DEPRECATED)')),
3883 ' (DEPRECATED)')),
3885 ('', 'pid-file', '', _('name of file to write process ID to')),
3884 ('', 'pid-file', '', _('name of file to write process ID to')),
3886 ('', 'stdio', None, _('for remote clients')),
3885 ('', 'stdio', None, _('for remote clients')),
3887 ('t', 'templates', '', _('web templates to use')),
3886 ('t', 'templates', '', _('web templates to use')),
3888 ('', 'style', '', _('template style to use')),
3887 ('', 'style', '', _('template style to use')),
3889 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3888 ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
3890 ('', 'certificate', '', _('SSL certificate file'))],
3889 ('', 'certificate', '', _('SSL certificate file'))],
3891 _('[OPTION]...')),
3890 _('[OPTION]...')),
3892 "showconfig|debugconfig":
3891 "showconfig|debugconfig":
3893 (showconfig,
3892 (showconfig,
3894 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3893 [('u', 'untrusted', None, _('show untrusted configuration options'))],
3895 _('[-u] [NAME]...')),
3894 _('[-u] [NAME]...')),
3896 "^summary|sum":
3895 "^summary|sum":
3897 (summary,
3896 (summary,
3898 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3897 [('', 'remote', None, _('check for push and pull'))], '[--remote]'),
3899 "^status|st":
3898 "^status|st":
3900 (status,
3899 (status,
3901 [('A', 'all', None, _('show status of all files')),
3900 [('A', 'all', None, _('show status of all files')),
3902 ('m', 'modified', None, _('show only modified files')),
3901 ('m', 'modified', None, _('show only modified files')),
3903 ('a', 'added', None, _('show only added files')),
3902 ('a', 'added', None, _('show only added files')),
3904 ('r', 'removed', None, _('show only removed files')),
3903 ('r', 'removed', None, _('show only removed files')),
3905 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3904 ('d', 'deleted', None, _('show only deleted (but tracked) files')),
3906 ('c', 'clean', None, _('show only files without changes')),
3905 ('c', 'clean', None, _('show only files without changes')),
3907 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3906 ('u', 'unknown', None, _('show only unknown (not tracked) files')),
3908 ('i', 'ignored', None, _('show only ignored files')),
3907 ('i', 'ignored', None, _('show only ignored files')),
3909 ('n', 'no-status', None, _('hide status prefix')),
3908 ('n', 'no-status', None, _('hide status prefix')),
3910 ('C', 'copies', None, _('show source of copied files')),
3909 ('C', 'copies', None, _('show source of copied files')),
3911 ('0', 'print0', None,
3910 ('0', 'print0', None,
3912 _('end filenames with NUL, for use with xargs')),
3911 _('end filenames with NUL, for use with xargs')),
3913 ('', 'rev', [], _('show difference from revision')),
3912 ('', 'rev', [], _('show difference from revision')),
3914 ('', 'change', '', _('list the changed files of a revision')),
3913 ('', 'change', '', _('list the changed files of a revision')),
3915 ] + walkopts,
3914 ] + walkopts,
3916 _('[OPTION]... [FILE]...')),
3915 _('[OPTION]... [FILE]...')),
3917 "tag":
3916 "tag":
3918 (tag,
3917 (tag,
3919 [('f', 'force', None, _('replace existing tag')),
3918 [('f', 'force', None, _('replace existing tag')),
3920 ('l', 'local', None, _('make the tag local')),
3919 ('l', 'local', None, _('make the tag local')),
3921 ('r', 'rev', '', _('revision to tag')),
3920 ('r', 'rev', '', _('revision to tag')),
3922 ('', 'remove', None, _('remove a tag')),
3921 ('', 'remove', None, _('remove a tag')),
3923 # -l/--local is already there, commitopts cannot be used
3922 # -l/--local is already there, commitopts cannot be used
3924 ('m', 'message', '', _('use <text> as commit message')),
3923 ('m', 'message', '', _('use <text> as commit message')),
3925 ] + commitopts2,
3924 ] + commitopts2,
3926 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3925 _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...')),
3927 "tags": (tags, [], ''),
3926 "tags": (tags, [], ''),
3928 "tip":
3927 "tip":
3929 (tip,
3928 (tip,
3930 [('p', 'patch', None, _('show patch')),
3929 [('p', 'patch', None, _('show patch')),
3931 ('g', 'git', None, _('use git extended diff format')),
3930 ('g', 'git', None, _('use git extended diff format')),
3932 ] + templateopts,
3931 ] + templateopts,
3933 _('[-p] [-g]')),
3932 _('[-p] [-g]')),
3934 "unbundle":
3933 "unbundle":
3935 (unbundle,
3934 (unbundle,
3936 [('u', 'update', None,
3935 [('u', 'update', None,
3937 _('update to new branch head if changesets were unbundled'))],
3936 _('update to new branch head if changesets were unbundled'))],
3938 _('[-u] FILE...')),
3937 _('[-u] FILE...')),
3939 "^update|up|checkout|co":
3938 "^update|up|checkout|co":
3940 (update,
3939 (update,
3941 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3940 [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
3942 ('c', 'check', None, _('check for uncommitted changes')),
3941 ('c', 'check', None, _('check for uncommitted changes')),
3943 ('d', 'date', '', _('tipmost revision matching date')),
3942 ('d', 'date', '', _('tipmost revision matching date')),
3944 ('r', 'rev', '', _('revision'))],
3943 ('r', 'rev', '', _('revision'))],
3945 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3944 _('[-c] [-C] [-d DATE] [[-r] REV]')),
3946 "verify": (verify, []),
3945 "verify": (verify, []),
3947 "version": (version_, []),
3946 "version": (version_, []),
3948 }
3947 }
3949
3948
3950 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3949 norepo = ("clone init version help debugcommands debugcomplete debugdata"
3951 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3950 " debugindex debugindexdot debugdate debuginstall debugfsinfo")
3952 optionalrepo = ("identify paths serve showconfig debugancestor")
3951 optionalrepo = ("identify paths serve showconfig debugancestor")
@@ -1,182 +1,181 b''
1 0: Adding root node ()
1 0: Adding root node ()
2 -------
2 -------
3 0: Adding root node ()
3 0: Adding root node ()
4 =======
4 =======
5 marked working directory as branch a
5 marked working directory as branch a
6 1: Adding a branch (a)
6 1: Adding a branch (a)
7 0: Adding root node ()
7 0: Adding root node ()
8 -------
8 -------
9 1: Adding a branch (a)
9 1: Adding a branch (a)
10 =======
10 =======
11 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
11 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
12 marked working directory as branch b
12 marked working directory as branch b
13 created new head
14 2: Adding b branch (b)
13 2: Adding b branch (b)
15 1: Adding a branch (a)
14 1: Adding a branch (a)
16 0: Adding root node ()
15 0: Adding root node ()
17 -------
16 -------
18 2: Adding b branch (b)
17 2: Adding b branch (b)
19 =======
18 =======
20 3: Adding b branch head 1 (b)
19 3: Adding b branch head 1 (b)
21 1: Adding a branch (a)
20 1: Adding a branch (a)
22 0: Adding root node ()
21 0: Adding root node ()
23 -------
22 -------
24 3: Adding b branch head 1 (b)
23 3: Adding b branch head 1 (b)
25 =======
24 =======
26 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
25 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
27 created new head
26 created new head
28 4: Adding b branch head 2 (b)
27 4: Adding b branch head 2 (b)
29 3: Adding b branch head 1 (b)
28 3: Adding b branch head 1 (b)
30 1: Adding a branch (a)
29 1: Adding a branch (a)
31 0: Adding root node ()
30 0: Adding root node ()
32 -------
31 -------
33 4: Adding b branch head 2 (b)
32 4: Adding b branch head 2 (b)
34 3: Adding b branch head 1 (b)
33 3: Adding b branch head 1 (b)
35 =======
34 =======
36 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
35 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
37 created new head
36 created new head
38 5: Adding b branch head 3 (b)
37 5: Adding b branch head 3 (b)
39 4: Adding b branch head 2 (b)
38 4: Adding b branch head 2 (b)
40 3: Adding b branch head 1 (b)
39 3: Adding b branch head 1 (b)
41 1: Adding a branch (a)
40 1: Adding a branch (a)
42 0: Adding root node ()
41 0: Adding root node ()
43 -------
42 -------
44 5: Adding b branch head 3 (b)
43 5: Adding b branch head 3 (b)
45 4: Adding b branch head 2 (b)
44 4: Adding b branch head 2 (b)
46 3: Adding b branch head 1 (b)
45 3: Adding b branch head 1 (b)
47 =======
46 =======
48 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
49 (branch merge, don't forget to commit)
48 (branch merge, don't forget to commit)
50 6: Merging b branch head 2 and b branch head 3 (b)
49 6: Merging b branch head 2 and b branch head 3 (b)
51 3: Adding b branch head 1 (b)
50 3: Adding b branch head 1 (b)
52 1: Adding a branch (a)
51 1: Adding a branch (a)
53 0: Adding root node ()
52 0: Adding root node ()
54 -------
53 -------
55 6: Merging b branch head 2 and b branch head 3 (b)
54 6: Merging b branch head 2 and b branch head 3 (b)
56 3: Adding b branch head 1 (b)
55 3: Adding b branch head 1 (b)
57 =======
56 =======
58 marked working directory as branch c
57 marked working directory as branch c
59 7: Adding c branch (c)
58 7: Adding c branch (c)
60 6: Merging b branch head 2 and b branch head 3 (b)
59 6: Merging b branch head 2 and b branch head 3 (b)
61 3: Adding b branch head 1 (b)
60 3: Adding b branch head 1 (b)
62 1: Adding a branch (a)
61 1: Adding a branch (a)
63 0: Adding root node ()
62 0: Adding root node ()
64 -------
63 -------
65 7: Adding c branch (c)
64 7: Adding c branch (c)
66 =======
65 =======
67 no open branch heads found on branches c (started at 3)
66 no open branch heads found on branches c (started at 3)
68 1
67 1
69 -------
68 -------
70 7: Adding c branch (c)
69 7: Adding c branch (c)
71 0
70 0
72 -------
71 -------
73 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
72 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
74 0
73 0
75 -------
74 -------
76 3: Adding b branch head 1 (b)
75 3: Adding b branch head 1 (b)
77 0
76 0
78 -------
77 -------
79 6: Merging b branch head 2 and b branch head 3 (b)
78 6: Merging b branch head 2 and b branch head 3 (b)
80 3: Adding b branch head 1 (b)
79 3: Adding b branch head 1 (b)
81 0
80 0
82 -------
81 -------
83 no open branch heads found on branches b (started at 7)
82 no open branch heads found on branches b (started at 7)
84 1
83 1
85 =======
84 =======
86 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
85 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
87 7: Adding c branch (c)
86 7: Adding c branch (c)
88 6: Merging b branch head 2 and b branch head 3 (b)
87 6: Merging b branch head 2 and b branch head 3 (b)
89 3: Adding b branch head 1 (b)
88 3: Adding b branch head 1 (b)
90 1: Adding a branch (a)
89 1: Adding a branch (a)
91 0: Adding root node ()
90 0: Adding root node ()
92 -------
91 -------
93 0: Adding root node ()
92 0: Adding root node ()
94 -------
93 -------
95 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
94 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
96 7: Adding c branch (c)
95 7: Adding c branch (c)
97 6: Merging b branch head 2 and b branch head 3 (b)
96 6: Merging b branch head 2 and b branch head 3 (b)
98 3: Adding b branch head 1 (b)
97 3: Adding b branch head 1 (b)
99 1: Adding a branch (a)
98 1: Adding a branch (a)
100 0: Adding root node ()
99 0: Adding root node ()
101 -------
100 -------
102 1: Adding a branch (a)
101 1: Adding a branch (a)
103 -------
102 -------
104 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
103 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
105 7: Adding c branch (c)
104 7: Adding c branch (c)
106 6: Merging b branch head 2 and b branch head 3 (b)
105 6: Merging b branch head 2 and b branch head 3 (b)
107 3: Adding b branch head 1 (b)
106 3: Adding b branch head 1 (b)
108 1: Adding a branch (a)
107 1: Adding a branch (a)
109 0: Adding root node ()
108 0: Adding root node ()
110 -------
109 -------
111 6: Merging b branch head 2 and b branch head 3 (b)
110 6: Merging b branch head 2 and b branch head 3 (b)
112 3: Adding b branch head 1 (b)
111 3: Adding b branch head 1 (b)
113 -------
112 -------
114 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
115 7: Adding c branch (c)
114 7: Adding c branch (c)
116 6: Merging b branch head 2 and b branch head 3 (b)
115 6: Merging b branch head 2 and b branch head 3 (b)
117 3: Adding b branch head 1 (b)
116 3: Adding b branch head 1 (b)
118 1: Adding a branch (a)
117 1: Adding a branch (a)
119 0: Adding root node ()
118 0: Adding root node ()
120 -------
119 -------
121 6: Merging b branch head 2 and b branch head 3 (b)
120 6: Merging b branch head 2 and b branch head 3 (b)
122 3: Adding b branch head 1 (b)
121 3: Adding b branch head 1 (b)
123 -------
122 -------
124 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
123 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
125 7: Adding c branch (c)
124 7: Adding c branch (c)
126 6: Merging b branch head 2 and b branch head 3 (b)
125 6: Merging b branch head 2 and b branch head 3 (b)
127 3: Adding b branch head 1 (b)
126 3: Adding b branch head 1 (b)
128 1: Adding a branch (a)
127 1: Adding a branch (a)
129 0: Adding root node ()
128 0: Adding root node ()
130 -------
129 -------
131 6: Merging b branch head 2 and b branch head 3 (b)
130 6: Merging b branch head 2 and b branch head 3 (b)
132 3: Adding b branch head 1 (b)
131 3: Adding b branch head 1 (b)
133 -------
132 -------
134 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
133 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
135 7: Adding c branch (c)
134 7: Adding c branch (c)
136 6: Merging b branch head 2 and b branch head 3 (b)
135 6: Merging b branch head 2 and b branch head 3 (b)
137 3: Adding b branch head 1 (b)
136 3: Adding b branch head 1 (b)
138 1: Adding a branch (a)
137 1: Adding a branch (a)
139 0: Adding root node ()
138 0: Adding root node ()
140 -------
139 -------
141 6: Merging b branch head 2 and b branch head 3 (b)
140 6: Merging b branch head 2 and b branch head 3 (b)
142 3: Adding b branch head 1 (b)
141 3: Adding b branch head 1 (b)
143 -------
142 -------
144 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
143 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
145 7: Adding c branch (c)
144 7: Adding c branch (c)
146 6: Merging b branch head 2 and b branch head 3 (b)
145 6: Merging b branch head 2 and b branch head 3 (b)
147 3: Adding b branch head 1 (b)
146 3: Adding b branch head 1 (b)
148 1: Adding a branch (a)
147 1: Adding a branch (a)
149 0: Adding root node ()
148 0: Adding root node ()
150 -------
149 -------
151 6: Merging b branch head 2 and b branch head 3 (b)
150 6: Merging b branch head 2 and b branch head 3 (b)
152 3: Adding b branch head 1 (b)
151 3: Adding b branch head 1 (b)
153 -------
152 -------
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
155 7: Adding c branch (c)
154 7: Adding c branch (c)
156 6: Merging b branch head 2 and b branch head 3 (b)
155 6: Merging b branch head 2 and b branch head 3 (b)
157 3: Adding b branch head 1 (b)
156 3: Adding b branch head 1 (b)
158 1: Adding a branch (a)
157 1: Adding a branch (a)
159 0: Adding root node ()
158 0: Adding root node ()
160 -------
159 -------
161 7: Adding c branch (c)
160 7: Adding c branch (c)
162 -------
161 -------
163 =======
162 =======
164 1: Adding a branch (a)
163 1: Adding a branch (a)
165 -------
164 -------
166 6: Merging b branch head 2 and b branch head 3 (b)
165 6: Merging b branch head 2 and b branch head 3 (b)
167 3: Adding b branch head 1 (b)
166 3: Adding b branch head 1 (b)
168 -------
167 -------
169 7: Adding c branch (c)
168 7: Adding c branch (c)
170 -------
169 -------
171 abort: unknown revision 'z'!
170 abort: unknown revision 'z'!
172 -------
171 -------
173 =======
172 =======
174 7: Adding c branch (c)
173 7: Adding c branch (c)
175 6: Merging b branch head 2 and b branch head 3 (b)
174 6: Merging b branch head 2 and b branch head 3 (b)
176 3: Adding b branch head 1 (b)
175 3: Adding b branch head 1 (b)
177 1: Adding a branch (a)
176 1: Adding a branch (a)
178 0: Adding root node ()
177 0: Adding root node ()
179 % topological heads
178 % topological heads
180 7: Adding c branch (c)
179 7: Adding c branch (c)
181 3: Adding b branch head 1 (b)
180 3: Adding b branch head 1 (b)
182 1: Adding a branch (a)
181 1: Adding a branch (a)
@@ -1,47 +1,46 b''
1 marked working directory as branch a
1 marked working directory as branch a
2 adding foo
2 adding foo
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 marked working directory as branch c
4 marked working directory as branch c
5 created new head
6 requesting all changes
5 requesting all changes
7 adding changesets
6 adding changesets
8 adding manifests
7 adding manifests
9 adding file changes
8 adding file changes
10 added 1 changesets with 1 changes to 1 files
9 added 1 changesets with 1 changes to 1 files
11 updating to branch a
10 updating to branch a
12 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 marked working directory as branch b
13 marked working directory as branch b
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 marked working directory as branch b
15 marked working directory as branch b
17 created new head
16 created new head
18 in rev c branch a
17 in rev c branch a
19 1:dd6e60a716c6
18 1:dd6e60a716c6
20 2:f25d57ab0566
19 2:f25d57ab0566
21 1:dd6e60a716c6
20 1:dd6e60a716c6
22 2:f25d57ab0566
21 2:f25d57ab0566
23 out branch .
22 out branch .
24 2:65511d0e2b55
23 2:65511d0e2b55
25 2:65511d0e2b55
24 2:65511d0e2b55
26 clone branch b
25 clone branch b
27 requesting all changes
26 requesting all changes
28 adding changesets
27 adding changesets
29 adding manifests
28 adding manifests
30 adding file changes
29 adding file changes
31 added 3 changesets with 3 changes to 1 files (+1 heads)
30 added 3 changesets with 3 changes to 1 files (+1 heads)
32 updating to branch b
31 updating to branch b
33 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
32 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
34 2:65511d0e2b55
33 2:65511d0e2b55
35 1:b84708d77ab7
34 1:b84708d77ab7
36 2:65511d0e2b55
35 2:65511d0e2b55
37 clone rev a branch b
36 clone rev a branch b
38 requesting all changes
37 requesting all changes
39 adding changesets
38 adding changesets
40 adding manifests
39 adding manifests
41 adding file changes
40 adding file changes
42 added 3 changesets with 3 changes to 1 files (+1 heads)
41 added 3 changesets with 3 changes to 1 files (+1 heads)
43 updating to branch a
42 updating to branch a
44 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
43 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
45 2:65511d0e2b55
44 2:65511d0e2b55
46 1:b84708d77ab7
45 1:b84708d77ab7
47 0:5b65ba7c951d
46 0:5b65ba7c951d
@@ -1,245 +1,244 b''
1 marked working directory as branch a
1 marked working directory as branch a
2 marked working directory as branch q
2 marked working directory as branch q
3 reset working directory to branch a
3 reset working directory to branch a
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
5 marked working directory as branch b
5 marked working directory as branch b
6 created new head
7 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
6 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
8 marked working directory as branch c
7 marked working directory as branch c
9 abort: the name 'tip' is reserved
8 abort: the name 'tip' is reserved
10 abort: the name 'null' is reserved
9 abort: the name 'null' is reserved
11 abort: the name '.' is reserved
10 abort: the name '.' is reserved
12 marked working directory as branch a branch name much longer than the default justification used by branches
11 marked working directory as branch a branch name much longer than the default justification used by branches
13 a branch name much longer than the default justification used by branches 7:10ff5895aa57
12 a branch name much longer than the default justification used by branches 7:10ff5895aa57
14 b 4:aee39cd168d0
13 b 4:aee39cd168d0
15 c 6:589736a22561 (inactive)
14 c 6:589736a22561 (inactive)
16 a 5:d8cbc61dbaa6 (inactive)
15 a 5:d8cbc61dbaa6 (inactive)
17 default 0:19709c5a4e75 (inactive)
16 default 0:19709c5a4e75 (inactive)
18 -------
17 -------
19 a branch name much longer than the default justification used by branches 7:10ff5895aa57
18 a branch name much longer than the default justification used by branches 7:10ff5895aa57
20 b 4:aee39cd168d0
19 b 4:aee39cd168d0
21 --- Branch a
20 --- Branch a
22 changeset: 5:d8cbc61dbaa6
21 changeset: 5:d8cbc61dbaa6
23 branch: a
22 branch: a
24 parent: 2:881fe2b92ad0
23 parent: 2:881fe2b92ad0
25 user: test
24 user: test
26 date: Thu Jan 01 00:00:04 1970 +0000
25 date: Thu Jan 01 00:00:04 1970 +0000
27 summary: Adding b branch head 2
26 summary: Adding b branch head 2
28
27
29 changeset: 2:881fe2b92ad0
28 changeset: 2:881fe2b92ad0
30 branch: a
29 branch: a
31 user: test
30 user: test
32 date: Thu Jan 01 00:00:02 1970 +0000
31 date: Thu Jan 01 00:00:02 1970 +0000
33 summary: Adding to a branch
32 summary: Adding to a branch
34
33
35 changeset: 1:dd6b440dd85a
34 changeset: 1:dd6b440dd85a
36 branch: a
35 branch: a
37 user: test
36 user: test
38 date: Thu Jan 01 00:00:01 1970 +0000
37 date: Thu Jan 01 00:00:01 1970 +0000
39 summary: Adding a branch
38 summary: Adding a branch
40
39
41 ---- Branch b
40 ---- Branch b
42 changeset: 4:aee39cd168d0
41 changeset: 4:aee39cd168d0
43 branch: b
42 branch: b
44 user: test
43 user: test
45 date: Thu Jan 01 00:00:03 1970 +0000
44 date: Thu Jan 01 00:00:03 1970 +0000
46 summary: Adding b branch head 1
45 summary: Adding b branch head 1
47
46
48 changeset: 3:ac22033332d1
47 changeset: 3:ac22033332d1
49 branch: b
48 branch: b
50 parent: 0:19709c5a4e75
49 parent: 0:19709c5a4e75
51 user: test
50 user: test
52 date: Thu Jan 01 00:00:02 1970 +0000
51 date: Thu Jan 01 00:00:02 1970 +0000
53 summary: Adding b branch
52 summary: Adding b branch
54
53
55 ---- going to test branch closing
54 ---- going to test branch closing
56 a branch name much longer than the default justification used by branches 7:10ff5895aa57
55 a branch name much longer than the default justification used by branches 7:10ff5895aa57
57 b 4:aee39cd168d0
56 b 4:aee39cd168d0
58 c 6:589736a22561 (inactive)
57 c 6:589736a22561 (inactive)
59 a 5:d8cbc61dbaa6 (inactive)
58 a 5:d8cbc61dbaa6 (inactive)
60 default 0:19709c5a4e75 (inactive)
59 default 0:19709c5a4e75 (inactive)
61 2 files updated, 0 files merged, 4 files removed, 0 files unresolved
60 2 files updated, 0 files merged, 4 files removed, 0 files unresolved
62 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
63 created new head
62 created new head
64 b 10:bfbe841b666e
63 b 10:bfbe841b666e
65 a branch name much longer than the default justification used by branches 7:10ff5895aa57
64 a branch name much longer than the default justification used by branches 7:10ff5895aa57
66 c 6:589736a22561 (inactive)
65 c 6:589736a22561 (inactive)
67 a 5:d8cbc61dbaa6 (inactive)
66 a 5:d8cbc61dbaa6 (inactive)
68 default 0:19709c5a4e75 (inactive)
67 default 0:19709c5a4e75 (inactive)
69 changeset: 10:bfbe841b666e
68 changeset: 10:bfbe841b666e
70 branch: b
69 branch: b
71 tag: tip
70 tag: tip
72 user: test
71 user: test
73 date: Thu Jan 01 00:00:09 1970 +0000
72 date: Thu Jan 01 00:00:09 1970 +0000
74 summary: adding another cset to branch b
73 summary: adding another cset to branch b
75
74
76 changeset: 8:eebb944467c9
75 changeset: 8:eebb944467c9
77 branch: b
76 branch: b
78 parent: 4:aee39cd168d0
77 parent: 4:aee39cd168d0
79 user: test
78 user: test
80 date: Thu Jan 01 00:00:07 1970 +0000
79 date: Thu Jan 01 00:00:07 1970 +0000
81 summary: adding cset to branch b
80 summary: adding cset to branch b
82
81
83 changeset: 7:10ff5895aa57
82 changeset: 7:10ff5895aa57
84 branch: a branch name much longer than the default justification used by branches
83 branch: a branch name much longer than the default justification used by branches
85 user: test
84 user: test
86 date: Thu Jan 01 00:00:06 1970 +0000
85 date: Thu Jan 01 00:00:06 1970 +0000
87 summary: Adding d branch
86 summary: Adding d branch
88
87
89 changeset: 6:589736a22561
88 changeset: 6:589736a22561
90 branch: c
89 branch: c
91 user: test
90 user: test
92 date: Thu Jan 01 00:00:05 1970 +0000
91 date: Thu Jan 01 00:00:05 1970 +0000
93 summary: Adding c branch
92 summary: Adding c branch
94
93
95 changeset: 5:d8cbc61dbaa6
94 changeset: 5:d8cbc61dbaa6
96 branch: a
95 branch: a
97 parent: 2:881fe2b92ad0
96 parent: 2:881fe2b92ad0
98 user: test
97 user: test
99 date: Thu Jan 01 00:00:04 1970 +0000
98 date: Thu Jan 01 00:00:04 1970 +0000
100 summary: Adding b branch head 2
99 summary: Adding b branch head 2
101
100
102 changeset: 0:19709c5a4e75
101 changeset: 0:19709c5a4e75
103 user: test
102 user: test
104 date: Thu Jan 01 00:00:00 1970 +0000
103 date: Thu Jan 01 00:00:00 1970 +0000
105 summary: Adding root node
104 summary: Adding root node
106
105
107 changeset: 10:bfbe841b666e
106 changeset: 10:bfbe841b666e
108 branch: b
107 branch: b
109 tag: tip
108 tag: tip
110 user: test
109 user: test
111 date: Thu Jan 01 00:00:09 1970 +0000
110 date: Thu Jan 01 00:00:09 1970 +0000
112 summary: adding another cset to branch b
111 summary: adding another cset to branch b
113
112
114 changeset: 8:eebb944467c9
113 changeset: 8:eebb944467c9
115 branch: b
114 branch: b
116 parent: 4:aee39cd168d0
115 parent: 4:aee39cd168d0
117 user: test
116 user: test
118 date: Thu Jan 01 00:00:07 1970 +0000
117 date: Thu Jan 01 00:00:07 1970 +0000
119 summary: adding cset to branch b
118 summary: adding cset to branch b
120
119
121 changeset: 7:10ff5895aa57
120 changeset: 7:10ff5895aa57
122 branch: a branch name much longer than the default justification used by branches
121 branch: a branch name much longer than the default justification used by branches
123 user: test
122 user: test
124 date: Thu Jan 01 00:00:06 1970 +0000
123 date: Thu Jan 01 00:00:06 1970 +0000
125 summary: Adding d branch
124 summary: Adding d branch
126
125
127 changeset: 6:589736a22561
126 changeset: 6:589736a22561
128 branch: c
127 branch: c
129 user: test
128 user: test
130 date: Thu Jan 01 00:00:05 1970 +0000
129 date: Thu Jan 01 00:00:05 1970 +0000
131 summary: Adding c branch
130 summary: Adding c branch
132
131
133 changeset: 5:d8cbc61dbaa6
132 changeset: 5:d8cbc61dbaa6
134 branch: a
133 branch: a
135 parent: 2:881fe2b92ad0
134 parent: 2:881fe2b92ad0
136 user: test
135 user: test
137 date: Thu Jan 01 00:00:04 1970 +0000
136 date: Thu Jan 01 00:00:04 1970 +0000
138 summary: Adding b branch head 2
137 summary: Adding b branch head 2
139
138
140 changeset: 0:19709c5a4e75
139 changeset: 0:19709c5a4e75
141 user: test
140 user: test
142 date: Thu Jan 01 00:00:00 1970 +0000
141 date: Thu Jan 01 00:00:00 1970 +0000
143 summary: Adding root node
142 summary: Adding root node
144
143
145 b 8:eebb944467c9
144 b 8:eebb944467c9
146 a branch name much longer than the default justification used by branches 7:10ff5895aa57
145 a branch name much longer than the default justification used by branches 7:10ff5895aa57
147 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
146 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
148 --- b branch should be inactive
147 --- b branch should be inactive
149 a branch name much longer than the default justification used by branches 7:10ff5895aa57
148 a branch name much longer than the default justification used by branches 7:10ff5895aa57
150 c 6:589736a22561 (inactive)
149 c 6:589736a22561 (inactive)
151 a 5:d8cbc61dbaa6 (inactive)
150 a 5:d8cbc61dbaa6 (inactive)
152 default 0:19709c5a4e75 (inactive)
151 default 0:19709c5a4e75 (inactive)
153 a branch name much longer than the default justification used by branches 7:10ff5895aa57
152 a branch name much longer than the default justification used by branches 7:10ff5895aa57
154 b 12:2da6583810df (closed)
153 b 12:2da6583810df (closed)
155 c 6:589736a22561 (inactive)
154 c 6:589736a22561 (inactive)
156 a 5:d8cbc61dbaa6 (inactive)
155 a 5:d8cbc61dbaa6 (inactive)
157 default 0:19709c5a4e75 (inactive)
156 default 0:19709c5a4e75 (inactive)
158 a branch name much longer than the default justification used by branches 7:10ff5895aa57
157 a branch name much longer than the default justification used by branches 7:10ff5895aa57
159 no open branch heads found on branches b
158 no open branch heads found on branches b
160 changeset: 12:2da6583810df
159 changeset: 12:2da6583810df
161 branch: b
160 branch: b
162 tag: tip
161 tag: tip
163 parent: 8:eebb944467c9
162 parent: 8:eebb944467c9
164 user: test
163 user: test
165 date: Thu Jan 01 00:00:09 1970 +0000
164 date: Thu Jan 01 00:00:09 1970 +0000
166 summary: close this part branch too
165 summary: close this part branch too
167
166
168 changeset: 11:c84627f3c15d
167 changeset: 11:c84627f3c15d
169 branch: b
168 branch: b
170 user: test
169 user: test
171 date: Thu Jan 01 00:00:09 1970 +0000
170 date: Thu Jan 01 00:00:09 1970 +0000
172 summary: prune bad branch
171 summary: prune bad branch
173
172
174 reopening closed branch head 12
173 reopening closed branch head 12
175 --- branch b is back in action
174 --- branch b is back in action
176 b 13:6ac12926b8c3
175 b 13:6ac12926b8c3
177 a branch name much longer than the default justification used by branches 7:10ff5895aa57
176 a branch name much longer than the default justification used by branches 7:10ff5895aa57
178 ---- test heads listings
177 ---- test heads listings
179 changeset: 13:6ac12926b8c3
178 changeset: 13:6ac12926b8c3
180 branch: b
179 branch: b
181 tag: tip
180 tag: tip
182 user: test
181 user: test
183 date: Thu Jan 01 00:00:09 1970 +0000
182 date: Thu Jan 01 00:00:09 1970 +0000
184 summary: reopen branch with a change
183 summary: reopen branch with a change
185
184
186 changeset: 7:10ff5895aa57
185 changeset: 7:10ff5895aa57
187 branch: a branch name much longer than the default justification used by branches
186 branch: a branch name much longer than the default justification used by branches
188 user: test
187 user: test
189 date: Thu Jan 01 00:00:06 1970 +0000
188 date: Thu Jan 01 00:00:06 1970 +0000
190 summary: Adding d branch
189 summary: Adding d branch
191
190
192 changeset: 6:589736a22561
191 changeset: 6:589736a22561
193 branch: c
192 branch: c
194 user: test
193 user: test
195 date: Thu Jan 01 00:00:05 1970 +0000
194 date: Thu Jan 01 00:00:05 1970 +0000
196 summary: Adding c branch
195 summary: Adding c branch
197
196
198 changeset: 5:d8cbc61dbaa6
197 changeset: 5:d8cbc61dbaa6
199 branch: a
198 branch: a
200 parent: 2:881fe2b92ad0
199 parent: 2:881fe2b92ad0
201 user: test
200 user: test
202 date: Thu Jan 01 00:00:04 1970 +0000
201 date: Thu Jan 01 00:00:04 1970 +0000
203 summary: Adding b branch head 2
202 summary: Adding b branch head 2
204
203
205 changeset: 0:19709c5a4e75
204 changeset: 0:19709c5a4e75
206 user: test
205 user: test
207 date: Thu Jan 01 00:00:00 1970 +0000
206 date: Thu Jan 01 00:00:00 1970 +0000
208 summary: Adding root node
207 summary: Adding root node
209
208
210 % branch default
209 % branch default
211 changeset: 0:19709c5a4e75
210 changeset: 0:19709c5a4e75
212 user: test
211 user: test
213 date: Thu Jan 01 00:00:00 1970 +0000
212 date: Thu Jan 01 00:00:00 1970 +0000
214 summary: Adding root node
213 summary: Adding root node
215
214
216 % branch a
215 % branch a
217 changeset: 5:d8cbc61dbaa6
216 changeset: 5:d8cbc61dbaa6
218 branch: a
217 branch: a
219 parent: 2:881fe2b92ad0
218 parent: 2:881fe2b92ad0
220 user: test
219 user: test
221 date: Thu Jan 01 00:00:04 1970 +0000
220 date: Thu Jan 01 00:00:04 1970 +0000
222 summary: Adding b branch head 2
221 summary: Adding b branch head 2
223
222
224 no open branch heads found on branches a
223 no open branch heads found on branches a
225 % branch b
224 % branch b
226 changeset: 13:6ac12926b8c3
225 changeset: 13:6ac12926b8c3
227 branch: b
226 branch: b
228 tag: tip
227 tag: tip
229 user: test
228 user: test
230 date: Thu Jan 01 00:00:09 1970 +0000
229 date: Thu Jan 01 00:00:09 1970 +0000
231 summary: reopen branch with a change
230 summary: reopen branch with a change
232
231
233 changeset: 13:6ac12926b8c3
232 changeset: 13:6ac12926b8c3
234 branch: b
233 branch: b
235 tag: tip
234 tag: tip
236 user: test
235 user: test
237 date: Thu Jan 01 00:00:09 1970 +0000
236 date: Thu Jan 01 00:00:09 1970 +0000
238 summary: reopen branch with a change
237 summary: reopen branch with a change
239
238
240 changeset: 11:c84627f3c15d
239 changeset: 11:c84627f3c15d
241 branch: b
240 branch: b
242 user: test
241 user: test
243 date: Thu Jan 01 00:00:09 1970 +0000
242 date: Thu Jan 01 00:00:09 1970 +0000
244 summary: prune bad branch
243 summary: prune bad branch
245
244
@@ -1,87 +1,85 b''
1
1
2 % prepare repo a
2 % prepare repo a
3 adding bar
3 adding bar
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
5 marked working directory as branch mine
5 marked working directory as branch mine
6 adding world
6 adding world
7 created new head
8 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
7 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
9 marked working directory as branch other
8 marked working directory as branch other
10 adding bye
9 adding bye
11 created new head
12 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
10 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
13 % test -U -u
11 % test -U -u
14 abort: cannot specify both --noupdate and --updaterev
12 abort: cannot specify both --noupdate and --updaterev
15 % test -U
13 % test -U
16 requesting all changes
14 requesting all changes
17 adding changesets
15 adding changesets
18 adding manifests
16 adding manifests
19 adding file changes
17 adding file changes
20 added 3 changesets with 3 changes to 3 files (+2 heads)
18 added 3 changesets with 3 changes to 3 files (+2 heads)
21 % test -u .
19 % test -u .
22 requesting all changes
20 requesting all changes
23 adding changesets
21 adding changesets
24 adding manifests
22 adding manifests
25 adding file changes
23 adding file changes
26 added 3 changesets with 3 changes to 3 files (+2 heads)
24 added 3 changesets with 3 changes to 3 files (+2 heads)
27 updating to branch mine
25 updating to branch mine
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 % test -u 0
27 % test -u 0
30 requesting all changes
28 requesting all changes
31 adding changesets
29 adding changesets
32 adding manifests
30 adding manifests
33 adding file changes
31 adding file changes
34 added 3 changesets with 3 changes to 3 files (+2 heads)
32 added 3 changesets with 3 changes to 3 files (+2 heads)
35 updating to branch default
33 updating to branch default
36 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
34 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 % test -u 1
35 % test -u 1
38 requesting all changes
36 requesting all changes
39 adding changesets
37 adding changesets
40 adding manifests
38 adding manifests
41 adding file changes
39 adding file changes
42 added 3 changesets with 3 changes to 3 files (+2 heads)
40 added 3 changesets with 3 changes to 3 files (+2 heads)
43 updating to branch mine
41 updating to branch mine
44 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
42 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
45 % test -u 2
43 % test -u 2
46 requesting all changes
44 requesting all changes
47 adding changesets
45 adding changesets
48 adding manifests
46 adding manifests
49 adding file changes
47 adding file changes
50 added 3 changesets with 3 changes to 3 files (+2 heads)
48 added 3 changesets with 3 changes to 3 files (+2 heads)
51 updating to branch other
49 updating to branch other
52 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
50 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
53 % test -r 0
51 % test -r 0
54 requesting all changes
52 requesting all changes
55 adding changesets
53 adding changesets
56 adding manifests
54 adding manifests
57 adding file changes
55 adding file changes
58 added 3 changesets with 3 changes to 3 files (+2 heads)
56 added 3 changesets with 3 changes to 3 files (+2 heads)
59 updating to branch other
57 updating to branch other
60 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
58 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 % test -r mine ... mine is ignored
59 % test -r mine ... mine is ignored
62 requesting all changes
60 requesting all changes
63 adding changesets
61 adding changesets
64 adding manifests
62 adding manifests
65 adding file changes
63 adding file changes
66 added 3 changesets with 3 changes to 3 files (+2 heads)
64 added 3 changesets with 3 changes to 3 files (+2 heads)
67 updating to branch other
65 updating to branch other
68 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
66 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
69 % test -b default
67 % test -b default
70 requesting all changes
68 requesting all changes
71 adding changesets
69 adding changesets
72 adding manifests
70 adding manifests
73 adding file changes
71 adding file changes
74 added 3 changesets with 3 changes to 3 files (+2 heads)
72 added 3 changesets with 3 changes to 3 files (+2 heads)
75 updating to branch default
73 updating to branch default
76 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
74 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
77 % test
75 % test
78 requesting all changes
76 requesting all changes
79 adding changesets
77 adding changesets
80 adding manifests
78 adding manifests
81 adding file changes
79 adding file changes
82 added 1 changesets with 1 changes to 1 files
80 added 1 changesets with 1 changes to 1 files
83 updating to branch other
81 updating to branch other
84 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
82 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
85 % test tip
83 % test tip
86 updating to branch other
84 updating to branch other
87 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
85 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -1,314 +1,313 b''
1
1
2 % prepare repo a
2 % prepare repo a
3 % list files in store/data (should show a 'b.d')
3 % list files in store/data (should show a 'b.d')
4 .hg/store/data/a.i
4 .hg/store/data/a.i
5 .hg/store/data/b.d
5 .hg/store/data/b.d
6 .hg/store/data/b.i
6 .hg/store/data/b.i
7
7
8 % default operation
8 % default operation
9 updating to branch default
9 updating to branch default
10 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 a
11 a
12 checking changesets
12 checking changesets
13 checking manifests
13 checking manifests
14 crosschecking files in changesets and manifests
14 crosschecking files in changesets and manifests
15 checking files
15 checking files
16 2 files, 11 changesets, 11 total revisions
16 2 files, 11 changesets, 11 total revisions
17
17
18 % no update
18 % no update
19 a not present
19 a not present
20 checking changesets
20 checking changesets
21 checking manifests
21 checking manifests
22 crosschecking files in changesets and manifests
22 crosschecking files in changesets and manifests
23 checking files
23 checking files
24 2 files, 11 changesets, 11 total revisions
24 2 files, 11 changesets, 11 total revisions
25
25
26 % default destination
26 % default destination
27 destination directory: a
27 destination directory: a
28 updating to branch default
28 updating to branch default
29 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
30 a
30 a
31
31
32 % check that we drop the file: from the path before
32 % check that we drop the file: from the path before
33 % writing the .hgrc
33 % writing the .hgrc
34 updating to branch default
34 updating to branch default
35 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
35 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
36
36
37 % check that path aliases are expanded
37 % check that path aliases are expanded
38 a#0
38 a#0
39
39
40 % use --pull
40 % use --pull
41 requesting all changes
41 requesting all changes
42 adding changesets
42 adding changesets
43 adding manifests
43 adding manifests
44 adding file changes
44 adding file changes
45 added 11 changesets with 11 changes to 2 files
45 added 11 changesets with 11 changes to 2 files
46 updating to branch default
46 updating to branch default
47 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
47 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 checking changesets
48 checking changesets
49 checking manifests
49 checking manifests
50 crosschecking files in changesets and manifests
50 crosschecking files in changesets and manifests
51 checking files
51 checking files
52 2 files, 11 changesets, 11 total revisions
52 2 files, 11 changesets, 11 total revisions
53
53
54 % clone to .
54 % clone to .
55 updating to branch default
55 updating to branch default
56 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
56 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
57
57
58
58
59 % *** tests for option -u ***
59 % *** tests for option -u ***
60
60
61
61
62 % adding some more history to repo a
62 % adding some more history to repo a
63 % tag ref1
63 % tag ref1
64 % updating back to ref1
64 % updating back to ref1
65 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
65 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
66
66
67 % add branch 'stable' to repo a for later tests
67 % add branch 'stable' to repo a for later tests
68 marked working directory as branch stable
68 marked working directory as branch stable
69 created new head
70 % tag ref2
69 % tag ref2
71
70
72 % updating back to ref2
71 % updating back to ref2
73 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
72 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
74
73
75 % parents of repo a
74 % parents of repo a
76 changeset: 13:e8ece76546a6
75 changeset: 13:e8ece76546a6
77 branch: stable
76 branch: stable
78 tag: ref2
77 tag: ref2
79 parent: 10:a7949464abda
78 parent: 10:a7949464abda
80 user: test
79 user: test
81 date: Thu Jan 01 00:00:00 1970 +0000
80 date: Thu Jan 01 00:00:00 1970 +0000
82 summary: starting branch stable
81 summary: starting branch stable
83
82
84
83
85 % repo a has two heads
84 % repo a has two heads
86 changeset: 15:0aae7cf88f0d
85 changeset: 15:0aae7cf88f0d
87 branch: stable
86 branch: stable
88 tag: tip
87 tag: tip
89 user: test
88 user: test
90 date: Thu Jan 01 00:00:00 1970 +0000
89 date: Thu Jan 01 00:00:00 1970 +0000
91 summary: another change for branch stable
90 summary: another change for branch stable
92
91
93 changeset: 12:f21241060d6a
92 changeset: 12:f21241060d6a
94 user: test
93 user: test
95 date: Thu Jan 01 00:00:00 1970 +0000
94 date: Thu Jan 01 00:00:00 1970 +0000
96 summary: hacked default
95 summary: hacked default
97
96
98
97
99 % testing clone -U -u 1 a ua (must abort)
98 % testing clone -U -u 1 a ua (must abort)
100 abort: cannot specify both --noupdate and --updaterev
99 abort: cannot specify both --noupdate and --updaterev
101
100
102 % testing clone -u . a ua
101 % testing clone -u . a ua
103 updating to branch stable
102 updating to branch stable
104 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
103 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
105
104
106 % repo ua has both heads
105 % repo ua has both heads
107 changeset: 15:0aae7cf88f0d
106 changeset: 15:0aae7cf88f0d
108 branch: stable
107 branch: stable
109 tag: tip
108 tag: tip
110 user: test
109 user: test
111 date: Thu Jan 01 00:00:00 1970 +0000
110 date: Thu Jan 01 00:00:00 1970 +0000
112 summary: another change for branch stable
111 summary: another change for branch stable
113
112
114 changeset: 12:f21241060d6a
113 changeset: 12:f21241060d6a
115 user: test
114 user: test
116 date: Thu Jan 01 00:00:00 1970 +0000
115 date: Thu Jan 01 00:00:00 1970 +0000
117 summary: hacked default
116 summary: hacked default
118
117
119
118
120 % same revision checked out in repo a and ua
119 % same revision checked out in repo a and ua
121 e8ece76546a6
120 e8ece76546a6
122 e8ece76546a6
121 e8ece76546a6
123
122
124 % testing clone --pull -u . a ua
123 % testing clone --pull -u . a ua
125 requesting all changes
124 requesting all changes
126 adding changesets
125 adding changesets
127 adding manifests
126 adding manifests
128 adding file changes
127 adding file changes
129 added 16 changesets with 16 changes to 3 files (+1 heads)
128 added 16 changesets with 16 changes to 3 files (+1 heads)
130 updating to branch stable
129 updating to branch stable
131 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
130 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
132
131
133 % repo ua has both heads
132 % repo ua has both heads
134 changeset: 15:0aae7cf88f0d
133 changeset: 15:0aae7cf88f0d
135 branch: stable
134 branch: stable
136 tag: tip
135 tag: tip
137 user: test
136 user: test
138 date: Thu Jan 01 00:00:00 1970 +0000
137 date: Thu Jan 01 00:00:00 1970 +0000
139 summary: another change for branch stable
138 summary: another change for branch stable
140
139
141 changeset: 12:f21241060d6a
140 changeset: 12:f21241060d6a
142 user: test
141 user: test
143 date: Thu Jan 01 00:00:00 1970 +0000
142 date: Thu Jan 01 00:00:00 1970 +0000
144 summary: hacked default
143 summary: hacked default
145
144
146
145
147 % same revision checked out in repo a and ua
146 % same revision checked out in repo a and ua
148 e8ece76546a6
147 e8ece76546a6
149 e8ece76546a6
148 e8ece76546a6
150
149
151 % testing clone -u stable a ua
150 % testing clone -u stable a ua
152 updating to branch stable
151 updating to branch stable
153 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
154
153
155 % repo ua has both heads
154 % repo ua has both heads
156 changeset: 15:0aae7cf88f0d
155 changeset: 15:0aae7cf88f0d
157 branch: stable
156 branch: stable
158 tag: tip
157 tag: tip
159 user: test
158 user: test
160 date: Thu Jan 01 00:00:00 1970 +0000
159 date: Thu Jan 01 00:00:00 1970 +0000
161 summary: another change for branch stable
160 summary: another change for branch stable
162
161
163 changeset: 12:f21241060d6a
162 changeset: 12:f21241060d6a
164 user: test
163 user: test
165 date: Thu Jan 01 00:00:00 1970 +0000
164 date: Thu Jan 01 00:00:00 1970 +0000
166 summary: hacked default
165 summary: hacked default
167
166
168
167
169 % branch stable is checked out
168 % branch stable is checked out
170 changeset: 15:0aae7cf88f0d
169 changeset: 15:0aae7cf88f0d
171 branch: stable
170 branch: stable
172 tag: tip
171 tag: tip
173 user: test
172 user: test
174 date: Thu Jan 01 00:00:00 1970 +0000
173 date: Thu Jan 01 00:00:00 1970 +0000
175 summary: another change for branch stable
174 summary: another change for branch stable
176
175
177
176
178 % testing clone a ua
177 % testing clone a ua
179 updating to branch default
178 updating to branch default
180 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
179 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
181
180
182 % repo ua has both heads
181 % repo ua has both heads
183 changeset: 15:0aae7cf88f0d
182 changeset: 15:0aae7cf88f0d
184 branch: stable
183 branch: stable
185 tag: tip
184 tag: tip
186 user: test
185 user: test
187 date: Thu Jan 01 00:00:00 1970 +0000
186 date: Thu Jan 01 00:00:00 1970 +0000
188 summary: another change for branch stable
187 summary: another change for branch stable
189
188
190 changeset: 12:f21241060d6a
189 changeset: 12:f21241060d6a
191 user: test
190 user: test
192 date: Thu Jan 01 00:00:00 1970 +0000
191 date: Thu Jan 01 00:00:00 1970 +0000
193 summary: hacked default
192 summary: hacked default
194
193
195
194
196 % branch default is checked out
195 % branch default is checked out
197 changeset: 12:f21241060d6a
196 changeset: 12:f21241060d6a
198 user: test
197 user: test
199 date: Thu Jan 01 00:00:00 1970 +0000
198 date: Thu Jan 01 00:00:00 1970 +0000
200 summary: hacked default
199 summary: hacked default
201
200
202
201
203 % testing clone -u . a#stable ua
202 % testing clone -u . a#stable ua
204 requesting all changes
203 requesting all changes
205 adding changesets
204 adding changesets
206 adding manifests
205 adding manifests
207 adding file changes
206 adding file changes
208 added 14 changesets with 14 changes to 3 files
207 added 14 changesets with 14 changes to 3 files
209 updating to branch stable
208 updating to branch stable
210 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
209 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
211
210
212 % repo ua has only branch stable
211 % repo ua has only branch stable
213 changeset: 13:0aae7cf88f0d
212 changeset: 13:0aae7cf88f0d
214 branch: stable
213 branch: stable
215 tag: tip
214 tag: tip
216 user: test
215 user: test
217 date: Thu Jan 01 00:00:00 1970 +0000
216 date: Thu Jan 01 00:00:00 1970 +0000
218 summary: another change for branch stable
217 summary: another change for branch stable
219
218
220 changeset: 10:a7949464abda
219 changeset: 10:a7949464abda
221 user: test
220 user: test
222 date: Thu Jan 01 00:00:00 1970 +0000
221 date: Thu Jan 01 00:00:00 1970 +0000
223 summary: test
222 summary: test
224
223
225
224
226 % same revision checked out in repo a and ua
225 % same revision checked out in repo a and ua
227 e8ece76546a6
226 e8ece76546a6
228 e8ece76546a6
227 e8ece76546a6
229
228
230 % testing clone -u . -r stable a ua
229 % testing clone -u . -r stable a ua
231 requesting all changes
230 requesting all changes
232 adding changesets
231 adding changesets
233 adding manifests
232 adding manifests
234 adding file changes
233 adding file changes
235 added 14 changesets with 14 changes to 3 files
234 added 14 changesets with 14 changes to 3 files
236 updating to branch stable
235 updating to branch stable
237 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
238
237
239 % repo ua has only branch stable
238 % repo ua has only branch stable
240 changeset: 13:0aae7cf88f0d
239 changeset: 13:0aae7cf88f0d
241 branch: stable
240 branch: stable
242 tag: tip
241 tag: tip
243 user: test
242 user: test
244 date: Thu Jan 01 00:00:00 1970 +0000
243 date: Thu Jan 01 00:00:00 1970 +0000
245 summary: another change for branch stable
244 summary: another change for branch stable
246
245
247 changeset: 10:a7949464abda
246 changeset: 10:a7949464abda
248 user: test
247 user: test
249 date: Thu Jan 01 00:00:00 1970 +0000
248 date: Thu Jan 01 00:00:00 1970 +0000
250 summary: test
249 summary: test
251
250
252
251
253 % same revision checked out in repo a and ua
252 % same revision checked out in repo a and ua
254 e8ece76546a6
253 e8ece76546a6
255 e8ece76546a6
254 e8ece76546a6
256
255
257 % testing clone -r stable a ua
256 % testing clone -r stable a ua
258 requesting all changes
257 requesting all changes
259 adding changesets
258 adding changesets
260 adding manifests
259 adding manifests
261 adding file changes
260 adding file changes
262 added 14 changesets with 14 changes to 3 files
261 added 14 changesets with 14 changes to 3 files
263 updating to branch stable
262 updating to branch stable
264 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
263 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
265
264
266 % repo ua has only branch stable
265 % repo ua has only branch stable
267 changeset: 13:0aae7cf88f0d
266 changeset: 13:0aae7cf88f0d
268 branch: stable
267 branch: stable
269 tag: tip
268 tag: tip
270 user: test
269 user: test
271 date: Thu Jan 01 00:00:00 1970 +0000
270 date: Thu Jan 01 00:00:00 1970 +0000
272 summary: another change for branch stable
271 summary: another change for branch stable
273
272
274 changeset: 10:a7949464abda
273 changeset: 10:a7949464abda
275 user: test
274 user: test
276 date: Thu Jan 01 00:00:00 1970 +0000
275 date: Thu Jan 01 00:00:00 1970 +0000
277 summary: test
276 summary: test
278
277
279
278
280 % branch stable is checked out
279 % branch stable is checked out
281 changeset: 13:0aae7cf88f0d
280 changeset: 13:0aae7cf88f0d
282 branch: stable
281 branch: stable
283 tag: tip
282 tag: tip
284 user: test
283 user: test
285 date: Thu Jan 01 00:00:00 1970 +0000
284 date: Thu Jan 01 00:00:00 1970 +0000
286 summary: another change for branch stable
285 summary: another change for branch stable
287
286
288
287
289 % testing clone -u . -r stable -r default a ua
288 % testing clone -u . -r stable -r default a ua
290 requesting all changes
289 requesting all changes
291 adding changesets
290 adding changesets
292 adding manifests
291 adding manifests
293 adding file changes
292 adding file changes
294 added 16 changesets with 16 changes to 3 files (+1 heads)
293 added 16 changesets with 16 changes to 3 files (+1 heads)
295 updating to branch stable
294 updating to branch stable
296 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
295 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
297
296
298 % repo ua has two heads
297 % repo ua has two heads
299 changeset: 15:0aae7cf88f0d
298 changeset: 15:0aae7cf88f0d
300 branch: stable
299 branch: stable
301 tag: tip
300 tag: tip
302 user: test
301 user: test
303 date: Thu Jan 01 00:00:00 1970 +0000
302 date: Thu Jan 01 00:00:00 1970 +0000
304 summary: another change for branch stable
303 summary: another change for branch stable
305
304
306 changeset: 12:f21241060d6a
305 changeset: 12:f21241060d6a
307 user: test
306 user: test
308 date: Thu Jan 01 00:00:00 1970 +0000
307 date: Thu Jan 01 00:00:00 1970 +0000
309 summary: hacked default
308 summary: hacked default
310
309
311
310
312 % same revision checked out in repo a and ua
311 % same revision checked out in repo a and ua
313 e8ece76546a6
312 e8ece76546a6
314 e8ece76546a6
313 e8ece76546a6
@@ -1,74 +1,73 b''
1 adding a
1 adding a
2 marked working directory as branch brancha
2 marked working directory as branch brancha
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 marked working directory as branch branchb
4 marked working directory as branch branchb
5 adding b
5 adding b
6 created new head
7 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
6 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
8 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
7 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
9 % convert with datesort
8 % convert with datesort
10 initializing destination t-datesort repository
9 initializing destination t-datesort repository
11 scanning source...
10 scanning source...
12 sorting...
11 sorting...
13 converting...
12 converting...
14 8 a0
13 8 a0
15 7 a1
14 7 a1
16 6 a2
15 6 a2
17 5 a3
16 5 a3
18 4 a4
17 4 a4
19 3 b0
18 3 b0
20 2 a5
19 2 a5
21 1 a6
20 1 a6
22 0 b1
21 0 b1
23 % graph converted repo
22 % graph converted repo
24 o 8 "b1"
23 o 8 "b1"
25 |
24 |
26 | o 7 "a6"
25 | o 7 "a6"
27 | |
26 | |
28 | o 6 "a5"
27 | o 6 "a5"
29 | |
28 | |
30 o | 5 "b0"
29 o | 5 "b0"
31 | |
30 | |
32 | o 4 "a4"
31 | o 4 "a4"
33 | |
32 | |
34 | o 3 "a3"
33 | o 3 "a3"
35 | |
34 | |
36 | o 2 "a2"
35 | o 2 "a2"
37 | |
36 | |
38 | o 1 "a1"
37 | o 1 "a1"
39 |/
38 |/
40 o 0 "a0"
39 o 0 "a0"
41
40
42 % convert with datesort (default mode)
41 % convert with datesort (default mode)
43 initializing destination t-sourcesort repository
42 initializing destination t-sourcesort repository
44 scanning source...
43 scanning source...
45 sorting...
44 sorting...
46 converting...
45 converting...
47 8 a0
46 8 a0
48 7 a1
47 7 a1
49 6 a2
48 6 a2
50 5 a3
49 5 a3
51 4 b0
50 4 b0
52 3 a4
51 3 a4
53 2 a5
52 2 a5
54 1 a6
53 1 a6
55 0 b1
54 0 b1
56 % graph converted repo
55 % graph converted repo
57 o 8 "b1"
56 o 8 "b1"
58 |
57 |
59 | o 7 "a6"
58 | o 7 "a6"
60 | |
59 | |
61 | o 6 "a5"
60 | o 6 "a5"
62 | |
61 | |
63 | o 5 "a4"
62 | o 5 "a4"
64 | |
63 | |
65 o | 4 "b0"
64 o | 4 "b0"
66 | |
65 | |
67 | o 3 "a3"
66 | o 3 "a3"
68 | |
67 | |
69 | o 2 "a2"
68 | o 2 "a2"
70 | |
69 | |
71 | o 1 "a1"
70 | o 1 "a1"
72 |/
71 |/
73 o 0 "a0"
72 o 0 "a0"
74
73
@@ -1,217 +1,217 b''
1 % test fetch with default branches only
1 % test fetch with default branches only
2 adding a
2 adding a
3 updating to branch default
3 updating to branch default
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 updating to branch default
5 updating to branch default
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
7 adding b
7 adding b
8 1:97d72e5f12c7
8 1:97d72e5f12c7
9 % should pull one change
9 % should pull one change
10 pulling from ../a
10 pulling from ../a
11 searching for changes
11 searching for changes
12 adding changesets
12 adding changesets
13 adding manifests
13 adding manifests
14 adding file changes
14 adding file changes
15 added 1 changesets with 1 changes to 1 files
15 added 1 changesets with 1 changes to 1 files
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 1:97d72e5f12c7
17 1:97d72e5f12c7
18 adding c
18 adding c
19 updating to branch default
19 updating to branch default
20 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
20 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
21 updating to branch default
21 updating to branch default
22 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
23 % should merge c into a
23 % should merge c into a
24 pulling from ../a
24 pulling from ../a
25 searching for changes
25 searching for changes
26 adding changesets
26 adding changesets
27 adding manifests
27 adding manifests
28 adding file changes
28 adding file changes
29 added 1 changesets with 1 changes to 1 files (+1 heads)
29 added 1 changesets with 1 changes to 1 files (+1 heads)
30 updating to 2:97d72e5f12c7
30 updating to 2:97d72e5f12c7
31 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
31 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
32 merging with 1:5e056962225c
32 merging with 1:5e056962225c
33 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
33 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
34 new changeset 3:cd3a41621cf0 merges remote changes with local
34 new changeset 3:cd3a41621cf0 merges remote changes with local
35 a
35 a
36 b
36 b
37 c
37 c
38 % fetch over http, no auth
38 % fetch over http, no auth
39 pulling from http://localhost:$HGPORT/
39 pulling from http://localhost:$HGPORT/
40 searching for changes
40 searching for changes
41 adding changesets
41 adding changesets
42 adding manifests
42 adding manifests
43 adding file changes
43 adding file changes
44 added 1 changesets with 1 changes to 1 files (+1 heads)
44 added 1 changesets with 1 changes to 1 files (+1 heads)
45 updating to 2:97d72e5f12c7
45 updating to 2:97d72e5f12c7
46 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
46 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
47 merging with 1:5e056962225c
47 merging with 1:5e056962225c
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
49 new changeset 3:... merges remote changes with local
49 new changeset 3:... merges remote changes with local
50 Automated merge with http://localhost:$HGPORT/
50 Automated merge with http://localhost:$HGPORT/
51 % fetch over http with auth (should be hidden in desc)
51 % fetch over http with auth (should be hidden in desc)
52 pulling from http://user:***@localhost:$HGPORT/
52 pulling from http://user:***@localhost:$HGPORT/
53 searching for changes
53 searching for changes
54 adding changesets
54 adding changesets
55 adding manifests
55 adding manifests
56 adding file changes
56 adding file changes
57 added 1 changesets with 1 changes to 1 files (+1 heads)
57 added 1 changesets with 1 changes to 1 files (+1 heads)
58 updating to 2:97d72e5f12c7
58 updating to 2:97d72e5f12c7
59 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
59 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
60 merging with 1:5e056962225c
60 merging with 1:5e056962225c
61 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
62 new changeset 3:... merges remote changes with local
62 new changeset 3:... merges remote changes with local
63 Automated merge with http://localhost:$HGPORT/
63 Automated merge with http://localhost:$HGPORT/
64 updating to branch default
64 updating to branch default
65 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
65 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
66 updating to branch default
66 updating to branch default
67 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
67 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
68 adding f
68 adding f
69 adding g
69 adding g
70 % should merge f into g
70 % should merge f into g
71 pulling from ../f
71 pulling from ../f
72 searching for changes
72 searching for changes
73 adding changesets
73 adding changesets
74 adding manifests
74 adding manifests
75 adding file changes
75 adding file changes
76 added 1 changesets with 1 changes to 1 files (+1 heads)
76 added 1 changesets with 1 changes to 1 files (+1 heads)
77 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
77 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
78 merging with 3:cc6a3744834d
78 merging with 3:cc6a3744834d
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
80 new changeset 4:55aa4f32ec59 merges remote changes with local
80 new changeset 4:55aa4f32ec59 merges remote changes with local
81 % should abort, because i is modified
81 % should abort, because i is modified
82 abort: working directory is missing some files
82 abort: working directory is missing some files
83 % test fetch with named branches
83 % test fetch with named branches
84 adding a
84 adding a
85 marked working directory as branch a
85 marked working directory as branch a
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 marked working directory as branch b
87 marked working directory as branch b
88 adding b
88 adding b
89 created new head
90
89
91 % pull in change on foreign branch
90 % pull in change on foreign branch
92 updating to branch default
91 updating to branch default
93 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
94 updating to branch default
93 updating to branch default
95 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
94 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
96 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
95 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
97 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
96 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
98 pulling from n1
97 pulling from n1
99 searching for changes
98 searching for changes
100 adding changesets
99 adding changesets
101 adding manifests
100 adding manifests
102 adding file changes
101 adding file changes
103 added 1 changesets with 1 changes to 1 files
102 added 1 changesets with 1 changes to 1 files
104 % parent should be 2 (no automatic update)
103 % parent should be 2 (no automatic update)
105 2
104 2
106
105
107 % pull in changes on both foreign and local branches
106 % pull in changes on both foreign and local branches
108 updating to branch default
107 updating to branch default
109 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
108 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
110 updating to branch default
109 updating to branch default
111 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
110 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
111 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
114 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
115 pulling from n1
114 pulling from n1
116 searching for changes
115 searching for changes
117 adding changesets
116 adding changesets
118 adding manifests
117 adding manifests
119 adding file changes
118 adding file changes
120 added 2 changesets with 2 changes to 2 files
119 added 2 changesets with 2 changes to 2 files
121 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
120 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
122 % parent should be 4 (fast forward)
121 % parent should be 4 (fast forward)
123 4
122 4
124
123
125 % pull changes on foreign (2 new heads) and local (1 new head) branches
124 % pull changes on foreign (2 new heads) and local (1 new head) branches
126 % with a local change
125 % with a local change
127 updating to branch default
126 updating to branch default
128 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
127 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
129 updating to branch default
128 updating to branch default
130 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
129 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
131 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
130 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
132 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
131 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
133 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
132 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
134 created new head
133 created new head
135 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
134 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
136 adding c
135 adding c
137 pulling from n1
136 pulling from n1
138 searching for changes
137 searching for changes
139 adding changesets
138 adding changesets
140 adding manifests
139 adding manifests
141 adding file changes
140 adding file changes
142 added 3 changesets with 3 changes to 2 files (+2 heads)
141 added 3 changesets with 3 changes to 2 files (+2 heads)
143 updating to 5:708c6cce3d26
142 updating to 5:708c6cce3d26
144 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
143 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
145 merging with 3:d83427717b1f
144 merging with 3:d83427717b1f
146 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
145 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
147 new changeset 7:48f1a33f52af merges remote changes with local
146 new changeset 7:48f1a33f52af merges remote changes with local
148 % parent should be 7 (new merge changeset)
147 % parent should be 7 (new merge changeset)
149 7
148 7
150 % pull in changes on foreign (merge of local branch) and local (2 new
149 % pull in changes on foreign (merge of local branch) and local (2 new
151 % heads) with a local change
150 % heads) with a local change
152 updating to branch default
151 updating to branch default
153 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
154 updating to branch default
153 updating to branch default
155 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
156 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
157 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
156 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
158 (branch merge, don't forget to commit)
157 (branch merge, don't forget to commit)
158 created new head
159 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
159 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
160 created new head
161 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
160 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
162 created new head
161 created new head
163 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
162 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
164 pulling from n1
163 pulling from n1
165 searching for changes
164 searching for changes
166 adding changesets
165 adding changesets
167 adding manifests
166 adding manifests
168 adding file changes
167 adding file changes
169 added 3 changesets with 2 changes to 1 files (+2 heads)
168 added 3 changesets with 2 changes to 1 files (+2 heads)
170 not merging with 1 other new branch heads (use "hg heads ." and "hg merge" to merge them)
169 not merging with 1 other new branch heads (use "hg heads ." and "hg merge" to merge them)
171 % parent should be 3 (fetch did not merge anything)
170 % parent should be 3 (fetch did not merge anything)
172 3
171 3
173 % pull in change on different branch than dirstate
172 % pull in change on different branch than dirstate
174 adding a
173 adding a
175 updating to branch default
174 updating to branch default
176 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
175 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
177 marked working directory as branch topic
176 marked working directory as branch topic
178 abort: working dir not at branch tip (use "hg update" to check out branch tip)
177 abort: working dir not at branch tip (use "hg update" to check out branch tip)
179 % parent should be 0 (fetch did not update or merge anything)
178 % parent should be 0 (fetch did not update or merge anything)
180 0
179 0
181 % test fetch with inactive branches
180 % test fetch with inactive branches
182 adding a
181 adding a
183 marked working directory as branch second
182 marked working directory as branch second
184 adding b
183 adding b
185 marked working directory as branch default
184 marked working directory as branch default
186 adding c
185 adding c
186 created new head
187 updating to branch default
187 updating to branch default
188 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
188 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
189 % fetch should succeed
189 % fetch should succeed
190 pulling from ../ib1
190 pulling from ../ib1
191 searching for changes
191 searching for changes
192 no changes found
192 no changes found
193 % test issue1726
193 % test issue1726
194 adding a
194 adding a
195 updating to branch default
195 updating to branch default
196 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
197 pulling from ../i1726r1
197 pulling from ../i1726r1
198 searching for changes
198 searching for changes
199 adding changesets
199 adding changesets
200 adding manifests
200 adding manifests
201 adding file changes
201 adding file changes
202 added 1 changesets with 1 changes to 1 files (+1 heads)
202 added 1 changesets with 1 changes to 1 files (+1 heads)
203 updating to 2:7837755a2789
203 updating to 2:7837755a2789
204 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
204 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
205 merging with 1:d1f0c6c48ebd
205 merging with 1:d1f0c6c48ebd
206 merging a
206 merging a
207 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
207 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
208 new changeset 3 merges remote changes with local
208 new changeset 3 merges remote changes with local
209 3
209 3
210
210
211 % test issue2047
211 % test issue2047
212 pulling from ../i2047a
212 pulling from ../i2047a
213 searching for changes
213 searching for changes
214 adding changesets
214 adding changesets
215 adding manifests
215 adding manifests
216 adding file changes
216 adding file changes
217 added 1 changesets with 1 changes to 1 files
217 added 1 changesets with 1 changes to 1 files
@@ -1,10 +1,11 b''
1 adding a
1 adding a
2 marked working directory as branch b
2 marked working directory as branch b
3 adding b
3 adding b
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
4 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
5 fast-forward
5 fast-forward
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
7 (branch merge, don't forget to commit)
7 (branch merge, don't forget to commit)
8 created new head
8 bogus fast-forward should fail
9 bogus fast-forward should fail
9 abort: can't merge with ancestor
10 abort: can't merge with ancestor
10 done
11 done
@@ -1,519 +1,518 b''
1 % hg kwdemo
1 % hg kwdemo
2 [extensions]
2 [extensions]
3 keyword =
3 keyword =
4 [keyword]
4 [keyword]
5 demo.txt =
5 demo.txt =
6 [keywordmaps]
6 [keywordmaps]
7 Author = {author|user}
7 Author = {author|user}
8 Date = {date|utcdate}
8 Date = {date|utcdate}
9 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
9 Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
10 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
10 Id = {file|basename},v {node|short} {date|utcdate} {author|user}
11 RCSFile = {file|basename},v
11 RCSFile = {file|basename},v
12 RCSfile = {file|basename},v
12 RCSfile = {file|basename},v
13 Revision = {node|short}
13 Revision = {node|short}
14 Source = {root}/{file},v
14 Source = {root}/{file},v
15 $Author: test $
15 $Author: test $
16 $Date: 2000/00/00 00:00:00 $
16 $Date: 2000/00/00 00:00:00 $
17 $Header: /TMP/demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
17 $Header: /TMP/demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
18 $Id: demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
18 $Id: demo.txt,v xxxxxxxxxxxx 2000/00/00 00:00:00 test $
19 $RCSFile: demo.txt,v $
19 $RCSFile: demo.txt,v $
20 $RCSfile: demo.txt,v $
20 $RCSfile: demo.txt,v $
21 $Revision: xxxxxxxxxxxx $
21 $Revision: xxxxxxxxxxxx $
22 $Source: /TMP/demo.txt,v $
22 $Source: /TMP/demo.txt,v $
23 [extensions]
23 [extensions]
24 keyword =
24 keyword =
25 [keyword]
25 [keyword]
26 demo.txt =
26 demo.txt =
27 [keywordmaps]
27 [keywordmaps]
28 Branch = {branches}
28 Branch = {branches}
29 $Branch: demobranch $
29 $Branch: demobranch $
30 % kwshrink should exit silently in empty/invalid repo
30 % kwshrink should exit silently in empty/invalid repo
31 pulling from test-keyword.hg
31 pulling from test-keyword.hg
32 requesting all changes
32 requesting all changes
33 adding changesets
33 adding changesets
34 adding manifests
34 adding manifests
35 adding file changes
35 adding file changes
36 added 1 changesets with 1 changes to 1 files
36 added 1 changesets with 1 changes to 1 files
37 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
38 % cat
38 % cat
39 expand $Id$
39 expand $Id$
40 do not process $Id:
40 do not process $Id:
41 xxx $
41 xxx $
42 ignore $Id$
42 ignore $Id$
43 % no kwfiles
43 % no kwfiles
44 % untracked candidates
44 % untracked candidates
45 k a
45 k a
46 % addremove
46 % addremove
47 adding a
47 adding a
48 adding b
48 adding b
49 % status
49 % status
50 A a
50 A a
51 A b
51 A b
52 % default keyword expansion including commit hook
52 % default keyword expansion including commit hook
53 % interrupted commit should not change state or run commit hook
53 % interrupted commit should not change state or run commit hook
54 abort: empty commit message
54 abort: empty commit message
55 % status
55 % status
56 A a
56 A a
57 A b
57 A b
58 % commit
58 % commit
59 a
59 a
60 b
60 b
61 overwriting a expanding keywords
61 overwriting a expanding keywords
62 running hook commit.test: cp a hooktest
62 running hook commit.test: cp a hooktest
63 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
63 committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
64 % status
64 % status
65 ? hooktest
65 ? hooktest
66 % identify
66 % identify
67 ef63ca68695b
67 ef63ca68695b
68 % cat
68 % cat
69 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
69 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
70 do not process $Id:
70 do not process $Id:
71 xxx $
71 xxx $
72 ignore $Id$
72 ignore $Id$
73 % hg cat
73 % hg cat
74 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
74 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
75 do not process $Id:
75 do not process $Id:
76 xxx $
76 xxx $
77 ignore $Id$
77 ignore $Id$
78 a
78 a
79 % diff a hooktest
79 % diff a hooktest
80 % removing commit hook from config
80 % removing commit hook from config
81 % bundle
81 % bundle
82 2 changesets found
82 2 changesets found
83 % notify on pull to check whether keywords stay as is in email
83 % notify on pull to check whether keywords stay as is in email
84 % ie. if patch.diff wrapper acts as it should
84 % ie. if patch.diff wrapper acts as it should
85 % pull from bundle
85 % pull from bundle
86 pulling from ../kw.hg
86 pulling from ../kw.hg
87 requesting all changes
87 requesting all changes
88 adding changesets
88 adding changesets
89 adding manifests
89 adding manifests
90 adding file changes
90 adding file changes
91 added 2 changesets with 3 changes to 3 files
91 added 2 changesets with 3 changes to 3 files
92
92
93 diff -r 000000000000 -r a2392c293916 sym
93 diff -r 000000000000 -r a2392c293916 sym
94 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
94 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
95 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
95 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
96 @@ -0,0 +1,1 @@
96 @@ -0,0 +1,1 @@
97 +a
97 +a
98 \ No newline at end of file
98 \ No newline at end of file
99
99
100 diff -r a2392c293916 -r ef63ca68695b a
100 diff -r a2392c293916 -r ef63ca68695b a
101 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
101 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
102 +++ b/a Thu Jan 01 00:00:00 1970 +0000
102 +++ b/a Thu Jan 01 00:00:00 1970 +0000
103 @@ -0,0 +1,3 @@
103 @@ -0,0 +1,3 @@
104 +expand $Id$
104 +expand $Id$
105 +do not process $Id:
105 +do not process $Id:
106 +xxx $
106 +xxx $
107 diff -r a2392c293916 -r ef63ca68695b b
107 diff -r a2392c293916 -r ef63ca68695b b
108 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
108 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
109 +++ b/b Thu Jan 01 00:00:00 1970 +0000
109 +++ b/b Thu Jan 01 00:00:00 1970 +0000
110 @@ -0,0 +1,1 @@
110 @@ -0,0 +1,1 @@
111 +ignore $Id$
111 +ignore $Id$
112 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 % remove notify config
113 % remove notify config
114 % touch
114 % touch
115 % status
115 % status
116 % update
116 % update
117 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
117 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
118 % cat
118 % cat
119 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
119 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
120 do not process $Id:
120 do not process $Id:
121 xxx $
121 xxx $
122 ignore $Id$
122 ignore $Id$
123 % check whether expansion is filewise
123 % check whether expansion is filewise
124 % commit c
124 % commit c
125 adding c
125 adding c
126 % force expansion
126 % force expansion
127 overwriting a expanding keywords
127 overwriting a expanding keywords
128 overwriting c expanding keywords
128 overwriting c expanding keywords
129 % compare changenodes in a c
129 % compare changenodes in a c
130 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
130 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
131 do not process $Id:
131 do not process $Id:
132 xxx $
132 xxx $
133 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
133 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
134 tests for different changenodes
134 tests for different changenodes
135 % record
135 % record
136 diff --git a/a b/a
136 diff --git a/a b/a
137 2 hunks, 2 lines changed
137 2 hunks, 2 lines changed
138 examine changes to 'a'? [Ynsfdaq?]
138 examine changes to 'a'? [Ynsfdaq?]
139 @@ -1,3 +1,4 @@
139 @@ -1,3 +1,4 @@
140 expand $Id$
140 expand $Id$
141 +foo
141 +foo
142 do not process $Id:
142 do not process $Id:
143 xxx $
143 xxx $
144 record change 1/2 to 'a'? [Ynsfdaq?]
144 record change 1/2 to 'a'? [Ynsfdaq?]
145 @@ -2,2 +3,3 @@
145 @@ -2,2 +3,3 @@
146 do not process $Id:
146 do not process $Id:
147 xxx $
147 xxx $
148 +bar
148 +bar
149 record change 2/2 to 'a'? [Ynsfdaq?]
149 record change 2/2 to 'a'? [Ynsfdaq?]
150
150
151 d17e03c92c97+ tip
151 d17e03c92c97+ tip
152 M a
152 M a
153 % cat modified file
153 % cat modified file
154 expand $Id: a,v d17e03c92c97 1970/01/01 00:00:01 test $
154 expand $Id: a,v d17e03c92c97 1970/01/01 00:00:01 test $
155 foo
155 foo
156 do not process $Id:
156 do not process $Id:
157 xxx $
157 xxx $
158 bar
158 bar
159 diff -r d17e03c92c97 a
159 diff -r d17e03c92c97 a
160 --- a/a Wed Dec 31 23:59:51 1969 -0000
160 --- a/a Wed Dec 31 23:59:51 1969 -0000
161 @@ -2,3 +2,4 @@
161 @@ -2,3 +2,4 @@
162 foo
162 foo
163 do not process $Id:
163 do not process $Id:
164 xxx $
164 xxx $
165 +bar
165 +bar
166 rolling back to revision 3 (undo commit)
166 rolling back to revision 3 (undo commit)
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
168 % init --mq
168 % init --mq
169 % qimport
169 % qimport
170 % commit --mq
170 % commit --mq
171 % keywords should not be expanded in patch
171 % keywords should not be expanded in patch
172 # HG changeset patch
172 # HG changeset patch
173 # User User Name <user@example.com>
173 # User User Name <user@example.com>
174 # Date 1 0
174 # Date 1 0
175 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
175 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
176 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
176 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
177 cndiff
177 cndiff
178
178
179 diff -r ef63ca68695b -r 40a904bbbe4c c
179 diff -r ef63ca68695b -r 40a904bbbe4c c
180 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
180 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
181 +++ b/c Thu Jan 01 00:00:01 1970 +0000
181 +++ b/c Thu Jan 01 00:00:01 1970 +0000
182 @@ -0,0 +1,2 @@
182 @@ -0,0 +1,2 @@
183 +$Id$
183 +$Id$
184 +tests for different changenodes
184 +tests for different changenodes
185 % qpop
185 % qpop
186 popping mqtest.diff
186 popping mqtest.diff
187 patch queue now empty
187 patch queue now empty
188 % qgoto - should imply qpush
188 % qgoto - should imply qpush
189 applying mqtest.diff
189 applying mqtest.diff
190 now at: mqtest.diff
190 now at: mqtest.diff
191 % cat
191 % cat
192 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
192 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
193 tests for different changenodes
193 tests for different changenodes
194 % hg cat
194 % hg cat
195 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
195 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
196 tests for different changenodes
196 tests for different changenodes
197 % keyword should not be expanded in filelog
197 % keyword should not be expanded in filelog
198 $Id$
198 $Id$
199 tests for different changenodes
199 tests for different changenodes
200 % qpop and move on
200 % qpop and move on
201 popping mqtest.diff
201 popping mqtest.diff
202 patch queue now empty
202 patch queue now empty
203 % copy
203 % copy
204 % kwfiles added
204 % kwfiles added
205 a
205 a
206 c
206 c
207 % commit
207 % commit
208 c
208 c
209 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
209 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
210 overwriting c expanding keywords
210 overwriting c expanding keywords
211 committed changeset 2:25736cf2f5cbe41f6be4e6784ef6ecf9f3bbcc7d
211 committed changeset 2:25736cf2f5cbe41f6be4e6784ef6ecf9f3bbcc7d
212 % cat a c
212 % cat a c
213 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
213 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
214 do not process $Id:
214 do not process $Id:
215 xxx $
215 xxx $
216 expand $Id: c,v 25736cf2f5cb 1970/01/01 00:00:01 user $
216 expand $Id: c,v 25736cf2f5cb 1970/01/01 00:00:01 user $
217 do not process $Id:
217 do not process $Id:
218 xxx $
218 xxx $
219 % touch copied c
219 % touch copied c
220 % status
220 % status
221 % kwfiles
221 % kwfiles
222 a
222 a
223 c
223 c
224 % ignored files
224 % ignored files
225 I b
225 I b
226 I sym
226 I sym
227 % all files
227 % all files
228 K a
228 K a
229 K c
229 K c
230 I b
230 I b
231 I sym
231 I sym
232 % diff --rev
232 % diff --rev
233 diff -r ef63ca68695b c
233 diff -r ef63ca68695b c
234 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
234 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
235 @@ -0,0 +1,3 @@
235 @@ -0,0 +1,3 @@
236 +expand $Id$
236 +expand $Id$
237 +do not process $Id:
237 +do not process $Id:
238 +xxx $
238 +xxx $
239 % rollback
239 % rollback
240 rolling back to revision 2 (undo commit)
240 rolling back to revision 2 (undo commit)
241 % status
241 % status
242 A c
242 A c
243 % update -C
243 % update -C
244 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
244 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
245 % custom keyword expansion
245 % custom keyword expansion
246 % try with kwdemo
246 % try with kwdemo
247 [extensions]
247 [extensions]
248 keyword =
248 keyword =
249 [keyword]
249 [keyword]
250 ** =
250 ** =
251 b = ignore
251 b = ignore
252 demo.txt =
252 demo.txt =
253 [keywordmaps]
253 [keywordmaps]
254 Xinfo = {author}: {desc}
254 Xinfo = {author}: {desc}
255 $Xinfo: test: hg keyword configuration and expansion example $
255 $Xinfo: test: hg keyword configuration and expansion example $
256 % cat
256 % cat
257 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
257 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
258 do not process $Id:
258 do not process $Id:
259 xxx $
259 xxx $
260 ignore $Id$
260 ignore $Id$
261 % hg cat
261 % hg cat
262 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
262 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
263 do not process $Id:
263 do not process $Id:
264 xxx $
264 xxx $
265 ignore $Id$
265 ignore $Id$
266 a
266 a
267 % interrupted commit should not change state
267 % interrupted commit should not change state
268 abort: empty commit message
268 abort: empty commit message
269 % status
269 % status
270 M a
270 M a
271 ? c
271 ? c
272 ? log
272 ? log
273 % commit
273 % commit
274 a
274 a
275 overwriting a expanding keywords
275 overwriting a expanding keywords
276 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
276 committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
277 % status
277 % status
278 ? c
278 ? c
279 % verify
279 % verify
280 checking changesets
280 checking changesets
281 checking manifests
281 checking manifests
282 crosschecking files in changesets and manifests
282 crosschecking files in changesets and manifests
283 checking files
283 checking files
284 3 files, 3 changesets, 4 total revisions
284 3 files, 3 changesets, 4 total revisions
285 % cat
285 % cat
286 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
286 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
287 do not process $Id:
287 do not process $Id:
288 xxx $
288 xxx $
289 $Xinfo: User Name <user@example.com>: firstline $
289 $Xinfo: User Name <user@example.com>: firstline $
290 ignore $Id$
290 ignore $Id$
291 % hg cat
291 % hg cat
292 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
292 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
293 do not process $Id:
293 do not process $Id:
294 xxx $
294 xxx $
295 $Xinfo: User Name <user@example.com>: firstline $
295 $Xinfo: User Name <user@example.com>: firstline $
296 ignore $Id$
296 ignore $Id$
297 a
297 a
298 % annotate
298 % annotate
299 1: expand $Id$
299 1: expand $Id$
300 1: do not process $Id:
300 1: do not process $Id:
301 1: xxx $
301 1: xxx $
302 2: $Xinfo$
302 2: $Xinfo$
303 % remove
303 % remove
304 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
304 committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
305 % status
305 % status
306 ? c
306 ? c
307 % rollback
307 % rollback
308 rolling back to revision 3 (undo commit)
308 rolling back to revision 3 (undo commit)
309 % status
309 % status
310 R a
310 R a
311 ? c
311 ? c
312 % revert a
312 % revert a
313 % cat a
313 % cat a
314 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
314 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
315 do not process $Id:
315 do not process $Id:
316 xxx $
316 xxx $
317 $Xinfo: User Name <user@example.com>: firstline $
317 $Xinfo: User Name <user@example.com>: firstline $
318 % clone to test incoming
318 % clone to test incoming
319 requesting all changes
319 requesting all changes
320 adding changesets
320 adding changesets
321 adding manifests
321 adding manifests
322 adding file changes
322 adding file changes
323 added 2 changesets with 3 changes to 3 files
323 added 2 changesets with 3 changes to 3 files
324 updating to branch default
324 updating to branch default
325 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
325 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
326 % incoming
326 % incoming
327 comparing with test-keyword/Test
327 comparing with test-keyword/Test
328 searching for changes
328 searching for changes
329 changeset: 2:bb948857c743
329 changeset: 2:bb948857c743
330 tag: tip
330 tag: tip
331 user: User Name <user@example.com>
331 user: User Name <user@example.com>
332 date: Thu Jan 01 00:00:02 1970 +0000
332 date: Thu Jan 01 00:00:02 1970 +0000
333 summary: firstline
333 summary: firstline
334
334
335 % commit rejecttest
335 % commit rejecttest
336 a
336 a
337 overwriting a expanding keywords
337 overwriting a expanding keywords
338 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
338 committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
339 % export
339 % export
340 % import
340 % import
341 applying ../rejecttest.diff
341 applying ../rejecttest.diff
342 % cat
342 % cat
343 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
343 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
344 do not process $Id: rejecttest
344 do not process $Id: rejecttest
345 xxx $
345 xxx $
346 $Xinfo: User Name <user@example.com>: rejects? $
346 $Xinfo: User Name <user@example.com>: rejects? $
347 ignore $Id$
347 ignore $Id$
348
348
349 % rollback
349 % rollback
350 rolling back to revision 3 (undo commit)
350 rolling back to revision 3 (undo commit)
351 % clean update
351 % clean update
352 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
352 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
353 % kwexpand/kwshrink on selected files
353 % kwexpand/kwshrink on selected files
354 % copy a x/a
354 % copy a x/a
355 % kwexpand a
355 % kwexpand a
356 overwriting a expanding keywords
356 overwriting a expanding keywords
357 % kwexpand x/a should abort
357 % kwexpand x/a should abort
358 abort: outstanding uncommitted changes
358 abort: outstanding uncommitted changes
359 x/a
359 x/a
360 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
360 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
361 overwriting x/a expanding keywords
361 overwriting x/a expanding keywords
362 committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4
362 committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4
363 % cat a
363 % cat a
364 expand $Id: x/a b4560182a3f9 Thu, 01 Jan 1970 00:00:03 +0000 user $
364 expand $Id: x/a b4560182a3f9 Thu, 01 Jan 1970 00:00:03 +0000 user $
365 do not process $Id:
365 do not process $Id:
366 xxx $
366 xxx $
367 $Xinfo: User Name <user@example.com>: xa $
367 $Xinfo: User Name <user@example.com>: xa $
368 % kwshrink a inside directory x
368 % kwshrink a inside directory x
369 overwriting x/a shrinking keywords
369 overwriting x/a shrinking keywords
370 % cat a
370 % cat a
371 expand $Id$
371 expand $Id$
372 do not process $Id:
372 do not process $Id:
373 xxx $
373 xxx $
374 $Xinfo$
374 $Xinfo$
375 % kwexpand nonexistent
375 % kwexpand nonexistent
376 nonexistent:
376 nonexistent:
377 % hg serve
377 % hg serve
378 % expansion
378 % expansion
379 % hgweb file
379 % hgweb file
380 200 Script output follows
380 200 Script output follows
381
381
382 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
382 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
383 do not process $Id:
383 do not process $Id:
384 xxx $
384 xxx $
385 $Xinfo: User Name <user@example.com>: firstline $
385 $Xinfo: User Name <user@example.com>: firstline $
386 % no expansion
386 % no expansion
387 % hgweb annotate
387 % hgweb annotate
388 200 Script output follows
388 200 Script output follows
389
389
390
390
391 user@1: expand $Id$
391 user@1: expand $Id$
392 user@1: do not process $Id:
392 user@1: do not process $Id:
393 user@1: xxx $
393 user@1: xxx $
394 user@2: $Xinfo$
394 user@2: $Xinfo$
395
395
396
396
397
397
398
398
399 % hgweb changeset
399 % hgweb changeset
400 200 Script output follows
400 200 Script output follows
401
401
402
402
403 # HG changeset patch
403 # HG changeset patch
404 # User User Name <user@example.com>
404 # User User Name <user@example.com>
405 # Date 3 0
405 # Date 3 0
406 # Node ID b4560182a3f9a358179fd2d835c15e9da379c1e4
406 # Node ID b4560182a3f9a358179fd2d835c15e9da379c1e4
407 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
407 # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
408 xa
408 xa
409
409
410 diff -r bb948857c743 -r b4560182a3f9 x/a
410 diff -r bb948857c743 -r b4560182a3f9 x/a
411 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
411 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
412 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
412 +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
413 @@ -0,0 +1,4 @@
413 @@ -0,0 +1,4 @@
414 +expand $Id$
414 +expand $Id$
415 +do not process $Id:
415 +do not process $Id:
416 +xxx $
416 +xxx $
417 +$Xinfo$
417 +$Xinfo$
418
418
419 % hgweb filediff
419 % hgweb filediff
420 200 Script output follows
420 200 Script output follows
421
421
422
422
423 diff -r ef63ca68695b -r bb948857c743 a
423 diff -r ef63ca68695b -r bb948857c743 a
424 --- a/a Thu Jan 01 00:00:00 1970 +0000
424 --- a/a Thu Jan 01 00:00:00 1970 +0000
425 +++ b/a Thu Jan 01 00:00:02 1970 +0000
425 +++ b/a Thu Jan 01 00:00:02 1970 +0000
426 @@ -1,3 +1,4 @@
426 @@ -1,3 +1,4 @@
427 expand $Id$
427 expand $Id$
428 do not process $Id:
428 do not process $Id:
429 xxx $
429 xxx $
430 +$Xinfo$
430 +$Xinfo$
431
431
432
432
433
433
434
434
435 % errors encountered
435 % errors encountered
436 % merge/resolve
436 % merge/resolve
437 % simplemerge
437 % simplemerge
438 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
438 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
439 created new head
439 created new head
440 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
440 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
441 (branch merge, don't forget to commit)
441 (branch merge, don't forget to commit)
442 $Id: m 27d48ee14f67 Thu, 01 Jan 1970 00:00:00 +0000 test $
442 $Id: m 27d48ee14f67 Thu, 01 Jan 1970 00:00:00 +0000 test $
443 foo
443 foo
444 % conflict
444 % conflict
445 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
445 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
446 created new head
446 created new head
447 merging m
447 merging m
448 warning: conflicts during merge.
448 warning: conflicts during merge.
449 merging m failed!
449 merging m failed!
450 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
450 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
451 use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
451 use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
452 % keyword stays outside conflict zone
452 % keyword stays outside conflict zone
453 $Id$
453 $Id$
454 <<<<<<< local
454 <<<<<<< local
455 bar
455 bar
456 =======
456 =======
457 foo
457 foo
458 >>>>>>> other
458 >>>>>>> other
459 % resolve to local
459 % resolve to local
460 $Id: m 41efa6d38e9b Thu, 01 Jan 1970 00:00:00 +0000 test $
460 $Id: m 41efa6d38e9b Thu, 01 Jan 1970 00:00:00 +0000 test $
461 bar
461 bar
462 % test restricted mode with transplant -b
462 % test restricted mode with transplant -b
463 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
463 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
464 marked working directory as branch foo
464 marked working directory as branch foo
465 created new head
466 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
465 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
467 applying 4aa30d025d50
466 applying 4aa30d025d50
468 4aa30d025d50 transplanted to 5a4da427c162
467 4aa30d025d50 transplanted to 5a4da427c162
469 % no expansion in changeset
468 % no expansion in changeset
470 changeset: 11:5a4da427c162
469 changeset: 11:5a4da427c162
471 tag: tip
470 tag: tip
472 parent: 9:41efa6d38e9b
471 parent: 9:41efa6d38e9b
473 user: test
472 user: test
474 date: Thu Jan 01 00:00:00 1970 +0000
473 date: Thu Jan 01 00:00:00 1970 +0000
475 summary: 9foobranch
474 summary: 9foobranch
476
475
477 diff -r 41efa6d38e9b -r 5a4da427c162 a
476 diff -r 41efa6d38e9b -r 5a4da427c162 a
478 --- a/a Thu Jan 01 00:00:00 1970 +0000
477 --- a/a Thu Jan 01 00:00:00 1970 +0000
479 +++ b/a Thu Jan 01 00:00:00 1970 +0000
478 +++ b/a Thu Jan 01 00:00:00 1970 +0000
480 @@ -1,3 +1,4 @@
479 @@ -1,3 +1,4 @@
481 +foobranch
480 +foobranch
482 expand $Id$
481 expand $Id$
483 do not process $Id:
482 do not process $Id:
484 xxx $
483 xxx $
485
484
486 % expansion in file
485 % expansion in file
487 foobranch
486 foobranch
488 expand $Id: a 5a4da427c162 Thu, 01 Jan 1970 00:00:00 +0000 test $
487 expand $Id: a 5a4da427c162 Thu, 01 Jan 1970 00:00:00 +0000 test $
489 % switch off expansion
488 % switch off expansion
490 % kwshrink with unknown file u
489 % kwshrink with unknown file u
491 overwriting a shrinking keywords
490 overwriting a shrinking keywords
492 overwriting m shrinking keywords
491 overwriting m shrinking keywords
493 overwriting x/a shrinking keywords
492 overwriting x/a shrinking keywords
494 % cat
493 % cat
495 expand $Id$
494 expand $Id$
496 do not process $Id:
495 do not process $Id:
497 xxx $
496 xxx $
498 $Xinfo$
497 $Xinfo$
499 ignore $Id$
498 ignore $Id$
500 % hg cat
499 % hg cat
501 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
500 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
502 do not process $Id:
501 do not process $Id:
503 xxx $
502 xxx $
504 $Xinfo: User Name <user@example.com>: firstline $
503 $Xinfo: User Name <user@example.com>: firstline $
505 ignore $Id$
504 ignore $Id$
506 a
505 a
507 % cat
506 % cat
508 expand $Id$
507 expand $Id$
509 do not process $Id:
508 do not process $Id:
510 xxx $
509 xxx $
511 $Xinfo$
510 $Xinfo$
512 ignore $Id$
511 ignore $Id$
513 % hg cat
512 % hg cat
514 expand $Id$
513 expand $Id$
515 do not process $Id:
514 do not process $Id:
516 xxx $
515 xxx $
517 $Xinfo$
516 $Xinfo$
518 ignore $Id$
517 ignore $Id$
519 a
518 a
@@ -1,467 +1,466 b''
1 adding a
1 adding a
2 changeset: 0:8580ff50825a
2 changeset: 0:8580ff50825a
3 user: test
3 user: test
4 date: Thu Jan 01 00:00:01 1970 +0000
4 date: Thu Jan 01 00:00:01 1970 +0000
5 summary: a
5 summary: a
6
6
7 % -f, directory
7 % -f, directory
8 abort: cannot follow nonexistent file: "dir"
8 abort: cannot follow nonexistent file: "dir"
9 % -f, but no args
9 % -f, but no args
10 changeset: 4:66c1345dc4f9
10 changeset: 4:66c1345dc4f9
11 tag: tip
11 tag: tip
12 user: test
12 user: test
13 date: Thu Jan 01 00:00:05 1970 +0000
13 date: Thu Jan 01 00:00:05 1970 +0000
14 summary: e
14 summary: e
15
15
16 changeset: 3:7c6c671bb7cc
16 changeset: 3:7c6c671bb7cc
17 user: test
17 user: test
18 date: Thu Jan 01 00:00:04 1970 +0000
18 date: Thu Jan 01 00:00:04 1970 +0000
19 summary: d
19 summary: d
20
20
21 changeset: 2:41dd4284081e
21 changeset: 2:41dd4284081e
22 user: test
22 user: test
23 date: Thu Jan 01 00:00:03 1970 +0000
23 date: Thu Jan 01 00:00:03 1970 +0000
24 summary: c
24 summary: c
25
25
26 changeset: 1:784de7cef101
26 changeset: 1:784de7cef101
27 user: test
27 user: test
28 date: Thu Jan 01 00:00:02 1970 +0000
28 date: Thu Jan 01 00:00:02 1970 +0000
29 summary: b
29 summary: b
30
30
31 changeset: 0:8580ff50825a
31 changeset: 0:8580ff50825a
32 user: test
32 user: test
33 date: Thu Jan 01 00:00:01 1970 +0000
33 date: Thu Jan 01 00:00:01 1970 +0000
34 summary: a
34 summary: a
35
35
36 % one rename
36 % one rename
37 changeset: 0:8580ff50825a
37 changeset: 0:8580ff50825a
38 user: test
38 user: test
39 date: Thu Jan 01 00:00:01 1970 +0000
39 date: Thu Jan 01 00:00:01 1970 +0000
40 files: a
40 files: a
41 description:
41 description:
42 a
42 a
43
43
44
44
45 % many renames
45 % many renames
46 changeset: 4:66c1345dc4f9
46 changeset: 4:66c1345dc4f9
47 tag: tip
47 tag: tip
48 user: test
48 user: test
49 date: Thu Jan 01 00:00:05 1970 +0000
49 date: Thu Jan 01 00:00:05 1970 +0000
50 files: dir/b e
50 files: dir/b e
51 description:
51 description:
52 e
52 e
53
53
54
54
55 changeset: 2:41dd4284081e
55 changeset: 2:41dd4284081e
56 user: test
56 user: test
57 date: Thu Jan 01 00:00:03 1970 +0000
57 date: Thu Jan 01 00:00:03 1970 +0000
58 files: b dir/b
58 files: b dir/b
59 description:
59 description:
60 c
60 c
61
61
62
62
63 changeset: 1:784de7cef101
63 changeset: 1:784de7cef101
64 user: test
64 user: test
65 date: Thu Jan 01 00:00:02 1970 +0000
65 date: Thu Jan 01 00:00:02 1970 +0000
66 files: b
66 files: b
67 description:
67 description:
68 b
68 b
69
69
70
70
71 changeset: 0:8580ff50825a
71 changeset: 0:8580ff50825a
72 user: test
72 user: test
73 date: Thu Jan 01 00:00:01 1970 +0000
73 date: Thu Jan 01 00:00:01 1970 +0000
74 files: a
74 files: a
75 description:
75 description:
76 a
76 a
77
77
78
78
79 % log copies with --copies
79 % log copies with --copies
80 4 e (dir/b)
80 4 e (dir/b)
81 3 b (a)
81 3 b (a)
82 2 dir/b (b)
82 2 dir/b (b)
83 1 b (a)
83 1 b (a)
84 0
84 0
85 % log copies switch without --copies, with old filecopy template
85 % log copies switch without --copies, with old filecopy template
86 4
86 4
87 3
87 3
88 2
88 2
89 1
89 1
90 0
90 0
91 % log copies switch with --copies
91 % log copies switch with --copies
92 4 e (dir/b)
92 4 e (dir/b)
93 3 b (a)
93 3 b (a)
94 2 dir/b (b)
94 2 dir/b (b)
95 1 b (a)
95 1 b (a)
96 0
96 0
97 % log copies with hardcoded style and with --style=default
97 % log copies with hardcoded style and with --style=default
98 changeset: 4:66c1345dc4f9
98 changeset: 4:66c1345dc4f9
99 tag: tip
99 tag: tip
100 user: test
100 user: test
101 date: Thu Jan 01 00:00:05 1970 +0000
101 date: Thu Jan 01 00:00:05 1970 +0000
102 files: dir/b e
102 files: dir/b e
103 copies: e (dir/b)
103 copies: e (dir/b)
104 description:
104 description:
105 e
105 e
106
106
107
107
108 changeset: 4:66c1345dc4f9
108 changeset: 4:66c1345dc4f9
109 tag: tip
109 tag: tip
110 user: test
110 user: test
111 date: Thu Jan 01 00:00:05 1970 +0000
111 date: Thu Jan 01 00:00:05 1970 +0000
112 files: dir/b e
112 files: dir/b e
113 copies: e (dir/b)
113 copies: e (dir/b)
114 description:
114 description:
115 e
115 e
116
116
117
117
118 % log copies, non-linear manifest
118 % log copies, non-linear manifest
119 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
119 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
120 adding foo
120 adding foo
121 created new head
121 created new head
122 5 e (dir/b)
122 5 e (dir/b)
123 % log copies, execute bit set
123 % log copies, execute bit set
124 6
124 6
125 % log -p d
125 % log -p d
126 changeset: 3:7c6c671bb7cc
126 changeset: 3:7c6c671bb7cc
127 user: test
127 user: test
128 date: Thu Jan 01 00:00:04 1970 +0000
128 date: Thu Jan 01 00:00:04 1970 +0000
129 files: a b d
129 files: a b d
130 description:
130 description:
131 d
131 d
132
132
133
133
134 diff -r 41dd4284081e -r 7c6c671bb7cc d
134 diff -r 41dd4284081e -r 7c6c671bb7cc d
135 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
135 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
136 +++ b/d Thu Jan 01 00:00:04 1970 +0000
136 +++ b/d Thu Jan 01 00:00:04 1970 +0000
137 @@ -0,0 +1,1 @@
137 @@ -0,0 +1,1 @@
138 +a
138 +a
139
139
140 adding base
140 adding base
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 adding b1
142 adding b1
143 created new head
143 created new head
144 % log -f
144 % log -f
145 changeset: 3:e62f78d544b4
145 changeset: 3:e62f78d544b4
146 tag: tip
146 tag: tip
147 parent: 1:3d5bf5654eda
147 parent: 1:3d5bf5654eda
148 user: test
148 user: test
149 date: Thu Jan 01 00:00:01 1970 +0000
149 date: Thu Jan 01 00:00:01 1970 +0000
150 summary: b1
150 summary: b1
151
151
152 changeset: 1:3d5bf5654eda
152 changeset: 1:3d5bf5654eda
153 user: test
153 user: test
154 date: Thu Jan 01 00:00:01 1970 +0000
154 date: Thu Jan 01 00:00:01 1970 +0000
155 summary: r1
155 summary: r1
156
156
157 changeset: 0:67e992f2c4f3
157 changeset: 0:67e992f2c4f3
158 user: test
158 user: test
159 date: Thu Jan 01 00:00:01 1970 +0000
159 date: Thu Jan 01 00:00:01 1970 +0000
160 summary: base
160 summary: base
161
161
162 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
162 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
163 adding b2
163 adding b2
164 created new head
164 created new head
165 % log -f -r 1:tip
165 % log -f -r 1:tip
166 changeset: 1:3d5bf5654eda
166 changeset: 1:3d5bf5654eda
167 user: test
167 user: test
168 date: Thu Jan 01 00:00:01 1970 +0000
168 date: Thu Jan 01 00:00:01 1970 +0000
169 summary: r1
169 summary: r1
170
170
171 changeset: 2:60c670bf5b30
171 changeset: 2:60c670bf5b30
172 user: test
172 user: test
173 date: Thu Jan 01 00:00:01 1970 +0000
173 date: Thu Jan 01 00:00:01 1970 +0000
174 summary: r2
174 summary: r2
175
175
176 changeset: 3:e62f78d544b4
176 changeset: 3:e62f78d544b4
177 parent: 1:3d5bf5654eda
177 parent: 1:3d5bf5654eda
178 user: test
178 user: test
179 date: Thu Jan 01 00:00:01 1970 +0000
179 date: Thu Jan 01 00:00:01 1970 +0000
180 summary: b1
180 summary: b1
181
181
182 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
182 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
183 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
183 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
184 (branch merge, don't forget to commit)
184 (branch merge, don't forget to commit)
185 % log -r . with two parents
185 % log -r . with two parents
186 changeset: 3:e62f78d544b4
186 changeset: 3:e62f78d544b4
187 parent: 1:3d5bf5654eda
187 parent: 1:3d5bf5654eda
188 user: test
188 user: test
189 date: Thu Jan 01 00:00:01 1970 +0000
189 date: Thu Jan 01 00:00:01 1970 +0000
190 summary: b1
190 summary: b1
191
191
192 % log -r . with one parent
192 % log -r . with one parent
193 changeset: 5:302e9dd6890d
193 changeset: 5:302e9dd6890d
194 tag: tip
194 tag: tip
195 parent: 3:e62f78d544b4
195 parent: 3:e62f78d544b4
196 parent: 4:ddb82e70d1a1
196 parent: 4:ddb82e70d1a1
197 user: test
197 user: test
198 date: Thu Jan 01 00:00:01 1970 +0000
198 date: Thu Jan 01 00:00:01 1970 +0000
199 summary: m12
199 summary: m12
200
200
201 % log --follow-first
201 % log --follow-first
202 changeset: 6:2404bbcab562
202 changeset: 6:2404bbcab562
203 tag: tip
203 tag: tip
204 user: test
204 user: test
205 date: Thu Jan 01 00:00:01 1970 +0000
205 date: Thu Jan 01 00:00:01 1970 +0000
206 summary: b1.1
206 summary: b1.1
207
207
208 changeset: 5:302e9dd6890d
208 changeset: 5:302e9dd6890d
209 parent: 3:e62f78d544b4
209 parent: 3:e62f78d544b4
210 parent: 4:ddb82e70d1a1
210 parent: 4:ddb82e70d1a1
211 user: test
211 user: test
212 date: Thu Jan 01 00:00:01 1970 +0000
212 date: Thu Jan 01 00:00:01 1970 +0000
213 summary: m12
213 summary: m12
214
214
215 changeset: 3:e62f78d544b4
215 changeset: 3:e62f78d544b4
216 parent: 1:3d5bf5654eda
216 parent: 1:3d5bf5654eda
217 user: test
217 user: test
218 date: Thu Jan 01 00:00:01 1970 +0000
218 date: Thu Jan 01 00:00:01 1970 +0000
219 summary: b1
219 summary: b1
220
220
221 changeset: 1:3d5bf5654eda
221 changeset: 1:3d5bf5654eda
222 user: test
222 user: test
223 date: Thu Jan 01 00:00:01 1970 +0000
223 date: Thu Jan 01 00:00:01 1970 +0000
224 summary: r1
224 summary: r1
225
225
226 changeset: 0:67e992f2c4f3
226 changeset: 0:67e992f2c4f3
227 user: test
227 user: test
228 date: Thu Jan 01 00:00:01 1970 +0000
228 date: Thu Jan 01 00:00:01 1970 +0000
229 summary: base
229 summary: base
230
230
231 % log -P 2
231 % log -P 2
232 changeset: 6:2404bbcab562
232 changeset: 6:2404bbcab562
233 tag: tip
233 tag: tip
234 user: test
234 user: test
235 date: Thu Jan 01 00:00:01 1970 +0000
235 date: Thu Jan 01 00:00:01 1970 +0000
236 summary: b1.1
236 summary: b1.1
237
237
238 changeset: 5:302e9dd6890d
238 changeset: 5:302e9dd6890d
239 parent: 3:e62f78d544b4
239 parent: 3:e62f78d544b4
240 parent: 4:ddb82e70d1a1
240 parent: 4:ddb82e70d1a1
241 user: test
241 user: test
242 date: Thu Jan 01 00:00:01 1970 +0000
242 date: Thu Jan 01 00:00:01 1970 +0000
243 summary: m12
243 summary: m12
244
244
245 changeset: 4:ddb82e70d1a1
245 changeset: 4:ddb82e70d1a1
246 parent: 0:67e992f2c4f3
246 parent: 0:67e992f2c4f3
247 user: test
247 user: test
248 date: Thu Jan 01 00:00:01 1970 +0000
248 date: Thu Jan 01 00:00:01 1970 +0000
249 summary: b2
249 summary: b2
250
250
251 changeset: 3:e62f78d544b4
251 changeset: 3:e62f78d544b4
252 parent: 1:3d5bf5654eda
252 parent: 1:3d5bf5654eda
253 user: test
253 user: test
254 date: Thu Jan 01 00:00:01 1970 +0000
254 date: Thu Jan 01 00:00:01 1970 +0000
255 summary: b1
255 summary: b1
256
256
257 % log -r tip -p --git
257 % log -r tip -p --git
258 changeset: 6:2404bbcab562
258 changeset: 6:2404bbcab562
259 tag: tip
259 tag: tip
260 user: test
260 user: test
261 date: Thu Jan 01 00:00:01 1970 +0000
261 date: Thu Jan 01 00:00:01 1970 +0000
262 summary: b1.1
262 summary: b1.1
263
263
264 diff --git a/b1 b/b1
264 diff --git a/b1 b/b1
265 --- a/b1
265 --- a/b1
266 +++ b/b1
266 +++ b/b1
267 @@ -1,1 +1,2 @@
267 @@ -1,1 +1,2 @@
268 b1
268 b1
269 +postm
269 +postm
270
270
271 % log -r ""
271 % log -r ""
272 abort: 00changelog.i@: ambiguous identifier!
272 abort: 00changelog.i@: ambiguous identifier!
273 % log -r <some unknown node id>
273 % log -r <some unknown node id>
274 abort: unknown revision '1000000000000000000000000000000000000000'!
274 abort: unknown revision '1000000000000000000000000000000000000000'!
275 % log -k r1
275 % log -k r1
276 changeset: 1:3d5bf5654eda
276 changeset: 1:3d5bf5654eda
277 user: test
277 user: test
278 date: Thu Jan 01 00:00:01 1970 +0000
278 date: Thu Jan 01 00:00:01 1970 +0000
279 summary: r1
279 summary: r1
280
280
281 % log -d -1
281 % log -d -1
282 % log -p -l2 --color=always
282 % log -p -l2 --color=always
283 changeset: 6:2404bbcab562
283 changeset: 6:2404bbcab562
284 tag: tip
284 tag: tip
285 user: test
285 user: test
286 date: Thu Jan 01 00:00:01 1970 +0000
286 date: Thu Jan 01 00:00:01 1970 +0000
287 summary: b1.1
287 summary: b1.1
288
288
289 diff -r 302e9dd6890d -r 2404bbcab562 b1
289 diff -r 302e9dd6890d -r 2404bbcab562 b1
290 --- a/b1 Thu Jan 01 00:00:01 1970 +0000
290 --- a/b1 Thu Jan 01 00:00:01 1970 +0000
291 +++ b/b1 Thu Jan 01 00:00:01 1970 +0000
291 +++ b/b1 Thu Jan 01 00:00:01 1970 +0000
292 @@ -1,1 +1,2 @@
292 @@ -1,1 +1,2 @@
293 b1
293 b1
294 +postm
294 +postm
295
295
296 changeset: 5:302e9dd6890d
296 changeset: 5:302e9dd6890d
297 parent: 3:e62f78d544b4
297 parent: 3:e62f78d544b4
298 parent: 4:ddb82e70d1a1
298 parent: 4:ddb82e70d1a1
299 user: test
299 user: test
300 date: Thu Jan 01 00:00:01 1970 +0000
300 date: Thu Jan 01 00:00:01 1970 +0000
301 summary: m12
301 summary: m12
302
302
303 diff -r e62f78d544b4 -r 302e9dd6890d b2
303 diff -r e62f78d544b4 -r 302e9dd6890d b2
304 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
304 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
305 +++ b/b2 Thu Jan 01 00:00:01 1970 +0000
305 +++ b/b2 Thu Jan 01 00:00:01 1970 +0000
306 @@ -0,0 +1,1 @@
306 @@ -0,0 +1,1 @@
307 +b2
307 +b2
308
308
309 % log -r tip --stat
309 % log -r tip --stat
310 changeset: 6:2404bbcab562
310 changeset: 6:2404bbcab562
311 tag: tip
311 tag: tip
312 user: test
312 user: test
313 date: Thu Jan 01 00:00:01 1970 +0000
313 date: Thu Jan 01 00:00:01 1970 +0000
314 summary: b1.1
314 summary: b1.1
315
315
316 b1 | 1 +
316 b1 | 1 +
317 1 files changed, 1 insertions(+), 0 deletions(-)
317 1 files changed, 1 insertions(+), 0 deletions(-)
318
318
319 adding a
319 adding a
320 adding b
320 adding b
321 changeset: 0:29a4c94f1924
321 changeset: 0:29a4c94f1924
322 user: User One <user1@example.org>
322 user: User One <user1@example.org>
323 date: Thu Jan 01 00:00:00 1970 +0000
323 date: Thu Jan 01 00:00:00 1970 +0000
324 summary: a
324 summary: a
325
325
326 changeset: 1:e834b5e69c0e
326 changeset: 1:e834b5e69c0e
327 tag: tip
327 tag: tip
328 user: User Two <user2@example.org>
328 user: User Two <user2@example.org>
329 date: Thu Jan 01 00:00:00 1970 +0000
329 date: Thu Jan 01 00:00:00 1970 +0000
330 summary: b
330 summary: b
331
331
332 changeset: 0:29a4c94f1924
332 changeset: 0:29a4c94f1924
333 user: User One <user1@example.org>
333 user: User One <user1@example.org>
334 date: Thu Jan 01 00:00:00 1970 +0000
334 date: Thu Jan 01 00:00:00 1970 +0000
335 summary: a
335 summary: a
336
336
337 adding a
337 adding a
338 marked working directory as branch test
338 marked working directory as branch test
339 adding b
339 adding b
340 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
340 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
341 adding c
341 adding c
342 created new head
343 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
342 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
344 adding c
343 adding c
345 % log -b default
344 % log -b default
346 changeset: 2:c3a4f03cc9a7
345 changeset: 2:c3a4f03cc9a7
347 parent: 0:24427303d56f
346 parent: 0:24427303d56f
348 user: test
347 user: test
349 date: Thu Jan 01 00:00:00 1970 +0000
348 date: Thu Jan 01 00:00:00 1970 +0000
350 summary: commit on default
349 summary: commit on default
351
350
352 changeset: 0:24427303d56f
351 changeset: 0:24427303d56f
353 user: test
352 user: test
354 date: Thu Jan 01 00:00:00 1970 +0000
353 date: Thu Jan 01 00:00:00 1970 +0000
355 summary: commit on default
354 summary: commit on default
356
355
357 % log -b test
356 % log -b test
358 changeset: 3:f5d8de11c2e2
357 changeset: 3:f5d8de11c2e2
359 branch: test
358 branch: test
360 tag: tip
359 tag: tip
361 parent: 1:d32277701ccb
360 parent: 1:d32277701ccb
362 user: test
361 user: test
363 date: Thu Jan 01 00:00:00 1970 +0000
362 date: Thu Jan 01 00:00:00 1970 +0000
364 summary: commit on test
363 summary: commit on test
365
364
366 changeset: 1:d32277701ccb
365 changeset: 1:d32277701ccb
367 branch: test
366 branch: test
368 user: test
367 user: test
369 date: Thu Jan 01 00:00:00 1970 +0000
368 date: Thu Jan 01 00:00:00 1970 +0000
370 summary: commit on test
369 summary: commit on test
371
370
372 % log -b dummy
371 % log -b dummy
373 abort: unknown revision 'dummy'!
372 abort: unknown revision 'dummy'!
374 % log -b .
373 % log -b .
375 changeset: 3:f5d8de11c2e2
374 changeset: 3:f5d8de11c2e2
376 branch: test
375 branch: test
377 tag: tip
376 tag: tip
378 parent: 1:d32277701ccb
377 parent: 1:d32277701ccb
379 user: test
378 user: test
380 date: Thu Jan 01 00:00:00 1970 +0000
379 date: Thu Jan 01 00:00:00 1970 +0000
381 summary: commit on test
380 summary: commit on test
382
381
383 changeset: 1:d32277701ccb
382 changeset: 1:d32277701ccb
384 branch: test
383 branch: test
385 user: test
384 user: test
386 date: Thu Jan 01 00:00:00 1970 +0000
385 date: Thu Jan 01 00:00:00 1970 +0000
387 summary: commit on test
386 summary: commit on test
388
387
389 % log -b default -b test
388 % log -b default -b test
390 changeset: 3:f5d8de11c2e2
389 changeset: 3:f5d8de11c2e2
391 branch: test
390 branch: test
392 tag: tip
391 tag: tip
393 parent: 1:d32277701ccb
392 parent: 1:d32277701ccb
394 user: test
393 user: test
395 date: Thu Jan 01 00:00:00 1970 +0000
394 date: Thu Jan 01 00:00:00 1970 +0000
396 summary: commit on test
395 summary: commit on test
397
396
398 changeset: 2:c3a4f03cc9a7
397 changeset: 2:c3a4f03cc9a7
399 parent: 0:24427303d56f
398 parent: 0:24427303d56f
400 user: test
399 user: test
401 date: Thu Jan 01 00:00:00 1970 +0000
400 date: Thu Jan 01 00:00:00 1970 +0000
402 summary: commit on default
401 summary: commit on default
403
402
404 changeset: 1:d32277701ccb
403 changeset: 1:d32277701ccb
405 branch: test
404 branch: test
406 user: test
405 user: test
407 date: Thu Jan 01 00:00:00 1970 +0000
406 date: Thu Jan 01 00:00:00 1970 +0000
408 summary: commit on test
407 summary: commit on test
409
408
410 changeset: 0:24427303d56f
409 changeset: 0:24427303d56f
411 user: test
410 user: test
412 date: Thu Jan 01 00:00:00 1970 +0000
411 date: Thu Jan 01 00:00:00 1970 +0000
413 summary: commit on default
412 summary: commit on default
414
413
415 % log -b default -b .
414 % log -b default -b .
416 changeset: 3:f5d8de11c2e2
415 changeset: 3:f5d8de11c2e2
417 branch: test
416 branch: test
418 tag: tip
417 tag: tip
419 parent: 1:d32277701ccb
418 parent: 1:d32277701ccb
420 user: test
419 user: test
421 date: Thu Jan 01 00:00:00 1970 +0000
420 date: Thu Jan 01 00:00:00 1970 +0000
422 summary: commit on test
421 summary: commit on test
423
422
424 changeset: 2:c3a4f03cc9a7
423 changeset: 2:c3a4f03cc9a7
425 parent: 0:24427303d56f
424 parent: 0:24427303d56f
426 user: test
425 user: test
427 date: Thu Jan 01 00:00:00 1970 +0000
426 date: Thu Jan 01 00:00:00 1970 +0000
428 summary: commit on default
427 summary: commit on default
429
428
430 changeset: 1:d32277701ccb
429 changeset: 1:d32277701ccb
431 branch: test
430 branch: test
432 user: test
431 user: test
433 date: Thu Jan 01 00:00:00 1970 +0000
432 date: Thu Jan 01 00:00:00 1970 +0000
434 summary: commit on test
433 summary: commit on test
435
434
436 changeset: 0:24427303d56f
435 changeset: 0:24427303d56f
437 user: test
436 user: test
438 date: Thu Jan 01 00:00:00 1970 +0000
437 date: Thu Jan 01 00:00:00 1970 +0000
439 summary: commit on default
438 summary: commit on default
440
439
441 % log -b . -b test
440 % log -b . -b test
442 changeset: 3:f5d8de11c2e2
441 changeset: 3:f5d8de11c2e2
443 branch: test
442 branch: test
444 tag: tip
443 tag: tip
445 parent: 1:d32277701ccb
444 parent: 1:d32277701ccb
446 user: test
445 user: test
447 date: Thu Jan 01 00:00:00 1970 +0000
446 date: Thu Jan 01 00:00:00 1970 +0000
448 summary: commit on test
447 summary: commit on test
449
448
450 changeset: 1:d32277701ccb
449 changeset: 1:d32277701ccb
451 branch: test
450 branch: test
452 user: test
451 user: test
453 date: Thu Jan 01 00:00:00 1970 +0000
452 date: Thu Jan 01 00:00:00 1970 +0000
454 summary: commit on test
453 summary: commit on test
455
454
456 % log -b 2
455 % log -b 2
457 changeset: 2:c3a4f03cc9a7
456 changeset: 2:c3a4f03cc9a7
458 parent: 0:24427303d56f
457 parent: 0:24427303d56f
459 user: test
458 user: test
460 date: Thu Jan 01 00:00:00 1970 +0000
459 date: Thu Jan 01 00:00:00 1970 +0000
461 summary: commit on default
460 summary: commit on default
462
461
463 changeset: 0:24427303d56f
462 changeset: 0:24427303d56f
464 user: test
463 user: test
465 date: Thu Jan 01 00:00:00 1970 +0000
464 date: Thu Jan 01 00:00:00 1970 +0000
466 summary: commit on default
465 summary: commit on default
467
466
@@ -1,41 +1,40 b''
1 adding a
1 adding a
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 created new head
3 created new head
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 created new head
5 created new head
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
6 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
7 % should fail because not at a head
7 % should fail because not at a head
8 abort: branch 'default' has 3 heads - please merge with an explicit rev
8 abort: branch 'default' has 3 heads - please merge with an explicit rev
9 (run 'hg heads .' to see heads)
9 (run 'hg heads .' to see heads)
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 % should fail because > 2 heads
11 % should fail because > 2 heads
12 abort: branch 'default' has 3 heads - please merge with an explicit rev
12 abort: branch 'default' has 3 heads - please merge with an explicit rev
13 (run 'hg heads .' to see heads)
13 (run 'hg heads .' to see heads)
14 % should succeed
14 % should succeed
15 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
15 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
16 (branch merge, don't forget to commit)
16 (branch merge, don't forget to commit)
17 % should succeed - 2 heads
17 % should succeed - 2 heads
18 changeset: 3:ea9ff125ff88
18 changeset: 3:ea9ff125ff88
19 parent: 1:1846eede8b68
19 parent: 1:1846eede8b68
20 user: test
20 user: test
21 date: Thu Jan 01 00:00:00 1970 +0000
21 date: Thu Jan 01 00:00:00 1970 +0000
22 summary: d
22 summary: d
23
23
24 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
24 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
25 (branch merge, don't forget to commit)
25 (branch merge, don't forget to commit)
26 % should fail because at tip
26 % should fail because at tip
27 abort: there is nothing to merge
27 abort: there is nothing to merge
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 % should fail because 1 head
29 % should fail because 1 head
30 abort: there is nothing to merge - use "hg update" instead
30 abort: there is nothing to merge - use "hg update" instead
31 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
31 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
32 marked working directory as branch foobranch
32 marked working directory as branch foobranch
33 created new head
34 % should fail because merge with other branch
33 % should fail because merge with other branch
35 abort: branch 'foobranch' has one head - please merge with an explicit rev
34 abort: branch 'foobranch' has one head - please merge with an explicit rev
36 (run 'hg heads' to see all heads)
35 (run 'hg heads' to see all heads)
37 % merge preview not affected by common ancestor
36 % merge preview not affected by common ancestor
38 2:2d95304fed5d
37 2:2d95304fed5d
39 4:f25cbe84d8b3
38 4:f25cbe84d8b3
40 5:a431fabd6039
39 5:a431fabd6039
41 6:e88e33f3bf62
40 6:e88e33f3bf62
@@ -1,48 +1,48 b''
1 % try to commit on top of a patch
1 % try to commit on top of a patch
2 abort: cannot commit over an applied mq patch
2 abort: cannot commit over an applied mq patch
3 % qpop/qrefresh on the wrong revision
3 % qpop/qrefresh on the wrong revision
4 abort: popping would remove a revision not managed by this patch queue
4 abort: popping would remove a revision not managed by this patch queue
5 using patch queue:
5 using patch queue:
6 abort: popping would remove a revision not managed by this patch queue
6 abort: popping would remove a revision not managed by this patch queue
7 abort: working directory revision is not qtip
7 abort: working directory revision is not qtip
8 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
8 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
9 % qpop
9 % qpop
10 abort: popping would remove a revision not managed by this patch queue
10 abort: popping would remove a revision not managed by this patch queue
11 % qrefresh
11 % qrefresh
12 abort: cannot refresh a revision with children
12 abort: cannot refresh a revision with children
13 % tip:
13 % tip:
14 3 append quux
14 3 append quux
15 % qpush warning branchheads
15 % qpush warning branchheads
16 popping qp
16 popping qp
17 patch queue now empty
17 patch queue now empty
18 adding a
18 adding a
19 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
19 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
20 marked working directory as branch b
20 marked working directory as branch b
21 adding c
21 adding c
22 created new head
23 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
22 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
24 (branch merge, don't forget to commit)
23 (branch merge, don't forget to commit)
24 created new head
25 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
25 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
26 changeset: 2:65309210bf4e
26 changeset: 2:65309210bf4e
27 branch: b
27 branch: b
28 tag: tip
28 tag: tip
29 parent: 1:707adb4c8ae1
29 parent: 1:707adb4c8ae1
30 parent: 0:cb9a9f314b8b
30 parent: 0:cb9a9f314b8b
31 user: test
31 user: test
32 date: Thu Jan 01 00:00:00 1970 +0000
32 date: Thu Jan 01 00:00:00 1970 +0000
33 summary: merge
33 summary: merge
34
34
35 changeset: 1:707adb4c8ae1
35 changeset: 1:707adb4c8ae1
36 branch: b
36 branch: b
37 parent: -1:000000000000
37 parent: -1:000000000000
38 user: test
38 user: test
39 date: Thu Jan 01 00:00:00 1970 +0000
39 date: Thu Jan 01 00:00:00 1970 +0000
40 summary: c
40 summary: c
41
41
42 changeset: 0:cb9a9f314b8b
42 changeset: 0:cb9a9f314b8b
43 user: test
43 user: test
44 date: Thu Jan 01 00:00:00 1970 +0000
44 date: Thu Jan 01 00:00:00 1970 +0000
45 summary: a
45 summary: a
46
46
47 applying qp
47 applying qp
48 now at: qp
48 now at: qp
@@ -1,181 +1,182 b''
1 marked working directory as branch foo
1 marked working directory as branch foo
2 foo
2 foo
3 marked working directory as branch bar
3 marked working directory as branch bar
4 % branch shadowing
4 % branch shadowing
5 abort: a branch of the same name already exists (use 'hg update' to switch to it)
5 abort: a branch of the same name already exists (use 'hg update' to switch to it)
6 marked working directory as branch default
6 marked working directory as branch default
7 created new head
7 % there should be only one default branch head
8 % there should be only one default branch head
8 changeset: 3:bf1bc2f45e83
9 changeset: 3:bf1bc2f45e83
9 tag: tip
10 tag: tip
10 user: test
11 user: test
11 date: Mon Jan 12 13:46:40 1970 +0000
12 date: Mon Jan 12 13:46:40 1970 +0000
12 summary: clear branch name
13 summary: clear branch name
13
14
14 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 foo
16 foo
16 created new head
17 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
17 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
18 (branch merge, don't forget to commit)
18 (branch merge, don't forget to commit)
19 foo
19 foo
20 created new head
20 changeset: 5:5f8fb06e083e
21 changeset: 5:5f8fb06e083e
21 branch: foo
22 branch: foo
22 tag: tip
23 tag: tip
23 parent: 4:4909a3732169
24 parent: 4:4909a3732169
24 parent: 3:bf1bc2f45e83
25 parent: 3:bf1bc2f45e83
25 user: test
26 user: test
26 date: Mon Jan 12 13:46:40 1970 +0000
27 date: Mon Jan 12 13:46:40 1970 +0000
27 summary: merge
28 summary: merge
28
29
29 changeset: 4:4909a3732169
30 changeset: 4:4909a3732169
30 branch: foo
31 branch: foo
31 parent: 1:b699b1cec9c2
32 parent: 1:b699b1cec9c2
32 user: test
33 user: test
33 date: Mon Jan 12 13:46:40 1970 +0000
34 date: Mon Jan 12 13:46:40 1970 +0000
34 summary: modify a branch
35 summary: modify a branch
35
36
36 changeset: 3:bf1bc2f45e83
37 changeset: 3:bf1bc2f45e83
37 user: test
38 user: test
38 date: Mon Jan 12 13:46:40 1970 +0000
39 date: Mon Jan 12 13:46:40 1970 +0000
39 summary: clear branch name
40 summary: clear branch name
40
41
41 changeset: 2:67ec16bde7f1
42 changeset: 2:67ec16bde7f1
42 branch: bar
43 branch: bar
43 user: test
44 user: test
44 date: Mon Jan 12 13:46:40 1970 +0000
45 date: Mon Jan 12 13:46:40 1970 +0000
45 summary: change branch name
46 summary: change branch name
46
47
47 changeset: 1:b699b1cec9c2
48 changeset: 1:b699b1cec9c2
48 branch: foo
49 branch: foo
49 user: test
50 user: test
50 date: Mon Jan 12 13:46:40 1970 +0000
51 date: Mon Jan 12 13:46:40 1970 +0000
51 summary: add branch name
52 summary: add branch name
52
53
53 changeset: 0:be8523e69bf8
54 changeset: 0:be8523e69bf8
54 user: test
55 user: test
55 date: Mon Jan 12 13:46:40 1970 +0000
56 date: Mon Jan 12 13:46:40 1970 +0000
56 summary: initial
57 summary: initial
57
58
58 foo 5:5f8fb06e083e
59 foo 5:5f8fb06e083e
59 default 3:bf1bc2f45e83 (inactive)
60 default 3:bf1bc2f45e83 (inactive)
60 bar 2:67ec16bde7f1 (inactive)
61 bar 2:67ec16bde7f1 (inactive)
61 foo
62 foo
62 default
63 default
63 bar
64 bar
64 % test for invalid branch cache
65 % test for invalid branch cache
65 rolling back to revision 5 (undo commit)
66 rolling back to revision 5 (undo commit)
66 changeset: 4:4909a3732169
67 changeset: 4:4909a3732169
67 branch: foo
68 branch: foo
68 tag: tip
69 tag: tip
69 parent: 1:b699b1cec9c2
70 parent: 1:b699b1cec9c2
70 user: test
71 user: test
71 date: Mon Jan 12 13:46:40 1970 +0000
72 date: Mon Jan 12 13:46:40 1970 +0000
72 summary: modify a branch
73 summary: modify a branch
73
74
74 invalidating branch cache (tip differs)
75 invalidating branch cache (tip differs)
75 changeset: 4:4909a3732169c0c20011c4f4b8fdff4e3d89b23f
76 changeset: 4:4909a3732169c0c20011c4f4b8fdff4e3d89b23f
76 branch: foo
77 branch: foo
77 tag: tip
78 tag: tip
78 parent: 1:b699b1cec9c2966b3700de4fef0dc123cd754c31
79 parent: 1:b699b1cec9c2966b3700de4fef0dc123cd754c31
79 parent: -1:0000000000000000000000000000000000000000
80 parent: -1:0000000000000000000000000000000000000000
80 manifest: 4:d01b250baaa05909152f7ae07d7a649deea0df9a
81 manifest: 4:d01b250baaa05909152f7ae07d7a649deea0df9a
81 user: test
82 user: test
82 date: Mon Jan 12 13:46:40 1970 +0000
83 date: Mon Jan 12 13:46:40 1970 +0000
83 files: a
84 files: a
84 extra: branch=foo
85 extra: branch=foo
85 description:
86 description:
86 modify a branch
87 modify a branch
87
88
88
89
89 4:4909a3732169
90 4:4909a3732169
90 4909a3732169c0c20011c4f4b8fdff4e3d89b23f 4
91 4909a3732169c0c20011c4f4b8fdff4e3d89b23f 4
91 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
92 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
92 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
93 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
93 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
94 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
94 % push should update the branch cache
95 % push should update the branch cache
95 % pushing just rev 0
96 % pushing just rev 0
96 be8523e69bf892e25817fc97187516b3c0804ae4 0
97 be8523e69bf892e25817fc97187516b3c0804ae4 0
97 be8523e69bf892e25817fc97187516b3c0804ae4 default
98 be8523e69bf892e25817fc97187516b3c0804ae4 default
98 % pushing everything
99 % pushing everything
99 4909a3732169c0c20011c4f4b8fdff4e3d89b23f 4
100 4909a3732169c0c20011c4f4b8fdff4e3d89b23f 4
100 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
101 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
101 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
102 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
102 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
103 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
103 % update with no arguments: tipmost revision of the current branch
104 % update with no arguments: tipmost revision of the current branch
104 bf1bc2f45e83
105 bf1bc2f45e83
105 4909a3732169 (foo) tip
106 4909a3732169 (foo) tip
106 marked working directory as branch foobar
107 marked working directory as branch foobar
107 abort: branch foobar not found
108 abort: branch foobar not found
108 % fastforward merge
109 % fastforward merge
109 marked working directory as branch ff
110 marked working directory as branch ff
110 adding ff
111 adding ff
111 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
112 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
112 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
113 (branch merge, don't forget to commit)
114 (branch merge, don't forget to commit)
114 foo
115 foo
116 created new head
115 changeset: 6:f0c74f92a385
117 changeset: 6:f0c74f92a385
116 branch: foo
118 branch: foo
117 tag: tip
119 tag: tip
118 parent: 4:4909a3732169
120 parent: 4:4909a3732169
119 parent: 5:c420d2121b71
121 parent: 5:c420d2121b71
120 user: test
122 user: test
121 date: Mon Jan 12 13:46:40 1970 +0000
123 date: Mon Jan 12 13:46:40 1970 +0000
122 summary: Merge ff into foo
124 summary: Merge ff into foo
123
125
124 a
126 a
125 ff
127 ff
126 % test merging, add 3 default heads and one test head
128 % test merging, add 3 default heads and one test head
127 adding a
129 adding a
128 adding b
130 adding b
129 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
131 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
130 adding c
132 adding c
131 created new head
133 created new head
132 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
134 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
133 adding d
135 adding d
134 created new head
136 created new head
135 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
137 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
136 marked working directory as branch test
138 marked working directory as branch test
137 adding e
139 adding e
138 created new head
139 changeset: 4:3a1e01ed1df4
140 changeset: 4:3a1e01ed1df4
140 branch: test
141 branch: test
141 tag: tip
142 tag: tip
142 parent: 0:cb9a9f314b8b
143 parent: 0:cb9a9f314b8b
143 user: test
144 user: test
144 date: Thu Jan 01 00:00:00 1970 +0000
145 date: Thu Jan 01 00:00:00 1970 +0000
145 summary: e
146 summary: e
146
147
147 changeset: 3:980f7dc84c29
148 changeset: 3:980f7dc84c29
148 parent: 0:cb9a9f314b8b
149 parent: 0:cb9a9f314b8b
149 user: test
150 user: test
150 date: Thu Jan 01 00:00:00 1970 +0000
151 date: Thu Jan 01 00:00:00 1970 +0000
151 summary: d
152 summary: d
152
153
153 changeset: 2:d36c0562f908
154 changeset: 2:d36c0562f908
154 parent: 0:cb9a9f314b8b
155 parent: 0:cb9a9f314b8b
155 user: test
156 user: test
156 date: Thu Jan 01 00:00:00 1970 +0000
157 date: Thu Jan 01 00:00:00 1970 +0000
157 summary: c
158 summary: c
158
159
159 changeset: 1:d2ae7f538514
160 changeset: 1:d2ae7f538514
160 user: test
161 user: test
161 date: Thu Jan 01 00:00:00 1970 +0000
162 date: Thu Jan 01 00:00:00 1970 +0000
162 summary: b
163 summary: b
163
164
164 changeset: 0:cb9a9f314b8b
165 changeset: 0:cb9a9f314b8b
165 user: test
166 user: test
166 date: Thu Jan 01 00:00:00 1970 +0000
167 date: Thu Jan 01 00:00:00 1970 +0000
167 summary: a
168 summary: a
168
169
169 % implicit merge with test branch as parent
170 % implicit merge with test branch as parent
170 abort: branch 'test' has one head - please merge with an explicit rev
171 abort: branch 'test' has one head - please merge with an explicit rev
171 (run 'hg heads' to see all heads)
172 (run 'hg heads' to see all heads)
172 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
173 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
173 % implicit merge with default branch as parent
174 % implicit merge with default branch as parent
174 abort: branch 'default' has 3 heads - please merge with an explicit rev
175 abort: branch 'default' has 3 heads - please merge with an explicit rev
175 (run 'hg heads .' to see heads)
176 (run 'hg heads .' to see heads)
176 % 3 branch heads, explicit merge required
177 % 3 branch heads, explicit merge required
177 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
178 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
178 (branch merge, don't forget to commit)
179 (branch merge, don't forget to commit)
179 % 2 branch heads, implicit merge works
180 % 2 branch heads, implicit merge works
180 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
181 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
181 (branch merge, don't forget to commit)
182 (branch merge, don't forget to commit)
@@ -1,1948 +1,1947 b''
1 adding a
1 adding a
2 This patch series consists of 1 patches.
2 This patch series consists of 1 patches.
3
3
4
4
5 Displaying [PATCH] a ...
5 Displaying [PATCH] a ...
6 Content-Type: text/plain; charset="us-ascii"
6 Content-Type: text/plain; charset="us-ascii"
7 MIME-Version: 1.0
7 MIME-Version: 1.0
8 Content-Transfer-Encoding: 7bit
8 Content-Transfer-Encoding: 7bit
9 Subject: [PATCH] a
9 Subject: [PATCH] a
10 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
10 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
11 Message-Id: <8580ff50825a50c8f716.60@
11 Message-Id: <8580ff50825a50c8f716.60@
12 User-Agent: Mercurial-patchbomb
12 User-Agent: Mercurial-patchbomb
13 Date: Thu, 01 Jan 1970 00:01:00 +0000
13 Date: Thu, 01 Jan 1970 00:01:00 +0000
14 From: quux
14 From: quux
15 To: foo
15 To: foo
16 Cc: bar
16 Cc: bar
17
17
18 # HG changeset patch
18 # HG changeset patch
19 # User test
19 # User test
20 # Date 1 0
20 # Date 1 0
21 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
21 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
22 # Parent 0000000000000000000000000000000000000000
22 # Parent 0000000000000000000000000000000000000000
23 a
23 a
24
24
25 diff -r 000000000000 -r 8580ff50825a a
25 diff -r 000000000000 -r 8580ff50825a a
26 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
26 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
27 +++ b/a Thu Jan 01 00:00:01 1970 +0000
27 +++ b/a Thu Jan 01 00:00:01 1970 +0000
28 @@ -0,0 +1,1 @@
28 @@ -0,0 +1,1 @@
29 +a
29 +a
30
30
31 adding b
31 adding b
32 This patch series consists of 2 patches.
32 This patch series consists of 2 patches.
33
33
34
34
35 Write the introductory message for the patch series.
35 Write the introductory message for the patch series.
36
36
37
37
38 Displaying [PATCH 0 of 2] test ...
38 Displaying [PATCH 0 of 2] test ...
39 Content-Type: text/plain; charset="us-ascii"
39 Content-Type: text/plain; charset="us-ascii"
40 MIME-Version: 1.0
40 MIME-Version: 1.0
41 Content-Transfer-Encoding: 7bit
41 Content-Transfer-Encoding: 7bit
42 Subject: [PATCH 0 of 2] test
42 Subject: [PATCH 0 of 2] test
43 Message-Id: <patchbomb.120@
43 Message-Id: <patchbomb.120@
44 User-Agent: Mercurial-patchbomb
44 User-Agent: Mercurial-patchbomb
45 Date: Thu, 01 Jan 1970 00:02:00 +0000
45 Date: Thu, 01 Jan 1970 00:02:00 +0000
46 From: quux
46 From: quux
47 To: foo
47 To: foo
48 Cc: bar
48 Cc: bar
49
49
50
50
51 Displaying [PATCH 1 of 2] a ...
51 Displaying [PATCH 1 of 2] a ...
52 Content-Type: text/plain; charset="us-ascii"
52 Content-Type: text/plain; charset="us-ascii"
53 MIME-Version: 1.0
53 MIME-Version: 1.0
54 Content-Transfer-Encoding: 7bit
54 Content-Transfer-Encoding: 7bit
55 Subject: [PATCH 1 of 2] a
55 Subject: [PATCH 1 of 2] a
56 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
56 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
57 Message-Id: <8580ff50825a50c8f716.121@
57 Message-Id: <8580ff50825a50c8f716.121@
58 In-Reply-To: <patchbomb.120@
58 In-Reply-To: <patchbomb.120@
59 References: <patchbomb.120@
59 References: <patchbomb.120@
60 User-Agent: Mercurial-patchbomb
60 User-Agent: Mercurial-patchbomb
61 Date: Thu, 01 Jan 1970 00:02:01 +0000
61 Date: Thu, 01 Jan 1970 00:02:01 +0000
62 From: quux
62 From: quux
63 To: foo
63 To: foo
64 Cc: bar
64 Cc: bar
65
65
66 # HG changeset patch
66 # HG changeset patch
67 # User test
67 # User test
68 # Date 1 0
68 # Date 1 0
69 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
69 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
70 # Parent 0000000000000000000000000000000000000000
70 # Parent 0000000000000000000000000000000000000000
71 a
71 a
72
72
73 diff -r 000000000000 -r 8580ff50825a a
73 diff -r 000000000000 -r 8580ff50825a a
74 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
74 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
75 +++ b/a Thu Jan 01 00:00:01 1970 +0000
75 +++ b/a Thu Jan 01 00:00:01 1970 +0000
76 @@ -0,0 +1,1 @@
76 @@ -0,0 +1,1 @@
77 +a
77 +a
78
78
79 Displaying [PATCH 2 of 2] b ...
79 Displaying [PATCH 2 of 2] b ...
80 Content-Type: text/plain; charset="us-ascii"
80 Content-Type: text/plain; charset="us-ascii"
81 MIME-Version: 1.0
81 MIME-Version: 1.0
82 Content-Transfer-Encoding: 7bit
82 Content-Transfer-Encoding: 7bit
83 Subject: [PATCH 2 of 2] b
83 Subject: [PATCH 2 of 2] b
84 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
84 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
85 Message-Id: <97d72e5f12c7e84f8506.122@
85 Message-Id: <97d72e5f12c7e84f8506.122@
86 In-Reply-To: <patchbomb.120@
86 In-Reply-To: <patchbomb.120@
87 References: <patchbomb.120@
87 References: <patchbomb.120@
88 User-Agent: Mercurial-patchbomb
88 User-Agent: Mercurial-patchbomb
89 Date: Thu, 01 Jan 1970 00:02:02 +0000
89 Date: Thu, 01 Jan 1970 00:02:02 +0000
90 From: quux
90 From: quux
91 To: foo
91 To: foo
92 Cc: bar
92 Cc: bar
93
93
94 # HG changeset patch
94 # HG changeset patch
95 # User test
95 # User test
96 # Date 2 0
96 # Date 2 0
97 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
97 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
98 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
98 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
99 b
99 b
100
100
101 diff -r 8580ff50825a -r 97d72e5f12c7 b
101 diff -r 8580ff50825a -r 97d72e5f12c7 b
102 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
102 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
103 +++ b/b Thu Jan 01 00:00:02 1970 +0000
103 +++ b/b Thu Jan 01 00:00:02 1970 +0000
104 @@ -0,0 +1,1 @@
104 @@ -0,0 +1,1 @@
105 +b
105 +b
106
106
107 This patch series consists of 2 patches.
107 This patch series consists of 2 patches.
108
108
109
109
110 Write the introductory message for the patch series.
110 Write the introductory message for the patch series.
111
111
112
112
113 Writing [PATCH 0 of 2] test ...
113 Writing [PATCH 0 of 2] test ...
114 Writing [PATCH 1 of 2] a ...
114 Writing [PATCH 1 of 2] a ...
115 Writing [PATCH 2 of 2] b ...
115 Writing [PATCH 2 of 2] b ...
116 adding c
116 adding c
117 % test bundle and description
117 % test bundle and description
118 searching for changes
118 searching for changes
119 1 changesets found
119 1 changesets found
120
120
121 Displaying test ...
121 Displaying test ...
122 Content-Type: multipart/mixed; boundary="===
122 Content-Type: multipart/mixed; boundary="===
123 MIME-Version: 1.0
123 MIME-Version: 1.0
124 Subject: test
124 Subject: test
125 Message-Id: <patchbomb.180@
125 Message-Id: <patchbomb.180@
126 User-Agent: Mercurial-patchbomb
126 User-Agent: Mercurial-patchbomb
127 Date: Thu, 01 Jan 1970 00:03:00 +0000
127 Date: Thu, 01 Jan 1970 00:03:00 +0000
128 From: quux
128 From: quux
129 To: foo
129 To: foo
130 Cc: bar
130 Cc: bar
131
131
132 --===
132 --===
133 Content-Type: text/plain; charset="us-ascii"
133 Content-Type: text/plain; charset="us-ascii"
134 MIME-Version: 1.0
134 MIME-Version: 1.0
135 Content-Transfer-Encoding: 7bit
135 Content-Transfer-Encoding: 7bit
136
136
137 a multiline
137 a multiline
138
138
139 description
139 description
140
140
141 --===
141 --===
142 Content-Type: application/x-mercurial-bundle
142 Content-Type: application/x-mercurial-bundle
143 MIME-Version: 1.0
143 MIME-Version: 1.0
144 Content-Disposition: attachment; filename="bundle.hg"
144 Content-Disposition: attachment; filename="bundle.hg"
145 Content-Transfer-Encoding: base64
145 Content-Transfer-Encoding: base64
146
146
147 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
147 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
148 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
148 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
149 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
149 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
150 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
150 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
151 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
151 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
152 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
152 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
153 Q70eyNw=
153 Q70eyNw=
154 --===
154 --===
155 % utf-8 patch
155 % utf-8 patch
156 adding description
156 adding description
157 adding utf
157 adding utf
158 % no mime encoding for email --test
158 % no mime encoding for email --test
159 % md5sum of 8-bit output
159 % md5sum of 8-bit output
160 e726c29b3008e77994c7572563e57c34 mailtest
160 e726c29b3008e77994c7572563e57c34 mailtest
161 % mime encoded mbox (base64)
161 % mime encoded mbox (base64)
162 This patch series consists of 1 patches.
162 This patch series consists of 1 patches.
163
163
164
164
165 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
165 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
166 From quux Thu Jan 01 00:04:01 1970
166 From quux Thu Jan 01 00:04:01 1970
167 Content-Type: text/plain; charset="utf-8"
167 Content-Type: text/plain; charset="utf-8"
168 MIME-Version: 1.0
168 MIME-Version: 1.0
169 Content-Transfer-Encoding: base64
169 Content-Transfer-Encoding: base64
170 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
170 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
171 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
171 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
172 Message-Id: <c3c9e37db9f4fe4882cd.240@
172 Message-Id: <c3c9e37db9f4fe4882cd.240@
173 User-Agent: Mercurial-patchbomb
173 User-Agent: Mercurial-patchbomb
174 Date: Thu, 01 Jan 1970 00:04:00 +0000
174 Date: Thu, 01 Jan 1970 00:04:00 +0000
175 From: quux
175 From: quux
176 To: foo
176 To: foo
177 Cc: bar
177 Cc: bar
178
178
179 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
179 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
180 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
180 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
181 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
181 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
182 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
182 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
183 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
183 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
184 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
184 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
185 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
185 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
186 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
186 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
187 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
187 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
188 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
188 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
189
189
190
190
191 % mime encoded mbox (quoted-printable)
191 % mime encoded mbox (quoted-printable)
192 adding qp
192 adding qp
193 % no mime encoding for email --test
193 % no mime encoding for email --test
194 % md5sum of qp output
194 % md5sum of qp output
195 0402c7d033e04044e423bb04816f9dae mailtest
195 0402c7d033e04044e423bb04816f9dae mailtest
196 % mime encoded mbox (quoted-printable)
196 % mime encoded mbox (quoted-printable)
197 This patch series consists of 1 patches.
197 This patch series consists of 1 patches.
198
198
199
199
200 Writing [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable ...
200 Writing [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable ...
201 From quux Thu Jan 01 00:04:01 1970
201 From quux Thu Jan 01 00:04:01 1970
202 Content-Type: text/plain; charset="us-ascii"
202 Content-Type: text/plain; charset="us-ascii"
203 MIME-Version: 1.0
203 MIME-Version: 1.0
204 Content-Transfer-Encoding: quoted-printable
204 Content-Transfer-Encoding: quoted-printable
205 Subject: [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable
205 Subject: [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable
206 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
206 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
207 Message-Id: <c655633f8c87700bb38c.240@
207 Message-Id: <c655633f8c87700bb38c.240@
208 User-Agent: Mercurial-patchbomb
208 User-Agent: Mercurial-patchbomb
209 Date: Thu, 01 Jan 1970 00:04:00 +0000
209 Date: Thu, 01 Jan 1970 00:04:00 +0000
210 From: quux
210 From: quux
211 To: foo
211 To: foo
212 Cc: bar
212 Cc: bar
213
213
214 # HG changeset patch
214 # HG changeset patch
215 # User test
215 # User test
216 # Date 4 0
216 # Date 4 0
217 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
217 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
218 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
218 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
219 charset=3Dutf-8; content-transfer-encoding: quoted-printable
219 charset=3Dutf-8; content-transfer-encoding: quoted-printable
220
220
221 diff -r c3c9e37db9f4 -r c655633f8c87 qp
221 diff -r c3c9e37db9f4 -r c655633f8c87 qp
222 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
222 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
223 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
223 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
224 @@ -0,0 +1,4 @@
224 @@ -0,0 +1,4 @@
225 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
225 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
226 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
226 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
227 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
227 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
228 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
228 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
229 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
229 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
230 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
230 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
231 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
231 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
232 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
232 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
233 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
233 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
234 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
234 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
235 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
235 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
236 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
236 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
237 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
237 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
238 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
238 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
239 +foo
239 +foo
240 +
240 +
241 +bar
241 +bar
242
242
243
243
244 % iso-8859-1 patch
244 % iso-8859-1 patch
245 adding isolatin
245 adding isolatin
246 % fake ascii mbox
246 % fake ascii mbox
247 This patch series consists of 1 patches.
247 This patch series consists of 1 patches.
248
248
249
249
250 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
250 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
251 % md5sum of 8-bit output
251 % md5sum of 8-bit output
252 9ea043d8fc43a71045114508baed144b mboxfix
252 9ea043d8fc43a71045114508baed144b mboxfix
253 % test diffstat for single patch
253 % test diffstat for single patch
254 This patch series consists of 1 patches.
254 This patch series consists of 1 patches.
255
255
256 c
256 c
257
257
258 c | 1 +
258 c | 1 +
259 1 files changed, 1 insertions(+), 0 deletions(-)
259 1 files changed, 1 insertions(+), 0 deletions(-)
260
260
261
261
262 Displaying [PATCH] test ...
262 Displaying [PATCH] test ...
263 Content-Type: text/plain; charset="us-ascii"
263 Content-Type: text/plain; charset="us-ascii"
264 MIME-Version: 1.0
264 MIME-Version: 1.0
265 Content-Transfer-Encoding: 7bit
265 Content-Transfer-Encoding: 7bit
266 Subject: [PATCH] test
266 Subject: [PATCH] test
267 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
267 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
268 Message-Id: <ff2c9fa2018b15fa74b3.60@
268 Message-Id: <ff2c9fa2018b15fa74b3.60@
269 User-Agent: Mercurial-patchbomb
269 User-Agent: Mercurial-patchbomb
270 Date: Thu, 01 Jan 1970 00:01:00 +0000
270 Date: Thu, 01 Jan 1970 00:01:00 +0000
271 From: quux
271 From: quux
272 To: foo
272 To: foo
273 Cc: bar
273 Cc: bar
274
274
275 c | 1 +
275 c | 1 +
276 1 files changed, 1 insertions(+), 0 deletions(-)
276 1 files changed, 1 insertions(+), 0 deletions(-)
277
277
278
278
279 # HG changeset patch
279 # HG changeset patch
280 # User test
280 # User test
281 # Date 3 0
281 # Date 3 0
282 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
282 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
283 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
283 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
284 c
284 c
285
285
286 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
286 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
287 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
287 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
288 +++ b/c Thu Jan 01 00:00:03 1970 +0000
288 +++ b/c Thu Jan 01 00:00:03 1970 +0000
289 @@ -0,0 +1,1 @@
289 @@ -0,0 +1,1 @@
290 +c
290 +c
291
291
292 % test diffstat for multiple patches
292 % test diffstat for multiple patches
293 This patch series consists of 2 patches.
293 This patch series consists of 2 patches.
294
294
295 a
295 a
296
296
297 a | 1 +
297 a | 1 +
298 1 files changed, 1 insertions(+), 0 deletions(-)
298 1 files changed, 1 insertions(+), 0 deletions(-)
299
299
300 b
300 b
301
301
302 b | 1 +
302 b | 1 +
303 1 files changed, 1 insertions(+), 0 deletions(-)
303 1 files changed, 1 insertions(+), 0 deletions(-)
304
304
305 Final summary:
305 Final summary:
306
306
307 a | 1 +
307 a | 1 +
308 b | 1 +
308 b | 1 +
309 2 files changed, 2 insertions(+), 0 deletions(-)
309 2 files changed, 2 insertions(+), 0 deletions(-)
310
310
311
311
312 Write the introductory message for the patch series.
312 Write the introductory message for the patch series.
313
313
314
314
315 Displaying [PATCH 0 of 2] test ...
315 Displaying [PATCH 0 of 2] test ...
316 Content-Type: text/plain; charset="us-ascii"
316 Content-Type: text/plain; charset="us-ascii"
317 MIME-Version: 1.0
317 MIME-Version: 1.0
318 Content-Transfer-Encoding: 7bit
318 Content-Transfer-Encoding: 7bit
319 Subject: [PATCH 0 of 2] test
319 Subject: [PATCH 0 of 2] test
320 Message-Id: <patchbomb.60@
320 Message-Id: <patchbomb.60@
321 User-Agent: Mercurial-patchbomb
321 User-Agent: Mercurial-patchbomb
322 Date: Thu, 01 Jan 1970 00:01:00 +0000
322 Date: Thu, 01 Jan 1970 00:01:00 +0000
323 From: quux
323 From: quux
324 To: foo
324 To: foo
325 Cc: bar
325 Cc: bar
326
326
327
327
328 a | 1 +
328 a | 1 +
329 b | 1 +
329 b | 1 +
330 2 files changed, 2 insertions(+), 0 deletions(-)
330 2 files changed, 2 insertions(+), 0 deletions(-)
331
331
332 Displaying [PATCH 1 of 2] a ...
332 Displaying [PATCH 1 of 2] a ...
333 Content-Type: text/plain; charset="us-ascii"
333 Content-Type: text/plain; charset="us-ascii"
334 MIME-Version: 1.0
334 MIME-Version: 1.0
335 Content-Transfer-Encoding: 7bit
335 Content-Transfer-Encoding: 7bit
336 Subject: [PATCH 1 of 2] a
336 Subject: [PATCH 1 of 2] a
337 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
337 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
338 Message-Id: <8580ff50825a50c8f716.61@
338 Message-Id: <8580ff50825a50c8f716.61@
339 In-Reply-To: <patchbomb.60@
339 In-Reply-To: <patchbomb.60@
340 References: <patchbomb.60@
340 References: <patchbomb.60@
341 User-Agent: Mercurial-patchbomb
341 User-Agent: Mercurial-patchbomb
342 Date: Thu, 01 Jan 1970 00:01:01 +0000
342 Date: Thu, 01 Jan 1970 00:01:01 +0000
343 From: quux
343 From: quux
344 To: foo
344 To: foo
345 Cc: bar
345 Cc: bar
346
346
347 a | 1 +
347 a | 1 +
348 1 files changed, 1 insertions(+), 0 deletions(-)
348 1 files changed, 1 insertions(+), 0 deletions(-)
349
349
350
350
351 # HG changeset patch
351 # HG changeset patch
352 # User test
352 # User test
353 # Date 1 0
353 # Date 1 0
354 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
354 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
355 # Parent 0000000000000000000000000000000000000000
355 # Parent 0000000000000000000000000000000000000000
356 a
356 a
357
357
358 diff -r 000000000000 -r 8580ff50825a a
358 diff -r 000000000000 -r 8580ff50825a a
359 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
359 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
360 +++ b/a Thu Jan 01 00:00:01 1970 +0000
360 +++ b/a Thu Jan 01 00:00:01 1970 +0000
361 @@ -0,0 +1,1 @@
361 @@ -0,0 +1,1 @@
362 +a
362 +a
363
363
364 Displaying [PATCH 2 of 2] b ...
364 Displaying [PATCH 2 of 2] b ...
365 Content-Type: text/plain; charset="us-ascii"
365 Content-Type: text/plain; charset="us-ascii"
366 MIME-Version: 1.0
366 MIME-Version: 1.0
367 Content-Transfer-Encoding: 7bit
367 Content-Transfer-Encoding: 7bit
368 Subject: [PATCH 2 of 2] b
368 Subject: [PATCH 2 of 2] b
369 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
369 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
370 Message-Id: <97d72e5f12c7e84f8506.62@
370 Message-Id: <97d72e5f12c7e84f8506.62@
371 In-Reply-To: <patchbomb.60@
371 In-Reply-To: <patchbomb.60@
372 References: <patchbomb.60@
372 References: <patchbomb.60@
373 User-Agent: Mercurial-patchbomb
373 User-Agent: Mercurial-patchbomb
374 Date: Thu, 01 Jan 1970 00:01:02 +0000
374 Date: Thu, 01 Jan 1970 00:01:02 +0000
375 From: quux
375 From: quux
376 To: foo
376 To: foo
377 Cc: bar
377 Cc: bar
378
378
379 b | 1 +
379 b | 1 +
380 1 files changed, 1 insertions(+), 0 deletions(-)
380 1 files changed, 1 insertions(+), 0 deletions(-)
381
381
382
382
383 # HG changeset patch
383 # HG changeset patch
384 # User test
384 # User test
385 # Date 2 0
385 # Date 2 0
386 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
386 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
387 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
387 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
388 b
388 b
389
389
390 diff -r 8580ff50825a -r 97d72e5f12c7 b
390 diff -r 8580ff50825a -r 97d72e5f12c7 b
391 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
391 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
392 +++ b/b Thu Jan 01 00:00:02 1970 +0000
392 +++ b/b Thu Jan 01 00:00:02 1970 +0000
393 @@ -0,0 +1,1 @@
393 @@ -0,0 +1,1 @@
394 +b
394 +b
395
395
396 % test inline for single patch
396 % test inline for single patch
397 This patch series consists of 1 patches.
397 This patch series consists of 1 patches.
398
398
399
399
400 Displaying [PATCH] test ...
400 Displaying [PATCH] test ...
401 Content-Type: multipart/mixed; boundary="===
401 Content-Type: multipart/mixed; boundary="===
402 MIME-Version: 1.0
402 MIME-Version: 1.0
403 Subject: [PATCH] test
403 Subject: [PATCH] test
404 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
404 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
405 Message-Id: <ff2c9fa2018b15fa74b3.60@
405 Message-Id: <ff2c9fa2018b15fa74b3.60@
406 User-Agent: Mercurial-patchbomb
406 User-Agent: Mercurial-patchbomb
407 Date: Thu, 01 Jan 1970 00:01:00 +0000
407 Date: Thu, 01 Jan 1970 00:01:00 +0000
408 From: quux
408 From: quux
409 To: foo
409 To: foo
410 Cc: bar
410 Cc: bar
411
411
412 --===
412 --===
413 Content-Type: text/x-patch; charset="us-ascii"
413 Content-Type: text/x-patch; charset="us-ascii"
414 MIME-Version: 1.0
414 MIME-Version: 1.0
415 Content-Transfer-Encoding: 7bit
415 Content-Transfer-Encoding: 7bit
416 Content-Disposition: inline; filename=t2.patch
416 Content-Disposition: inline; filename=t2.patch
417
417
418 # HG changeset patch
418 # HG changeset patch
419 # User test
419 # User test
420 # Date 3 0
420 # Date 3 0
421 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
421 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
422 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
422 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
423 c
423 c
424
424
425 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
425 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
426 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
426 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
427 +++ b/c Thu Jan 01 00:00:03 1970 +0000
427 +++ b/c Thu Jan 01 00:00:03 1970 +0000
428 @@ -0,0 +1,1 @@
428 @@ -0,0 +1,1 @@
429 +c
429 +c
430
430
431 --===
431 --===
432 % test inline for single patch (quoted-printable)
432 % test inline for single patch (quoted-printable)
433 This patch series consists of 1 patches.
433 This patch series consists of 1 patches.
434
434
435
435
436 Displaying [PATCH] test ...
436 Displaying [PATCH] test ...
437 Content-Type: multipart/mixed; boundary="===
437 Content-Type: multipart/mixed; boundary="===
438 MIME-Version: 1.0
438 MIME-Version: 1.0
439 Subject: [PATCH] test
439 Subject: [PATCH] test
440 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
440 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
441 Message-Id: <c655633f8c87700bb38c.60@
441 Message-Id: <c655633f8c87700bb38c.60@
442 User-Agent: Mercurial-patchbomb
442 User-Agent: Mercurial-patchbomb
443 Date: Thu, 01 Jan 1970 00:01:00 +0000
443 Date: Thu, 01 Jan 1970 00:01:00 +0000
444 From: quux
444 From: quux
445 To: foo
445 To: foo
446 Cc: bar
446 Cc: bar
447
447
448 --===
448 --===
449 Content-Type: text/x-patch; charset="us-ascii"
449 Content-Type: text/x-patch; charset="us-ascii"
450 MIME-Version: 1.0
450 MIME-Version: 1.0
451 Content-Transfer-Encoding: quoted-printable
451 Content-Transfer-Encoding: quoted-printable
452 Content-Disposition: inline; filename=t2.patch
452 Content-Disposition: inline; filename=t2.patch
453
453
454 # HG changeset patch
454 # HG changeset patch
455 # User test
455 # User test
456 # Date 4 0
456 # Date 4 0
457 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
457 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
458 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
458 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
459 charset=3Dutf-8; content-transfer-encoding: quoted-printable
459 charset=3Dutf-8; content-transfer-encoding: quoted-printable
460
460
461 diff -r c3c9e37db9f4 -r c655633f8c87 qp
461 diff -r c3c9e37db9f4 -r c655633f8c87 qp
462 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
462 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
463 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
463 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
464 @@ -0,0 +1,4 @@
464 @@ -0,0 +1,4 @@
465 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
465 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
466 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
466 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
467 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
467 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
468 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
468 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
469 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
469 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
470 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
470 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
471 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
471 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
472 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
472 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
473 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
473 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
474 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
474 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
475 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
475 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
476 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
476 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
477 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
477 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
478 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
478 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
479 +foo
479 +foo
480 +
480 +
481 +bar
481 +bar
482
482
483 --===
483 --===
484 % test inline for multiple patches
484 % test inline for multiple patches
485 This patch series consists of 3 patches.
485 This patch series consists of 3 patches.
486
486
487
487
488 Write the introductory message for the patch series.
488 Write the introductory message for the patch series.
489
489
490
490
491 Displaying [PATCH 0 of 3] test ...
491 Displaying [PATCH 0 of 3] test ...
492 Content-Type: text/plain; charset="us-ascii"
492 Content-Type: text/plain; charset="us-ascii"
493 MIME-Version: 1.0
493 MIME-Version: 1.0
494 Content-Transfer-Encoding: 7bit
494 Content-Transfer-Encoding: 7bit
495 Subject: [PATCH 0 of 3] test
495 Subject: [PATCH 0 of 3] test
496 Message-Id: <patchbomb.60@
496 Message-Id: <patchbomb.60@
497 User-Agent: Mercurial-patchbomb
497 User-Agent: Mercurial-patchbomb
498 Date: Thu, 01 Jan 1970 00:01:00 +0000
498 Date: Thu, 01 Jan 1970 00:01:00 +0000
499 From: quux
499 From: quux
500 To: foo
500 To: foo
501 Cc: bar
501 Cc: bar
502
502
503
503
504 Displaying [PATCH 1 of 3] a ...
504 Displaying [PATCH 1 of 3] a ...
505 Content-Type: multipart/mixed; boundary="===
505 Content-Type: multipart/mixed; boundary="===
506 MIME-Version: 1.0
506 MIME-Version: 1.0
507 Subject: [PATCH 1 of 3] a
507 Subject: [PATCH 1 of 3] a
508 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
508 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
509 Message-Id: <8580ff50825a50c8f716.61@
509 Message-Id: <8580ff50825a50c8f716.61@
510 In-Reply-To: <patchbomb.60@
510 In-Reply-To: <patchbomb.60@
511 References: <patchbomb.60@
511 References: <patchbomb.60@
512 User-Agent: Mercurial-patchbomb
512 User-Agent: Mercurial-patchbomb
513 Date: Thu, 01 Jan 1970 00:01:01 +0000
513 Date: Thu, 01 Jan 1970 00:01:01 +0000
514 From: quux
514 From: quux
515 To: foo
515 To: foo
516 Cc: bar
516 Cc: bar
517
517
518 --===
518 --===
519 Content-Type: text/x-patch; charset="us-ascii"
519 Content-Type: text/x-patch; charset="us-ascii"
520 MIME-Version: 1.0
520 MIME-Version: 1.0
521 Content-Transfer-Encoding: 7bit
521 Content-Transfer-Encoding: 7bit
522 Content-Disposition: inline; filename=t2-1.patch
522 Content-Disposition: inline; filename=t2-1.patch
523
523
524 # HG changeset patch
524 # HG changeset patch
525 # User test
525 # User test
526 # Date 1 0
526 # Date 1 0
527 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
527 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
528 # Parent 0000000000000000000000000000000000000000
528 # Parent 0000000000000000000000000000000000000000
529 a
529 a
530
530
531 diff -r 000000000000 -r 8580ff50825a a
531 diff -r 000000000000 -r 8580ff50825a a
532 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
532 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
533 +++ b/a Thu Jan 01 00:00:01 1970 +0000
533 +++ b/a Thu Jan 01 00:00:01 1970 +0000
534 @@ -0,0 +1,1 @@
534 @@ -0,0 +1,1 @@
535 +a
535 +a
536
536
537 --===
537 --===
538 Displaying [PATCH 2 of 3] b ...
538 Displaying [PATCH 2 of 3] b ...
539 Content-Type: multipart/mixed; boundary="===
539 Content-Type: multipart/mixed; boundary="===
540 MIME-Version: 1.0
540 MIME-Version: 1.0
541 Subject: [PATCH 2 of 3] b
541 Subject: [PATCH 2 of 3] b
542 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
542 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
543 Message-Id: <97d72e5f12c7e84f8506.62@
543 Message-Id: <97d72e5f12c7e84f8506.62@
544 In-Reply-To: <patchbomb.60@
544 In-Reply-To: <patchbomb.60@
545 References: <patchbomb.60@
545 References: <patchbomb.60@
546 User-Agent: Mercurial-patchbomb
546 User-Agent: Mercurial-patchbomb
547 Date: Thu, 01 Jan 1970 00:01:02 +0000
547 Date: Thu, 01 Jan 1970 00:01:02 +0000
548 From: quux
548 From: quux
549 To: foo
549 To: foo
550 Cc: bar
550 Cc: bar
551
551
552 --===
552 --===
553 Content-Type: text/x-patch; charset="us-ascii"
553 Content-Type: text/x-patch; charset="us-ascii"
554 MIME-Version: 1.0
554 MIME-Version: 1.0
555 Content-Transfer-Encoding: 7bit
555 Content-Transfer-Encoding: 7bit
556 Content-Disposition: inline; filename=t2-2.patch
556 Content-Disposition: inline; filename=t2-2.patch
557
557
558 # HG changeset patch
558 # HG changeset patch
559 # User test
559 # User test
560 # Date 2 0
560 # Date 2 0
561 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
561 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
562 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
562 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
563 b
563 b
564
564
565 diff -r 8580ff50825a -r 97d72e5f12c7 b
565 diff -r 8580ff50825a -r 97d72e5f12c7 b
566 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
566 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
567 +++ b/b Thu Jan 01 00:00:02 1970 +0000
567 +++ b/b Thu Jan 01 00:00:02 1970 +0000
568 @@ -0,0 +1,1 @@
568 @@ -0,0 +1,1 @@
569 +b
569 +b
570
570
571 --===
571 --===
572 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
572 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
573 Content-Type: multipart/mixed; boundary="===
573 Content-Type: multipart/mixed; boundary="===
574 MIME-Version: 1.0
574 MIME-Version: 1.0
575 Subject: [PATCH 3 of 3] charset=utf-8;
575 Subject: [PATCH 3 of 3] charset=utf-8;
576 content-transfer-encoding: quoted-printable
576 content-transfer-encoding: quoted-printable
577 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
577 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
578 Message-Id: <c655633f8c87700bb38c.63@
578 Message-Id: <c655633f8c87700bb38c.63@
579 In-Reply-To: <patchbomb.60@
579 In-Reply-To: <patchbomb.60@
580 References: <patchbomb.60@
580 References: <patchbomb.60@
581 User-Agent: Mercurial-patchbomb
581 User-Agent: Mercurial-patchbomb
582 Date: Thu, 01 Jan 1970 00:01:03 +0000
582 Date: Thu, 01 Jan 1970 00:01:03 +0000
583 From: quux
583 From: quux
584 To: foo
584 To: foo
585 Cc: bar
585 Cc: bar
586
586
587 --===
587 --===
588 Content-Type: text/x-patch; charset="us-ascii"
588 Content-Type: text/x-patch; charset="us-ascii"
589 MIME-Version: 1.0
589 MIME-Version: 1.0
590 Content-Transfer-Encoding: quoted-printable
590 Content-Transfer-Encoding: quoted-printable
591 Content-Disposition: inline; filename=t2-3.patch
591 Content-Disposition: inline; filename=t2-3.patch
592
592
593 # HG changeset patch
593 # HG changeset patch
594 # User test
594 # User test
595 # Date 4 0
595 # Date 4 0
596 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
596 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
597 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
597 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
598 charset=3Dutf-8; content-transfer-encoding: quoted-printable
598 charset=3Dutf-8; content-transfer-encoding: quoted-printable
599
599
600 diff -r c3c9e37db9f4 -r c655633f8c87 qp
600 diff -r c3c9e37db9f4 -r c655633f8c87 qp
601 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
601 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
602 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
602 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
603 @@ -0,0 +1,4 @@
603 @@ -0,0 +1,4 @@
604 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
604 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
605 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
605 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
606 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
606 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
607 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
607 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
608 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
608 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
609 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
609 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
610 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
610 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
611 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
611 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
612 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
612 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
613 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
613 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
614 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
614 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
615 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
615 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
616 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
616 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
617 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
617 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
618 +foo
618 +foo
619 +
619 +
620 +bar
620 +bar
621
621
622 --===
622 --===
623 % test attach for single patch
623 % test attach for single patch
624 This patch series consists of 1 patches.
624 This patch series consists of 1 patches.
625
625
626
626
627 Displaying [PATCH] test ...
627 Displaying [PATCH] test ...
628 Content-Type: multipart/mixed; boundary="===
628 Content-Type: multipart/mixed; boundary="===
629 MIME-Version: 1.0
629 MIME-Version: 1.0
630 Subject: [PATCH] test
630 Subject: [PATCH] test
631 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
631 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
632 Message-Id: <ff2c9fa2018b15fa74b3.60@
632 Message-Id: <ff2c9fa2018b15fa74b3.60@
633 User-Agent: Mercurial-patchbomb
633 User-Agent: Mercurial-patchbomb
634 Date: Thu, 01 Jan 1970 00:01:00 +0000
634 Date: Thu, 01 Jan 1970 00:01:00 +0000
635 From: quux
635 From: quux
636 To: foo
636 To: foo
637 Cc: bar
637 Cc: bar
638
638
639 --===
639 --===
640 Content-Type: text/plain; charset="us-ascii"
640 Content-Type: text/plain; charset="us-ascii"
641 MIME-Version: 1.0
641 MIME-Version: 1.0
642 Content-Transfer-Encoding: 7bit
642 Content-Transfer-Encoding: 7bit
643
643
644 Patch subject is complete summary.
644 Patch subject is complete summary.
645
645
646
646
647
647
648 --===
648 --===
649 Content-Type: text/x-patch; charset="us-ascii"
649 Content-Type: text/x-patch; charset="us-ascii"
650 MIME-Version: 1.0
650 MIME-Version: 1.0
651 Content-Transfer-Encoding: 7bit
651 Content-Transfer-Encoding: 7bit
652 Content-Disposition: attachment; filename=t2.patch
652 Content-Disposition: attachment; filename=t2.patch
653
653
654 # HG changeset patch
654 # HG changeset patch
655 # User test
655 # User test
656 # Date 3 0
656 # Date 3 0
657 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
657 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
658 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
658 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
659 c
659 c
660
660
661 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
661 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
662 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
662 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
663 +++ b/c Thu Jan 01 00:00:03 1970 +0000
663 +++ b/c Thu Jan 01 00:00:03 1970 +0000
664 @@ -0,0 +1,1 @@
664 @@ -0,0 +1,1 @@
665 +c
665 +c
666
666
667 --===
667 --===
668 % test attach for single patch (quoted-printable)
668 % test attach for single patch (quoted-printable)
669 This patch series consists of 1 patches.
669 This patch series consists of 1 patches.
670
670
671
671
672 Displaying [PATCH] test ...
672 Displaying [PATCH] test ...
673 Content-Type: multipart/mixed; boundary="===
673 Content-Type: multipart/mixed; boundary="===
674 MIME-Version: 1.0
674 MIME-Version: 1.0
675 Subject: [PATCH] test
675 Subject: [PATCH] test
676 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
676 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
677 Message-Id: <c655633f8c87700bb38c.60@
677 Message-Id: <c655633f8c87700bb38c.60@
678 User-Agent: Mercurial-patchbomb
678 User-Agent: Mercurial-patchbomb
679 Date: Thu, 01 Jan 1970 00:01:00 +0000
679 Date: Thu, 01 Jan 1970 00:01:00 +0000
680 From: quux
680 From: quux
681 To: foo
681 To: foo
682 Cc: bar
682 Cc: bar
683
683
684 --===
684 --===
685 Content-Type: text/plain; charset="us-ascii"
685 Content-Type: text/plain; charset="us-ascii"
686 MIME-Version: 1.0
686 MIME-Version: 1.0
687 Content-Transfer-Encoding: 7bit
687 Content-Transfer-Encoding: 7bit
688
688
689 Patch subject is complete summary.
689 Patch subject is complete summary.
690
690
691
691
692
692
693 --===
693 --===
694 Content-Type: text/x-patch; charset="us-ascii"
694 Content-Type: text/x-patch; charset="us-ascii"
695 MIME-Version: 1.0
695 MIME-Version: 1.0
696 Content-Transfer-Encoding: quoted-printable
696 Content-Transfer-Encoding: quoted-printable
697 Content-Disposition: attachment; filename=t2.patch
697 Content-Disposition: attachment; filename=t2.patch
698
698
699 # HG changeset patch
699 # HG changeset patch
700 # User test
700 # User test
701 # Date 4 0
701 # Date 4 0
702 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
702 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
703 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
703 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
704 charset=3Dutf-8; content-transfer-encoding: quoted-printable
704 charset=3Dutf-8; content-transfer-encoding: quoted-printable
705
705
706 diff -r c3c9e37db9f4 -r c655633f8c87 qp
706 diff -r c3c9e37db9f4 -r c655633f8c87 qp
707 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
707 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
708 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
708 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
709 @@ -0,0 +1,4 @@
709 @@ -0,0 +1,4 @@
710 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
710 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
711 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
711 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
712 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
712 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
713 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
713 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
714 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
714 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
715 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
715 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
716 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
716 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
717 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
717 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
718 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
718 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
719 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
719 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
720 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
720 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
721 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
721 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
722 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
722 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
723 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
723 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
724 +foo
724 +foo
725 +
725 +
726 +bar
726 +bar
727
727
728 --===
728 --===
729 % test attach for multiple patches
729 % test attach for multiple patches
730 This patch series consists of 3 patches.
730 This patch series consists of 3 patches.
731
731
732
732
733 Write the introductory message for the patch series.
733 Write the introductory message for the patch series.
734
734
735
735
736 Displaying [PATCH 0 of 3] test ...
736 Displaying [PATCH 0 of 3] test ...
737 Content-Type: text/plain; charset="us-ascii"
737 Content-Type: text/plain; charset="us-ascii"
738 MIME-Version: 1.0
738 MIME-Version: 1.0
739 Content-Transfer-Encoding: 7bit
739 Content-Transfer-Encoding: 7bit
740 Subject: [PATCH 0 of 3] test
740 Subject: [PATCH 0 of 3] test
741 Message-Id: <patchbomb.60@
741 Message-Id: <patchbomb.60@
742 User-Agent: Mercurial-patchbomb
742 User-Agent: Mercurial-patchbomb
743 Date: Thu, 01 Jan 1970 00:01:00 +0000
743 Date: Thu, 01 Jan 1970 00:01:00 +0000
744 From: quux
744 From: quux
745 To: foo
745 To: foo
746 Cc: bar
746 Cc: bar
747
747
748
748
749 Displaying [PATCH 1 of 3] a ...
749 Displaying [PATCH 1 of 3] a ...
750 Content-Type: multipart/mixed; boundary="===
750 Content-Type: multipart/mixed; boundary="===
751 MIME-Version: 1.0
751 MIME-Version: 1.0
752 Subject: [PATCH 1 of 3] a
752 Subject: [PATCH 1 of 3] a
753 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
753 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
754 Message-Id: <8580ff50825a50c8f716.61@
754 Message-Id: <8580ff50825a50c8f716.61@
755 In-Reply-To: <patchbomb.60@
755 In-Reply-To: <patchbomb.60@
756 References: <patchbomb.60@
756 References: <patchbomb.60@
757 User-Agent: Mercurial-patchbomb
757 User-Agent: Mercurial-patchbomb
758 Date: Thu, 01 Jan 1970 00:01:01 +0000
758 Date: Thu, 01 Jan 1970 00:01:01 +0000
759 From: quux
759 From: quux
760 To: foo
760 To: foo
761 Cc: bar
761 Cc: bar
762
762
763 --===
763 --===
764 Content-Type: text/plain; charset="us-ascii"
764 Content-Type: text/plain; charset="us-ascii"
765 MIME-Version: 1.0
765 MIME-Version: 1.0
766 Content-Transfer-Encoding: 7bit
766 Content-Transfer-Encoding: 7bit
767
767
768 Patch subject is complete summary.
768 Patch subject is complete summary.
769
769
770
770
771
771
772 --===
772 --===
773 Content-Type: text/x-patch; charset="us-ascii"
773 Content-Type: text/x-patch; charset="us-ascii"
774 MIME-Version: 1.0
774 MIME-Version: 1.0
775 Content-Transfer-Encoding: 7bit
775 Content-Transfer-Encoding: 7bit
776 Content-Disposition: attachment; filename=t2-1.patch
776 Content-Disposition: attachment; filename=t2-1.patch
777
777
778 # HG changeset patch
778 # HG changeset patch
779 # User test
779 # User test
780 # Date 1 0
780 # Date 1 0
781 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
781 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
782 # Parent 0000000000000000000000000000000000000000
782 # Parent 0000000000000000000000000000000000000000
783 a
783 a
784
784
785 diff -r 000000000000 -r 8580ff50825a a
785 diff -r 000000000000 -r 8580ff50825a a
786 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
786 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
787 +++ b/a Thu Jan 01 00:00:01 1970 +0000
787 +++ b/a Thu Jan 01 00:00:01 1970 +0000
788 @@ -0,0 +1,1 @@
788 @@ -0,0 +1,1 @@
789 +a
789 +a
790
790
791 --===
791 --===
792 Displaying [PATCH 2 of 3] b ...
792 Displaying [PATCH 2 of 3] b ...
793 Content-Type: multipart/mixed; boundary="===
793 Content-Type: multipart/mixed; boundary="===
794 MIME-Version: 1.0
794 MIME-Version: 1.0
795 Subject: [PATCH 2 of 3] b
795 Subject: [PATCH 2 of 3] b
796 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
796 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
797 Message-Id: <97d72e5f12c7e84f8506.62@
797 Message-Id: <97d72e5f12c7e84f8506.62@
798 In-Reply-To: <patchbomb.60@
798 In-Reply-To: <patchbomb.60@
799 References: <patchbomb.60@
799 References: <patchbomb.60@
800 User-Agent: Mercurial-patchbomb
800 User-Agent: Mercurial-patchbomb
801 Date: Thu, 01 Jan 1970 00:01:02 +0000
801 Date: Thu, 01 Jan 1970 00:01:02 +0000
802 From: quux
802 From: quux
803 To: foo
803 To: foo
804 Cc: bar
804 Cc: bar
805
805
806 --===
806 --===
807 Content-Type: text/plain; charset="us-ascii"
807 Content-Type: text/plain; charset="us-ascii"
808 MIME-Version: 1.0
808 MIME-Version: 1.0
809 Content-Transfer-Encoding: 7bit
809 Content-Transfer-Encoding: 7bit
810
810
811 Patch subject is complete summary.
811 Patch subject is complete summary.
812
812
813
813
814
814
815 --===
815 --===
816 Content-Type: text/x-patch; charset="us-ascii"
816 Content-Type: text/x-patch; charset="us-ascii"
817 MIME-Version: 1.0
817 MIME-Version: 1.0
818 Content-Transfer-Encoding: 7bit
818 Content-Transfer-Encoding: 7bit
819 Content-Disposition: attachment; filename=t2-2.patch
819 Content-Disposition: attachment; filename=t2-2.patch
820
820
821 # HG changeset patch
821 # HG changeset patch
822 # User test
822 # User test
823 # Date 2 0
823 # Date 2 0
824 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
824 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
825 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
825 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
826 b
826 b
827
827
828 diff -r 8580ff50825a -r 97d72e5f12c7 b
828 diff -r 8580ff50825a -r 97d72e5f12c7 b
829 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
829 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
830 +++ b/b Thu Jan 01 00:00:02 1970 +0000
830 +++ b/b Thu Jan 01 00:00:02 1970 +0000
831 @@ -0,0 +1,1 @@
831 @@ -0,0 +1,1 @@
832 +b
832 +b
833
833
834 --===
834 --===
835 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
835 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
836 Content-Type: multipart/mixed; boundary="===
836 Content-Type: multipart/mixed; boundary="===
837 MIME-Version: 1.0
837 MIME-Version: 1.0
838 Subject: [PATCH 3 of 3] charset=utf-8;
838 Subject: [PATCH 3 of 3] charset=utf-8;
839 content-transfer-encoding: quoted-printable
839 content-transfer-encoding: quoted-printable
840 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
840 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
841 Message-Id: <c655633f8c87700bb38c.63@
841 Message-Id: <c655633f8c87700bb38c.63@
842 In-Reply-To: <patchbomb.60@
842 In-Reply-To: <patchbomb.60@
843 References: <patchbomb.60@
843 References: <patchbomb.60@
844 User-Agent: Mercurial-patchbomb
844 User-Agent: Mercurial-patchbomb
845 Date: Thu, 01 Jan 1970 00:01:03 +0000
845 Date: Thu, 01 Jan 1970 00:01:03 +0000
846 From: quux
846 From: quux
847 To: foo
847 To: foo
848 Cc: bar
848 Cc: bar
849
849
850 --===
850 --===
851 Content-Type: text/plain; charset="us-ascii"
851 Content-Type: text/plain; charset="us-ascii"
852 MIME-Version: 1.0
852 MIME-Version: 1.0
853 Content-Transfer-Encoding: 7bit
853 Content-Transfer-Encoding: 7bit
854
854
855 Patch subject is complete summary.
855 Patch subject is complete summary.
856
856
857
857
858
858
859 --===
859 --===
860 Content-Type: text/x-patch; charset="us-ascii"
860 Content-Type: text/x-patch; charset="us-ascii"
861 MIME-Version: 1.0
861 MIME-Version: 1.0
862 Content-Transfer-Encoding: quoted-printable
862 Content-Transfer-Encoding: quoted-printable
863 Content-Disposition: attachment; filename=t2-3.patch
863 Content-Disposition: attachment; filename=t2-3.patch
864
864
865 # HG changeset patch
865 # HG changeset patch
866 # User test
866 # User test
867 # Date 4 0
867 # Date 4 0
868 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
868 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
869 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
869 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
870 charset=3Dutf-8; content-transfer-encoding: quoted-printable
870 charset=3Dutf-8; content-transfer-encoding: quoted-printable
871
871
872 diff -r c3c9e37db9f4 -r c655633f8c87 qp
872 diff -r c3c9e37db9f4 -r c655633f8c87 qp
873 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
873 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
874 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
874 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
875 @@ -0,0 +1,4 @@
875 @@ -0,0 +1,4 @@
876 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
876 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
877 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
877 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
878 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
878 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
879 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
879 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
880 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
880 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
881 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
881 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
882 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
882 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
883 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
883 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
884 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
884 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
885 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
885 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
886 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
886 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
887 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
887 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
888 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
888 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
889 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
889 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
890 +foo
890 +foo
891 +
891 +
892 +bar
892 +bar
893
893
894 --===
894 --===
895 % test intro for single patch
895 % test intro for single patch
896 This patch series consists of 1 patches.
896 This patch series consists of 1 patches.
897
897
898
898
899 Write the introductory message for the patch series.
899 Write the introductory message for the patch series.
900
900
901
901
902 Displaying [PATCH 0 of 1] test ...
902 Displaying [PATCH 0 of 1] test ...
903 Content-Type: text/plain; charset="us-ascii"
903 Content-Type: text/plain; charset="us-ascii"
904 MIME-Version: 1.0
904 MIME-Version: 1.0
905 Content-Transfer-Encoding: 7bit
905 Content-Transfer-Encoding: 7bit
906 Subject: [PATCH 0 of 1] test
906 Subject: [PATCH 0 of 1] test
907 Message-Id: <patchbomb.60@
907 Message-Id: <patchbomb.60@
908 User-Agent: Mercurial-patchbomb
908 User-Agent: Mercurial-patchbomb
909 Date: Thu, 01 Jan 1970 00:01:00 +0000
909 Date: Thu, 01 Jan 1970 00:01:00 +0000
910 From: quux
910 From: quux
911 To: foo
911 To: foo
912 Cc: bar
912 Cc: bar
913
913
914
914
915 Displaying [PATCH 1 of 1] c ...
915 Displaying [PATCH 1 of 1] c ...
916 Content-Type: text/plain; charset="us-ascii"
916 Content-Type: text/plain; charset="us-ascii"
917 MIME-Version: 1.0
917 MIME-Version: 1.0
918 Content-Transfer-Encoding: 7bit
918 Content-Transfer-Encoding: 7bit
919 Subject: [PATCH 1 of 1] c
919 Subject: [PATCH 1 of 1] c
920 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
920 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
921 Message-Id: <ff2c9fa2018b15fa74b3.61@
921 Message-Id: <ff2c9fa2018b15fa74b3.61@
922 In-Reply-To: <patchbomb.60@
922 In-Reply-To: <patchbomb.60@
923 References: <patchbomb.60@
923 References: <patchbomb.60@
924 User-Agent: Mercurial-patchbomb
924 User-Agent: Mercurial-patchbomb
925 Date: Thu, 01 Jan 1970 00:01:01 +0000
925 Date: Thu, 01 Jan 1970 00:01:01 +0000
926 From: quux
926 From: quux
927 To: foo
927 To: foo
928 Cc: bar
928 Cc: bar
929
929
930 # HG changeset patch
930 # HG changeset patch
931 # User test
931 # User test
932 # Date 3 0
932 # Date 3 0
933 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
933 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
934 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
934 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
935 c
935 c
936
936
937 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
937 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
938 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
938 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
939 +++ b/c Thu Jan 01 00:00:03 1970 +0000
939 +++ b/c Thu Jan 01 00:00:03 1970 +0000
940 @@ -0,0 +1,1 @@
940 @@ -0,0 +1,1 @@
941 +c
941 +c
942
942
943 % test --desc without --intro for a single patch
943 % test --desc without --intro for a single patch
944 This patch series consists of 1 patches.
944 This patch series consists of 1 patches.
945
945
946
946
947 Displaying [PATCH 0 of 1] test ...
947 Displaying [PATCH 0 of 1] test ...
948 Content-Type: text/plain; charset="us-ascii"
948 Content-Type: text/plain; charset="us-ascii"
949 MIME-Version: 1.0
949 MIME-Version: 1.0
950 Content-Transfer-Encoding: 7bit
950 Content-Transfer-Encoding: 7bit
951 Subject: [PATCH 0 of 1] test
951 Subject: [PATCH 0 of 1] test
952 Message-Id: <patchbomb.60@
952 Message-Id: <patchbomb.60@
953 User-Agent: Mercurial-patchbomb
953 User-Agent: Mercurial-patchbomb
954 Date: Thu, 01 Jan 1970 00:01:00 +0000
954 Date: Thu, 01 Jan 1970 00:01:00 +0000
955 From: quux
955 From: quux
956 To: foo
956 To: foo
957 Cc: bar
957 Cc: bar
958
958
959 foo
959 foo
960
960
961 Displaying [PATCH 1 of 1] c ...
961 Displaying [PATCH 1 of 1] c ...
962 Content-Type: text/plain; charset="us-ascii"
962 Content-Type: text/plain; charset="us-ascii"
963 MIME-Version: 1.0
963 MIME-Version: 1.0
964 Content-Transfer-Encoding: 7bit
964 Content-Transfer-Encoding: 7bit
965 Subject: [PATCH 1 of 1] c
965 Subject: [PATCH 1 of 1] c
966 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
966 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
967 Message-Id: <ff2c9fa2018b15fa74b3.61@
967 Message-Id: <ff2c9fa2018b15fa74b3.61@
968 In-Reply-To: <patchbomb.60@
968 In-Reply-To: <patchbomb.60@
969 References: <patchbomb.60@
969 References: <patchbomb.60@
970 User-Agent: Mercurial-patchbomb
970 User-Agent: Mercurial-patchbomb
971 Date: Thu, 01 Jan 1970 00:01:01 +0000
971 Date: Thu, 01 Jan 1970 00:01:01 +0000
972 From: quux
972 From: quux
973 To: foo
973 To: foo
974 Cc: bar
974 Cc: bar
975
975
976 # HG changeset patch
976 # HG changeset patch
977 # User test
977 # User test
978 # Date 3 0
978 # Date 3 0
979 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
979 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
980 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
980 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
981 c
981 c
982
982
983 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
983 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
984 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
984 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
985 +++ b/c Thu Jan 01 00:00:03 1970 +0000
985 +++ b/c Thu Jan 01 00:00:03 1970 +0000
986 @@ -0,0 +1,1 @@
986 @@ -0,0 +1,1 @@
987 +c
987 +c
988
988
989 % test intro for multiple patches
989 % test intro for multiple patches
990 This patch series consists of 2 patches.
990 This patch series consists of 2 patches.
991
991
992
992
993 Write the introductory message for the patch series.
993 Write the introductory message for the patch series.
994
994
995
995
996 Displaying [PATCH 0 of 2] test ...
996 Displaying [PATCH 0 of 2] test ...
997 Content-Type: text/plain; charset="us-ascii"
997 Content-Type: text/plain; charset="us-ascii"
998 MIME-Version: 1.0
998 MIME-Version: 1.0
999 Content-Transfer-Encoding: 7bit
999 Content-Transfer-Encoding: 7bit
1000 Subject: [PATCH 0 of 2] test
1000 Subject: [PATCH 0 of 2] test
1001 Message-Id: <patchbomb.60@
1001 Message-Id: <patchbomb.60@
1002 User-Agent: Mercurial-patchbomb
1002 User-Agent: Mercurial-patchbomb
1003 Date: Thu, 01 Jan 1970 00:01:00 +0000
1003 Date: Thu, 01 Jan 1970 00:01:00 +0000
1004 From: quux
1004 From: quux
1005 To: foo
1005 To: foo
1006 Cc: bar
1006 Cc: bar
1007
1007
1008
1008
1009 Displaying [PATCH 1 of 2] a ...
1009 Displaying [PATCH 1 of 2] a ...
1010 Content-Type: text/plain; charset="us-ascii"
1010 Content-Type: text/plain; charset="us-ascii"
1011 MIME-Version: 1.0
1011 MIME-Version: 1.0
1012 Content-Transfer-Encoding: 7bit
1012 Content-Transfer-Encoding: 7bit
1013 Subject: [PATCH 1 of 2] a
1013 Subject: [PATCH 1 of 2] a
1014 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1014 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1015 Message-Id: <8580ff50825a50c8f716.61@
1015 Message-Id: <8580ff50825a50c8f716.61@
1016 In-Reply-To: <patchbomb.60@
1016 In-Reply-To: <patchbomb.60@
1017 References: <patchbomb.60@
1017 References: <patchbomb.60@
1018 User-Agent: Mercurial-patchbomb
1018 User-Agent: Mercurial-patchbomb
1019 Date: Thu, 01 Jan 1970 00:01:01 +0000
1019 Date: Thu, 01 Jan 1970 00:01:01 +0000
1020 From: quux
1020 From: quux
1021 To: foo
1021 To: foo
1022 Cc: bar
1022 Cc: bar
1023
1023
1024 # HG changeset patch
1024 # HG changeset patch
1025 # User test
1025 # User test
1026 # Date 1 0
1026 # Date 1 0
1027 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1027 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1028 # Parent 0000000000000000000000000000000000000000
1028 # Parent 0000000000000000000000000000000000000000
1029 a
1029 a
1030
1030
1031 diff -r 000000000000 -r 8580ff50825a a
1031 diff -r 000000000000 -r 8580ff50825a a
1032 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1032 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1033 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1033 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1034 @@ -0,0 +1,1 @@
1034 @@ -0,0 +1,1 @@
1035 +a
1035 +a
1036
1036
1037 Displaying [PATCH 2 of 2] b ...
1037 Displaying [PATCH 2 of 2] b ...
1038 Content-Type: text/plain; charset="us-ascii"
1038 Content-Type: text/plain; charset="us-ascii"
1039 MIME-Version: 1.0
1039 MIME-Version: 1.0
1040 Content-Transfer-Encoding: 7bit
1040 Content-Transfer-Encoding: 7bit
1041 Subject: [PATCH 2 of 2] b
1041 Subject: [PATCH 2 of 2] b
1042 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1042 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1043 Message-Id: <97d72e5f12c7e84f8506.62@
1043 Message-Id: <97d72e5f12c7e84f8506.62@
1044 In-Reply-To: <patchbomb.60@
1044 In-Reply-To: <patchbomb.60@
1045 References: <patchbomb.60@
1045 References: <patchbomb.60@
1046 User-Agent: Mercurial-patchbomb
1046 User-Agent: Mercurial-patchbomb
1047 Date: Thu, 01 Jan 1970 00:01:02 +0000
1047 Date: Thu, 01 Jan 1970 00:01:02 +0000
1048 From: quux
1048 From: quux
1049 To: foo
1049 To: foo
1050 Cc: bar
1050 Cc: bar
1051
1051
1052 # HG changeset patch
1052 # HG changeset patch
1053 # User test
1053 # User test
1054 # Date 2 0
1054 # Date 2 0
1055 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1055 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1056 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1056 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1057 b
1057 b
1058
1058
1059 diff -r 8580ff50825a -r 97d72e5f12c7 b
1059 diff -r 8580ff50825a -r 97d72e5f12c7 b
1060 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1060 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1061 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1061 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1062 @@ -0,0 +1,1 @@
1062 @@ -0,0 +1,1 @@
1063 +b
1063 +b
1064
1064
1065 % test reply-to via config
1065 % test reply-to via config
1066 This patch series consists of 1 patches.
1066 This patch series consists of 1 patches.
1067
1067
1068
1068
1069 Displaying [PATCH] test ...
1069 Displaying [PATCH] test ...
1070 Content-Type: text/plain; charset="us-ascii"
1070 Content-Type: text/plain; charset="us-ascii"
1071 MIME-Version: 1.0
1071 MIME-Version: 1.0
1072 Content-Transfer-Encoding: 7bit
1072 Content-Transfer-Encoding: 7bit
1073 Subject: [PATCH] test
1073 Subject: [PATCH] test
1074 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1074 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1075 Message-Id: <ff2c9fa2018b15fa74b3.60@
1075 Message-Id: <ff2c9fa2018b15fa74b3.60@
1076 User-Agent: Mercurial-patchbomb
1076 User-Agent: Mercurial-patchbomb
1077 Date: Thu, 01 Jan 1970 00:01:00 +0000
1077 Date: Thu, 01 Jan 1970 00:01:00 +0000
1078 From: quux
1078 From: quux
1079 To: foo
1079 To: foo
1080 Cc: bar
1080 Cc: bar
1081 Reply-To: baz@example.com
1081 Reply-To: baz@example.com
1082
1082
1083 # HG changeset patch
1083 # HG changeset patch
1084 # User test
1084 # User test
1085 # Date 3 0
1085 # Date 3 0
1086 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1086 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1087 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1087 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1088 c
1088 c
1089
1089
1090 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1090 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1091 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1091 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1092 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1092 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1093 @@ -0,0 +1,1 @@
1093 @@ -0,0 +1,1 @@
1094 +c
1094 +c
1095
1095
1096 % test reply-to via command line
1096 % test reply-to via command line
1097 This patch series consists of 1 patches.
1097 This patch series consists of 1 patches.
1098
1098
1099
1099
1100 Displaying [PATCH] test ...
1100 Displaying [PATCH] test ...
1101 Content-Type: text/plain; charset="us-ascii"
1101 Content-Type: text/plain; charset="us-ascii"
1102 MIME-Version: 1.0
1102 MIME-Version: 1.0
1103 Content-Transfer-Encoding: 7bit
1103 Content-Transfer-Encoding: 7bit
1104 Subject: [PATCH] test
1104 Subject: [PATCH] test
1105 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1105 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1106 Message-Id: <ff2c9fa2018b15fa74b3.60@
1106 Message-Id: <ff2c9fa2018b15fa74b3.60@
1107 User-Agent: Mercurial-patchbomb
1107 User-Agent: Mercurial-patchbomb
1108 Date: Thu, 01 Jan 1970 00:01:00 +0000
1108 Date: Thu, 01 Jan 1970 00:01:00 +0000
1109 From: quux
1109 From: quux
1110 To: foo
1110 To: foo
1111 Cc: bar
1111 Cc: bar
1112 Reply-To: baz, fred
1112 Reply-To: baz, fred
1113
1113
1114 # HG changeset patch
1114 # HG changeset patch
1115 # User test
1115 # User test
1116 # Date 3 0
1116 # Date 3 0
1117 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1117 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1118 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1118 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1119 c
1119 c
1120
1120
1121 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1121 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1122 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1122 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1123 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1123 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1124 @@ -0,0 +1,1 @@
1124 @@ -0,0 +1,1 @@
1125 +c
1125 +c
1126
1126
1127 % tagging csets
1127 % tagging csets
1128 % test inline for single named patch
1128 % test inline for single named patch
1129 This patch series consists of 1 patches.
1129 This patch series consists of 1 patches.
1130
1130
1131
1131
1132 Displaying [PATCH] test ...
1132 Displaying [PATCH] test ...
1133 Content-Type: multipart/mixed; boundary="===
1133 Content-Type: multipart/mixed; boundary="===
1134 MIME-Version: 1.0
1134 MIME-Version: 1.0
1135 Subject: [PATCH] test
1135 Subject: [PATCH] test
1136 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1136 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1137 Message-Id: <ff2c9fa2018b15fa74b3.60@
1137 Message-Id: <ff2c9fa2018b15fa74b3.60@
1138 User-Agent: Mercurial-patchbomb
1138 User-Agent: Mercurial-patchbomb
1139 Date: Thu, 01 Jan 1970 00:01:00 +0000
1139 Date: Thu, 01 Jan 1970 00:01:00 +0000
1140 From: quux
1140 From: quux
1141 To: foo
1141 To: foo
1142 Cc: bar
1142 Cc: bar
1143
1143
1144 --===
1144 --===
1145 Content-Type: text/x-patch; charset="us-ascii"
1145 Content-Type: text/x-patch; charset="us-ascii"
1146 MIME-Version: 1.0
1146 MIME-Version: 1.0
1147 Content-Transfer-Encoding: 7bit
1147 Content-Transfer-Encoding: 7bit
1148 Content-Disposition: inline; filename=two.diff
1148 Content-Disposition: inline; filename=two.diff
1149
1149
1150 # HG changeset patch
1150 # HG changeset patch
1151 # User test
1151 # User test
1152 # Date 3 0
1152 # Date 3 0
1153 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1153 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1154 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1154 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1155 c
1155 c
1156
1156
1157 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1157 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1158 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1158 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1159 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1159 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1160 @@ -0,0 +1,1 @@
1160 @@ -0,0 +1,1 @@
1161 +c
1161 +c
1162
1162
1163 --===
1163 --===
1164 % test inline for multiple named/unnamed patches
1164 % test inline for multiple named/unnamed patches
1165 This patch series consists of 2 patches.
1165 This patch series consists of 2 patches.
1166
1166
1167
1167
1168 Write the introductory message for the patch series.
1168 Write the introductory message for the patch series.
1169
1169
1170
1170
1171 Displaying [PATCH 0 of 2] test ...
1171 Displaying [PATCH 0 of 2] test ...
1172 Content-Type: text/plain; charset="us-ascii"
1172 Content-Type: text/plain; charset="us-ascii"
1173 MIME-Version: 1.0
1173 MIME-Version: 1.0
1174 Content-Transfer-Encoding: 7bit
1174 Content-Transfer-Encoding: 7bit
1175 Subject: [PATCH 0 of 2] test
1175 Subject: [PATCH 0 of 2] test
1176 Message-Id: <patchbomb.60@
1176 Message-Id: <patchbomb.60@
1177 User-Agent: Mercurial-patchbomb
1177 User-Agent: Mercurial-patchbomb
1178 Date: Thu, 01 Jan 1970 00:01:00 +0000
1178 Date: Thu, 01 Jan 1970 00:01:00 +0000
1179 From: quux
1179 From: quux
1180 To: foo
1180 To: foo
1181 Cc: bar
1181 Cc: bar
1182
1182
1183
1183
1184 Displaying [PATCH 1 of 2] a ...
1184 Displaying [PATCH 1 of 2] a ...
1185 Content-Type: multipart/mixed; boundary="===
1185 Content-Type: multipart/mixed; boundary="===
1186 MIME-Version: 1.0
1186 MIME-Version: 1.0
1187 Subject: [PATCH 1 of 2] a
1187 Subject: [PATCH 1 of 2] a
1188 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1188 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1189 Message-Id: <8580ff50825a50c8f716.61@
1189 Message-Id: <8580ff50825a50c8f716.61@
1190 In-Reply-To: <patchbomb.60@
1190 In-Reply-To: <patchbomb.60@
1191 References: <patchbomb.60@
1191 References: <patchbomb.60@
1192 User-Agent: Mercurial-patchbomb
1192 User-Agent: Mercurial-patchbomb
1193 Date: Thu, 01 Jan 1970 00:01:01 +0000
1193 Date: Thu, 01 Jan 1970 00:01:01 +0000
1194 From: quux
1194 From: quux
1195 To: foo
1195 To: foo
1196 Cc: bar
1196 Cc: bar
1197
1197
1198 --===
1198 --===
1199 Content-Type: text/x-patch; charset="us-ascii"
1199 Content-Type: text/x-patch; charset="us-ascii"
1200 MIME-Version: 1.0
1200 MIME-Version: 1.0
1201 Content-Transfer-Encoding: 7bit
1201 Content-Transfer-Encoding: 7bit
1202 Content-Disposition: inline; filename=t2-1.patch
1202 Content-Disposition: inline; filename=t2-1.patch
1203
1203
1204 # HG changeset patch
1204 # HG changeset patch
1205 # User test
1205 # User test
1206 # Date 1 0
1206 # Date 1 0
1207 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1207 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1208 # Parent 0000000000000000000000000000000000000000
1208 # Parent 0000000000000000000000000000000000000000
1209 a
1209 a
1210
1210
1211 diff -r 000000000000 -r 8580ff50825a a
1211 diff -r 000000000000 -r 8580ff50825a a
1212 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1212 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1213 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1213 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1214 @@ -0,0 +1,1 @@
1214 @@ -0,0 +1,1 @@
1215 +a
1215 +a
1216
1216
1217 --===
1217 --===
1218 Displaying [PATCH 2 of 2] b ...
1218 Displaying [PATCH 2 of 2] b ...
1219 Content-Type: multipart/mixed; boundary="===
1219 Content-Type: multipart/mixed; boundary="===
1220 MIME-Version: 1.0
1220 MIME-Version: 1.0
1221 Subject: [PATCH 2 of 2] b
1221 Subject: [PATCH 2 of 2] b
1222 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1222 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1223 Message-Id: <97d72e5f12c7e84f8506.62@
1223 Message-Id: <97d72e5f12c7e84f8506.62@
1224 In-Reply-To: <patchbomb.60@
1224 In-Reply-To: <patchbomb.60@
1225 References: <patchbomb.60@
1225 References: <patchbomb.60@
1226 User-Agent: Mercurial-patchbomb
1226 User-Agent: Mercurial-patchbomb
1227 Date: Thu, 01 Jan 1970 00:01:02 +0000
1227 Date: Thu, 01 Jan 1970 00:01:02 +0000
1228 From: quux
1228 From: quux
1229 To: foo
1229 To: foo
1230 Cc: bar
1230 Cc: bar
1231
1231
1232 --===
1232 --===
1233 Content-Type: text/x-patch; charset="us-ascii"
1233 Content-Type: text/x-patch; charset="us-ascii"
1234 MIME-Version: 1.0
1234 MIME-Version: 1.0
1235 Content-Transfer-Encoding: 7bit
1235 Content-Transfer-Encoding: 7bit
1236 Content-Disposition: inline; filename=one.patch
1236 Content-Disposition: inline; filename=one.patch
1237
1237
1238 # HG changeset patch
1238 # HG changeset patch
1239 # User test
1239 # User test
1240 # Date 2 0
1240 # Date 2 0
1241 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1241 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1242 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1242 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1243 b
1243 b
1244
1244
1245 diff -r 8580ff50825a -r 97d72e5f12c7 b
1245 diff -r 8580ff50825a -r 97d72e5f12c7 b
1246 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1246 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1247 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1247 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1248 @@ -0,0 +1,1 @@
1248 @@ -0,0 +1,1 @@
1249 +b
1249 +b
1250
1250
1251 --===
1251 --===
1252 % test inreplyto
1252 % test inreplyto
1253 This patch series consists of 1 patches.
1253 This patch series consists of 1 patches.
1254
1254
1255
1255
1256 Displaying [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b ...
1256 Displaying [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b ...
1257 Content-Type: text/plain; charset="us-ascii"
1257 Content-Type: text/plain; charset="us-ascii"
1258 MIME-Version: 1.0
1258 MIME-Version: 1.0
1259 Content-Transfer-Encoding: 7bit
1259 Content-Transfer-Encoding: 7bit
1260 Subject: [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b
1260 Subject: [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b
1261 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1261 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1262 Message-Id: <e317db6a6f288748d1f6.60@
1262 Message-Id: <e317db6a6f288748d1f6.60@
1263 In-Reply-To: <baz>
1263 In-Reply-To: <baz>
1264 References: <baz>
1264 References: <baz>
1265 User-Agent: Mercurial-patchbomb
1265 User-Agent: Mercurial-patchbomb
1266 Date: Thu, 01 Jan 1970 00:01:00 +0000
1266 Date: Thu, 01 Jan 1970 00:01:00 +0000
1267 From: quux
1267 From: quux
1268 To: foo
1268 To: foo
1269 Cc: bar
1269 Cc: bar
1270
1270
1271 # HG changeset patch
1271 # HG changeset patch
1272 # User test
1272 # User test
1273 # Date 0 0
1273 # Date 0 0
1274 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1274 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1275 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1275 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1276 Added tag two, two.diff for changeset ff2c9fa2018b
1276 Added tag two, two.diff for changeset ff2c9fa2018b
1277
1277
1278 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1278 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1279 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1279 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1280 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1280 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1281 @@ -2,3 +2,5 @@
1281 @@ -2,3 +2,5 @@
1282 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1282 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1283 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1283 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1284 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1284 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1285 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1285 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1286 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1286 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1287
1287
1288 abort: Subject: [PATCH 0 of 2] Please enter a valid value
1288 abort: Subject: [PATCH 0 of 2] Please enter a valid value
1289 This patch series consists of 2 patches.
1289 This patch series consists of 2 patches.
1290
1290
1291 This patch series consists of 2 patches.
1291 This patch series consists of 2 patches.
1292
1292
1293
1293
1294 Write the introductory message for the patch series.
1294 Write the introductory message for the patch series.
1295
1295
1296
1296
1297 Displaying [PATCH 0 of 2] test ...
1297 Displaying [PATCH 0 of 2] test ...
1298 Content-Type: text/plain; charset="us-ascii"
1298 Content-Type: text/plain; charset="us-ascii"
1299 MIME-Version: 1.0
1299 MIME-Version: 1.0
1300 Content-Transfer-Encoding: 7bit
1300 Content-Transfer-Encoding: 7bit
1301 Subject: [PATCH 0 of 2] test
1301 Subject: [PATCH 0 of 2] test
1302 Message-Id: <patchbomb.60@
1302 Message-Id: <patchbomb.60@
1303 In-Reply-To: <baz>
1303 In-Reply-To: <baz>
1304 References: <baz>
1304 References: <baz>
1305 User-Agent: Mercurial-patchbomb
1305 User-Agent: Mercurial-patchbomb
1306 Date: Thu, 01 Jan 1970 00:01:00 +0000
1306 Date: Thu, 01 Jan 1970 00:01:00 +0000
1307 From: quux
1307 From: quux
1308 To: foo
1308 To: foo
1309 Cc: bar
1309 Cc: bar
1310
1310
1311
1311
1312 Displaying [PATCH 1 of 2] a ...
1312 Displaying [PATCH 1 of 2] a ...
1313 Content-Type: text/plain; charset="us-ascii"
1313 Content-Type: text/plain; charset="us-ascii"
1314 MIME-Version: 1.0
1314 MIME-Version: 1.0
1315 Content-Transfer-Encoding: 7bit
1315 Content-Transfer-Encoding: 7bit
1316 Subject: [PATCH 1 of 2] a
1316 Subject: [PATCH 1 of 2] a
1317 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1317 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1318 Message-Id: <8580ff50825a50c8f716.61@
1318 Message-Id: <8580ff50825a50c8f716.61@
1319 In-Reply-To: <patchbomb.60@
1319 In-Reply-To: <patchbomb.60@
1320 References: <patchbomb.60@
1320 References: <patchbomb.60@
1321 User-Agent: Mercurial-patchbomb
1321 User-Agent: Mercurial-patchbomb
1322 Date: Thu, 01 Jan 1970 00:01:01 +0000
1322 Date: Thu, 01 Jan 1970 00:01:01 +0000
1323 From: quux
1323 From: quux
1324 To: foo
1324 To: foo
1325 Cc: bar
1325 Cc: bar
1326
1326
1327 # HG changeset patch
1327 # HG changeset patch
1328 # User test
1328 # User test
1329 # Date 1 0
1329 # Date 1 0
1330 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1330 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1331 # Parent 0000000000000000000000000000000000000000
1331 # Parent 0000000000000000000000000000000000000000
1332 a
1332 a
1333
1333
1334 diff -r 000000000000 -r 8580ff50825a a
1334 diff -r 000000000000 -r 8580ff50825a a
1335 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1335 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1336 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1336 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1337 @@ -0,0 +1,1 @@
1337 @@ -0,0 +1,1 @@
1338 +a
1338 +a
1339
1339
1340 Displaying [PATCH 2 of 2] b ...
1340 Displaying [PATCH 2 of 2] b ...
1341 Content-Type: text/plain; charset="us-ascii"
1341 Content-Type: text/plain; charset="us-ascii"
1342 MIME-Version: 1.0
1342 MIME-Version: 1.0
1343 Content-Transfer-Encoding: 7bit
1343 Content-Transfer-Encoding: 7bit
1344 Subject: [PATCH 2 of 2] b
1344 Subject: [PATCH 2 of 2] b
1345 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1345 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1346 Message-Id: <97d72e5f12c7e84f8506.62@
1346 Message-Id: <97d72e5f12c7e84f8506.62@
1347 In-Reply-To: <patchbomb.60@
1347 In-Reply-To: <patchbomb.60@
1348 References: <patchbomb.60@
1348 References: <patchbomb.60@
1349 User-Agent: Mercurial-patchbomb
1349 User-Agent: Mercurial-patchbomb
1350 Date: Thu, 01 Jan 1970 00:01:02 +0000
1350 Date: Thu, 01 Jan 1970 00:01:02 +0000
1351 From: quux
1351 From: quux
1352 To: foo
1352 To: foo
1353 Cc: bar
1353 Cc: bar
1354
1354
1355 # HG changeset patch
1355 # HG changeset patch
1356 # User test
1356 # User test
1357 # Date 2 0
1357 # Date 2 0
1358 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1358 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1359 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1359 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1360 b
1360 b
1361
1361
1362 diff -r 8580ff50825a -r 97d72e5f12c7 b
1362 diff -r 8580ff50825a -r 97d72e5f12c7 b
1363 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1363 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1364 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1364 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1365 @@ -0,0 +1,1 @@
1365 @@ -0,0 +1,1 @@
1366 +b
1366 +b
1367
1367
1368 % test single flag for single patch
1368 % test single flag for single patch
1369 This patch series consists of 1 patches.
1369 This patch series consists of 1 patches.
1370
1370
1371
1371
1372 Displaying [PATCH fooFlag] test ...
1372 Displaying [PATCH fooFlag] test ...
1373 Content-Type: text/plain; charset="us-ascii"
1373 Content-Type: text/plain; charset="us-ascii"
1374 MIME-Version: 1.0
1374 MIME-Version: 1.0
1375 Content-Transfer-Encoding: 7bit
1375 Content-Transfer-Encoding: 7bit
1376 Subject: [PATCH fooFlag] test
1376 Subject: [PATCH fooFlag] test
1377 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1377 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1378 Message-Id: <ff2c9fa2018b15fa74b3.60@
1378 Message-Id: <ff2c9fa2018b15fa74b3.60@
1379 User-Agent: Mercurial-patchbomb
1379 User-Agent: Mercurial-patchbomb
1380 Date: Thu, 01 Jan 1970 00:01:00 +0000
1380 Date: Thu, 01 Jan 1970 00:01:00 +0000
1381 From: quux
1381 From: quux
1382 To: foo
1382 To: foo
1383 Cc: bar
1383 Cc: bar
1384
1384
1385 # HG changeset patch
1385 # HG changeset patch
1386 # User test
1386 # User test
1387 # Date 3 0
1387 # Date 3 0
1388 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1388 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1389 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1389 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1390 c
1390 c
1391
1391
1392 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1392 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1393 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1393 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1394 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1394 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1395 @@ -0,0 +1,1 @@
1395 @@ -0,0 +1,1 @@
1396 +c
1396 +c
1397
1397
1398 % test single flag for multiple patches
1398 % test single flag for multiple patches
1399 This patch series consists of 2 patches.
1399 This patch series consists of 2 patches.
1400
1400
1401
1401
1402 Write the introductory message for the patch series.
1402 Write the introductory message for the patch series.
1403
1403
1404
1404
1405 Displaying [PATCH 0 of 2 fooFlag] test ...
1405 Displaying [PATCH 0 of 2 fooFlag] test ...
1406 Content-Type: text/plain; charset="us-ascii"
1406 Content-Type: text/plain; charset="us-ascii"
1407 MIME-Version: 1.0
1407 MIME-Version: 1.0
1408 Content-Transfer-Encoding: 7bit
1408 Content-Transfer-Encoding: 7bit
1409 Subject: [PATCH 0 of 2 fooFlag] test
1409 Subject: [PATCH 0 of 2 fooFlag] test
1410 Message-Id: <patchbomb.60@
1410 Message-Id: <patchbomb.60@
1411 User-Agent: Mercurial-patchbomb
1411 User-Agent: Mercurial-patchbomb
1412 Date: Thu, 01 Jan 1970 00:01:00 +0000
1412 Date: Thu, 01 Jan 1970 00:01:00 +0000
1413 From: quux
1413 From: quux
1414 To: foo
1414 To: foo
1415 Cc: bar
1415 Cc: bar
1416
1416
1417
1417
1418 Displaying [PATCH 1 of 2 fooFlag] a ...
1418 Displaying [PATCH 1 of 2 fooFlag] a ...
1419 Content-Type: text/plain; charset="us-ascii"
1419 Content-Type: text/plain; charset="us-ascii"
1420 MIME-Version: 1.0
1420 MIME-Version: 1.0
1421 Content-Transfer-Encoding: 7bit
1421 Content-Transfer-Encoding: 7bit
1422 Subject: [PATCH 1 of 2 fooFlag] a
1422 Subject: [PATCH 1 of 2 fooFlag] a
1423 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1423 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1424 Message-Id: <8580ff50825a50c8f716.61@
1424 Message-Id: <8580ff50825a50c8f716.61@
1425 In-Reply-To: <patchbomb.60@
1425 In-Reply-To: <patchbomb.60@
1426 References: <patchbomb.60@
1426 References: <patchbomb.60@
1427 User-Agent: Mercurial-patchbomb
1427 User-Agent: Mercurial-patchbomb
1428 Date: Thu, 01 Jan 1970 00:01:01 +0000
1428 Date: Thu, 01 Jan 1970 00:01:01 +0000
1429 From: quux
1429 From: quux
1430 To: foo
1430 To: foo
1431 Cc: bar
1431 Cc: bar
1432
1432
1433 # HG changeset patch
1433 # HG changeset patch
1434 # User test
1434 # User test
1435 # Date 1 0
1435 # Date 1 0
1436 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1436 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1437 # Parent 0000000000000000000000000000000000000000
1437 # Parent 0000000000000000000000000000000000000000
1438 a
1438 a
1439
1439
1440 diff -r 000000000000 -r 8580ff50825a a
1440 diff -r 000000000000 -r 8580ff50825a a
1441 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1441 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1442 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1442 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1443 @@ -0,0 +1,1 @@
1443 @@ -0,0 +1,1 @@
1444 +a
1444 +a
1445
1445
1446 Displaying [PATCH 2 of 2 fooFlag] b ...
1446 Displaying [PATCH 2 of 2 fooFlag] b ...
1447 Content-Type: text/plain; charset="us-ascii"
1447 Content-Type: text/plain; charset="us-ascii"
1448 MIME-Version: 1.0
1448 MIME-Version: 1.0
1449 Content-Transfer-Encoding: 7bit
1449 Content-Transfer-Encoding: 7bit
1450 Subject: [PATCH 2 of 2 fooFlag] b
1450 Subject: [PATCH 2 of 2 fooFlag] b
1451 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1451 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1452 Message-Id: <97d72e5f12c7e84f8506.62@
1452 Message-Id: <97d72e5f12c7e84f8506.62@
1453 In-Reply-To: <patchbomb.60@
1453 In-Reply-To: <patchbomb.60@
1454 References: <patchbomb.60@
1454 References: <patchbomb.60@
1455 User-Agent: Mercurial-patchbomb
1455 User-Agent: Mercurial-patchbomb
1456 Date: Thu, 01 Jan 1970 00:01:02 +0000
1456 Date: Thu, 01 Jan 1970 00:01:02 +0000
1457 From: quux
1457 From: quux
1458 To: foo
1458 To: foo
1459 Cc: bar
1459 Cc: bar
1460
1460
1461 # HG changeset patch
1461 # HG changeset patch
1462 # User test
1462 # User test
1463 # Date 2 0
1463 # Date 2 0
1464 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1464 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1465 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1465 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1466 b
1466 b
1467
1467
1468 diff -r 8580ff50825a -r 97d72e5f12c7 b
1468 diff -r 8580ff50825a -r 97d72e5f12c7 b
1469 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1469 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1470 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1470 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1471 @@ -0,0 +1,1 @@
1471 @@ -0,0 +1,1 @@
1472 +b
1472 +b
1473
1473
1474 % test mutiple flags for single patch
1474 % test mutiple flags for single patch
1475 This patch series consists of 1 patches.
1475 This patch series consists of 1 patches.
1476
1476
1477
1477
1478 Displaying [PATCH fooFlag barFlag] test ...
1478 Displaying [PATCH fooFlag barFlag] test ...
1479 Content-Type: text/plain; charset="us-ascii"
1479 Content-Type: text/plain; charset="us-ascii"
1480 MIME-Version: 1.0
1480 MIME-Version: 1.0
1481 Content-Transfer-Encoding: 7bit
1481 Content-Transfer-Encoding: 7bit
1482 Subject: [PATCH fooFlag barFlag] test
1482 Subject: [PATCH fooFlag barFlag] test
1483 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1483 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1484 Message-Id: <ff2c9fa2018b15fa74b3.60@
1484 Message-Id: <ff2c9fa2018b15fa74b3.60@
1485 User-Agent: Mercurial-patchbomb
1485 User-Agent: Mercurial-patchbomb
1486 Date: Thu, 01 Jan 1970 00:01:00 +0000
1486 Date: Thu, 01 Jan 1970 00:01:00 +0000
1487 From: quux
1487 From: quux
1488 To: foo
1488 To: foo
1489 Cc: bar
1489 Cc: bar
1490
1490
1491 # HG changeset patch
1491 # HG changeset patch
1492 # User test
1492 # User test
1493 # Date 3 0
1493 # Date 3 0
1494 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1494 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1495 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1495 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1496 c
1496 c
1497
1497
1498 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1498 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1499 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1499 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1500 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1500 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1501 @@ -0,0 +1,1 @@
1501 @@ -0,0 +1,1 @@
1502 +c
1502 +c
1503
1503
1504 % test multiple flags for multiple patches
1504 % test multiple flags for multiple patches
1505 This patch series consists of 2 patches.
1505 This patch series consists of 2 patches.
1506
1506
1507
1507
1508 Write the introductory message for the patch series.
1508 Write the introductory message for the patch series.
1509
1509
1510
1510
1511 Displaying [PATCH 0 of 2 fooFlag barFlag] test ...
1511 Displaying [PATCH 0 of 2 fooFlag barFlag] test ...
1512 Content-Type: text/plain; charset="us-ascii"
1512 Content-Type: text/plain; charset="us-ascii"
1513 MIME-Version: 1.0
1513 MIME-Version: 1.0
1514 Content-Transfer-Encoding: 7bit
1514 Content-Transfer-Encoding: 7bit
1515 Subject: [PATCH 0 of 2 fooFlag barFlag] test
1515 Subject: [PATCH 0 of 2 fooFlag barFlag] test
1516 Message-Id: <patchbomb.60@
1516 Message-Id: <patchbomb.60@
1517 User-Agent: Mercurial-patchbomb
1517 User-Agent: Mercurial-patchbomb
1518 Date: Thu, 01 Jan 1970 00:01:00 +0000
1518 Date: Thu, 01 Jan 1970 00:01:00 +0000
1519 From: quux
1519 From: quux
1520 To: foo
1520 To: foo
1521 Cc: bar
1521 Cc: bar
1522
1522
1523
1523
1524 Displaying [PATCH 1 of 2 fooFlag barFlag] a ...
1524 Displaying [PATCH 1 of 2 fooFlag barFlag] a ...
1525 Content-Type: text/plain; charset="us-ascii"
1525 Content-Type: text/plain; charset="us-ascii"
1526 MIME-Version: 1.0
1526 MIME-Version: 1.0
1527 Content-Transfer-Encoding: 7bit
1527 Content-Transfer-Encoding: 7bit
1528 Subject: [PATCH 1 of 2 fooFlag barFlag] a
1528 Subject: [PATCH 1 of 2 fooFlag barFlag] a
1529 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1529 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1530 Message-Id: <8580ff50825a50c8f716.61@
1530 Message-Id: <8580ff50825a50c8f716.61@
1531 In-Reply-To: <patchbomb.60@
1531 In-Reply-To: <patchbomb.60@
1532 References: <patchbomb.60@
1532 References: <patchbomb.60@
1533 User-Agent: Mercurial-patchbomb
1533 User-Agent: Mercurial-patchbomb
1534 Date: Thu, 01 Jan 1970 00:01:01 +0000
1534 Date: Thu, 01 Jan 1970 00:01:01 +0000
1535 From: quux
1535 From: quux
1536 To: foo
1536 To: foo
1537 Cc: bar
1537 Cc: bar
1538
1538
1539 # HG changeset patch
1539 # HG changeset patch
1540 # User test
1540 # User test
1541 # Date 1 0
1541 # Date 1 0
1542 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1542 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1543 # Parent 0000000000000000000000000000000000000000
1543 # Parent 0000000000000000000000000000000000000000
1544 a
1544 a
1545
1545
1546 diff -r 000000000000 -r 8580ff50825a a
1546 diff -r 000000000000 -r 8580ff50825a a
1547 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1547 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1548 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1548 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1549 @@ -0,0 +1,1 @@
1549 @@ -0,0 +1,1 @@
1550 +a
1550 +a
1551
1551
1552 Displaying [PATCH 2 of 2 fooFlag barFlag] b ...
1552 Displaying [PATCH 2 of 2 fooFlag barFlag] b ...
1553 Content-Type: text/plain; charset="us-ascii"
1553 Content-Type: text/plain; charset="us-ascii"
1554 MIME-Version: 1.0
1554 MIME-Version: 1.0
1555 Content-Transfer-Encoding: 7bit
1555 Content-Transfer-Encoding: 7bit
1556 Subject: [PATCH 2 of 2 fooFlag barFlag] b
1556 Subject: [PATCH 2 of 2 fooFlag barFlag] b
1557 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1557 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1558 Message-Id: <97d72e5f12c7e84f8506.62@
1558 Message-Id: <97d72e5f12c7e84f8506.62@
1559 In-Reply-To: <patchbomb.60@
1559 In-Reply-To: <patchbomb.60@
1560 References: <patchbomb.60@
1560 References: <patchbomb.60@
1561 User-Agent: Mercurial-patchbomb
1561 User-Agent: Mercurial-patchbomb
1562 Date: Thu, 01 Jan 1970 00:01:02 +0000
1562 Date: Thu, 01 Jan 1970 00:01:02 +0000
1563 From: quux
1563 From: quux
1564 To: foo
1564 To: foo
1565 Cc: bar
1565 Cc: bar
1566
1566
1567 # HG changeset patch
1567 # HG changeset patch
1568 # User test
1568 # User test
1569 # Date 2 0
1569 # Date 2 0
1570 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1570 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1571 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1571 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1572 b
1572 b
1573
1573
1574 diff -r 8580ff50825a -r 97d72e5f12c7 b
1574 diff -r 8580ff50825a -r 97d72e5f12c7 b
1575 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1575 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1576 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1576 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1577 @@ -0,0 +1,1 @@
1577 @@ -0,0 +1,1 @@
1578 +b
1578 +b
1579
1579
1580 % test multi-address parsing
1580 % test multi-address parsing
1581 This patch series consists of 1 patches.
1581 This patch series consists of 1 patches.
1582
1582
1583
1583
1584 Writing [PATCH] test ...
1584 Writing [PATCH] test ...
1585 From quux Tue Jan 01 00:01:01 1980
1585 From quux Tue Jan 01 00:01:01 1980
1586 Content-Type: text/plain; charset="us-ascii"
1586 Content-Type: text/plain; charset="us-ascii"
1587 MIME-Version: 1.0
1587 MIME-Version: 1.0
1588 Content-Transfer-Encoding: 7bit
1588 Content-Transfer-Encoding: 7bit
1589 Subject: [PATCH] test
1589 Subject: [PATCH] test
1590 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1590 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1591 Message-Id: <8580ff50825a50c8f716.315532860@
1591 Message-Id: <8580ff50825a50c8f716.315532860@
1592 User-Agent: Mercurial-patchbomb
1592 User-Agent: Mercurial-patchbomb
1593 Date: Tue, 01 Jan 1980 00:01:00 +0000
1593 Date: Tue, 01 Jan 1980 00:01:00 +0000
1594 From: quux
1594 From: quux
1595 To: spam <spam>, eggs, toast
1595 To: spam <spam>, eggs, toast
1596 Cc: foo, bar@example.com, "A, B <>" <a@example.com>
1596 Cc: foo, bar@example.com, "A, B <>" <a@example.com>
1597 Bcc: "Quux, A." <quux>
1597 Bcc: "Quux, A." <quux>
1598
1598
1599 # HG changeset patch
1599 # HG changeset patch
1600 # User test
1600 # User test
1601 # Date 1 0
1601 # Date 1 0
1602 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1602 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1603 # Parent 0000000000000000000000000000000000000000
1603 # Parent 0000000000000000000000000000000000000000
1604 a
1604 a
1605
1605
1606 diff -r 000000000000 -r 8580ff50825a a
1606 diff -r 000000000000 -r 8580ff50825a a
1607 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1607 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1608 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1608 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1609 @@ -0,0 +1,1 @@
1609 @@ -0,0 +1,1 @@
1610 +a
1610 +a
1611
1611
1612
1612
1613 % test multi-byte domain parsing
1613 % test multi-byte domain parsing
1614 This patch series consists of 1 patches.
1614 This patch series consists of 1 patches.
1615
1615
1616
1616
1617 Writing [PATCH] test ...
1617 Writing [PATCH] test ...
1618 From quux Tue Jan 01 00:01:01 1980
1618 From quux Tue Jan 01 00:01:01 1980
1619 Content-Type: text/plain; charset="us-ascii"
1619 Content-Type: text/plain; charset="us-ascii"
1620 MIME-Version: 1.0
1620 MIME-Version: 1.0
1621 Content-Transfer-Encoding: 7bit
1621 Content-Transfer-Encoding: 7bit
1622 Subject: [PATCH] test
1622 Subject: [PATCH] test
1623 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1623 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1624 Message-Id: <8580ff50825a50c8f716.315532860@
1624 Message-Id: <8580ff50825a50c8f716.315532860@
1625 User-Agent: Mercurial-patchbomb
1625 User-Agent: Mercurial-patchbomb
1626 Date: Tue, 01 Jan 1980 00:01:00 +0000
1626 Date: Tue, 01 Jan 1980 00:01:00 +0000
1627 From: quux
1627 From: quux
1628 To: bar@xn--nicode-2ya.com
1628 To: bar@xn--nicode-2ya.com
1629
1629
1630 # HG changeset patch
1630 # HG changeset patch
1631 # User test
1631 # User test
1632 # Date 1 0
1632 # Date 1 0
1633 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1633 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1634 # Parent 0000000000000000000000000000000000000000
1634 # Parent 0000000000000000000000000000000000000000
1635 a
1635 a
1636
1636
1637 diff -r 000000000000 -r 8580ff50825a a
1637 diff -r 000000000000 -r 8580ff50825a a
1638 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1638 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1639 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1639 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1640 @@ -0,0 +1,1 @@
1640 @@ -0,0 +1,1 @@
1641 +a
1641 +a
1642
1642
1643
1643
1644 % test outgoing
1644 % test outgoing
1645 0 files updated, 0 files merged, 6 files removed, 0 files unresolved
1645 0 files updated, 0 files merged, 6 files removed, 0 files unresolved
1646 marked working directory as branch test
1646 marked working directory as branch test
1647 created new head
1648 comparing with ../t
1647 comparing with ../t
1649 searching for changes
1648 searching for changes
1650 This patch series consists of 8 patches.
1649 This patch series consists of 8 patches.
1651
1650
1652
1651
1653 Write the introductory message for the patch series.
1652 Write the introductory message for the patch series.
1654
1653
1655
1654
1656 Displaying [PATCH 0 of 8] test ...
1655 Displaying [PATCH 0 of 8] test ...
1657 Content-Type: text/plain; charset="us-ascii"
1656 Content-Type: text/plain; charset="us-ascii"
1658 MIME-Version: 1.0
1657 MIME-Version: 1.0
1659 Content-Transfer-Encoding: 7bit
1658 Content-Transfer-Encoding: 7bit
1660 Subject: [PATCH 0 of 8] test
1659 Subject: [PATCH 0 of 8] test
1661 Message-Id: <patchbomb.315532860@
1660 Message-Id: <patchbomb.315532860@
1662 User-Agent: Mercurial-patchbomb
1661 User-Agent: Mercurial-patchbomb
1663 Date: Tue, 01 Jan 1980 00:01:00 +0000
1662 Date: Tue, 01 Jan 1980 00:01:00 +0000
1664 From: test
1663 From: test
1665 To: foo
1664 To: foo
1666
1665
1667
1666
1668 Displaying [PATCH 1 of 8] c ...
1667 Displaying [PATCH 1 of 8] c ...
1669 Content-Type: text/plain; charset="us-ascii"
1668 Content-Type: text/plain; charset="us-ascii"
1670 MIME-Version: 1.0
1669 MIME-Version: 1.0
1671 Content-Transfer-Encoding: 7bit
1670 Content-Transfer-Encoding: 7bit
1672 Subject: [PATCH 1 of 8] c
1671 Subject: [PATCH 1 of 8] c
1673 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1672 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1674 Message-Id: <ff2c9fa2018b15fa74b3.315532861@
1673 Message-Id: <ff2c9fa2018b15fa74b3.315532861@
1675 In-Reply-To: <patchbomb.315532860@
1674 In-Reply-To: <patchbomb.315532860@
1676 References: <patchbomb.315532860@
1675 References: <patchbomb.315532860@
1677 User-Agent: Mercurial-patchbomb
1676 User-Agent: Mercurial-patchbomb
1678 Date: Tue, 01 Jan 1980 00:01:01 +0000
1677 Date: Tue, 01 Jan 1980 00:01:01 +0000
1679 From: test
1678 From: test
1680 To: foo
1679 To: foo
1681
1680
1682 # HG changeset patch
1681 # HG changeset patch
1683 # User test
1682 # User test
1684 # Date 3 0
1683 # Date 3 0
1685 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1684 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1686 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1685 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1687 c
1686 c
1688
1687
1689 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1688 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1690 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1689 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1691 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1690 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1692 @@ -0,0 +1,1 @@
1691 @@ -0,0 +1,1 @@
1693 +c
1692 +c
1694
1693
1695 Displaying [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64 ...
1694 Displaying [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64 ...
1696 Content-Type: text/plain; charset="us-ascii"
1695 Content-Type: text/plain; charset="us-ascii"
1697 MIME-Version: 1.0
1696 MIME-Version: 1.0
1698 Content-Transfer-Encoding: 8bit
1697 Content-Transfer-Encoding: 8bit
1699 Subject: [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64
1698 Subject: [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64
1700 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1699 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1701 Message-Id: <c3c9e37db9f4fe4882cd.315532862@
1700 Message-Id: <c3c9e37db9f4fe4882cd.315532862@
1702 In-Reply-To: <patchbomb.315532860@
1701 In-Reply-To: <patchbomb.315532860@
1703 References: <patchbomb.315532860@
1702 References: <patchbomb.315532860@
1704 User-Agent: Mercurial-patchbomb
1703 User-Agent: Mercurial-patchbomb
1705 Date: Tue, 01 Jan 1980 00:01:02 +0000
1704 Date: Tue, 01 Jan 1980 00:01:02 +0000
1706 From: test
1705 From: test
1707 To: foo
1706 To: foo
1708
1707
1709 # HG changeset patch
1708 # HG changeset patch
1710 # User test
1709 # User test
1711 # Date 4 0
1710 # Date 4 0
1712 # Node ID c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1711 # Node ID c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1713 # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
1712 # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
1714 charset=utf-8; content-transfer-encoding: base64
1713 charset=utf-8; content-transfer-encoding: base64
1715
1714
1716 diff -r ff2c9fa2018b -r c3c9e37db9f4 description
1715 diff -r ff2c9fa2018b -r c3c9e37db9f4 description
1717 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1716 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1718 +++ b/description Thu Jan 01 00:00:04 1970 +0000
1717 +++ b/description Thu Jan 01 00:00:04 1970 +0000
1719 @@ -0,0 +1,3 @@
1718 @@ -0,0 +1,3 @@
1720 +a multiline
1719 +a multiline
1721 +
1720 +
1722 +description
1721 +description
1723 diff -r ff2c9fa2018b -r c3c9e37db9f4 utf
1722 diff -r ff2c9fa2018b -r c3c9e37db9f4 utf
1724 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1723 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1725 +++ b/utf Thu Jan 01 00:00:04 1970 +0000
1724 +++ b/utf Thu Jan 01 00:00:04 1970 +0000
1726 @@ -0,0 +1,1 @@
1725 @@ -0,0 +1,1 @@
1727 +hΓΆmma!
1726 +hΓΆmma!
1728
1727
1729 Displaying [PATCH 3 of 8] charset=utf-8; content-transfer-encoding: quoted-printable ...
1728 Displaying [PATCH 3 of 8] charset=utf-8; content-transfer-encoding: quoted-printable ...
1730 Content-Type: text/plain; charset="us-ascii"
1729 Content-Type: text/plain; charset="us-ascii"
1731 MIME-Version: 1.0
1730 MIME-Version: 1.0
1732 Content-Transfer-Encoding: quoted-printable
1731 Content-Transfer-Encoding: quoted-printable
1733 Subject: [PATCH 3 of 8] charset=utf-8;
1732 Subject: [PATCH 3 of 8] charset=utf-8;
1734 content-transfer-encoding: quoted-printable
1733 content-transfer-encoding: quoted-printable
1735 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
1734 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
1736 Message-Id: <c655633f8c87700bb38c.315532863@
1735 Message-Id: <c655633f8c87700bb38c.315532863@
1737 In-Reply-To: <patchbomb.315532860@
1736 In-Reply-To: <patchbomb.315532860@
1738 References: <patchbomb.315532860@
1737 References: <patchbomb.315532860@
1739 User-Agent: Mercurial-patchbomb
1738 User-Agent: Mercurial-patchbomb
1740 Date: Tue, 01 Jan 1980 00:01:03 +0000
1739 Date: Tue, 01 Jan 1980 00:01:03 +0000
1741 From: test
1740 From: test
1742 To: foo
1741 To: foo
1743
1742
1744 # HG changeset patch
1743 # HG changeset patch
1745 # User test
1744 # User test
1746 # Date 4 0
1745 # Date 4 0
1747 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
1746 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
1748 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1747 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1749 charset=3Dutf-8; content-transfer-encoding: quoted-printable
1748 charset=3Dutf-8; content-transfer-encoding: quoted-printable
1750
1749
1751 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1750 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1752 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1751 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1753 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1752 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1754 @@ -0,0 +1,4 @@
1753 @@ -0,0 +1,4 @@
1755 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1754 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1756 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1755 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1757 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1756 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1758 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1757 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1759 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1758 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1760 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1759 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1761 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1760 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1762 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1761 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1763 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1762 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1764 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1763 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1765 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1764 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1766 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1765 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1767 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1766 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1768 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1767 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1769 +foo
1768 +foo
1770 +
1769 +
1771 +bar
1770 +bar
1772
1771
1773 Displaying [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit ...
1772 Displaying [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit ...
1774 Content-Type: text/plain; charset="us-ascii"
1773 Content-Type: text/plain; charset="us-ascii"
1775 MIME-Version: 1.0
1774 MIME-Version: 1.0
1776 Content-Transfer-Encoding: 8bit
1775 Content-Transfer-Encoding: 8bit
1777 Subject: [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit
1776 Subject: [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit
1778 X-Mercurial-Node: 22d0f96be12f5945fd67d101af58f7bc8263c835
1777 X-Mercurial-Node: 22d0f96be12f5945fd67d101af58f7bc8263c835
1779 Message-Id: <22d0f96be12f5945fd67.315532864@
1778 Message-Id: <22d0f96be12f5945fd67.315532864@
1780 In-Reply-To: <patchbomb.315532860@
1779 In-Reply-To: <patchbomb.315532860@
1781 References: <patchbomb.315532860@
1780 References: <patchbomb.315532860@
1782 User-Agent: Mercurial-patchbomb
1781 User-Agent: Mercurial-patchbomb
1783 Date: Tue, 01 Jan 1980 00:01:04 +0000
1782 Date: Tue, 01 Jan 1980 00:01:04 +0000
1784 From: test
1783 From: test
1785 To: foo
1784 To: foo
1786
1785
1787 # HG changeset patch
1786 # HG changeset patch
1788 # User test
1787 # User test
1789 # Date 5 0
1788 # Date 5 0
1790 # Node ID 22d0f96be12f5945fd67d101af58f7bc8263c835
1789 # Node ID 22d0f96be12f5945fd67d101af58f7bc8263c835
1791 # Parent c655633f8c87700bb38cc6a59a2753bdc5a6c376
1790 # Parent c655633f8c87700bb38cc6a59a2753bdc5a6c376
1792 charset=us-ascii; content-transfer-encoding: 8bit
1791 charset=us-ascii; content-transfer-encoding: 8bit
1793
1792
1794 diff -r c655633f8c87 -r 22d0f96be12f isolatin
1793 diff -r c655633f8c87 -r 22d0f96be12f isolatin
1795 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1794 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1796 +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
1795 +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
1797 @@ -0,0 +1,1 @@
1796 @@ -0,0 +1,1 @@
1798 +hοΏ½mma!
1797 +hοΏ½mma!
1799
1798
1800 Displaying [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a ...
1799 Displaying [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a ...
1801 Content-Type: text/plain; charset="us-ascii"
1800 Content-Type: text/plain; charset="us-ascii"
1802 MIME-Version: 1.0
1801 MIME-Version: 1.0
1803 Content-Transfer-Encoding: 7bit
1802 Content-Transfer-Encoding: 7bit
1804 Subject: [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a
1803 Subject: [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a
1805 X-Mercurial-Node: dd9c2b4b8a8a0934d5523c15f2c119b362360903
1804 X-Mercurial-Node: dd9c2b4b8a8a0934d5523c15f2c119b362360903
1806 Message-Id: <dd9c2b4b8a8a0934d552.315532865@
1805 Message-Id: <dd9c2b4b8a8a0934d552.315532865@
1807 In-Reply-To: <patchbomb.315532860@
1806 In-Reply-To: <patchbomb.315532860@
1808 References: <patchbomb.315532860@
1807 References: <patchbomb.315532860@
1809 User-Agent: Mercurial-patchbomb
1808 User-Agent: Mercurial-patchbomb
1810 Date: Tue, 01 Jan 1980 00:01:05 +0000
1809 Date: Tue, 01 Jan 1980 00:01:05 +0000
1811 From: test
1810 From: test
1812 To: foo
1811 To: foo
1813
1812
1814 # HG changeset patch
1813 # HG changeset patch
1815 # User test
1814 # User test
1816 # Date 0 0
1815 # Date 0 0
1817 # Node ID dd9c2b4b8a8a0934d5523c15f2c119b362360903
1816 # Node ID dd9c2b4b8a8a0934d5523c15f2c119b362360903
1818 # Parent 22d0f96be12f5945fd67d101af58f7bc8263c835
1817 # Parent 22d0f96be12f5945fd67d101af58f7bc8263c835
1819 Added tag zero, zero.foo for changeset 8580ff50825a
1818 Added tag zero, zero.foo for changeset 8580ff50825a
1820
1819
1821 diff -r 22d0f96be12f -r dd9c2b4b8a8a .hgtags
1820 diff -r 22d0f96be12f -r dd9c2b4b8a8a .hgtags
1822 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1821 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1823 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1822 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1824 @@ -0,0 +1,2 @@
1823 @@ -0,0 +1,2 @@
1825 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero
1824 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero
1826 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1825 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1827
1826
1828 Displaying [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7 ...
1827 Displaying [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7 ...
1829 Content-Type: text/plain; charset="us-ascii"
1828 Content-Type: text/plain; charset="us-ascii"
1830 MIME-Version: 1.0
1829 MIME-Version: 1.0
1831 Content-Transfer-Encoding: 7bit
1830 Content-Transfer-Encoding: 7bit
1832 Subject: [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7
1831 Subject: [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7
1833 X-Mercurial-Node: eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1832 X-Mercurial-Node: eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1834 Message-Id: <eae5fcf795eee29d0e45.315532866@
1833 Message-Id: <eae5fcf795eee29d0e45.315532866@
1835 In-Reply-To: <patchbomb.315532860@
1834 In-Reply-To: <patchbomb.315532860@
1836 References: <patchbomb.315532860@
1835 References: <patchbomb.315532860@
1837 User-Agent: Mercurial-patchbomb
1836 User-Agent: Mercurial-patchbomb
1838 Date: Tue, 01 Jan 1980 00:01:06 +0000
1837 Date: Tue, 01 Jan 1980 00:01:06 +0000
1839 From: test
1838 From: test
1840 To: foo
1839 To: foo
1841
1840
1842 # HG changeset patch
1841 # HG changeset patch
1843 # User test
1842 # User test
1844 # Date 0 0
1843 # Date 0 0
1845 # Node ID eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1844 # Node ID eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1846 # Parent dd9c2b4b8a8a0934d5523c15f2c119b362360903
1845 # Parent dd9c2b4b8a8a0934d5523c15f2c119b362360903
1847 Added tag one, one.patch for changeset 97d72e5f12c7
1846 Added tag one, one.patch for changeset 97d72e5f12c7
1848
1847
1849 diff -r dd9c2b4b8a8a -r eae5fcf795ee .hgtags
1848 diff -r dd9c2b4b8a8a -r eae5fcf795ee .hgtags
1850 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1849 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1851 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1850 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1852 @@ -1,2 +1,4 @@
1851 @@ -1,2 +1,4 @@
1853 8580ff50825a50c8f716709acdf8de0deddcd6ab zero
1852 8580ff50825a50c8f716709acdf8de0deddcd6ab zero
1854 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1853 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1855 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1854 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1856 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1855 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1857
1856
1858 Displaying [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b ...
1857 Displaying [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b ...
1859 Content-Type: text/plain; charset="us-ascii"
1858 Content-Type: text/plain; charset="us-ascii"
1860 MIME-Version: 1.0
1859 MIME-Version: 1.0
1861 Content-Transfer-Encoding: 7bit
1860 Content-Transfer-Encoding: 7bit
1862 Subject: [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b
1861 Subject: [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b
1863 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1862 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1864 Message-Id: <e317db6a6f288748d1f6.315532867@
1863 Message-Id: <e317db6a6f288748d1f6.315532867@
1865 In-Reply-To: <patchbomb.315532860@
1864 In-Reply-To: <patchbomb.315532860@
1866 References: <patchbomb.315532860@
1865 References: <patchbomb.315532860@
1867 User-Agent: Mercurial-patchbomb
1866 User-Agent: Mercurial-patchbomb
1868 Date: Tue, 01 Jan 1980 00:01:07 +0000
1867 Date: Tue, 01 Jan 1980 00:01:07 +0000
1869 From: test
1868 From: test
1870 To: foo
1869 To: foo
1871
1870
1872 # HG changeset patch
1871 # HG changeset patch
1873 # User test
1872 # User test
1874 # Date 0 0
1873 # Date 0 0
1875 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1874 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1876 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1875 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1877 Added tag two, two.diff for changeset ff2c9fa2018b
1876 Added tag two, two.diff for changeset ff2c9fa2018b
1878
1877
1879 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1878 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1880 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1879 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1881 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1880 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1882 @@ -2,3 +2,5 @@
1881 @@ -2,3 +2,5 @@
1883 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1882 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1884 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1883 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1885 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1884 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1886 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1885 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1887 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1886 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1888
1887
1889 Displaying [PATCH 8 of 8] d ...
1888 Displaying [PATCH 8 of 8] d ...
1890 Content-Type: text/plain; charset="us-ascii"
1889 Content-Type: text/plain; charset="us-ascii"
1891 MIME-Version: 1.0
1890 MIME-Version: 1.0
1892 Content-Transfer-Encoding: 7bit
1891 Content-Transfer-Encoding: 7bit
1893 Subject: [PATCH 8 of 8] d
1892 Subject: [PATCH 8 of 8] d
1894 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1893 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1895 Message-Id: <2f9fa9b998c5fe3ac2bd.315532868@
1894 Message-Id: <2f9fa9b998c5fe3ac2bd.315532868@
1896 In-Reply-To: <patchbomb.315532860@
1895 In-Reply-To: <patchbomb.315532860@
1897 References: <patchbomb.315532860@
1896 References: <patchbomb.315532860@
1898 User-Agent: Mercurial-patchbomb
1897 User-Agent: Mercurial-patchbomb
1899 Date: Tue, 01 Jan 1980 00:01:08 +0000
1898 Date: Tue, 01 Jan 1980 00:01:08 +0000
1900 From: test
1899 From: test
1901 To: foo
1900 To: foo
1902
1901
1903 # HG changeset patch
1902 # HG changeset patch
1904 # User test
1903 # User test
1905 # Date 4 0
1904 # Date 4 0
1906 # Branch test
1905 # Branch test
1907 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1906 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1908 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1907 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1909 d
1908 d
1910
1909
1911 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
1910 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
1912 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1911 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1913 +++ b/d Thu Jan 01 00:00:04 1970 +0000
1912 +++ b/d Thu Jan 01 00:00:04 1970 +0000
1914 @@ -0,0 +1,1 @@
1913 @@ -0,0 +1,1 @@
1915 +d
1914 +d
1916
1915
1917 % dest#branch URIs
1916 % dest#branch URIs
1918 comparing with ../t
1917 comparing with ../t
1919 searching for changes
1918 searching for changes
1920 This patch series consists of 1 patches.
1919 This patch series consists of 1 patches.
1921
1920
1922
1921
1923 Displaying [PATCH] test ...
1922 Displaying [PATCH] test ...
1924 Content-Type: text/plain; charset="us-ascii"
1923 Content-Type: text/plain; charset="us-ascii"
1925 MIME-Version: 1.0
1924 MIME-Version: 1.0
1926 Content-Transfer-Encoding: 7bit
1925 Content-Transfer-Encoding: 7bit
1927 Subject: [PATCH] test
1926 Subject: [PATCH] test
1928 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1927 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1929 Message-Id: <2f9fa9b998c5fe3ac2bd.315532860@
1928 Message-Id: <2f9fa9b998c5fe3ac2bd.315532860@
1930 User-Agent: Mercurial-patchbomb
1929 User-Agent: Mercurial-patchbomb
1931 Date: Tue, 01 Jan 1980 00:01:00 +0000
1930 Date: Tue, 01 Jan 1980 00:01:00 +0000
1932 From: test
1931 From: test
1933 To: foo
1932 To: foo
1934
1933
1935 # HG changeset patch
1934 # HG changeset patch
1936 # User test
1935 # User test
1937 # Date 4 0
1936 # Date 4 0
1938 # Branch test
1937 # Branch test
1939 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1938 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
1940 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1939 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1941 d
1940 d
1942
1941
1943 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
1942 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
1944 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1943 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1945 +++ b/d Thu Jan 01 00:00:04 1970 +0000
1944 +++ b/d Thu Jan 01 00:00:04 1970 +0000
1946 @@ -0,0 +1,1 @@
1945 @@ -0,0 +1,1 @@
1947 +d
1946 +d
1948
1947
@@ -1,60 +1,59 b''
1 adding foo
1 adding foo
2 marked working directory as branch branchA
2 marked working directory as branch branchA
3 pulling from ../t
3 pulling from ../t
4 requesting all changes
4 requesting all changes
5 adding changesets
5 adding changesets
6 adding manifests
6 adding manifests
7 adding file changes
7 adding file changes
8 added 2 changesets with 2 changes to 1 files
8 added 2 changesets with 2 changes to 1 files
9 (run 'hg update' to get a working copy)
9 (run 'hg update' to get a working copy)
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 % create branch B
11 % create branch B
12 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 marked working directory as branch branchB
13 marked working directory as branch branchB
14 created new head
15 % a new branch is there
14 % a new branch is there
16 pulling from ../t
15 pulling from ../t
17 searching for changes
16 searching for changes
18 adding changesets
17 adding changesets
19 adding manifests
18 adding manifests
20 adding file changes
19 adding file changes
21 added 2 changesets with 2 changes to 1 files (+1 heads)
20 added 2 changesets with 2 changes to 1 files (+1 heads)
22 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
21 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
23 % develop both branch
22 % develop both branch
24 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
23 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
25 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
24 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
26 % should succeed, no new heads
25 % should succeed, no new heads
27 pulling from ../t
26 pulling from ../t
28 searching for changes
27 searching for changes
29 adding changesets
28 adding changesets
30 adding manifests
29 adding manifests
31 adding file changes
30 adding file changes
32 added 2 changesets with 2 changes to 1 files
31 added 2 changesets with 2 changes to 1 files
33 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
32 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
34 % add an head on other branch
33 % add an head on other branch
35 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
34 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
36 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
35 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
36 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
38 created new head
37 created new head
39 % should succeed only one head on our branch
38 % should succeed only one head on our branch
40 pulling from ../t
39 pulling from ../t
41 searching for changes
40 searching for changes
42 adding changesets
41 adding changesets
43 adding manifests
42 adding manifests
44 adding file changes
43 adding file changes
45 added 3 changesets with 3 changes to 1 files (+1 heads)
44 added 3 changesets with 3 changes to 1 files (+1 heads)
46 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
45 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
46 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 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
49 created new head
48 created new head
50 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
49 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
51 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
50 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
52 % should fail new head in our branch
51 % should fail new head in our branch
53 pulling from ../t
52 pulling from ../t
54 searching for changes
53 searching for changes
55 adding changesets
54 adding changesets
56 adding manifests
55 adding manifests
57 adding file changes
56 adding file changes
58 added 4 changesets with 4 changes to 1 files (+1 heads)
57 added 4 changesets with 4 changes to 1 files (+1 heads)
59 not updating, since new heads added
58 not updating, since new heads added
60 (run 'hg heads' to see heads, 'hg merge' to merge)
59 (run 'hg heads' to see heads, 'hg merge' to merge)
@@ -1,310 +1,310 b''
1 updating to branch default
1 updating to branch default
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 pushing to ../a
3 pushing to ../a
4 searching for changes
4 searching for changes
5 abort: push creates new remote heads on branch 'default'!
5 abort: push creates new remote heads on branch 'default'!
6 (you should pull and merge or use push -f to force)
6 (you should pull and merge or use push -f to force)
7 pulling from ../a
7 pulling from ../a
8 searching for changes
8 searching for changes
9 adding changesets
9 adding changesets
10 adding manifests
10 adding manifests
11 adding file changes
11 adding file changes
12 added 1 changesets with 1 changes to 1 files (+1 heads)
12 added 1 changesets with 1 changes to 1 files (+1 heads)
13 (run 'hg heads' to see heads, 'hg merge' to merge)
13 (run 'hg heads' to see heads, 'hg merge' to merge)
14 pushing to ../a
14 pushing to ../a
15 searching for changes
15 searching for changes
16 abort: push creates new remote heads on branch 'default'!
16 abort: push creates new remote heads on branch 'default'!
17 (did you forget to merge? use push -f to force)
17 (did you forget to merge? use push -f to force)
18 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
18 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
19 (branch merge, don't forget to commit)
19 (branch merge, don't forget to commit)
20 pushing to ../a
20 pushing to ../a
21 searching for changes
21 searching for changes
22 adding changesets
22 adding changesets
23 adding manifests
23 adding manifests
24 adding file changes
24 adding file changes
25 added 2 changesets with 1 changes to 1 files
25 added 2 changesets with 1 changes to 1 files
26 adding foo
26 adding foo
27 updating to branch default
27 updating to branch default
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
30 created new head
30 created new head
31 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
31 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
32 created new head
32 created new head
33 merging foo
33 merging foo
34 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
34 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
35 (branch merge, don't forget to commit)
35 (branch merge, don't forget to commit)
36 pushing to ../c
36 pushing to ../c
37 searching for changes
37 searching for changes
38 abort: push creates new remote heads on branch 'default'!
38 abort: push creates new remote heads on branch 'default'!
39 (did you forget to merge? use push -f to force)
39 (did you forget to merge? use push -f to force)
40 1
40 1
41 pushing to ../c
41 pushing to ../c
42 searching for changes
42 searching for changes
43 no changes found
43 no changes found
44 0
44 0
45 pushing to ../c
45 pushing to ../c
46 searching for changes
46 searching for changes
47 abort: push creates new remote heads on branch 'default'!
47 abort: push creates new remote heads on branch 'default'!
48 (did you forget to merge? use push -f to force)
48 (did you forget to merge? use push -f to force)
49 1
49 1
50 pushing to ../c
50 pushing to ../c
51 searching for changes
51 searching for changes
52 abort: push creates new remote heads on branch 'default'!
52 abort: push creates new remote heads on branch 'default'!
53 (did you forget to merge? use push -f to force)
53 (did you forget to merge? use push -f to force)
54 1
54 1
55 pushing to ../c
55 pushing to ../c
56 searching for changes
56 searching for changes
57 adding changesets
57 adding changesets
58 adding manifests
58 adding manifests
59 adding file changes
59 adding file changes
60 added 2 changesets with 2 changes to 1 files (+2 heads)
60 added 2 changesets with 2 changes to 1 files (+2 heads)
61 0
61 0
62 pushing to ../c
62 pushing to ../c
63 searching for changes
63 searching for changes
64 adding changesets
64 adding changesets
65 adding manifests
65 adding manifests
66 adding file changes
66 adding file changes
67 added 1 changesets with 1 changes to 1 files (-1 heads)
67 added 1 changesets with 1 changes to 1 files (-1 heads)
68 0
68 0
69 comparing with ../c
69 comparing with ../c
70 searching for changes
70 searching for changes
71 no changes found
71 no changes found
72 % issue 450
72 % issue 450
73 pushing to ../e
73 pushing to ../e
74 searching for changes
74 searching for changes
75 adding changesets
75 adding changesets
76 adding manifests
76 adding manifests
77 adding file changes
77 adding file changes
78 added 1 changesets with 1 changes to 1 files
78 added 1 changesets with 1 changes to 1 files
79 0
79 0
80 pushing to ../e
80 pushing to ../e
81 searching for changes
81 searching for changes
82 adding changesets
82 adding changesets
83 adding manifests
83 adding manifests
84 adding file changes
84 adding file changes
85 added 1 changesets with 1 changes to 1 files
85 added 1 changesets with 1 changes to 1 files
86 0
86 0
87 % issue 736
87 % issue 736
88 % push on existing branch and new branch
88 % push on existing branch and new branch
89 pushing to ../f
89 pushing to ../f
90 searching for changes
90 searching for changes
91 abort: push creates new remote branches: c!
91 abort: push creates new remote branches: c!
92 (use 'hg push -f' to force)
92 (use 'hg push -f' to force)
93 1
93 1
94 pushing to ../f
94 pushing to ../f
95 searching for changes
95 searching for changes
96 abort: push creates new remote branches: c!
96 abort: push creates new remote branches: c!
97 (use 'hg push -f' to force)
97 (use 'hg push -f' to force)
98 1
98 1
99 % multiple new branches
99 % multiple new branches
100 pushing to ../f
100 pushing to ../f
101 searching for changes
101 searching for changes
102 abort: push creates new remote branches: c, d!
102 abort: push creates new remote branches: c, d!
103 (use 'hg push -f' to force)
103 (use 'hg push -f' to force)
104 1
104 1
105 pushing to ../f
105 pushing to ../f
106 searching for changes
106 searching for changes
107 abort: push creates new remote branches: c, d!
107 abort: push creates new remote branches: c, d!
108 (use 'hg push -f' to force)
108 (use 'hg push -f' to force)
109 1
109 1
110 % fail on multiple head push
110 % fail on multiple head push
111 pushing to ../f
111 pushing to ../f
112 searching for changes
112 searching for changes
113 abort: push creates new remote heads on branch 'a'!
113 abort: push creates new remote heads on branch 'a'!
114 (did you forget to merge? use push -f to force)
114 (did you forget to merge? use push -f to force)
115 1
115 1
116 % push replacement head on existing branches
116 % push replacement head on existing branches
117 pushing to ../f
117 pushing to ../f
118 searching for changes
118 searching for changes
119 adding changesets
119 adding changesets
120 adding manifests
120 adding manifests
121 adding file changes
121 adding file changes
122 added 2 changesets with 2 changes to 1 files
122 added 2 changesets with 2 changes to 1 files
123 0
123 0
124 % merge of branch a to other branch b followed by unrelated push on branch a
124 % merge of branch a to other branch b followed by unrelated push on branch a
125 pushing to ../f
125 pushing to ../f
126 searching for changes
126 searching for changes
127 adding changesets
127 adding changesets
128 adding manifests
128 adding manifests
129 adding file changes
129 adding file changes
130 added 1 changesets with 1 changes to 1 files (-1 heads)
130 added 1 changesets with 1 changes to 1 files (-1 heads)
131 0
131 0
132 pushing to ../f
132 pushing to ../f
133 searching for changes
133 searching for changes
134 adding changesets
134 adding changesets
135 adding manifests
135 adding manifests
136 adding file changes
136 adding file changes
137 added 1 changesets with 1 changes to 1 files (+1 heads)
137 added 1 changesets with 1 changes to 1 files (+1 heads)
138 0
138 0
139 % cheating the counting algorithm
139 % cheating the counting algorithm
140 pushing to ../f
140 pushing to ../f
141 searching for changes
141 searching for changes
142 adding changesets
142 adding changesets
143 adding manifests
143 adding manifests
144 adding file changes
144 adding file changes
145 added 2 changesets with 2 changes to 1 files
145 added 2 changesets with 2 changes to 1 files
146 0
146 0
147 % checking prepush logic does not allow silently pushing multiple new heads
147 % checking prepush logic does not allow silently pushing multiple new heads
148 adding init
148 adding init
149 adding a
149 adding a
150 updating to branch default
150 updating to branch default
151 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
151 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
152 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
153 adding b
153 adding b
154 created new head
154 created new head
155 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
155 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
156 adding c
156 adding c
157 created new head
157 created new head
158 pushing to h
158 pushing to h
159 searching for changes
159 searching for changes
160 abort: push creates new remote heads on branch 'default'!
160 abort: push creates new remote heads on branch 'default'!
161 (you should pull and merge or use push -f to force)
161 (you should pull and merge or use push -f to force)
162
162
163 % check prepush logic with merged branches
163 % check prepush logic with merged branches
164 marked working directory as branch a
164 marked working directory as branch a
165 adding foo
165 adding foo
166 updating to branch a
166 updating to branch a
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
168 marked working directory as branch b
168 marked working directory as branch b
169 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
169 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
170 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
170 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
171 (branch merge, don't forget to commit)
171 (branch merge, don't forget to commit)
172 created new head
172 pushing to j
173 pushing to j
173 searching for changes
174 searching for changes
174 abort: push creates new remote branches: b!
175 abort: push creates new remote branches: b!
175 (use 'hg push -f' to force)
176 (use 'hg push -f' to force)
176
177
177 % prepush -r should not allow you to sneak in new heads
178 % prepush -r should not allow you to sneak in new heads
178 pushing to ../l
179 pushing to ../l
179 searching for changes
180 searching for changes
180 abort: push creates new remote heads on branch 'a'!
181 abort: push creates new remote heads on branch 'a'!
181 (did you forget to merge? use push -f to force)
182 (did you forget to merge? use push -f to force)
182 % check prepush with new branch head on former topo non-head
183 % check prepush with new branch head on former topo non-head
183 marked working directory as branch A
184 marked working directory as branch A
184 adding a
185 adding a
185 marked working directory as branch B
186 marked working directory as branch B
186 adding b
187 adding b
187 updating to branch B
188 updating to branch B
188 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
189 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
189 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
190 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
190 adding b1
191 adding b1
191 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
192 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
192 adding a2
193 adding a2
193 created new head
194 %% glog of local
194 %% glog of local
195 @ 2: A a2
195 @ 2: A a2
196 |
196 |
197 | o 1: B b
197 | o 1: B b
198 |/
198 |/
199 o 0: A a
199 o 0: A a
200
200
201 %% glog of remote
201 %% glog of remote
202 @ 2: B b1
202 @ 2: B b1
203 |
203 |
204 o 1: B b
204 o 1: B b
205 |
205 |
206 o 0: A a
206 o 0: A a
207
207
208 %% outgoing
208 %% outgoing
209 comparing with inner
209 comparing with inner
210 searching for changes
210 searching for changes
211 2: A a2
211 2: A a2
212 pushing to inner
212 pushing to inner
213 searching for changes
213 searching for changes
214 adding changesets
214 adding changesets
215 adding manifests
215 adding manifests
216 adding file changes
216 adding file changes
217 added 1 changesets with 1 changes to 1 files (+1 heads)
217 added 1 changesets with 1 changes to 1 files (+1 heads)
218 % check prepush with new branch head on former topo head
218 % check prepush with new branch head on former topo head
219 marked working directory as branch A
219 marked working directory as branch A
220 adding a
220 adding a
221 marked working directory as branch B
221 marked working directory as branch B
222 adding b
222 adding b
223 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
223 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
224 adding a1
224 adding a1
225 created new head
226 updating to branch A
225 updating to branch A
227 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
226 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
228 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
227 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
229 adding b1
228 adding b1
230 adding a2
229 adding a2
231 %% glog of local
230 %% glog of local
232 @ 3: A a2
231 @ 3: A a2
233 |
232 |
234 o 2: A a1
233 o 2: A a1
235 |
234 |
236 | o 1: B b
235 | o 1: B b
237 |/
236 |/
238 o 0: A a
237 o 0: A a
239
238
240 %% glog of remote
239 %% glog of remote
241 @ 3: B b1
240 @ 3: B b1
242 |
241 |
243 | o 2: A a1
242 | o 2: A a1
244 | |
243 | |
245 o | 1: B b
244 o | 1: B b
246 |/
245 |/
247 o 0: A a
246 o 0: A a
248
247
249 %% outgoing
248 %% outgoing
250 comparing with inner
249 comparing with inner
251 searching for changes
250 searching for changes
252 3: A a2
251 3: A a2
253 pushing to inner
252 pushing to inner
254 searching for changes
253 searching for changes
255 adding changesets
254 adding changesets
256 adding manifests
255 adding manifests
257 adding file changes
256 adding file changes
258 added 1 changesets with 1 changes to 1 files
257 added 1 changesets with 1 changes to 1 files
259 % check prepush with new branch head and new child of former branch head
258 % check prepush with new branch head and new child of former branch head
260 % but child is on different branch
259 % but child is on different branch
261 marked working directory as branch A
260 marked working directory as branch A
262 adding a
261 adding a
263 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
262 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
264 marked working directory as branch B
263 marked working directory as branch B
265 adding b
264 adding b
266 created new head
267 updating to branch B
265 updating to branch B
268 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
269 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
267 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
270 marked working directory as branch B
268 marked working directory as branch B
269 created new head
271 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
270 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
272 marked working directory as branch A
271 marked working directory as branch A
272 created new head
273 %% glog of local
273 %% glog of local
274 @ 5: A b3
274 @ 5: A b3
275 |
275 |
276 | o 4: B a3
276 | o 4: B a3
277 | |
277 | |
278 o | 3: B b1
278 o | 3: B b1
279 | |
279 | |
280 o | 2: B b0
280 o | 2: B b0
281 /
281 /
282 o 1: A a1
282 o 1: A a1
283 |
283 |
284 o 0: A a0
284 o 0: A a0
285
285
286 %% glog of remote
286 %% glog of remote
287 @ 3: B b1
287 @ 3: B b1
288 |
288 |
289 o 2: B b0
289 o 2: B b0
290
290
291 o 1: A a1
291 o 1: A a1
292 |
292 |
293 o 0: A a0
293 o 0: A a0
294
294
295 %% outgoing
295 %% outgoing
296 comparing with inner
296 comparing with inner
297 searching for changes
297 searching for changes
298 4: B a3
298 4: B a3
299 5: A b3
299 5: A b3
300 pushing to inner
300 pushing to inner
301 searching for changes
301 searching for changes
302 abort: push creates new remote heads on branch 'A'!
302 abort: push creates new remote heads on branch 'A'!
303 (did you forget to merge? use push -f to force)
303 (did you forget to merge? use push -f to force)
304 pushing to inner
304 pushing to inner
305 searching for changes
305 searching for changes
306 abort: push creates new remote heads on branch 'A'!
306 abort: push creates new remote heads on branch 'A'!
307 (did you forget to merge? use push -f to force)
307 (did you forget to merge? use push -f to force)
308 comparing with inner
308 comparing with inner
309 searching for changes
309 searching for changes
310 no changes found
310 no changes found
@@ -1,35 +1,34 b''
1 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
2 marked working directory as branch notdefault
2 marked working directory as branch notdefault
3 created new head
4 @ 4:r1:notdefault
3 @ 4:r1:notdefault
5 |
4 |
6 | o 3:l2:
5 | o 3:l2:
7 | |
6 | |
8 | o 2:l1:
7 | o 2:l1:
9 |/
8 |/
10 o 1:c2:
9 o 1:c2:
11 |
10 |
12 o 0:c1:
11 o 0:c1:
13
12
14
13
15 % Rebase a branch while preserving the branch name
14 % Rebase a branch while preserving the branch name
16 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
15 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
17 saving bundle to
16 saving bundle to
18 adding branch
17 adding branch
19 adding changesets
18 adding changesets
20 adding manifests
19 adding manifests
21 adding file changes
20 adding file changes
22 added 1 changesets with 1 changes to 1 files
21 added 1 changesets with 1 changes to 1 files
23 rebase completed
22 rebase completed
24 @ 4:r1:notdefault
23 @ 4:r1:notdefault
25 |
24 |
26 o 3:l2:
25 o 3:l2:
27 |
26 |
28 o 2:l1:
27 o 2:l1:
29 |
28 |
30 o 1:c2:
29 o 1:c2:
31 |
30 |
32 o 0:c1:
31 o 0:c1:
33
32
34 % dirstate branch should be "notdefault"
33 % dirstate branch should be "notdefault"
35 notdefault
34 notdefault
@@ -1,295 +1,295 b''
1 % first revision, no sub
1 % first revision, no sub
2 adding a
2 adding a
3 % add first sub
3 % add first sub
4 adding a
4 adding a
5 parent: 0:f7b1eb17ad24 tip
5 parent: 0:f7b1eb17ad24 tip
6 0
6 0
7 branch: default
7 branch: default
8 commit: 1 added, 1 subrepos
8 commit: 1 added, 1 subrepos
9 update: (current)
9 update: (current)
10 committing subrepository s
10 committing subrepository s
11 % add sub sub
11 % add sub sub
12 parent: 1:7cf8cfea66e4 tip
12 parent: 1:7cf8cfea66e4 tip
13 1
13 1
14 branch: default
14 branch: default
15 commit: 1 subrepos
15 commit: 1 subrepos
16 update: (current)
16 update: (current)
17 committing subrepository s
17 committing subrepository s
18 committing subrepository s/ss
18 committing subrepository s/ss
19 parent: 2:df30734270ae tip
19 parent: 2:df30734270ae tip
20 2
20 2
21 branch: default
21 branch: default
22 commit: (clean)
22 commit: (clean)
23 update: (current)
23 update: (current)
24 % bump sub rev
24 % bump sub rev
25 committing subrepository s
25 committing subrepository s
26 % leave sub dirty
26 % leave sub dirty
27 committing subrepository s
27 committing subrepository s
28 changeset: 3:1c833a7a9e3a
28 changeset: 3:1c833a7a9e3a
29 tag: tip
29 tag: tip
30 user: test
30 user: test
31 date: Thu Jan 01 00:00:00 1970 +0000
31 date: Thu Jan 01 00:00:00 1970 +0000
32 summary: 4
32 summary: 4
33
33
34 % check caching
34 % check caching
35 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
35 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
36 % restore
36 % restore
37 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
38 path s
38 path s
39 source s
39 source s
40 revision 1c833a7a9e3a4445c711aaf0f012379cd0d4034e
40 revision 1c833a7a9e3a4445c711aaf0f012379cd0d4034e
41 % new branch for merge tests
41 % new branch for merge tests
42 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
42 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
43 adding t/t
43 adding t/t
44 % 5
44 % 5
45 committing subrepository t
45 committing subrepository t
46 created new head
46 created new head
47 % 6
47 % 6
48 committing subrepository t
48 committing subrepository t
49 path s
49 path s
50 source s
50 source s
51 revision e4ece1bf43360ddc8f6a96432201a37b7cd27ae4
51 revision e4ece1bf43360ddc8f6a96432201a37b7cd27ae4
52 path t
52 path t
53 source t
53 source t
54 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
54 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
55 % 7
55 % 7
56 committing subrepository t
56 committing subrepository t
57 % 8
57 % 8
58 % merge tests
58 % merge tests
59 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
59 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
60 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
60 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 (branch merge, don't forget to commit)
61 (branch merge, don't forget to commit)
62 path s
62 path s
63 source s
63 source s
64 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
64 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
65 path t
65 path t
66 source t
66 source t
67 revision 60ca1237c19474e7a3978b0dc1ca4e6f36d51382
67 revision 60ca1237c19474e7a3978b0dc1ca4e6f36d51382
68 created new head
68 created new head
69 searching for copies back to rev 2
69 searching for copies back to rev 2
70 resolving manifests
70 resolving manifests
71 overwrite None partial False
71 overwrite None partial False
72 ancestor 1f14a2e2d3ec local f0d2028bf86d+ remote 1831e14459c4
72 ancestor 1f14a2e2d3ec local f0d2028bf86d+ remote 1831e14459c4
73 .hgsubstate: versions differ -> m
73 .hgsubstate: versions differ -> m
74 update: .hgsubstate 1/1 files (100.00%)
74 update: .hgsubstate 1/1 files (100.00%)
75 subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
75 subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
76 subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
76 subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
77 getting subrepo t
77 getting subrepo t
78 resolving manifests
78 resolving manifests
79 overwrite True partial False
79 overwrite True partial False
80 ancestor 60ca1237c194+ local 60ca1237c194+ remote 6747d179aa9a
80 ancestor 60ca1237c194+ local 60ca1237c194+ remote 6747d179aa9a
81 t: remote is newer -> g
81 t: remote is newer -> g
82 update: t 1/1 files (100.00%)
82 update: t 1/1 files (100.00%)
83 getting t
83 getting t
84 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
84 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
85 (branch merge, don't forget to commit)
85 (branch merge, don't forget to commit)
86 path s
86 path s
87 source s
87 source s
88 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
88 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
89 path t
89 path t
90 source t
90 source t
91 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
91 revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
92 committing subrepository t
92 committing subrepository t
93 created new head
93 searching for copies back to rev 2
94 searching for copies back to rev 2
94 resolving manifests
95 resolving manifests
95 overwrite None partial False
96 overwrite None partial False
96 ancestor 1831e14459c4 local e45c8b14af55+ remote f94576341bcf
97 ancestor 1831e14459c4 local e45c8b14af55+ remote f94576341bcf
97 .hgsubstate: versions differ -> m
98 .hgsubstate: versions differ -> m
98 update: .hgsubstate 1/1 files (100.00%)
99 update: .hgsubstate 1/1 files (100.00%)
99 subrepo merge e45c8b14af55+ f94576341bcf 1831e14459c4
100 subrepo merge e45c8b14af55+ f94576341bcf 1831e14459c4
100 subrepo t: both sides changed, merge with t:7af322bc1198a32402fe903e0b7ebcfc5c9bf8f4:hg
101 subrepo t: both sides changed, merge with t:7af322bc1198a32402fe903e0b7ebcfc5c9bf8f4:hg
101 merging subrepo t
102 merging subrepo t
102 searching for copies back to rev 2
103 searching for copies back to rev 2
103 resolving manifests
104 resolving manifests
104 overwrite None partial False
105 overwrite None partial False
105 ancestor 6747d179aa9a local 20a0db6fbf6c+ remote 7af322bc1198
106 ancestor 6747d179aa9a local 20a0db6fbf6c+ remote 7af322bc1198
106 t: versions differ -> m
107 t: versions differ -> m
107 preserving t for resolve of t
108 preserving t for resolve of t
108 update: t 1/1 files (100.00%)
109 update: t 1/1 files (100.00%)
109 picked tool 'internal:merge' for t (binary False symlink False)
110 picked tool 'internal:merge' for t (binary False symlink False)
110 merging t
111 merging t
111 my t@20a0db6fbf6c+ other t@7af322bc1198 ancestor t@6747d179aa9a
112 my t@20a0db6fbf6c+ other t@7af322bc1198 ancestor t@6747d179aa9a
112 warning: conflicts during merge.
113 warning: conflicts during merge.
113 merging t failed!
114 merging t failed!
114 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
115 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
115 use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
116 use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon
116 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
117 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
117 (branch merge, don't forget to commit)
118 (branch merge, don't forget to commit)
118 % should conflict
119 % should conflict
119 <<<<<<< local
120 <<<<<<< local
120 conflict
121 conflict
121 =======
122 =======
122 t3
123 t3
123 >>>>>>> other
124 >>>>>>> other
124 % clone
125 % clone
125 updating to branch default
126 updating to branch default
126 pulling subrepo s from .../sub/t/s
127 pulling subrepo s from .../sub/t/s
127 requesting all changes
128 requesting all changes
128 adding changesets
129 adding changesets
129 adding manifests
130 adding manifests
130 adding file changes
131 adding file changes
131 added 4 changesets with 5 changes to 3 files
132 added 4 changesets with 5 changes to 3 files
132 pulling subrepo s/ss from .../sub/t/s/ss
133 pulling subrepo s/ss from .../sub/t/s/ss
133 requesting all changes
134 requesting all changes
134 adding changesets
135 adding changesets
135 adding manifests
136 adding manifests
136 adding file changes
137 adding file changes
137 added 1 changesets with 1 changes to 1 files
138 added 1 changesets with 1 changes to 1 files
138 pulling subrepo t from .../sub/t/t
139 pulling subrepo t from .../sub/t/t
139 requesting all changes
140 requesting all changes
140 adding changesets
141 adding changesets
141 adding manifests
142 adding manifests
142 adding file changes
143 adding file changes
143 added 4 changesets with 4 changes to 1 files (+1 heads)
144 added 4 changesets with 4 changes to 1 files (+1 heads)
144 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
145 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
145 path s
146 path s
146 source s
147 source s
147 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
148 revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
148 path t
149 path t
149 source t
150 source t
150 revision 20a0db6fbf6c3d2836e6519a642ae929bfc67c0e
151 revision 20a0db6fbf6c3d2836e6519a642ae929bfc67c0e
151 % push
152 % push
152 committing subrepository t
153 committing subrepository t
153 pushing ...sub/t
154 pushing ...sub/t
154 pushing ...sub/t/s/ss
155 pushing ...sub/t/s/ss
155 searching for changes
156 searching for changes
156 no changes found
157 no changes found
157 pushing ...sub/t/s
158 pushing ...sub/t/s
158 searching for changes
159 searching for changes
159 no changes found
160 no changes found
160 pushing ...sub/t/t
161 pushing ...sub/t/t
161 searching for changes
162 searching for changes
162 adding changesets
163 adding changesets
163 adding manifests
164 adding manifests
164 adding file changes
165 adding file changes
165 added 1 changesets with 1 changes to 1 files
166 added 1 changesets with 1 changes to 1 files
166 searching for changes
167 searching for changes
167 adding changesets
168 adding changesets
168 adding manifests
169 adding manifests
169 adding file changes
170 adding file changes
170 added 1 changesets with 1 changes to 1 files
171 added 1 changesets with 1 changes to 1 files
171 % push -f
172 % push -f
172 committing subrepository s
173 committing subrepository s
173 abort: push creates new remote heads on branch 'default'!
174 abort: push creates new remote heads on branch 'default'!
174 pushing ...sub/t
175 pushing ...sub/t
175 pushing ...sub/t/s/ss
176 pushing ...sub/t/s/ss
176 searching for changes
177 searching for changes
177 no changes found
178 no changes found
178 pushing ...sub/t/s
179 pushing ...sub/t/s
179 searching for changes
180 searching for changes
180 (did you forget to merge? use push -f to force)
181 (did you forget to merge? use push -f to force)
181 pushing ...sub/t
182 pushing ...sub/t
182 pushing ...sub/t/s/ss
183 pushing ...sub/t/s/ss
183 searching for changes
184 searching for changes
184 no changes found
185 no changes found
185 pushing ...sub/t/s
186 pushing ...sub/t/s
186 searching for changes
187 searching for changes
187 adding changesets
188 adding changesets
188 adding manifests
189 adding manifests
189 adding file changes
190 adding file changes
190 added 1 changesets with 1 changes to 1 files (+1 heads)
191 added 1 changesets with 1 changes to 1 files (+1 heads)
191 pushing ...sub/t/t
192 pushing ...sub/t/t
192 searching for changes
193 searching for changes
193 no changes found
194 no changes found
194 searching for changes
195 searching for changes
195 adding changesets
196 adding changesets
196 adding manifests
197 adding manifests
197 adding file changes
198 adding file changes
198 added 1 changesets with 1 changes to 1 files
199 added 1 changesets with 1 changes to 1 files
199 % update
200 % update
200 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
201 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
201 committing subrepository t
202 committing subrepository t
202 % pull
203 % pull
203 pulling ...sub/t
204 pulling ...sub/t
204 searching for changes
205 searching for changes
205 adding changesets
206 adding changesets
206 adding manifests
207 adding manifests
207 adding file changes
208 adding file changes
208 added 1 changesets with 1 changes to 1 files
209 added 1 changesets with 1 changes to 1 files
209 (run 'hg update' to get a working copy)
210 (run 'hg update' to get a working copy)
210 pulling subrepo t from .../sub/t/t
211 pulling subrepo t from .../sub/t/t
211 searching for changes
212 searching for changes
212 adding changesets
213 adding changesets
213 adding manifests
214 adding manifests
214 adding file changes
215 adding file changes
215 added 1 changesets with 1 changes to 1 files
216 added 1 changesets with 1 changes to 1 files
216 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
217 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
217 blah
218 blah
218 % bogus subrepo path aborts
219 % bogus subrepo path aborts
219 abort: missing ] in subrepo source
220 abort: missing ] in subrepo source
220 % issue 1986
221 % issue 1986
221 adding a
222 adding a
222 marked working directory as branch br
223 marked working directory as branch br
223 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
224 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
224 adding b
225 adding b
225 created new head
226 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
226 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
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 created new head
229 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
230 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
230 adding c
231 adding c
231 created new head
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 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
233 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
234 (branch merge, don't forget to commit)
234 (branch merge, don't forget to commit)
235 created new head
235 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
236 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
236 adding .hgsub
237 adding .hgsub
237 committing subrepository s
238 committing subrepository s
238 marked working directory as branch br
239 marked working directory as branch br
239 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
240 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
240 adding b
241 adding b
241 committing subrepository s
242 committing subrepository s
242 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
243 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
243 adding c
244 adding c
244 created new head
245 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
245 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
246 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
246 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
247 (branch merge, don't forget to commit)
247 (branch merge, don't forget to commit)
248 created new head
248 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
249 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
249 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
250 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
250 adding d
251 adding d
251 committing subrepository s
252 committing subrepository s
252 created new head
253 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
253 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
254 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
255 adding e
255 adding e
256 committing subrepository s
256 committing subrepository s
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 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
258 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
259 (branch merge, don't forget to commit)
259 (branch merge, don't forget to commit)
260 % test subrepo delete from .hgsubstate
260 % test subrepo delete from .hgsubstate
261 adding testdelete/nested/foo
261 adding testdelete/nested/foo
262 adding testdelete/nested2/foo
262 adding testdelete/nested2/foo
263 adding testdelete/.hgsub
263 adding testdelete/.hgsub
264 committing subrepository nested2
264 committing subrepository nested2
265 committing subrepository nested
265 committing subrepository nested
266 nested
266 nested
267 % test repository cloning
267 % test repository cloning
268 adding nested_absolute/foo
268 adding nested_absolute/foo
269 adding nested_relative/foo2
269 adding nested_relative/foo2
270 adding main/.hgsub
270 adding main/.hgsub
271 committing subrepository nested_relative
271 committing subrepository nested_relative
272 committing subrepository nested_absolute
272 committing subrepository nested_absolute
273 updating to branch default
273 updating to branch default
274 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
274 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
275 [paths]
275 [paths]
276 default = $HGTMP/test-subrepo/sub/mercurial/nested_absolute
276 default = $HGTMP/test-subrepo/sub/mercurial/nested_absolute
277 [paths]
277 [paths]
278 default = $HGTMP/test-subrepo/sub/mercurial/nested_relative
278 default = $HGTMP/test-subrepo/sub/mercurial/nested_relative
279 % issue 1977
279 % issue 1977
280 adding a
280 adding a
281 adding .hgsub
281 adding .hgsub
282 committing subrepository s
282 committing subrepository s
283 updating to branch default
283 updating to branch default
284 pulling subrepo s from .../sub/repo/s
284 pulling subrepo s from .../sub/repo/s
285 requesting all changes
285 requesting all changes
286 adding changesets
286 adding changesets
287 adding manifests
287 adding manifests
288 adding file changes
288 adding file changes
289 added 1 changesets with 1 changes to 1 files
289 added 1 changesets with 1 changes to 1 files
290 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
290 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
292 created new head
292 created new head
293 committing subrepository s
293 committing subrepository s
294 abort: push creates new remote heads on branch 'default'!
294 abort: push creates new remote heads on branch 'default'!
295 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
295 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
General Comments 0
You need to be logged in to leave comments. Login now