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