##// END OF EJS Templates
tests: use (esc) markup for string-escape...
Mads Kiilerich -
r12941:b911cb80 stable
parent child Browse files
Show More
@@ -1,1100 +1,1110 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 #
2 #
3 # run-tests.py - Run a set of tests on Mercurial
3 # run-tests.py - Run a set of tests on Mercurial
4 #
4 #
5 # Copyright 2006 Matt Mackall <mpm@selenic.com>
5 # Copyright 2006 Matt Mackall <mpm@selenic.com>
6 #
6 #
7 # This software may be used and distributed according to the terms of the
7 # This software may be used and distributed according to the terms of the
8 # GNU General Public License version 2 or any later version.
8 # GNU General Public License version 2 or any later version.
9
9
10 # Modifying this script is tricky because it has many modes:
10 # Modifying this script is tricky because it has many modes:
11 # - serial (default) vs parallel (-jN, N > 1)
11 # - serial (default) vs parallel (-jN, N > 1)
12 # - no coverage (default) vs coverage (-c, -C, -s)
12 # - no coverage (default) vs coverage (-c, -C, -s)
13 # - temp install (default) vs specific hg script (--with-hg, --local)
13 # - temp install (default) vs specific hg script (--with-hg, --local)
14 # - tests are a mix of shell scripts and Python scripts
14 # - tests are a mix of shell scripts and Python scripts
15 #
15 #
16 # If you change this script, it is recommended that you ensure you
16 # If you change this script, it is recommended that you ensure you
17 # haven't broken it by running it in various modes with a representative
17 # haven't broken it by running it in various modes with a representative
18 # sample of test scripts. For example:
18 # sample of test scripts. For example:
19 #
19 #
20 # 1) serial, no coverage, temp install:
20 # 1) serial, no coverage, temp install:
21 # ./run-tests.py test-s*
21 # ./run-tests.py test-s*
22 # 2) serial, no coverage, local hg:
22 # 2) serial, no coverage, local hg:
23 # ./run-tests.py --local test-s*
23 # ./run-tests.py --local test-s*
24 # 3) serial, coverage, temp install:
24 # 3) serial, coverage, temp install:
25 # ./run-tests.py -c test-s*
25 # ./run-tests.py -c test-s*
26 # 4) serial, coverage, local hg:
26 # 4) serial, coverage, local hg:
27 # ./run-tests.py -c --local test-s* # unsupported
27 # ./run-tests.py -c --local test-s* # unsupported
28 # 5) parallel, no coverage, temp install:
28 # 5) parallel, no coverage, temp install:
29 # ./run-tests.py -j2 test-s*
29 # ./run-tests.py -j2 test-s*
30 # 6) parallel, no coverage, local hg:
30 # 6) parallel, no coverage, local hg:
31 # ./run-tests.py -j2 --local test-s*
31 # ./run-tests.py -j2 --local test-s*
32 # 7) parallel, coverage, temp install:
32 # 7) parallel, coverage, temp install:
33 # ./run-tests.py -j2 -c test-s* # currently broken
33 # ./run-tests.py -j2 -c test-s* # currently broken
34 # 8) parallel, coverage, local install:
34 # 8) parallel, coverage, local install:
35 # ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
35 # ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
36 # 9) parallel, custom tmp dir:
36 # 9) parallel, custom tmp dir:
37 # ./run-tests.py -j2 --tmpdir /tmp/myhgtests
37 # ./run-tests.py -j2 --tmpdir /tmp/myhgtests
38 #
38 #
39 # (You could use any subset of the tests: test-s* happens to match
39 # (You could use any subset of the tests: test-s* happens to match
40 # enough that it's worth doing parallel runs, few enough that it
40 # enough that it's worth doing parallel runs, few enough that it
41 # completes fairly quickly, includes both shell and Python scripts, and
41 # completes fairly quickly, includes both shell and Python scripts, and
42 # includes some scripts that run daemon processes.)
42 # includes some scripts that run daemon processes.)
43
43
44 from distutils import version
44 from distutils import version
45 import difflib
45 import difflib
46 import errno
46 import errno
47 import optparse
47 import optparse
48 import os
48 import os
49 import shutil
49 import shutil
50 import subprocess
50 import subprocess
51 import signal
51 import signal
52 import sys
52 import sys
53 import tempfile
53 import tempfile
54 import time
54 import time
55 import re
55 import re
56
56
57 closefds = os.name == 'posix'
57 closefds = os.name == 'posix'
58 def Popen4(cmd, bufsize=-1):
58 def Popen4(cmd, bufsize=-1):
59 p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
59 p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
60 close_fds=closefds,
60 close_fds=closefds,
61 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
61 stdin=subprocess.PIPE, stdout=subprocess.PIPE,
62 stderr=subprocess.STDOUT)
62 stderr=subprocess.STDOUT)
63 p.fromchild = p.stdout
63 p.fromchild = p.stdout
64 p.tochild = p.stdin
64 p.tochild = p.stdin
65 p.childerr = p.stderr
65 p.childerr = p.stderr
66 return p
66 return p
67
67
68 # reserved exit code to skip test (used by hghave)
68 # reserved exit code to skip test (used by hghave)
69 SKIPPED_STATUS = 80
69 SKIPPED_STATUS = 80
70 SKIPPED_PREFIX = 'skipped: '
70 SKIPPED_PREFIX = 'skipped: '
71 FAILED_PREFIX = 'hghave check failed: '
71 FAILED_PREFIX = 'hghave check failed: '
72 PYTHON = sys.executable
72 PYTHON = sys.executable
73 IMPL_PATH = 'PYTHONPATH'
73 IMPL_PATH = 'PYTHONPATH'
74 if 'java' in sys.platform:
74 if 'java' in sys.platform:
75 IMPL_PATH = 'JYTHONPATH'
75 IMPL_PATH = 'JYTHONPATH'
76
76
77 requiredtools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
77 requiredtools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
78
78
79 defaults = {
79 defaults = {
80 'jobs': ('HGTEST_JOBS', 1),
80 'jobs': ('HGTEST_JOBS', 1),
81 'timeout': ('HGTEST_TIMEOUT', 180),
81 'timeout': ('HGTEST_TIMEOUT', 180),
82 'port': ('HGTEST_PORT', 20059),
82 'port': ('HGTEST_PORT', 20059),
83 }
83 }
84
84
85 def parseargs():
85 def parseargs():
86 parser = optparse.OptionParser("%prog [options] [tests]")
86 parser = optparse.OptionParser("%prog [options] [tests]")
87
87
88 # keep these sorted
88 # keep these sorted
89 parser.add_option("--blacklist", action="append",
89 parser.add_option("--blacklist", action="append",
90 help="skip tests listed in the specified blacklist file")
90 help="skip tests listed in the specified blacklist file")
91 parser.add_option("-C", "--annotate", action="store_true",
91 parser.add_option("-C", "--annotate", action="store_true",
92 help="output files annotated with coverage")
92 help="output files annotated with coverage")
93 parser.add_option("--child", type="int",
93 parser.add_option("--child", type="int",
94 help="run as child process, summary to given fd")
94 help="run as child process, summary to given fd")
95 parser.add_option("-c", "--cover", action="store_true",
95 parser.add_option("-c", "--cover", action="store_true",
96 help="print a test coverage report")
96 help="print a test coverage report")
97 parser.add_option("-d", "--debug", action="store_true",
97 parser.add_option("-d", "--debug", action="store_true",
98 help="debug mode: write output of test scripts to console"
98 help="debug mode: write output of test scripts to console"
99 " rather than capturing and diff'ing it (disables timeout)")
99 " rather than capturing and diff'ing it (disables timeout)")
100 parser.add_option("-f", "--first", action="store_true",
100 parser.add_option("-f", "--first", action="store_true",
101 help="exit on the first test failure")
101 help="exit on the first test failure")
102 parser.add_option("--inotify", action="store_true",
102 parser.add_option("--inotify", action="store_true",
103 help="enable inotify extension when running tests")
103 help="enable inotify extension when running tests")
104 parser.add_option("-i", "--interactive", action="store_true",
104 parser.add_option("-i", "--interactive", action="store_true",
105 help="prompt to accept changed output")
105 help="prompt to accept changed output")
106 parser.add_option("-j", "--jobs", type="int",
106 parser.add_option("-j", "--jobs", type="int",
107 help="number of jobs to run in parallel"
107 help="number of jobs to run in parallel"
108 " (default: $%s or %d)" % defaults['jobs'])
108 " (default: $%s or %d)" % defaults['jobs'])
109 parser.add_option("--keep-tmpdir", action="store_true",
109 parser.add_option("--keep-tmpdir", action="store_true",
110 help="keep temporary directory after running tests")
110 help="keep temporary directory after running tests")
111 parser.add_option("-k", "--keywords",
111 parser.add_option("-k", "--keywords",
112 help="run tests matching keywords")
112 help="run tests matching keywords")
113 parser.add_option("-l", "--local", action="store_true",
113 parser.add_option("-l", "--local", action="store_true",
114 help="shortcut for --with-hg=<testdir>/../hg")
114 help="shortcut for --with-hg=<testdir>/../hg")
115 parser.add_option("-n", "--nodiff", action="store_true",
115 parser.add_option("-n", "--nodiff", action="store_true",
116 help="skip showing test changes")
116 help="skip showing test changes")
117 parser.add_option("-p", "--port", type="int",
117 parser.add_option("-p", "--port", type="int",
118 help="port on which servers should listen"
118 help="port on which servers should listen"
119 " (default: $%s or %d)" % defaults['port'])
119 " (default: $%s or %d)" % defaults['port'])
120 parser.add_option("--pure", action="store_true",
120 parser.add_option("--pure", action="store_true",
121 help="use pure Python code instead of C extensions")
121 help="use pure Python code instead of C extensions")
122 parser.add_option("-R", "--restart", action="store_true",
122 parser.add_option("-R", "--restart", action="store_true",
123 help="restart at last error")
123 help="restart at last error")
124 parser.add_option("-r", "--retest", action="store_true",
124 parser.add_option("-r", "--retest", action="store_true",
125 help="retest failed tests")
125 help="retest failed tests")
126 parser.add_option("-S", "--noskips", action="store_true",
126 parser.add_option("-S", "--noskips", action="store_true",
127 help="don't report skip tests verbosely")
127 help="don't report skip tests verbosely")
128 parser.add_option("-t", "--timeout", type="int",
128 parser.add_option("-t", "--timeout", type="int",
129 help="kill errant tests after TIMEOUT seconds"
129 help="kill errant tests after TIMEOUT seconds"
130 " (default: $%s or %d)" % defaults['timeout'])
130 " (default: $%s or %d)" % defaults['timeout'])
131 parser.add_option("--tmpdir", type="string",
131 parser.add_option("--tmpdir", type="string",
132 help="run tests in the given temporary directory"
132 help="run tests in the given temporary directory"
133 " (implies --keep-tmpdir)")
133 " (implies --keep-tmpdir)")
134 parser.add_option("-v", "--verbose", action="store_true",
134 parser.add_option("-v", "--verbose", action="store_true",
135 help="output verbose messages")
135 help="output verbose messages")
136 parser.add_option("--view", type="string",
136 parser.add_option("--view", type="string",
137 help="external diff viewer")
137 help="external diff viewer")
138 parser.add_option("--with-hg", type="string",
138 parser.add_option("--with-hg", type="string",
139 metavar="HG",
139 metavar="HG",
140 help="test using specified hg script rather than a "
140 help="test using specified hg script rather than a "
141 "temporary installation")
141 "temporary installation")
142 parser.add_option("-3", "--py3k-warnings", action="store_true",
142 parser.add_option("-3", "--py3k-warnings", action="store_true",
143 help="enable Py3k warnings on Python 2.6+")
143 help="enable Py3k warnings on Python 2.6+")
144
144
145 for option, default in defaults.items():
145 for option, default in defaults.items():
146 defaults[option] = int(os.environ.get(*default))
146 defaults[option] = int(os.environ.get(*default))
147 parser.set_defaults(**defaults)
147 parser.set_defaults(**defaults)
148 (options, args) = parser.parse_args()
148 (options, args) = parser.parse_args()
149
149
150 # jython is always pure
150 # jython is always pure
151 if 'java' in sys.platform or '__pypy__' in sys.modules:
151 if 'java' in sys.platform or '__pypy__' in sys.modules:
152 options.pure = True
152 options.pure = True
153
153
154 if options.with_hg:
154 if options.with_hg:
155 if not (os.path.isfile(options.with_hg) and
155 if not (os.path.isfile(options.with_hg) and
156 os.access(options.with_hg, os.X_OK)):
156 os.access(options.with_hg, os.X_OK)):
157 parser.error('--with-hg must specify an executable hg script')
157 parser.error('--with-hg must specify an executable hg script')
158 if not os.path.basename(options.with_hg) == 'hg':
158 if not os.path.basename(options.with_hg) == 'hg':
159 sys.stderr.write('warning: --with-hg should specify an hg script')
159 sys.stderr.write('warning: --with-hg should specify an hg script')
160 if options.local:
160 if options.local:
161 testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
161 testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
162 hgbin = os.path.join(os.path.dirname(testdir), 'hg')
162 hgbin = os.path.join(os.path.dirname(testdir), 'hg')
163 if not os.access(hgbin, os.X_OK):
163 if not os.access(hgbin, os.X_OK):
164 parser.error('--local specified, but %r not found or not executable'
164 parser.error('--local specified, but %r not found or not executable'
165 % hgbin)
165 % hgbin)
166 options.with_hg = hgbin
166 options.with_hg = hgbin
167
167
168 options.anycoverage = options.cover or options.annotate
168 options.anycoverage = options.cover or options.annotate
169 if options.anycoverage:
169 if options.anycoverage:
170 try:
170 try:
171 import coverage
171 import coverage
172 covver = version.StrictVersion(coverage.__version__).version
172 covver = version.StrictVersion(coverage.__version__).version
173 if covver < (3, 3):
173 if covver < (3, 3):
174 parser.error('coverage options require coverage 3.3 or later')
174 parser.error('coverage options require coverage 3.3 or later')
175 except ImportError:
175 except ImportError:
176 parser.error('coverage options now require the coverage package')
176 parser.error('coverage options now require the coverage package')
177
177
178 if options.anycoverage and options.local:
178 if options.anycoverage and options.local:
179 # this needs some path mangling somewhere, I guess
179 # this needs some path mangling somewhere, I guess
180 parser.error("sorry, coverage options do not work when --local "
180 parser.error("sorry, coverage options do not work when --local "
181 "is specified")
181 "is specified")
182
182
183 global vlog
183 global vlog
184 if options.verbose:
184 if options.verbose:
185 if options.jobs > 1 or options.child is not None:
185 if options.jobs > 1 or options.child is not None:
186 pid = "[%d]" % os.getpid()
186 pid = "[%d]" % os.getpid()
187 else:
187 else:
188 pid = None
188 pid = None
189 def vlog(*msg):
189 def vlog(*msg):
190 if pid:
190 if pid:
191 print pid,
191 print pid,
192 for m in msg:
192 for m in msg:
193 print m,
193 print m,
194 print
194 print
195 sys.stdout.flush()
195 sys.stdout.flush()
196 else:
196 else:
197 vlog = lambda *msg: None
197 vlog = lambda *msg: None
198
198
199 if options.tmpdir:
199 if options.tmpdir:
200 options.tmpdir = os.path.expanduser(options.tmpdir)
200 options.tmpdir = os.path.expanduser(options.tmpdir)
201
201
202 if options.jobs < 1:
202 if options.jobs < 1:
203 parser.error('--jobs must be positive')
203 parser.error('--jobs must be positive')
204 if options.interactive and options.jobs > 1:
204 if options.interactive and options.jobs > 1:
205 print '(--interactive overrides --jobs)'
205 print '(--interactive overrides --jobs)'
206 options.jobs = 1
206 options.jobs = 1
207 if options.interactive and options.debug:
207 if options.interactive and options.debug:
208 parser.error("-i/--interactive and -d/--debug are incompatible")
208 parser.error("-i/--interactive and -d/--debug are incompatible")
209 if options.debug:
209 if options.debug:
210 if options.timeout != defaults['timeout']:
210 if options.timeout != defaults['timeout']:
211 sys.stderr.write(
211 sys.stderr.write(
212 'warning: --timeout option ignored with --debug\n')
212 'warning: --timeout option ignored with --debug\n')
213 options.timeout = 0
213 options.timeout = 0
214 if options.py3k_warnings:
214 if options.py3k_warnings:
215 if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
215 if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
216 parser.error('--py3k-warnings can only be used on Python 2.6+')
216 parser.error('--py3k-warnings can only be used on Python 2.6+')
217 if options.blacklist:
217 if options.blacklist:
218 blacklist = dict()
218 blacklist = dict()
219 for filename in options.blacklist:
219 for filename in options.blacklist:
220 try:
220 try:
221 path = os.path.expanduser(os.path.expandvars(filename))
221 path = os.path.expanduser(os.path.expandvars(filename))
222 f = open(path, "r")
222 f = open(path, "r")
223 except IOError, err:
223 except IOError, err:
224 if err.errno != errno.ENOENT:
224 if err.errno != errno.ENOENT:
225 raise
225 raise
226 print "warning: no such blacklist file: %s" % filename
226 print "warning: no such blacklist file: %s" % filename
227 continue
227 continue
228
228
229 for line in f.readlines():
229 for line in f.readlines():
230 line = line.strip()
230 line = line.strip()
231 if line and not line.startswith('#'):
231 if line and not line.startswith('#'):
232 blacklist[line] = filename
232 blacklist[line] = filename
233
233
234 options.blacklist = blacklist
234 options.blacklist = blacklist
235
235
236 return (options, args)
236 return (options, args)
237
237
238 def rename(src, dst):
238 def rename(src, dst):
239 """Like os.rename(), trade atomicity and opened files friendliness
239 """Like os.rename(), trade atomicity and opened files friendliness
240 for existing destination support.
240 for existing destination support.
241 """
241 """
242 shutil.copy(src, dst)
242 shutil.copy(src, dst)
243 os.remove(src)
243 os.remove(src)
244
244
245 def splitnewlines(text):
245 def splitnewlines(text):
246 '''like str.splitlines, but only split on newlines.
246 '''like str.splitlines, but only split on newlines.
247 keep line endings.'''
247 keep line endings.'''
248 i = 0
248 i = 0
249 lines = []
249 lines = []
250 while True:
250 while True:
251 n = text.find('\n', i)
251 n = text.find('\n', i)
252 if n == -1:
252 if n == -1:
253 last = text[i:]
253 last = text[i:]
254 if last:
254 if last:
255 lines.append(last)
255 lines.append(last)
256 return lines
256 return lines
257 lines.append(text[i:n + 1])
257 lines.append(text[i:n + 1])
258 i = n + 1
258 i = n + 1
259
259
260 def parsehghaveoutput(lines):
260 def parsehghaveoutput(lines):
261 '''Parse hghave log lines.
261 '''Parse hghave log lines.
262 Return tuple of lists (missing, failed):
262 Return tuple of lists (missing, failed):
263 * the missing/unknown features
263 * the missing/unknown features
264 * the features for which existence check failed'''
264 * the features for which existence check failed'''
265 missing = []
265 missing = []
266 failed = []
266 failed = []
267 for line in lines:
267 for line in lines:
268 if line.startswith(SKIPPED_PREFIX):
268 if line.startswith(SKIPPED_PREFIX):
269 line = line.splitlines()[0]
269 line = line.splitlines()[0]
270 missing.append(line[len(SKIPPED_PREFIX):])
270 missing.append(line[len(SKIPPED_PREFIX):])
271 elif line.startswith(FAILED_PREFIX):
271 elif line.startswith(FAILED_PREFIX):
272 line = line.splitlines()[0]
272 line = line.splitlines()[0]
273 failed.append(line[len(FAILED_PREFIX):])
273 failed.append(line[len(FAILED_PREFIX):])
274
274
275 return missing, failed
275 return missing, failed
276
276
277 def showdiff(expected, output, ref, err):
277 def showdiff(expected, output, ref, err):
278 for line in difflib.unified_diff(expected, output, ref, err):
278 for line in difflib.unified_diff(expected, output, ref, err):
279 sys.stdout.write(line)
279 sys.stdout.write(line)
280
280
281 def findprogram(program):
281 def findprogram(program):
282 """Search PATH for a executable program"""
282 """Search PATH for a executable program"""
283 for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
283 for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
284 name = os.path.join(p, program)
284 name = os.path.join(p, program)
285 if os.access(name, os.X_OK):
285 if os.access(name, os.X_OK):
286 return name
286 return name
287 return None
287 return None
288
288
289 def checktools():
289 def checktools():
290 # Before we go any further, check for pre-requisite tools
290 # Before we go any further, check for pre-requisite tools
291 # stuff from coreutils (cat, rm, etc) are not tested
291 # stuff from coreutils (cat, rm, etc) are not tested
292 for p in requiredtools:
292 for p in requiredtools:
293 if os.name == 'nt':
293 if os.name == 'nt':
294 p += '.exe'
294 p += '.exe'
295 found = findprogram(p)
295 found = findprogram(p)
296 if found:
296 if found:
297 vlog("# Found prerequisite", p, "at", found)
297 vlog("# Found prerequisite", p, "at", found)
298 else:
298 else:
299 print "WARNING: Did not find prerequisite tool: "+p
299 print "WARNING: Did not find prerequisite tool: "+p
300
300
301 def killdaemons():
301 def killdaemons():
302 # Kill off any leftover daemon processes
302 # Kill off any leftover daemon processes
303 try:
303 try:
304 fp = open(DAEMON_PIDS)
304 fp = open(DAEMON_PIDS)
305 for line in fp:
305 for line in fp:
306 try:
306 try:
307 pid = int(line)
307 pid = int(line)
308 except ValueError:
308 except ValueError:
309 continue
309 continue
310 try:
310 try:
311 os.kill(pid, 0)
311 os.kill(pid, 0)
312 vlog('# Killing daemon process %d' % pid)
312 vlog('# Killing daemon process %d' % pid)
313 os.kill(pid, signal.SIGTERM)
313 os.kill(pid, signal.SIGTERM)
314 time.sleep(0.25)
314 time.sleep(0.25)
315 os.kill(pid, 0)
315 os.kill(pid, 0)
316 vlog('# Daemon process %d is stuck - really killing it' % pid)
316 vlog('# Daemon process %d is stuck - really killing it' % pid)
317 os.kill(pid, signal.SIGKILL)
317 os.kill(pid, signal.SIGKILL)
318 except OSError, err:
318 except OSError, err:
319 if err.errno != errno.ESRCH:
319 if err.errno != errno.ESRCH:
320 raise
320 raise
321 fp.close()
321 fp.close()
322 os.unlink(DAEMON_PIDS)
322 os.unlink(DAEMON_PIDS)
323 except IOError:
323 except IOError:
324 pass
324 pass
325
325
326 def cleanup(options):
326 def cleanup(options):
327 if not options.keep_tmpdir:
327 if not options.keep_tmpdir:
328 vlog("# Cleaning up HGTMP", HGTMP)
328 vlog("# Cleaning up HGTMP", HGTMP)
329 shutil.rmtree(HGTMP, True)
329 shutil.rmtree(HGTMP, True)
330
330
331 def usecorrectpython():
331 def usecorrectpython():
332 # some tests run python interpreter. they must use same
332 # some tests run python interpreter. they must use same
333 # interpreter we use or bad things will happen.
333 # interpreter we use or bad things will happen.
334 exedir, exename = os.path.split(sys.executable)
334 exedir, exename = os.path.split(sys.executable)
335 if exename == 'python':
335 if exename == 'python':
336 path = findprogram('python')
336 path = findprogram('python')
337 if os.path.dirname(path) == exedir:
337 if os.path.dirname(path) == exedir:
338 return
338 return
339 vlog('# Making python executable in test path use correct Python')
339 vlog('# Making python executable in test path use correct Python')
340 mypython = os.path.join(BINDIR, 'python')
340 mypython = os.path.join(BINDIR, 'python')
341 try:
341 try:
342 os.symlink(sys.executable, mypython)
342 os.symlink(sys.executable, mypython)
343 except AttributeError:
343 except AttributeError:
344 # windows fallback
344 # windows fallback
345 shutil.copyfile(sys.executable, mypython)
345 shutil.copyfile(sys.executable, mypython)
346 shutil.copymode(sys.executable, mypython)
346 shutil.copymode(sys.executable, mypython)
347
347
348 def installhg(options):
348 def installhg(options):
349 vlog("# Performing temporary installation of HG")
349 vlog("# Performing temporary installation of HG")
350 installerrs = os.path.join("tests", "install.err")
350 installerrs = os.path.join("tests", "install.err")
351 pure = options.pure and "--pure" or ""
351 pure = options.pure and "--pure" or ""
352
352
353 # Run installer in hg root
353 # Run installer in hg root
354 script = os.path.realpath(sys.argv[0])
354 script = os.path.realpath(sys.argv[0])
355 hgroot = os.path.dirname(os.path.dirname(script))
355 hgroot = os.path.dirname(os.path.dirname(script))
356 os.chdir(hgroot)
356 os.chdir(hgroot)
357 nohome = '--home=""'
357 nohome = '--home=""'
358 if os.name == 'nt':
358 if os.name == 'nt':
359 # The --home="" trick works only on OS where os.sep == '/'
359 # The --home="" trick works only on OS where os.sep == '/'
360 # because of a distutils convert_path() fast-path. Avoid it at
360 # because of a distutils convert_path() fast-path. Avoid it at
361 # least on Windows for now, deal with .pydistutils.cfg bugs
361 # least on Windows for now, deal with .pydistutils.cfg bugs
362 # when they happen.
362 # when they happen.
363 nohome = ''
363 nohome = ''
364 cmd = ('%s setup.py %s clean --all'
364 cmd = ('%s setup.py %s clean --all'
365 ' build --build-base="%s"'
365 ' build --build-base="%s"'
366 ' install --force --prefix="%s" --install-lib="%s"'
366 ' install --force --prefix="%s" --install-lib="%s"'
367 ' --install-scripts="%s" %s >%s 2>&1'
367 ' --install-scripts="%s" %s >%s 2>&1'
368 % (sys.executable, pure, os.path.join(HGTMP, "build"),
368 % (sys.executable, pure, os.path.join(HGTMP, "build"),
369 INST, PYTHONDIR, BINDIR, nohome, installerrs))
369 INST, PYTHONDIR, BINDIR, nohome, installerrs))
370 vlog("# Running", cmd)
370 vlog("# Running", cmd)
371 if os.system(cmd) == 0:
371 if os.system(cmd) == 0:
372 if not options.verbose:
372 if not options.verbose:
373 os.remove(installerrs)
373 os.remove(installerrs)
374 else:
374 else:
375 f = open(installerrs)
375 f = open(installerrs)
376 for line in f:
376 for line in f:
377 print line,
377 print line,
378 f.close()
378 f.close()
379 sys.exit(1)
379 sys.exit(1)
380 os.chdir(TESTDIR)
380 os.chdir(TESTDIR)
381
381
382 usecorrectpython()
382 usecorrectpython()
383
383
384 vlog("# Installing dummy diffstat")
384 vlog("# Installing dummy diffstat")
385 f = open(os.path.join(BINDIR, 'diffstat'), 'w')
385 f = open(os.path.join(BINDIR, 'diffstat'), 'w')
386 f.write('#!' + sys.executable + '\n'
386 f.write('#!' + sys.executable + '\n'
387 'import sys\n'
387 'import sys\n'
388 'files = 0\n'
388 'files = 0\n'
389 'for line in sys.stdin:\n'
389 'for line in sys.stdin:\n'
390 ' if line.startswith("diff "):\n'
390 ' if line.startswith("diff "):\n'
391 ' files += 1\n'
391 ' files += 1\n'
392 'sys.stdout.write("files patched: %d\\n" % files)\n')
392 'sys.stdout.write("files patched: %d\\n" % files)\n')
393 f.close()
393 f.close()
394 os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
394 os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
395
395
396 if options.py3k_warnings and not options.anycoverage:
396 if options.py3k_warnings and not options.anycoverage:
397 vlog("# Updating hg command to enable Py3k Warnings switch")
397 vlog("# Updating hg command to enable Py3k Warnings switch")
398 f = open(os.path.join(BINDIR, 'hg'), 'r')
398 f = open(os.path.join(BINDIR, 'hg'), 'r')
399 lines = [line.rstrip() for line in f]
399 lines = [line.rstrip() for line in f]
400 lines[0] += ' -3'
400 lines[0] += ' -3'
401 f.close()
401 f.close()
402 f = open(os.path.join(BINDIR, 'hg'), 'w')
402 f = open(os.path.join(BINDIR, 'hg'), 'w')
403 for line in lines:
403 for line in lines:
404 f.write(line + '\n')
404 f.write(line + '\n')
405 f.close()
405 f.close()
406
406
407 if options.anycoverage:
407 if options.anycoverage:
408 custom = os.path.join(TESTDIR, 'sitecustomize.py')
408 custom = os.path.join(TESTDIR, 'sitecustomize.py')
409 target = os.path.join(PYTHONDIR, 'sitecustomize.py')
409 target = os.path.join(PYTHONDIR, 'sitecustomize.py')
410 vlog('# Installing coverage trigger to %s' % target)
410 vlog('# Installing coverage trigger to %s' % target)
411 shutil.copyfile(custom, target)
411 shutil.copyfile(custom, target)
412 rc = os.path.join(TESTDIR, '.coveragerc')
412 rc = os.path.join(TESTDIR, '.coveragerc')
413 vlog('# Installing coverage rc to %s' % rc)
413 vlog('# Installing coverage rc to %s' % rc)
414 os.environ['COVERAGE_PROCESS_START'] = rc
414 os.environ['COVERAGE_PROCESS_START'] = rc
415 fn = os.path.join(INST, '..', '.coverage')
415 fn = os.path.join(INST, '..', '.coverage')
416 os.environ['COVERAGE_FILE'] = fn
416 os.environ['COVERAGE_FILE'] = fn
417
417
418 def outputcoverage(options):
418 def outputcoverage(options):
419
419
420 vlog('# Producing coverage report')
420 vlog('# Producing coverage report')
421 os.chdir(PYTHONDIR)
421 os.chdir(PYTHONDIR)
422
422
423 def covrun(*args):
423 def covrun(*args):
424 cmd = 'coverage %s' % ' '.join(args)
424 cmd = 'coverage %s' % ' '.join(args)
425 vlog('# Running: %s' % cmd)
425 vlog('# Running: %s' % cmd)
426 os.system(cmd)
426 os.system(cmd)
427
427
428 if options.child:
428 if options.child:
429 return
429 return
430
430
431 covrun('-c')
431 covrun('-c')
432 omit = ','.join([BINDIR, TESTDIR])
432 omit = ','.join([BINDIR, TESTDIR])
433 covrun('-i', '-r', '"--omit=%s"' % omit) # report
433 covrun('-i', '-r', '"--omit=%s"' % omit) # report
434 if options.annotate:
434 if options.annotate:
435 adir = os.path.join(TESTDIR, 'annotated')
435 adir = os.path.join(TESTDIR, 'annotated')
436 if not os.path.isdir(adir):
436 if not os.path.isdir(adir):
437 os.mkdir(adir)
437 os.mkdir(adir)
438 covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
438 covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
439
439
440 class Timeout(Exception):
440 class Timeout(Exception):
441 pass
441 pass
442
442
443 def alarmed(signum, frame):
443 def alarmed(signum, frame):
444 raise Timeout
444 raise Timeout
445
445
446 def pytest(test, options, replacements):
446 def pytest(test, options, replacements):
447 py3kswitch = options.py3k_warnings and ' -3' or ''
447 py3kswitch = options.py3k_warnings and ' -3' or ''
448 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
448 cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
449 vlog("# Running", cmd)
449 vlog("# Running", cmd)
450 return run(cmd, options, replacements)
450 return run(cmd, options, replacements)
451
451
452 def shtest(test, options, replacements):
452 def shtest(test, options, replacements):
453 cmd = '"%s"' % test
453 cmd = '"%s"' % test
454 vlog("# Running", cmd)
454 vlog("# Running", cmd)
455 return run(cmd, options, replacements)
455 return run(cmd, options, replacements)
456
456
457 needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
458 escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
459 escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
460 escapemap.update({'\\': '\\\\', '\r': r'\r'})
461 def escapef(m):
462 return escapemap[m.group(0)]
463 def stringescape(s):
464 return escapesub(escapef, s)
465
457 def tsttest(test, options, replacements):
466 def tsttest(test, options, replacements):
458 t = open(test)
467 t = open(test)
459 out = []
468 out = []
460 script = []
469 script = []
461 salt = "SALT" + str(time.time())
470 salt = "SALT" + str(time.time())
462
471
463 pos = prepos = -1
472 pos = prepos = -1
464 after = {}
473 after = {}
465 expected = {}
474 expected = {}
466 for n, l in enumerate(t):
475 for n, l in enumerate(t):
467 if not l.endswith('\n'):
476 if not l.endswith('\n'):
468 l += '\n'
477 l += '\n'
469 if l.startswith(' $ '): # commands
478 if l.startswith(' $ '): # commands
470 after.setdefault(pos, []).append(l)
479 after.setdefault(pos, []).append(l)
471 prepos = pos
480 prepos = pos
472 pos = n
481 pos = n
473 script.append('echo %s %s $?\n' % (salt, n))
482 script.append('echo %s %s $?\n' % (salt, n))
474 script.append(l[4:])
483 script.append(l[4:])
475 elif l.startswith(' > '): # continuations
484 elif l.startswith(' > '): # continuations
476 after.setdefault(prepos, []).append(l)
485 after.setdefault(prepos, []).append(l)
477 script.append(l[4:])
486 script.append(l[4:])
478 elif l.startswith(' '): # results
487 elif l.startswith(' '): # results
479 # queue up a list of expected results
488 # queue up a list of expected results
480 expected.setdefault(pos, []).append(l[2:])
489 expected.setdefault(pos, []).append(l[2:])
481 else:
490 else:
482 # non-command/result - queue up for merged output
491 # non-command/result - queue up for merged output
483 after.setdefault(pos, []).append(l)
492 after.setdefault(pos, []).append(l)
484
493
485 script.append('echo %s %s $?\n' % (salt, n + 1))
494 script.append('echo %s %s $?\n' % (salt, n + 1))
486
495
487 fd, name = tempfile.mkstemp(suffix='hg-tst')
496 fd, name = tempfile.mkstemp(suffix='hg-tst')
488
497
489 try:
498 try:
490 for l in script:
499 for l in script:
491 os.write(fd, l)
500 os.write(fd, l)
492 os.close(fd)
501 os.close(fd)
493
502
494 cmd = '/bin/sh "%s"' % name
503 cmd = '/bin/sh "%s"' % name
495 vlog("# Running", cmd)
504 vlog("# Running", cmd)
496 exitcode, output = run(cmd, options, replacements)
505 exitcode, output = run(cmd, options, replacements)
497 # do not merge output if skipped, return hghave message instead
506 # do not merge output if skipped, return hghave message instead
498 if exitcode == SKIPPED_STATUS:
507 if exitcode == SKIPPED_STATUS:
499 return exitcode, output
508 return exitcode, output
500 finally:
509 finally:
501 os.remove(name)
510 os.remove(name)
502
511
503 def rematch(el, l):
512 def rematch(el, l):
504 try:
513 try:
505 # ensure that the regex matches to the end of the string
514 # ensure that the regex matches to the end of the string
506 return re.match(el + r'\Z', l)
515 return re.match(el + r'\Z', l)
507 except re.error:
516 except re.error:
508 # el is an invalid regex
517 # el is an invalid regex
509 return False
518 return False
510
519
511 def globmatch(el, l):
520 def globmatch(el, l):
512 # The only supported special characters are * and ?. Escaping is
521 # The only supported special characters are * and ?. Escaping is
513 # supported.
522 # supported.
514 i, n = 0, len(el)
523 i, n = 0, len(el)
515 res = ''
524 res = ''
516 while i < n:
525 while i < n:
517 c = el[i]
526 c = el[i]
518 i += 1
527 i += 1
519 if c == '\\' and el[i] in '*?\\':
528 if c == '\\' and el[i] in '*?\\':
520 res += el[i - 1:i + 1]
529 res += el[i - 1:i + 1]
521 i += 1
530 i += 1
522 elif c == '*':
531 elif c == '*':
523 res += '.*'
532 res += '.*'
524 elif c == '?':
533 elif c == '?':
525 res += '.'
534 res += '.'
526 else:
535 else:
527 res += re.escape(c)
536 res += re.escape(c)
528 return rematch(res, l)
537 return rematch(res, l)
529
538
530 pos = -1
539 pos = -1
531 postout = []
540 postout = []
532 ret = 0
541 ret = 0
533 for n, l in enumerate(output):
542 for n, l in enumerate(output):
534 lout, lcmd = l, None
543 lout, lcmd = l, None
535 if salt in l:
544 if salt in l:
536 lout, lcmd = l.split(salt, 1)
545 lout, lcmd = l.split(salt, 1)
537
546
538 if lout:
547 if lout:
539 if lcmd:
548 if lcmd:
540 lout += ' (no-eol)\n'
549 lout += ' (no-eol)\n'
541
550
542 el = None
551 el = None
543 if pos in expected and expected[pos]:
552 if pos in expected and expected[pos]:
544 el = expected[pos].pop(0)
553 el = expected[pos].pop(0)
545
554
546 if el == lout: # perfect match (fast)
555 if el == lout: # perfect match (fast)
547 postout.append(" " + lout)
556 postout.append(" " + lout)
548 elif el and el.decode('string-escape') == l:
549 postout.append(" " + el) # \-escape match
550 elif (el and
557 elif (el and
551 (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', lout) or
558 (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', lout) or
552 el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', lout))):
559 el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', lout)) or
553 postout.append(" " + el) # fallback regex/glob match
560 el.endswith(" (esc)\n") and el.decode('string-escape') == l):
561 postout.append(" " + el) # fallback regex/glob/esc match
554 else:
562 else:
563 if needescape(lout):
564 lout = stringescape(lout.rstrip('\n')) + " (esc)\n"
555 postout.append(" " + lout) # let diff deal with it
565 postout.append(" " + lout) # let diff deal with it
556
566
557 if lcmd:
567 if lcmd:
558 # add on last return code
568 # add on last return code
559 ret = int(lcmd.split()[1])
569 ret = int(lcmd.split()[1])
560 if ret != 0:
570 if ret != 0:
561 postout.append(" [%s]\n" % ret)
571 postout.append(" [%s]\n" % ret)
562 if pos in after:
572 if pos in after:
563 postout += after.pop(pos)
573 postout += after.pop(pos)
564 pos = int(lcmd.split()[0])
574 pos = int(lcmd.split()[0])
565
575
566 if pos in after:
576 if pos in after:
567 postout += after.pop(pos)
577 postout += after.pop(pos)
568
578
569 return exitcode, postout
579 return exitcode, postout
570
580
571 def run(cmd, options, replacements):
581 def run(cmd, options, replacements):
572 """Run command in a sub-process, capturing the output (stdout and stderr).
582 """Run command in a sub-process, capturing the output (stdout and stderr).
573 Return a tuple (exitcode, output). output is None in debug mode."""
583 Return a tuple (exitcode, output). output is None in debug mode."""
574 # TODO: Use subprocess.Popen if we're running on Python 2.4
584 # TODO: Use subprocess.Popen if we're running on Python 2.4
575 if options.debug:
585 if options.debug:
576 proc = subprocess.Popen(cmd, shell=True)
586 proc = subprocess.Popen(cmd, shell=True)
577 ret = proc.wait()
587 ret = proc.wait()
578 return (ret, None)
588 return (ret, None)
579
589
580 if os.name == 'nt' or sys.platform.startswith('java'):
590 if os.name == 'nt' or sys.platform.startswith('java'):
581 tochild, fromchild = os.popen4(cmd)
591 tochild, fromchild = os.popen4(cmd)
582 tochild.close()
592 tochild.close()
583 output = fromchild.read()
593 output = fromchild.read()
584 ret = fromchild.close()
594 ret = fromchild.close()
585 if ret == None:
595 if ret == None:
586 ret = 0
596 ret = 0
587 else:
597 else:
588 proc = Popen4(cmd)
598 proc = Popen4(cmd)
589 def cleanup():
599 def cleanup():
590 os.kill(proc.pid, signal.SIGTERM)
600 os.kill(proc.pid, signal.SIGTERM)
591 ret = proc.wait()
601 ret = proc.wait()
592 if ret == 0:
602 if ret == 0:
593 ret = signal.SIGTERM << 8
603 ret = signal.SIGTERM << 8
594 killdaemons()
604 killdaemons()
595 return ret
605 return ret
596
606
597 try:
607 try:
598 output = ''
608 output = ''
599 proc.tochild.close()
609 proc.tochild.close()
600 output = proc.fromchild.read()
610 output = proc.fromchild.read()
601 ret = proc.wait()
611 ret = proc.wait()
602 if os.WIFEXITED(ret):
612 if os.WIFEXITED(ret):
603 ret = os.WEXITSTATUS(ret)
613 ret = os.WEXITSTATUS(ret)
604 except Timeout:
614 except Timeout:
605 vlog('# Process %d timed out - killing it' % proc.pid)
615 vlog('# Process %d timed out - killing it' % proc.pid)
606 ret = cleanup()
616 ret = cleanup()
607 output += ("\n### Abort: timeout after %d seconds.\n"
617 output += ("\n### Abort: timeout after %d seconds.\n"
608 % options.timeout)
618 % options.timeout)
609 except KeyboardInterrupt:
619 except KeyboardInterrupt:
610 vlog('# Handling keyboard interrupt')
620 vlog('# Handling keyboard interrupt')
611 cleanup()
621 cleanup()
612 raise
622 raise
613
623
614 for s, r in replacements:
624 for s, r in replacements:
615 output = re.sub(s, r, output)
625 output = re.sub(s, r, output)
616 return ret, splitnewlines(output)
626 return ret, splitnewlines(output)
617
627
618 def runone(options, test, skips, fails):
628 def runone(options, test, skips, fails):
619 '''tristate output:
629 '''tristate output:
620 None -> skipped
630 None -> skipped
621 True -> passed
631 True -> passed
622 False -> failed'''
632 False -> failed'''
623
633
624 def skip(msg):
634 def skip(msg):
625 if not options.verbose:
635 if not options.verbose:
626 skips.append((test, msg))
636 skips.append((test, msg))
627 else:
637 else:
628 print "\nSkipping %s: %s" % (testpath, msg)
638 print "\nSkipping %s: %s" % (testpath, msg)
629 return None
639 return None
630
640
631 def fail(msg):
641 def fail(msg):
632 fails.append((test, msg))
642 fails.append((test, msg))
633 if not options.nodiff:
643 if not options.nodiff:
634 print "\nERROR: %s %s" % (testpath, msg)
644 print "\nERROR: %s %s" % (testpath, msg)
635 return None
645 return None
636
646
637 vlog("# Test", test)
647 vlog("# Test", test)
638
648
639 # create a fresh hgrc
649 # create a fresh hgrc
640 hgrc = open(HGRCPATH, 'w+')
650 hgrc = open(HGRCPATH, 'w+')
641 hgrc.write('[ui]\n')
651 hgrc.write('[ui]\n')
642 hgrc.write('slash = True\n')
652 hgrc.write('slash = True\n')
643 hgrc.write('[defaults]\n')
653 hgrc.write('[defaults]\n')
644 hgrc.write('backout = -d "0 0"\n')
654 hgrc.write('backout = -d "0 0"\n')
645 hgrc.write('commit = -d "0 0"\n')
655 hgrc.write('commit = -d "0 0"\n')
646 hgrc.write('tag = -d "0 0"\n')
656 hgrc.write('tag = -d "0 0"\n')
647 if options.inotify:
657 if options.inotify:
648 hgrc.write('[extensions]\n')
658 hgrc.write('[extensions]\n')
649 hgrc.write('inotify=\n')
659 hgrc.write('inotify=\n')
650 hgrc.write('[inotify]\n')
660 hgrc.write('[inotify]\n')
651 hgrc.write('pidfile=%s\n' % DAEMON_PIDS)
661 hgrc.write('pidfile=%s\n' % DAEMON_PIDS)
652 hgrc.write('appendpid=True\n')
662 hgrc.write('appendpid=True\n')
653 hgrc.close()
663 hgrc.close()
654
664
655 testpath = os.path.join(TESTDIR, test)
665 testpath = os.path.join(TESTDIR, test)
656 ref = os.path.join(TESTDIR, test+".out")
666 ref = os.path.join(TESTDIR, test+".out")
657 err = os.path.join(TESTDIR, test+".err")
667 err = os.path.join(TESTDIR, test+".err")
658 if os.path.exists(err):
668 if os.path.exists(err):
659 os.remove(err) # Remove any previous output files
669 os.remove(err) # Remove any previous output files
660 try:
670 try:
661 tf = open(testpath)
671 tf = open(testpath)
662 firstline = tf.readline().rstrip()
672 firstline = tf.readline().rstrip()
663 tf.close()
673 tf.close()
664 except:
674 except:
665 firstline = ''
675 firstline = ''
666 lctest = test.lower()
676 lctest = test.lower()
667
677
668 if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
678 if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
669 runner = pytest
679 runner = pytest
670 elif lctest.endswith('.t'):
680 elif lctest.endswith('.t'):
671 runner = tsttest
681 runner = tsttest
672 ref = testpath
682 ref = testpath
673 else:
683 else:
674 # do not try to run non-executable programs
684 # do not try to run non-executable programs
675 if not os.access(testpath, os.X_OK):
685 if not os.access(testpath, os.X_OK):
676 return skip("not executable")
686 return skip("not executable")
677 runner = shtest
687 runner = shtest
678
688
679 # Make a tmp subdirectory to work in
689 # Make a tmp subdirectory to work in
680 testtmp = os.environ["TESTTMP"] = os.path.join(HGTMP, test)
690 testtmp = os.environ["TESTTMP"] = os.path.join(HGTMP, test)
681 os.mkdir(testtmp)
691 os.mkdir(testtmp)
682 os.chdir(testtmp)
692 os.chdir(testtmp)
683
693
684 if options.timeout > 0:
694 if options.timeout > 0:
685 signal.alarm(options.timeout)
695 signal.alarm(options.timeout)
686
696
687 ret, out = runner(testpath, options, [
697 ret, out = runner(testpath, options, [
688 (re.escape(testtmp), '$TESTTMP'),
698 (re.escape(testtmp), '$TESTTMP'),
689 (r':%s\b' % options.port, ':$HGPORT'),
699 (r':%s\b' % options.port, ':$HGPORT'),
690 (r':%s\b' % (options.port + 1), ':$HGPORT1'),
700 (r':%s\b' % (options.port + 1), ':$HGPORT1'),
691 (r':%s\b' % (options.port + 2), ':$HGPORT2'),
701 (r':%s\b' % (options.port + 2), ':$HGPORT2'),
692 ])
702 ])
693 vlog("# Ret was:", ret)
703 vlog("# Ret was:", ret)
694
704
695 if options.timeout > 0:
705 if options.timeout > 0:
696 signal.alarm(0)
706 signal.alarm(0)
697
707
698 mark = '.'
708 mark = '.'
699
709
700 skipped = (ret == SKIPPED_STATUS)
710 skipped = (ret == SKIPPED_STATUS)
701
711
702 # If we're not in --debug mode and reference output file exists,
712 # If we're not in --debug mode and reference output file exists,
703 # check test output against it.
713 # check test output against it.
704 if options.debug:
714 if options.debug:
705 refout = None # to match out == None
715 refout = None # to match out == None
706 elif os.path.exists(ref):
716 elif os.path.exists(ref):
707 f = open(ref, "r")
717 f = open(ref, "r")
708 refout = splitnewlines(f.read())
718 refout = splitnewlines(f.read())
709 f.close()
719 f.close()
710 else:
720 else:
711 refout = []
721 refout = []
712
722
713 if (ret != 0 or out != refout) and not skipped and not options.debug:
723 if (ret != 0 or out != refout) and not skipped and not options.debug:
714 # Save errors to a file for diagnosis
724 # Save errors to a file for diagnosis
715 f = open(err, "wb")
725 f = open(err, "wb")
716 for line in out:
726 for line in out:
717 f.write(line)
727 f.write(line)
718 f.close()
728 f.close()
719
729
720 if skipped:
730 if skipped:
721 mark = 's'
731 mark = 's'
722 if out is None: # debug mode: nothing to parse
732 if out is None: # debug mode: nothing to parse
723 missing = ['unknown']
733 missing = ['unknown']
724 failed = None
734 failed = None
725 else:
735 else:
726 missing, failed = parsehghaveoutput(out)
736 missing, failed = parsehghaveoutput(out)
727 if not missing:
737 if not missing:
728 missing = ['irrelevant']
738 missing = ['irrelevant']
729 if failed:
739 if failed:
730 fail("hghave failed checking for %s" % failed[-1])
740 fail("hghave failed checking for %s" % failed[-1])
731 skipped = False
741 skipped = False
732 else:
742 else:
733 skip(missing[-1])
743 skip(missing[-1])
734 elif out != refout:
744 elif out != refout:
735 mark = '!'
745 mark = '!'
736 if ret:
746 if ret:
737 fail("output changed and returned error code %d" % ret)
747 fail("output changed and returned error code %d" % ret)
738 else:
748 else:
739 fail("output changed")
749 fail("output changed")
740 if not options.nodiff:
750 if not options.nodiff:
741 if options.view:
751 if options.view:
742 os.system("%s %s %s" % (options.view, ref, err))
752 os.system("%s %s %s" % (options.view, ref, err))
743 else:
753 else:
744 showdiff(refout, out, ref, err)
754 showdiff(refout, out, ref, err)
745 ret = 1
755 ret = 1
746 elif ret:
756 elif ret:
747 mark = '!'
757 mark = '!'
748 fail("returned error code %d" % ret)
758 fail("returned error code %d" % ret)
749
759
750 if not options.verbose:
760 if not options.verbose:
751 sys.stdout.write(mark)
761 sys.stdout.write(mark)
752 sys.stdout.flush()
762 sys.stdout.flush()
753
763
754 killdaemons()
764 killdaemons()
755
765
756 os.chdir(TESTDIR)
766 os.chdir(TESTDIR)
757 if not options.keep_tmpdir:
767 if not options.keep_tmpdir:
758 shutil.rmtree(testtmp, True)
768 shutil.rmtree(testtmp, True)
759 if skipped:
769 if skipped:
760 return None
770 return None
761 return ret == 0
771 return ret == 0
762
772
763 _hgpath = None
773 _hgpath = None
764
774
765 def _gethgpath():
775 def _gethgpath():
766 """Return the path to the mercurial package that is actually found by
776 """Return the path to the mercurial package that is actually found by
767 the current Python interpreter."""
777 the current Python interpreter."""
768 global _hgpath
778 global _hgpath
769 if _hgpath is not None:
779 if _hgpath is not None:
770 return _hgpath
780 return _hgpath
771
781
772 cmd = '%s -c "import mercurial; print mercurial.__path__[0]"'
782 cmd = '%s -c "import mercurial; print mercurial.__path__[0]"'
773 pipe = os.popen(cmd % PYTHON)
783 pipe = os.popen(cmd % PYTHON)
774 try:
784 try:
775 _hgpath = pipe.read().strip()
785 _hgpath = pipe.read().strip()
776 finally:
786 finally:
777 pipe.close()
787 pipe.close()
778 return _hgpath
788 return _hgpath
779
789
780 def _checkhglib(verb):
790 def _checkhglib(verb):
781 """Ensure that the 'mercurial' package imported by python is
791 """Ensure that the 'mercurial' package imported by python is
782 the one we expect it to be. If not, print a warning to stderr."""
792 the one we expect it to be. If not, print a warning to stderr."""
783 expecthg = os.path.join(PYTHONDIR, 'mercurial')
793 expecthg = os.path.join(PYTHONDIR, 'mercurial')
784 actualhg = _gethgpath()
794 actualhg = _gethgpath()
785 if actualhg != expecthg:
795 if actualhg != expecthg:
786 sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
796 sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
787 ' (expected %s)\n'
797 ' (expected %s)\n'
788 % (verb, actualhg, expecthg))
798 % (verb, actualhg, expecthg))
789
799
790 def runchildren(options, tests):
800 def runchildren(options, tests):
791 if INST:
801 if INST:
792 installhg(options)
802 installhg(options)
793 _checkhglib("Testing")
803 _checkhglib("Testing")
794
804
795 optcopy = dict(options.__dict__)
805 optcopy = dict(options.__dict__)
796 optcopy['jobs'] = 1
806 optcopy['jobs'] = 1
797 del optcopy['blacklist']
807 del optcopy['blacklist']
798 if optcopy['with_hg'] is None:
808 if optcopy['with_hg'] is None:
799 optcopy['with_hg'] = os.path.join(BINDIR, "hg")
809 optcopy['with_hg'] = os.path.join(BINDIR, "hg")
800 optcopy.pop('anycoverage', None)
810 optcopy.pop('anycoverage', None)
801
811
802 opts = []
812 opts = []
803 for opt, value in optcopy.iteritems():
813 for opt, value in optcopy.iteritems():
804 name = '--' + opt.replace('_', '-')
814 name = '--' + opt.replace('_', '-')
805 if value is True:
815 if value is True:
806 opts.append(name)
816 opts.append(name)
807 elif value is not None:
817 elif value is not None:
808 opts.append(name + '=' + str(value))
818 opts.append(name + '=' + str(value))
809
819
810 tests.reverse()
820 tests.reverse()
811 jobs = [[] for j in xrange(options.jobs)]
821 jobs = [[] for j in xrange(options.jobs)]
812 while tests:
822 while tests:
813 for job in jobs:
823 for job in jobs:
814 if not tests:
824 if not tests:
815 break
825 break
816 job.append(tests.pop())
826 job.append(tests.pop())
817 fps = {}
827 fps = {}
818
828
819 for j, job in enumerate(jobs):
829 for j, job in enumerate(jobs):
820 if not job:
830 if not job:
821 continue
831 continue
822 rfd, wfd = os.pipe()
832 rfd, wfd = os.pipe()
823 childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
833 childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
824 childtmp = os.path.join(HGTMP, 'child%d' % j)
834 childtmp = os.path.join(HGTMP, 'child%d' % j)
825 childopts += ['--tmpdir', childtmp]
835 childopts += ['--tmpdir', childtmp]
826 cmdline = [PYTHON, sys.argv[0]] + opts + childopts + job
836 cmdline = [PYTHON, sys.argv[0]] + opts + childopts + job
827 vlog(' '.join(cmdline))
837 vlog(' '.join(cmdline))
828 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
838 fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
829 os.close(wfd)
839 os.close(wfd)
830 signal.signal(signal.SIGINT, signal.SIG_IGN)
840 signal.signal(signal.SIGINT, signal.SIG_IGN)
831 failures = 0
841 failures = 0
832 tested, skipped, failed = 0, 0, 0
842 tested, skipped, failed = 0, 0, 0
833 skips = []
843 skips = []
834 fails = []
844 fails = []
835 while fps:
845 while fps:
836 pid, status = os.wait()
846 pid, status = os.wait()
837 fp = fps.pop(pid)
847 fp = fps.pop(pid)
838 l = fp.read().splitlines()
848 l = fp.read().splitlines()
839 try:
849 try:
840 test, skip, fail = map(int, l[:3])
850 test, skip, fail = map(int, l[:3])
841 except ValueError:
851 except ValueError:
842 test, skip, fail = 0, 0, 0
852 test, skip, fail = 0, 0, 0
843 split = -fail or len(l)
853 split = -fail or len(l)
844 for s in l[3:split]:
854 for s in l[3:split]:
845 skips.append(s.split(" ", 1))
855 skips.append(s.split(" ", 1))
846 for s in l[split:]:
856 for s in l[split:]:
847 fails.append(s.split(" ", 1))
857 fails.append(s.split(" ", 1))
848 tested += test
858 tested += test
849 skipped += skip
859 skipped += skip
850 failed += fail
860 failed += fail
851 vlog('pid %d exited, status %d' % (pid, status))
861 vlog('pid %d exited, status %d' % (pid, status))
852 failures |= status
862 failures |= status
853 print
863 print
854 if not options.noskips:
864 if not options.noskips:
855 for s in skips:
865 for s in skips:
856 print "Skipped %s: %s" % (s[0], s[1])
866 print "Skipped %s: %s" % (s[0], s[1])
857 for s in fails:
867 for s in fails:
858 print "Failed %s: %s" % (s[0], s[1])
868 print "Failed %s: %s" % (s[0], s[1])
859
869
860 _checkhglib("Tested")
870 _checkhglib("Tested")
861 print "# Ran %d tests, %d skipped, %d failed." % (
871 print "# Ran %d tests, %d skipped, %d failed." % (
862 tested, skipped, failed)
872 tested, skipped, failed)
863
873
864 if options.anycoverage:
874 if options.anycoverage:
865 outputcoverage(options)
875 outputcoverage(options)
866 sys.exit(failures != 0)
876 sys.exit(failures != 0)
867
877
868 def runtests(options, tests):
878 def runtests(options, tests):
869 global DAEMON_PIDS, HGRCPATH
879 global DAEMON_PIDS, HGRCPATH
870 DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
880 DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
871 HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
881 HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
872
882
873 try:
883 try:
874 if INST:
884 if INST:
875 installhg(options)
885 installhg(options)
876 _checkhglib("Testing")
886 _checkhglib("Testing")
877
887
878 if options.timeout > 0:
888 if options.timeout > 0:
879 try:
889 try:
880 signal.signal(signal.SIGALRM, alarmed)
890 signal.signal(signal.SIGALRM, alarmed)
881 vlog('# Running each test with %d second timeout' %
891 vlog('# Running each test with %d second timeout' %
882 options.timeout)
892 options.timeout)
883 except AttributeError:
893 except AttributeError:
884 print 'WARNING: cannot run tests with timeouts'
894 print 'WARNING: cannot run tests with timeouts'
885 options.timeout = 0
895 options.timeout = 0
886
896
887 tested = 0
897 tested = 0
888 failed = 0
898 failed = 0
889 skipped = 0
899 skipped = 0
890
900
891 if options.restart:
901 if options.restart:
892 orig = list(tests)
902 orig = list(tests)
893 while tests:
903 while tests:
894 if os.path.exists(tests[0] + ".err"):
904 if os.path.exists(tests[0] + ".err"):
895 break
905 break
896 tests.pop(0)
906 tests.pop(0)
897 if not tests:
907 if not tests:
898 print "running all tests"
908 print "running all tests"
899 tests = orig
909 tests = orig
900
910
901 skips = []
911 skips = []
902 fails = []
912 fails = []
903
913
904 for test in tests:
914 for test in tests:
905 if options.blacklist:
915 if options.blacklist:
906 filename = options.blacklist.get(test)
916 filename = options.blacklist.get(test)
907 if filename is not None:
917 if filename is not None:
908 skips.append((test, "blacklisted (%s)" % filename))
918 skips.append((test, "blacklisted (%s)" % filename))
909 skipped += 1
919 skipped += 1
910 continue
920 continue
911
921
912 if options.retest and not os.path.exists(test + ".err"):
922 if options.retest and not os.path.exists(test + ".err"):
913 skipped += 1
923 skipped += 1
914 continue
924 continue
915
925
916 if options.keywords:
926 if options.keywords:
917 t = open(test).read().lower() + test.lower()
927 t = open(test).read().lower() + test.lower()
918 for k in options.keywords.lower().split():
928 for k in options.keywords.lower().split():
919 if k in t:
929 if k in t:
920 break
930 break
921 else:
931 else:
922 skipped += 1
932 skipped += 1
923 continue
933 continue
924
934
925 ret = runone(options, test, skips, fails)
935 ret = runone(options, test, skips, fails)
926 if ret is None:
936 if ret is None:
927 skipped += 1
937 skipped += 1
928 elif not ret:
938 elif not ret:
929 if options.interactive:
939 if options.interactive:
930 print "Accept this change? [n] ",
940 print "Accept this change? [n] ",
931 answer = sys.stdin.readline().strip()
941 answer = sys.stdin.readline().strip()
932 if answer.lower() in "y yes".split():
942 if answer.lower() in "y yes".split():
933 if test.endswith(".t"):
943 if test.endswith(".t"):
934 rename(test + ".err", test)
944 rename(test + ".err", test)
935 else:
945 else:
936 rename(test + ".err", test + ".out")
946 rename(test + ".err", test + ".out")
937 tested += 1
947 tested += 1
938 fails.pop()
948 fails.pop()
939 continue
949 continue
940 failed += 1
950 failed += 1
941 if options.first:
951 if options.first:
942 break
952 break
943 tested += 1
953 tested += 1
944
954
945 if options.child:
955 if options.child:
946 fp = os.fdopen(options.child, 'w')
956 fp = os.fdopen(options.child, 'w')
947 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
957 fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
948 for s in skips:
958 for s in skips:
949 fp.write("%s %s\n" % s)
959 fp.write("%s %s\n" % s)
950 for s in fails:
960 for s in fails:
951 fp.write("%s %s\n" % s)
961 fp.write("%s %s\n" % s)
952 fp.close()
962 fp.close()
953 else:
963 else:
954 print
964 print
955 for s in skips:
965 for s in skips:
956 print "Skipped %s: %s" % s
966 print "Skipped %s: %s" % s
957 for s in fails:
967 for s in fails:
958 print "Failed %s: %s" % s
968 print "Failed %s: %s" % s
959 _checkhglib("Tested")
969 _checkhglib("Tested")
960 print "# Ran %d tests, %d skipped, %d failed." % (
970 print "# Ran %d tests, %d skipped, %d failed." % (
961 tested, skipped, failed)
971 tested, skipped, failed)
962
972
963 if options.anycoverage:
973 if options.anycoverage:
964 outputcoverage(options)
974 outputcoverage(options)
965 except KeyboardInterrupt:
975 except KeyboardInterrupt:
966 failed = True
976 failed = True
967 print "\ninterrupted!"
977 print "\ninterrupted!"
968
978
969 if failed:
979 if failed:
970 sys.exit(1)
980 sys.exit(1)
971
981
972 def main():
982 def main():
973 (options, args) = parseargs()
983 (options, args) = parseargs()
974 if not options.child:
984 if not options.child:
975 os.umask(022)
985 os.umask(022)
976
986
977 checktools()
987 checktools()
978
988
979 if len(args) == 0:
989 if len(args) == 0:
980 args = os.listdir(".")
990 args = os.listdir(".")
981 args.sort()
991 args.sort()
982
992
983 tests = []
993 tests = []
984 skipped = []
994 skipped = []
985 for test in args:
995 for test in args:
986 if (test.startswith("test-") and '~' not in test and
996 if (test.startswith("test-") and '~' not in test and
987 ('.' not in test or test.endswith('.py') or
997 ('.' not in test or test.endswith('.py') or
988 test.endswith('.bat') or test.endswith('.t'))):
998 test.endswith('.bat') or test.endswith('.t'))):
989 if not os.path.exists(test):
999 if not os.path.exists(test):
990 skipped.append(test)
1000 skipped.append(test)
991 else:
1001 else:
992 tests.append(test)
1002 tests.append(test)
993 if not tests:
1003 if not tests:
994 for test in skipped:
1004 for test in skipped:
995 print 'Skipped %s: does not exist' % test
1005 print 'Skipped %s: does not exist' % test
996 print "# Ran 0 tests, %d skipped, 0 failed." % len(skipped)
1006 print "# Ran 0 tests, %d skipped, 0 failed." % len(skipped)
997 return
1007 return
998 tests = tests + skipped
1008 tests = tests + skipped
999
1009
1000 # Reset some environment variables to well-known values so that
1010 # Reset some environment variables to well-known values so that
1001 # the tests produce repeatable output.
1011 # the tests produce repeatable output.
1002 os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C'
1012 os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C'
1003 os.environ['TZ'] = 'GMT'
1013 os.environ['TZ'] = 'GMT'
1004 os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
1014 os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
1005 os.environ['CDPATH'] = ''
1015 os.environ['CDPATH'] = ''
1006 os.environ['COLUMNS'] = '80'
1016 os.environ['COLUMNS'] = '80'
1007 os.environ['GREP_OPTIONS'] = ''
1017 os.environ['GREP_OPTIONS'] = ''
1008 os.environ['http_proxy'] = ''
1018 os.environ['http_proxy'] = ''
1009
1019
1010 # unset env related to hooks
1020 # unset env related to hooks
1011 for k in os.environ.keys():
1021 for k in os.environ.keys():
1012 if k.startswith('HG_'):
1022 if k.startswith('HG_'):
1013 # can't remove on solaris
1023 # can't remove on solaris
1014 os.environ[k] = ''
1024 os.environ[k] = ''
1015 del os.environ[k]
1025 del os.environ[k]
1016
1026
1017 global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
1027 global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
1018 TESTDIR = os.environ["TESTDIR"] = os.getcwd()
1028 TESTDIR = os.environ["TESTDIR"] = os.getcwd()
1019 if options.tmpdir:
1029 if options.tmpdir:
1020 options.keep_tmpdir = True
1030 options.keep_tmpdir = True
1021 tmpdir = options.tmpdir
1031 tmpdir = options.tmpdir
1022 if os.path.exists(tmpdir):
1032 if os.path.exists(tmpdir):
1023 # Meaning of tmpdir has changed since 1.3: we used to create
1033 # Meaning of tmpdir has changed since 1.3: we used to create
1024 # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
1034 # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
1025 # tmpdir already exists.
1035 # tmpdir already exists.
1026 sys.exit("error: temp dir %r already exists" % tmpdir)
1036 sys.exit("error: temp dir %r already exists" % tmpdir)
1027
1037
1028 # Automatically removing tmpdir sounds convenient, but could
1038 # Automatically removing tmpdir sounds convenient, but could
1029 # really annoy anyone in the habit of using "--tmpdir=/tmp"
1039 # really annoy anyone in the habit of using "--tmpdir=/tmp"
1030 # or "--tmpdir=$HOME".
1040 # or "--tmpdir=$HOME".
1031 #vlog("# Removing temp dir", tmpdir)
1041 #vlog("# Removing temp dir", tmpdir)
1032 #shutil.rmtree(tmpdir)
1042 #shutil.rmtree(tmpdir)
1033 os.makedirs(tmpdir)
1043 os.makedirs(tmpdir)
1034 else:
1044 else:
1035 tmpdir = tempfile.mkdtemp('', 'hgtests.')
1045 tmpdir = tempfile.mkdtemp('', 'hgtests.')
1036 HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
1046 HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
1037 DAEMON_PIDS = None
1047 DAEMON_PIDS = None
1038 HGRCPATH = None
1048 HGRCPATH = None
1039
1049
1040 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
1050 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
1041 os.environ["HGMERGE"] = "internal:merge"
1051 os.environ["HGMERGE"] = "internal:merge"
1042 os.environ["HGUSER"] = "test"
1052 os.environ["HGUSER"] = "test"
1043 os.environ["HGENCODING"] = "ascii"
1053 os.environ["HGENCODING"] = "ascii"
1044 os.environ["HGENCODINGMODE"] = "strict"
1054 os.environ["HGENCODINGMODE"] = "strict"
1045 os.environ["HGPORT"] = str(options.port)
1055 os.environ["HGPORT"] = str(options.port)
1046 os.environ["HGPORT1"] = str(options.port + 1)
1056 os.environ["HGPORT1"] = str(options.port + 1)
1047 os.environ["HGPORT2"] = str(options.port + 2)
1057 os.environ["HGPORT2"] = str(options.port + 2)
1048
1058
1049 if options.with_hg:
1059 if options.with_hg:
1050 INST = None
1060 INST = None
1051 BINDIR = os.path.dirname(os.path.realpath(options.with_hg))
1061 BINDIR = os.path.dirname(os.path.realpath(options.with_hg))
1052
1062
1053 # This looks redundant with how Python initializes sys.path from
1063 # This looks redundant with how Python initializes sys.path from
1054 # the location of the script being executed. Needed because the
1064 # the location of the script being executed. Needed because the
1055 # "hg" specified by --with-hg is not the only Python script
1065 # "hg" specified by --with-hg is not the only Python script
1056 # executed in the test suite that needs to import 'mercurial'
1066 # executed in the test suite that needs to import 'mercurial'
1057 # ... which means it's not really redundant at all.
1067 # ... which means it's not really redundant at all.
1058 PYTHONDIR = BINDIR
1068 PYTHONDIR = BINDIR
1059 else:
1069 else:
1060 INST = os.path.join(HGTMP, "install")
1070 INST = os.path.join(HGTMP, "install")
1061 BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
1071 BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
1062 PYTHONDIR = os.path.join(INST, "lib", "python")
1072 PYTHONDIR = os.path.join(INST, "lib", "python")
1063
1073
1064 os.environ["BINDIR"] = BINDIR
1074 os.environ["BINDIR"] = BINDIR
1065 os.environ["PYTHON"] = PYTHON
1075 os.environ["PYTHON"] = PYTHON
1066
1076
1067 if not options.child:
1077 if not options.child:
1068 path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
1078 path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
1069 os.environ["PATH"] = os.pathsep.join(path)
1079 os.environ["PATH"] = os.pathsep.join(path)
1070
1080
1071 # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
1081 # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
1072 # can run .../tests/run-tests.py test-foo where test-foo
1082 # can run .../tests/run-tests.py test-foo where test-foo
1073 # adds an extension to HGRC
1083 # adds an extension to HGRC
1074 pypath = [PYTHONDIR, TESTDIR]
1084 pypath = [PYTHONDIR, TESTDIR]
1075 # We have to augment PYTHONPATH, rather than simply replacing
1085 # We have to augment PYTHONPATH, rather than simply replacing
1076 # it, in case external libraries are only available via current
1086 # it, in case external libraries are only available via current
1077 # PYTHONPATH. (In particular, the Subversion bindings on OS X
1087 # PYTHONPATH. (In particular, the Subversion bindings on OS X
1078 # are in /opt/subversion.)
1088 # are in /opt/subversion.)
1079 oldpypath = os.environ.get(IMPL_PATH)
1089 oldpypath = os.environ.get(IMPL_PATH)
1080 if oldpypath:
1090 if oldpypath:
1081 pypath.append(oldpypath)
1091 pypath.append(oldpypath)
1082 os.environ[IMPL_PATH] = os.pathsep.join(pypath)
1092 os.environ[IMPL_PATH] = os.pathsep.join(pypath)
1083
1093
1084 COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
1094 COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
1085
1095
1086 vlog("# Using TESTDIR", TESTDIR)
1096 vlog("# Using TESTDIR", TESTDIR)
1087 vlog("# Using HGTMP", HGTMP)
1097 vlog("# Using HGTMP", HGTMP)
1088 vlog("# Using PATH", os.environ["PATH"])
1098 vlog("# Using PATH", os.environ["PATH"])
1089 vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
1099 vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
1090
1100
1091 try:
1101 try:
1092 if len(tests) > 1 and options.jobs > 1:
1102 if len(tests) > 1 and options.jobs > 1:
1093 runchildren(options, tests)
1103 runchildren(options, tests)
1094 else:
1104 else:
1095 runtests(options, tests)
1105 runtests(options, tests)
1096 finally:
1106 finally:
1097 time.sleep(1)
1107 time.sleep(1)
1098 cleanup(options)
1108 cleanup(options)
1099
1109
1100 main()
1110 main()
@@ -1,137 +1,137 b''
1 Test alignment of multibyte characters
1 Test alignment of multibyte characters
2
2
3 $ HGENCODING=utf-8
3 $ HGENCODING=utf-8
4 $ export HGENCODING
4 $ export HGENCODING
5 $ hg init t
5 $ hg init t
6 $ cd t
6 $ cd t
7 $ python << EOF
7 $ python << EOF
8 > # (byte, width) = (6, 4)
8 > # (byte, width) = (6, 4)
9 > s = "\xe7\x9f\xad\xe5\x90\x8d"
9 > s = "\xe7\x9f\xad\xe5\x90\x8d"
10 > # (byte, width) = (7, 7): odd width is good for alignment test
10 > # (byte, width) = (7, 7): odd width is good for alignment test
11 > m = "MIDDLE_"
11 > m = "MIDDLE_"
12 > # (byte, width) = (18, 12)
12 > # (byte, width) = (18, 12)
13 > l = "\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d"
13 > l = "\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d"
14 > f = file('s', 'w'); f.write(s); f.close()
14 > f = file('s', 'w'); f.write(s); f.close()
15 > f = file('m', 'w'); f.write(m); f.close()
15 > f = file('m', 'w'); f.write(m); f.close()
16 > f = file('l', 'w'); f.write(l); f.close()
16 > f = file('l', 'w'); f.write(l); f.close()
17 > # instant extension to show list of options
17 > # instant extension to show list of options
18 > f = file('showoptlist.py', 'w'); f.write("""# encoding: utf-8
18 > f = file('showoptlist.py', 'w'); f.write("""# encoding: utf-8
19 > def showoptlist(ui, repo, *pats, **opts):
19 > def showoptlist(ui, repo, *pats, **opts):
20 > '''dummy command to show option descriptions'''
20 > '''dummy command to show option descriptions'''
21 > return 0
21 > return 0
22 > cmdtable = {
22 > cmdtable = {
23 > 'showoptlist':
23 > 'showoptlist':
24 > (showoptlist,
24 > (showoptlist,
25 > [('s', 'opt1', '', 'short width', '""" + s + """'),
25 > [('s', 'opt1', '', 'short width', '""" + s + """'),
26 > ('m', 'opt2', '', 'middle width', '""" + m + """'),
26 > ('m', 'opt2', '', 'middle width', '""" + m + """'),
27 > ('l', 'opt3', '', 'long width', '""" + l + """')
27 > ('l', 'opt3', '', 'long width', '""" + l + """')
28 > ],
28 > ],
29 > ""
29 > ""
30 > )
30 > )
31 > }
31 > }
32 > """)
32 > """)
33 > f.close()
33 > f.close()
34 > EOF
34 > EOF
35 $ S=`cat s`
35 $ S=`cat s`
36 $ M=`cat m`
36 $ M=`cat m`
37 $ L=`cat l`
37 $ L=`cat l`
38
38
39 alignment of option descriptions in help
39 alignment of option descriptions in help
40
40
41 $ cat <<EOF > .hg/hgrc
41 $ cat <<EOF > .hg/hgrc
42 > [extensions]
42 > [extensions]
43 > ja_ext = `pwd`/showoptlist.py
43 > ja_ext = `pwd`/showoptlist.py
44 > EOF
44 > EOF
45
45
46 check alignment of option descriptions in help
46 check alignment of option descriptions in help
47
47
48 $ hg help showoptlist
48 $ hg help showoptlist
49 hg showoptlist
49 hg showoptlist
50
50
51 dummy command to show option descriptions
51 dummy command to show option descriptions
52
52
53 options:
53 options:
54
54
55 -s --opt1 \xe7\x9f\xad\xe5\x90\x8d short width
55 -s --opt1 \xe7\x9f\xad\xe5\x90\x8d short width (esc)
56 -m --opt2 MIDDLE_ middle width
56 -m --opt2 MIDDLE_ middle width
57 -l --opt3 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d long width
57 -l --opt3 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d long width (esc)
58
58
59 use "hg -v help showoptlist" to show global options
59 use "hg -v help showoptlist" to show global options
60
60
61
61
62 $ rm -f s; touch s
62 $ rm -f s; touch s
63 $ rm -f m; touch m
63 $ rm -f m; touch m
64 $ rm -f l; touch l
64 $ rm -f l; touch l
65
65
66 add files
66 add files
67
67
68 $ cp s $S
68 $ cp s $S
69 $ hg add $S
69 $ hg add $S
70 $ cp m $M
70 $ cp m $M
71 $ hg add $M
71 $ hg add $M
72 $ cp l $L
72 $ cp l $L
73 $ hg add $L
73 $ hg add $L
74
74
75 commit(1)
75 commit(1)
76
76
77 $ echo 'first line(1)' >> s; cp s $S
77 $ echo 'first line(1)' >> s; cp s $S
78 $ echo 'first line(2)' >> m; cp m $M
78 $ echo 'first line(2)' >> m; cp m $M
79 $ echo 'first line(3)' >> l; cp l $L
79 $ echo 'first line(3)' >> l; cp l $L
80 $ hg commit -m 'first commit' -u $S
80 $ hg commit -m 'first commit' -u $S
81
81
82 commit(2)
82 commit(2)
83
83
84 $ echo 'second line(1)' >> s; cp s $S
84 $ echo 'second line(1)' >> s; cp s $S
85 $ echo 'second line(2)' >> m; cp m $M
85 $ echo 'second line(2)' >> m; cp m $M
86 $ echo 'second line(3)' >> l; cp l $L
86 $ echo 'second line(3)' >> l; cp l $L
87 $ hg commit -m 'second commit' -u $M
87 $ hg commit -m 'second commit' -u $M
88
88
89 commit(3)
89 commit(3)
90
90
91 $ echo 'third line(1)' >> s; cp s $S
91 $ echo 'third line(1)' >> s; cp s $S
92 $ echo 'third line(2)' >> m; cp m $M
92 $ echo 'third line(2)' >> m; cp m $M
93 $ echo 'third line(3)' >> l; cp l $L
93 $ echo 'third line(3)' >> l; cp l $L
94 $ hg commit -m 'third commit' -u $L
94 $ hg commit -m 'third commit' -u $L
95
95
96 check alignment of user names in annotate
96 check alignment of user names in annotate
97
97
98 $ hg annotate -u $M
98 $ hg annotate -u $M
99 \xe7\x9f\xad\xe5\x90\x8d: first line(2)
99 \xe7\x9f\xad\xe5\x90\x8d: first line(2) (esc)
100 MIDDLE_: second line(2)
100 MIDDLE_: second line(2)
101 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d: third line(2)
101 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d: third line(2) (esc)
102
102
103 check alignment of filenames in diffstat
103 check alignment of filenames in diffstat
104
104
105 $ hg diff -c tip --stat
105 $ hg diff -c tip --stat
106 MIDDLE_ | 1 +
106 MIDDLE_ | 1 +
107 \xe7\x9f\xad\xe5\x90\x8d | 1 +
107 \xe7\x9f\xad\xe5\x90\x8d | 1 + (esc)
108 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d | 1 +
108 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d | 1 + (esc)
109 3 files changed, 3 insertions(+), 0 deletions(-)
109 3 files changed, 3 insertions(+), 0 deletions(-)
110
110
111 add branches/tags
111 add branches/tags
112
112
113 $ hg branch $S
113 $ hg branch $S
114 marked working directory as branch \xe7\x9f\xad\xe5\x90\x8d
114 marked working directory as branch \xe7\x9f\xad\xe5\x90\x8d (esc)
115 $ hg tag $S
115 $ hg tag $S
116 $ hg branch $M
116 $ hg branch $M
117 marked working directory as branch MIDDLE_
117 marked working directory as branch MIDDLE_
118 $ hg tag $M
118 $ hg tag $M
119 $ hg branch $L
119 $ hg branch $L
120 marked working directory as branch \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d
120 marked working directory as branch \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
121 $ hg tag $L
121 $ hg tag $L
122
122
123 check alignment of branches
123 check alignment of branches
124
124
125 $ hg tags
125 $ hg tags
126 tip 5:d745ff46155b
126 tip 5:d745ff46155b
127 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19
127 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19 (esc)
128 MIDDLE_ 3:b06c5b6def9e
128 MIDDLE_ 3:b06c5b6def9e
129 \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8
129 \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8 (esc)
130
130
131 check alignment of tags
131 check alignment of tags
132
132
133 $ hg tags
133 $ hg tags
134 tip 5:d745ff46155b
134 tip 5:d745ff46155b
135 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19
135 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19 (esc)
136 MIDDLE_ 3:b06c5b6def9e
136 MIDDLE_ 3:b06c5b6def9e
137 \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8
137 \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8 (esc)
@@ -1,2153 +1,2153 b''
1 $ fixheaders()
1 $ fixheaders()
2 > {
2 > {
3 > sed -e 's/\(Message-Id:.*@\).*/\1/' \
3 > sed -e 's/\(Message-Id:.*@\).*/\1/' \
4 > -e 's/\(In-Reply-To:.*@\).*/\1/' \
4 > -e 's/\(In-Reply-To:.*@\).*/\1/' \
5 > -e 's/\(References:.*@\).*/\1/' \
5 > -e 's/\(References:.*@\).*/\1/' \
6 > -e 's/\(User-Agent:.*\)\/.*/\1/' \
6 > -e 's/\(User-Agent:.*\)\/.*/\1/' \
7 > -e 's/===.*/===/'
7 > -e 's/===.*/===/'
8 > }
8 > }
9 $ echo "[extensions]" >> $HGRCPATH
9 $ echo "[extensions]" >> $HGRCPATH
10 $ echo "patchbomb=" >> $HGRCPATH
10 $ echo "patchbomb=" >> $HGRCPATH
11
11
12 $ hg init t
12 $ hg init t
13 $ cd t
13 $ cd t
14 $ echo a > a
14 $ echo a > a
15 $ hg commit -Ama -d '1 0'
15 $ hg commit -Ama -d '1 0'
16 adding a
16 adding a
17
17
18 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -r tip
18 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -r tip
19 This patch series consists of 1 patches.
19 This patch series consists of 1 patches.
20
20
21
21
22 Displaying [PATCH] a ...
22 Displaying [PATCH] a ...
23 Content-Type: text/plain; charset="us-ascii"
23 Content-Type: text/plain; charset="us-ascii"
24 MIME-Version: 1.0
24 MIME-Version: 1.0
25 Content-Transfer-Encoding: 7bit
25 Content-Transfer-Encoding: 7bit
26 Subject: [PATCH] a
26 Subject: [PATCH] a
27 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
27 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
28 Message-Id: <8580ff50825a50c8f716.60@* (glob)
28 Message-Id: <8580ff50825a50c8f716.60@* (glob)
29 User-Agent: Mercurial-patchbomb/* (glob)
29 User-Agent: Mercurial-patchbomb/* (glob)
30 Date: Thu, 01 Jan 1970 00:01:00 +0000
30 Date: Thu, 01 Jan 1970 00:01:00 +0000
31 From: quux
31 From: quux
32 To: foo
32 To: foo
33 Cc: bar
33 Cc: bar
34
34
35 # HG changeset patch
35 # HG changeset patch
36 # User test
36 # User test
37 # Date 1 0
37 # Date 1 0
38 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
38 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
39 # Parent 0000000000000000000000000000000000000000
39 # Parent 0000000000000000000000000000000000000000
40 a
40 a
41
41
42 diff -r 000000000000 -r 8580ff50825a a
42 diff -r 000000000000 -r 8580ff50825a a
43 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
43 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
44 +++ b/a Thu Jan 01 00:00:01 1970 +0000
44 +++ b/a Thu Jan 01 00:00:01 1970 +0000
45 @@ -0,0 +1,1 @@
45 @@ -0,0 +1,1 @@
46 +a
46 +a
47
47
48
48
49 $ hg --config ui.interactive=1 email --confirm -n -f quux -t foo -c bar -r tip<<EOF
49 $ hg --config ui.interactive=1 email --confirm -n -f quux -t foo -c bar -r tip<<EOF
50 > n
50 > n
51 > EOF
51 > EOF
52 This patch series consists of 1 patches.
52 This patch series consists of 1 patches.
53
53
54
54
55 Final summary:
55 Final summary:
56
56
57 From: quux
57 From: quux
58 To: foo
58 To: foo
59 Cc: bar
59 Cc: bar
60 Subject: [PATCH] a
60 Subject: [PATCH] a
61 a | 1 +
61 a | 1 +
62 1 files changed, 1 insertions(+), 0 deletions(-)
62 1 files changed, 1 insertions(+), 0 deletions(-)
63
63
64 are you sure you want to send (yn)? abort: patchbomb canceled
64 are you sure you want to send (yn)? abort: patchbomb canceled
65 [255]
65 [255]
66
66
67 $ echo b > b
67 $ echo b > b
68 $ hg commit -Amb -d '2 0'
68 $ hg commit -Amb -d '2 0'
69 adding b
69 adding b
70
70
71 $ hg email --date '1970-1-1 0:2' -n -f quux -t foo -c bar -s test -r 0:tip
71 $ hg email --date '1970-1-1 0:2' -n -f quux -t foo -c bar -s test -r 0:tip
72 This patch series consists of 2 patches.
72 This patch series consists of 2 patches.
73
73
74
74
75 Write the introductory message for the patch series.
75 Write the introductory message for the patch series.
76
76
77
77
78 Displaying [PATCH 0 of 2] test ...
78 Displaying [PATCH 0 of 2] test ...
79 Content-Type: text/plain; charset="us-ascii"
79 Content-Type: text/plain; charset="us-ascii"
80 MIME-Version: 1.0
80 MIME-Version: 1.0
81 Content-Transfer-Encoding: 7bit
81 Content-Transfer-Encoding: 7bit
82 Subject: [PATCH 0 of 2] test
82 Subject: [PATCH 0 of 2] test
83 Message-Id: <patchbomb\.120@[^>]*> (re)
83 Message-Id: <patchbomb\.120@[^>]*> (re)
84 User-Agent: Mercurial-patchbomb/* (glob)
84 User-Agent: Mercurial-patchbomb/* (glob)
85 Date: Thu, 01 Jan 1970 00:02:00 +0000
85 Date: Thu, 01 Jan 1970 00:02:00 +0000
86 From: quux
86 From: quux
87 To: foo
87 To: foo
88 Cc: bar
88 Cc: bar
89
89
90
90
91 Displaying [PATCH 1 of 2] a ...
91 Displaying [PATCH 1 of 2] a ...
92 Content-Type: text/plain; charset="us-ascii"
92 Content-Type: text/plain; charset="us-ascii"
93 MIME-Version: 1.0
93 MIME-Version: 1.0
94 Content-Transfer-Encoding: 7bit
94 Content-Transfer-Encoding: 7bit
95 Subject: [PATCH 1 of 2] a
95 Subject: [PATCH 1 of 2] a
96 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
96 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
97 Message-Id: <8580ff50825a50c8f716\.121@[^>]*> (re)
97 Message-Id: <8580ff50825a50c8f716\.121@[^>]*> (re)
98 In-Reply-To: <patchbomb\.120@[^>]*> (re)
98 In-Reply-To: <patchbomb\.120@[^>]*> (re)
99 References: <patchbomb\.120@[^>]*> (re)
99 References: <patchbomb\.120@[^>]*> (re)
100 User-Agent: Mercurial-patchbomb/* (glob)
100 User-Agent: Mercurial-patchbomb/* (glob)
101 Date: Thu, 01 Jan 1970 00:02:01 +0000
101 Date: Thu, 01 Jan 1970 00:02:01 +0000
102 From: quux
102 From: quux
103 To: foo
103 To: foo
104 Cc: bar
104 Cc: bar
105
105
106 # HG changeset patch
106 # HG changeset patch
107 # User test
107 # User test
108 # Date 1 0
108 # Date 1 0
109 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
109 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
110 # Parent 0000000000000000000000000000000000000000
110 # Parent 0000000000000000000000000000000000000000
111 a
111 a
112
112
113 diff -r 000000000000 -r 8580ff50825a a
113 diff -r 000000000000 -r 8580ff50825a a
114 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
114 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
115 +++ b/a Thu Jan 01 00:00:01 1970 +0000
115 +++ b/a Thu Jan 01 00:00:01 1970 +0000
116 @@ -0,0 +1,1 @@
116 @@ -0,0 +1,1 @@
117 +a
117 +a
118
118
119 Displaying [PATCH 2 of 2] b ...
119 Displaying [PATCH 2 of 2] b ...
120 Content-Type: text/plain; charset="us-ascii"
120 Content-Type: text/plain; charset="us-ascii"
121 MIME-Version: 1.0
121 MIME-Version: 1.0
122 Content-Transfer-Encoding: 7bit
122 Content-Transfer-Encoding: 7bit
123 Subject: [PATCH 2 of 2] b
123 Subject: [PATCH 2 of 2] b
124 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
124 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
125 Message-Id: <97d72e5f12c7e84f8506\.122@[^>]*> (re)
125 Message-Id: <97d72e5f12c7e84f8506\.122@[^>]*> (re)
126 In-Reply-To: <patchbomb\.120@[^>]*> (re)
126 In-Reply-To: <patchbomb\.120@[^>]*> (re)
127 References: <patchbomb\.120@[^>]*> (re)
127 References: <patchbomb\.120@[^>]*> (re)
128 User-Agent: Mercurial-patchbomb/* (glob)
128 User-Agent: Mercurial-patchbomb/* (glob)
129 Date: Thu, 01 Jan 1970 00:02:02 +0000
129 Date: Thu, 01 Jan 1970 00:02:02 +0000
130 From: quux
130 From: quux
131 To: foo
131 To: foo
132 Cc: bar
132 Cc: bar
133
133
134 # HG changeset patch
134 # HG changeset patch
135 # User test
135 # User test
136 # Date 2 0
136 # Date 2 0
137 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
137 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
138 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
138 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
139 b
139 b
140
140
141 diff -r 8580ff50825a -r 97d72e5f12c7 b
141 diff -r 8580ff50825a -r 97d72e5f12c7 b
142 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
142 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
143 +++ b/b Thu Jan 01 00:00:02 1970 +0000
143 +++ b/b Thu Jan 01 00:00:02 1970 +0000
144 @@ -0,0 +1,1 @@
144 @@ -0,0 +1,1 @@
145 +b
145 +b
146
146
147
147
148 $ hg email -m test.mbox -f quux -t foo -c bar -s test 0:tip \
148 $ hg email -m test.mbox -f quux -t foo -c bar -s test 0:tip \
149 > --config extensions.progress= --config progress.assume-tty=1 \
149 > --config extensions.progress= --config progress.assume-tty=1 \
150 > --config progress.delay=0 --config progress.refresh=0
150 > --config progress.delay=0 --config progress.refresh=0
151 \rwriting [ ] 0/3\rwriting [ ] 0/3\r \r\r \r\rwriting [====================> ] 1/3\rwriting [====================> ] 1/3\r \r\r \r\rwriting [==========================================> ] 2/3\rwriting [==========================================> ] 2/3\r \rThis patch series consists of 2 patches.
151 \rwriting [ ] 0/3\rwriting [ ] 0/3\r \r\r \r\rwriting [====================> ] 1/3\rwriting [====================> ] 1/3\r \r\r \r\rwriting [==========================================> ] 2/3\rwriting [==========================================> ] 2/3\r \rThis patch series consists of 2 patches. (esc)
152
152
153
153
154 Write the introductory message for the patch series.
154 Write the introductory message for the patch series.
155
155
156
156
157 Writing [PATCH 0 of 2] test ...
157 Writing [PATCH 0 of 2] test ...
158 Writing [PATCH 1 of 2] a ...
158 Writing [PATCH 1 of 2] a ...
159 Writing [PATCH 2 of 2] b ...
159 Writing [PATCH 2 of 2] b ...
160
160
161 $ cd ..
161 $ cd ..
162
162
163 $ hg clone -q t t2
163 $ hg clone -q t t2
164 $ cd t2
164 $ cd t2
165 $ echo c > c
165 $ echo c > c
166 $ hg commit -Amc -d '3 0'
166 $ hg commit -Amc -d '3 0'
167 adding c
167 adding c
168
168
169 $ cat > description <<EOF
169 $ cat > description <<EOF
170 > a multiline
170 > a multiline
171 >
171 >
172 > description
172 > description
173 > EOF
173 > EOF
174
174
175
175
176 test bundle and description:
176 test bundle and description:
177 $ hg email --date '1970-1-1 0:3' -n -f quux -t foo \
177 $ hg email --date '1970-1-1 0:3' -n -f quux -t foo \
178 > -c bar -s test -r tip -b --desc description | fixheaders
178 > -c bar -s test -r tip -b --desc description | fixheaders
179 searching for changes
179 searching for changes
180 1 changesets found
180 1 changesets found
181
181
182 Displaying test ...
182 Displaying test ...
183 Content-Type: multipart/mixed; boundary="===
183 Content-Type: multipart/mixed; boundary="===
184 MIME-Version: 1.0
184 MIME-Version: 1.0
185 Subject: test
185 Subject: test
186 Message-Id: <patchbomb.180@
186 Message-Id: <patchbomb.180@
187 User-Agent: Mercurial-patchbomb
187 User-Agent: Mercurial-patchbomb
188 Date: Thu, 01 Jan 1970 00:03:00 +0000
188 Date: Thu, 01 Jan 1970 00:03:00 +0000
189 From: quux
189 From: quux
190 To: foo
190 To: foo
191 Cc: bar
191 Cc: bar
192
192
193 --===
193 --===
194 Content-Type: text/plain; charset="us-ascii"
194 Content-Type: text/plain; charset="us-ascii"
195 MIME-Version: 1.0
195 MIME-Version: 1.0
196 Content-Transfer-Encoding: 7bit
196 Content-Transfer-Encoding: 7bit
197
197
198 a multiline
198 a multiline
199
199
200 description
200 description
201
201
202 --===
202 --===
203 Content-Type: application/x-mercurial-bundle
203 Content-Type: application/x-mercurial-bundle
204 MIME-Version: 1.0
204 MIME-Version: 1.0
205 Content-Disposition: attachment; filename="bundle.hg"
205 Content-Disposition: attachment; filename="bundle.hg"
206 Content-Transfer-Encoding: base64
206 Content-Transfer-Encoding: base64
207
207
208 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
208 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
209 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
209 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
210 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
210 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
211 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
211 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
212 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
212 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
213 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
213 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
214 Q70eyNw=
214 Q70eyNw=
215 --===
215 --===
216
216
217 utf-8 patch:
217 utf-8 patch:
218 $ python -c 'fp = open("utf", "wb"); fp.write("h\xC3\xB6mma!\n"); fp.close();'
218 $ python -c 'fp = open("utf", "wb"); fp.write("h\xC3\xB6mma!\n"); fp.close();'
219 $ hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: base64'
219 $ hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: base64'
220 adding description
220 adding description
221 adding utf
221 adding utf
222
222
223 no mime encoding for email --test:
223 no mime encoding for email --test:
224 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | fixheaders > mailtest
224 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | fixheaders > mailtest
225
225
226 md5sum of 8-bit output:
226 md5sum of 8-bit output:
227 $ $TESTDIR/md5sum.py mailtest
227 $ $TESTDIR/md5sum.py mailtest
228 e726c29b3008e77994c7572563e57c34 mailtest
228 e726c29b3008e77994c7572563e57c34 mailtest
229
229
230 $ rm mailtest
230 $ rm mailtest
231
231
232 mime encoded mbox (base64):
232 mime encoded mbox (base64):
233 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
233 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
234 This patch series consists of 1 patches.
234 This patch series consists of 1 patches.
235
235
236
236
237 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
237 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
238
238
239 $ cat mbox
239 $ cat mbox
240 From quux Thu Jan 01 00:04:01 1970
240 From quux Thu Jan 01 00:04:01 1970
241 Content-Type: text/plain; charset="utf-8"
241 Content-Type: text/plain; charset="utf-8"
242 MIME-Version: 1.0
242 MIME-Version: 1.0
243 Content-Transfer-Encoding: base64
243 Content-Transfer-Encoding: base64
244 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
244 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
245 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
245 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
246 Message-Id: <c3c9e37db9f4fe4882cd.240@* (glob)
246 Message-Id: <c3c9e37db9f4fe4882cd.240@* (glob)
247 User-Agent: Mercurial-patchbomb/* (glob)
247 User-Agent: Mercurial-patchbomb/* (glob)
248 Date: Thu, 01 Jan 1970 00:04:00 +0000
248 Date: Thu, 01 Jan 1970 00:04:00 +0000
249 From: quux
249 From: quux
250 To: foo
250 To: foo
251 Cc: bar
251 Cc: bar
252
252
253 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
253 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
254 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
254 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
255 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
255 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
256 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
256 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
257 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
257 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
258 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
258 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
259 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
259 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
260 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
260 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
261 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
261 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
262 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
262 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
263
263
264
264
265 $ rm mbox
265 $ rm mbox
266
266
267 mime encoded mbox (quoted-printable):
267 mime encoded mbox (quoted-printable):
268 $ python -c 'fp = open("qp", "wb"); fp.write("%s\nfoo\n\nbar\n" % ("x" * 1024)); fp.close();'
268 $ python -c 'fp = open("qp", "wb"); fp.write("%s\nfoo\n\nbar\n" % ("x" * 1024)); fp.close();'
269 $ hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: quoted-printable'
269 $ hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: quoted-printable'
270 adding qp
270 adding qp
271
271
272 no mime encoding for email --test:
272 no mime encoding for email --test:
273 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | \
273 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | \
274 > fixheaders > mailtest
274 > fixheaders > mailtest
275 md5sum of qp output:
275 md5sum of qp output:
276 $ $TESTDIR/md5sum.py mailtest
276 $ $TESTDIR/md5sum.py mailtest
277 0402c7d033e04044e423bb04816f9dae mailtest
277 0402c7d033e04044e423bb04816f9dae mailtest
278 $ rm mailtest
278 $ rm mailtest
279
279
280 mime encoded mbox (quoted-printable):
280 mime encoded mbox (quoted-printable):
281 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
281 $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
282 This patch series consists of 1 patches.
282 This patch series consists of 1 patches.
283
283
284
284
285 Writing [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable ...
285 Writing [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable ...
286 $ cat mbox | fixheaders
286 $ cat mbox | fixheaders
287 From quux Thu Jan 01 00:04:01 1970
287 From quux Thu Jan 01 00:04:01 1970
288 Content-Type: text/plain; charset="us-ascii"
288 Content-Type: text/plain; charset="us-ascii"
289 MIME-Version: 1.0
289 MIME-Version: 1.0
290 Content-Transfer-Encoding: quoted-printable
290 Content-Transfer-Encoding: quoted-printable
291 Subject: [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable
291 Subject: [PATCH] charset=utf-8; content-transfer-encoding: quoted-printable
292 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
292 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
293 Message-Id: <c655633f8c87700bb38c.240@
293 Message-Id: <c655633f8c87700bb38c.240@
294 User-Agent: Mercurial-patchbomb
294 User-Agent: Mercurial-patchbomb
295 Date: Thu, 01 Jan 1970 00:04:00 +0000
295 Date: Thu, 01 Jan 1970 00:04:00 +0000
296 From: quux
296 From: quux
297 To: foo
297 To: foo
298 Cc: bar
298 Cc: bar
299
299
300 # HG changeset patch
300 # HG changeset patch
301 # User test
301 # User test
302 # Date 4 0
302 # Date 4 0
303 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
303 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
304 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
304 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
305 charset=3Dutf-8; content-transfer-encoding: quoted-printable
305 charset=3Dutf-8; content-transfer-encoding: quoted-printable
306
306
307 diff -r c3c9e37db9f4 -r c655633f8c87 qp
307 diff -r c3c9e37db9f4 -r c655633f8c87 qp
308 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
308 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
309 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
309 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
310 @@ -0,0 +1,4 @@
310 @@ -0,0 +1,4 @@
311 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
311 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
312 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
312 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
313 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
313 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
314 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
314 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
315 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
315 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
316 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
316 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
317 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
317 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
318 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
318 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
319 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
319 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
320 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
320 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
321 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
321 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
322 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
322 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
323 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
323 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
324 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
324 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
325 +foo
325 +foo
326 +
326 +
327 +bar
327 +bar
328
328
329
329
330
330
331 $ rm mbox
331 $ rm mbox
332
332
333 iso-8859-1 patch:
333 iso-8859-1 patch:
334 $ python -c 'fp = open("isolatin", "wb"); fp.write("h\xF6mma!\n"); fp.close();'
334 $ python -c 'fp = open("isolatin", "wb"); fp.write("h\xF6mma!\n"); fp.close();'
335 $ hg commit -A -d '5 0' -m 'charset=us-ascii; content-transfer-encoding: 8bit'
335 $ hg commit -A -d '5 0' -m 'charset=us-ascii; content-transfer-encoding: 8bit'
336 adding isolatin
336 adding isolatin
337
337
338 fake ascii mbox:
338 fake ascii mbox:
339 $ hg email --date '1970-1-1 0:5' -f quux -t foo -c bar -r tip -m mbox
339 $ hg email --date '1970-1-1 0:5' -f quux -t foo -c bar -r tip -m mbox
340 This patch series consists of 1 patches.
340 This patch series consists of 1 patches.
341
341
342
342
343 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
343 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
344 $ fixheaders < mbox > mboxfix
344 $ fixheaders < mbox > mboxfix
345
345
346 md5sum of 8-bit output:
346 md5sum of 8-bit output:
347 $ $TESTDIR/md5sum.py mboxfix
347 $ $TESTDIR/md5sum.py mboxfix
348 9ea043d8fc43a71045114508baed144b mboxfix
348 9ea043d8fc43a71045114508baed144b mboxfix
349
349
350 test diffstat for single patch:
350 test diffstat for single patch:
351 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y -r 2 | \
351 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y -r 2 | \
352 > fixheaders
352 > fixheaders
353 This patch series consists of 1 patches.
353 This patch series consists of 1 patches.
354
354
355
355
356 Final summary:
356 Final summary:
357
357
358 From: quux
358 From: quux
359 To: foo
359 To: foo
360 Cc: bar
360 Cc: bar
361 Subject: [PATCH] test
361 Subject: [PATCH] test
362 c | 1 +
362 c | 1 +
363 1 files changed, 1 insertions(+), 0 deletions(-)
363 1 files changed, 1 insertions(+), 0 deletions(-)
364
364
365 are you sure you want to send (yn)? y
365 are you sure you want to send (yn)? y
366
366
367 Displaying [PATCH] test ...
367 Displaying [PATCH] test ...
368 Content-Type: text/plain; charset="us-ascii"
368 Content-Type: text/plain; charset="us-ascii"
369 MIME-Version: 1.0
369 MIME-Version: 1.0
370 Content-Transfer-Encoding: 7bit
370 Content-Transfer-Encoding: 7bit
371 Subject: [PATCH] test
371 Subject: [PATCH] test
372 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
372 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
373 Message-Id: <ff2c9fa2018b15fa74b3.60@
373 Message-Id: <ff2c9fa2018b15fa74b3.60@
374 User-Agent: Mercurial-patchbomb
374 User-Agent: Mercurial-patchbomb
375 Date: Thu, 01 Jan 1970 00:01:00 +0000
375 Date: Thu, 01 Jan 1970 00:01:00 +0000
376 From: quux
376 From: quux
377 To: foo
377 To: foo
378 Cc: bar
378 Cc: bar
379
379
380 c | 1 +
380 c | 1 +
381 1 files changed, 1 insertions(+), 0 deletions(-)
381 1 files changed, 1 insertions(+), 0 deletions(-)
382
382
383
383
384 # HG changeset patch
384 # HG changeset patch
385 # User test
385 # User test
386 # Date 3 0
386 # Date 3 0
387 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
387 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
388 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
388 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
389 c
389 c
390
390
391 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
391 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
392 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
392 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
393 +++ b/c Thu Jan 01 00:00:03 1970 +0000
393 +++ b/c Thu Jan 01 00:00:03 1970 +0000
394 @@ -0,0 +1,1 @@
394 @@ -0,0 +1,1 @@
395 +c
395 +c
396
396
397
397
398 test diffstat for multiple patches:
398 test diffstat for multiple patches:
399 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y \
399 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y \
400 > -r 0:1 | fixheaders
400 > -r 0:1 | fixheaders
401 This patch series consists of 2 patches.
401 This patch series consists of 2 patches.
402
402
403
403
404 Write the introductory message for the patch series.
404 Write the introductory message for the patch series.
405
405
406
406
407 Final summary:
407 Final summary:
408
408
409 From: quux
409 From: quux
410 To: foo
410 To: foo
411 Cc: bar
411 Cc: bar
412 Subject: [PATCH 0 of 2] test
412 Subject: [PATCH 0 of 2] test
413 a | 1 +
413 a | 1 +
414 b | 1 +
414 b | 1 +
415 2 files changed, 2 insertions(+), 0 deletions(-)
415 2 files changed, 2 insertions(+), 0 deletions(-)
416 Subject: [PATCH 1 of 2] a
416 Subject: [PATCH 1 of 2] a
417 a | 1 +
417 a | 1 +
418 1 files changed, 1 insertions(+), 0 deletions(-)
418 1 files changed, 1 insertions(+), 0 deletions(-)
419 Subject: [PATCH 2 of 2] b
419 Subject: [PATCH 2 of 2] b
420 b | 1 +
420 b | 1 +
421 1 files changed, 1 insertions(+), 0 deletions(-)
421 1 files changed, 1 insertions(+), 0 deletions(-)
422
422
423 are you sure you want to send (yn)? y
423 are you sure you want to send (yn)? y
424
424
425 Displaying [PATCH 0 of 2] test ...
425 Displaying [PATCH 0 of 2] test ...
426 Content-Type: text/plain; charset="us-ascii"
426 Content-Type: text/plain; charset="us-ascii"
427 MIME-Version: 1.0
427 MIME-Version: 1.0
428 Content-Transfer-Encoding: 7bit
428 Content-Transfer-Encoding: 7bit
429 Subject: [PATCH 0 of 2] test
429 Subject: [PATCH 0 of 2] test
430 Message-Id: <patchbomb.60@
430 Message-Id: <patchbomb.60@
431 User-Agent: Mercurial-patchbomb
431 User-Agent: Mercurial-patchbomb
432 Date: Thu, 01 Jan 1970 00:01:00 +0000
432 Date: Thu, 01 Jan 1970 00:01:00 +0000
433 From: quux
433 From: quux
434 To: foo
434 To: foo
435 Cc: bar
435 Cc: bar
436
436
437
437
438 a | 1 +
438 a | 1 +
439 b | 1 +
439 b | 1 +
440 2 files changed, 2 insertions(+), 0 deletions(-)
440 2 files changed, 2 insertions(+), 0 deletions(-)
441
441
442 Displaying [PATCH 1 of 2] a ...
442 Displaying [PATCH 1 of 2] a ...
443 Content-Type: text/plain; charset="us-ascii"
443 Content-Type: text/plain; charset="us-ascii"
444 MIME-Version: 1.0
444 MIME-Version: 1.0
445 Content-Transfer-Encoding: 7bit
445 Content-Transfer-Encoding: 7bit
446 Subject: [PATCH 1 of 2] a
446 Subject: [PATCH 1 of 2] a
447 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
447 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
448 Message-Id: <8580ff50825a50c8f716.61@
448 Message-Id: <8580ff50825a50c8f716.61@
449 In-Reply-To: <patchbomb.60@
449 In-Reply-To: <patchbomb.60@
450 References: <patchbomb.60@
450 References: <patchbomb.60@
451 User-Agent: Mercurial-patchbomb
451 User-Agent: Mercurial-patchbomb
452 Date: Thu, 01 Jan 1970 00:01:01 +0000
452 Date: Thu, 01 Jan 1970 00:01:01 +0000
453 From: quux
453 From: quux
454 To: foo
454 To: foo
455 Cc: bar
455 Cc: bar
456
456
457 a | 1 +
457 a | 1 +
458 1 files changed, 1 insertions(+), 0 deletions(-)
458 1 files changed, 1 insertions(+), 0 deletions(-)
459
459
460
460
461 # HG changeset patch
461 # HG changeset patch
462 # User test
462 # User test
463 # Date 1 0
463 # Date 1 0
464 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
464 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
465 # Parent 0000000000000000000000000000000000000000
465 # Parent 0000000000000000000000000000000000000000
466 a
466 a
467
467
468 diff -r 000000000000 -r 8580ff50825a a
468 diff -r 000000000000 -r 8580ff50825a a
469 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
469 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
470 +++ b/a Thu Jan 01 00:00:01 1970 +0000
470 +++ b/a Thu Jan 01 00:00:01 1970 +0000
471 @@ -0,0 +1,1 @@
471 @@ -0,0 +1,1 @@
472 +a
472 +a
473
473
474 Displaying [PATCH 2 of 2] b ...
474 Displaying [PATCH 2 of 2] b ...
475 Content-Type: text/plain; charset="us-ascii"
475 Content-Type: text/plain; charset="us-ascii"
476 MIME-Version: 1.0
476 MIME-Version: 1.0
477 Content-Transfer-Encoding: 7bit
477 Content-Transfer-Encoding: 7bit
478 Subject: [PATCH 2 of 2] b
478 Subject: [PATCH 2 of 2] b
479 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
479 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
480 Message-Id: <97d72e5f12c7e84f8506.62@
480 Message-Id: <97d72e5f12c7e84f8506.62@
481 In-Reply-To: <patchbomb.60@
481 In-Reply-To: <patchbomb.60@
482 References: <patchbomb.60@
482 References: <patchbomb.60@
483 User-Agent: Mercurial-patchbomb
483 User-Agent: Mercurial-patchbomb
484 Date: Thu, 01 Jan 1970 00:01:02 +0000
484 Date: Thu, 01 Jan 1970 00:01:02 +0000
485 From: quux
485 From: quux
486 To: foo
486 To: foo
487 Cc: bar
487 Cc: bar
488
488
489 b | 1 +
489 b | 1 +
490 1 files changed, 1 insertions(+), 0 deletions(-)
490 1 files changed, 1 insertions(+), 0 deletions(-)
491
491
492
492
493 # HG changeset patch
493 # HG changeset patch
494 # User test
494 # User test
495 # Date 2 0
495 # Date 2 0
496 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
496 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
497 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
497 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
498 b
498 b
499
499
500 diff -r 8580ff50825a -r 97d72e5f12c7 b
500 diff -r 8580ff50825a -r 97d72e5f12c7 b
501 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
501 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
502 +++ b/b Thu Jan 01 00:00:02 1970 +0000
502 +++ b/b Thu Jan 01 00:00:02 1970 +0000
503 @@ -0,0 +1,1 @@
503 @@ -0,0 +1,1 @@
504 +b
504 +b
505
505
506
506
507 test inline for single patch:
507 test inline for single patch:
508 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2 | \
508 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2 | \
509 > fixheaders
509 > fixheaders
510 This patch series consists of 1 patches.
510 This patch series consists of 1 patches.
511
511
512
512
513 Displaying [PATCH] test ...
513 Displaying [PATCH] test ...
514 Content-Type: multipart/mixed; boundary="===
514 Content-Type: multipart/mixed; boundary="===
515 MIME-Version: 1.0
515 MIME-Version: 1.0
516 Subject: [PATCH] test
516 Subject: [PATCH] test
517 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
517 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
518 Message-Id: <ff2c9fa2018b15fa74b3.60@
518 Message-Id: <ff2c9fa2018b15fa74b3.60@
519 User-Agent: Mercurial-patchbomb
519 User-Agent: Mercurial-patchbomb
520 Date: Thu, 01 Jan 1970 00:01:00 +0000
520 Date: Thu, 01 Jan 1970 00:01:00 +0000
521 From: quux
521 From: quux
522 To: foo
522 To: foo
523 Cc: bar
523 Cc: bar
524
524
525 --===
525 --===
526 Content-Type: text/x-patch; charset="us-ascii"
526 Content-Type: text/x-patch; charset="us-ascii"
527 MIME-Version: 1.0
527 MIME-Version: 1.0
528 Content-Transfer-Encoding: 7bit
528 Content-Transfer-Encoding: 7bit
529 Content-Disposition: inline; filename=t2.patch
529 Content-Disposition: inline; filename=t2.patch
530
530
531 # HG changeset patch
531 # HG changeset patch
532 # User test
532 # User test
533 # Date 3 0
533 # Date 3 0
534 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
534 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
535 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
535 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
536 c
536 c
537
537
538 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
538 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
539 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
539 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
540 +++ b/c Thu Jan 01 00:00:03 1970 +0000
540 +++ b/c Thu Jan 01 00:00:03 1970 +0000
541 @@ -0,0 +1,1 @@
541 @@ -0,0 +1,1 @@
542 +c
542 +c
543
543
544 --===
544 --===
545
545
546
546
547 test inline for single patch (quoted-printable):
547 test inline for single patch (quoted-printable):
548 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 4 | \
548 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 4 | \
549 > fixheaders
549 > fixheaders
550 This patch series consists of 1 patches.
550 This patch series consists of 1 patches.
551
551
552
552
553 Displaying [PATCH] test ...
553 Displaying [PATCH] test ...
554 Content-Type: multipart/mixed; boundary="===
554 Content-Type: multipart/mixed; boundary="===
555 MIME-Version: 1.0
555 MIME-Version: 1.0
556 Subject: [PATCH] test
556 Subject: [PATCH] test
557 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
557 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
558 Message-Id: <c655633f8c87700bb38c.60@
558 Message-Id: <c655633f8c87700bb38c.60@
559 User-Agent: Mercurial-patchbomb
559 User-Agent: Mercurial-patchbomb
560 Date: Thu, 01 Jan 1970 00:01:00 +0000
560 Date: Thu, 01 Jan 1970 00:01:00 +0000
561 From: quux
561 From: quux
562 To: foo
562 To: foo
563 Cc: bar
563 Cc: bar
564
564
565 --===
565 --===
566 Content-Type: text/x-patch; charset="us-ascii"
566 Content-Type: text/x-patch; charset="us-ascii"
567 MIME-Version: 1.0
567 MIME-Version: 1.0
568 Content-Transfer-Encoding: quoted-printable
568 Content-Transfer-Encoding: quoted-printable
569 Content-Disposition: inline; filename=t2.patch
569 Content-Disposition: inline; filename=t2.patch
570
570
571 # HG changeset patch
571 # HG changeset patch
572 # User test
572 # User test
573 # Date 4 0
573 # Date 4 0
574 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
574 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
575 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
575 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
576 charset=3Dutf-8; content-transfer-encoding: quoted-printable
576 charset=3Dutf-8; content-transfer-encoding: quoted-printable
577
577
578 diff -r c3c9e37db9f4 -r c655633f8c87 qp
578 diff -r c3c9e37db9f4 -r c655633f8c87 qp
579 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
579 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
580 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
580 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
581 @@ -0,0 +1,4 @@
581 @@ -0,0 +1,4 @@
582 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
582 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
583 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
583 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
584 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
584 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
585 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
585 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
586 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
586 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
587 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
587 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
588 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
588 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
589 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
589 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
590 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
590 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
591 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
591 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
592 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
592 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
593 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
593 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
594 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
594 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
595 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
595 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
596 +foo
596 +foo
597 +
597 +
598 +bar
598 +bar
599
599
600 --===
600 --===
601
601
602 test inline for multiple patches:
602 test inline for multiple patches:
603 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i \
603 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i \
604 > -r 0:1 -r 4 | fixheaders
604 > -r 0:1 -r 4 | fixheaders
605 This patch series consists of 3 patches.
605 This patch series consists of 3 patches.
606
606
607
607
608 Write the introductory message for the patch series.
608 Write the introductory message for the patch series.
609
609
610
610
611 Displaying [PATCH 0 of 3] test ...
611 Displaying [PATCH 0 of 3] test ...
612 Content-Type: text/plain; charset="us-ascii"
612 Content-Type: text/plain; charset="us-ascii"
613 MIME-Version: 1.0
613 MIME-Version: 1.0
614 Content-Transfer-Encoding: 7bit
614 Content-Transfer-Encoding: 7bit
615 Subject: [PATCH 0 of 3] test
615 Subject: [PATCH 0 of 3] test
616 Message-Id: <patchbomb.60@
616 Message-Id: <patchbomb.60@
617 User-Agent: Mercurial-patchbomb
617 User-Agent: Mercurial-patchbomb
618 Date: Thu, 01 Jan 1970 00:01:00 +0000
618 Date: Thu, 01 Jan 1970 00:01:00 +0000
619 From: quux
619 From: quux
620 To: foo
620 To: foo
621 Cc: bar
621 Cc: bar
622
622
623
623
624 Displaying [PATCH 1 of 3] a ...
624 Displaying [PATCH 1 of 3] a ...
625 Content-Type: multipart/mixed; boundary="===
625 Content-Type: multipart/mixed; boundary="===
626 MIME-Version: 1.0
626 MIME-Version: 1.0
627 Subject: [PATCH 1 of 3] a
627 Subject: [PATCH 1 of 3] a
628 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
628 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
629 Message-Id: <8580ff50825a50c8f716.61@
629 Message-Id: <8580ff50825a50c8f716.61@
630 In-Reply-To: <patchbomb.60@
630 In-Reply-To: <patchbomb.60@
631 References: <patchbomb.60@
631 References: <patchbomb.60@
632 User-Agent: Mercurial-patchbomb
632 User-Agent: Mercurial-patchbomb
633 Date: Thu, 01 Jan 1970 00:01:01 +0000
633 Date: Thu, 01 Jan 1970 00:01:01 +0000
634 From: quux
634 From: quux
635 To: foo
635 To: foo
636 Cc: bar
636 Cc: bar
637
637
638 --===
638 --===
639 Content-Type: text/x-patch; charset="us-ascii"
639 Content-Type: text/x-patch; charset="us-ascii"
640 MIME-Version: 1.0
640 MIME-Version: 1.0
641 Content-Transfer-Encoding: 7bit
641 Content-Transfer-Encoding: 7bit
642 Content-Disposition: inline; filename=t2-1.patch
642 Content-Disposition: inline; filename=t2-1.patch
643
643
644 # HG changeset patch
644 # HG changeset patch
645 # User test
645 # User test
646 # Date 1 0
646 # Date 1 0
647 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
647 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
648 # Parent 0000000000000000000000000000000000000000
648 # Parent 0000000000000000000000000000000000000000
649 a
649 a
650
650
651 diff -r 000000000000 -r 8580ff50825a a
651 diff -r 000000000000 -r 8580ff50825a a
652 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
652 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
653 +++ b/a Thu Jan 01 00:00:01 1970 +0000
653 +++ b/a Thu Jan 01 00:00:01 1970 +0000
654 @@ -0,0 +1,1 @@
654 @@ -0,0 +1,1 @@
655 +a
655 +a
656
656
657 --===
657 --===
658 Displaying [PATCH 2 of 3] b ...
658 Displaying [PATCH 2 of 3] b ...
659 Content-Type: multipart/mixed; boundary="===
659 Content-Type: multipart/mixed; boundary="===
660 MIME-Version: 1.0
660 MIME-Version: 1.0
661 Subject: [PATCH 2 of 3] b
661 Subject: [PATCH 2 of 3] b
662 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
662 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
663 Message-Id: <97d72e5f12c7e84f8506.62@
663 Message-Id: <97d72e5f12c7e84f8506.62@
664 In-Reply-To: <patchbomb.60@
664 In-Reply-To: <patchbomb.60@
665 References: <patchbomb.60@
665 References: <patchbomb.60@
666 User-Agent: Mercurial-patchbomb
666 User-Agent: Mercurial-patchbomb
667 Date: Thu, 01 Jan 1970 00:01:02 +0000
667 Date: Thu, 01 Jan 1970 00:01:02 +0000
668 From: quux
668 From: quux
669 To: foo
669 To: foo
670 Cc: bar
670 Cc: bar
671
671
672 --===
672 --===
673 Content-Type: text/x-patch; charset="us-ascii"
673 Content-Type: text/x-patch; charset="us-ascii"
674 MIME-Version: 1.0
674 MIME-Version: 1.0
675 Content-Transfer-Encoding: 7bit
675 Content-Transfer-Encoding: 7bit
676 Content-Disposition: inline; filename=t2-2.patch
676 Content-Disposition: inline; filename=t2-2.patch
677
677
678 # HG changeset patch
678 # HG changeset patch
679 # User test
679 # User test
680 # Date 2 0
680 # Date 2 0
681 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
681 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
682 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
682 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
683 b
683 b
684
684
685 diff -r 8580ff50825a -r 97d72e5f12c7 b
685 diff -r 8580ff50825a -r 97d72e5f12c7 b
686 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
686 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
687 +++ b/b Thu Jan 01 00:00:02 1970 +0000
687 +++ b/b Thu Jan 01 00:00:02 1970 +0000
688 @@ -0,0 +1,1 @@
688 @@ -0,0 +1,1 @@
689 +b
689 +b
690
690
691 --===
691 --===
692 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
692 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
693 Content-Type: multipart/mixed; boundary="===
693 Content-Type: multipart/mixed; boundary="===
694 MIME-Version: 1.0
694 MIME-Version: 1.0
695 Subject: [PATCH 3 of 3] charset=utf-8;
695 Subject: [PATCH 3 of 3] charset=utf-8;
696 content-transfer-encoding: quoted-printable
696 content-transfer-encoding: quoted-printable
697 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
697 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
698 Message-Id: <c655633f8c87700bb38c.63@
698 Message-Id: <c655633f8c87700bb38c.63@
699 In-Reply-To: <patchbomb.60@
699 In-Reply-To: <patchbomb.60@
700 References: <patchbomb.60@
700 References: <patchbomb.60@
701 User-Agent: Mercurial-patchbomb
701 User-Agent: Mercurial-patchbomb
702 Date: Thu, 01 Jan 1970 00:01:03 +0000
702 Date: Thu, 01 Jan 1970 00:01:03 +0000
703 From: quux
703 From: quux
704 To: foo
704 To: foo
705 Cc: bar
705 Cc: bar
706
706
707 --===
707 --===
708 Content-Type: text/x-patch; charset="us-ascii"
708 Content-Type: text/x-patch; charset="us-ascii"
709 MIME-Version: 1.0
709 MIME-Version: 1.0
710 Content-Transfer-Encoding: quoted-printable
710 Content-Transfer-Encoding: quoted-printable
711 Content-Disposition: inline; filename=t2-3.patch
711 Content-Disposition: inline; filename=t2-3.patch
712
712
713 # HG changeset patch
713 # HG changeset patch
714 # User test
714 # User test
715 # Date 4 0
715 # Date 4 0
716 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
716 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
717 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
717 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
718 charset=3Dutf-8; content-transfer-encoding: quoted-printable
718 charset=3Dutf-8; content-transfer-encoding: quoted-printable
719
719
720 diff -r c3c9e37db9f4 -r c655633f8c87 qp
720 diff -r c3c9e37db9f4 -r c655633f8c87 qp
721 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
721 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
722 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
722 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
723 @@ -0,0 +1,4 @@
723 @@ -0,0 +1,4 @@
724 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
724 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
725 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
725 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
726 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
726 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
727 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
727 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
728 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
728 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
729 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
729 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
730 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
730 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
731 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
731 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
732 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
732 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
733 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
733 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
734 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
734 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
735 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
735 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
736 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
736 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
737 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
737 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
738 +foo
738 +foo
739 +
739 +
740 +bar
740 +bar
741
741
742 --===
742 --===
743
743
744 test attach for single patch:
744 test attach for single patch:
745 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 2 | \
745 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 2 | \
746 > fixheaders
746 > fixheaders
747 This patch series consists of 1 patches.
747 This patch series consists of 1 patches.
748
748
749
749
750 Displaying [PATCH] test ...
750 Displaying [PATCH] test ...
751 Content-Type: multipart/mixed; boundary="===
751 Content-Type: multipart/mixed; boundary="===
752 MIME-Version: 1.0
752 MIME-Version: 1.0
753 Subject: [PATCH] test
753 Subject: [PATCH] test
754 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
754 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
755 Message-Id: <ff2c9fa2018b15fa74b3.60@
755 Message-Id: <ff2c9fa2018b15fa74b3.60@
756 User-Agent: Mercurial-patchbomb
756 User-Agent: Mercurial-patchbomb
757 Date: Thu, 01 Jan 1970 00:01:00 +0000
757 Date: Thu, 01 Jan 1970 00:01:00 +0000
758 From: quux
758 From: quux
759 To: foo
759 To: foo
760 Cc: bar
760 Cc: bar
761
761
762 --===
762 --===
763 Content-Type: text/plain; charset="us-ascii"
763 Content-Type: text/plain; charset="us-ascii"
764 MIME-Version: 1.0
764 MIME-Version: 1.0
765 Content-Transfer-Encoding: 7bit
765 Content-Transfer-Encoding: 7bit
766
766
767 Patch subject is complete summary.
767 Patch subject is complete summary.
768
768
769
769
770
770
771 --===
771 --===
772 Content-Type: text/x-patch; charset="us-ascii"
772 Content-Type: text/x-patch; charset="us-ascii"
773 MIME-Version: 1.0
773 MIME-Version: 1.0
774 Content-Transfer-Encoding: 7bit
774 Content-Transfer-Encoding: 7bit
775 Content-Disposition: attachment; filename=t2.patch
775 Content-Disposition: attachment; filename=t2.patch
776
776
777 # HG changeset patch
777 # HG changeset patch
778 # User test
778 # User test
779 # Date 3 0
779 # Date 3 0
780 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
780 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
781 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
781 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
782 c
782 c
783
783
784 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
784 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
785 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
785 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
786 +++ b/c Thu Jan 01 00:00:03 1970 +0000
786 +++ b/c Thu Jan 01 00:00:03 1970 +0000
787 @@ -0,0 +1,1 @@
787 @@ -0,0 +1,1 @@
788 +c
788 +c
789
789
790 --===
790 --===
791
791
792 test attach for single patch (quoted-printable):
792 test attach for single patch (quoted-printable):
793 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 4 | \
793 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 4 | \
794 > fixheaders
794 > fixheaders
795 This patch series consists of 1 patches.
795 This patch series consists of 1 patches.
796
796
797
797
798 Displaying [PATCH] test ...
798 Displaying [PATCH] test ...
799 Content-Type: multipart/mixed; boundary="===
799 Content-Type: multipart/mixed; boundary="===
800 MIME-Version: 1.0
800 MIME-Version: 1.0
801 Subject: [PATCH] test
801 Subject: [PATCH] test
802 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
802 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
803 Message-Id: <c655633f8c87700bb38c.60@
803 Message-Id: <c655633f8c87700bb38c.60@
804 User-Agent: Mercurial-patchbomb
804 User-Agent: Mercurial-patchbomb
805 Date: Thu, 01 Jan 1970 00:01:00 +0000
805 Date: Thu, 01 Jan 1970 00:01:00 +0000
806 From: quux
806 From: quux
807 To: foo
807 To: foo
808 Cc: bar
808 Cc: bar
809
809
810 --===
810 --===
811 Content-Type: text/plain; charset="us-ascii"
811 Content-Type: text/plain; charset="us-ascii"
812 MIME-Version: 1.0
812 MIME-Version: 1.0
813 Content-Transfer-Encoding: 7bit
813 Content-Transfer-Encoding: 7bit
814
814
815 Patch subject is complete summary.
815 Patch subject is complete summary.
816
816
817
817
818
818
819 --===
819 --===
820 Content-Type: text/x-patch; charset="us-ascii"
820 Content-Type: text/x-patch; charset="us-ascii"
821 MIME-Version: 1.0
821 MIME-Version: 1.0
822 Content-Transfer-Encoding: quoted-printable
822 Content-Transfer-Encoding: quoted-printable
823 Content-Disposition: attachment; filename=t2.patch
823 Content-Disposition: attachment; filename=t2.patch
824
824
825 # HG changeset patch
825 # HG changeset patch
826 # User test
826 # User test
827 # Date 4 0
827 # Date 4 0
828 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
828 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
829 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
829 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
830 charset=3Dutf-8; content-transfer-encoding: quoted-printable
830 charset=3Dutf-8; content-transfer-encoding: quoted-printable
831
831
832 diff -r c3c9e37db9f4 -r c655633f8c87 qp
832 diff -r c3c9e37db9f4 -r c655633f8c87 qp
833 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
833 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
834 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
834 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
835 @@ -0,0 +1,4 @@
835 @@ -0,0 +1,4 @@
836 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
836 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
837 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
837 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
838 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
838 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
839 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
839 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
840 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
840 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
841 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
841 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
842 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
842 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
843 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
843 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
844 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
844 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
845 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
845 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
846 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
846 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
847 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
847 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
848 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
848 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
849 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
849 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
850 +foo
850 +foo
851 +
851 +
852 +bar
852 +bar
853
853
854 --===
854 --===
855
855
856 test attach for multiple patches:
856 test attach for multiple patches:
857 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a \
857 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a \
858 > -r 0:1 -r 4 | fixheaders
858 > -r 0:1 -r 4 | fixheaders
859 This patch series consists of 3 patches.
859 This patch series consists of 3 patches.
860
860
861
861
862 Write the introductory message for the patch series.
862 Write the introductory message for the patch series.
863
863
864
864
865 Displaying [PATCH 0 of 3] test ...
865 Displaying [PATCH 0 of 3] test ...
866 Content-Type: text/plain; charset="us-ascii"
866 Content-Type: text/plain; charset="us-ascii"
867 MIME-Version: 1.0
867 MIME-Version: 1.0
868 Content-Transfer-Encoding: 7bit
868 Content-Transfer-Encoding: 7bit
869 Subject: [PATCH 0 of 3] test
869 Subject: [PATCH 0 of 3] test
870 Message-Id: <patchbomb.60@
870 Message-Id: <patchbomb.60@
871 User-Agent: Mercurial-patchbomb
871 User-Agent: Mercurial-patchbomb
872 Date: Thu, 01 Jan 1970 00:01:00 +0000
872 Date: Thu, 01 Jan 1970 00:01:00 +0000
873 From: quux
873 From: quux
874 To: foo
874 To: foo
875 Cc: bar
875 Cc: bar
876
876
877
877
878 Displaying [PATCH 1 of 3] a ...
878 Displaying [PATCH 1 of 3] a ...
879 Content-Type: multipart/mixed; boundary="===
879 Content-Type: multipart/mixed; boundary="===
880 MIME-Version: 1.0
880 MIME-Version: 1.0
881 Subject: [PATCH 1 of 3] a
881 Subject: [PATCH 1 of 3] a
882 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
882 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
883 Message-Id: <8580ff50825a50c8f716.61@
883 Message-Id: <8580ff50825a50c8f716.61@
884 In-Reply-To: <patchbomb.60@
884 In-Reply-To: <patchbomb.60@
885 References: <patchbomb.60@
885 References: <patchbomb.60@
886 User-Agent: Mercurial-patchbomb
886 User-Agent: Mercurial-patchbomb
887 Date: Thu, 01 Jan 1970 00:01:01 +0000
887 Date: Thu, 01 Jan 1970 00:01:01 +0000
888 From: quux
888 From: quux
889 To: foo
889 To: foo
890 Cc: bar
890 Cc: bar
891
891
892 --===
892 --===
893 Content-Type: text/plain; charset="us-ascii"
893 Content-Type: text/plain; charset="us-ascii"
894 MIME-Version: 1.0
894 MIME-Version: 1.0
895 Content-Transfer-Encoding: 7bit
895 Content-Transfer-Encoding: 7bit
896
896
897 Patch subject is complete summary.
897 Patch subject is complete summary.
898
898
899
899
900
900
901 --===
901 --===
902 Content-Type: text/x-patch; charset="us-ascii"
902 Content-Type: text/x-patch; charset="us-ascii"
903 MIME-Version: 1.0
903 MIME-Version: 1.0
904 Content-Transfer-Encoding: 7bit
904 Content-Transfer-Encoding: 7bit
905 Content-Disposition: attachment; filename=t2-1.patch
905 Content-Disposition: attachment; filename=t2-1.patch
906
906
907 # HG changeset patch
907 # HG changeset patch
908 # User test
908 # User test
909 # Date 1 0
909 # Date 1 0
910 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
910 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
911 # Parent 0000000000000000000000000000000000000000
911 # Parent 0000000000000000000000000000000000000000
912 a
912 a
913
913
914 diff -r 000000000000 -r 8580ff50825a a
914 diff -r 000000000000 -r 8580ff50825a a
915 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
915 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
916 +++ b/a Thu Jan 01 00:00:01 1970 +0000
916 +++ b/a Thu Jan 01 00:00:01 1970 +0000
917 @@ -0,0 +1,1 @@
917 @@ -0,0 +1,1 @@
918 +a
918 +a
919
919
920 --===
920 --===
921 Displaying [PATCH 2 of 3] b ...
921 Displaying [PATCH 2 of 3] b ...
922 Content-Type: multipart/mixed; boundary="===
922 Content-Type: multipart/mixed; boundary="===
923 MIME-Version: 1.0
923 MIME-Version: 1.0
924 Subject: [PATCH 2 of 3] b
924 Subject: [PATCH 2 of 3] b
925 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
925 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
926 Message-Id: <97d72e5f12c7e84f8506.62@
926 Message-Id: <97d72e5f12c7e84f8506.62@
927 In-Reply-To: <patchbomb.60@
927 In-Reply-To: <patchbomb.60@
928 References: <patchbomb.60@
928 References: <patchbomb.60@
929 User-Agent: Mercurial-patchbomb
929 User-Agent: Mercurial-patchbomb
930 Date: Thu, 01 Jan 1970 00:01:02 +0000
930 Date: Thu, 01 Jan 1970 00:01:02 +0000
931 From: quux
931 From: quux
932 To: foo
932 To: foo
933 Cc: bar
933 Cc: bar
934
934
935 --===
935 --===
936 Content-Type: text/plain; charset="us-ascii"
936 Content-Type: text/plain; charset="us-ascii"
937 MIME-Version: 1.0
937 MIME-Version: 1.0
938 Content-Transfer-Encoding: 7bit
938 Content-Transfer-Encoding: 7bit
939
939
940 Patch subject is complete summary.
940 Patch subject is complete summary.
941
941
942
942
943
943
944 --===
944 --===
945 Content-Type: text/x-patch; charset="us-ascii"
945 Content-Type: text/x-patch; charset="us-ascii"
946 MIME-Version: 1.0
946 MIME-Version: 1.0
947 Content-Transfer-Encoding: 7bit
947 Content-Transfer-Encoding: 7bit
948 Content-Disposition: attachment; filename=t2-2.patch
948 Content-Disposition: attachment; filename=t2-2.patch
949
949
950 # HG changeset patch
950 # HG changeset patch
951 # User test
951 # User test
952 # Date 2 0
952 # Date 2 0
953 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
953 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
954 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
954 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
955 b
955 b
956
956
957 diff -r 8580ff50825a -r 97d72e5f12c7 b
957 diff -r 8580ff50825a -r 97d72e5f12c7 b
958 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
958 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
959 +++ b/b Thu Jan 01 00:00:02 1970 +0000
959 +++ b/b Thu Jan 01 00:00:02 1970 +0000
960 @@ -0,0 +1,1 @@
960 @@ -0,0 +1,1 @@
961 +b
961 +b
962
962
963 --===
963 --===
964 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
964 Displaying [PATCH 3 of 3] charset=utf-8; content-transfer-encoding: quoted-printable ...
965 Content-Type: multipart/mixed; boundary="===
965 Content-Type: multipart/mixed; boundary="===
966 MIME-Version: 1.0
966 MIME-Version: 1.0
967 Subject: [PATCH 3 of 3] charset=utf-8;
967 Subject: [PATCH 3 of 3] charset=utf-8;
968 content-transfer-encoding: quoted-printable
968 content-transfer-encoding: quoted-printable
969 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
969 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
970 Message-Id: <c655633f8c87700bb38c.63@
970 Message-Id: <c655633f8c87700bb38c.63@
971 In-Reply-To: <patchbomb.60@
971 In-Reply-To: <patchbomb.60@
972 References: <patchbomb.60@
972 References: <patchbomb.60@
973 User-Agent: Mercurial-patchbomb
973 User-Agent: Mercurial-patchbomb
974 Date: Thu, 01 Jan 1970 00:01:03 +0000
974 Date: Thu, 01 Jan 1970 00:01:03 +0000
975 From: quux
975 From: quux
976 To: foo
976 To: foo
977 Cc: bar
977 Cc: bar
978
978
979 --===
979 --===
980 Content-Type: text/plain; charset="us-ascii"
980 Content-Type: text/plain; charset="us-ascii"
981 MIME-Version: 1.0
981 MIME-Version: 1.0
982 Content-Transfer-Encoding: 7bit
982 Content-Transfer-Encoding: 7bit
983
983
984 Patch subject is complete summary.
984 Patch subject is complete summary.
985
985
986
986
987
987
988 --===
988 --===
989 Content-Type: text/x-patch; charset="us-ascii"
989 Content-Type: text/x-patch; charset="us-ascii"
990 MIME-Version: 1.0
990 MIME-Version: 1.0
991 Content-Transfer-Encoding: quoted-printable
991 Content-Transfer-Encoding: quoted-printable
992 Content-Disposition: attachment; filename=t2-3.patch
992 Content-Disposition: attachment; filename=t2-3.patch
993
993
994 # HG changeset patch
994 # HG changeset patch
995 # User test
995 # User test
996 # Date 4 0
996 # Date 4 0
997 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
997 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
998 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
998 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
999 charset=3Dutf-8; content-transfer-encoding: quoted-printable
999 charset=3Dutf-8; content-transfer-encoding: quoted-printable
1000
1000
1001 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1001 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1002 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1002 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1003 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1003 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1004 @@ -0,0 +1,4 @@
1004 @@ -0,0 +1,4 @@
1005 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1005 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1006 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1006 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1007 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1007 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1008 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1008 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1009 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1009 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1010 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1010 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1011 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1011 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1012 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1012 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1013 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1013 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1014 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1014 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1015 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1015 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1016 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1016 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1017 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1017 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1018 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1018 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1019 +foo
1019 +foo
1020 +
1020 +
1021 +bar
1021 +bar
1022
1022
1023 --===
1023 --===
1024
1024
1025 test intro for single patch:
1025 test intro for single patch:
1026 $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
1026 $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
1027 > -r 2 | fixheaders
1027 > -r 2 | fixheaders
1028 This patch series consists of 1 patches.
1028 This patch series consists of 1 patches.
1029
1029
1030
1030
1031 Write the introductory message for the patch series.
1031 Write the introductory message for the patch series.
1032
1032
1033
1033
1034 Displaying [PATCH 0 of 1] test ...
1034 Displaying [PATCH 0 of 1] test ...
1035 Content-Type: text/plain; charset="us-ascii"
1035 Content-Type: text/plain; charset="us-ascii"
1036 MIME-Version: 1.0
1036 MIME-Version: 1.0
1037 Content-Transfer-Encoding: 7bit
1037 Content-Transfer-Encoding: 7bit
1038 Subject: [PATCH 0 of 1] test
1038 Subject: [PATCH 0 of 1] test
1039 Message-Id: <patchbomb.60@
1039 Message-Id: <patchbomb.60@
1040 User-Agent: Mercurial-patchbomb
1040 User-Agent: Mercurial-patchbomb
1041 Date: Thu, 01 Jan 1970 00:01:00 +0000
1041 Date: Thu, 01 Jan 1970 00:01:00 +0000
1042 From: quux
1042 From: quux
1043 To: foo
1043 To: foo
1044 Cc: bar
1044 Cc: bar
1045
1045
1046
1046
1047 Displaying [PATCH 1 of 1] c ...
1047 Displaying [PATCH 1 of 1] c ...
1048 Content-Type: text/plain; charset="us-ascii"
1048 Content-Type: text/plain; charset="us-ascii"
1049 MIME-Version: 1.0
1049 MIME-Version: 1.0
1050 Content-Transfer-Encoding: 7bit
1050 Content-Transfer-Encoding: 7bit
1051 Subject: [PATCH 1 of 1] c
1051 Subject: [PATCH 1 of 1] c
1052 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1052 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1053 Message-Id: <ff2c9fa2018b15fa74b3.61@
1053 Message-Id: <ff2c9fa2018b15fa74b3.61@
1054 In-Reply-To: <patchbomb.60@
1054 In-Reply-To: <patchbomb.60@
1055 References: <patchbomb.60@
1055 References: <patchbomb.60@
1056 User-Agent: Mercurial-patchbomb
1056 User-Agent: Mercurial-patchbomb
1057 Date: Thu, 01 Jan 1970 00:01:01 +0000
1057 Date: Thu, 01 Jan 1970 00:01:01 +0000
1058 From: quux
1058 From: quux
1059 To: foo
1059 To: foo
1060 Cc: bar
1060 Cc: bar
1061
1061
1062 # HG changeset patch
1062 # HG changeset patch
1063 # User test
1063 # User test
1064 # Date 3 0
1064 # Date 3 0
1065 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1065 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1066 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1066 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1067 c
1067 c
1068
1068
1069 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1069 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1070 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1070 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1071 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1071 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1072 @@ -0,0 +1,1 @@
1072 @@ -0,0 +1,1 @@
1073 +c
1073 +c
1074
1074
1075
1075
1076 test --desc without --intro for a single patch:
1076 test --desc without --intro for a single patch:
1077 $ echo foo > intro.text
1077 $ echo foo > intro.text
1078 $ hg email --date '1970-1-1 0:1' -n --desc intro.text -f quux -t foo -c bar \
1078 $ hg email --date '1970-1-1 0:1' -n --desc intro.text -f quux -t foo -c bar \
1079 > -s test -r 2 | fixheaders
1079 > -s test -r 2 | fixheaders
1080 This patch series consists of 1 patches.
1080 This patch series consists of 1 patches.
1081
1081
1082
1082
1083 Displaying [PATCH 0 of 1] test ...
1083 Displaying [PATCH 0 of 1] test ...
1084 Content-Type: text/plain; charset="us-ascii"
1084 Content-Type: text/plain; charset="us-ascii"
1085 MIME-Version: 1.0
1085 MIME-Version: 1.0
1086 Content-Transfer-Encoding: 7bit
1086 Content-Transfer-Encoding: 7bit
1087 Subject: [PATCH 0 of 1] test
1087 Subject: [PATCH 0 of 1] test
1088 Message-Id: <patchbomb.60@
1088 Message-Id: <patchbomb.60@
1089 User-Agent: Mercurial-patchbomb
1089 User-Agent: Mercurial-patchbomb
1090 Date: Thu, 01 Jan 1970 00:01:00 +0000
1090 Date: Thu, 01 Jan 1970 00:01:00 +0000
1091 From: quux
1091 From: quux
1092 To: foo
1092 To: foo
1093 Cc: bar
1093 Cc: bar
1094
1094
1095 foo
1095 foo
1096
1096
1097 Displaying [PATCH 1 of 1] c ...
1097 Displaying [PATCH 1 of 1] c ...
1098 Content-Type: text/plain; charset="us-ascii"
1098 Content-Type: text/plain; charset="us-ascii"
1099 MIME-Version: 1.0
1099 MIME-Version: 1.0
1100 Content-Transfer-Encoding: 7bit
1100 Content-Transfer-Encoding: 7bit
1101 Subject: [PATCH 1 of 1] c
1101 Subject: [PATCH 1 of 1] c
1102 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1102 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1103 Message-Id: <ff2c9fa2018b15fa74b3.61@
1103 Message-Id: <ff2c9fa2018b15fa74b3.61@
1104 In-Reply-To: <patchbomb.60@
1104 In-Reply-To: <patchbomb.60@
1105 References: <patchbomb.60@
1105 References: <patchbomb.60@
1106 User-Agent: Mercurial-patchbomb
1106 User-Agent: Mercurial-patchbomb
1107 Date: Thu, 01 Jan 1970 00:01:01 +0000
1107 Date: Thu, 01 Jan 1970 00:01:01 +0000
1108 From: quux
1108 From: quux
1109 To: foo
1109 To: foo
1110 Cc: bar
1110 Cc: bar
1111
1111
1112 # HG changeset patch
1112 # HG changeset patch
1113 # User test
1113 # User test
1114 # Date 3 0
1114 # Date 3 0
1115 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1115 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1116 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1116 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1117 c
1117 c
1118
1118
1119 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1119 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1120 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1120 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1121 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1121 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1122 @@ -0,0 +1,1 @@
1122 @@ -0,0 +1,1 @@
1123 +c
1123 +c
1124
1124
1125
1125
1126 test intro for multiple patches:
1126 test intro for multiple patches:
1127 $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
1127 $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
1128 > -r 0:1 | fixheaders
1128 > -r 0:1 | fixheaders
1129 This patch series consists of 2 patches.
1129 This patch series consists of 2 patches.
1130
1130
1131
1131
1132 Write the introductory message for the patch series.
1132 Write the introductory message for the patch series.
1133
1133
1134
1134
1135 Displaying [PATCH 0 of 2] test ...
1135 Displaying [PATCH 0 of 2] test ...
1136 Content-Type: text/plain; charset="us-ascii"
1136 Content-Type: text/plain; charset="us-ascii"
1137 MIME-Version: 1.0
1137 MIME-Version: 1.0
1138 Content-Transfer-Encoding: 7bit
1138 Content-Transfer-Encoding: 7bit
1139 Subject: [PATCH 0 of 2] test
1139 Subject: [PATCH 0 of 2] test
1140 Message-Id: <patchbomb.60@
1140 Message-Id: <patchbomb.60@
1141 User-Agent: Mercurial-patchbomb
1141 User-Agent: Mercurial-patchbomb
1142 Date: Thu, 01 Jan 1970 00:01:00 +0000
1142 Date: Thu, 01 Jan 1970 00:01:00 +0000
1143 From: quux
1143 From: quux
1144 To: foo
1144 To: foo
1145 Cc: bar
1145 Cc: bar
1146
1146
1147
1147
1148 Displaying [PATCH 1 of 2] a ...
1148 Displaying [PATCH 1 of 2] a ...
1149 Content-Type: text/plain; charset="us-ascii"
1149 Content-Type: text/plain; charset="us-ascii"
1150 MIME-Version: 1.0
1150 MIME-Version: 1.0
1151 Content-Transfer-Encoding: 7bit
1151 Content-Transfer-Encoding: 7bit
1152 Subject: [PATCH 1 of 2] a
1152 Subject: [PATCH 1 of 2] a
1153 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1153 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1154 Message-Id: <8580ff50825a50c8f716.61@
1154 Message-Id: <8580ff50825a50c8f716.61@
1155 In-Reply-To: <patchbomb.60@
1155 In-Reply-To: <patchbomb.60@
1156 References: <patchbomb.60@
1156 References: <patchbomb.60@
1157 User-Agent: Mercurial-patchbomb
1157 User-Agent: Mercurial-patchbomb
1158 Date: Thu, 01 Jan 1970 00:01:01 +0000
1158 Date: Thu, 01 Jan 1970 00:01:01 +0000
1159 From: quux
1159 From: quux
1160 To: foo
1160 To: foo
1161 Cc: bar
1161 Cc: bar
1162
1162
1163 # HG changeset patch
1163 # HG changeset patch
1164 # User test
1164 # User test
1165 # Date 1 0
1165 # Date 1 0
1166 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1166 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1167 # Parent 0000000000000000000000000000000000000000
1167 # Parent 0000000000000000000000000000000000000000
1168 a
1168 a
1169
1169
1170 diff -r 000000000000 -r 8580ff50825a a
1170 diff -r 000000000000 -r 8580ff50825a a
1171 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1171 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1172 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1172 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1173 @@ -0,0 +1,1 @@
1173 @@ -0,0 +1,1 @@
1174 +a
1174 +a
1175
1175
1176 Displaying [PATCH 2 of 2] b ...
1176 Displaying [PATCH 2 of 2] b ...
1177 Content-Type: text/plain; charset="us-ascii"
1177 Content-Type: text/plain; charset="us-ascii"
1178 MIME-Version: 1.0
1178 MIME-Version: 1.0
1179 Content-Transfer-Encoding: 7bit
1179 Content-Transfer-Encoding: 7bit
1180 Subject: [PATCH 2 of 2] b
1180 Subject: [PATCH 2 of 2] b
1181 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1181 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1182 Message-Id: <97d72e5f12c7e84f8506.62@
1182 Message-Id: <97d72e5f12c7e84f8506.62@
1183 In-Reply-To: <patchbomb.60@
1183 In-Reply-To: <patchbomb.60@
1184 References: <patchbomb.60@
1184 References: <patchbomb.60@
1185 User-Agent: Mercurial-patchbomb
1185 User-Agent: Mercurial-patchbomb
1186 Date: Thu, 01 Jan 1970 00:01:02 +0000
1186 Date: Thu, 01 Jan 1970 00:01:02 +0000
1187 From: quux
1187 From: quux
1188 To: foo
1188 To: foo
1189 Cc: bar
1189 Cc: bar
1190
1190
1191 # HG changeset patch
1191 # HG changeset patch
1192 # User test
1192 # User test
1193 # Date 2 0
1193 # Date 2 0
1194 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1194 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1195 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1195 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1196 b
1196 b
1197
1197
1198 diff -r 8580ff50825a -r 97d72e5f12c7 b
1198 diff -r 8580ff50825a -r 97d72e5f12c7 b
1199 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1199 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1200 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1200 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1201 @@ -0,0 +1,1 @@
1201 @@ -0,0 +1,1 @@
1202 +b
1202 +b
1203
1203
1204
1204
1205 test reply-to via config:
1205 test reply-to via config:
1206 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
1206 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
1207 > --config patchbomb.reply-to='baz@example.com' | fixheaders
1207 > --config patchbomb.reply-to='baz@example.com' | fixheaders
1208 This patch series consists of 1 patches.
1208 This patch series consists of 1 patches.
1209
1209
1210
1210
1211 Displaying [PATCH] test ...
1211 Displaying [PATCH] test ...
1212 Content-Type: text/plain; charset="us-ascii"
1212 Content-Type: text/plain; charset="us-ascii"
1213 MIME-Version: 1.0
1213 MIME-Version: 1.0
1214 Content-Transfer-Encoding: 7bit
1214 Content-Transfer-Encoding: 7bit
1215 Subject: [PATCH] test
1215 Subject: [PATCH] test
1216 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1216 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1217 Message-Id: <ff2c9fa2018b15fa74b3.60@
1217 Message-Id: <ff2c9fa2018b15fa74b3.60@
1218 User-Agent: Mercurial-patchbomb
1218 User-Agent: Mercurial-patchbomb
1219 Date: Thu, 01 Jan 1970 00:01:00 +0000
1219 Date: Thu, 01 Jan 1970 00:01:00 +0000
1220 From: quux
1220 From: quux
1221 To: foo
1221 To: foo
1222 Cc: bar
1222 Cc: bar
1223 Reply-To: baz@example.com
1223 Reply-To: baz@example.com
1224
1224
1225 # HG changeset patch
1225 # HG changeset patch
1226 # User test
1226 # User test
1227 # Date 3 0
1227 # Date 3 0
1228 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1228 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1229 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1229 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1230 c
1230 c
1231
1231
1232 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1232 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1233 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1233 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1234 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1234 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1235 @@ -0,0 +1,1 @@
1235 @@ -0,0 +1,1 @@
1236 +c
1236 +c
1237
1237
1238
1238
1239 test reply-to via command line:
1239 test reply-to via command line:
1240 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
1240 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
1241 > --reply-to baz --reply-to fred | fixheaders
1241 > --reply-to baz --reply-to fred | fixheaders
1242 This patch series consists of 1 patches.
1242 This patch series consists of 1 patches.
1243
1243
1244
1244
1245 Displaying [PATCH] test ...
1245 Displaying [PATCH] test ...
1246 Content-Type: text/plain; charset="us-ascii"
1246 Content-Type: text/plain; charset="us-ascii"
1247 MIME-Version: 1.0
1247 MIME-Version: 1.0
1248 Content-Transfer-Encoding: 7bit
1248 Content-Transfer-Encoding: 7bit
1249 Subject: [PATCH] test
1249 Subject: [PATCH] test
1250 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1250 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1251 Message-Id: <ff2c9fa2018b15fa74b3.60@
1251 Message-Id: <ff2c9fa2018b15fa74b3.60@
1252 User-Agent: Mercurial-patchbomb
1252 User-Agent: Mercurial-patchbomb
1253 Date: Thu, 01 Jan 1970 00:01:00 +0000
1253 Date: Thu, 01 Jan 1970 00:01:00 +0000
1254 From: quux
1254 From: quux
1255 To: foo
1255 To: foo
1256 Cc: bar
1256 Cc: bar
1257 Reply-To: baz, fred
1257 Reply-To: baz, fred
1258
1258
1259 # HG changeset patch
1259 # HG changeset patch
1260 # User test
1260 # User test
1261 # Date 3 0
1261 # Date 3 0
1262 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1262 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1263 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1263 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1264 c
1264 c
1265
1265
1266 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1266 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1267 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1267 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1268 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1268 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1269 @@ -0,0 +1,1 @@
1269 @@ -0,0 +1,1 @@
1270 +c
1270 +c
1271
1271
1272
1272
1273 tagging csets:
1273 tagging csets:
1274 $ hg tag -r0 zero zero.foo
1274 $ hg tag -r0 zero zero.foo
1275 $ hg tag -r1 one one.patch
1275 $ hg tag -r1 one one.patch
1276 $ hg tag -r2 two two.diff
1276 $ hg tag -r2 two two.diff
1277
1277
1278 test inline for single named patch:
1278 test inline for single named patch:
1279 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2 | \
1279 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2 | \
1280 > fixheaders
1280 > fixheaders
1281 This patch series consists of 1 patches.
1281 This patch series consists of 1 patches.
1282
1282
1283
1283
1284 Displaying [PATCH] test ...
1284 Displaying [PATCH] test ...
1285 Content-Type: multipart/mixed; boundary="===
1285 Content-Type: multipart/mixed; boundary="===
1286 MIME-Version: 1.0
1286 MIME-Version: 1.0
1287 Subject: [PATCH] test
1287 Subject: [PATCH] test
1288 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1288 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1289 Message-Id: <ff2c9fa2018b15fa74b3.60@
1289 Message-Id: <ff2c9fa2018b15fa74b3.60@
1290 User-Agent: Mercurial-patchbomb
1290 User-Agent: Mercurial-patchbomb
1291 Date: Thu, 01 Jan 1970 00:01:00 +0000
1291 Date: Thu, 01 Jan 1970 00:01:00 +0000
1292 From: quux
1292 From: quux
1293 To: foo
1293 To: foo
1294 Cc: bar
1294 Cc: bar
1295
1295
1296 --===
1296 --===
1297 Content-Type: text/x-patch; charset="us-ascii"
1297 Content-Type: text/x-patch; charset="us-ascii"
1298 MIME-Version: 1.0
1298 MIME-Version: 1.0
1299 Content-Transfer-Encoding: 7bit
1299 Content-Transfer-Encoding: 7bit
1300 Content-Disposition: inline; filename=two.diff
1300 Content-Disposition: inline; filename=two.diff
1301
1301
1302 # HG changeset patch
1302 # HG changeset patch
1303 # User test
1303 # User test
1304 # Date 3 0
1304 # Date 3 0
1305 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1305 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1306 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1306 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1307 c
1307 c
1308
1308
1309 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1309 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1310 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1310 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1311 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1311 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1312 @@ -0,0 +1,1 @@
1312 @@ -0,0 +1,1 @@
1313 +c
1313 +c
1314
1314
1315 --===
1315 --===
1316
1316
1317 test inline for multiple named/unnamed patches:
1317 test inline for multiple named/unnamed patches:
1318 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 0:1 | \
1318 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 0:1 | \
1319 > fixheaders
1319 > fixheaders
1320 This patch series consists of 2 patches.
1320 This patch series consists of 2 patches.
1321
1321
1322
1322
1323 Write the introductory message for the patch series.
1323 Write the introductory message for the patch series.
1324
1324
1325
1325
1326 Displaying [PATCH 0 of 2] test ...
1326 Displaying [PATCH 0 of 2] test ...
1327 Content-Type: text/plain; charset="us-ascii"
1327 Content-Type: text/plain; charset="us-ascii"
1328 MIME-Version: 1.0
1328 MIME-Version: 1.0
1329 Content-Transfer-Encoding: 7bit
1329 Content-Transfer-Encoding: 7bit
1330 Subject: [PATCH 0 of 2] test
1330 Subject: [PATCH 0 of 2] test
1331 Message-Id: <patchbomb.60@
1331 Message-Id: <patchbomb.60@
1332 User-Agent: Mercurial-patchbomb
1332 User-Agent: Mercurial-patchbomb
1333 Date: Thu, 01 Jan 1970 00:01:00 +0000
1333 Date: Thu, 01 Jan 1970 00:01:00 +0000
1334 From: quux
1334 From: quux
1335 To: foo
1335 To: foo
1336 Cc: bar
1336 Cc: bar
1337
1337
1338
1338
1339 Displaying [PATCH 1 of 2] a ...
1339 Displaying [PATCH 1 of 2] a ...
1340 Content-Type: multipart/mixed; boundary="===
1340 Content-Type: multipart/mixed; boundary="===
1341 MIME-Version: 1.0
1341 MIME-Version: 1.0
1342 Subject: [PATCH 1 of 2] a
1342 Subject: [PATCH 1 of 2] a
1343 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1343 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1344 Message-Id: <8580ff50825a50c8f716.61@
1344 Message-Id: <8580ff50825a50c8f716.61@
1345 In-Reply-To: <patchbomb.60@
1345 In-Reply-To: <patchbomb.60@
1346 References: <patchbomb.60@
1346 References: <patchbomb.60@
1347 User-Agent: Mercurial-patchbomb
1347 User-Agent: Mercurial-patchbomb
1348 Date: Thu, 01 Jan 1970 00:01:01 +0000
1348 Date: Thu, 01 Jan 1970 00:01:01 +0000
1349 From: quux
1349 From: quux
1350 To: foo
1350 To: foo
1351 Cc: bar
1351 Cc: bar
1352
1352
1353 --===
1353 --===
1354 Content-Type: text/x-patch; charset="us-ascii"
1354 Content-Type: text/x-patch; charset="us-ascii"
1355 MIME-Version: 1.0
1355 MIME-Version: 1.0
1356 Content-Transfer-Encoding: 7bit
1356 Content-Transfer-Encoding: 7bit
1357 Content-Disposition: inline; filename=t2-1.patch
1357 Content-Disposition: inline; filename=t2-1.patch
1358
1358
1359 # HG changeset patch
1359 # HG changeset patch
1360 # User test
1360 # User test
1361 # Date 1 0
1361 # Date 1 0
1362 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1362 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1363 # Parent 0000000000000000000000000000000000000000
1363 # Parent 0000000000000000000000000000000000000000
1364 a
1364 a
1365
1365
1366 diff -r 000000000000 -r 8580ff50825a a
1366 diff -r 000000000000 -r 8580ff50825a a
1367 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1367 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1368 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1368 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1369 @@ -0,0 +1,1 @@
1369 @@ -0,0 +1,1 @@
1370 +a
1370 +a
1371
1371
1372 --===
1372 --===
1373 Displaying [PATCH 2 of 2] b ...
1373 Displaying [PATCH 2 of 2] b ...
1374 Content-Type: multipart/mixed; boundary="===
1374 Content-Type: multipart/mixed; boundary="===
1375 MIME-Version: 1.0
1375 MIME-Version: 1.0
1376 Subject: [PATCH 2 of 2] b
1376 Subject: [PATCH 2 of 2] b
1377 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1377 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1378 Message-Id: <97d72e5f12c7e84f8506.62@
1378 Message-Id: <97d72e5f12c7e84f8506.62@
1379 In-Reply-To: <patchbomb.60@
1379 In-Reply-To: <patchbomb.60@
1380 References: <patchbomb.60@
1380 References: <patchbomb.60@
1381 User-Agent: Mercurial-patchbomb
1381 User-Agent: Mercurial-patchbomb
1382 Date: Thu, 01 Jan 1970 00:01:02 +0000
1382 Date: Thu, 01 Jan 1970 00:01:02 +0000
1383 From: quux
1383 From: quux
1384 To: foo
1384 To: foo
1385 Cc: bar
1385 Cc: bar
1386
1386
1387 --===
1387 --===
1388 Content-Type: text/x-patch; charset="us-ascii"
1388 Content-Type: text/x-patch; charset="us-ascii"
1389 MIME-Version: 1.0
1389 MIME-Version: 1.0
1390 Content-Transfer-Encoding: 7bit
1390 Content-Transfer-Encoding: 7bit
1391 Content-Disposition: inline; filename=one.patch
1391 Content-Disposition: inline; filename=one.patch
1392
1392
1393 # HG changeset patch
1393 # HG changeset patch
1394 # User test
1394 # User test
1395 # Date 2 0
1395 # Date 2 0
1396 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1396 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1397 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1397 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1398 b
1398 b
1399
1399
1400 diff -r 8580ff50825a -r 97d72e5f12c7 b
1400 diff -r 8580ff50825a -r 97d72e5f12c7 b
1401 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1401 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1402 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1402 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1403 @@ -0,0 +1,1 @@
1403 @@ -0,0 +1,1 @@
1404 +b
1404 +b
1405
1405
1406 --===
1406 --===
1407
1407
1408
1408
1409 test inreplyto:
1409 test inreplyto:
1410 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1410 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1411 > -r tip | fixheaders
1411 > -r tip | fixheaders
1412 This patch series consists of 1 patches.
1412 This patch series consists of 1 patches.
1413
1413
1414
1414
1415 Displaying [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b ...
1415 Displaying [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b ...
1416 Content-Type: text/plain; charset="us-ascii"
1416 Content-Type: text/plain; charset="us-ascii"
1417 MIME-Version: 1.0
1417 MIME-Version: 1.0
1418 Content-Transfer-Encoding: 7bit
1418 Content-Transfer-Encoding: 7bit
1419 Subject: [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b
1419 Subject: [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b
1420 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1420 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
1421 Message-Id: <e317db6a6f288748d1f6.60@
1421 Message-Id: <e317db6a6f288748d1f6.60@
1422 In-Reply-To: <baz>
1422 In-Reply-To: <baz>
1423 References: <baz>
1423 References: <baz>
1424 User-Agent: Mercurial-patchbomb
1424 User-Agent: Mercurial-patchbomb
1425 Date: Thu, 01 Jan 1970 00:01:00 +0000
1425 Date: Thu, 01 Jan 1970 00:01:00 +0000
1426 From: quux
1426 From: quux
1427 To: foo
1427 To: foo
1428 Cc: bar
1428 Cc: bar
1429
1429
1430 # HG changeset patch
1430 # HG changeset patch
1431 # User test
1431 # User test
1432 # Date 0 0
1432 # Date 0 0
1433 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1433 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
1434 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1434 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
1435 Added tag two, two.diff for changeset ff2c9fa2018b
1435 Added tag two, two.diff for changeset ff2c9fa2018b
1436
1436
1437 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1437 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
1438 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1438 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
1439 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1439 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
1440 @@ -2,3 +2,5 @@
1440 @@ -2,3 +2,5 @@
1441 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1441 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
1442 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1442 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
1443 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1443 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
1444 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1444 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
1445 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1445 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
1446
1446
1447
1447
1448 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1448 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1449 > -r 0:1
1449 > -r 0:1
1450 This patch series consists of 2 patches.
1450 This patch series consists of 2 patches.
1451
1451
1452 abort: Subject: [PATCH 0 of 2] Please enter a valid value
1452 abort: Subject: [PATCH 0 of 2] Please enter a valid value
1453 [255]
1453 [255]
1454
1454
1455 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1455 $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
1456 > -s test -r 0:1 | fixheaders
1456 > -s test -r 0:1 | fixheaders
1457 This patch series consists of 2 patches.
1457 This patch series consists of 2 patches.
1458
1458
1459
1459
1460 Write the introductory message for the patch series.
1460 Write the introductory message for the patch series.
1461
1461
1462
1462
1463 Displaying [PATCH 0 of 2] test ...
1463 Displaying [PATCH 0 of 2] test ...
1464 Content-Type: text/plain; charset="us-ascii"
1464 Content-Type: text/plain; charset="us-ascii"
1465 MIME-Version: 1.0
1465 MIME-Version: 1.0
1466 Content-Transfer-Encoding: 7bit
1466 Content-Transfer-Encoding: 7bit
1467 Subject: [PATCH 0 of 2] test
1467 Subject: [PATCH 0 of 2] test
1468 Message-Id: <patchbomb.60@
1468 Message-Id: <patchbomb.60@
1469 In-Reply-To: <baz>
1469 In-Reply-To: <baz>
1470 References: <baz>
1470 References: <baz>
1471 User-Agent: Mercurial-patchbomb
1471 User-Agent: Mercurial-patchbomb
1472 Date: Thu, 01 Jan 1970 00:01:00 +0000
1472 Date: Thu, 01 Jan 1970 00:01:00 +0000
1473 From: quux
1473 From: quux
1474 To: foo
1474 To: foo
1475 Cc: bar
1475 Cc: bar
1476
1476
1477
1477
1478 Displaying [PATCH 1 of 2] a ...
1478 Displaying [PATCH 1 of 2] a ...
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 1 of 2] a
1482 Subject: [PATCH 1 of 2] a
1483 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1483 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1484 Message-Id: <8580ff50825a50c8f716.61@
1484 Message-Id: <8580ff50825a50c8f716.61@
1485 In-Reply-To: <patchbomb.60@
1485 In-Reply-To: <patchbomb.60@
1486 References: <patchbomb.60@
1486 References: <patchbomb.60@
1487 User-Agent: Mercurial-patchbomb
1487 User-Agent: Mercurial-patchbomb
1488 Date: Thu, 01 Jan 1970 00:01:01 +0000
1488 Date: Thu, 01 Jan 1970 00:01:01 +0000
1489 From: quux
1489 From: quux
1490 To: foo
1490 To: foo
1491 Cc: bar
1491 Cc: bar
1492
1492
1493 # HG changeset patch
1493 # HG changeset patch
1494 # User test
1494 # User test
1495 # Date 1 0
1495 # Date 1 0
1496 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1496 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1497 # Parent 0000000000000000000000000000000000000000
1497 # Parent 0000000000000000000000000000000000000000
1498 a
1498 a
1499
1499
1500 diff -r 000000000000 -r 8580ff50825a a
1500 diff -r 000000000000 -r 8580ff50825a a
1501 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1501 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1502 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1502 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1503 @@ -0,0 +1,1 @@
1503 @@ -0,0 +1,1 @@
1504 +a
1504 +a
1505
1505
1506 Displaying [PATCH 2 of 2] b ...
1506 Displaying [PATCH 2 of 2] b ...
1507 Content-Type: text/plain; charset="us-ascii"
1507 Content-Type: text/plain; charset="us-ascii"
1508 MIME-Version: 1.0
1508 MIME-Version: 1.0
1509 Content-Transfer-Encoding: 7bit
1509 Content-Transfer-Encoding: 7bit
1510 Subject: [PATCH 2 of 2] b
1510 Subject: [PATCH 2 of 2] b
1511 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1511 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1512 Message-Id: <97d72e5f12c7e84f8506.62@
1512 Message-Id: <97d72e5f12c7e84f8506.62@
1513 In-Reply-To: <patchbomb.60@
1513 In-Reply-To: <patchbomb.60@
1514 References: <patchbomb.60@
1514 References: <patchbomb.60@
1515 User-Agent: Mercurial-patchbomb
1515 User-Agent: Mercurial-patchbomb
1516 Date: Thu, 01 Jan 1970 00:01:02 +0000
1516 Date: Thu, 01 Jan 1970 00:01:02 +0000
1517 From: quux
1517 From: quux
1518 To: foo
1518 To: foo
1519 Cc: bar
1519 Cc: bar
1520
1520
1521 # HG changeset patch
1521 # HG changeset patch
1522 # User test
1522 # User test
1523 # Date 2 0
1523 # Date 2 0
1524 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1524 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1525 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1525 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1526 b
1526 b
1527
1527
1528 diff -r 8580ff50825a -r 97d72e5f12c7 b
1528 diff -r 8580ff50825a -r 97d72e5f12c7 b
1529 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1529 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1530 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1530 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1531 @@ -0,0 +1,1 @@
1531 @@ -0,0 +1,1 @@
1532 +b
1532 +b
1533
1533
1534
1534
1535 test single flag for single patch:
1535 test single flag for single patch:
1536 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
1536 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
1537 > -r 2 | fixheaders
1537 > -r 2 | fixheaders
1538 This patch series consists of 1 patches.
1538 This patch series consists of 1 patches.
1539
1539
1540
1540
1541 Displaying [PATCH fooFlag] test ...
1541 Displaying [PATCH fooFlag] test ...
1542 Content-Type: text/plain; charset="us-ascii"
1542 Content-Type: text/plain; charset="us-ascii"
1543 MIME-Version: 1.0
1543 MIME-Version: 1.0
1544 Content-Transfer-Encoding: 7bit
1544 Content-Transfer-Encoding: 7bit
1545 Subject: [PATCH fooFlag] test
1545 Subject: [PATCH fooFlag] test
1546 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1546 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1547 Message-Id: <ff2c9fa2018b15fa74b3.60@
1547 Message-Id: <ff2c9fa2018b15fa74b3.60@
1548 User-Agent: Mercurial-patchbomb
1548 User-Agent: Mercurial-patchbomb
1549 Date: Thu, 01 Jan 1970 00:01:00 +0000
1549 Date: Thu, 01 Jan 1970 00:01:00 +0000
1550 From: quux
1550 From: quux
1551 To: foo
1551 To: foo
1552 Cc: bar
1552 Cc: bar
1553
1553
1554 # HG changeset patch
1554 # HG changeset patch
1555 # User test
1555 # User test
1556 # Date 3 0
1556 # Date 3 0
1557 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1557 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1558 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1558 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1559 c
1559 c
1560
1560
1561 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1561 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1562 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1562 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1563 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1563 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1564 @@ -0,0 +1,1 @@
1564 @@ -0,0 +1,1 @@
1565 +c
1565 +c
1566
1566
1567
1567
1568 test single flag for multiple patches:
1568 test single flag for multiple patches:
1569 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
1569 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
1570 > -r 0:1 | fixheaders
1570 > -r 0:1 | fixheaders
1571 This patch series consists of 2 patches.
1571 This patch series consists of 2 patches.
1572
1572
1573
1573
1574 Write the introductory message for the patch series.
1574 Write the introductory message for the patch series.
1575
1575
1576
1576
1577 Displaying [PATCH 0 of 2 fooFlag] test ...
1577 Displaying [PATCH 0 of 2 fooFlag] test ...
1578 Content-Type: text/plain; charset="us-ascii"
1578 Content-Type: text/plain; charset="us-ascii"
1579 MIME-Version: 1.0
1579 MIME-Version: 1.0
1580 Content-Transfer-Encoding: 7bit
1580 Content-Transfer-Encoding: 7bit
1581 Subject: [PATCH 0 of 2 fooFlag] test
1581 Subject: [PATCH 0 of 2 fooFlag] test
1582 Message-Id: <patchbomb.60@
1582 Message-Id: <patchbomb.60@
1583 User-Agent: Mercurial-patchbomb
1583 User-Agent: Mercurial-patchbomb
1584 Date: Thu, 01 Jan 1970 00:01:00 +0000
1584 Date: Thu, 01 Jan 1970 00:01:00 +0000
1585 From: quux
1585 From: quux
1586 To: foo
1586 To: foo
1587 Cc: bar
1587 Cc: bar
1588
1588
1589
1589
1590 Displaying [PATCH 1 of 2 fooFlag] a ...
1590 Displaying [PATCH 1 of 2 fooFlag] a ...
1591 Content-Type: text/plain; charset="us-ascii"
1591 Content-Type: text/plain; charset="us-ascii"
1592 MIME-Version: 1.0
1592 MIME-Version: 1.0
1593 Content-Transfer-Encoding: 7bit
1593 Content-Transfer-Encoding: 7bit
1594 Subject: [PATCH 1 of 2 fooFlag] a
1594 Subject: [PATCH 1 of 2 fooFlag] a
1595 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1595 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1596 Message-Id: <8580ff50825a50c8f716.61@
1596 Message-Id: <8580ff50825a50c8f716.61@
1597 In-Reply-To: <patchbomb.60@
1597 In-Reply-To: <patchbomb.60@
1598 References: <patchbomb.60@
1598 References: <patchbomb.60@
1599 User-Agent: Mercurial-patchbomb
1599 User-Agent: Mercurial-patchbomb
1600 Date: Thu, 01 Jan 1970 00:01:01 +0000
1600 Date: Thu, 01 Jan 1970 00:01:01 +0000
1601 From: quux
1601 From: quux
1602 To: foo
1602 To: foo
1603 Cc: bar
1603 Cc: bar
1604
1604
1605 # HG changeset patch
1605 # HG changeset patch
1606 # User test
1606 # User test
1607 # Date 1 0
1607 # Date 1 0
1608 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1608 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1609 # Parent 0000000000000000000000000000000000000000
1609 # Parent 0000000000000000000000000000000000000000
1610 a
1610 a
1611
1611
1612 diff -r 000000000000 -r 8580ff50825a a
1612 diff -r 000000000000 -r 8580ff50825a a
1613 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1613 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1614 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1614 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1615 @@ -0,0 +1,1 @@
1615 @@ -0,0 +1,1 @@
1616 +a
1616 +a
1617
1617
1618 Displaying [PATCH 2 of 2 fooFlag] b ...
1618 Displaying [PATCH 2 of 2 fooFlag] b ...
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 2 of 2 fooFlag] b
1622 Subject: [PATCH 2 of 2 fooFlag] b
1623 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1623 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1624 Message-Id: <97d72e5f12c7e84f8506.62@
1624 Message-Id: <97d72e5f12c7e84f8506.62@
1625 In-Reply-To: <patchbomb.60@
1625 In-Reply-To: <patchbomb.60@
1626 References: <patchbomb.60@
1626 References: <patchbomb.60@
1627 User-Agent: Mercurial-patchbomb
1627 User-Agent: Mercurial-patchbomb
1628 Date: Thu, 01 Jan 1970 00:01:02 +0000
1628 Date: Thu, 01 Jan 1970 00:01:02 +0000
1629 From: quux
1629 From: quux
1630 To: foo
1630 To: foo
1631 Cc: bar
1631 Cc: bar
1632
1632
1633 # HG changeset patch
1633 # HG changeset patch
1634 # User test
1634 # User test
1635 # Date 2 0
1635 # Date 2 0
1636 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1636 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1637 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1637 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1638 b
1638 b
1639
1639
1640 diff -r 8580ff50825a -r 97d72e5f12c7 b
1640 diff -r 8580ff50825a -r 97d72e5f12c7 b
1641 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1641 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1642 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1642 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1643 @@ -0,0 +1,1 @@
1643 @@ -0,0 +1,1 @@
1644 +b
1644 +b
1645
1645
1646
1646
1647 test mutiple flags for single patch:
1647 test mutiple flags for single patch:
1648 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
1648 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
1649 > -c bar -s test -r 2 | fixheaders
1649 > -c bar -s test -r 2 | fixheaders
1650 This patch series consists of 1 patches.
1650 This patch series consists of 1 patches.
1651
1651
1652
1652
1653 Displaying [PATCH fooFlag barFlag] test ...
1653 Displaying [PATCH fooFlag barFlag] test ...
1654 Content-Type: text/plain; charset="us-ascii"
1654 Content-Type: text/plain; charset="us-ascii"
1655 MIME-Version: 1.0
1655 MIME-Version: 1.0
1656 Content-Transfer-Encoding: 7bit
1656 Content-Transfer-Encoding: 7bit
1657 Subject: [PATCH fooFlag barFlag] test
1657 Subject: [PATCH fooFlag barFlag] test
1658 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1658 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1659 Message-Id: <ff2c9fa2018b15fa74b3.60@
1659 Message-Id: <ff2c9fa2018b15fa74b3.60@
1660 User-Agent: Mercurial-patchbomb
1660 User-Agent: Mercurial-patchbomb
1661 Date: Thu, 01 Jan 1970 00:01:00 +0000
1661 Date: Thu, 01 Jan 1970 00:01:00 +0000
1662 From: quux
1662 From: quux
1663 To: foo
1663 To: foo
1664 Cc: bar
1664 Cc: bar
1665
1665
1666 # HG changeset patch
1666 # HG changeset patch
1667 # User test
1667 # User test
1668 # Date 3 0
1668 # Date 3 0
1669 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1669 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1670 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1670 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1671 c
1671 c
1672
1672
1673 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1673 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1674 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1674 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1675 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1675 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1676 @@ -0,0 +1,1 @@
1676 @@ -0,0 +1,1 @@
1677 +c
1677 +c
1678
1678
1679
1679
1680 test multiple flags for multiple patches:
1680 test multiple flags for multiple patches:
1681 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
1681 $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
1682 > -c bar -s test -r 0:1 | fixheaders
1682 > -c bar -s test -r 0:1 | fixheaders
1683 This patch series consists of 2 patches.
1683 This patch series consists of 2 patches.
1684
1684
1685
1685
1686 Write the introductory message for the patch series.
1686 Write the introductory message for the patch series.
1687
1687
1688
1688
1689 Displaying [PATCH 0 of 2 fooFlag barFlag] test ...
1689 Displaying [PATCH 0 of 2 fooFlag barFlag] test ...
1690 Content-Type: text/plain; charset="us-ascii"
1690 Content-Type: text/plain; charset="us-ascii"
1691 MIME-Version: 1.0
1691 MIME-Version: 1.0
1692 Content-Transfer-Encoding: 7bit
1692 Content-Transfer-Encoding: 7bit
1693 Subject: [PATCH 0 of 2 fooFlag barFlag] test
1693 Subject: [PATCH 0 of 2 fooFlag barFlag] test
1694 Message-Id: <patchbomb.60@
1694 Message-Id: <patchbomb.60@
1695 User-Agent: Mercurial-patchbomb
1695 User-Agent: Mercurial-patchbomb
1696 Date: Thu, 01 Jan 1970 00:01:00 +0000
1696 Date: Thu, 01 Jan 1970 00:01:00 +0000
1697 From: quux
1697 From: quux
1698 To: foo
1698 To: foo
1699 Cc: bar
1699 Cc: bar
1700
1700
1701
1701
1702 Displaying [PATCH 1 of 2 fooFlag barFlag] a ...
1702 Displaying [PATCH 1 of 2 fooFlag barFlag] a ...
1703 Content-Type: text/plain; charset="us-ascii"
1703 Content-Type: text/plain; charset="us-ascii"
1704 MIME-Version: 1.0
1704 MIME-Version: 1.0
1705 Content-Transfer-Encoding: 7bit
1705 Content-Transfer-Encoding: 7bit
1706 Subject: [PATCH 1 of 2 fooFlag barFlag] a
1706 Subject: [PATCH 1 of 2 fooFlag barFlag] a
1707 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1707 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1708 Message-Id: <8580ff50825a50c8f716.61@
1708 Message-Id: <8580ff50825a50c8f716.61@
1709 In-Reply-To: <patchbomb.60@
1709 In-Reply-To: <patchbomb.60@
1710 References: <patchbomb.60@
1710 References: <patchbomb.60@
1711 User-Agent: Mercurial-patchbomb
1711 User-Agent: Mercurial-patchbomb
1712 Date: Thu, 01 Jan 1970 00:01:01 +0000
1712 Date: Thu, 01 Jan 1970 00:01:01 +0000
1713 From: quux
1713 From: quux
1714 To: foo
1714 To: foo
1715 Cc: bar
1715 Cc: bar
1716
1716
1717 # HG changeset patch
1717 # HG changeset patch
1718 # User test
1718 # User test
1719 # Date 1 0
1719 # Date 1 0
1720 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1720 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1721 # Parent 0000000000000000000000000000000000000000
1721 # Parent 0000000000000000000000000000000000000000
1722 a
1722 a
1723
1723
1724 diff -r 000000000000 -r 8580ff50825a a
1724 diff -r 000000000000 -r 8580ff50825a a
1725 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1725 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1726 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1726 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1727 @@ -0,0 +1,1 @@
1727 @@ -0,0 +1,1 @@
1728 +a
1728 +a
1729
1729
1730 Displaying [PATCH 2 of 2 fooFlag barFlag] b ...
1730 Displaying [PATCH 2 of 2 fooFlag barFlag] b ...
1731 Content-Type: text/plain; charset="us-ascii"
1731 Content-Type: text/plain; charset="us-ascii"
1732 MIME-Version: 1.0
1732 MIME-Version: 1.0
1733 Content-Transfer-Encoding: 7bit
1733 Content-Transfer-Encoding: 7bit
1734 Subject: [PATCH 2 of 2 fooFlag barFlag] b
1734 Subject: [PATCH 2 of 2 fooFlag barFlag] b
1735 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1735 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1736 Message-Id: <97d72e5f12c7e84f8506.62@
1736 Message-Id: <97d72e5f12c7e84f8506.62@
1737 In-Reply-To: <patchbomb.60@
1737 In-Reply-To: <patchbomb.60@
1738 References: <patchbomb.60@
1738 References: <patchbomb.60@
1739 User-Agent: Mercurial-patchbomb
1739 User-Agent: Mercurial-patchbomb
1740 Date: Thu, 01 Jan 1970 00:01:02 +0000
1740 Date: Thu, 01 Jan 1970 00:01:02 +0000
1741 From: quux
1741 From: quux
1742 To: foo
1742 To: foo
1743 Cc: bar
1743 Cc: bar
1744
1744
1745 # HG changeset patch
1745 # HG changeset patch
1746 # User test
1746 # User test
1747 # Date 2 0
1747 # Date 2 0
1748 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1748 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1749 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1749 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
1750 b
1750 b
1751
1751
1752 diff -r 8580ff50825a -r 97d72e5f12c7 b
1752 diff -r 8580ff50825a -r 97d72e5f12c7 b
1753 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1753 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1754 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1754 +++ b/b Thu Jan 01 00:00:02 1970 +0000
1755 @@ -0,0 +1,1 @@
1755 @@ -0,0 +1,1 @@
1756 +b
1756 +b
1757
1757
1758
1758
1759 test multi-address parsing:
1759 test multi-address parsing:
1760 $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t 'spam<spam><eggs>' \
1760 $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t 'spam<spam><eggs>' \
1761 > -t toast -c 'foo,bar@example.com' -c '"A, B <>" <a@example.com>' -s test -r 0 \
1761 > -t toast -c 'foo,bar@example.com' -c '"A, B <>" <a@example.com>' -s test -r 0 \
1762 > --config email.bcc='"Quux, A." <quux>'
1762 > --config email.bcc='"Quux, A." <quux>'
1763 This patch series consists of 1 patches.
1763 This patch series consists of 1 patches.
1764
1764
1765
1765
1766 Writing [PATCH] test ...
1766 Writing [PATCH] test ...
1767 $ fixheaders < tmp.mbox
1767 $ fixheaders < tmp.mbox
1768 From quux Tue Jan 01 00:01:01 1980
1768 From quux Tue Jan 01 00:01:01 1980
1769 Content-Type: text/plain; charset="us-ascii"
1769 Content-Type: text/plain; charset="us-ascii"
1770 MIME-Version: 1.0
1770 MIME-Version: 1.0
1771 Content-Transfer-Encoding: 7bit
1771 Content-Transfer-Encoding: 7bit
1772 Subject: [PATCH] test
1772 Subject: [PATCH] test
1773 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1773 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1774 Message-Id: <8580ff50825a50c8f716.315532860@
1774 Message-Id: <8580ff50825a50c8f716.315532860@
1775 User-Agent: Mercurial-patchbomb
1775 User-Agent: Mercurial-patchbomb
1776 Date: Tue, 01 Jan 1980 00:01:00 +0000
1776 Date: Tue, 01 Jan 1980 00:01:00 +0000
1777 From: quux
1777 From: quux
1778 To: spam <spam>, eggs, toast
1778 To: spam <spam>, eggs, toast
1779 Cc: foo, bar@example.com, "A, B <>" <a@example.com>
1779 Cc: foo, bar@example.com, "A, B <>" <a@example.com>
1780 Bcc: "Quux, A." <quux>
1780 Bcc: "Quux, A." <quux>
1781
1781
1782 # HG changeset patch
1782 # HG changeset patch
1783 # User test
1783 # User test
1784 # Date 1 0
1784 # Date 1 0
1785 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1785 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1786 # Parent 0000000000000000000000000000000000000000
1786 # Parent 0000000000000000000000000000000000000000
1787 a
1787 a
1788
1788
1789 diff -r 000000000000 -r 8580ff50825a a
1789 diff -r 000000000000 -r 8580ff50825a a
1790 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1790 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1791 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1791 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1792 @@ -0,0 +1,1 @@
1792 @@ -0,0 +1,1 @@
1793 +a
1793 +a
1794
1794
1795
1795
1796
1796
1797 test multi-byte domain parsing:
1797 test multi-byte domain parsing:
1798 $ UUML=`python -c 'import sys; sys.stdout.write("\374")'`
1798 $ UUML=`python -c 'import sys; sys.stdout.write("\374")'`
1799 $ HGENCODING=iso-8859-1
1799 $ HGENCODING=iso-8859-1
1800 $ export HGENCODING
1800 $ export HGENCODING
1801 $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t "bar@${UUML}nicode.com" -s test -r 0
1801 $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t "bar@${UUML}nicode.com" -s test -r 0
1802 This patch series consists of 1 patches.
1802 This patch series consists of 1 patches.
1803
1803
1804 Cc:
1804 Cc:
1805
1805
1806 Writing [PATCH] test ...
1806 Writing [PATCH] test ...
1807
1807
1808 $ cat tmp.mbox
1808 $ cat tmp.mbox
1809 From quux Tue Jan 01 00:01:01 1980
1809 From quux Tue Jan 01 00:01:01 1980
1810 Content-Type: text/plain; charset="us-ascii"
1810 Content-Type: text/plain; charset="us-ascii"
1811 MIME-Version: 1.0
1811 MIME-Version: 1.0
1812 Content-Transfer-Encoding: 7bit
1812 Content-Transfer-Encoding: 7bit
1813 Subject: [PATCH] test
1813 Subject: [PATCH] test
1814 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1814 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
1815 Message-Id: <8580ff50825a50c8f716.315532860@* (glob)
1815 Message-Id: <8580ff50825a50c8f716.315532860@* (glob)
1816 User-Agent: Mercurial-patchbomb/* (glob)
1816 User-Agent: Mercurial-patchbomb/* (glob)
1817 Date: Tue, 01 Jan 1980 00:01:00 +0000
1817 Date: Tue, 01 Jan 1980 00:01:00 +0000
1818 From: quux
1818 From: quux
1819 To: bar@xn--nicode-2ya.com
1819 To: bar@xn--nicode-2ya.com
1820
1820
1821 # HG changeset patch
1821 # HG changeset patch
1822 # User test
1822 # User test
1823 # Date 1 0
1823 # Date 1 0
1824 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1824 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
1825 # Parent 0000000000000000000000000000000000000000
1825 # Parent 0000000000000000000000000000000000000000
1826 a
1826 a
1827
1827
1828 diff -r 000000000000 -r 8580ff50825a a
1828 diff -r 000000000000 -r 8580ff50825a a
1829 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1829 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1830 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1830 +++ b/a Thu Jan 01 00:00:01 1970 +0000
1831 @@ -0,0 +1,1 @@
1831 @@ -0,0 +1,1 @@
1832 +a
1832 +a
1833
1833
1834
1834
1835
1835
1836 test outgoing:
1836 test outgoing:
1837 $ hg up 1
1837 $ hg up 1
1838 0 files updated, 0 files merged, 6 files removed, 0 files unresolved
1838 0 files updated, 0 files merged, 6 files removed, 0 files unresolved
1839
1839
1840 $ hg branch test
1840 $ hg branch test
1841 marked working directory as branch test
1841 marked working directory as branch test
1842
1842
1843 $ echo d > d
1843 $ echo d > d
1844 $ hg add d
1844 $ hg add d
1845 $ hg ci -md -d '4 0'
1845 $ hg ci -md -d '4 0'
1846 $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t
1846 $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t
1847 comparing with ../t
1847 comparing with ../t
1848 searching for changes
1848 searching for changes
1849 From [test]: test
1849 From [test]: test
1850 This patch series consists of 8 patches.
1850 This patch series consists of 8 patches.
1851
1851
1852
1852
1853 Write the introductory message for the patch series.
1853 Write the introductory message for the patch series.
1854
1854
1855 Cc:
1855 Cc:
1856
1856
1857 Displaying [PATCH 0 of 8] test ...
1857 Displaying [PATCH 0 of 8] test ...
1858 Content-Type: text/plain; charset="us-ascii"
1858 Content-Type: text/plain; charset="us-ascii"
1859 MIME-Version: 1.0
1859 MIME-Version: 1.0
1860 Content-Transfer-Encoding: 7bit
1860 Content-Transfer-Encoding: 7bit
1861 Subject: [PATCH 0 of 8] test
1861 Subject: [PATCH 0 of 8] test
1862 Message-Id: <patchbomb.315532860@* (glob)
1862 Message-Id: <patchbomb.315532860@* (glob)
1863 User-Agent: Mercurial-patchbomb/* (glob)
1863 User-Agent: Mercurial-patchbomb/* (glob)
1864 Date: Tue, 01 Jan 1980 00:01:00 +0000
1864 Date: Tue, 01 Jan 1980 00:01:00 +0000
1865 From: test
1865 From: test
1866 To: foo
1866 To: foo
1867
1867
1868
1868
1869 Displaying [PATCH 1 of 8] c ...
1869 Displaying [PATCH 1 of 8] c ...
1870 Content-Type: text/plain; charset="us-ascii"
1870 Content-Type: text/plain; charset="us-ascii"
1871 MIME-Version: 1.0
1871 MIME-Version: 1.0
1872 Content-Transfer-Encoding: 7bit
1872 Content-Transfer-Encoding: 7bit
1873 Subject: [PATCH 1 of 8] c
1873 Subject: [PATCH 1 of 8] c
1874 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1874 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
1875 Message-Id: <ff2c9fa2018b15fa74b3.315532861@* (glob)
1875 Message-Id: <ff2c9fa2018b15fa74b3.315532861@* (glob)
1876 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1876 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1877 References: <patchbomb\.315532860@[^>]*> (re)
1877 References: <patchbomb\.315532860@[^>]*> (re)
1878 User-Agent: Mercurial-patchbomb/* (glob)
1878 User-Agent: Mercurial-patchbomb/* (glob)
1879 Date: Tue, 01 Jan 1980 00:01:01 +0000
1879 Date: Tue, 01 Jan 1980 00:01:01 +0000
1880 From: test
1880 From: test
1881 To: foo
1881 To: foo
1882
1882
1883 # HG changeset patch
1883 # HG changeset patch
1884 # User test
1884 # User test
1885 # Date 3 0
1885 # Date 3 0
1886 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1886 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
1887 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1887 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
1888 c
1888 c
1889
1889
1890 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1890 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
1891 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1891 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1892 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1892 +++ b/c Thu Jan 01 00:00:03 1970 +0000
1893 @@ -0,0 +1,1 @@
1893 @@ -0,0 +1,1 @@
1894 +c
1894 +c
1895
1895
1896 Displaying [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64 ...
1896 Displaying [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64 ...
1897 Content-Type: text/plain; charset="us-ascii"
1897 Content-Type: text/plain; charset="us-ascii"
1898 MIME-Version: 1.0
1898 MIME-Version: 1.0
1899 Content-Transfer-Encoding: 8bit
1899 Content-Transfer-Encoding: 8bit
1900 Subject: [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64
1900 Subject: [PATCH 2 of 8] charset=utf-8; content-transfer-encoding: base64
1901 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1901 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1902 Message-Id: <c3c9e37db9f4fe4882cd.315532862@* (glob)
1902 Message-Id: <c3c9e37db9f4fe4882cd.315532862@* (glob)
1903 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1903 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1904 References: <patchbomb\.315532860@[^>]*> (re)
1904 References: <patchbomb\.315532860@[^>]*> (re)
1905 User-Agent: Mercurial-patchbomb/* (glob)
1905 User-Agent: Mercurial-patchbomb/* (glob)
1906 Date: Tue, 01 Jan 1980 00:01:02 +0000
1906 Date: Tue, 01 Jan 1980 00:01:02 +0000
1907 From: test
1907 From: test
1908 To: foo
1908 To: foo
1909
1909
1910 # HG changeset patch
1910 # HG changeset patch
1911 # User test
1911 # User test
1912 # Date 4 0
1912 # Date 4 0
1913 # Node ID c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1913 # Node ID c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1914 # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
1914 # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
1915 charset=utf-8; content-transfer-encoding: base64
1915 charset=utf-8; content-transfer-encoding: base64
1916
1916
1917 diff -r ff2c9fa2018b -r c3c9e37db9f4 description
1917 diff -r ff2c9fa2018b -r c3c9e37db9f4 description
1918 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1918 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1919 +++ b/description Thu Jan 01 00:00:04 1970 +0000
1919 +++ b/description Thu Jan 01 00:00:04 1970 +0000
1920 @@ -0,0 +1,3 @@
1920 @@ -0,0 +1,3 @@
1921 +a multiline
1921 +a multiline
1922 +
1922 +
1923 +description
1923 +description
1924 diff -r ff2c9fa2018b -r c3c9e37db9f4 utf
1924 diff -r ff2c9fa2018b -r c3c9e37db9f4 utf
1925 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1925 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1926 +++ b/utf Thu Jan 01 00:00:04 1970 +0000
1926 +++ b/utf Thu Jan 01 00:00:04 1970 +0000
1927 @@ -0,0 +1,1 @@
1927 @@ -0,0 +1,1 @@
1928 +hΓΆmma!
1928 +hΓΆmma!
1929
1929
1930 Displaying [PATCH 3 of 8] charset=utf-8; content-transfer-encoding: quoted-printable ...
1930 Displaying [PATCH 3 of 8] charset=utf-8; content-transfer-encoding: quoted-printable ...
1931 Content-Type: text/plain; charset="us-ascii"
1931 Content-Type: text/plain; charset="us-ascii"
1932 MIME-Version: 1.0
1932 MIME-Version: 1.0
1933 Content-Transfer-Encoding: quoted-printable
1933 Content-Transfer-Encoding: quoted-printable
1934 Subject: [PATCH 3 of 8] charset=utf-8;
1934 Subject: [PATCH 3 of 8] charset=utf-8;
1935 content-transfer-encoding: quoted-printable
1935 content-transfer-encoding: quoted-printable
1936 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
1936 X-Mercurial-Node: c655633f8c87700bb38cc6a59a2753bdc5a6c376
1937 Message-Id: <c655633f8c87700bb38c.315532863@* (glob)
1937 Message-Id: <c655633f8c87700bb38c.315532863@* (glob)
1938 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1938 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1939 References: <patchbomb\.315532860@[^>]*> (re)
1939 References: <patchbomb\.315532860@[^>]*> (re)
1940 User-Agent: Mercurial-patchbomb/* (glob)
1940 User-Agent: Mercurial-patchbomb/* (glob)
1941 Date: Tue, 01 Jan 1980 00:01:03 +0000
1941 Date: Tue, 01 Jan 1980 00:01:03 +0000
1942 From: test
1942 From: test
1943 To: foo
1943 To: foo
1944
1944
1945 # HG changeset patch
1945 # HG changeset patch
1946 # User test
1946 # User test
1947 # Date 4 0
1947 # Date 4 0
1948 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
1948 # Node ID c655633f8c87700bb38cc6a59a2753bdc5a6c376
1949 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1949 # Parent c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
1950 charset=3Dutf-8; content-transfer-encoding: quoted-printable
1950 charset=3Dutf-8; content-transfer-encoding: quoted-printable
1951
1951
1952 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1952 diff -r c3c9e37db9f4 -r c655633f8c87 qp
1953 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1953 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1954 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1954 +++ b/qp Thu Jan 01 00:00:04 1970 +0000
1955 @@ -0,0 +1,4 @@
1955 @@ -0,0 +1,4 @@
1956 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1956 +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1957 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1957 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1958 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1958 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1959 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1959 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1960 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1960 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1961 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1961 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1962 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1962 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1963 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1963 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1964 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1964 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1965 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1965 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1966 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1966 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1967 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1967 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1968 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1968 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
1969 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1969 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1970 +foo
1970 +foo
1971 +
1971 +
1972 +bar
1972 +bar
1973
1973
1974 Displaying [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit ...
1974 Displaying [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit ...
1975 Content-Type: text/plain; charset="us-ascii"
1975 Content-Type: text/plain; charset="us-ascii"
1976 MIME-Version: 1.0
1976 MIME-Version: 1.0
1977 Content-Transfer-Encoding: 8bit
1977 Content-Transfer-Encoding: 8bit
1978 Subject: [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit
1978 Subject: [PATCH 4 of 8] charset=us-ascii; content-transfer-encoding: 8bit
1979 X-Mercurial-Node: 22d0f96be12f5945fd67d101af58f7bc8263c835
1979 X-Mercurial-Node: 22d0f96be12f5945fd67d101af58f7bc8263c835
1980 Message-Id: <22d0f96be12f5945fd67.315532864@* (glob)
1980 Message-Id: <22d0f96be12f5945fd67.315532864@* (glob)
1981 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1981 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
1982 References: <patchbomb\.315532860@[^>]*> (re)
1982 References: <patchbomb\.315532860@[^>]*> (re)
1983 User-Agent: Mercurial-patchbomb/* (glob)
1983 User-Agent: Mercurial-patchbomb/* (glob)
1984 Date: Tue, 01 Jan 1980 00:01:04 +0000
1984 Date: Tue, 01 Jan 1980 00:01:04 +0000
1985 From: test
1985 From: test
1986 To: foo
1986 To: foo
1987
1987
1988 # HG changeset patch
1988 # HG changeset patch
1989 # User test
1989 # User test
1990 # Date 5 0
1990 # Date 5 0
1991 # Node ID 22d0f96be12f5945fd67d101af58f7bc8263c835
1991 # Node ID 22d0f96be12f5945fd67d101af58f7bc8263c835
1992 # Parent c655633f8c87700bb38cc6a59a2753bdc5a6c376
1992 # Parent c655633f8c87700bb38cc6a59a2753bdc5a6c376
1993 charset=us-ascii; content-transfer-encoding: 8bit
1993 charset=us-ascii; content-transfer-encoding: 8bit
1994
1994
1995 diff -r c655633f8c87 -r 22d0f96be12f isolatin
1995 diff -r c655633f8c87 -r 22d0f96be12f isolatin
1996 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1996 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1997 +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
1997 +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
1998 @@ -0,0 +1,1 @@
1998 @@ -0,0 +1,1 @@
1999 +hοΏ½mma!
1999 +hοΏ½mma!
2000
2000
2001 Displaying [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a ...
2001 Displaying [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a ...
2002 Content-Type: text/plain; charset="us-ascii"
2002 Content-Type: text/plain; charset="us-ascii"
2003 MIME-Version: 1.0
2003 MIME-Version: 1.0
2004 Content-Transfer-Encoding: 7bit
2004 Content-Transfer-Encoding: 7bit
2005 Subject: [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a
2005 Subject: [PATCH 5 of 8] Added tag zero, zero.foo for changeset 8580ff50825a
2006 X-Mercurial-Node: dd9c2b4b8a8a0934d5523c15f2c119b362360903
2006 X-Mercurial-Node: dd9c2b4b8a8a0934d5523c15f2c119b362360903
2007 Message-Id: <dd9c2b4b8a8a0934d552.315532865@* (glob)
2007 Message-Id: <dd9c2b4b8a8a0934d552.315532865@* (glob)
2008 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2008 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2009 References: <patchbomb\.315532860@[^>]*> (re)
2009 References: <patchbomb\.315532860@[^>]*> (re)
2010 User-Agent: Mercurial-patchbomb/* (glob)
2010 User-Agent: Mercurial-patchbomb/* (glob)
2011 Date: Tue, 01 Jan 1980 00:01:05 +0000
2011 Date: Tue, 01 Jan 1980 00:01:05 +0000
2012 From: test
2012 From: test
2013 To: foo
2013 To: foo
2014
2014
2015 # HG changeset patch
2015 # HG changeset patch
2016 # User test
2016 # User test
2017 # Date 0 0
2017 # Date 0 0
2018 # Node ID dd9c2b4b8a8a0934d5523c15f2c119b362360903
2018 # Node ID dd9c2b4b8a8a0934d5523c15f2c119b362360903
2019 # Parent 22d0f96be12f5945fd67d101af58f7bc8263c835
2019 # Parent 22d0f96be12f5945fd67d101af58f7bc8263c835
2020 Added tag zero, zero.foo for changeset 8580ff50825a
2020 Added tag zero, zero.foo for changeset 8580ff50825a
2021
2021
2022 diff -r 22d0f96be12f -r dd9c2b4b8a8a .hgtags
2022 diff -r 22d0f96be12f -r dd9c2b4b8a8a .hgtags
2023 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2023 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2024 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2024 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2025 @@ -0,0 +1,2 @@
2025 @@ -0,0 +1,2 @@
2026 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero
2026 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero
2027 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2027 +8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2028
2028
2029 Displaying [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7 ...
2029 Displaying [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7 ...
2030 Content-Type: text/plain; charset="us-ascii"
2030 Content-Type: text/plain; charset="us-ascii"
2031 MIME-Version: 1.0
2031 MIME-Version: 1.0
2032 Content-Transfer-Encoding: 7bit
2032 Content-Transfer-Encoding: 7bit
2033 Subject: [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7
2033 Subject: [PATCH 6 of 8] Added tag one, one.patch for changeset 97d72e5f12c7
2034 X-Mercurial-Node: eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2034 X-Mercurial-Node: eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2035 Message-Id: <eae5fcf795eee29d0e45.315532866@* (glob)
2035 Message-Id: <eae5fcf795eee29d0e45.315532866@* (glob)
2036 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2036 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2037 References: <patchbomb\.315532860@[^>]*> (re)
2037 References: <patchbomb\.315532860@[^>]*> (re)
2038 User-Agent: Mercurial-patchbomb/* (glob)
2038 User-Agent: Mercurial-patchbomb/* (glob)
2039 Date: Tue, 01 Jan 1980 00:01:06 +0000
2039 Date: Tue, 01 Jan 1980 00:01:06 +0000
2040 From: test
2040 From: test
2041 To: foo
2041 To: foo
2042
2042
2043 # HG changeset patch
2043 # HG changeset patch
2044 # User test
2044 # User test
2045 # Date 0 0
2045 # Date 0 0
2046 # Node ID eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2046 # Node ID eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2047 # Parent dd9c2b4b8a8a0934d5523c15f2c119b362360903
2047 # Parent dd9c2b4b8a8a0934d5523c15f2c119b362360903
2048 Added tag one, one.patch for changeset 97d72e5f12c7
2048 Added tag one, one.patch for changeset 97d72e5f12c7
2049
2049
2050 diff -r dd9c2b4b8a8a -r eae5fcf795ee .hgtags
2050 diff -r dd9c2b4b8a8a -r eae5fcf795ee .hgtags
2051 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
2051 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
2052 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2052 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2053 @@ -1,2 +1,4 @@
2053 @@ -1,2 +1,4 @@
2054 8580ff50825a50c8f716709acdf8de0deddcd6ab zero
2054 8580ff50825a50c8f716709acdf8de0deddcd6ab zero
2055 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2055 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2056 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
2056 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
2057 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
2057 +97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
2058
2058
2059 Displaying [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b ...
2059 Displaying [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b ...
2060 Content-Type: text/plain; charset="us-ascii"
2060 Content-Type: text/plain; charset="us-ascii"
2061 MIME-Version: 1.0
2061 MIME-Version: 1.0
2062 Content-Transfer-Encoding: 7bit
2062 Content-Transfer-Encoding: 7bit
2063 Subject: [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b
2063 Subject: [PATCH 7 of 8] Added tag two, two.diff for changeset ff2c9fa2018b
2064 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
2064 X-Mercurial-Node: e317db6a6f288748d1f6cb064f3810fcba66b1b6
2065 Message-Id: <e317db6a6f288748d1f6.315532867@* (glob)
2065 Message-Id: <e317db6a6f288748d1f6.315532867@* (glob)
2066 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2066 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2067 References: <patchbomb\.315532860@[^>]*> (re)
2067 References: <patchbomb\.315532860@[^>]*> (re)
2068 User-Agent: Mercurial-patchbomb/* (glob)
2068 User-Agent: Mercurial-patchbomb/* (glob)
2069 Date: Tue, 01 Jan 1980 00:01:07 +0000
2069 Date: Tue, 01 Jan 1980 00:01:07 +0000
2070 From: test
2070 From: test
2071 To: foo
2071 To: foo
2072
2072
2073 # HG changeset patch
2073 # HG changeset patch
2074 # User test
2074 # User test
2075 # Date 0 0
2075 # Date 0 0
2076 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
2076 # Node ID e317db6a6f288748d1f6cb064f3810fcba66b1b6
2077 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2077 # Parent eae5fcf795eee29d0e45ffc9f519a91cd79fc9ff
2078 Added tag two, two.diff for changeset ff2c9fa2018b
2078 Added tag two, two.diff for changeset ff2c9fa2018b
2079
2079
2080 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
2080 diff -r eae5fcf795ee -r e317db6a6f28 .hgtags
2081 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
2081 --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
2082 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2082 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
2083 @@ -2,3 +2,5 @@
2083 @@ -2,3 +2,5 @@
2084 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2084 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
2085 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
2085 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
2086 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
2086 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
2087 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
2087 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
2088 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
2088 +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
2089
2089
2090 Displaying [PATCH 8 of 8] d ...
2090 Displaying [PATCH 8 of 8] d ...
2091 Content-Type: text/plain; charset="us-ascii"
2091 Content-Type: text/plain; charset="us-ascii"
2092 MIME-Version: 1.0
2092 MIME-Version: 1.0
2093 Content-Transfer-Encoding: 7bit
2093 Content-Transfer-Encoding: 7bit
2094 Subject: [PATCH 8 of 8] d
2094 Subject: [PATCH 8 of 8] d
2095 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2095 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2096 Message-Id: <2f9fa9b998c5fe3ac2bd\.315532868[^>]*> (re)
2096 Message-Id: <2f9fa9b998c5fe3ac2bd\.315532868[^>]*> (re)
2097 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2097 In-Reply-To: <patchbomb\.315532860@[^>]*> (re)
2098 References: <patchbomb\.315532860@[^>]*> (re)
2098 References: <patchbomb\.315532860@[^>]*> (re)
2099 User-Agent: Mercurial-patchbomb/* (glob)
2099 User-Agent: Mercurial-patchbomb/* (glob)
2100 Date: Tue, 01 Jan 1980 00:01:08 +0000
2100 Date: Tue, 01 Jan 1980 00:01:08 +0000
2101 From: test
2101 From: test
2102 To: foo
2102 To: foo
2103
2103
2104 # HG changeset patch
2104 # HG changeset patch
2105 # User test
2105 # User test
2106 # Date 4 0
2106 # Date 4 0
2107 # Branch test
2107 # Branch test
2108 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2108 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2109 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
2109 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
2110 d
2110 d
2111
2111
2112 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
2112 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
2113 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2113 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2114 +++ b/d Thu Jan 01 00:00:04 1970 +0000
2114 +++ b/d Thu Jan 01 00:00:04 1970 +0000
2115 @@ -0,0 +1,1 @@
2115 @@ -0,0 +1,1 @@
2116 +d
2116 +d
2117
2117
2118
2118
2119 dest#branch URIs:
2119 dest#branch URIs:
2120 $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t#test
2120 $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t#test
2121 comparing with ../t
2121 comparing with ../t
2122 searching for changes
2122 searching for changes
2123 From [test]: test
2123 From [test]: test
2124 This patch series consists of 1 patches.
2124 This patch series consists of 1 patches.
2125
2125
2126 Cc:
2126 Cc:
2127
2127
2128 Displaying [PATCH] test ...
2128 Displaying [PATCH] test ...
2129 Content-Type: text/plain; charset="us-ascii"
2129 Content-Type: text/plain; charset="us-ascii"
2130 MIME-Version: 1.0
2130 MIME-Version: 1.0
2131 Content-Transfer-Encoding: 7bit
2131 Content-Transfer-Encoding: 7bit
2132 Subject: [PATCH] test
2132 Subject: [PATCH] test
2133 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2133 X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2134 Message-Id: <2f9fa9b998c5fe3ac2bd.315532860@* (glob)
2134 Message-Id: <2f9fa9b998c5fe3ac2bd.315532860@* (glob)
2135 User-Agent: Mercurial-patchbomb/* (glob)
2135 User-Agent: Mercurial-patchbomb/* (glob)
2136 Date: Tue, 01 Jan 1980 00:01:00 +0000
2136 Date: Tue, 01 Jan 1980 00:01:00 +0000
2137 From: test
2137 From: test
2138 To: foo
2138 To: foo
2139
2139
2140 # HG changeset patch
2140 # HG changeset patch
2141 # User test
2141 # User test
2142 # Date 4 0
2142 # Date 4 0
2143 # Branch test
2143 # Branch test
2144 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2144 # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
2145 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
2145 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
2146 d
2146 d
2147
2147
2148 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
2148 diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
2149 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2149 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2150 +++ b/d Thu Jan 01 00:00:04 1970 +0000
2150 +++ b/d Thu Jan 01 00:00:04 1970 +0000
2151 @@ -0,0 +1,1 @@
2151 @@ -0,0 +1,1 @@
2152 +d
2152 +d
2153
2153
General Comments 0
You need to be logged in to leave comments. Login now