# HG changeset patch # User Matt Mackall # Date 1281654532 18000 # Node ID 00fee6394daf3cafe8a7f4cc348afe0b9d9b8e6c # Parent 3152c978496ae0a5e87f21c7c7abb1baf3de85f1# Parent f1c2de22b8a88baf36c69b852f8a3b35ca6b6c91 merge with i18n diff -r 3152c978496a -r 00fee6394daf contrib/check-code.py --- a/contrib/check-code.py Thu Aug 12 18:10:42 2010 +0200 +++ b/contrib/check-code.py Thu Aug 12 18:08:52 2010 -0500 @@ -7,7 +7,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -import re, glob, os +import re, glob, os, sys import optparse def repquote(m): @@ -261,5 +261,8 @@ check = args for f in check: - checkfile(f, maxerr=options.per_file, warnings=options.warnings, - blame=options.blame) + ret = 0 + if not checkfile(f, maxerr=options.per_file, warnings=options.warnings, + blame=options.blame): + ret = 1 + sys.exit(ret) diff -r 3152c978496a -r 00fee6394daf hgext/bookmarks.py --- a/hgext/bookmarks.py Thu Aug 12 18:10:42 2010 +0200 +++ b/hgext/bookmarks.py Thu Aug 12 18:08:52 2010 -0500 @@ -299,7 +299,7 @@ self.ui.debug("checking for updated bookmarks\n") rb = remote.listkeys('bookmarks') - changes = 0 + changed = False for k in rb.keys(): if k in self._bookmarks: nr, nl = rb[k], self._bookmarks[k] @@ -310,12 +310,12 @@ continue if cr in cl.descendants(): self._bookmarks[k] = cr.node() - changes += 1 + changed = True self.ui.status(_("updating bookmark %s\n") % k) else: self.ui.warn(_("not updating divergent" " bookmark %s\n") % k) - if changes: + if changed: write(repo) return result diff -r 3152c978496a -r 00fee6394daf hgext/convert/subversion.py --- a/hgext/convert/subversion.py Thu Aug 12 18:10:42 2010 +0200 +++ b/hgext/convert/subversion.py Thu Aug 12 18:08:52 2010 -0500 @@ -1157,4 +1157,5 @@ os.unlink(messagefile) def puttags(self, tags): - self.ui.warn(_('XXX TAGS NOT IMPLEMENTED YET\n')) + self.ui.warn(_('writing Subversion tags is not yet implemented\n')) + return None, None diff -r 3152c978496a -r 00fee6394daf hgext/graphlog.py --- a/hgext/graphlog.py Thu Aug 12 18:10:42 2010 +0200 +++ b/hgext/graphlog.py Thu Aug 12 18:08:52 2010 -0500 @@ -217,8 +217,8 @@ def check_unsupported_flags(opts): for op in ["follow", "follow_first", "date", "copies", "keyword", "remove", - "only_merges", "user", "only_branch", "prune", "newest_first", - "no_merges", "include", "exclude"]: + "only_merges", "user", "branch", "only_branch", "prune", + "newest_first", "no_merges", "include", "exclude"]: if op in opts and opts[op]: raise util.Abort(_("--graph option is incompatible with --%s") % op.replace("_", "-")) diff -r 3152c978496a -r 00fee6394daf hgext/mq.py --- a/hgext/mq.py Thu Aug 12 18:10:42 2010 +0200 +++ b/hgext/mq.py Thu Aug 12 18:08:52 2010 -0500 @@ -513,7 +513,7 @@ # apply failed, strip away that rev and merge. hg.clean(repo, head) - self.strip(repo, n, update=False, backup='strip') + self.strip(repo, [n], update=False, backup='strip') ctx = repo[rev] ret = hg.merge(repo, rev) @@ -895,7 +895,7 @@ finally: release(wlock) - def strip(self, repo, rev, update=True, backup="all", force=None): + def strip(self, repo, revs, update=True, backup="all", force=None): wlock = lock = None try: wlock = repo.wlock() @@ -903,12 +903,13 @@ if update: self.check_localchanges(repo, force=force, refresh=False) - urev = self.qparents(repo, rev) + urev = self.qparents(repo, revs[0]) hg.clean(repo, urev) repo.dirstate.write() self.removeundo(repo) - repair.strip(self.ui, repo, rev, backup) + for rev in revs: + repair.strip(self.ui, repo, rev, backup) # strip may have unbundled a set of backed up revisions after # the actual strip self.removeundo(repo) @@ -1197,7 +1198,7 @@ for patch in reversed(self.applied[start:end]): self.ui.status(_("popping %s\n") % patch.name) del self.applied[start:end] - self.strip(repo, rev, update=False, backup='strip') + self.strip(repo, [rev], update=False, backup='strip') if self.applied: self.ui.write(_("now at: %s\n") % self.applied[-1].name) else: @@ -1377,7 +1378,7 @@ repo.dirstate.setparents(*cparents) self.applied.pop() self.applied_dirty = 1 - self.strip(repo, top, update=False, + self.strip(repo, [top], update=False, backup='strip') except: repo.dirstate.invalidate() @@ -1532,7 +1533,7 @@ update = True else: update = False - self.strip(repo, rev, update=update, backup='strip') + self.strip(repo, [rev], update=update, backup='strip') if qpp: self.ui.warn(_("saved queue repository parents: %s %s\n") % (short(qpp[0]), short(qpp[1]))) @@ -1934,7 +1935,7 @@ if qbase: ui.note(_('stripping applied patches from destination ' 'repository\n')) - dr.mq.strip(dr, qbase, update=False, backup=None) + dr.mq.strip(dr, [qbase], update=False, backup=None) if not opts['noupdate']: ui.note(_('updating destination repository\n')) hg.update(dr, dr.changelog.tip()) @@ -2171,7 +2172,15 @@ ''' def status(idx): guards = q.series_guards[idx] or ['unguarded'] - ui.write('%s: ' % ui.label(q.series[idx], 'qguard.patch')) + if q.series[idx] in applied: + state = 'applied' + elif q.pushable(idx)[0]: + state = 'unapplied' + else: + state = 'guarded' + label = 'qguard.patch qguard.%s qseries.%s' % (state, state) + ui.write('%s: ' % ui.label(q.series[idx], label)) + for i, guard in enumerate(guards): if guard.startswith('+'): ui.write(guard, label='qguard.positive') @@ -2183,6 +2192,7 @@ ui.write(' ') ui.write('\n') q = repo.mq + applied = set(p.name for p in q.applied) patch = None args = list(args) if opts['list']: @@ -2396,14 +2406,12 @@ pass return 0 -def strip(ui, repo, rev, **opts): - """strip a changeset and all its descendants from the repository - - The strip command removes all changesets whose local revision - number is greater than or equal to REV, and then restores any - changesets that are not descendants of REV. If the working - directory has uncommitted changes, the operation is aborted unless - the --force flag is supplied. +def strip(ui, repo, *revs, **opts): + """strip changesets and all their descendants from the repository + + The strip command removes the specified changesets and all their + descendants. If the working directory has uncommitted changes, + the operation is aborted unless the --force flag is supplied. If a parent of the working directory is stripped, then the working directory will automatically be updated to the most recent @@ -2426,30 +2434,42 @@ elif opts['nobackup']: backup = 'none' - rev = repo.lookup(rev) - p = repo.dirstate.parents() cl = repo.changelog - update = True - if p[0] == nullid: - update = False - elif p[1] == nullid and rev != cl.ancestor(p[0], rev): - update = False - elif rev not in (cl.ancestor(p[0], rev), cl.ancestor(p[1], rev)): - update = False + revs = set(cl.rev(repo.lookup(r)) for r in revs) + + descendants = set(cl.descendants(*revs)) + strippedrevs = revs.union(descendants) + roots = revs.difference(descendants) + + update = False + # if one of the wdir parent is stripped we'll need + # to update away to an earlier revision + for p in repo.dirstate.parents(): + if p != nullid and cl.rev(p) in strippedrevs: + update = True + break + + rootnodes = set(cl.node(r) for r in roots) q = repo.mq if q.applied: - if rev == cl.ancestor(repo.lookup('qtip'), rev): + # refresh queue state if we're about to strip + # applied patches + if cl.rev(repo.lookup('qtip')) in strippedrevs: q.applied_dirty = True start = 0 end = len(q.applied) - applied_list = [i.node for i in q.applied] - if rev in applied_list: - start = applied_list.index(rev) + for i, statusentry in enumerate(q.applied): + if statusentry.node in rootnodes: + # if one of the stripped roots is an applied + # patch, only part of the queue is stripped + start = i + break del q.applied[start:end] q.save_dirty() - repo.mq.strip(repo, rev, backup=backup, update=update, force=opts['force']) + repo.mq.strip(repo, list(rootnodes), backup=backup, update=update, + force=opts['force']) return 0 def select(ui, repo, *args, **opts): @@ -3008,7 +3028,7 @@ ' number greater than REV which are not' ' descendants of REV (DEPRECATED)')), ('n', 'nobackup', None, _('no backups'))], - _('hg strip [-f] [-n] REV')), + _('hg strip [-f] [-n] REV...')), "qtop": (top, [] + seriesopts, _('hg qtop [-s]')), "qunapplied": (unapplied, diff -r 3152c978496a -r 00fee6394daf mercurial/cmdutil.py --- a/mercurial/cmdutil.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/cmdutil.py Thu Aug 12 18:08:52 2010 -0500 @@ -638,7 +638,7 @@ fp.write("# HG changeset patch\n") fp.write("# User %s\n" % ctx.user()) fp.write("# Date %d %d\n" % ctx.date()) - if branch and (branch != 'default'): + if branch and branch != 'default': fp.write("# Branch %s\n" % branch) fp.write("# Node ID %s\n" % hex(node)) fp.write("# Parent %s\n" % hex(prev)) diff -r 3152c978496a -r 00fee6394daf mercurial/commands.py --- a/mercurial/commands.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/commands.py Thu Aug 12 18:08:52 2010 -0500 @@ -4177,7 +4177,7 @@ _('show only heads which are descendants of REV'), _('REV')), ('t', 'topo', False, _('show topological heads only')), ('a', 'active', False, - _('show active branchheads only [DEPRECATED]')), + _('show active branchheads only (DEPRECATED)')), ('c', 'closed', False, _('show normal and closed branch heads')), ] + templateopts, diff -r 3152c978496a -r 00fee6394daf mercurial/context.py --- a/mercurial/context.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/context.py Thu Aug 12 18:08:52 2010 -0500 @@ -75,7 +75,7 @@ @propertycache def substate(self): - return subrepo.state(self) + return subrepo.state(self, self._repo.ui) def __contains__(self, key): return key in self._manifest diff -r 3152c978496a -r 00fee6394daf mercurial/hg.py --- a/mercurial/hg.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/hg.py Thu Aug 12 18:08:52 2010 -0500 @@ -221,7 +221,7 @@ src_repo = repository(ui, source) else: src_repo = source - branch = (None, []) + branch = (None, branch or []) origsource = source = src_repo.url() rev, checkout = addbranchrevs(src_repo, src_repo, branch, rev) diff -r 3152c978496a -r 00fee6394daf mercurial/merge.py --- a/mercurial/merge.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/merge.py Thu Aug 12 18:08:52 2010 -0500 @@ -117,7 +117,7 @@ def manifestmerge(repo, p1, p2, pa, overwrite, partial): """ - Merge p1 and p2 with ancestor ma and generate merge action list + Merge p1 and p2 with ancestor pa and generate merge action list overwrite = whether we clobber working files partial = function to filter file lists diff -r 3152c978496a -r 00fee6394daf mercurial/patch.py --- a/mercurial/patch.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/patch.py Thu Aug 12 18:08:52 2010 -0500 @@ -927,8 +927,8 @@ createfunc = hunk.createfile missing = not goodb and not gooda and not createfunc() - # some diff programs apparently produce create patches where the - # afile is not /dev/null, but afile starts with bfile + # some diff programs apparently produce patches where the afile is + # not /dev/null, but afile starts with bfile abasedir = afile[:afile.rfind('/') + 1] bbasedir = bfile[:bfile.rfind('/') + 1] if missing and abasedir == bbasedir and afile.startswith(bfile): diff -r 3152c978496a -r 00fee6394daf mercurial/repair.py --- a/mercurial/repair.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/repair.py Thu Aug 12 18:08:52 2010 -0500 @@ -11,14 +11,18 @@ from i18n import _ import os -def _bundle(repo, bases, heads, node, suffix, extranodes=None): +def _bundle(repo, bases, heads, node, suffix, extranodes=None, compress=True): """create a bundle with the specified revisions as a backup""" cg = repo.changegroupsubset(bases, heads, 'strip', extranodes) backupdir = repo.join("strip-backup") if not os.path.isdir(backupdir): os.mkdir(backupdir) name = os.path.join(backupdir, "%s-%s.hg" % (short(node), suffix)) - return changegroup.writebundle(cg, name, "HG10BZ") + if compress: + bundletype = "HG10BZ" + else: + bundletype = "HG10UN" + return changegroup.writebundle(cg, name, bundletype) def _collectfiles(repo, striprev): """find out the filelogs affected by the strip""" @@ -69,6 +73,8 @@ # TODO delete the undo files, and handle undo of merge sets striprev = cl.rev(node) + keeppartialbundle = backup == 'strip' + # Some revisions with rev > striprev may not be descendants of striprev. # We have to find these revisions and put them in a bundle, so that # we can restore them after the truncations. @@ -110,8 +116,9 @@ backupfile = _bundle(repo, [node], cl.heads(), node, 'backup') repo.ui.status(_("saved backup bundle to %s\n") % backupfile) if saveheads or extranodes: + # do not compress partial bundle if we remove it from disk later chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp', - extranodes) + extranodes=extranodes, compress=keeppartialbundle) mfst = repo.manifest @@ -146,7 +153,7 @@ if not repo.ui.verbose: repo.ui.popbuffer() f.close() - if backup != "strip": + if not keeppartialbundle: os.unlink(chgrpfile) except: if backupfile: diff -r 3152c978496a -r 00fee6394daf mercurial/store.py --- a/mercurial/store.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/store.py Thu Aug 12 18:08:52 2010 -0500 @@ -22,7 +22,7 @@ .replace(".d/", ".d.hg/")) def decodedir(path): - if not path.startswith('data/'): + if not path.startswith('data/') or ".hg/" not in path: return path return (path .replace(".d.hg/", ".d/") diff -r 3152c978496a -r 00fee6394daf mercurial/subrepo.py --- a/mercurial/subrepo.py Thu Aug 12 18:10:42 2010 +0200 +++ b/mercurial/subrepo.py Thu Aug 12 18:08:52 2010 -0500 @@ -12,7 +12,7 @@ nullstate = ('', '', 'empty') -def state(ctx): +def state(ctx, ui): """return a state dict, mapping subrepo paths configured in .hgsub to tuple: (source from .hgsub, revision from .hgsubstate, kind (key in types dict)) @@ -27,6 +27,9 @@ if '.hgsub' in ctx: read('.hgsub') + for path, src in ui.configitems('subpaths'): + p.set('subpaths', path, src, ui.configsource('subpaths', path)) + rev = {} if '.hgsubstate' in ctx: try: @@ -45,6 +48,14 @@ raise util.Abort(_('missing ] in subrepo source')) kind, src = src.split(']', 1) kind = kind[1:] + + for pattern, repl in p.items('subpaths'): + try: + src = re.sub(pattern, repl, src, 1) + except re.error, e: + raise util.Abort(_("bad subrepository pattern in %s: %s") + % (p.source('subpaths', pattern), e)) + state[path] = (src.strip(), rev.get(path, ''), kind) return state diff -r 3152c978496a -r 00fee6394daf tests/run-tests.py --- a/tests/run-tests.py Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/run-tests.py Thu Aug 12 18:08:52 2010 -0500 @@ -499,6 +499,13 @@ finally: os.remove(name) + def rematch(el, l): + try: + return re.match(el, l) + except re.error: + # el is an invalid regex + return False + pos = -1 postout = [] for n, l in enumerate(output): @@ -513,7 +520,7 @@ if el == l: # perfect match (fast) postout.append(" " + l) - elif el and re.match(el, l): # fallback regex match + elif el and rematch(el, l): # fallback regex match postout.append(" " + el) else: # mismatch - let diff deal with it postout.append(" " + l) diff -r 3152c978496a -r 00fee6394daf tests/test-add --- a/tests/test-add Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -#!/bin/sh - -hg init a -cd a -echo a > a -hg add -n -hg st -hg add -hg st -hg forget a -hg add -hg st - -echo b > b -hg add -n b -hg st -hg add b || echo "failed to add b" -hg st -echo % should fail -hg add b -hg st - -hg ci -m 0 --traceback -echo % should fail -hg add a - -echo aa > a -hg ci -m 1 -hg up 0 -echo aaa > a -hg ci -m 2 - -hg merge -hg st -echo % should fail -hg add a -hg st -hg resolve -m a -hg ci -m merge - -echo % issue683 -hg forget a -hg add a -hg st -hg rm a -hg st -echo a > a -hg add a -hg st - -hg add c && echo "unexpected addition of missing file" -echo c > c -hg add d c && echo "unexpected addition of missing file" -hg st - diff -r 3152c978496a -r 00fee6394daf tests/test-add.out --- a/tests/test-add.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -adding a -? a -adding a -A a -adding a -A a -A a -? b -A a -A b -% should fail -b already tracked! -A a -A b -% should fail -a already tracked! -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -merging a -warning: conflicts during merge. -merging a failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon -M a -? a.orig -% should fail -a already tracked! -M a -? a.orig -% issue683 -? a.orig -R a -? a.orig -M a -? a.orig -c: No such file or directory -d: No such file or directory -M a -A c -? a.orig diff -r 3152c978496a -r 00fee6394daf tests/test-add.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-add.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,96 @@ + $ hg init a + $ cd a + $ echo a > a + $ hg add -n + adding a + $ hg st + ? a + $ hg add + adding a + $ hg st + A a + $ hg forget a + $ hg add + adding a + $ hg st + A a + + $ echo b > b + $ hg add -n b + $ hg st + A a + ? b + $ hg add b || echo "failed to add b" + $ hg st + A a + A b + +should fail + + $ hg add b + b already tracked! + $ hg st + A a + A b + + $ hg ci -m 0 --traceback + +should fail + + $ hg add a + a already tracked! + + $ echo aa > a + $ hg ci -m 1 + $ hg up 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo aaa > a + $ hg ci -m 2 + created new head + + $ hg merge + merging a + warning: conflicts during merge. + merging a failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon + $ hg st + M a + ? a.orig + +should fail + + $ hg add a + a already tracked! + $ hg st + M a + ? a.orig + $ hg resolve -m a + $ hg ci -m merge + +issue683 + + $ hg forget a + $ hg add a + $ hg st + ? a.orig + $ hg rm a + $ hg st + R a + ? a.orig + $ echo a > a + $ hg add a + $ hg st + M a + ? a.orig + + $ hg add c && echo "unexpected addition of missing file" + c: No such file or directory + $ echo c > c + $ hg add d c && echo "unexpected addition of missing file" + d: No such file or directory + $ hg st + M a + A c + ? a.orig + diff -r 3152c978496a -r 00fee6394daf tests/test-alias --- a/tests/test-alias Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -#!/bin/sh - -cat >> $HGRCPATH < foo -hg ci -Amfoo - -echo '% with opts' -hg cleanst - -echo '% with opts and whitespace' -hg shortlog - -echo '% interaction with defaults' -hg mylog -hg lognull - -echo '% properly recursive' -hg dln - -echo '% path expanding' -FOO=`pwd` hg put -cat 0.diff - -echo '% shell aliases' -hg echo foo -echo '% invalid arguments' -hg rt foo - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-alias.out --- a/tests/test-alias.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -% basic -% unknown -alias 'unknown' resolves to unknown command 'bargle' -alias 'unknown' resolves to unknown command 'bargle' -% ambiguous -alias 'ambiguous' resolves to ambiguous command 's' -alias 'ambiguous' resolves to ambiguous command 's' -% recursive -alias 'recursive' resolves to unknown command 'recursive' -alias 'recursive' resolves to unknown command 'recursive' -% no definition -no definition for alias 'nodefinition' -no definition for alias 'nodefinition' -% invalid options -error in definition for alias 'no--cwd': --cwd may only be given on the command line -error in definition for alias 'no--cwd': --cwd may only be given on the command line -error in definition for alias 'no-R': -R may only be given on the command line -error in definition for alias 'no-R': -R may only be given on the command line -error in definition for alias 'no--repo': --repo may only be given on the command line -error in definition for alias 'no--repo': --repo may only be given on the command line -error in definition for alias 'no--repository': --repository may only be given on the command line -error in definition for alias 'no--repository': --repository may only be given on the command line -% no usage -no rollback information available -adding foo -% with opts -C foo -% with opts and whitespace -0 e63c23eaa88a | 1970-01-01 00:00 +0000 -% interaction with defaults -0:e63c23eaa88a --1:000000000000 -% properly recursive -changeset: -1:0000000000000000000000000000000000000000 -parent: -1:0000000000000000000000000000000000000000 -parent: -1:0000000000000000000000000000000000000000 -manifest: -1:0000000000000000000000000000000000000000 -user: -date: Thu Jan 01 00:00:00 1970 +0000 -extra: branch=default - -% path expanding -# HG changeset patch -# User test -# Date 0 0 -# Node ID e63c23eaa88ae77967edcf4ea194d31167c478b0 -# Parent 0000000000000000000000000000000000000000 -foo - -diff -r 000000000000 -r e63c23eaa88a foo ---- /dev/null Thu Jan 01 00:00:00 1970 +0000 -+++ b/foo Thu Jan 01 00:00:00 1970 +0000 -@@ -0,0 +1,1 @@ -+foo -% shell aliases -foo -% invalid arguments -hg rt: invalid arguments -hg rt - -alias for: hg root - -print the root (top) of the current working directory - - Print the root directory of the current repository. - - Returns 0 on success. - -use "hg -v help rt" to show global options diff -r 3152c978496a -r 00fee6394daf tests/test-alias.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-alias.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,170 @@ + $ cat >> $HGRCPATH < [alias] + > myinit = init + > cleanstatus = status -c + > unknown = bargle + > ambiguous = s + > recursive = recursive + > nodefinition = + > no--cwd = status --cwd elsewhere + > no-R = status -R elsewhere + > no--repo = status --repo elsewhere + > no--repository = status --repository elsewhere + > mylog = log + > lognull = log -r null + > shortlog = log --template '{rev} {node|short} | {date|isodate}\n' + > dln = lognull --debug + > nousage = rollback + > put = export -r 0 -o "\$FOO/%R.diff" + > echo = !echo + > rt = root + > + > [defaults] + > mylog = -q + > lognull = -q + > log = -v + > EOF + + +basic + + $ hg myinit alias + + +unknown + + $ hg unknown + alias 'unknown' resolves to unknown command 'bargle' + $ hg help unknown + alias 'unknown' resolves to unknown command 'bargle' + + +ambiguous + + $ hg ambiguous + alias 'ambiguous' resolves to ambiguous command 's' + $ hg help ambiguous + alias 'ambiguous' resolves to ambiguous command 's' + + +recursive + + $ hg recursive + alias 'recursive' resolves to unknown command 'recursive' + $ hg help recursive + alias 'recursive' resolves to unknown command 'recursive' + + +no definition + + $ hg nodef + no definition for alias 'nodefinition' + $ hg help nodef + no definition for alias 'nodefinition' + + +invalid options + + $ hg no--cwd + error in definition for alias 'no--cwd': --cwd may only be given on the command line + $ hg help no--cwd + error in definition for alias 'no--cwd': --cwd may only be given on the command line + $ hg no-R + error in definition for alias 'no-R': -R may only be given on the command line + $ hg help no-R + error in definition for alias 'no-R': -R may only be given on the command line + $ hg no--repo + error in definition for alias 'no--repo': --repo may only be given on the command line + $ hg help no--repo + error in definition for alias 'no--repo': --repo may only be given on the command line + $ hg no--repository + error in definition for alias 'no--repository': --repository may only be given on the command line + $ hg help no--repository + error in definition for alias 'no--repository': --repository may only be given on the command line + + $ cd alias + + +no usage + + $ hg nousage + no rollback information available + + $ echo foo > foo + $ hg ci -Amfoo + adding foo + + +with opts + + $ hg cleanst + C foo + + +with opts and whitespace + + $ hg shortlog + 0 e63c23eaa88a | 1970-01-01 00:00 +0000 + + +interaction with defaults + + $ hg mylog + 0:e63c23eaa88a + $ hg lognull + -1:000000000000 + + +properly recursive + + $ hg dln + changeset: -1:0000000000000000000000000000000000000000 + parent: -1:0000000000000000000000000000000000000000 + parent: -1:0000000000000000000000000000000000000000 + manifest: -1:0000000000000000000000000000000000000000 + user: + date: Thu Jan 01 00:00:00 1970 +0000 + extra: branch=default + + + +path expanding + + $ FOO=`pwd` hg put + $ cat 0.diff + # HG changeset patch + # User test + # Date 0 0 + # Node ID e63c23eaa88ae77967edcf4ea194d31167c478b0 + # Parent 0000000000000000000000000000000000000000 + foo + + diff -r 000000000000 -r e63c23eaa88a foo + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/foo Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +foo + + +shell aliases + + $ hg echo foo + foo + +invalid arguments + + $ hg rt foo + hg rt: invalid arguments + hg rt + + alias for: hg root + + print the root (top) of the current working directory + + Print the root directory of the current repository. + + Returns 0 on success. + + use "hg -v help rt" to show global options + + $ exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-check-code --- a/tests/test-check-code Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-check-code Thu Aug 12 18:08:52 2010 -0500 @@ -35,3 +35,5 @@ check_code=`dirname $0`/../contrib/check-code.py ${check_code} ./wrong.py ./correct.py ./quote.py ./non-py24.py + +exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-clone --- a/tests/test-clone Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -#!/bin/sh - -echo -echo % prepare repo a -mkdir a -cd a -hg init -echo a > a -hg add a -hg commit -m test -echo first line > b -hg add b -# create a non-inlined filelog -python -c 'for x in range(10000): print x' >> data1 -for j in 0 1 2 3 4 5 6 7 8 9; do - cat data1 >> b - hg commit -m test -done -echo % "list files in store/data (should show a 'b.d')" -for i in .hg/store/data/*; do - echo $i -done - -echo -echo % default operation -hg clone . ../b -cd ../b -cat a -hg verify - -echo -echo % no update, with debug option -hg --debug clone -U . ../c -cd ../c -cat a 2>/dev/null || echo "a not present" -hg verify - -echo -echo % default destination -mkdir ../d -cd ../d -hg clone ../a -cd a -hg cat a - -echo -echo % "check that we drop the file: from the path before" -echo % "writing the .hgrc" -cd ../.. -hg clone file:a e -grep 'file:' e/.hg/hgrc - -echo -echo % check that path aliases are expanded -hg clone -q -U --config 'paths.foobar=a#0' foobar f -hg -R f showconfig paths.default | sed -e 's,.*/,,' - -echo -echo % use --pull -hg clone --pull a g -hg -R g verify - -echo -echo % clone to '.' -mkdir h -cd h -hg clone ../a . -cd .. - -echo -echo -echo % "*** tests for option -u ***" -echo - - -echo -echo % "adding some more history to repo a" -cd a -echo % "tag ref1" -hg tag ref1 -echo the quick brown fox >a -hg ci -m "hacked default" -echo % "updating back to ref1" -hg up ref1 -echo -echo % "add branch 'stable' to repo a for later tests" -hg branch stable -echo some text >a -hg ci -m "starting branch stable" -echo % "tag ref2" -hg tag ref2 -echo some more text >a -hg ci -m "another change for branch stable" -echo -echo % "updating back to ref2" -hg up ref2 -echo -echo % "parents of repo a" -hg parents -echo -echo % "repo a has two heads" -hg heads -cd .. - -echo -echo % "testing clone -U -u 1 a ua (must abort)" -hg clone -U -u 1 a ua - -echo -echo % "testing clone -u . a ua" -hg clone -u . a ua -echo -echo % "repo ua has both heads" -hg -R ua heads -echo -echo % "same revision checked out in repo a and ua" -hg -R a parents --template "{node|short}\n" -hg -R ua parents --template "{node|short}\n" -rm -r ua - -echo -echo % "testing clone --pull -u . a ua" -hg clone --pull -u . a ua -echo -echo % "repo ua has both heads" -hg -R ua heads -echo -echo % "same revision checked out in repo a and ua" -hg -R a parents --template "{node|short}\n" -hg -R ua parents --template "{node|short}\n" -rm -r ua - -echo -echo % "testing clone -u stable a ua" -hg clone -u stable a ua -echo -echo % "repo ua has both heads" -hg -R ua heads -echo -echo % "branch stable is checked out" -hg -R ua parents -rm -r ua - -echo -echo % "testing clone a ua" -hg clone a ua -echo -echo % "repo ua has both heads" -hg -R ua heads -echo -echo % "branch default is checked out" -hg -R ua parents -rm -r ua - -echo -echo % "testing clone -u . a#stable ua" -hg clone -u . a#stable ua -echo -echo % "repo ua has only branch stable" -hg -R ua heads -echo -echo % "same revision checked out in repo a and ua" -hg -R a parents --template "{node|short}\n" -hg -R ua parents --template "{node|short}\n" -rm -r ua - -echo -echo % "testing clone -u . -r stable a ua" -hg clone -u . -r stable a ua -echo -echo % "repo ua has only branch stable" -hg -R ua heads -echo -echo % "same revision checked out in repo a and ua" -hg -R a parents --template "{node|short}\n" -hg -R ua parents --template "{node|short}\n" -rm -r ua - -echo -echo % "testing clone -r stable a ua" -hg clone -r stable a ua -echo -echo % "repo ua has only branch stable" -hg -R ua heads -echo -echo % "branch stable is checked out" -hg -R ua parents -rm -r ua - -echo -echo % "testing clone -u . -r stable -r default a ua" -hg clone -u . -r stable -r default a ua -echo -echo % "repo ua has two heads" -hg -R ua heads -echo -echo % "same revision checked out in repo a and ua" -hg -R a parents --template "{node|short}\n" -hg -R ua parents --template "{node|short}\n" -rm -r ua - -cat < simpleclone.py -from mercurial import ui, hg -myui = ui.ui() -repo = hg.repository(myui, 'a') -hg.clone(myui, repo, dest="ua") -EOF - -python simpleclone.py -rm -r ua - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-clone.out --- a/tests/test-clone.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,316 +0,0 @@ - -% prepare repo a -% list files in store/data (should show a 'b.d') -.hg/store/data/a.i -.hg/store/data/b.d -.hg/store/data/b.i - -% default operation -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -a -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -2 files, 11 changesets, 11 total revisions - -% no update, with debug option -linked 8 files -a not present -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -2 files, 11 changesets, 11 total revisions - -% default destination -destination directory: a -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -a - -% check that we drop the file: from the path before -% writing the .hgrc -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% check that path aliases are expanded -a#0 - -% use --pull -requesting all changes -adding changesets -adding manifests -adding file changes -added 11 changesets with 11 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -2 files, 11 changesets, 11 total revisions - -% clone to . -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - - -% *** tests for option -u *** - - -% adding some more history to repo a -% tag ref1 -% updating back to ref1 -1 files updated, 0 files merged, 1 files removed, 0 files unresolved - -% add branch 'stable' to repo a for later tests -marked working directory as branch stable -% tag ref2 - -% updating back to ref2 -1 files updated, 0 files merged, 1 files removed, 0 files unresolved - -% parents of repo a -changeset: 13:e8ece76546a6 -branch: stable -tag: ref2 -parent: 10:a7949464abda -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: starting branch stable - - -% repo a has two heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% testing clone -U -u 1 a ua (must abort) -abort: cannot specify both --noupdate and --updaterev - -% testing clone -u . a ua -updating to branch stable -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has both heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% same revision checked out in repo a and ua -e8ece76546a6 -e8ece76546a6 - -% testing clone --pull -u . a ua -requesting all changes -adding changesets -adding manifests -adding file changes -added 16 changesets with 16 changes to 3 files (+1 heads) -updating to branch stable -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has both heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% same revision checked out in repo a and ua -e8ece76546a6 -e8ece76546a6 - -% testing clone -u stable a ua -updating to branch stable -3 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has both heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% branch stable is checked out -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - - -% testing clone a ua -updating to branch default -3 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has both heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% branch default is checked out -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% testing clone -u . a#stable ua -requesting all changes -adding changesets -adding manifests -adding file changes -added 14 changesets with 14 changes to 3 files -updating to branch stable -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has only branch stable -changeset: 13:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 10:a7949464abda -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: test - - -% same revision checked out in repo a and ua -e8ece76546a6 -e8ece76546a6 - -% testing clone -u . -r stable a ua -requesting all changes -adding changesets -adding manifests -adding file changes -added 14 changesets with 14 changes to 3 files -updating to branch stable -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has only branch stable -changeset: 13:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 10:a7949464abda -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: test - - -% same revision checked out in repo a and ua -e8ece76546a6 -e8ece76546a6 - -% testing clone -r stable a ua -requesting all changes -adding changesets -adding manifests -adding file changes -added 14 changesets with 14 changes to 3 files -updating to branch stable -3 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has only branch stable -changeset: 13:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 10:a7949464abda -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: test - - -% branch stable is checked out -changeset: 13:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - - -% testing clone -u . -r stable -r default a ua -requesting all changes -adding changesets -adding manifests -adding file changes -added 16 changesets with 16 changes to 3 files (+1 heads) -updating to branch stable -2 files updated, 0 files merged, 0 files removed, 0 files unresolved - -% repo ua has two heads -changeset: 15:0aae7cf88f0d -branch: stable -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: another change for branch stable - -changeset: 12:f21241060d6a -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -summary: hacked default - - -% same revision checked out in repo a and ua -e8ece76546a6 -e8ece76546a6 -updating to branch default -3 files updated, 0 files merged, 0 files removed, 0 files unresolved diff -r 3152c978496a -r 00fee6394daf tests/test-clone.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-clone.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,443 @@ +Prepare repo a: + + $ mkdir a + $ cd a + $ hg init + $ echo a > a + $ hg add a + $ hg commit -m test + $ echo first line > b + $ hg add b + +Create a non-inlined filelog: + + $ python -c 'for x in range(10000): print x' >> data1 + $ for j in 0 1 2 3 4 5 6 7 8 9; do + > cat data1 >> b + > hg commit -m test + > done + +List files in store/data (should show a 'b.d'): + + $ for i in .hg/store/data/*; do + > echo $i + > done + .hg/store/data/a.i + .hg/store/data/b.d + .hg/store/data/b.i + +Default operation: + + $ hg clone . ../b + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../b + $ cat a + a + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 2 files, 11 changesets, 11 total revisions + +No update, with debug option: + + $ hg --debug clone -U . ../c + linked 8 files + $ cd ../c + $ cat a 2>/dev/null || echo "a not present" + a not present + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 2 files, 11 changesets, 11 total revisions + +Default destination: + + $ mkdir ../d + $ cd ../d + $ hg clone ../a + destination directory: a + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd a + $ hg cat a + a + $ cd ../.. + +Check that we drop the 'file:' from the path before writing the .hgrc: + + $ hg clone file:a e + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ grep 'file:' e/.hg/hgrc + +Check that path aliases are expanded: + + $ hg clone -q -U --config 'paths.foobar=a#0' foobar f + $ hg -R f showconfig paths.default + .*/a#0 + +Use --pull: + + $ hg clone --pull a g + requesting all changes + adding changesets + adding manifests + adding file changes + added 11 changesets with 11 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg -R g verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 2 files, 11 changesets, 11 total revisions + +Clone to '.': + + $ mkdir h + $ cd h + $ hg clone ../a . + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd .. + + +*** Tests for option -u *** + +Adding some more history to repo a: + + $ cd a + $ hg tag ref1 + $ echo the quick brown fox >a + $ hg ci -m "hacked default" + $ hg up ref1 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg branch stable + marked working directory as branch stable + $ echo some text >a + $ hg ci -m "starting branch stable" + $ hg tag ref2 + $ echo some more text >a + $ hg ci -m "another change for branch stable" + $ hg up ref2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg parents + changeset: 13:e8ece76546a6 + branch: stable + tag: ref2 + parent: 10:a7949464abda + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: starting branch stable + + +Repo a has two heads: + + $ hg heads + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + + $ cd .. + + +Testing --noupdate with --updaterev (must abort): + + $ hg clone --noupdate --updaterev 1 a ua + abort: cannot specify both --noupdate and --updaterev + + +Testing clone -u: + + $ hg clone -u . a ua + updating to branch stable + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has both heads: + + $ hg -R ua heads + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + +Same revision checked out in repo a and ua: + + $ hg -R a parents --template "{node|short}\n" + e8ece76546a6 + $ hg -R ua parents --template "{node|short}\n" + e8ece76546a6 + + $ rm -r ua + + +Testing clone --pull -u: + + $ hg clone --pull -u . a ua + requesting all changes + adding changesets + adding manifests + adding file changes + added 16 changesets with 16 changes to 3 files (+1 heads) + updating to branch stable + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has both heads: + + $ hg -R ua heads + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + +Same revision checked out in repo a and ua: + + $ hg -R a parents --template "{node|short}\n" + e8ece76546a6 + $ hg -R ua parents --template "{node|short}\n" + e8ece76546a6 + + $ rm -r ua + + +Testing clone -u : + + $ hg clone -u stable a ua + updating to branch stable + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has both heads: + + $ hg -R ua heads + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + +Branch 'stable' is checked out: + + $ hg -R ua parents + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + + $ rm -r ua + + +Testing default checkout: + + $ hg clone a ua + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has both heads: + + $ hg -R ua heads + changeset: 15:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + +Branch 'default' is checked out: + + $ hg -R ua parents + changeset: 12:f21241060d6a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: hacked default + + + $ rm -r ua + + +Testing #: + + $ hg clone -u . a#stable ua + requesting all changes + adding changesets + adding manifests + adding file changes + added 14 changesets with 14 changes to 3 files + updating to branch stable + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6): + + $ hg -R ua heads + changeset: 13:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 10:a7949464abda + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: test + + +Same revision checked out in repo a and ua: + + $ hg -R a parents --template "{node|short}\n" + e8ece76546a6 + $ hg -R ua parents --template "{node|short}\n" + e8ece76546a6 + + $ rm -r ua + + +Testing -u -r : + + $ hg clone -u . -r stable a ua + requesting all changes + adding changesets + adding manifests + adding file changes + added 14 changesets with 14 changes to 3 files + updating to branch stable + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6): + + $ hg -R ua heads + changeset: 13:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 10:a7949464abda + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: test + + +Same revision checked out in repo a and ua: + + $ hg -R a parents --template "{node|short}\n" + e8ece76546a6 + $ hg -R ua parents --template "{node|short}\n" + e8ece76546a6 + + $ rm -r ua + + +Testing -r : + + $ hg clone -r stable a ua + requesting all changes + adding changesets + adding manifests + adding file changes + added 14 changesets with 14 changes to 3 files + updating to branch stable + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + +Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6): + + $ hg -R ua heads + changeset: 13:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + changeset: 10:a7949464abda + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: test + + +Branch 'stable' is checked out: + + $ hg -R ua parents + changeset: 13:0aae7cf88f0d + branch: stable + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: another change for branch stable + + + $ rm -r ua + + +Testing issue2267: + + $ cat < simpleclone.py + > from mercurial import ui, hg + > myui = ui.ui() + > repo = hg.repository(myui, 'a') + > hg.clone(myui, repo, dest="ua") + > EOF + + $ python simpleclone.py + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ rm -r ua + +cat < branchclone.py +from mercurial import ui, hg +myui = ui.ui() +repo = hg.repository(myui, 'a') +hg.clone(myui, repo, dest="ua", branch=["stable",]) +EOF + +python branchclone.py +rm -r ua + diff -r 3152c978496a -r 00fee6394daf tests/test-commit --- a/tests/test-commit Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -#!/bin/sh - -echo % commit date test -hg init test -cd test -echo foo > foo -hg add foo -HGEDITOR=true hg commit -m "" -hg commit -d '0 0' -m commit-1 -echo foo >> foo -hg commit -d '1 4444444' -m commit-3 -hg commit -d '1 15.1' -m commit-4 -hg commit -d 'foo bar' -m commit-5 -hg commit -d ' 1 4444' -m commit-6 -hg commit -d '111111111111 0' -m commit-7 - -echo % commit added file that has been deleted -echo bar > bar -hg add bar -rm bar -hg commit -d "1000000 0" -m commit-8 -hg commit -d "1000000 0" -m commit-8-2 bar - -hg -q revert -a --no-backup - -mkdir dir -echo boo > dir/file -hg add -hg -v commit -m commit-9 dir - -echo > dir.file -hg add -hg commit -m commit-10 dir dir.file - -echo >> dir/file -mkdir bleh -mkdir dir2 -cd bleh -hg commit -m commit-11 . -hg commit -m commit-12 ../dir ../dir2 -hg -v commit -m commit-13 ../dir -cd .. - -hg commit -m commit-14 does-not-exist -ln -s foo baz -hg commit -m commit-15 baz -touch quux -hg commit -m commit-16 quux -echo >> dir/file -hg -v commit -m commit-17 dir/file -# An empty date was interpreted as epoch origin -echo foo >> foo -hg commit -d '' -m commit-no-date -hg tip --template '{date|isodate}\n' | grep '1970' -cd .. - -echo % partial subdir commit test -hg init test2 -cd test2 -mkdir foo -echo foo > foo/foo -mkdir bar -echo bar > bar/bar -hg add -hg ci -d '1000000 0' -m commit-subdir-1 foo -hg ci -d '1000001 0' -m commit-subdir-2 bar -echo % subdir log 1 -hg log -v foo -echo % subdir log 2 -hg log -v bar -echo % full log -hg log -v -cd .. - -echo % dot and subdir commit test -hg init test3 -cd test3 -mkdir foo -echo foo content > foo/plain-file -hg add foo/plain-file -hg ci -d '1000000 0' -m commit-foo-subdir foo -echo modified foo content > foo/plain-file -hg ci -d '2000000 0' -m commit-foo-dot . -echo % full log -hg log -v -echo % subdir log -cd foo -hg log . -cd .. -cd .. - -cd .. -hg init issue1049 -cd issue1049 -echo a > a -hg ci -Ama -echo a >> a -hg ci -mb -hg up 0 -echo b >> a -hg ci -mc -HGMERGE=true hg merge -echo % should fail because we are specifying a file name -hg ci -mmerge a -echo % should fail because we are specifying a pattern -hg ci -mmerge -I a -echo % should succeed -hg ci -mmerge -cd .. - - -echo % test commit message content -hg init commitmsg -cd commitmsg -echo changed > changed -echo removed > removed -hg ci -qAm init - -hg rm removed -echo changed >> changed -echo added > added -hg add added -HGEDITOR=cat hg ci -A -cd .. - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-commit-copy --- a/tests/test-commit-copy Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#!/bin/sh - -hg init dir -cd dir -echo bleh > bar -hg add bar -hg ci -m 'add bar' - -hg cp bar foo -echo >> bar -hg ci -m 'cp bar foo; change bar' - -hg debugrename foo -hg debugindex .hg/store/data/bar.i diff -r 3152c978496a -r 00fee6394daf tests/test-commit-copy.out --- a/tests/test-commit-copy.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -foo renamed from bar:26d3ca0dfd18e44d796b564e38dd173c9668d3a9 - rev offset length base linkrev nodeid p1 p2 - 0 0 6 0 0 26d3ca0dfd18 000000000000 000000000000 - 1 6 7 1 1 d267bddd54f7 26d3ca0dfd18 000000000000 diff -r 3152c978496a -r 00fee6394daf tests/test-commit-copy.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-commit-copy.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,16 @@ + $ hg init dir + $ cd dir + $ echo bleh > bar + $ hg add bar + $ hg ci -m 'add bar' + + $ hg cp bar foo + $ echo >> bar + $ hg ci -m 'cp bar foo; change bar' + + $ hg debugrename foo + foo renamed from bar:26d3ca0dfd18e44d796b564e38dd173c9668d3a9 + $ hg debugindex .hg/store/data/bar.i + rev offset length base linkrev nodeid p1 p2 + 0 0 6 0 0 26d3ca0dfd18 000000000000 000000000000 + 1 6 7 1 1 d267bddd54f7 26d3ca0dfd18 000000000000 diff -r 3152c978496a -r 00fee6394daf tests/test-commit-unresolved --- a/tests/test-commit-unresolved Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -#!/bin/sh - -echo "[extensions]" >> $HGRCPATH -echo "graphlog=" >> $HGRCPATH - -addcommit () { - echo $1 > $1 - hg add $1 - hg commit -d "${2} 0" -m $1 -} - -commit () { - hg commit -d "${2} 0" -m $1 -} - -hg init a -cd a -addcommit "A" 0 -addcommit "B" 1 -echo "C" >> A -commit "C" 2 - -hg update -C 0 -echo "D" >> A -commit "D" 3 - -echo -echo "% Merging a conflict araises" -hg merge - -echo -echo "% Correct the conflict without marking the file as resolved" -echo "ABCD" > A -hg commit -m "Merged" - -echo -echo "% Mark the conflict as resolved and commit" -hg resolve -m A -hg commit -m "Merged" - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-commit-unresolved.out --- a/tests/test-commit-unresolved.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -1 files updated, 0 files merged, 1 files removed, 0 files unresolved -created new head - -% Merging a conflict araises -merging A -warning: conflicts during merge. -merging A failed! -1 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon - -% Correct the conflict without marking the file as resolved -abort: unresolved merge conflicts (see hg resolve) - -% Mark the conflict as resolved and commit diff -r 3152c978496a -r 00fee6394daf tests/test-commit-unresolved.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-commit-unresolved.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,47 @@ + $ echo "[extensions]" >> $HGRCPATH + $ echo "graphlog=" >> $HGRCPATH + + $ addcommit () { + > echo $1 > $1 + > hg add $1 + > hg commit -d "${2} 0" -m $1 + > } + + $ commit () { + > hg commit -d "${2} 0" -m $1 + > } + + $ hg init a + $ cd a + $ addcommit "A" 0 + $ addcommit "B" 1 + $ echo "C" >> A + $ commit "C" 2 + + $ hg update -C 0 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo "D" >> A + $ commit "D" 3 + created new head + +Merging a conflict araises + + $ hg merge + merging A + warning: conflicts during merge. + merging A failed! + 1 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon + +Correct the conflict without marking the file as resolved + + $ echo "ABCD" > A + $ hg commit -m "Merged" + abort: unresolved merge conflicts (see hg resolve) + +Mark the conflict as resolved and commit + + $ hg resolve -m A + $ hg commit -m "Merged" + + $ exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-commit.out --- a/tests/test-commit.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -% commit date test -abort: empty commit message -abort: impossible time zone offset: 4444444 -abort: invalid date: '1\t15.1' -abort: invalid date: 'foo bar' -abort: date exceeds 32 bits: 111111111111 -% commit added file that has been deleted -nothing changed -abort: bar: file not found! -adding dir/file -dir/file -committed changeset 2:d2a76177cb42 -adding dir.file -abort: dir: no match under directory! -abort: bleh: no match under directory! -abort: dir2: no match under directory! -dir/file -committed changeset 3:1cd62a2d8db5 -abort: does-not-exist: No such file or directory -abort: baz: file not tracked! -abort: quux: file not tracked! -dir/file -committed changeset 4:49176991390e -% partial subdir commit test -adding bar/bar -adding foo/foo -% subdir log 1 -changeset: 0:6ef3cb06bb80 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -files: foo/foo -description: -commit-subdir-1 - - -% subdir log 2 -changeset: 1:f2e51572cf5a -tag: tip -user: test -date: Mon Jan 12 13:46:41 1970 +0000 -files: bar/bar -description: -commit-subdir-2 - - -% full log -changeset: 1:f2e51572cf5a -tag: tip -user: test -date: Mon Jan 12 13:46:41 1970 +0000 -files: bar/bar -description: -commit-subdir-2 - - -changeset: 0:6ef3cb06bb80 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -files: foo/foo -description: -commit-subdir-1 - - -% dot and subdir commit test -% full log -changeset: 1:d9180e04fa8a -tag: tip -user: test -date: Sat Jan 24 03:33:20 1970 +0000 -files: foo/plain-file -description: -commit-foo-dot - - -changeset: 0:80b572aaf098 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -files: foo/plain-file -description: -commit-foo-subdir - - -% subdir log -changeset: 1:d9180e04fa8a -tag: tip -user: test -date: Sat Jan 24 03:33:20 1970 +0000 -summary: commit-foo-dot - -changeset: 0:80b572aaf098 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: commit-foo-subdir - -adding a -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -merging a -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -% should fail because we are specifying a file name -abort: cannot partially commit a merge (do not specify files or patterns) -% should fail because we are specifying a pattern -abort: cannot partially commit a merge (do not specify files or patterns) -% should succeed -% test commit message content - - -HG: Enter commit message. Lines beginning with 'HG:' are removed. -HG: Leave message empty to abort commit. -HG: -- -HG: user: test -HG: branch 'default' -HG: added added -HG: changed changed -HG: removed removed -abort: empty commit message diff -r 3152c978496a -r 00fee6394daf tests/test-commit.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-commit.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,253 @@ +commit date test + + $ hg init test + $ cd test + $ echo foo > foo + $ hg add foo + $ HGEDITOR=true hg commit -m "" + abort: empty commit message + $ hg commit -d '0 0' -m commit-1 + $ echo foo >> foo + $ hg commit -d '1 4444444' -m commit-3 + abort: impossible time zone offset: 4444444 + $ hg commit -d '1 15.1' -m commit-4 + abort: invalid date: '1\t15.1' + $ hg commit -d 'foo bar' -m commit-5 + abort: invalid date: 'foo bar' + $ hg commit -d ' 1 4444' -m commit-6 + $ hg commit -d '111111111111 0' -m commit-7 + abort: date exceeds 32 bits: 111111111111 + +commit added file that has been deleted + + $ echo bar > bar + $ hg add bar + $ rm bar + $ hg commit -d "1000000 0" -m commit-8 + nothing changed + $ hg commit -d "1000000 0" -m commit-8-2 bar + abort: bar: file not found! + + $ hg -q revert -a --no-backup + + $ mkdir dir + $ echo boo > dir/file + $ hg add + adding dir/file + $ hg -v commit -m commit-9 dir + dir/file + committed changeset 2:d2a76177cb42 + + $ echo > dir.file + $ hg add + adding dir.file + $ hg commit -m commit-10 dir dir.file + abort: dir: no match under directory! + + $ echo >> dir/file + $ mkdir bleh + $ mkdir dir2 + $ cd bleh + $ hg commit -m commit-11 . + abort: bleh: no match under directory! + $ hg commit -m commit-12 ../dir ../dir2 + abort: dir2: no match under directory! + $ hg -v commit -m commit-13 ../dir + dir/file + committed changeset 3:1cd62a2d8db5 + $ cd .. + + $ hg commit -m commit-14 does-not-exist + abort: does-not-exist: No such file or directory + $ ln -s foo baz + $ hg commit -m commit-15 baz + abort: baz: file not tracked! + $ touch quux + $ hg commit -m commit-16 quux + abort: quux: file not tracked! + $ echo >> dir/file + $ hg -v commit -m commit-17 dir/file + dir/file + committed changeset 4:49176991390e + +An empty date was interpreted as epoch origin + + $ echo foo >> foo + $ hg commit -d '' -m commit-no-date + $ hg tip --template '{date|isodate}\n' | grep '1970' + $ cd .. + + +partial subdir commit test + + $ hg init test2 + $ cd test2 + $ mkdir foo + $ echo foo > foo/foo + $ mkdir bar + $ echo bar > bar/bar + $ hg add + adding bar/bar + adding foo/foo + $ hg ci -d '1000000 0' -m commit-subdir-1 foo + $ hg ci -d '1000001 0' -m commit-subdir-2 bar + +subdir log 1 + + $ hg log -v foo + changeset: 0:6ef3cb06bb80 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + files: foo/foo + description: + commit-subdir-1 + + + +subdir log 2 + + $ hg log -v bar + changeset: 1:f2e51572cf5a + tag: tip + user: test + date: Mon Jan 12 13:46:41 1970 +0000 + files: bar/bar + description: + commit-subdir-2 + + + +full log + + $ hg log -v + changeset: 1:f2e51572cf5a + tag: tip + user: test + date: Mon Jan 12 13:46:41 1970 +0000 + files: bar/bar + description: + commit-subdir-2 + + + changeset: 0:6ef3cb06bb80 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + files: foo/foo + description: + commit-subdir-1 + + + $ cd .. + + +dot and subdir commit test + + $ hg init test3 + $ cd test3 + $ mkdir foo + $ echo foo content > foo/plain-file + $ hg add foo/plain-file + $ hg ci -d '1000000 0' -m commit-foo-subdir foo + $ echo modified foo content > foo/plain-file + $ hg ci -d '2000000 0' -m commit-foo-dot . + +full log + + $ hg log -v + changeset: 1:d9180e04fa8a + tag: tip + user: test + date: Sat Jan 24 03:33:20 1970 +0000 + files: foo/plain-file + description: + commit-foo-dot + + + changeset: 0:80b572aaf098 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + files: foo/plain-file + description: + commit-foo-subdir + + + +subdir log + + $ cd foo + $ hg log . + changeset: 1:d9180e04fa8a + tag: tip + user: test + date: Sat Jan 24 03:33:20 1970 +0000 + summary: commit-foo-dot + + changeset: 0:80b572aaf098 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: commit-foo-subdir + + $ cd .. + $ cd .. + + $ cd .. + $ hg init issue1049 + $ cd issue1049 + $ echo a > a + $ hg ci -Ama + adding a + $ echo a >> a + $ hg ci -mb + $ hg up 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo b >> a + $ hg ci -mc + created new head + $ HGMERGE=true hg merge + merging a + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + +should fail because we are specifying a file name + + $ hg ci -mmerge a + abort: cannot partially commit a merge (do not specify files or patterns) + +should fail because we are specifying a pattern + + $ hg ci -mmerge -I a + abort: cannot partially commit a merge (do not specify files or patterns) + +should succeed + + $ hg ci -mmerge + $ cd .. + + +test commit message content + + $ hg init commitmsg + $ cd commitmsg + $ echo changed > changed + $ echo removed > removed + $ hg ci -qAm init + + $ hg rm removed + $ echo changed >> changed + $ echo added > added + $ hg add added + $ HGEDITOR=cat hg ci -A + + + HG: Enter commit message. Lines beginning with 'HG:' are removed. + HG: Leave message empty to abort commit. + HG: -- + HG: user: test + HG: branch 'default' + HG: added added + HG: changed changed + HG: removed removed + abort: empty commit message + $ cd .. + + $ exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-committer --- a/tests/test-committer Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#!/bin/sh - -unset HGUSER -EMAIL="My Name " -export EMAIL - -hg init test -cd test -touch asdf -hg add asdf -hg commit -d '1000000 0' -m commit-1 -hg tip - -unset EMAIL -echo 1234 > asdf -hg commit -d '1000000 0' -u "foo@bar.com" -m commit-1 -hg tip -echo "[ui]" >> .hg/hgrc -echo "username = foobar " >> .hg/hgrc -echo 12 > asdf -hg commit -d '1000000 0' -m commit-1 -hg tip -echo 1 > asdf -hg commit -d '1000000 0' -u "foo@bar.com" -m commit-1 -hg tip -echo 123 > asdf -echo "[ui]" > .hg/hgrc -echo "username = " >> .hg/hgrc -hg commit -d '1000000 0' -m commit-1 -rm .hg/hgrc -hg commit -d '1000000 0' -m commit-1 2>&1 | sed -e "s/'[^']*'/user@host/" - -echo space > asdf -hg commit -d '1000000 0' -u ' ' -m commit-1 - -true diff -r 3152c978496a -r 00fee6394daf tests/test-committer.out --- a/tests/test-committer.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -changeset: 0:9426b370c206 -tag: tip -user: My Name -date: Mon Jan 12 13:46:40 1970 +0000 -summary: commit-1 - -changeset: 1:4997f15a1b24 -tag: tip -user: foo@bar.com -date: Mon Jan 12 13:46:40 1970 +0000 -summary: commit-1 - -changeset: 2:72b8012b424e -tag: tip -user: foobar -date: Mon Jan 12 13:46:40 1970 +0000 -summary: commit-1 - -changeset: 3:35ff3067bedd -tag: tip -user: foo@bar.com -date: Mon Jan 12 13:46:40 1970 +0000 -summary: commit-1 - -abort: no username supplied (see "hg help config") -No username found, using user@host instead -transaction abort! -rollback completed -abort: empty username! diff -r 3152c978496a -r 00fee6394daf tests/test-committer.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-committer.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,63 @@ + $ unset HGUSER + $ EMAIL="My Name " + $ export EMAIL + + $ hg init test + $ cd test + $ touch asdf + $ hg add asdf + $ hg commit -d '1000000 0' -m commit-1 + $ hg tip + changeset: 0:9426b370c206 + tag: tip + user: My Name + date: Mon Jan 12 13:46:40 1970 +0000 + summary: commit-1 + + + $ unset EMAIL + $ echo 1234 > asdf + $ hg commit -d '1000000 0' -u "foo@bar.com" -m commit-1 + $ hg tip + changeset: 1:4997f15a1b24 + tag: tip + user: foo@bar.com + date: Mon Jan 12 13:46:40 1970 +0000 + summary: commit-1 + + $ echo "[ui]" >> .hg/hgrc + $ echo "username = foobar " >> .hg/hgrc + $ echo 12 > asdf + $ hg commit -d '1000000 0' -m commit-1 + $ hg tip + changeset: 2:72b8012b424e + tag: tip + user: foobar + date: Mon Jan 12 13:46:40 1970 +0000 + summary: commit-1 + + $ echo 1 > asdf + $ hg commit -d '1000000 0' -u "foo@bar.com" -m commit-1 + $ hg tip + changeset: 3:35ff3067bedd + tag: tip + user: foo@bar.com + date: Mon Jan 12 13:46:40 1970 +0000 + summary: commit-1 + + $ echo 123 > asdf + $ echo "[ui]" > .hg/hgrc + $ echo "username = " >> .hg/hgrc + $ hg commit -d '1000000 0' -m commit-1 + abort: no username supplied (see "hg help config") + $ rm .hg/hgrc + $ hg commit -d '1000000 0' -m commit-1 2>&1 + No username found, using '[^']*' instead + + $ echo space > asdf + $ hg commit -d '1000000 0' -u ' ' -m commit-1 + transaction abort! + rollback completed + abort: empty username! + + $ true diff -r 3152c978496a -r 00fee6394daf tests/test-conflict --- a/tests/test-conflict Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -#!/bin/sh - -hg init -echo "nothing" > a -hg add a -hg commit -m ancestor -d "1000000 0" -echo "something" > a -hg commit -m branch1 -d "1000000 0" -hg co 0 -echo "something else" > a -hg commit -m branch2 -d "1000000 0" -hg merge 1 -hg id -cat a -hg status diff -r 3152c978496a -r 00fee6394daf tests/test-conflict.out --- a/tests/test-conflict.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -merging a -warning: conflicts during merge. -merging a failed! -0 files updated, 0 files merged, 0 files removed, 1 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon -e7fe8eb3e180+0d24b7662d3e+ tip -<<<<<<< local -something else -======= -something ->>>>>>> other -M a -? a.orig diff -r 3152c978496a -r 00fee6394daf tests/test-conflict.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-conflict.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,32 @@ + $ hg init + $ echo "nothing" > a + $ hg add a + $ hg commit -m ancestor -d "1000000 0" + $ echo "something" > a + $ hg commit -m branch1 -d "1000000 0" + $ hg co 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo "something else" > a + $ hg commit -m branch2 -d "1000000 0" + created new head + + $ hg merge 1 + merging a + warning: conflicts during merge. + merging a failed! + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon + + $ hg id + e7fe8eb3e180+0d24b7662d3e+ tip + + $ cat a + <<<<<<< local + something else + ======= + something + >>>>>>> other + + $ hg status + M a + ? a.orig diff -r 3152c978496a -r 00fee6394daf tests/test-copy --- a/tests/test-copy Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -#!/bin/sh - -hg init -echo a > a -hg add a -hg commit -m "1" -d "1000000 0" -hg status -hg copy a b -hg status -hg sum -hg --debug commit -m "2" -d "1000000 0" -echo "we should see two history entries" -hg history -v -echo "we should see one log entry for a" -hg log a -echo "this should show a revision linked to changeset 0" -hg debugindex .hg/store/data/a.i -echo "we should see one log entry for b" -hg log b -echo "this should show a revision linked to changeset 1" -hg debugindex .hg/store/data/b.i - -echo "this should show the rename information in the metadata" -hg debugdata .hg/store/data/b.d 0 | head -3 | tail -2 - -$TESTDIR/md5sum.py .hg/store/data/b.i -hg cat b > bsum -$TESTDIR/md5sum.py bsum -hg cat a > asum -$TESTDIR/md5sum.py asum -hg verify diff -r 3152c978496a -r 00fee6394daf tests/test-copy.out --- a/tests/test-copy.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -A b -parent: 0:33aaa84a386b tip - 1 -branch: default -commit: 1 copied -update: (current) -b - b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 -committed changeset 1:76973b01f66a012648546c979ea4c41de9e7d8cd -we should see two history entries -changeset: 1:76973b01f66a -tag: tip -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -files: b -description: -2 - - -changeset: 0:33aaa84a386b -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -files: a -description: -1 - - -we should see one log entry for a -changeset: 0:33aaa84a386b -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: 1 - -this should show a revision linked to changeset 0 - rev offset length base linkrev nodeid p1 p2 - 0 0 3 0 0 b789fdd96dc2 000000000000 000000000000 -we should see one log entry for b -changeset: 1:76973b01f66a -tag: tip -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: 2 - -this should show a revision linked to changeset 1 - rev offset length base linkrev nodeid p1 p2 - 0 0 65 0 1 37d9b5d994ea 000000000000 000000000000 -this should show the rename information in the metadata -copy: a -copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 -4999f120a3b88713bbefddd195cf5133 .hg/store/data/b.i -60b725f10c9c85c70d97880dfe8191b3 bsum -60b725f10c9c85c70d97880dfe8191b3 asum -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -2 files, 2 changesets, 2 total revisions diff -r 3152c978496a -r 00fee6394daf tests/test-copy.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-copy.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,91 @@ + $ hg init + $ echo a > a + $ hg add a + $ hg commit -m "1" -d "1000000 0" + $ hg status + $ hg copy a b + $ hg status + A b + $ hg sum + parent: 0:33aaa84a386b tip + 1 + branch: default + commit: 1 copied + update: (current) + $ hg --debug commit -m "2" -d "1000000 0" + b + b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 + committed changeset 1:76973b01f66a012648546c979ea4c41de9e7d8cd + +we should see two history entries + + $ hg history -v + changeset: 1:76973b01f66a + tag: tip + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + files: b + description: + 2 + + + changeset: 0:33aaa84a386b + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + files: a + description: + 1 + + + +we should see one log entry for a + + $ hg log a + changeset: 0:33aaa84a386b + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: 1 + + +this should show a revision linked to changeset 0 + + $ hg debugindex .hg/store/data/a.i + rev offset length base linkrev nodeid p1 p2 + 0 0 3 0 0 b789fdd96dc2 000000000000 000000000000 + +we should see one log entry for b + + $ hg log b + changeset: 1:76973b01f66a + tag: tip + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: 2 + + +this should show a revision linked to changeset 1 + + $ hg debugindex .hg/store/data/b.i + rev offset length base linkrev nodeid p1 p2 + 0 0 65 0 1 37d9b5d994ea 000000000000 000000000000 + +this should show the rename information in the metadata + + $ hg debugdata .hg/store/data/b.d 0 | head -3 | tail -2 + copy: a + copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 + + $ $TESTDIR/md5sum.py .hg/store/data/b.i + 4999f120a3b88713bbefddd195cf5133 .hg/store/data/b.i + $ hg cat b > bsum + $ $TESTDIR/md5sum.py bsum + 60b725f10c9c85c70d97880dfe8191b3 bsum + $ hg cat a > asum + $ $TESTDIR/md5sum.py asum + 60b725f10c9c85c70d97880dfe8191b3 asum + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 2 files, 2 changesets, 2 total revisions diff -r 3152c978496a -r 00fee6394daf tests/test-flags --- a/tests/test-flags Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -#!/bin/sh -e - -umask 027 -mkdir test1 -cd test1 - -hg init -touch a b -hg add a b -hg ci -m "added a b" -d "1000000 0" - -cd .. -hg clone test1 test3 -mkdir test2 -cd test2 - -hg init -hg pull ../test1 -hg co -chmod +x a -hg ci -m "chmod +x a" -d "1000000 0" -echo % the changelog should mention file a: -hg tip --template '{files}\n' - -cd ../test1 -echo 123 >>a -hg ci -m "a updated" -d "1000000 0" - -hg pull ../test2 -hg heads -hg history - -hg -v merge - -cd ../test3 -echo 123 >>b -hg ci -m "b updated" -d "1000000 0" - -hg pull ../test2 -hg heads -hg history - -hg -v merge - -ls -l ../test[123]/a > foo -cut -b 1-10 < foo - -hg debugindex .hg/store/data/a.i -hg debugindex ../test2/.hg/store/data/a.i -hg debugindex ../test1/.hg/store/data/a.i diff -r 3152c978496a -r 00fee6394daf tests/test-flags.out --- a/tests/test-flags.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -pulling from ../test1 -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -(run 'hg update' to get a working copy) -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -% the changelog should mention file a: -a -pulling from ../test2 -searching for changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 0 changes to 0 files (+1 heads) -(run 'hg heads' to see heads, 'hg merge' to merge) -changeset: 2:37dccb76c058 -tag: tip -parent: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: chmod +x a - -changeset: 1:a187cb361a5a -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: a updated - -changeset: 2:37dccb76c058 -tag: tip -parent: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: chmod +x a - -changeset: 1:a187cb361a5a -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: a updated - -changeset: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: added a b - -resolving manifests -0 files updated, 0 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -pulling from ../test2 -searching for changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 0 changes to 0 files (+1 heads) -(run 'hg heads' to see heads, 'hg merge' to merge) -changeset: 2:37dccb76c058 -tag: tip -parent: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: chmod +x a - -changeset: 1:d54568174d8e -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: b updated - -changeset: 2:37dccb76c058 -tag: tip -parent: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: chmod +x a - -changeset: 1:d54568174d8e -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: b updated - -changeset: 0:4536b1c2ca69 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: added a b - -resolving manifests -0 files updated, 0 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) --rwxr-x--- --rwxr-x--- --rwxr-x--- - rev offset length base linkrev nodeid p1 p2 - 0 0 0 0 0 b80de5d13875 000000000000 000000000000 - rev offset length base linkrev nodeid p1 p2 - 0 0 0 0 0 b80de5d13875 000000000000 000000000000 - rev offset length base linkrev nodeid p1 p2 - 0 0 0 0 0 b80de5d13875 000000000000 000000000000 - 1 0 5 1 1 7fe919cc0336 b80de5d13875 000000000000 diff -r 3152c978496a -r 00fee6394daf tests/test-flags.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-flags.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,149 @@ + $ umask 027 + $ mkdir test1 + $ cd test1 + + $ hg init + $ touch a b + $ hg add a b + $ hg ci -m "added a b" -d "1000000 0" + + $ cd .. + $ hg clone test1 test3 + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ mkdir test2 + $ cd test2 + + $ hg init + $ hg pull ../test1 + pulling from ../test1 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + (run 'hg update' to get a working copy) + $ hg co + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ chmod +x a + $ hg ci -m "chmod +x a" -d "1000000 0" + +the changelog should mention file a: + + $ hg tip --template '{files}\n' + a + + $ cd ../test1 + $ echo 123 >>a + $ hg ci -m "a updated" -d "1000000 0" + + $ hg pull ../test2 + pulling from ../test2 + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 0 changes to 0 files (+1 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + $ hg heads + changeset: 2:37dccb76c058 + tag: tip + parent: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: chmod +x a + + changeset: 1:a187cb361a5a + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: a updated + + $ hg history + changeset: 2:37dccb76c058 + tag: tip + parent: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: chmod +x a + + changeset: 1:a187cb361a5a + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: a updated + + changeset: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: added a b + + + $ hg -v merge + resolving manifests + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + + $ cd ../test3 + $ echo 123 >>b + $ hg ci -m "b updated" -d "1000000 0" + + $ hg pull ../test2 + pulling from ../test2 + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 0 changes to 0 files (+1 heads) + (run 'hg heads' to see heads, 'hg merge' to merge) + $ hg heads + changeset: 2:37dccb76c058 + tag: tip + parent: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: chmod +x a + + changeset: 1:d54568174d8e + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: b updated + + $ hg history + changeset: 2:37dccb76c058 + tag: tip + parent: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: chmod +x a + + changeset: 1:d54568174d8e + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: b updated + + changeset: 0:4536b1c2ca69 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: added a b + + + $ hg -v merge + resolving manifests + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + + $ ls -l ../test[123]/a > foo + $ cut -b 1-10 < foo + -rwxr-x--- + -rwxr-x--- + -rwxr-x--- + + $ hg debugindex .hg/store/data/a.i + rev offset length base linkrev nodeid p1 p2 + 0 0 0 0 0 b80de5d13875 000000000000 000000000000 + $ hg debugindex ../test2/.hg/store/data/a.i + rev offset length base linkrev nodeid p1 p2 + 0 0 0 0 0 b80de5d13875 000000000000 000000000000 + $ hg debugindex ../test1/.hg/store/data/a.i + rev offset length base linkrev nodeid p1 p2 + 0 0 0 0 0 b80de5d13875 000000000000 000000000000 + 1 0 5 1 1 7fe919cc0336 b80de5d13875 000000000000 diff -r 3152c978496a -r 00fee6394daf tests/test-hook --- a/tests/test-hook Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -#!/bin/sh - -cp "$TESTDIR"/printenv.py . - -# commit hooks can see env vars -hg init a -cd a -echo "[hooks]" > .hg/hgrc -echo 'commit = unset HG_LOCAL HG_TAG; python ../printenv.py commit' >> .hg/hgrc -echo 'commit.b = unset HG_LOCAL HG_TAG; python ../printenv.py commit.b' >> .hg/hgrc -echo 'precommit = unset HG_LOCAL HG_NODE HG_TAG; python ../printenv.py precommit' >> .hg/hgrc -echo 'pretxncommit = unset HG_LOCAL HG_TAG; python ../printenv.py pretxncommit' >> .hg/hgrc -echo 'pretxncommit.tip = hg -q tip' >> .hg/hgrc -echo 'pre-identify = python ../printenv.py pre-identify 1' >> .hg/hgrc -echo 'pre-cat = python ../printenv.py pre-cat' >> .hg/hgrc -echo 'post-cat = python ../printenv.py post-cat' >> .hg/hgrc -echo a > a -hg add a -hg commit -m a -d "1000000 0" - -hg clone . ../b -cd ../b - -# changegroup hooks can see env vars -echo '[hooks]' > .hg/hgrc -echo 'prechangegroup = python ../printenv.py prechangegroup' >> .hg/hgrc -echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc -echo 'incoming = python ../printenv.py incoming' >> .hg/hgrc - -# pretxncommit and commit hooks can see both parents of merge -cd ../a -echo b >> a -hg commit -m a1 -d "1 0" -hg update -C 0 -echo b > b -hg add b -hg commit -m b -d '1 0' -hg merge 1 -hg commit -m merge -d '2 0' - -# test generic hooks -hg id -hg cat b - -cd ../b -hg pull ../a - -# tag hooks can see env vars -cd ../a -echo 'pretag = python ../printenv.py pretag' >> .hg/hgrc -echo 'tag = unset HG_PARENT1 HG_PARENT2; python ../printenv.py tag' >> .hg/hgrc -hg tag -d '3 0' a -hg tag -l la - -# pretag hook can forbid tagging -echo 'pretag.forbid = python ../printenv.py pretag.forbid 1' >> .hg/hgrc -hg tag -d '4 0' fa -hg tag -l fla - -# pretxncommit hook can see changeset, can roll back txn, changeset -# no more there after -echo 'pretxncommit.forbid0 = hg tip -q' >> .hg/hgrc -echo 'pretxncommit.forbid1 = python ../printenv.py pretxncommit.forbid 1' >> .hg/hgrc -echo z > z -hg add z -hg -q tip -hg commit -m 'fail' -d '4 0' -hg -q tip - -# precommit hook can prevent commit -echo 'precommit.forbid = python ../printenv.py precommit.forbid 1' >> .hg/hgrc -hg commit -m 'fail' -d '4 0' -hg -q tip - -# preupdate hook can prevent update -echo 'preupdate = python ../printenv.py preupdate' >> .hg/hgrc -hg update 1 - -# update hook -echo 'update = python ../printenv.py update' >> .hg/hgrc -hg update - -# prechangegroup hook can prevent incoming changes -cd ../b -hg -q tip -echo '[hooks]' > .hg/hgrc -echo 'prechangegroup.forbid = python ../printenv.py prechangegroup.forbid 1' >> .hg/hgrc -hg pull ../a - -# pretxnchangegroup hook can see incoming changes, can roll back txn, -# incoming changes no longer there after -echo '[hooks]' > .hg/hgrc -echo 'pretxnchangegroup.forbid0 = hg tip -q' >> .hg/hgrc -echo 'pretxnchangegroup.forbid1 = python ../printenv.py pretxnchangegroup.forbid 1' >> .hg/hgrc -hg pull ../a -hg -q tip - -# outgoing hooks can see env vars -rm .hg/hgrc -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing = python ../printenv.py preoutgoing' >> ../a/.hg/hgrc -echo 'outgoing = python ../printenv.py outgoing' >> ../a/.hg/hgrc -hg pull ../a -hg rollback - -# preoutgoing hook can prevent outgoing changes -echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> ../a/.hg/hgrc -hg pull ../a - -# outgoing hooks work for local clones -cd .. -echo '[hooks]' > a/.hg/hgrc -echo 'preoutgoing = python ../printenv.py preoutgoing' >> a/.hg/hgrc -echo 'outgoing = python ../printenv.py outgoing' >> a/.hg/hgrc -hg clone a c -rm -rf c - -# preoutgoing hook can prevent outgoing changes for local clones -echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> a/.hg/hgrc -hg clone a zzz -cd b - -cat > hooktests.py < ../a/.hg/hgrc -echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc -hg pull ../a 2>&1 | grep 'raised an exception' - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc -hg pull ../a 2>&1 | grep 'raised an exception' - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc -hg pull ../a - -echo '[hooks]' > ../a/.hg/hgrc -echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc -hg pull ../a - -echo '# make sure --traceback works' -echo '[hooks]' > .hg/hgrc -echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc - -echo aa > a -hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback' - -cd .. -hg init c -cd c - -cat > hookext.py <> .hg/hgrc -echo 'hookext = hookext.py' >> .hg/hgrc - -touch foo -hg add foo -hg ci -d '0 0' -m 'add foo' -echo >> foo -hg ci --debug -d '0 0' -m 'change foo' | sed -e 's/ at .*>/>/' - -hg showconfig hooks | sed -e 's/ at .*>/>/' - -echo '# test python hook configured with python:[file]:[hook] syntax' -cd .. -mkdir d -cd d -hg init repo -mkdir hooks - -cd hooks -cat > testhooks.py < ../repo/.hg/hgrc -echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc - -cd ../repo -hg commit -d '0 0' - -cd ../../b -echo '# make sure --traceback works on hook import failure' -cat > importfail.py < .hg/hgrc -echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc - -echo a >> a -hg --traceback commit -d '0 0' -ma 2>&1 | egrep '^(exception|Traceback|ImportError)' - -echo '# commit and update hooks should run after command completion (issue 1827)' -echo '[hooks]' > .hg/hgrc -echo 'commit = hg id' >> .hg/hgrc -echo 'update = hg id' >> .hg/hgrc -echo bb > a -hg ci -d '0 0' -ma -hg up 0 - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-hook.out --- a/tests/test-hook.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -precommit hook: HG_PARENT1=0000000000000000000000000000000000000000 -pretxncommit hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$HGTMP/test-hook/a -0:29b62aeb769f -commit hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 -commit.b hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 -updating to branch default -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -precommit hook: HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -pretxncommit hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PENDING=$HGTMP/test-hook/a -1:b702efe96888 -commit hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -commit.b hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -precommit hook: HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -pretxncommit hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PENDING=$HGTMP/test-hook/a -2:1324a5531bac -commit hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -commit.b hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b -created new head -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -precommit hook: HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 -pretxncommit hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PENDING=$HGTMP/test-hook/a -3:4c52fb2e4022 -commit hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 -commit.b hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 -pre-identify hook: HG_ARGS=id HG_OPTS={'tags': None, 'rev': '', 'num': None, 'branch': None, 'id': None} HG_PATS=[] -warning: pre-identify hook exited with status 1 -pre-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b'] -post-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b'] HG_RESULT=0 -b -prechangegroup hook: HG_SOURCE=pull HG_URL=file: -changegroup hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_SOURCE=pull HG_URL=file: -incoming hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_SOURCE=pull HG_URL=file: -incoming hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_SOURCE=pull HG_URL=file: -incoming hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_SOURCE=pull HG_URL=file: -pulling from ../a -searching for changes -adding changesets -adding manifests -adding file changes -added 3 changesets with 2 changes to 2 files -(run 'hg update' to get a working copy) -pretag hook: HG_LOCAL=0 HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_TAG=a -precommit hook: HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 -pretxncommit hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 HG_PENDING=$HGTMP/test-hook/a -4:8ea2ef7ad3e8 -commit hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 -commit.b hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 -tag hook: HG_LOCAL=0 HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_TAG=a -pretag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=la -tag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=la -pretag hook: HG_LOCAL=0 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fa -pretag.forbid hook: HG_LOCAL=0 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fa -abort: pretag.forbid hook exited with status 1 -pretag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fla -pretag.forbid hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fla -abort: pretag.forbid hook exited with status 1 -4:8ea2ef7ad3e8 -precommit hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 -pretxncommit hook: HG_NODE=fad284daf8c032148abaffcd745dafeceefceb61 HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook/a -5:fad284daf8c0 -5:fad284daf8c0 -pretxncommit.forbid hook: HG_NODE=fad284daf8c032148abaffcd745dafeceefceb61 HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook/a -transaction abort! -rollback completed -abort: pretxncommit.forbid1 hook exited with status 1 -4:8ea2ef7ad3e8 -precommit hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 -precommit.forbid hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 -abort: precommit.forbid hook exited with status 1 -4:8ea2ef7ad3e8 -preupdate hook: HG_PARENT1=b702efe96888 -0 files updated, 0 files merged, 2 files removed, 0 files unresolved -preupdate hook: HG_PARENT1=8ea2ef7ad3e8 -update hook: HG_ERROR=0 HG_PARENT1=8ea2ef7ad3e8 -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -3:4c52fb2e4022 -prechangegroup.forbid hook: HG_SOURCE=pull HG_URL=file: -pulling from ../a -searching for changes -abort: prechangegroup.forbid hook exited with status 1 -4:8ea2ef7ad3e8 -pretxnchangegroup.forbid hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook/b HG_SOURCE=pull HG_URL=file: -pulling from ../a -searching for changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -transaction abort! -rollback completed -abort: pretxnchangegroup.forbid1 hook exited with status 1 -3:4c52fb2e4022 -preoutgoing hook: HG_SOURCE=pull -outgoing hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_SOURCE=pull -pulling from ../a -searching for changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -(run 'hg update' to get a working copy) -rolling back to revision 3 (undo pull) -preoutgoing hook: HG_SOURCE=pull -preoutgoing.forbid hook: HG_SOURCE=pull -pulling from ../a -searching for changes -abort: preoutgoing.forbid hook exited with status 1 -preoutgoing hook: HG_SOURCE=clone -outgoing hook: HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone -updating to branch default -3 files updated, 0 files merged, 0 files removed, 0 files unresolved -preoutgoing hook: HG_SOURCE=clone -preoutgoing.forbid hook: HG_SOURCE=clone -abort: preoutgoing.forbid hook exited with status 1 -# test python hooks -error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict' -error: preoutgoing.raise hook raised an exception: exception from hook -pulling from ../a -searching for changes -error: preoutgoing.abort hook failed: raise abort from hook -abort: raise abort from hook -pulling from ../a -searching for changes -hook args: - hooktype preoutgoing - source pull -abort: preoutgoing.fail hook failed -pulling from ../a -searching for changes -abort: preoutgoing.uncallable hook is invalid ("hooktests.uncallable" is not callable) -pulling from ../a -searching for changes -abort: preoutgoing.nohook hook is invalid ("hooktests.nohook" is not defined) -pulling from ../a -searching for changes -abort: preoutgoing.nomodule hook is invalid ("nomodule" not in a module) -pulling from ../a -searching for changes -abort: preoutgoing.badmodule hook is invalid (import of "nomodule" failed) -pulling from ../a -searching for changes -abort: preoutgoing.unreachable hook is invalid (import of "hooktests.container" failed) -pulling from ../a -searching for changes -hook args: - hooktype preoutgoing - source pull -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -(run 'hg update' to get a working copy) -# make sure --traceback works -Traceback (most recent call last): -Automatically installed hook -foo -calling hook commit.auto: -Automatically installed hook -committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708 -hooks.commit.auto= -# test python hook configured with python:[file]:[hook] syntax -hook works -nothing changed -# make sure --traceback works on hook import failure -exception from first failed import attempt: -Traceback (most recent call last): -ImportError: No module named somebogusmodule -exception from second failed import attempt: -Traceback (most recent call last): -ImportError: No module named hgext_importfail -Traceback (most recent call last): -# commit and update hooks should run after command completion (issue 1827) -8da618c33484 tip -29b62aeb769f -1 files updated, 0 files merged, 0 files removed, 0 files unresolved diff -r 3152c978496a -r 00fee6394daf tests/test-hook.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-hook.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,465 @@ + $ cp "$TESTDIR"/printenv.py . + +# commit hooks can see env vars + + $ hg init a + $ cd a + $ echo "[hooks]" > .hg/hgrc + $ echo 'commit = unset HG_LOCAL HG_TAG; python ../printenv.py commit' >> .hg/hgrc + $ echo 'commit.b = unset HG_LOCAL HG_TAG; python ../printenv.py commit.b' >> .hg/hgrc + $ echo 'precommit = unset HG_LOCAL HG_NODE HG_TAG; python ../printenv.py precommit' >> .hg/hgrc + $ echo 'pretxncommit = unset HG_LOCAL HG_TAG; python ../printenv.py pretxncommit' >> .hg/hgrc + $ echo 'pretxncommit.tip = hg -q tip' >> .hg/hgrc + $ echo 'pre-identify = python ../printenv.py pre-identify 1' >> .hg/hgrc + $ echo 'pre-cat = python ../printenv.py pre-cat' >> .hg/hgrc + $ echo 'post-cat = python ../printenv.py post-cat' >> .hg/hgrc + $ echo a > a + $ hg add a + $ hg commit -m a -d "1000000 0" + precommit hook: HG_PARENT1=0000000000000000000000000000000000000000 + pretxncommit hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$HGTMP/test-hook.t/a + 0:29b62aeb769f + commit hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 + commit.b hook: HG_NODE=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PARENT1=0000000000000000000000000000000000000000 + + $ hg clone . ../b + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../b + +# changegroup hooks can see env vars + + $ echo '[hooks]' > .hg/hgrc + $ echo 'prechangegroup = python ../printenv.py prechangegroup' >> .hg/hgrc + $ echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc + $ echo 'incoming = python ../printenv.py incoming' >> .hg/hgrc + +# pretxncommit and commit hooks can see both parents of merge + + $ cd ../a + $ echo b >> a + $ hg commit -m a1 -d "1 0" + precommit hook: HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + pretxncommit hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PENDING=$HGTMP/test-hook.t/a + 1:b702efe96888 + commit hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + commit.b hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + $ hg update -C 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo b > b + $ hg add b + $ hg commit -m b -d '1 0' + precommit hook: HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + pretxncommit hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b HG_PENDING=$HGTMP/test-hook.t/a + 2:1324a5531bac + commit hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + commit.b hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT1=29b62aeb769fdf78d8d9c5f28b017f76d7ef824b + created new head + $ hg merge 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg commit -m merge -d '2 0' + precommit hook: HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 + pretxncommit hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 HG_PENDING=$HGTMP/test-hook.t/a + 3:4c52fb2e4022 + commit hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 + commit.b hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_PARENT1=1324a5531bac09b329c3845d35ae6a7526874edb HG_PARENT2=b702efe9688826e3a91283852b328b84dbf37bc2 + +# test generic hooks + + $ hg id + pre-identify hook: HG_ARGS=id HG_OPTS={'tags': None, 'rev': '', 'num': None, 'branch': None, 'id': None} HG_PATS=[] + warning: pre-identify hook exited with status 1 + $ hg cat b + pre-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b'] + post-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b'] HG_RESULT=0 + b + + $ cd ../b + $ hg pull ../a + prechangegroup hook: HG_SOURCE=pull HG_URL=file: + changegroup hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_SOURCE=pull HG_URL=file: + incoming hook: HG_NODE=b702efe9688826e3a91283852b328b84dbf37bc2 HG_SOURCE=pull HG_URL=file: + incoming hook: HG_NODE=1324a5531bac09b329c3845d35ae6a7526874edb HG_SOURCE=pull HG_URL=file: + incoming hook: HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_SOURCE=pull HG_URL=file: + pulling from ../a + searching for changes + adding changesets + adding manifests + adding file changes + added 3 changesets with 2 changes to 2 files + (run 'hg update' to get a working copy) + +# tag hooks can see env vars + + $ cd ../a + $ echo 'pretag = python ../printenv.py pretag' >> .hg/hgrc + $ echo 'tag = unset HG_PARENT1 HG_PARENT2; python ../printenv.py tag' >> .hg/hgrc + $ hg tag -d '3 0' a + pretag hook: HG_LOCAL=0 HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_TAG=a + precommit hook: HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 + pretxncommit hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 HG_PENDING=$HGTMP/test-hook.t/a + 4:8ea2ef7ad3e8 + commit hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 + commit.b hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PARENT1=4c52fb2e402287dd5dc052090682536c8406c321 + tag hook: HG_LOCAL=0 HG_NODE=4c52fb2e402287dd5dc052090682536c8406c321 HG_TAG=a + $ hg tag -l la + pretag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=la + tag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=la + +# pretag hook can forbid tagging + + $ echo 'pretag.forbid = python ../printenv.py pretag.forbid 1' >> .hg/hgrc + $ hg tag -d '4 0' fa + pretag hook: HG_LOCAL=0 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fa + pretag.forbid hook: HG_LOCAL=0 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fa + abort: pretag.forbid hook exited with status 1 + $ hg tag -l fla + pretag hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fla + pretag.forbid hook: HG_LOCAL=1 HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_TAG=fla + abort: pretag.forbid hook exited with status 1 + +# pretxncommit hook can see changeset, can roll back txn, changeset +# no more there after + + $ echo 'pretxncommit.forbid0 = hg tip -q' >> .hg/hgrc + $ echo 'pretxncommit.forbid1 = python ../printenv.py pretxncommit.forbid 1' >> .hg/hgrc + $ echo z > z + $ hg add z + $ hg -q tip + 4:8ea2ef7ad3e8 + $ hg commit -m 'fail' -d '4 0' + precommit hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 + pretxncommit hook: HG_NODE=fad284daf8c032148abaffcd745dafeceefceb61 HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook.t/a + 5:fad284daf8c0 + 5:fad284daf8c0 + pretxncommit.forbid hook: HG_NODE=fad284daf8c032148abaffcd745dafeceefceb61 HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook.t/a + transaction abort! + rollback completed + abort: pretxncommit.forbid1 hook exited with status 1 + $ hg -q tip + 4:8ea2ef7ad3e8 + +# precommit hook can prevent commit + + $ echo 'precommit.forbid = python ../printenv.py precommit.forbid 1' >> .hg/hgrc + $ hg commit -m 'fail' -d '4 0' + precommit hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 + precommit.forbid hook: HG_PARENT1=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 + abort: precommit.forbid hook exited with status 1 + $ hg -q tip + 4:8ea2ef7ad3e8 + +# preupdate hook can prevent update + + $ echo 'preupdate = python ../printenv.py preupdate' >> .hg/hgrc + $ hg update 1 + preupdate hook: HG_PARENT1=b702efe96888 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + +# update hook + + $ echo 'update = python ../printenv.py update' >> .hg/hgrc + $ hg update + preupdate hook: HG_PARENT1=8ea2ef7ad3e8 + update hook: HG_ERROR=0 HG_PARENT1=8ea2ef7ad3e8 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +# prechangegroup hook can prevent incoming changes + + $ cd ../b + $ hg -q tip + 3:4c52fb2e4022 + $ echo '[hooks]' > .hg/hgrc + $ echo 'prechangegroup.forbid = python ../printenv.py prechangegroup.forbid 1' >> .hg/hgrc + $ hg pull ../a + prechangegroup.forbid hook: HG_SOURCE=pull HG_URL=file: + pulling from ../a + searching for changes + abort: prechangegroup.forbid hook exited with status 1 + +# pretxnchangegroup hook can see incoming changes, can roll back txn, +# incoming changes no longer there after + + $ echo '[hooks]' > .hg/hgrc + $ echo 'pretxnchangegroup.forbid0 = hg tip -q' >> .hg/hgrc + $ echo 'pretxnchangegroup.forbid1 = python ../printenv.py pretxnchangegroup.forbid 1' >> .hg/hgrc + $ hg pull ../a + 4:8ea2ef7ad3e8 + pretxnchangegroup.forbid hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_PENDING=$HGTMP/test-hook.t/b HG_SOURCE=pull HG_URL=file: + pulling from ../a + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + transaction abort! + rollback completed + abort: pretxnchangegroup.forbid1 hook exited with status 1 + $ hg -q tip + 3:4c52fb2e4022 + +# outgoing hooks can see env vars + + $ rm .hg/hgrc + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing = python ../printenv.py preoutgoing' >> ../a/.hg/hgrc + $ echo 'outgoing = python ../printenv.py outgoing' >> ../a/.hg/hgrc + $ hg pull ../a + preoutgoing hook: HG_SOURCE=pull + outgoing hook: HG_NODE=8ea2ef7ad3e8cac946c72f1e0c79d6aebc301198 HG_SOURCE=pull + pulling from ../a + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + (run 'hg update' to get a working copy) + $ hg rollback + rolling back to revision 3 (undo pull) + +# preoutgoing hook can prevent outgoing changes + + $ echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> ../a/.hg/hgrc + $ hg pull ../a + preoutgoing hook: HG_SOURCE=pull + preoutgoing.forbid hook: HG_SOURCE=pull + pulling from ../a + searching for changes + abort: preoutgoing.forbid hook exited with status 1 + +# outgoing hooks work for local clones + + $ cd .. + $ echo '[hooks]' > a/.hg/hgrc + $ echo 'preoutgoing = python ../printenv.py preoutgoing' >> a/.hg/hgrc + $ echo 'outgoing = python ../printenv.py outgoing' >> a/.hg/hgrc + $ hg clone a c + preoutgoing hook: HG_SOURCE=clone + outgoing hook: HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm -rf c + +# preoutgoing hook can prevent outgoing changes for local clones + + $ echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> a/.hg/hgrc + $ hg clone a zzz + preoutgoing hook: HG_SOURCE=clone + preoutgoing.forbid hook: HG_SOURCE=clone + abort: preoutgoing.forbid hook exited with status 1 + $ cd b + + $ cat > hooktests.py < from mercurial import util + > + > uncallable = 0 + > + > def printargs(args): + > args.pop('ui', None) + > args.pop('repo', None) + > a = list(args.items()) + > a.sort() + > print 'hook args:' + > for k, v in a: + > print ' ', k, v + > + > def passhook(**args): + > printargs(args) + > + > def failhook(**args): + > printargs(args) + > return True + > + > class LocalException(Exception): + > pass + > + > def raisehook(**args): + > raise LocalException('exception from hook') + > + > def aborthook(**args): + > raise util.Abort('raise abort from hook') + > + > def brokenhook(**args): + > return 1 + {} + > + > class container: + > unreachable = 1 + > EOF + +# test python hooks + + $ PYTHONPATH="`pwd`:$PYTHONPATH" + $ export PYTHONPATH + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc + $ hg pull ../a 2>&1 | grep 'raised an exception' + error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict' + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc + $ hg pull ../a 2>&1 | grep 'raised an exception' + error: preoutgoing.raise hook raised an exception: exception from hook + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + error: preoutgoing.abort hook failed: raise abort from hook + abort: raise abort from hook + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + hook args: + hooktype preoutgoing + source pull + abort: preoutgoing.fail hook failed + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + abort: preoutgoing.uncallable hook is invalid ("hooktests.uncallable" is not callable) + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + abort: preoutgoing.nohook hook is invalid ("hooktests.nohook" is not defined) + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + abort: preoutgoing.nomodule hook is invalid ("nomodule" not in a module) + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + abort: preoutgoing.badmodule hook is invalid (import of "nomodule" failed) + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + abort: preoutgoing.unreachable hook is invalid (import of "hooktests.container" failed) + + $ echo '[hooks]' > ../a/.hg/hgrc + $ echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc + $ hg pull ../a + pulling from ../a + searching for changes + hook args: + hooktype preoutgoing + source pull + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + (run 'hg update' to get a working copy) + +# make sure --traceback works + + $ echo '[hooks]' > .hg/hgrc + $ echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc + + $ echo aa > a + $ hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback' + Traceback (most recent call last): + + $ cd .. + $ hg init c + $ cd c + + $ cat > hookext.py < def autohook(**args): + > print "Automatically installed hook" + > + > def reposetup(ui, repo): + > repo.ui.setconfig("hooks", "commit.auto", autohook) + > EOF + $ echo '[extensions]' >> .hg/hgrc + $ echo 'hookext = hookext.py' >> .hg/hgrc + + $ touch foo + $ hg add foo + $ hg ci -d '0 0' -m 'add foo' + Automatically installed hook + $ echo >> foo + $ hg ci --debug -d '0 0' -m 'change foo' + foo + calling hook commit.auto: + Automatically installed hook + committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708 + + $ hg showconfig hooks + hooks.commit.auto= + +# test python hook configured with python:[file]:[hook] syntax + + $ cd .. + $ mkdir d + $ cd d + $ hg init repo + $ mkdir hooks + + $ cd hooks + $ cat > testhooks.py < def testhook(**args): + > print 'hook works' + > EOF + $ echo '[hooks]' > ../repo/.hg/hgrc + $ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc + + $ cd ../repo + $ hg commit -d '0 0' + hook works + nothing changed + + $ cd ../../b + +# make sure --traceback works on hook import failure + + $ cat > importfail.py < import somebogusmodule + > # dereference something in the module to force demandimport to load it + > somebogusmodule.whatever + > EOF + + $ echo '[hooks]' > .hg/hgrc + $ echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc + + $ echo a >> a + $ hg --traceback commit -d '0 0' -ma 2>&1 | egrep '^(exception|Traceback|ImportError)' + exception from first failed import attempt: + Traceback (most recent call last): + ImportError: No module named somebogusmodule + exception from second failed import attempt: + Traceback (most recent call last): + ImportError: No module named hgext_importfail + Traceback (most recent call last): + +# commit and update hooks should run after command completion (issue 1827) + + $ echo '[hooks]' > .hg/hgrc + $ echo 'commit = hg id' >> .hg/hgrc + $ echo 'update = hg id' >> .hg/hgrc + $ echo bb > a + $ hg ci -d '0 0' -ma + 8da618c33484 tip + $ hg up 0 + 29b62aeb769f + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-identify --- a/tests/test-identify Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -#!/bin/sh - -"$TESTDIR/hghave" no-outer-repo || exit 80 - -echo % no repo -hg id - -echo % create repo -hg init test -cd test -echo a > a -hg ci -Ama - -echo % basic id usage -hg id -hg id --debug -hg id -q -hg id -v - -echo % with options -hg id -r. -hg id -n -hg id -t -hg id -b -hg id -i -hg id -n -t -b -i - -echo % with modifications -echo b > a -hg id -n -t -b -i - -echo % other local repo -cd .. -hg -R test id -hg id test - -echo % with remote http repo -cd test -hg serve -p $HGPORT1 -d --pid-file=hg.pid -cat hg.pid >> $DAEMON_PIDS -hg id http://localhost:$HGPORT1/ - -echo % remote with tags? -hg id -t http://localhost:$HGPORT1/ - -true # ends with util.Abort -> returns 255 diff -r 3152c978496a -r 00fee6394daf tests/test-identify.out --- a/tests/test-identify.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -% no repo -abort: There is no Mercurial repository here (.hg not found) -% create repo -adding a -% basic id usage -cb9a9f314b8b tip -cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip -cb9a9f314b8b -cb9a9f314b8b tip -% with options -cb9a9f314b8b tip -0 -tip -default -cb9a9f314b8b -cb9a9f314b8b 0 default tip -% with modifications -cb9a9f314b8b+ 0+ default tip -% other local repo -cb9a9f314b8b+ tip -cb9a9f314b8b+ tip -% with remote http repo -cb9a9f314b8b -% remote with tags? -abort: can't query remote revision number, branch, or tags diff -r 3152c978496a -r 00fee6394daf tests/test-identify.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-identify.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,69 @@ + $ "$TESTDIR/hghave" no-outer-repo || exit 80 + +no repo + + $ hg id + abort: There is no Mercurial repository here (.hg not found) + +create repo + + $ hg init test + $ cd test + $ echo a > a + $ hg ci -Ama + adding a + +basic id usage + + $ hg id + cb9a9f314b8b tip + $ hg id --debug + cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip + $ hg id -q + cb9a9f314b8b + $ hg id -v + cb9a9f314b8b tip + +with options + + $ hg id -r. + cb9a9f314b8b tip + $ hg id -n + 0 + $ hg id -t + tip + $ hg id -b + default + $ hg id -i + cb9a9f314b8b + $ hg id -n -t -b -i + cb9a9f314b8b 0 default tip + +with modifications + + $ echo b > a + $ hg id -n -t -b -i + cb9a9f314b8b+ 0+ default tip + +other local repo + + $ cd .. + $ hg -R test id + cb9a9f314b8b+ tip + $ hg id test + cb9a9f314b8b+ tip + +with remote http repo + + $ cd test + $ hg serve -p $HGPORT1 -d --pid-file=hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ hg id http://localhost:$HGPORT1/ + cb9a9f314b8b + +remote with tags? + + $ hg id -t http://localhost:$HGPORT1/ + abort: can't query remote revision number, branch, or tags + + $ true # ends with util.Abort -> returns 255 diff -r 3152c978496a -r 00fee6394daf tests/test-import --- a/tests/test-import Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,497 +0,0 @@ -#!/bin/sh - -hg init a -mkdir a/d1 -mkdir a/d1/d2 -echo line 1 > a/a -echo line 1 > a/d1/d2/a -hg --cwd a ci -Ama - -echo line 2 >> a/a -hg --cwd a ci -u someone -d '1 0' -m'second change' - -echo % import exported patch -hg clone -r0 a b -hg --cwd a export tip > tip.patch -hg --cwd b import ../tip.patch -echo % message should be same -hg --cwd b tip | grep 'second change' -echo % committer should be same -hg --cwd b tip | grep someone -rm -r b - -echo % import exported patch with external patcher -cat > dummypatch.py < tip.patch -hg --config ui.patch='python ../dummypatch.py' --cwd b import ../tip.patch -cat b/a -rm -r b - -echo % import of plain diff should fail without message -hg clone -r0 a b -hg --cwd a diff -r0:1 > tip.patch -hg --cwd b import ../tip.patch -rm -r b - -echo % import of plain diff should be ok with message -hg clone -r0 a b -hg --cwd a diff -r0:1 > tip.patch -hg --cwd b import -mpatch ../tip.patch -rm -r b - -echo % import of plain diff with specific date and user -hg clone -r0 a b -hg --cwd a diff -r0:1 > tip.patch -hg --cwd b import -mpatch -d '1 0' -u 'user@nowhere.net' ../tip.patch -hg -R b tip -pv -rm -r b - -echo % import of plain diff should be ok with --no-commit -hg clone -r0 a b -hg --cwd a diff -r0:1 > tip.patch -hg --cwd b import --no-commit ../tip.patch -hg --cwd b diff --nodates -rm -r b - -echo % hg -R repo import -# put the clone in a subdir - having a directory named "a" -# used to hide a bug. -mkdir dir -hg clone -r0 a dir/b -hg --cwd a export tip > dir/tip.patch -cd dir -hg -R b import tip.patch -cd .. -rm -r dir - -echo % import from stdin -hg clone -r0 a b -hg --cwd a export tip | hg --cwd b import - -rm -r b - -echo % import two patches in one stream -hg init b -hg --cwd a export 0:tip | hg --cwd b import - -hg --cwd a id -hg --cwd b id -rm -r b - -echo % override commit message -hg clone -r0 a b -hg --cwd a export tip | hg --cwd b import -m 'override' - -hg --cwd b tip | grep override -rm -r b - -cat > mkmsg.py < tip.patch -python mkmsg.py > msg.patch -hg --cwd b import ../msg.patch -hg --cwd b tip | grep email -rm -r b - -echo % plain diff in email, no subject, message body -hg clone -r0 a b -grep -v '^Subject:' msg.patch | hg --cwd b import - -rm -r b - -echo % plain diff in email, subject, no message body -hg clone -r0 a b -grep -v '^email ' msg.patch | hg --cwd b import - -rm -r b - -echo % plain diff in email, no subject, no message body, should fail -hg clone -r0 a b -egrep -v '^(Subject|email)' msg.patch | hg --cwd b import - -rm -r b - -echo % hg export in email, should use patch header -hg clone -r0 a b -hg --cwd a export tip > tip.patch -python mkmsg.py | hg --cwd b import - -hg --cwd b tip | grep second -rm -r b - -# subject: duplicate detection, removal of [PATCH] -# The '---' tests the gitsendmail handling without proper mail headers -cat > mkmsg2.py < tip.patch -python mkmsg2.py | hg --cwd b import - -hg --cwd b tip --template '{desc}\n' -rm -r b - -# We weren't backing up the correct dirstate file when importing many patches -# (issue963) -echo '% import patch1 patch2; rollback' -echo line 3 >> a/a -hg --cwd a ci -m'third change' -hg --cwd a export -o '../patch%R' 1 2 -hg clone -qr0 a b -hg --cwd b parents --template 'parent: {rev}\n' -hg --cwd b import ../patch1 ../patch2 -hg --cwd b rollback -hg --cwd b parents --template 'parent: {rev}\n' -rm -r b - -# bug non regression test -# importing a patch in a subdirectory failed at the commit stage -echo line 2 >> a/d1/d2/a -hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change' -echo % hg import in a subdirectory -hg clone -r0 a b -hg --cwd a export tip | sed -e 's/d1\/d2\///' > tip.patch -dir=`pwd` -cd b/d1/d2 2>&1 > /dev/null -hg import ../../../tip.patch -cd "$dir" -echo "% message should be 'subdir change'" -hg --cwd b tip | grep 'subdir change' -echo "% committer should be 'someoneelse'" -hg --cwd b tip | grep someoneelse -echo "% should be empty" -hg --cwd b status - - -# Test fuzziness (ambiguous patch location, fuzz=2) -echo % test fuzziness -hg init fuzzy -cd fuzzy -echo line1 > a -echo line0 >> a -echo line3 >> a -hg ci -Am adda -echo line1 > a -echo line2 >> a -echo line0 >> a -echo line3 >> a -hg ci -m change a -hg export tip > tip.patch -hg up -C 0 -echo line1 > a -echo line0 >> a -echo line1 >> a -echo line0 >> a -hg ci -m brancha -hg import --no-commit -v tip.patch -hg revert -a -echo '% test fuzziness with eol=auto' -hg --config patch.eol=auto import --no-commit -v tip.patch -cd .. - -# Test hunk touching empty files (issue906) -hg init empty -cd empty -touch a -touch b1 -touch c1 -echo d > d -hg ci -Am init -echo a > a -echo b > b1 -hg mv b1 b2 -echo c > c1 -hg copy c1 c2 -rm d -touch d -hg diff --git -hg ci -m empty -hg export --git tip > empty.diff -hg up -C 0 -hg import empty.diff -for name in a b1 b2 c1 c2 d; -do - echo % $name file - test -f $name && cat $name -done -cd .. - -# Test importing a patch ending with a binary file removal -echo % test trailing binary removal -hg init binaryremoval -cd binaryremoval -echo a > a -python -c "file('b', 'wb').write('a\x00b')" -hg ci -Am addall -hg rm a -hg rm b -hg st -hg ci -m remove -hg export --git . > remove.diff -cat remove.diff | grep git -hg up -C 0 -hg import remove.diff -hg manifest -cd .. - -echo % 'test update+rename with common name (issue 927)' -hg init t -cd t -touch a -hg ci -Am t -echo a > a -# Here, bfile.startswith(afile) -hg copy a a2 -hg ci -m copya -hg export --git tip > copy.diff -hg up -C 0 -hg import copy.diff -echo % view a -# a should contain an 'a' -cat a -echo % view a2 -# and a2 should have duplicated it -cat a2 -cd .. - -echo % 'test -p0' -hg init p0 -cd p0 -echo a > a -hg ci -Am t -hg import -p0 - << EOF -foobar ---- a Sat Apr 12 22:43:58 2008 -0400 -+++ a Sat Apr 12 22:44:05 2008 -0400 -@@ -1,1 +1,1 @@ --a -+bb -EOF -hg status -cat a -cd .. - -echo % 'test paths outside repo root' -mkdir outside -touch outside/foo -hg init inside -cd inside -hg import - < a -hg ci -Ama -cat > ../rename.diff < a.patch < create.patch < create2.patch < a.patch < a.patch < trickyheaders.patch < -Subject: [PATCH] from: tricky! - -# HG changeset patch -# User User B -# Date 1266264441 18000 -# Branch stable -# Node ID f2be6a1170ac83bf31cb4ae0bad00d7678115bc0 -# Parent 0000000000000000000000000000000000000000 -from: tricky! - -That is not a header. - -diff -r 000000000000 -r f2be6a1170ac foo ---- /dev/null -+++ b/foo -@@ -0,0 +1,1 @@ -+foo -EOF - -hg init trickyheaders -cd trickyheaders -hg import -d '0 0' ../trickyheaders.patch -hg export --git tip -cd .. - -echo '% issue2102' -hg init issue2102 -cd issue2102 -mkdir -p src/cmd/gc -touch src/cmd/gc/mksys.bash -hg ci -Am init -hg import - <a -echo b >b -echo c >c -hg ci -Am1 - -echo "key: value" >>a -echo "key: value" >>b -echo "foo" >>c -hg ci -m2 - -hg up -C 0 -hg diff --git -c1 >want -hg diff -c1 | hg import --no-commit - -hg diff --git >have -diff want have -cd .. - diff -r 3152c978496a -r 00fee6394daf tests/test-import-eol --- a/tests/test-import-eol Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -#!/bin/sh - -cat > makepatch.py < .hgignore - -# Test different --eol values -python -c 'file("a", "wb").write("a\nbbb\ncc\n\nd\ne")' -hg ci -Am adda -python ../makepatch.py - -echo % invalid eol -hg --config patch.eol='LFCR' import eol.diff -hg revert -a - -echo % force LF -hg --traceback --config patch.eol='LF' import eol.diff -python -c 'print repr(file("a","rb").read())' -hg st - -echo % force CRLF -hg up -C 0 -hg --traceback --config patch.eol='CRLF' import eol.diff -python -c 'print repr(file("a","rb").read())' -hg st - -echo % auto EOL on LF file -hg up -C 0 -hg --traceback --config patch.eol='auto' import eol.diff -python -c 'print repr(file("a","rb").read())' -hg st - -echo % auto EOL on CRLF file -python -c 'file("a", "wb").write("a\r\nbbb\r\ncc\r\n\r\nd\r\ne")' -hg commit -m 'switch EOLs in a' -hg --traceback --config patch.eol='auto' import eol.diff -python -c 'print repr(file("a","rb").read())' -hg st - -echo % auto EOL on new file or source without any EOL -python -c 'file("noeol", "wb").write("noeol")' -hg add noeol -hg commit -m 'add noeol' -python -c 'file("noeol", "wb").write("noeol\r\nnoeol\n")' -python -c 'file("neweol", "wb").write("neweol\nneweol\r\n")' -hg add neweol -hg diff --git > noeol.diff -hg revert --no-backup noeol neweol -rm neweol -hg --traceback --config patch.eol='auto' import -m noeol noeol.diff -python -c 'print repr(file("noeol","rb").read())' -python -c 'print repr(file("neweol","rb").read())' -hg st - -# Test --eol and binary patches -python -c 'file("b", "wb").write("a\x00\nb\r\nd")' -hg ci -Am addb -python -c 'file("b", "wb").write("a\x00\nc\r\nd")' -hg diff --git > bin.diff -hg revert --no-backup b -echo % binary patch with --eol -hg import --config patch.eol='CRLF' -m changeb bin.diff -python -c 'print repr(file("b","rb").read())' -hg st -cd .. diff -r 3152c978496a -r 00fee6394daf tests/test-import-eol.out --- a/tests/test-import-eol.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -adding .hgignore -adding a -% invalid eol -applying eol.diff -abort: Unsupported line endings type: LFCR -% force LF -applying eol.diff -'a\nyyyy\ncc\n\nd\ne' -% force CRLF -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying eol.diff -'a\r\nyyyy\r\ncc\r\n\r\nd\r\ne' -% auto EOL on LF file -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying eol.diff -'a\nyyyy\ncc\n\nd\ne' -% auto EOL on CRLF file -applying eol.diff -'a\r\nyyyy\r\ncc\r\n\r\nd\r\ne' -% auto EOL on new file or source without any EOL -applying noeol.diff -'noeol\r\nnoeol\n' -'neweol\nneweol\r\n' -adding b -% binary patch with --eol -applying bin.diff -'a\x00\nc\r\nd' diff -r 3152c978496a -r 00fee6394daf tests/test-import-eol.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-import-eol.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,121 @@ + $ cat > makepatch.py < f = file('eol.diff', 'wb') + > w = f.write + > w('test message\n') + > w('diff --git a/a b/a\n') + > w('--- a/a\n') + > w('+++ b/a\n') + > w('@@ -1,5 +1,5 @@\n') + > w(' a\n') + > w('-bbb\r\n') + > w('+yyyy\r\n') + > w(' cc\r\n') + > w(' \n') + > w(' d\n') + > w('-e\n') + > w('\ No newline at end of file\n') + > w('+z\r\n') + > w('\ No newline at end of file\r\n') + > EOF + + $ hg init repo + $ cd repo + $ echo '\.diff' > .hgignore + + +Test different --eol values + + $ python -c 'file("a", "wb").write("a\nbbb\ncc\n\nd\ne")' + $ hg ci -Am adda + adding .hgignore + adding a + $ python ../makepatch.py + + +invalid eol + + $ hg --config patch.eol='LFCR' import eol.diff + applying eol.diff + abort: Unsupported line endings type: LFCR + $ hg revert -a + + +force LF + + $ hg --traceback --config patch.eol='LF' import eol.diff + applying eol.diff + $ python -c 'print repr(file("a","rb").read())' + 'a\nyyyy\ncc\n\nd\ne' + $ hg st + + +force CRLF + + $ hg up -C 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --traceback --config patch.eol='CRLF' import eol.diff + applying eol.diff + $ python -c 'print repr(file("a","rb").read())' + 'a\r\nyyyy\r\ncc\r\n\r\nd\r\ne' + $ hg st + + +auto EOL on LF file + + $ hg up -C 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --traceback --config patch.eol='auto' import eol.diff + applying eol.diff + $ python -c 'print repr(file("a","rb").read())' + 'a\nyyyy\ncc\n\nd\ne' + $ hg st + + +auto EOL on CRLF file + + $ python -c 'file("a", "wb").write("a\r\nbbb\r\ncc\r\n\r\nd\r\ne")' + $ hg commit -m 'switch EOLs in a' + $ hg --traceback --config patch.eol='auto' import eol.diff + applying eol.diff + $ python -c 'print repr(file("a","rb").read())' + 'a\r\nyyyy\r\ncc\r\n\r\nd\r\ne' + $ hg st + + +auto EOL on new file or source without any EOL + + $ python -c 'file("noeol", "wb").write("noeol")' + $ hg add noeol + $ hg commit -m 'add noeol' + $ python -c 'file("noeol", "wb").write("noeol\r\nnoeol\n")' + $ python -c 'file("neweol", "wb").write("neweol\nneweol\r\n")' + $ hg add neweol + $ hg diff --git > noeol.diff + $ hg revert --no-backup noeol neweol + $ rm neweol + $ hg --traceback --config patch.eol='auto' import -m noeol noeol.diff + applying noeol.diff + $ python -c 'print repr(file("noeol","rb").read())' + 'noeol\r\nnoeol\n' + $ python -c 'print repr(file("neweol","rb").read())' + 'neweol\nneweol\r\n' + $ hg st + + +Test --eol and binary patches + + $ python -c 'file("b", "wb").write("a\x00\nb\r\nd")' + $ hg ci -Am addb + adding b + $ python -c 'file("b", "wb").write("a\x00\nc\r\nd")' + $ hg diff --git > bin.diff + $ hg revert --no-backup b + +binary patch with --eol + + $ hg import --config patch.eol='CRLF' -m changeb bin.diff + applying bin.diff + $ python -c 'print repr(file("b","rb").read())' + 'a\x00\nc\r\nd' + $ hg st + $ cd .. diff -r 3152c978496a -r 00fee6394daf tests/test-import.out --- a/tests/test-import.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,381 +0,0 @@ -adding a -adding d1/d2/a -% import exported patch -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -% message should be same -summary: second change -% committer should be same -user: someone -% import exported patch with external patcher -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -line2 -% import of plain diff should fail without message -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -abort: empty commit message -% import of plain diff should be ok with message -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -% import of plain diff with specific date and user -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -changeset: 1:ca68f19f3a40 -tag: tip -user: user@nowhere.net -date: Thu Jan 01 00:00:01 1970 +0000 -files: a -description: -patch - - -diff -r 80971e65b431 -r ca68f19f3a40 a ---- a/a Thu Jan 01 00:00:00 1970 +0000 -+++ b/a Thu Jan 01 00:00:01 1970 +0000 -@@ -1,1 +1,2 @@ - line 1 -+line 2 - -% import of plain diff should be ok with --no-commit -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../tip.patch -diff -r 80971e65b431 a ---- a/a -+++ b/a -@@ -1,1 +1,2 @@ - line 1 -+line 2 -% hg -R repo import -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying tip.patch -% import from stdin -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -% import two patches in one stream -applying patch from stdin -applied 80971e65b431 -1d4bd90af0e4 tip -1d4bd90af0e4 tip -% override commit message -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -summary: override -% plain diff in email, subject, message body -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../msg.patch -user: email patcher -summary: email patch -% plain diff in email, no subject, message body -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -% plain diff in email, subject, no message body -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -% plain diff in email, no subject, no message body, should fail -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -abort: empty commit message -% hg export in email, should use patch header -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -summary: second change -% plain diff in email, [PATCH] subject, message body with subject -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin -email patch - -next line ---- -% import patch1 patch2; rollback -parent: 0 -applying ../patch1 -applying ../patch2 -applied 1d4bd90af0e4 -rolling back to revision 1 (undo commit) -parent: 1 -% hg import in a subdirectory -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../../../tip.patch -% message should be 'subdir change' -summary: subdir change -% committer should be 'someoneelse' -user: someoneelse -% should be empty -% test fuzziness -adding a -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -applying tip.patch -patching file a -Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines). -reverting a -% test fuzziness with eol=auto -applying tip.patch -patching file a -Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines). -adding a -adding b1 -adding c1 -adding d -diff --git a/a b/a ---- a/a -+++ b/a -@@ -0,0 +1,1 @@ -+a -diff --git a/b1 b/b2 -rename from b1 -rename to b2 ---- a/b1 -+++ b/b2 -@@ -0,0 +1,1 @@ -+b -diff --git a/c1 b/c1 ---- a/c1 -+++ b/c1 -@@ -0,0 +1,1 @@ -+c -diff --git a/c1 b/c2 -copy from c1 -copy to c2 ---- a/c1 -+++ b/c2 -@@ -0,0 +1,1 @@ -+c -diff --git a/d b/d ---- a/d -+++ b/d -@@ -1,1 +0,0 @@ --d -4 files updated, 0 files merged, 2 files removed, 0 files unresolved -applying empty.diff -% a file -a -% b1 file -% b2 file -b -% c1 file -c -% c2 file -c -% d file -% test trailing binary removal -adding a -adding b -R a -R b -diff --git a/a b/a -diff --git a/b b/b -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying remove.diff -% test update+rename with common name (issue 927) -adding a -1 files updated, 0 files merged, 1 files removed, 0 files unresolved -applying copy.diff -% view a -a -% view a2 -a -% test -p0 -adding a -applying patch from stdin -bb -% test paths outside repo root -applying patch from stdin -abort: ../outside/foo not under root -% test import with similarity and git and strip (issue295 et al.) -adding a -applying ../rename.diff -patching file a -patching file b -removing a -adding b -recording removal of a as rename to b (88% similar) -A b - a -R a -undeleting a -forgetting b -applying ../rename.diff -patching file a -patching file b -removing a -adding b -A b -R a -% add empty file from the end of patch (issue 1495) -adding a -applying a.patch -% create file when source is not /dev/null -applying ../create.patch -a -applying ../create2.patch -a -% first line mistaken for email headers (issue 1859) -applying a.patch -changeset: 0:5a681217c0ad -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -files: a -description: -module: summary - -description - - -% --- in commit message -applying a.patch -changeset: 0:f34d9187897d -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -files: a -description: -module: summary - - -% tricky header splitting -applying ../trickyheaders.patch -# HG changeset patch -# User User B -# Date 0 0 -# Node ID eb56ab91903632294ac504838508cb370c0901d2 -# Parent 0000000000000000000000000000000000000000 -from: tricky! - -That is not a header. - -diff --git a/foo b/foo -new file mode 100644 ---- /dev/null -+++ b/foo -@@ -0,0 +1,1 @@ -+foo -% issue2102 -adding src/cmd/gc/mksys.bash -applying patch from stdin -parent: 1:d59915696727 tip - help management of empty pkg and lib directories in perforce -branch: default -commit: (clean) -update: (current) -diff --git a/lib/place-holder b/lib/place-holder -new file mode 100644 ---- /dev/null -+++ b/lib/place-holder -@@ -0,0 +1,2 @@ -+perforce does not maintain empty directories. -+this file helps. -diff --git a/pkg/place-holder b/pkg/place-holder -new file mode 100644 ---- /dev/null -+++ b/pkg/place-holder -@@ -0,0 +1,2 @@ -+perforce does not maintain empty directories. -+this file helps. -diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash -old mode 100644 -new mode 100755 -% diff lines looking like headers -adding a -adding b -adding c -3 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying patch from stdin diff -r 3152c978496a -r 00fee6394daf tests/test-import.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-import.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,916 @@ + $ hg init a + $ mkdir a/d1 + $ mkdir a/d1/d2 + $ echo line 1 > a/a + $ echo line 1 > a/d1/d2/a + $ hg --cwd a ci -Ama + adding a + adding d1/d2/a + + $ echo line 2 >> a/a + $ hg --cwd a ci -u someone -d '1 0' -m'second change' + + +import exported patch + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip > tip.patch + $ hg --cwd b import ../tip.patch + applying ../tip.patch + +message should be same + + $ hg --cwd b tip | grep 'second change' + summary: second change + +committer should be same + + $ hg --cwd b tip | grep someone + user: someone + $ rm -r b + + +import exported patch with external patcher + + $ cat > dummypatch.py < print 'patching file a' + > file('a', 'wb').write('line2\n') + > EOF + $ chmod +x dummypatch.py + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip > tip.patch + $ hg --config ui.patch='python ../dummypatch.py' --cwd b import ../tip.patch + applying ../tip.patch + $ cat b/a + line2 + $ rm -r b + + +import of plain diff should fail without message + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ hg --cwd b import ../tip.patch + applying ../tip.patch + abort: empty commit message + $ rm -r b + + +import of plain diff should be ok with message + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ hg --cwd b import -mpatch ../tip.patch + applying ../tip.patch + $ rm -r b + + +import of plain diff with specific date and user + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ hg --cwd b import -mpatch -d '1 0' -u 'user@nowhere.net' ../tip.patch + applying ../tip.patch + $ hg -R b tip -pv + changeset: 1:ca68f19f3a40 + tag: tip + user: user@nowhere.net + date: Thu Jan 01 00:00:01 1970 +0000 + files: a + description: + patch + + + diff -r 80971e65b431 -r ca68f19f3a40 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:01 1970 +0000 + @@ -1,1 +1,2 @@ + line 1 + +line 2 + + $ rm -r b + + +import of plain diff should be ok with --no-commit + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ hg --cwd b import --no-commit ../tip.patch + applying ../tip.patch + $ hg --cwd b diff --nodates + diff -r 80971e65b431 a + --- a/a + +++ b/a + @@ -1,1 +1,2 @@ + line 1 + +line 2 + $ rm -r b + + +hg -R repo import +put the clone in a subdir - having a directory named "a" +used to hide a bug. + + $ mkdir dir + $ hg clone -r0 a dir/b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip > dir/tip.patch + $ cd dir + $ hg -R b import tip.patch + applying tip.patch + $ cd .. + $ rm -r dir + + +import from stdin + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip | hg --cwd b import - + applying patch from stdin + $ rm -r b + + +import two patches in one stream + + $ hg init b + $ hg --cwd a export 0:tip | hg --cwd b import - + applying patch from stdin + applied 80971e65b431 + $ hg --cwd a id + 1d4bd90af0e4 tip + $ hg --cwd b id + 1d4bd90af0e4 tip + $ rm -r b + + +override commit message + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip | hg --cwd b import -m 'override' - + applying patch from stdin + $ hg --cwd b tip | grep override + summary: override + $ rm -r b + + $ cat > mkmsg.py < import email.Message, sys + > msg = email.Message.Message() + > msg.set_payload('email commit message\n' + open('tip.patch', 'rb').read()) + > msg['Subject'] = 'email patch' + > msg['From'] = 'email patcher' + > sys.stdout.write(msg.as_string()) + > EOF + + +plain diff in email, subject, message body + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ python mkmsg.py > msg.patch + $ hg --cwd b import ../msg.patch + applying ../msg.patch + $ hg --cwd b tip | grep email + user: email patcher + summary: email patch + $ rm -r b + + +plain diff in email, no subject, message body + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ grep -v '^Subject:' msg.patch | hg --cwd b import - + applying patch from stdin + $ rm -r b + + +plain diff in email, subject, no message body + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ grep -v '^email ' msg.patch | hg --cwd b import - + applying patch from stdin + $ rm -r b + + +plain diff in email, no subject, no message body, should fail + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ egrep -v '^(Subject|email)' msg.patch | hg --cwd b import - + applying patch from stdin + abort: empty commit message + $ rm -r b + + +hg export in email, should use patch header + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip > tip.patch + $ python mkmsg.py | hg --cwd b import - + applying patch from stdin + $ hg --cwd b tip | grep second + summary: second change + $ rm -r b + + +subject: duplicate detection, removal of [PATCH] +The '---' tests the gitsendmail handling without proper mail headers + + $ cat > mkmsg2.py < import email.Message, sys + > msg = email.Message.Message() + > msg.set_payload('email patch\n\nnext line\n---\n' + open('tip.patch').read()) + > msg['Subject'] = '[PATCH] email patch' + > msg['From'] = 'email patcher' + > sys.stdout.write(msg.as_string()) + > EOF + + +plain diff in email, [PATCH] subject, message body with subject + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a diff -r0:1 > tip.patch + $ python mkmsg2.py | hg --cwd b import - + applying patch from stdin + $ hg --cwd b tip --template '{desc}\n' + email patch + + next line + --- + $ rm -r b + + +We weren't backing up the correct dirstate file when importing many patches +(issue963) +import patch1 patch2; rollback + + $ echo line 3 >> a/a + $ hg --cwd a ci -m'third change' + $ hg --cwd a export -o '../patch%R' 1 2 + $ hg clone -qr0 a b + $ hg --cwd b parents --template 'parent: {rev}\n' + parent: 0 + $ hg --cwd b import ../patch1 ../patch2 + applying ../patch1 + applying ../patch2 + applied 1d4bd90af0e4 + $ hg --cwd b rollback + rolling back to revision 1 (undo commit) + $ hg --cwd b parents --template 'parent: {rev}\n' + parent: 1 + $ rm -r b + + +importing a patch in a subdirectory failed at the commit stage + + $ echo line 2 >> a/d1/d2/a + $ hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change' + +hg import in a subdirectory + + $ hg clone -r0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg --cwd a export tip | sed -e 's/d1\/d2\///' > tip.patch + $ dir=`pwd` + $ cd b/d1/d2 2>&1 > /dev/null + $ hg import ../../../tip.patch + applying ../../../tip.patch + $ cd "$dir" + +message should be 'subdir change' + + $ hg --cwd b tip | grep 'subdir change' + summary: subdir change + +committer should be 'someoneelse' + + $ hg --cwd b tip | grep someoneelse + user: someoneelse + +should be empty + + $ hg --cwd b status + + +Test fuzziness (ambiguous patch location, fuzz=2) + + $ hg init fuzzy + $ cd fuzzy + $ echo line1 > a + $ echo line0 >> a + $ echo line3 >> a + $ hg ci -Am adda + adding a + $ echo line1 > a + $ echo line2 >> a + $ echo line0 >> a + $ echo line3 >> a + $ hg ci -m change a + $ hg export tip > tip.patch + $ hg up -C 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo line1 > a + $ echo line0 >> a + $ echo line1 >> a + $ echo line0 >> a + $ hg ci -m brancha + created new head + $ hg import --no-commit -v tip.patch + applying tip.patch + patching file a + Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines). + $ hg revert -a + reverting a + +test fuzziness with eol=auto + + $ hg --config patch.eol=auto import --no-commit -v tip.patch + applying tip.patch + patching file a + Hunk #1 succeeded at 1 with fuzz 2 (offset -2 lines). + $ cd .. + + +Test hunk touching empty files (issue906) + + $ hg init empty + $ cd empty + $ touch a + $ touch b1 + $ touch c1 + $ echo d > d + $ hg ci -Am init + adding a + adding b1 + adding c1 + adding d + $ echo a > a + $ echo b > b1 + $ hg mv b1 b2 + $ echo c > c1 + $ hg copy c1 c2 + $ rm d + $ touch d + $ hg diff --git + diff --git a/a b/a + --- a/a + +++ b/a + @@ -0,0 +1,1 @@ + +a + diff --git a/b1 b/b2 + rename from b1 + rename to b2 + --- a/b1 + +++ b/b2 + @@ -0,0 +1,1 @@ + +b + diff --git a/c1 b/c1 + --- a/c1 + +++ b/c1 + @@ -0,0 +1,1 @@ + +c + diff --git a/c1 b/c2 + copy from c1 + copy to c2 + --- a/c1 + +++ b/c2 + @@ -0,0 +1,1 @@ + +c + diff --git a/d b/d + --- a/d + +++ b/d + @@ -1,1 +0,0 @@ + -d + $ hg ci -m empty + $ hg export --git tip > empty.diff + $ hg up -C 0 + 4 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg import empty.diff + applying empty.diff + $ for name in a b1 b2 c1 c2 d; do + > echo % $name file + > test -f $name && cat $name + > done + % a file + a + % b1 file + % b2 file + b + % c1 file + c + % c2 file + c + % d file + $ cd .. + + +Test importing a patch ending with a binary file removal + + $ hg init binaryremoval + $ cd binaryremoval + $ echo a > a + $ python -c "file('b', 'wb').write('a\x00b')" + $ hg ci -Am addall + adding a + adding b + $ hg rm a + $ hg rm b + $ hg st + R a + R b + $ hg ci -m remove + $ hg export --git . > remove.diff + $ cat remove.diff | grep git + diff --git a/a b/a + diff --git a/b b/b + $ hg up -C 0 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg import remove.diff + applying remove.diff + $ hg manifest + $ cd .. + + +test update+rename with common name (issue 927) + + $ hg init t + $ cd t + $ touch a + $ hg ci -Am t + adding a + $ echo a > a + +Here, bfile.startswith(afile) + + $ hg copy a a2 + $ hg ci -m copya + $ hg export --git tip > copy.diff + $ hg up -C 0 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg import copy.diff + applying copy.diff + +a should contain an 'a' + + $ cat a + a + +and a2 should have duplicated it + + $ cat a2 + a + $ cd .. + + +test -p0 + + $ hg init p0 + $ cd p0 + $ echo a > a + $ hg ci -Am t + adding a + $ hg import -p0 - << EOF + > foobar + > --- a Sat Apr 12 22:43:58 2008 -0400 + > +++ a Sat Apr 12 22:44:05 2008 -0400 + > @@ -1,1 +1,1 @@ + > -a + > +bb + > EOF + applying patch from stdin + $ hg status + $ cat a + bb + $ cd .. + + +test paths outside repo root + + $ mkdir outside + $ touch outside/foo + $ hg init inside + $ cd inside + $ hg import - < diff --git a/a b/b + > rename from ../outside/foo + > rename to bar + > EOF + applying patch from stdin + abort: ../outside/foo not under root + $ cd .. + + +test import with similarity and git and strip (issue295 et al.) + + $ hg init sim + $ cd sim + $ echo 'this is a test' > a + $ hg ci -Ama + adding a + $ cat > ../rename.diff < diff --git a/foo/a b/foo/a + > deleted file mode 100644 + > --- a/foo/a + > +++ /dev/null + > @@ -1,1 +0,0 @@ + > -this is a test + > diff --git a/foo/b b/foo/b + > new file mode 100644 + > --- /dev/null + > +++ b/foo/b + > @@ -0,0 +1,2 @@ + > +this is a test + > +foo + > EOF + $ hg import --no-commit -v -s 1 ../rename.diff -p2 + applying ../rename.diff + patching file a + patching file b + removing a + adding b + recording removal of a as rename to b (88% similar) + $ hg st -C + A b + a + R a + $ hg revert -a + undeleting a + forgetting b + $ rm b + $ hg import --no-commit -v -s 100 ../rename.diff -p2 + applying ../rename.diff + patching file a + patching file b + removing a + adding b + $ hg st -C + A b + R a + $ cd .. + + +add empty file from the end of patch (issue 1495) + + $ hg init addemptyend + $ cd addemptyend + $ touch a + $ hg addremove + adding a + $ hg ci -m "commit" + $ cat > a.patch < diff --git a/a b/a + > --- a/a + > +++ b/a + > @@ -0,0 +1,1 @@ + > +a + > diff --git a/b b/b + > new file mode 100644 + > EOF + $ hg import --no-commit a.patch + applying a.patch + $ cd .. + + +create file when source is not /dev/null + + $ cat > create.patch < diff -Naur proj-orig/foo proj-new/foo + > --- proj-orig/foo 1969-12-31 16:00:00.000000000 -0800 + > +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700 + > @@ -0,0 +1,1 @@ + > +a + > EOF + +some people have patches like the following too + + $ cat > create2.patch < diff -Naur proj-orig/foo proj-new/foo + > --- proj-orig/foo.orig 1969-12-31 16:00:00.000000000 -0800 + > +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700 + > @@ -0,0 +1,1 @@ + > +a + > EOF + $ hg init oddcreate + $ cd oddcreate + $ hg import --no-commit ../create.patch + applying ../create.patch + $ cat foo + a + $ rm foo + $ hg revert foo + $ hg import --no-commit ../create2.patch + applying ../create2.patch + $ cat foo + a + + +first line mistaken for email headers (issue 1859) + + $ hg init emailconfusion + $ cd emailconfusion + $ cat > a.patch < module: summary + > + > description + > + > + > diff -r 000000000000 -r 9b4c1e343b55 test.txt + > --- /dev/null + > +++ b/a + > @@ -0,0 +1,1 @@ + > +a + > EOF + $ hg import -d '0 0' a.patch + applying a.patch + $ hg parents -v + changeset: 0:5a681217c0ad + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + files: a + description: + module: summary + + description + + + $ cd .. + + +--- in commit message + + $ hg init commitconfusion + $ cd commitconfusion + $ cat > a.patch < module: summary + > + > --- description + > + > diff --git a/a b/a + > new file mode 100644 + > --- /dev/null + > +++ b/a + > @@ -0,0 +1,1 @@ + > +a + > EOF + > hg import -d '0 0' a.patch + > hg parents -v + > cd .. + > + > echo '% tricky header splitting' + > cat > trickyheaders.patch < From: User A + > Subject: [PATCH] from: tricky! + > + > # HG changeset patch + > # User User B + > # Date 1266264441 18000 + > # Branch stable + > # Node ID f2be6a1170ac83bf31cb4ae0bad00d7678115bc0 + > # Parent 0000000000000000000000000000000000000000 + > from: tricky! + > + > That is not a header. + > + > diff -r 000000000000 -r f2be6a1170ac foo + > --- /dev/null + > +++ b/foo + > @@ -0,0 +1,1 @@ + > +foo + > EOF + applying a.patch + changeset: 0:f34d9187897d + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + files: a + description: + module: summary + + + % tricky header splitting + + $ hg init trickyheaders + $ cd trickyheaders + $ hg import -d '0 0' ../trickyheaders.patch + applying ../trickyheaders.patch + $ hg export --git tip + # HG changeset patch + # User User B + # Date 0 0 + # Node ID eb56ab91903632294ac504838508cb370c0901d2 + # Parent 0000000000000000000000000000000000000000 + from: tricky! + + That is not a header. + + diff --git a/foo b/foo + new file mode 100644 + --- /dev/null + +++ b/foo + @@ -0,0 +1,1 @@ + +foo + $ cd .. + + +issue2102 + + $ hg init issue2102 + $ cd issue2102 + $ mkdir -p src/cmd/gc + $ touch src/cmd/gc/mksys.bash + $ hg ci -Am init + adding src/cmd/gc/mksys.bash + $ hg import - < # HG changeset patch + > # User Rob Pike + > # Date 1216685449 25200 + > # Node ID 03aa2b206f499ad6eb50e6e207b9e710d6409c98 + > # Parent 93d10138ad8df586827ca90b4ddb5033e21a3a84 + > help management of empty pkg and lib directories in perforce + > + > R=gri + > DELTA=4 (4 added, 0 deleted, 0 changed) + > OCL=13328 + > CL=13328 + > + > diff --git a/lib/place-holder b/lib/place-holder + > new file mode 100644 + > --- /dev/null + > +++ b/lib/place-holder + > @@ -0,0 +1,2 @@ + > +perforce does not maintain empty directories. + > +this file helps. + > diff --git a/pkg/place-holder b/pkg/place-holder + > new file mode 100644 + > --- /dev/null + > +++ b/pkg/place-holder + > @@ -0,0 +1,2 @@ + > +perforce does not maintain empty directories. + > +this file helps. + > diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash + > old mode 100644 + > new mode 100755 + > EOF + applying patch from stdin + $ hg sum + parent: 1:d59915696727 tip + help management of empty pkg and lib directories in perforce + branch: default + commit: (clean) + update: (current) + $ hg diff --git -c tip + diff --git a/lib/place-holder b/lib/place-holder + new file mode 100644 + --- /dev/null + +++ b/lib/place-holder + @@ -0,0 +1,2 @@ + +perforce does not maintain empty directories. + +this file helps. + diff --git a/pkg/place-holder b/pkg/place-holder + new file mode 100644 + --- /dev/null + +++ b/pkg/place-holder + @@ -0,0 +1,2 @@ + +perforce does not maintain empty directories. + +this file helps. + diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash + old mode 100644 + new mode 100755 + $ cd .. + + +diff lines looking like headers + + $ hg init difflineslikeheaders + $ cd difflineslikeheaders + $ echo a >a + $ echo b >b + $ echo c >c + $ hg ci -Am1 + adding a + adding b + adding c + + $ echo "key: value" >>a + $ echo "key: value" >>b + $ echo "foo" >>c + $ hg ci -m2 + + $ hg up -C 0 + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg diff --git -c1 >want + $ hg diff -c1 | hg import --no-commit - + applying patch from stdin + $ hg diff --git >have + $ diff want have + $ cd .. + diff -r 3152c978496a -r 00fee6394daf tests/test-init --- a/tests/test-init Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -#!/bin/sh - -# This test tries to exercise the ssh functionality with a dummy script - -cat < dummyssh -import sys -import os - -os.chdir(os.path.dirname(sys.argv[0])) -if sys.argv[1] != "user@dummy": - sys.exit(-1) - -if not os.path.exists("dummyssh"): - sys.exit(-1) - -log = open("dummylog", "ab") -log.write("Got arguments") -for i, arg in enumerate(sys.argv[1:]): - log.write(" %d:%s" % (i+1, arg)) -log.write("\n") -log.close() -r = os.system(sys.argv[2]) -sys.exit(bool(r)) -EOF - -checknewrepo() -{ - name=$1 - - if [ -d $name/.hg/store ]; then - echo store created - fi - - if [ -f $name/.hg/00changelog.i ]; then - echo 00changelog.i created - fi - - cat $name/.hg/requires -} - -echo "# creating 'local'" -hg init local -checknewrepo local -echo this > local/foo -hg ci --cwd local -A -m "init" -d "1000000 0" - -echo "# creating repo with format.usestore=false" -hg --config format.usestore=false init old -checknewrepo old - -echo "# creating repo with format.usefncache=false" -hg --config format.usefncache=false init old2 -checknewrepo old2 - -echo "#test failure" -hg init local - -echo "# init+push to remote2" -hg init -e "python ./dummyssh" ssh://user@dummy/remote2 -hg incoming -R remote2 local -hg push -R local -e "python ./dummyssh" ssh://user@dummy/remote2 - -echo "# clone to remote1" -hg clone -e "python ./dummyssh" local ssh://user@dummy/remote1 - -echo "# init to existing repo" -hg init -e "python ./dummyssh" ssh://user@dummy/remote1 - -echo "# clone to existing repo" -hg clone -e "python ./dummyssh" local ssh://user@dummy/remote1 - -echo "# output of dummyssh" -cat dummylog - -echo "# comparing repositories" -hg tip -q -R local -hg tip -q -R remote1 -hg tip -q -R remote2 - -echo "# check names for repositories (clashes with URL schemes, special chars)" -for i in bundle file hg http https old-http ssh static-http " " "with space"; do - echo "# hg init \"$i\"" - hg init "$i" - test -d "$i" -a -d "$i/.hg" && echo "ok" || echo "failed" -done - -echo "# creating 'local/sub/repo'" -hg init local/sub/repo -checknewrepo local/sub/repo diff -r 3152c978496a -r 00fee6394daf tests/test-init.out --- a/tests/test-init.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -# creating 'local' -store created -00changelog.i created -revlogv1 -store -fncache -adding foo -# creating repo with format.usestore=false -revlogv1 -# creating repo with format.usefncache=false -store created -00changelog.i created -revlogv1 -store -#test failure -abort: repository local already exists! -# init+push to remote2 -comparing with local -changeset: 0:c4e059d443be -tag: tip -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: init - -pushing to ssh://user@dummy/remote2 -searching for changes -remote: adding changesets -remote: adding manifests -remote: adding file changes -remote: added 1 changesets with 1 changes to 1 files -# clone to remote1 -searching for changes -remote: adding changesets -remote: adding manifests -remote: adding file changes -remote: added 1 changesets with 1 changes to 1 files -# init to existing repo -abort: repository remote1 already exists! -abort: could not create remote repo! -# clone to existing repo -abort: repository remote1 already exists! -abort: could not create remote repo! -# output of dummyssh -Got arguments 1:user@dummy 2:hg init remote2 -Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio -Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio -Got arguments 1:user@dummy 2:hg init remote1 -Got arguments 1:user@dummy 2:hg -R remote1 serve --stdio -Got arguments 1:user@dummy 2:hg init remote1 -Got arguments 1:user@dummy 2:hg init remote1 -# comparing repositories -0:c4e059d443be -0:c4e059d443be -0:c4e059d443be -# check names for repositories (clashes with URL schemes, special chars) -# hg init "bundle" -ok -# hg init "file" -ok -# hg init "hg" -ok -# hg init "http" -ok -# hg init "https" -ok -# hg init "old-http" -ok -# hg init "ssh" -ok -# hg init "static-http" -ok -# hg init " " -ok -# hg init "with space" -ok -# creating 'local/sub/repo' -store created -00changelog.i created -revlogv1 -store -fncache diff -r 3152c978496a -r 00fee6394daf tests/test-init.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-init.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,156 @@ +# This test tries to exercise the ssh functionality with a dummy script + + $ cat < dummyssh + > import sys + > import os + > + > os.chdir(os.path.dirname(sys.argv[0])) + > if sys.argv[1] != "user@dummy": + > sys.exit(-1) + > + > if not os.path.exists("dummyssh"): + > sys.exit(-1) + > + > log = open("dummylog", "ab") + > log.write("Got arguments") + > for i, arg in enumerate(sys.argv[1:]): + > log.write(" %d:%s" % (i+1, arg)) + > log.write("\n") + > log.close() + > r = os.system(sys.argv[2]) + > sys.exit(bool(r)) + > EOF + + $ checknewrepo() + > { + > name=$1 + > if [ -d $name/.hg/store ]; then + > echo store created + > fi + > if [ -f $name/.hg/00changelog.i ]; then + > echo 00changelog.i created + > fi + > cat $name/.hg/requires + > } + +creating 'local' + + $ hg init local + $ checknewrepo local + store created + 00changelog.i created + revlogv1 + store + fncache + $ echo this > local/foo + $ hg ci --cwd local -A -m "init" -d "1000000 0" + adding foo + +creating repo with format.usestore=false + + $ hg --config format.usestore=false init old + $ checknewrepo old + revlogv1 + +creating repo with format.usefncache=false + + $ hg --config format.usefncache=false init old2 + $ checknewrepo old2 + store created + 00changelog.i created + revlogv1 + store + +test failure + + $ hg init local + abort: repository local already exists! + +init+push to remote2 + + $ hg init -e "python ./dummyssh" ssh://user@dummy/remote2 + $ hg incoming -R remote2 local + comparing with local + changeset: 0:c4e059d443be + tag: tip + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: init + + + $ hg push -R local -e "python ./dummyssh" ssh://user@dummy/remote2 + pushing to ssh://user@dummy/remote2 + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + +clone to remote1 + + $ hg clone -e "python ./dummyssh" local ssh://user@dummy/remote1 + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 1 changesets with 1 changes to 1 files + +init to existing repo + + $ hg init -e "python ./dummyssh" ssh://user@dummy/remote1 + abort: repository remote1 already exists! + abort: could not create remote repo! + +clone to existing repo + + $ hg clone -e "python ./dummyssh" local ssh://user@dummy/remote1 + abort: repository remote1 already exists! + abort: could not create remote repo! + +output of dummyssh + + $ cat dummylog + Got arguments 1:user@dummy 2:hg init remote2 + Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio + Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio + Got arguments 1:user@dummy 2:hg init remote1 + Got arguments 1:user@dummy 2:hg -R remote1 serve --stdio + Got arguments 1:user@dummy 2:hg init remote1 + Got arguments 1:user@dummy 2:hg init remote1 + +comparing repositories + + $ hg tip -q -R local + 0:c4e059d443be + $ hg tip -q -R remote1 + 0:c4e059d443be + $ hg tip -q -R remote2 + 0:c4e059d443be + +check names for repositories (clashes with URL schemes, special chars) + + $ for i in bundle file hg http https old-http ssh static-http " " "with space"; do + > echo -n "hg init \"$i\"... " + > hg init "$i" + > test -d "$i" -a -d "$i/.hg" && echo "ok" || echo "failed" + > done + hg init "bundle"... ok + hg init "file"... ok + hg init "hg"... ok + hg init "http"... ok + hg init "https"... ok + hg init "old-http"... ok + hg init "ssh"... ok + hg init "static-http"... ok + hg init " "... ok + hg init "with space"... ok + +creating 'local/sub/repo' + + $ hg init local/sub/repo + $ checknewrepo local/sub/repo + store created + 00changelog.i created + revlogv1 + store + fncache diff -r 3152c978496a -r 00fee6394daf tests/test-mq-guards --- a/tests/test-mq-guards Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-mq-guards Thu Aug 12 18:08:52 2010 -0500 @@ -97,11 +97,16 @@ hg qguard -- a.patch +1 +2 -3 hg qselect 1 2 3 + echo % list patches and guards hg qguard -l +echo % have at least one patch applied to test coloring +hg qpush echo % list patches and guards with color hg --config extensions.color= qguard --config color.mode=ansi \ -l --color=always +echo % should pop b.patch +hg qpop echo % list series hg qseries -v echo % list guards diff -r 3152c978496a -r 00fee6394daf tests/test-mq-guards.out --- a/tests/test-mq-guards.out Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-mq-guards.out Thu Aug 12 18:08:52 2010 -0500 @@ -84,10 +84,16 @@ a.patch: +1 +2 -3 b.patch: +2 c.patch: unguarded +% have at least one patch applied to test coloring +applying b.patch +now at: b.patch % list patches and guards with color -a.patch: +1 +2 -3 -b.patch: +2 -c.patch: unguarded +a.patch: +1 +2 -3 +b.patch: +2 +c.patch: unguarded +% should pop b.patch +popping b.patch +patch queue now empty % list series 0 G a.patch 1 U b.patch diff -r 3152c978496a -r 00fee6394daf tests/test-mq-strip --- a/tests/test-mq-strip Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-mq-strip Thu Aug 12 18:08:52 2010 -0500 @@ -4,16 +4,20 @@ echo "[extensions]" >> $HGRCPATH echo "mq=" >> $HGRCPATH +echo "graphlog=" >> $HGRCPATH +restore() { + hg unbundle -q .hg/strip-backup/* + rm .hg/strip-backup/* +} teststrip() { hg up -C $1 echo % before update $1, strip $2 hg parents - hg strip $2 | hidebackup + hg --traceback strip $2 | hidebackup echo % after update $1, strip $2 hg parents - hg unbundle -q .hg/strip-backup/* - rm .hg/strip-backup/* + restore } hg init test @@ -53,6 +57,25 @@ hg strip 4 2>&1 | hidebackup echo % after strip of merge parent hg parents +restore + +hg up +hg glog +echo % 2 is parent of 3, only one strip should happen +hg strip 2 3 | hidebackup +hg glog +restore +hg glog +echo % 2 different branches: 2 strips +hg strip 2 4 | hidebackup +hg glog +restore +echo % 2 different branches and a common ancestor: 1 strip +hg strip 1 2 4 | hidebackup +restore + +# remove branchy history for qimport tests +hg strip 3 | hidebackup #strip of applied mq should cleanup status file hg up -C 3 diff -r 3152c978496a -r 00fee6394daf tests/test-mq-strip.out --- a/tests/test-mq-strip.out Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-mq-strip.out Thu Aug 12 18:08:52 2010 -0500 @@ -166,6 +166,103 @@ summary: b 1 files updated, 0 files merged, 0 files removed, 0 files unresolved +@ changeset: 4:264128213d29 +| tag: tip +| parent: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: c +| +| o changeset: 3:443431ffac4f +| | user: test +| | date: Thu Jan 01 00:00:00 1970 +0000 +| | summary: e +| | +| o changeset: 2:65bd5f99a4a3 +|/ user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: d +| +o changeset: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: b +| +o changeset: 0:9ab35a2d17cb + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a + +% 2 is parent of 3, only one strip should happen +saved backup bundle to +@ changeset: 2:264128213d29 +| tag: tip +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: c +| +o changeset: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: b +| +o changeset: 0:9ab35a2d17cb + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a + +o changeset: 4:443431ffac4f +| tag: tip +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: e +| +o changeset: 3:65bd5f99a4a3 +| parent: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: d +| +| @ changeset: 2:264128213d29 +|/ user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: c +| +o changeset: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: b +| +o changeset: 0:9ab35a2d17cb + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a + +% 2 different branches: 2 strips +0 files updated, 0 files merged, 0 files removed, 0 files unresolved +saved backup bundle to +saved backup bundle to +@ changeset: 2:65bd5f99a4a3 +| tag: tip +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: d +| +o changeset: 1:ef3a871183d7 +| user: test +| date: Thu Jan 01 00:00:00 1970 +0000 +| summary: b +| +o changeset: 0:9ab35a2d17cb + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: a + +% 2 different branches and a common ancestor: 1 strip +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +saved backup bundle to +saved backup bundle to +1 files updated, 0 files merged, 0 files removed, 0 files unresolved % applied patches before strip 2.diff 3.diff diff -r 3152c978496a -r 00fee6394daf tests/test-mq.out --- a/tests/test-mq.out Thu Aug 12 18:10:42 2010 +0200 +++ b/tests/test-mq.out Thu Aug 12 18:08:52 2010 -0500 @@ -59,7 +59,7 @@ qseries print the entire series file qtop print the name of the current patch qunapplied print the patches not yet applied - strip strip a changeset and all its descendants from the repository + strip strip changesets and all their descendants from the repository use "hg -v help mq" to show aliases and global options adding a diff -r 3152c978496a -r 00fee6394daf tests/test-parents --- a/tests/test-parents Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -#!/bin/sh -# test parents command - -hg init repo -cd repo -echo % no working directory -hg parents - -echo a > a -echo b > b -hg ci -Amab -d '0 0' -echo a >> a -hg ci -Ama -d '1 0' -echo b >> b -hg ci -Amb -d '2 0' -echo c > c -hg ci -Amc -d '3 0' -hg up -C 1 -echo d > c -hg ci -Amc2 -d '4 0' -hg up -C 3 - -echo % hg parents -hg parents - -echo % hg parents a -hg parents a - -echo % hg parents c, single revision -hg parents c - -echo % hg parents -r 3 c -hg parents -r 3 c - -echo % hg parents -r 2 -hg parents -r 2 - -echo % hg parents -r 2 a -hg parents -r 2 a - -echo % hg parents -r 2 ../a -hg parents -r 2 ../a - -echo '% cd dir; hg parents -r 2 ../a' -mkdir dir -cd dir -hg parents -r 2 ../a - -echo '% hg parents -r 2 path:a' -hg parents -r 2 path:a - -echo '% hg parents -r 2 glob:a' -cd .. -hg parents -r 2 glob:a - -echo % merge working dir with 2 parents, hg parents c -HGMERGE=true hg merge -hg parents c - -echo % merge working dir with 1 parent, hg parents -hg up -C 2 -HGMERGE=true hg merge -r 4 -hg parents -echo % merge working dir with 1 parent, hg parents c -hg parents c - -true diff -r 3152c978496a -r 00fee6394daf tests/test-parents.out --- a/tests/test-parents.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -% no working directory -adding a -adding b -adding c -1 files updated, 0 files merged, 1 files removed, 0 files unresolved -adding c -created new head -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -% hg parents -changeset: 3:02d851b7e549 -user: test -date: Thu Jan 01 00:00:03 1970 +0000 -summary: c - -% hg parents a -changeset: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:01 1970 +0000 -summary: a - -% hg parents c, single revision -changeset: 3:02d851b7e549 -user: test -date: Thu Jan 01 00:00:03 1970 +0000 -summary: c - -% hg parents -r 3 c -abort: 'c' not found in manifest! -% hg parents -r 2 -changeset: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:01 1970 +0000 -summary: a - -% hg parents -r 2 a -changeset: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:01 1970 +0000 -summary: a - -% hg parents -r 2 ../a -abort: ../a not under root -% cd dir; hg parents -r 2 ../a -changeset: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:01 1970 +0000 -summary: a - -% hg parents -r 2 path:a -changeset: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:01 1970 +0000 -summary: a - -% hg parents -r 2 glob:a -abort: can only specify an explicit filename -% merge working dir with 2 parents, hg parents c -merging c -0 files updated, 1 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -changeset: 3:02d851b7e549 -user: test -date: Thu Jan 01 00:00:03 1970 +0000 -summary: c - -changeset: 4:48cee28d4b4e -tag: tip -parent: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:04 1970 +0000 -summary: c2 - -% merge working dir with 1 parent, hg parents -0 files updated, 0 files merged, 1 files removed, 0 files unresolved -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -(branch merge, don't forget to commit) -changeset: 2:6cfac479f009 -user: test -date: Thu Jan 01 00:00:02 1970 +0000 -summary: b - -changeset: 4:48cee28d4b4e -tag: tip -parent: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:04 1970 +0000 -summary: c2 - -% merge working dir with 1 parent, hg parents c -changeset: 4:48cee28d4b4e -tag: tip -parent: 1:d786049f033a -user: test -date: Thu Jan 01 00:00:04 1970 +0000 -summary: c2 - diff -r 3152c978496a -r 00fee6394daf tests/test-parents.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-parents.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,149 @@ +test parents command + + $ hg init repo + $ cd repo + +no working directory + + $ hg parents + + $ echo a > a + $ echo b > b + $ hg ci -Amab -d '0 0' + adding a + adding b + $ echo a >> a + $ hg ci -Ama -d '1 0' + $ echo b >> b + $ hg ci -Amb -d '2 0' + $ echo c > c + $ hg ci -Amc -d '3 0' + adding c + $ hg up -C 1 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo d > c + $ hg ci -Amc2 -d '4 0' + adding c + created new head + $ hg up -C 3 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + + + $ hg parents + changeset: 3:02d851b7e549 + user: test + date: Thu Jan 01 00:00:03 1970 +0000 + summary: c + + + $ hg parents a + changeset: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:01 1970 +0000 + summary: a + + +hg parents c, single revision + + $ hg parents c + changeset: 3:02d851b7e549 + user: test + date: Thu Jan 01 00:00:03 1970 +0000 + summary: c + + + $ hg parents -r 3 c + abort: 'c' not found in manifest! + + $ hg parents -r 2 + changeset: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:01 1970 +0000 + summary: a + + + $ hg parents -r 2 a + changeset: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:01 1970 +0000 + summary: a + + + $ hg parents -r 2 ../a + abort: ../a not under root + + +cd dir; hg parents -r 2 ../a + + $ mkdir dir + $ cd dir + $ hg parents -r 2 ../a + changeset: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:01 1970 +0000 + summary: a + + $ hg parents -r 2 path:a + changeset: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:01 1970 +0000 + summary: a + + $ cd .. + + $ hg parents -r 2 glob:a + abort: can only specify an explicit filename + + +merge working dir with 2 parents, hg parents c + + $ HGMERGE=true hg merge + merging c + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg parents c + changeset: 3:02d851b7e549 + user: test + date: Thu Jan 01 00:00:03 1970 +0000 + summary: c + + changeset: 4:48cee28d4b4e + tag: tip + parent: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:04 1970 +0000 + summary: c2 + + + +merge working dir with 1 parent, hg parents + + $ hg up -C 2 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ HGMERGE=true hg merge -r 4 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg parents + changeset: 2:6cfac479f009 + user: test + date: Thu Jan 01 00:00:02 1970 +0000 + summary: b + + changeset: 4:48cee28d4b4e + tag: tip + parent: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:04 1970 +0000 + summary: c2 + + +merge working dir with 1 parent, hg parents c + + $ hg parents c + changeset: 4:48cee28d4b4e + tag: tip + parent: 1:d786049f033a + user: test + date: Thu Jan 01 00:00:04 1970 +0000 + summary: c2 + diff -r 3152c978496a -r 00fee6394daf tests/test-patch --- a/tests/test-patch Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#!/bin/sh - -cat > patchtool.py <> $HGRCPATH -echo "patch=python ../patchtool.py" >> $HGRCPATH - -hg init a -cd a -echo a > a -hg commit -Ama -d '1 0' -echo b >> a -hg commit -Amb -d '2 0' -cd .. - -# This test check that: -# - custom patch commands with arguments actually works -# - patch code does not try to add weird arguments like -# --binary when custom patch commands are used. For instance -# --binary is added by default under win32. - -echo % check custom patch options are honored -hg --cwd a export -o ../a.diff tip -hg clone -r 0 a b - -hg --cwd b import -v ../a.diff - - - - - diff -r 3152c978496a -r 00fee6394daf tests/test-patch.out --- a/tests/test-patch.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -adding a -% check custom patch options are honored -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -updating to branch default -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying ../a.diff -Using custom patch diff -r 3152c978496a -r 00fee6394daf tests/test-patch.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-patch.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,41 @@ + $ cat > patchtool.py < import sys + > print 'Using custom patch' + > if '--binary' in sys.argv: + > print '--binary found !' + > EOF + + $ echo "[ui]" >> $HGRCPATH + $ echo "patch=python ../patchtool.py" >> $HGRCPATH + + $ hg init a + $ cd a + $ echo a > a + $ hg commit -Ama -d '1 0' + adding a + $ echo b >> a + $ hg commit -Amb -d '2 0' + $ cd .. + +This test checks that: + - custom patch commands with arguments actually work + - patch code does not try to add weird arguments like + --binary when custom patch commands are used. For instance + --binary is added by default under win32. + +check custom patch options are honored + + $ hg --cwd a export -o ../a.diff tip + $ hg clone -r 0 a b + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ hg --cwd b import -v ../a.diff + applying ../a.diff + Using custom patch + diff -r 3152c978496a -r 00fee6394daf tests/test-paths --- a/tests/test-paths Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -#!/bin/sh -hg init a -hg clone a b -cd a -echo '[paths]' >> .hg/hgrc -echo 'dupe = ../b' >> .hg/hgrc -hg in dupe | fgrep '../' -cd .. -hg -R a in dupe | fgrep '../' -true diff -r 3152c978496a -r 00fee6394daf tests/test-paths.out --- a/tests/test-paths.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -updating to branch default -0 files updated, 0 files merged, 0 files removed, 0 files unresolved diff -r 3152c978496a -r 00fee6394daf tests/test-paths.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-paths.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,15 @@ + $ hg init a + $ hg clone a b + updating to branch default + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd a + $ echo '[paths]' >> .hg/hgrc + $ echo 'dupe = ../b' >> .hg/hgrc + $ hg in dupe + comparing with .*/test-paths.t/b + no changes found + $ cd .. + $ hg -R a in dupe + comparing with .*/test-paths.t/b + no changes found + $ true diff -r 3152c978496a -r 00fee6394daf tests/test-status --- a/tests/test-status Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -#!/bin/sh - -hg init repo1 -cd repo1 -mkdir a b a/1 b/1 b/2 -touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2 -echo "hg status in repo root:" -hg status -echo "hg status . in repo root:" -hg status . -for dir in a b a/1 b/1 b/2; do - echo "hg status in $dir:" - hg status --cwd "$dir" - echo "hg status . in $dir:" - hg status --cwd "$dir" . - echo "hg status .. in $dir:" - hg status --cwd "$dir" .. -done -cd .. - -hg init repo2 -cd repo2 -touch modified removed deleted ignored -echo "^ignored$" > .hgignore -hg ci -A -m 'initial checkin' -d "1000000 0" -touch modified added unknown ignored -hg add added -hg remove removed -rm deleted -echo "hg status:" -hg status -echo "hg status modified added removed deleted unknown never-existed ignored:" -hg status modified added removed deleted unknown never-existed ignored -hg copy modified copied -echo "hg status -C:" -hg status -C -echo "hg status -A:" -hg status -A -echo "^ignoreddir$" > .hgignore -mkdir ignoreddir -touch ignoreddir/file -echo "hg status ignoreddir/file:" -hg status ignoreddir/file -echo "hg status -i ignoreddir/file:" -hg status -i ignoreddir/file -cd .. - -# check 'status -q' and some combinations -hg init repo3 -cd repo3 -touch modified removed deleted ignored -echo "^ignored$" > .hgignore -hg commit -A -m 'initial checkin' -touch added unknown ignored -hg add added -echo "test" >> modified -hg remove removed -rm deleted -hg copy modified copied - -# Run status with 2 different flags. -# Check if result is the same or different. -# If result is not as expected, raise error -assert() { - hg status $1 > ../a - hg status $2 > ../b - out=`diff ../a ../b` - if [ $? -ne 0 ]; then - out=1 - else - out=0 - fi - if [ $3 -eq 0 ]; then - df="same" - else - df="different" - fi - if [ $out -ne $3 ]; then - echo "Error on $1 and $2, should be $df." - fi -} - -# assert flag1 flag2 [0-same | 1-different] -assert "-q" "-mard" 0 -assert "-A" "-marduicC" 0 -assert "-qA" "-mardcC" 0 -assert "-qAui" "-A" 0 -assert "-qAu" "-marducC" 0 -assert "-qAi" "-mardicC" 0 -assert "-qu" "-u" 0 -assert "-q" "-u" 1 -assert "-m" "-a" 1 -assert "-r" "-d" 1 -cd .. - -hg init repo4 -cd repo4 -touch modified removed deleted -hg ci -q -A -m 'initial checkin' -d "1000000 0" -touch added unknown -hg add added -hg remove removed -rm deleted -echo x > modified -hg copy modified copied -hg ci -m 'test checkin' -d "1000001 0" -rm * -touch unrelated -hg ci -q -A -m 'unrelated checkin' -d "1000002 0" -echo "hg status --change 1:" -hg status --change 1 -echo "hg status --change 1 unrelated:" -hg status --change 1 unrelated -echo "hg status -C --change 1 added modified copied removed deleted:" -hg status -C --change 1 added modified copied removed deleted -echo "hg status -A --change 1" -hg status -A --change 1 diff -r 3152c978496a -r 00fee6394daf tests/test-status-color --- a/tests/test-status-color Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -#!/bin/sh - -echo "[extensions]" >> $HGRCPATH -echo "color=" >> $HGRCPATH -echo "[color]" >> $HGRCPATH -echo "mode=ansi" >> $HGRCPATH - -hg init repo1 -cd repo1 -mkdir a b a/1 b/1 b/2 -touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2 -echo "hg status in repo root:" -hg status --color=always -echo "hg status . in repo root:" -hg status --color=always . -for dir in a b a/1 b/1 b/2; do - echo "hg status in $dir:" - hg status --color=always --cwd "$dir" - echo "hg status . in $dir:" - hg status --color=always --cwd "$dir" . - echo "hg status .. in $dir:" - hg status --color=always --cwd "$dir" .. -done -cd .. - -hg init repo2 -cd repo2 -touch modified removed deleted ignored -echo "^ignored$" > .hgignore -hg ci -A -m 'initial checkin' -d "1000000 0" -touch modified added unknown ignored -hg add added -hg remove removed -rm deleted -echo "hg status:" -hg status --color=always -echo "hg status modified added removed deleted unknown never-existed ignored:" -hg status --color=always modified added removed deleted unknown never-existed ignored -hg copy modified copied -echo "hg status -C:" -hg status --color=always -C -echo "hg status -A:" -hg status --color=always -A -echo "^ignoreddir$" > .hgignore -mkdir ignoreddir -touch ignoreddir/file -echo "hg status ignoreddir/file:" -hg status --color=always ignoreddir/file -echo "hg status -i ignoreddir/file:" -hg status --color=always -i ignoreddir/file -cd .. - -# check 'status -q' and some combinations -hg init repo3 -cd repo3 -touch modified removed deleted ignored -echo "^ignored$" > .hgignore -hg commit -A -m 'initial checkin' -touch added unknown ignored -hg add added -echo "test" >> modified -hg remove removed -rm deleted -hg copy modified copied - -echo "% test unknown color" -hg --config color.status.modified=periwinkle status --color=always - -# Run status with 2 different flags. -# Check if result is the same or different. -# If result is not as expected, raise error -assert() { - hg status --color=always $1 > ../a - hg status --color=always $2 > ../b - out=`diff ../a ../b` - if [ $? -ne 0 ]; then - out=1 - else - out=0 - fi - if [ $3 -eq 0 ]; then - df="same" - else - df="different" - fi - if [ $out -ne $3 ]; then - echo "Error on $1 and $2, should be $df." - fi -} - -# assert flag1 flag2 [0-same | 1-different] -assert "-q" "-mard" 0 -assert "-A" "-marduicC" 0 -assert "-qA" "-mardcC" 0 -assert "-qAui" "-A" 0 -assert "-qAu" "-marducC" 0 -assert "-qAi" "-mardicC" 0 -assert "-qu" "-u" 0 -assert "-q" "-u" 1 -assert "-m" "-a" 1 -assert "-r" "-d" 1 - -cd .. - -# test 'resolve -l' -hg init repo4 -cd repo4 -echo "file a" > a -echo "file b" > b -hg add a b -hg commit -m "initial" -echo "file a change 1" > a -echo "file b change 1" > b -hg commit -m "head 1" -hg update 0 -echo "file a change 2" > a -echo "file b change 2" > b -hg commit -m "head 2" -hg merge -hg resolve -m b -echo "hg resolve with one unresolved, one resolved:" -hg resolve --color=always -l diff -r 3152c978496a -r 00fee6394daf tests/test-status-color.out --- a/tests/test-status-color.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -hg status in repo root: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in repo root: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status in a: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in a: -? 1/in_a_1 -? in_a -hg status .. in a: -? 1/in_a_1 -? in_a -? ../b/1/in_b_1 -? ../b/2/in_b_2 -? ../b/in_b -? ../in_root -hg status in b: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b: -? 1/in_b_1 -? 2/in_b_2 -? in_b -hg status .. in b: -? ../a/1/in_a_1 -? ../a/in_a -? 1/in_b_1 -? 2/in_b_2 -? in_b -? ../in_root -hg status in a/1: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in a/1: -? in_a_1 -hg status .. in a/1: -? in_a_1 -? ../in_a -hg status in b/1: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b/1: -? in_b_1 -hg status .. in b/1: -? in_b_1 -? ../2/in_b_2 -? ../in_b -hg status in b/2: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b/2: -? in_b_2 -hg status .. in b/2: -? ../1/in_b_1 -? in_b_2 -? ../in_b -adding .hgignore -adding deleted -adding modified -adding removed -hg status: -A added -R removed -! deleted -? unknown -hg status modified added removed deleted unknown never-existed ignored: -never-existed: No such file or directory -A added -R removed -! deleted -? unknown -hg status -C: -A added -A copied - modified -R removed -! deleted -? unknown -hg status -A: -A added -A copied - modified -R removed -! deleted -? unknown -I ignored -C .hgignore -C modified -hg status ignoreddir/file: -hg status -i ignoreddir/file: -I ignoreddir/file -adding .hgignore -adding deleted -adding modified -adding removed -% test unknown color -ignoring unknown color/effect 'periwinkle' (configured in color.status.modified) -M modified -A added -A copied -R removed -! deleted -? unknown -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -merging a -warning: conflicts during merge. -merging a failed! -merging b -warning: conflicts during merge. -merging b failed! -0 files updated, 0 files merged, 0 files removed, 2 files unresolved -use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon -hg resolve with one unresolved, one resolved: -U a -R b diff -r 3152c978496a -r 00fee6394daf tests/test-status-color.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-status-color.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,277 @@ + $ echo "[extensions]" >> $HGRCPATH + $ echo "color=" >> $HGRCPATH + $ echo "[color]" >> $HGRCPATH + $ echo "mode=ansi" >> $HGRCPATH + + $ hg init repo1 + $ cd repo1 + $ mkdir a b a/1 b/1 b/2 + $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2 + +hg status in repo root: + + $ hg status --color=always + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + +hg status . in repo root: + + $ hg status --color=always . + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + + $ hg status --color=always --cwd a + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --color=always --cwd a . + ? 1/in_a_1 + ? in_a + $ hg status --color=always --cwd a .. + ? 1/in_a_1 + ? in_a + ? ../b/1/in_b_1 + ? ../b/2/in_b_2 + ? ../b/in_b + ? ../in_root + + $ hg status --color=always --cwd b + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --color=always --cwd b . + ? 1/in_b_1 + ? 2/in_b_2 + ? in_b + $ hg status --color=always --cwd b .. + ? ../a/1/in_a_1 + ? ../a/in_a + ? 1/in_b_1 + ? 2/in_b_2 + ? in_b + ? ../in_root + + $ hg status --color=always --cwd a/1 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --color=always --cwd a/1 . + ? in_a_1 + $ hg status --color=always --cwd a/1 .. + ? in_a_1 + ? ../in_a + + $ hg status --color=always --cwd b/1 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --color=always --cwd b/1 . + ? in_b_1 + $ hg status --color=always --cwd b/1 .. + ? in_b_1 + ? ../2/in_b_2 + ? ../in_b + + $ hg status --color=always --cwd b/2 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --color=always --cwd b/2 . + ? in_b_2 + $ hg status --color=always --cwd b/2 .. + ? ../1/in_b_1 + ? in_b_2 + ? ../in_b + $ cd .. + + $ hg init repo2 + $ cd repo2 + $ touch modified removed deleted ignored + $ echo "^ignored$" > .hgignore + $ hg ci -A -m 'initial checkin' -d "1000000 0" + adding .hgignore + adding deleted + adding modified + adding removed + $ touch modified added unknown ignored + $ hg add added + $ hg remove removed + $ rm deleted + +hg status: + + $ hg status --color=always + A added + R removed + ! deleted + ? unknown + +hg status modified added removed deleted unknown never-existed ignored: + + $ hg status --color=always modified added removed deleted unknown never-existed ignored + never-existed: No such file or directory + A added + R removed + ! deleted + ? unknown + + $ hg copy modified copied + +hg status -C: + + $ hg status --color=always -C + A added + A copied +  modified + R removed + ! deleted + ? unknown + +hg status -A: + + $ hg status --color=always -A + A added + A copied +  modified + R removed + ! deleted + ? unknown + I ignored + C .hgignore + C modified + + + $ echo "^ignoreddir$" > .hgignore + $ mkdir ignoreddir + $ touch ignoreddir/file + +hg status ignoreddir/file: + + $ hg status --color=always ignoreddir/file + +hg status -i ignoreddir/file: + + $ hg status --color=always -i ignoreddir/file + I ignoreddir/file + $ cd .. + +# check 'status -q' and some combinations + + $ hg init repo3 + $ cd repo3 + $ touch modified removed deleted ignored + $ echo "^ignored$" > .hgignore + $ hg commit -A -m 'initial checkin' + adding .hgignore + adding deleted + adding modified + adding removed + $ touch added unknown ignored + $ hg add added + $ echo "test" >> modified + $ hg remove removed + $ rm deleted + $ hg copy modified copied + +test unknown color + + $ hg --config color.status.modified=periwinkle status --color=always + ignoring unknown color/effect 'periwinkle' (configured in color.status.modified) + M modified + A added + A copied + R removed + ! deleted + ? unknown + +# Run status with 2 different flags. +# Check if result is the same or different. +# If result is not as expected, raise error + $ assert() { + > hg status --color=always $1 > ../a + > hg status --color=always $2 > ../b + > out=`diff ../a ../b` + > if [ $? -ne 0 ]; then + > out=1 + > else + > out=0 + > fi + > if [ $3 -eq 0 ]; then + > df="same" + > else + > df="different" + > fi + > if [ $out -ne $3 ]; then + > echo "Error on $1 and $2, should be $df." + > fi + > } + +# assert flag1 flag2 [0-same | 1-different] + + $ assert "-q" "-mard" 0 + $ assert "-A" "-marduicC" 0 + $ assert "-qA" "-mardcC" 0 + $ assert "-qAui" "-A" 0 + $ assert "-qAu" "-marducC" 0 + $ assert "-qAi" "-mardicC" 0 + $ assert "-qu" "-u" 0 + $ assert "-q" "-u" 1 + $ assert "-m" "-a" 1 + $ assert "-r" "-d" 1 + $ cd .. + +# test 'resolve -l' + $ hg init repo4 + $ cd repo4 + $ echo "file a" > a + $ echo "file b" > b + $ hg add a b + $ hg commit -m "initial" + $ echo "file a change 1" > a + $ echo "file b change 1" > b + $ hg commit -m "head 1" + $ hg update 0 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo "file a change 2" > a + $ echo "file b change 2" > b + $ hg commit -m "head 2" + created new head + $ hg merge + merging a + warning: conflicts during merge. + merging a failed! + merging b + warning: conflicts during merge. + merging b failed! + 0 files updated, 0 files merged, 0 files removed, 2 files unresolved + use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon + $ hg resolve -m b + +hg resolve with one unresolved, one resolved: + + $ hg resolve --color=always -l + U a + R b diff -r 3152c978496a -r 00fee6394daf tests/test-status.out --- a/tests/test-status.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -hg status in repo root: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in repo root: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status in a: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in a: -? 1/in_a_1 -? in_a -hg status .. in a: -? 1/in_a_1 -? in_a -? ../b/1/in_b_1 -? ../b/2/in_b_2 -? ../b/in_b -? ../in_root -hg status in b: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b: -? 1/in_b_1 -? 2/in_b_2 -? in_b -hg status .. in b: -? ../a/1/in_a_1 -? ../a/in_a -? 1/in_b_1 -? 2/in_b_2 -? in_b -? ../in_root -hg status in a/1: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in a/1: -? in_a_1 -hg status .. in a/1: -? in_a_1 -? ../in_a -hg status in b/1: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b/1: -? in_b_1 -hg status .. in b/1: -? in_b_1 -? ../2/in_b_2 -? ../in_b -hg status in b/2: -? a/1/in_a_1 -? a/in_a -? b/1/in_b_1 -? b/2/in_b_2 -? b/in_b -? in_root -hg status . in b/2: -? in_b_2 -hg status .. in b/2: -? ../1/in_b_1 -? in_b_2 -? ../in_b -adding .hgignore -adding deleted -adding modified -adding removed -hg status: -A added -R removed -! deleted -? unknown -hg status modified added removed deleted unknown never-existed ignored: -never-existed: No such file or directory -A added -R removed -! deleted -? unknown -hg status -C: -A added -A copied - modified -R removed -! deleted -? unknown -hg status -A: -A added -A copied - modified -R removed -! deleted -? unknown -I ignored -C .hgignore -C modified -hg status ignoreddir/file: -hg status -i ignoreddir/file: -I ignoreddir/file -adding .hgignore -adding deleted -adding modified -adding removed -hg status --change 1: -M modified -A added -A copied -R removed -hg status --change 1 unrelated: -hg status -C --change 1 added modified copied removed deleted: -M modified -A added -A copied - modified -R removed -hg status -A --change 1 -M modified -A added -A copied - modified -R removed -C deleted diff -r 3152c978496a -r 00fee6394daf tests/test-status.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-status.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,275 @@ + $ hg init repo1 + $ cd repo1 + $ mkdir a b a/1 b/1 b/2 + $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2 + +hg status in repo root: + + $ hg status + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + +hg status . in repo root: + + $ hg status . + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + + $ hg status --cwd a + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --cwd a . + ? 1/in_a_1 + ? in_a + $ hg status --cwd a .. + ? 1/in_a_1 + ? in_a + ? ../b/1/in_b_1 + ? ../b/2/in_b_2 + ? ../b/in_b + ? ../in_root + + $ hg status --cwd b + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --cwd b . + ? 1/in_b_1 + ? 2/in_b_2 + ? in_b + $ hg status --cwd b .. + ? ../a/1/in_a_1 + ? ../a/in_a + ? 1/in_b_1 + ? 2/in_b_2 + ? in_b + ? ../in_root + + $ hg status --cwd a/1 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --cwd a/1 . + ? in_a_1 + $ hg status --cwd a/1 .. + ? in_a_1 + ? ../in_a + + $ hg status --cwd b/1 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --cwd b/1 . + ? in_b_1 + $ hg status --cwd b/1 .. + ? in_b_1 + ? ../2/in_b_2 + ? ../in_b + + $ hg status --cwd b/2 + ? a/1/in_a_1 + ? a/in_a + ? b/1/in_b_1 + ? b/2/in_b_2 + ? b/in_b + ? in_root + $ hg status --cwd b/2 . + ? in_b_2 + $ hg status --cwd b/2 .. + ? ../1/in_b_1 + ? in_b_2 + ? ../in_b + $ cd .. + + $ hg init repo2 + $ cd repo2 + $ touch modified removed deleted ignored + $ echo "^ignored$" > .hgignore + $ hg ci -A -m 'initial checkin' -d "1000000 0" + adding .hgignore + adding deleted + adding modified + adding removed + $ touch modified added unknown ignored + $ hg add added + $ hg remove removed + $ rm deleted + +hg status: + + $ hg status + A added + R removed + ! deleted + ? unknown + +hg status modified added removed deleted unknown never-existed ignored: + + $ hg status modified added removed deleted unknown never-existed ignored + never-existed: No such file or directory + A added + R removed + ! deleted + ? unknown + + $ hg copy modified copied + +hg status -C: + + $ hg status -C + A added + A copied + modified + R removed + ! deleted + ? unknown + +hg status -A: + + $ hg status -A + A added + A copied + modified + R removed + ! deleted + ? unknown + I ignored + C .hgignore + C modified + + + $ echo "^ignoreddir$" > .hgignore + $ mkdir ignoreddir + $ touch ignoreddir/file + +hg status ignoreddir/file: + + $ hg status ignoreddir/file + +hg status -i ignoreddir/file: + + $ hg status -i ignoreddir/file + I ignoreddir/file + $ cd .. + +# check 'status -q' and some combinations + + $ hg init repo3 + $ cd repo3 + $ touch modified removed deleted ignored + $ echo "^ignored$" > .hgignore + $ hg commit -A -m 'initial checkin' + adding .hgignore + adding deleted + adding modified + adding removed + $ touch added unknown ignored + $ hg add added + $ echo "test" >> modified + $ hg remove removed + $ rm deleted + $ hg copy modified copied + +# Run status with 2 different flags. +# Check if result is the same or different. +# If result is not as expected, raise error + + $ assert() { + > hg status $1 > ../a + > hg status $2 > ../b + > out=`diff ../a ../b` + > if [ $? -ne 0 ]; then + > out=1 + > else + > out=0 + > fi + > if [ $3 -eq 0 ]; then + > df="same" + > else + > df="different" + > fi + > if [ $out -ne $3 ]; then + > echo "Error on $1 and $2, should be $df." + > fi + > } + +# assert flag1 flag2 [0-same | 1-different] + + $ assert "-q" "-mard" 0 + $ assert "-A" "-marduicC" 0 + $ assert "-qA" "-mardcC" 0 + $ assert "-qAui" "-A" 0 + $ assert "-qAu" "-marducC" 0 + $ assert "-qAi" "-mardicC" 0 + $ assert "-qu" "-u" 0 + $ assert "-q" "-u" 1 + $ assert "-m" "-a" 1 + $ assert "-r" "-d" 1 + $ cd .. + + $ hg init repo4 + $ cd repo4 + $ touch modified removed deleted + $ hg ci -q -A -m 'initial checkin' -d "1000000 0" + $ touch added unknown + $ hg add added + $ hg remove removed + $ rm deleted + $ echo x > modified + $ hg copy modified copied + $ hg ci -m 'test checkin' -d "1000001 0" + $ rm * + $ touch unrelated + $ hg ci -q -A -m 'unrelated checkin' -d "1000002 0" + +hg status --change 1: + + $ hg status --change 1 + M modified + A added + A copied + R removed + +hg status --change 1 unrelated: + + $ hg status --change 1 unrelated + +hg status -C --change 1 added modified copied removed deleted: + + $ hg status -C --change 1 added modified copied removed deleted + M modified + A added + A copied + modified + R removed + +hg status -A --change 1: + + $ hg status -A --change 1 + M modified + A added + A copied + modified + R removed + C deleted diff -r 3152c978496a -r 00fee6394daf tests/test-subrepo-paths --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-subrepo-paths Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,27 @@ +#!/bin/sh + +hg init outer +cd outer + +echo 'sub = http://example.net/libfoo' > .hgsub +hg add .hgsub + +echo '% hg debugsub with no remapping' +hg debugsub + +cat > .hg/hgrc < .hg/hgrc <&1 | "$TESTDIR/filtertmp.py" + +exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-subrepo-paths.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-subrepo-paths.out Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,10 @@ +% hg debugsub with no remapping +path sub + source http://example.net/libfoo + revision +% hg debugsub with remapping +path sub + source ssh://localhost/libfoo + revision +% test bad subpaths pattern +abort: bad subrepository pattern in $HGTMP/test-subrepo-paths/outer/.hg/hgrc:2: invalid group reference diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-addremove --- a/tests/test-symlink-addremove Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -#!/bin/sh - -"$TESTDIR/hghave" symlink || exit 80 - -hg init a -cd a - -echo '% directory moved and symlinked' -mkdir foo -touch foo/a -hg ci -Ama -mv foo bar -ln -s bar foo -echo '% now addremove should remove old files' -hg addremove diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-addremove.out --- a/tests/test-symlink-addremove.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -% directory moved and symlinked -adding foo/a -% now addremove should remove old files -adding bar/a -adding foo -removing foo/a diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-basic --- a/tests/test-symlink-basic Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -#!/bin/sh - -"$TESTDIR/hghave" symlink || exit 80 - -hg init a -cd a -ln -s nothing dangling -hg commit -m 'commit symlink without adding' dangling -hg add dangling -hg commit -m 'add symlink' - -hg tip -v -hg manifest --debug -echo '% rev 0:' -$TESTDIR/readlink.py dangling - -rm dangling -ln -s void dangling -hg commit -m 'change symlink' -echo '% rev 1:' -$TESTDIR/readlink.py dangling - -echo '% modifying link' -rm dangling -ln -s empty dangling -$TESTDIR/readlink.py dangling - -echo '% reverting to rev 0:' -hg revert -r 0 -a -$TESTDIR/readlink.py dangling - -echo '% backups:' -$TESTDIR/readlink.py *.orig - -rm *.orig -hg up -C -echo '% copies' -hg cp -v dangling dangling2 -hg st -Cmard -$TESTDIR/readlink.py dangling dangling2 - -echo '% issue995' -hg up -C -mkdir dir -ln -s dir dirlink -hg ci -qAm 'add dirlink' -mkdir newdir -mv dir newdir/dir -mv dirlink newdir/dirlink -hg mv -A dirlink newdir/dirlink diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-basic.out --- a/tests/test-symlink-basic.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -abort: dangling: file not tracked! -changeset: 0:cabd88b706fc -tag: tip -user: test -date: Thu Jan 01 00:00:00 1970 +0000 -files: dangling -description: -add symlink - - -2564acbe54bbbedfbf608479340b359f04597f80 644 @ dangling -% rev 0: -dangling -> nothing -% rev 1: -dangling -> void -% modifying link -dangling -> empty -% reverting to rev 0: -reverting dangling -dangling -> nothing -% backups: -dangling.orig -> empty -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -% copies -copying dangling to dangling2 -A dangling2 - dangling -dangling -> void -dangling2 -> void -% issue995 -0 files updated, 0 files merged, 0 files removed, 0 files unresolved diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-root --- a/tests/test-symlink-root Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -#!/bin/sh - -"$TESTDIR/hghave" symlink || exit 80 - -hg init a -ln -s a link -cd a -echo foo > foo -hg status -hg status ../link diff -r 3152c978496a -r 00fee6394daf tests/test-symlink-root.out --- a/tests/test-symlink-root.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -? foo -? foo diff -r 3152c978496a -r 00fee6394daf tests/test-symlinks --- a/tests/test-symlinks Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -#!/bin/sh -#Test bug regarding symlinks that showed up in hg 0.7 -#Author: Matthew Elder - -"$TESTDIR/hghave" symlink || exit 80 - -#make and initialize repo -hg init test; cd test; - -#make a file and a symlink -touch foo; ln -s foo bar; - -#import with addremove -- symlink walking should _not_ screwup. -hg addremove - -#commit -- the symlink should _not_ appear added to dir state -hg commit -m 'initial' - -#add a new file so hg will let me commit again -touch bomb - -#again, symlink should _not_ show up on dir state -hg addremove - -#Assert screamed here before, should go by without consequence -hg commit -m 'is there a bug?' - -cd .. ; rm -r test -hg init test; cd test; - -mkdir dir -touch a.c dir/a.o dir/b.o -# test what happens if we want to trick hg -hg commit -A -m 0 -echo "relglob:*.o" > .hgignore -rm a.c -rm dir/a.o -rm dir/b.o -mkdir dir/a.o -ln -s nonexist dir/b.o -mkfifo a.c -# it should show a.c, dir/a.o and dir/b.o deleted -hg status -hg status a.c - -echo '# test absolute path through symlink outside repo' -cd .. -p=`pwd` -hg init x -ln -s x y -cd x -touch f -hg add f -hg status "$p"/y/f - -echo '# try symlink outside repo to file inside' -ln -s x/f ../z -# this should fail -hg status ../z && { echo hg mistakenly exited with status 0; exit 1; } || : - -cd .. ; rm -r test -hg init test; cd test; - -echo '# try cloning symlink in a subdir' -echo '1. commit a symlink' -mkdir -p a/b/c -cd a/b/c -ln -s /path/to/symlink/source demo -cd ../../.. -hg stat -hg commit -A -m 'add symlink in a/b/c subdir' -echo '2. clone it' -cd .. -hg clone test testclone - -echo '# git symlink diff' -cd testclone -hg diff --git -r null:tip -hg export --git tip > ../sl.diff -echo '# import git symlink diff' -hg rm a/b/c/demo -hg commit -m'remove link' -hg import ../sl.diff -hg diff --git -r 1:tip diff -r 3152c978496a -r 00fee6394daf tests/test-symlinks.out --- a/tests/test-symlinks.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -adding bar -adding foo -adding bomb -adding a.c -adding dir/a.o -adding dir/b.o -M dir/b.o -! a.c -! dir/a.o -? .hgignore -a.c: unsupported file type (type is fifo) -! a.c -# test absolute path through symlink outside repo -A f -# try symlink outside repo to file inside -abort: ../z not under root -# try cloning symlink in a subdir -1. commit a symlink -? a/b/c/demo -adding a/b/c/demo -2. clone it -updating to branch default -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -# git symlink diff -diff --git a/a/b/c/demo b/a/b/c/demo -new file mode 120000 ---- /dev/null -+++ b/a/b/c/demo -@@ -0,0 +1,1 @@ -+/path/to/symlink/source -\ No newline at end of file -# import git symlink diff -applying ../sl.diff -diff --git a/a/b/c/demo b/a/b/c/demo -new file mode 120000 ---- /dev/null -+++ b/a/b/c/demo -@@ -0,0 +1,1 @@ -+/path/to/symlink/source -\ No newline at end of file diff -r 3152c978496a -r 00fee6394daf tests/test-symlinks.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-symlinks.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,253 @@ + $ "$TESTDIR/hghave" symlink || exit 80 + +== tests added in 0.7 == + + $ hg init test-symlinks-0.7; cd test-symlinks-0.7; + $ touch foo; ln -s foo bar; + +import with addremove -- symlink walking should _not_ screwup. + + $ hg addremove + adding bar + adding foo + +commit -- the symlink should _not_ appear added to dir state + + $ hg commit -m 'initial' + + $ touch bomb + +again, symlink should _not_ show up on dir state + + $ hg addremove + adding bomb + +Assert screamed here before, should go by without consequence + + $ hg commit -m 'is there a bug?' + $ cd .. + + +== fifo & ignore == + + $ hg init test; cd test; + + $ mkdir dir + $ touch a.c dir/a.o dir/b.o + +test what happens if we want to trick hg + + $ hg commit -A -m 0 + adding a.c + adding dir/a.o + adding dir/b.o + $ echo "relglob:*.o" > .hgignore + $ rm a.c + $ rm dir/a.o + $ rm dir/b.o + $ mkdir dir/a.o + $ ln -s nonexist dir/b.o + $ mkfifo a.c + +it should show a.c, dir/a.o and dir/b.o deleted + + $ hg status + M dir/b.o + ! a.c + ! dir/a.o + ? .hgignore + $ hg status a.c + a.c: unsupported file type (type is fifo) + ! a.c + $ cd .. + + +== symlinks from outside the tree == + +test absolute path through symlink outside repo + + $ p=`pwd` + $ hg init x + $ ln -s x y + $ cd x + $ touch f + $ hg add f + $ hg status "$p"/y/f + A f + +try symlink outside repo to file inside + + $ ln -s x/f ../z + +this should fail + + $ hg status ../z && { echo hg mistakenly exited with status 0; exit 1; } || : + abort: ../z not under root + $ cd .. + + +== cloning symlinks == + $ hg init clone; cd clone; + +try cloning symlink in a subdir +1. commit a symlink + + $ mkdir -p a/b/c + $ cd a/b/c + $ ln -s /path/to/symlink/source demo + $ cd ../../.. + $ hg stat + ? a/b/c/demo + $ hg commit -A -m 'add symlink in a/b/c subdir' + adding a/b/c/demo + +2. clone it + + $ cd .. + $ hg clone clone clonedest + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + +== symlink and git diffs == + +git symlink diff + + $ cd clonedest + $ hg diff --git -r null:tip + diff --git a/a/b/c/demo b/a/b/c/demo + new file mode 120000 + --- /dev/null + +++ b/a/b/c/demo + @@ -0,0 +1,1 @@ + +/path/to/symlink/source + \ No newline at end of file + $ hg export --git tip > ../sl.diff + +import git symlink diff + + $ hg rm a/b/c/demo + $ hg commit -m'remove link' + $ hg import ../sl.diff + applying ../sl.diff + $ hg diff --git -r 1:tip + diff --git a/a/b/c/demo b/a/b/c/demo + new file mode 120000 + --- /dev/null + +++ b/a/b/c/demo + @@ -0,0 +1,1 @@ + +/path/to/symlink/source + \ No newline at end of file + +== symlinks and addremove == + +directory moved and symlinked + + $ mkdir foo + $ touch foo/a + $ hg ci -Ama + adding foo/a + $ mv foo bar + $ ln -s bar foo + +now addremove should remove old files + + $ hg addremove + adding bar/a + adding foo + removing foo/a + $ cd .. + +== root of repository is symlinked == + + $ hg init root + $ ln -s root link + $ cd root + $ echo foo > foo + $ hg status + ? foo + $ hg status ../link + ? foo + $ cd .. + + + + + $ hg init b + $ cd b + $ ln -s nothing dangling + $ hg commit -m 'commit symlink without adding' dangling + abort: dangling: file not tracked! + $ hg add dangling + $ hg commit -m 'add symlink' + + $ hg tip -v + changeset: 0:cabd88b706fc + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + files: dangling + description: + add symlink + + + $ hg manifest --debug + 2564acbe54bbbedfbf608479340b359f04597f80 644 @ dangling + $ $TESTDIR/readlink.py dangling + dangling -> nothing + + $ rm dangling + $ ln -s void dangling + $ hg commit -m 'change symlink' + $ $TESTDIR/readlink.py dangling + dangling -> void + + +modifying link + + $ rm dangling + $ ln -s empty dangling + $ $TESTDIR/readlink.py dangling + dangling -> empty + + +reverting to rev 0: + + $ hg revert -r 0 -a + reverting dangling + $ $TESTDIR/readlink.py dangling + dangling -> nothing + + +backups: + + $ $TESTDIR/readlink.py *.orig + dangling.orig -> empty + $ rm *.orig + $ hg up -C + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + +copies + + $ hg cp -v dangling dangling2 + copying dangling to dangling2 + $ hg st -Cmard + A dangling2 + dangling + $ $TESTDIR/readlink.py dangling dangling2 + dangling -> void + dangling2 -> void + + +issue995 + + $ hg up -C + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ mkdir dir + $ ln -s dir dirlink + $ hg ci -qAm 'add dirlink' + $ mkdir newdir + $ mv dir newdir/dir + $ mv dirlink newdir/dirlink + $ hg mv -A dirlink newdir/dirlink + diff -r 3152c978496a -r 00fee6394daf tests/test-tag --- a/tests/test-tag Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -#!/bin/sh - -hg init test -cd test - -echo a > a -hg add a -hg commit -m "test" -d "1000000 0" -hg history - -hg tag ' ' - -hg tag -d "1000000 0" "bleah" -hg history - -echo foo >> .hgtags -hg tag -d "1000000 0" "bleah2" || echo "failed" - -hg revert .hgtags -hg tag -d "1000000 0" -r 0 x y z y y z || echo "failed" -hg tag -d "1000000 0" tap nada dot tip null . || echo "failed" -hg tag -d "1000000 0" "bleah" || echo "failed" -hg tag -d "1000000 0" "blecch" "bleah" || echo "failed" - -hg tag -d "1000000 0" --remove "blecch" || echo "failed" -hg tag -d "1000000 0" --remove "bleah" "blecch" "blough" || echo "failed" - -hg tag -d "1000000 0" -r 0 "bleah0" -hg tag -l -d "1000000 0" -r 1 "bleah1" -hg tag -d "1000000 0" gack gawk gorp -hg tag -d "1000000 0" -f gack -hg tag -d "1000000 0" --remove gack gorp - -cat .hgtags -cat .hg/localtags - -hg update 0 -hg tag -d "1000000 0" "foobar" -cat .hgtags -cat .hg/localtags - -hg tag -l 'xx -newline' -hg tag -l 'xx:xx' - -echo % cloning local tags -cd .. -hg -R test log -r0:5 -hg clone -q -rbleah1 test test1 -hg -R test1 parents --style=compact -hg clone -q -r5 test#bleah1 test2 -hg -R test2 parents --style=compact -hg clone -q -U test#bleah1 test3 -hg -R test3 parents --style=compact - -cd test -echo % issue 601 -python << EOF -f = file('.hg/localtags'); last = f.readlines()[-1][:-1]; f.close() -f = file('.hg/localtags', 'w'); f.write(last); f.close() -EOF -cat .hg/localtags -hg tag -l localnewline -cat .hg/localtags - -python << EOF -f = file('.hgtags'); last = f.readlines()[-1][:-1]; f.close() -f = file('.hgtags', 'w'); f.write(last); f.close() -EOF -hg ci -d '1000000 0' -m'broken manual edit of .hgtags' -cat .hgtags -hg tag -d '1000000 0' newline -cat .hgtags - -echo % tag and branch using same name -hg branch tag-and-branch-same-name -hg ci -m"discouraged" -hg tag tag-and-branch-same-name - -echo '% test custom commit messages' -cat > $HGTMP/editor <<'__EOF__' -#!/bin/sh -echo "custom tag message" > "$1" -echo "second line" >> "$1" -__EOF__ -chmod +x "$HGTMP"/editor -HGEDITOR="'$HGTMP'"/editor hg tag custom-tag -e -hg log -l1 --template "{desc}\n" diff -r 3152c978496a -r 00fee6394daf tests/test-tag.out --- a/tests/test-tag.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -changeset: 0:0acdaf898367 -tag: tip -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: test - -abort: tag names cannot consist entirely of whitespace -changeset: 1:3ecf002a1c57 -tag: tip -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Added tag bleah for changeset 0acdaf898367 - -changeset: 0:0acdaf898367 -tag: bleah -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: test - -abort: working copy of .hgtags is changed (please commit .hgtags manually) -failed -abort: tag names must be unique -failed -abort: the name 'tip' is reserved -failed -abort: tag 'bleah' already exists (use -f to force) -failed -abort: tag 'bleah' already exists (use -f to force) -failed -abort: tag 'blecch' does not exist -failed -abort: tag 'blecch' does not exist -failed -0acdaf8983679e0aac16e811534eb49d7ee1f2b4 bleah -0acdaf8983679e0aac16e811534eb49d7ee1f2b4 bleah0 -868cc8fbb43b754ad09fa109885d243fc49adae7 gack -868cc8fbb43b754ad09fa109885d243fc49adae7 gawk -868cc8fbb43b754ad09fa109885d243fc49adae7 gorp -868cc8fbb43b754ad09fa109885d243fc49adae7 gack -3807bcf62c5614cb6c16436b514d7764ca5f1631 gack -3807bcf62c5614cb6c16436b514d7764ca5f1631 gack -0000000000000000000000000000000000000000 gack -868cc8fbb43b754ad09fa109885d243fc49adae7 gorp -0000000000000000000000000000000000000000 gorp -3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 -0 files updated, 0 files merged, 1 files removed, 0 files unresolved -0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar -3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 -abort: '\n' cannot be used in a tag name -abort: ':' cannot be used in a tag name -% cloning local tags -changeset: 0:0acdaf898367 -tag: bleah -tag: bleah0 -tag: foobar -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: test - -changeset: 1:3ecf002a1c57 -tag: bleah1 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Added tag bleah for changeset 0acdaf898367 - -changeset: 2:868cc8fbb43b -tag: gawk -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Added tag bleah0 for changeset 0acdaf898367 - -changeset: 3:3807bcf62c56 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Added tag gack, gawk, gorp for changeset 868cc8fbb43b - -changeset: 4:140c6e8597b4 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Added tag gack for changeset 3807bcf62c56 - -changeset: 5:470a65fa7cc9 -user: test -date: Mon Jan 12 13:46:40 1970 +0000 -summary: Removed tag gack, gorp - -1[tip] 3ecf002a1c57 1970-01-12 13:46 +0000 test - Added tag bleah for changeset 0acdaf898367 - -5[tip] 470a65fa7cc9 1970-01-12 13:46 +0000 test - Removed tag gack, gorp - -% issue 601 -3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah13ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 -f68b039e72eacbb2e68b0543e1f6e50990aa2bb5 localnewline -0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar -6ae703d793c8b1f097116869275ecd97b2977a2b newline -% tag and branch using same name -marked working directory as branch tag-and-branch-same-name -warning: tag tag-and-branch-same-name conflicts with existing branch name -% test custom commit messages -custom tag message -second line diff -r 3152c978496a -r 00fee6394daf tests/test-tag.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-tag.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,194 @@ + $ hg init test + $ cd test + + $ echo a > a + $ hg add a + $ hg commit -m "test" -d "1000000 0" + $ hg history + changeset: 0:0acdaf898367 + tag: tip + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: test + + + $ hg tag ' ' + abort: tag names cannot consist entirely of whitespace + + $ hg tag -d "1000000 0" "bleah" + $ hg history + changeset: 1:3ecf002a1c57 + tag: tip + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Added tag bleah for changeset 0acdaf898367 + + changeset: 0:0acdaf898367 + tag: bleah + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: test + + + $ echo foo >> .hgtags + $ hg tag -d "1000000 0" "bleah2" || echo "failed" + abort: working copy of .hgtags is changed (please commit .hgtags manually) + failed + + $ hg revert .hgtags + $ hg tag -d "1000000 0" -r 0 x y z y y z || echo "failed" + abort: tag names must be unique + failed + $ hg tag -d "1000000 0" tap nada dot tip null . || echo "failed" + abort: the name 'tip' is reserved + failed + $ hg tag -d "1000000 0" "bleah" || echo "failed" + abort: tag 'bleah' already exists (use -f to force) + failed + $ hg tag -d "1000000 0" "blecch" "bleah" || echo "failed" + abort: tag 'bleah' already exists (use -f to force) + failed + + $ hg tag -d "1000000 0" --remove "blecch" || echo "failed" + abort: tag 'blecch' does not exist + failed + $ hg tag -d "1000000 0" --remove "bleah" "blecch" "blough" || echo "failed" + abort: tag 'blecch' does not exist + failed + + $ hg tag -d "1000000 0" -r 0 "bleah0" + $ hg tag -l -d "1000000 0" -r 1 "bleah1" + $ hg tag -d "1000000 0" gack gawk gorp + $ hg tag -d "1000000 0" -f gack + $ hg tag -d "1000000 0" --remove gack gorp + + $ cat .hgtags + 0acdaf8983679e0aac16e811534eb49d7ee1f2b4 bleah + 0acdaf8983679e0aac16e811534eb49d7ee1f2b4 bleah0 + 868cc8fbb43b754ad09fa109885d243fc49adae7 gack + 868cc8fbb43b754ad09fa109885d243fc49adae7 gawk + 868cc8fbb43b754ad09fa109885d243fc49adae7 gorp + 868cc8fbb43b754ad09fa109885d243fc49adae7 gack + 3807bcf62c5614cb6c16436b514d7764ca5f1631 gack + 3807bcf62c5614cb6c16436b514d7764ca5f1631 gack + 0000000000000000000000000000000000000000 gack + 868cc8fbb43b754ad09fa109885d243fc49adae7 gorp + 0000000000000000000000000000000000000000 gorp + $ cat .hg/localtags + 3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 + + $ hg update 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg tag -d "1000000 0" "foobar" + $ cat .hgtags + 0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar + $ cat .hg/localtags + 3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 + + $ hg tag -l 'xx + > newline' + abort: '\n' cannot be used in a tag name + $ hg tag -l 'xx:xx' + abort: ':' cannot be used in a tag name + +cloning local tags + + $ cd .. + $ hg -R test log -r0:5 + changeset: 0:0acdaf898367 + tag: bleah + tag: bleah0 + tag: foobar + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: test + + changeset: 1:3ecf002a1c57 + tag: bleah1 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Added tag bleah for changeset 0acdaf898367 + + changeset: 2:868cc8fbb43b + tag: gawk + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Added tag bleah0 for changeset 0acdaf898367 + + changeset: 3:3807bcf62c56 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Added tag gack, gawk, gorp for changeset 868cc8fbb43b + + changeset: 4:140c6e8597b4 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Added tag gack for changeset 3807bcf62c56 + + changeset: 5:470a65fa7cc9 + user: test + date: Mon Jan 12 13:46:40 1970 +0000 + summary: Removed tag gack, gorp + + $ hg clone -q -rbleah1 test test1 + $ hg -R test1 parents --style=compact + 1[tip] 3ecf002a1c57 1970-01-12 13:46 +0000 test + Added tag bleah for changeset 0acdaf898367 + + $ hg clone -q -r5 test#bleah1 test2 + $ hg -R test2 parents --style=compact + 5[tip] 470a65fa7cc9 1970-01-12 13:46 +0000 test + Removed tag gack, gorp + + $ hg clone -q -U test#bleah1 test3 + $ hg -R test3 parents --style=compact + + $ cd test + +issue 601 + + $ python << EOF + > f = file('.hg/localtags'); last = f.readlines()[-1][:-1]; f.close() + > f = file('.hg/localtags', 'w'); f.write(last); f.close() + > EOF + $ cat .hg/localtags; echo + 3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 + $ hg tag -l localnewline + $ cat .hg/localtags; echo + 3ecf002a1c572a2f3bb4e665417e60fca65bbd42 bleah1 + f68b039e72eacbb2e68b0543e1f6e50990aa2bb5 localnewline + + + $ python << EOF + > f = file('.hgtags'); last = f.readlines()[-1][:-1]; f.close() + > f = file('.hgtags', 'w'); f.write(last); f.close() + > EOF + $ hg ci -d '1000000 0' -m'broken manual edit of .hgtags' + $ cat .hgtags; echo + 0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar + $ hg tag -d '1000000 0' newline + $ cat .hgtags; echo + 0acdaf8983679e0aac16e811534eb49d7ee1f2b4 foobar + 6ae703d793c8b1f097116869275ecd97b2977a2b newline + + +tag and branch using same name + + $ hg branch tag-and-branch-same-name + marked working directory as branch tag-and-branch-same-name + $ hg ci -m"discouraged" + $ hg tag tag-and-branch-same-name + warning: tag tag-and-branch-same-name conflicts with existing branch name + +test custom commit messages + + $ cat > $HGTMP/editor <<'__EOF__' + > #!/bin/sh + > echo "custom tag message" > "$1" + > echo "second line" >> "$1" + > __EOF__ + $ chmod +x "$HGTMP"/editor + $ HGEDITOR="'$HGTMP'"/editor hg tag custom-tag -e + $ hg log -l1 --template "{desc}\n" + custom tag message + second line diff -r 3152c978496a -r 00fee6394daf tests/test-transplant --- a/tests/test-transplant Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -#!/bin/sh - -cat <> $HGRCPATH -[extensions] -transplant= -EOF - -hg init t -cd t -echo r1 > r1 -hg ci -Amr1 -d'0 0' -echo r2 > r2 -hg ci -Amr2 -d'1 0' -hg up 0 - -echo b1 > b1 -hg ci -Amb1 -d '0 0' -echo b2 > b2 -hg ci -Amb2 -d '1 0' -echo b3 > b3 -hg ci -Amb3 -d '2 0' - -hg log --template '{rev} {parents} {desc}\n' - -hg clone . ../rebase -cd ../rebase - -hg up -C 1 -echo '% rebase b onto r1' -hg transplant -a -b tip -hg log --template '{rev} {parents} {desc}\n' - -hg clone ../t ../prune -cd ../prune - -hg up -C 1 -echo '% rebase b onto r1, skipping b2' -hg transplant -a -b tip -p 3 -hg log --template '{rev} {parents} {desc}\n' - -echo '% remote transplant' -hg clone -r 1 ../t ../remote -cd ../remote -hg transplant --log -s ../t 2 4 -hg log --template '{rev} {parents} {desc}\n' - -echo '% skip previous transplants' -hg transplant -s ../t -a -b 4 -hg log --template '{rev} {parents} {desc}\n' - -echo '% skip local changes transplanted to the source' -echo b4 > b4 -hg ci -Amb4 -d '3 0' -hg clone ../t ../pullback -cd ../pullback -hg transplant -s ../remote -a -b tip - -echo '% remote transplant with pull' -hg -R ../t serve -p $HGPORT -d --pid-file=../t.pid -cat ../t.pid >> $DAEMON_PIDS - -hg clone -r 0 ../t ../rp -cd ../rp -hg transplant -s http://localhost:$HGPORT/ 2 4 -hg log --template '{rev} {parents} {desc}\n' - -echo '% transplant --continue' -hg init ../tc -cd ../tc -cat < foo -foo -bar -baz -EOF -echo toremove > toremove -hg ci -Amfoo -cat < foo -foo2 -bar2 -baz2 -EOF -rm toremove -echo added > added -hg ci -Amfoo2 -echo bar > bar -hg ci -Ambar -echo bar2 >> bar -hg ci -mbar2 -hg up 0 -echo foobar > foo -hg ci -mfoobar -hg transplant 1:3 -# transplant -c shouldn't use an old changeset -hg up -C -rm added -hg transplant 1 -hg transplant --continue -hg transplant 1:3 -hg locate -cd .. - -# Test transplant --merge (issue 1111) -echo % test transplant merge -hg init t1111 -cd t1111 -echo a > a -hg ci -Am adda -echo b >> a -hg ci -m appendb -echo c >> a -hg ci -m appendc -hg up -C 0 -echo d >> a -hg ci -m appendd -echo % tranplant -hg transplant -m 1 -cd .. - -echo '% test transplant into empty repository' -hg init empty -cd empty -hg transplant -s ../t -b tip -a -cd .. - -echo '% test filter' -hg init filter -cd filter -cat <<'EOF' >test-filter -#!/bin/sh -sed 's/r1/r2/' $1 > $1.new -mv $1.new $1 -EOF -chmod +x test-filter -hg transplant -s ../t -b tip -a --filter ./test-filter |\ - sed 's/filtering.*/filtering/g' -hg log --template '{rev} {parents} {desc}\n' -cd .. - -echo '% test filter with failed patch' -cd filter -hg up 0 -echo foo > b1 -hg ci -d '0 0' -Am foo -hg transplant 1 --filter ./test-filter |\ - sed 's/filtering.*/filtering/g' -cd .. - -echo '% test with a win32ext like setup (differing EOLs)' -hg init twin1 -cd twin1 -echo a > a -echo b > b -echo b >> b -hg ci -Am t -echo a > b -echo b >> b -hg ci -m changeb -cd .. - -hg init twin2 -cd twin2 -echo '[patch]' >> .hg/hgrc -echo 'eol = crlf' >> .hg/hgrc -python -c "file('b', 'wb').write('b\r\nb\r\n')" -hg ci -m addb -hg transplant -s ../twin1 tip -python -c "print repr(file('b', 'rb').read())" -cd .. diff -r 3152c978496a -r 00fee6394daf tests/test-transplant.out --- a/tests/test-transplant.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -adding r1 -adding r2 -0 files updated, 0 files merged, 1 files removed, 0 files unresolved -adding b1 -created new head -adding b2 -adding b3 -4 b3 -3 b2 -2 0:17ab29e464c6 b1 -1 r2 -0 r1 -updating to branch default -4 files updated, 0 files merged, 0 files removed, 0 files unresolved -1 files updated, 0 files merged, 3 files removed, 0 files unresolved -% rebase b onto r1 -applying 37a1297eb21b -37a1297eb21b transplanted to e234d668f844 -applying 722f4667af76 -722f4667af76 transplanted to 539f377d78df -applying a53251cdf717 -a53251cdf717 transplanted to ffd6818a3975 -7 b3 -6 b2 -5 1:d11e3596cc1a b1 -4 b3 -3 b2 -2 0:17ab29e464c6 b1 -1 r2 -0 r1 -updating to branch default -4 files updated, 0 files merged, 0 files removed, 0 files unresolved -1 files updated, 0 files merged, 3 files removed, 0 files unresolved -% rebase b onto r1, skipping b2 -applying 37a1297eb21b -37a1297eb21b transplanted to e234d668f844 -applying a53251cdf717 -a53251cdf717 transplanted to 7275fda4d04f -6 b3 -5 1:d11e3596cc1a b1 -4 b3 -3 b2 -2 0:17ab29e464c6 b1 -1 r2 -0 r1 -% remote transplant -requesting all changes -adding changesets -adding manifests -adding file changes -added 2 changesets with 2 changes to 2 files -updating to branch default -2 files updated, 0 files merged, 0 files removed, 0 files unresolved -searching for changes -applying 37a1297eb21b -37a1297eb21b transplanted to c19cf0ccb069 -applying a53251cdf717 -a53251cdf717 transplanted to f7fe5bf98525 -3 b3 -(transplanted from a53251cdf717679d1907b289f991534be05c997a) -2 b1 -(transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21) -1 r2 -0 r1 -% skip previous transplants -searching for changes -applying 722f4667af76 -722f4667af76 transplanted to 47156cd86c0b -4 b2 -3 b3 -(transplanted from a53251cdf717679d1907b289f991534be05c997a) -2 b1 -(transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21) -1 r2 -0 r1 -% skip local changes transplanted to the source -adding b4 -updating to branch default -4 files updated, 0 files merged, 0 files removed, 0 files unresolved -searching for changes -applying 4333daefcb15 -4333daefcb15 transplanted to 5f42c04e07cc -% remote transplant with pull -requesting all changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -updating to branch default -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -searching for changes -searching for changes -adding changesets -adding manifests -adding file changes -added 1 changesets with 1 changes to 1 files -applying a53251cdf717 -a53251cdf717 transplanted to 8d9279348abb -2 b3 -1 b1 -0 r1 -% transplant --continue -adding foo -adding toremove -adding added -removing toremove -adding bar -2 files updated, 0 files merged, 2 files removed, 0 files unresolved -created new head -applying a1e30dd1b8e7 -patching file foo -Hunk #1 FAILED at 0 -1 out of 1 hunks FAILED -- saving rejects to file foo.rej -patch failed to apply -abort: Fix up the merge and run hg transplant --continue -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -applying a1e30dd1b8e7 -patching file foo -Hunk #1 FAILED at 0 -1 out of 1 hunks FAILED -- saving rejects to file foo.rej -patch failed to apply -abort: Fix up the merge and run hg transplant --continue -a1e30dd1b8e7 transplanted as f1563cf27039 -skipping already applied revision 1:a1e30dd1b8e7 -applying 1739ac5f6139 -1739ac5f6139 transplanted to d649c221319f -applying 0282d5fbbe02 -0282d5fbbe02 transplanted to 77418277ccb3 -added -bar -foo -% test transplant merge -adding a -1 files updated, 0 files merged, 0 files removed, 0 files unresolved -created new head -% tranplant -applying 42dc4432fd35 -1:42dc4432fd35 merged at a9f4acbac129 -% test transplant into empty repository -requesting all changes -adding changesets -adding manifests -adding file changes -added 4 changesets with 4 changes to 4 files -% test filter -filtering -applying 17ab29e464c6 -17ab29e464c6 transplanted to e9ffc54ea104 -filtering -applying 37a1297eb21b -37a1297eb21b transplanted to 348b36d0b6a5 -filtering -applying 722f4667af76 -722f4667af76 transplanted to 0aa6979afb95 -filtering -applying a53251cdf717 -a53251cdf717 transplanted to 14f8512272b5 -3 b3 -2 b2 -1 b1 -0 r2 -% test filter with failed patch -0 files updated, 0 files merged, 3 files removed, 0 files unresolved -adding b1 -adding test-filter -created new head -file b1 already exists -1 out of 1 hunks FAILED -- saving rejects to file b1.rej -abort: Fix up the merge and run hg transplant --continue -filtering -applying 348b36d0b6a5 -patch failed to apply -% test with a win32ext like setup (differing EOLs) -adding a -adding b -nothing changed -applying 2e849d776c17 -2e849d776c17 transplanted to 589cea8ba85b -'a\r\nb\r\n' diff -r 3152c978496a -r 00fee6394daf tests/test-transplant.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-transplant.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,353 @@ + $ cat <> $HGRCPATH + > [extensions] + > transplant= + > EOF + + $ hg init t + $ cd t + $ echo r1 > r1 + $ hg ci -Amr1 -d'0 0' + adding r1 + $ echo r2 > r2 + $ hg ci -Amr2 -d'1 0' + adding r2 + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + + $ echo b1 > b1 + $ hg ci -Amb1 -d '0 0' + adding b1 + created new head + $ echo b2 > b2 + $ hg ci -Amb2 -d '1 0' + adding b2 + $ echo b3 > b3 + $ hg ci -Amb3 -d '2 0' + adding b3 + + $ hg log --template '{rev} {parents} {desc}\n' + 4 b3 + 3 b2 + 2 0:17ab29e464c6 b1 + 1 r2 + 0 r1 + + $ hg clone . ../rebase + updating to branch default + 4 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../rebase + + $ hg up -C 1 + 1 files updated, 0 files merged, 3 files removed, 0 files unresolved + +rebase b onto r1 + + $ hg transplant -a -b tip + applying 37a1297eb21b + 37a1297eb21b transplanted to e234d668f844 + applying 722f4667af76 + 722f4667af76 transplanted to 539f377d78df + applying a53251cdf717 + a53251cdf717 transplanted to ffd6818a3975 + $ hg log --template '{rev} {parents} {desc}\n' + 7 b3 + 6 b2 + 5 1:d11e3596cc1a b1 + 4 b3 + 3 b2 + 2 0:17ab29e464c6 b1 + 1 r2 + 0 r1 + + $ hg clone ../t ../prune + updating to branch default + 4 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../prune + + $ hg up -C 1 + 1 files updated, 0 files merged, 3 files removed, 0 files unresolved + +rebase b onto r1, skipping b2 + + $ hg transplant -a -b tip -p 3 + applying 37a1297eb21b + 37a1297eb21b transplanted to e234d668f844 + applying a53251cdf717 + a53251cdf717 transplanted to 7275fda4d04f + $ hg log --template '{rev} {parents} {desc}\n' + 6 b3 + 5 1:d11e3596cc1a b1 + 4 b3 + 3 b2 + 2 0:17ab29e464c6 b1 + 1 r2 + 0 r1 + + +remote transplant + + $ hg clone -r 1 ../t ../remote + requesting all changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../remote + $ hg transplant --log -s ../t 2 4 + searching for changes + applying 37a1297eb21b + 37a1297eb21b transplanted to c19cf0ccb069 + applying a53251cdf717 + a53251cdf717 transplanted to f7fe5bf98525 + $ hg log --template '{rev} {parents} {desc}\n' + 3 b3 + (transplanted from a53251cdf717679d1907b289f991534be05c997a) + 2 b1 + (transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21) + 1 r2 + 0 r1 + +skip previous transplants + + $ hg transplant -s ../t -a -b 4 + searching for changes + applying 722f4667af76 + 722f4667af76 transplanted to 47156cd86c0b + $ hg log --template '{rev} {parents} {desc}\n' + 4 b2 + 3 b3 + (transplanted from a53251cdf717679d1907b289f991534be05c997a) + 2 b1 + (transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21) + 1 r2 + 0 r1 + +skip local changes transplanted to the source + + $ echo b4 > b4 + $ hg ci -Amb4 -d '3 0' + adding b4 + $ hg clone ../t ../pullback + updating to branch default + 4 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../pullback + $ hg transplant -s ../remote -a -b tip + searching for changes + applying 4333daefcb15 + 4333daefcb15 transplanted to 5f42c04e07cc + + +remote transplant with pull + + $ hg -R ../t serve -p $HGPORT -d --pid-file=../t.pid + $ cat ../t.pid >> $DAEMON_PIDS + + $ hg clone -r 0 ../t ../rp + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd ../rp + $ hg transplant -s http://localhost:$HGPORT/ 2 4 + searching for changes + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + applying a53251cdf717 + a53251cdf717 transplanted to 8d9279348abb + $ hg log --template '{rev} {parents} {desc}\n' + 2 b3 + 1 b1 + 0 r1 + +transplant --continue + + $ hg init ../tc + $ cd ../tc + $ cat < foo + > foo + > bar + > baz + > EOF + $ echo toremove > toremove + $ hg ci -Amfoo + adding foo + adding toremove + $ cat < foo + > foo2 + > bar2 + > baz2 + > EOF + $ rm toremove + $ echo added > added + $ hg ci -Amfoo2 + adding added + removing toremove + $ echo bar > bar + $ hg ci -Ambar + adding bar + $ echo bar2 >> bar + $ hg ci -mbar2 + $ hg up 0 + 2 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo foobar > foo + $ hg ci -mfoobar + created new head + $ hg transplant 1:3 + applying a1e30dd1b8e7 + patching file foo + Hunk #1 FAILED at 0 + 1 out of 1 hunks FAILED -- saving rejects to file foo.rej + patch failed to apply + abort: Fix up the merge and run hg transplant --continue + +transplant -c shouldn't use an old changeset + + $ hg up -C + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ rm added + $ hg transplant 1 + applying a1e30dd1b8e7 + patching file foo + Hunk #1 FAILED at 0 + 1 out of 1 hunks FAILED -- saving rejects to file foo.rej + patch failed to apply + abort: Fix up the merge and run hg transplant --continue + $ hg transplant --continue + a1e30dd1b8e7 transplanted as f1563cf27039 + $ hg transplant 1:3 + skipping already applied revision 1:a1e30dd1b8e7 + applying 1739ac5f6139 + 1739ac5f6139 transplanted to d649c221319f + applying 0282d5fbbe02 + 0282d5fbbe02 transplanted to 77418277ccb3 + $ hg locate + added + bar + foo + $ cd .. + +Test transplant --merge (issue 1111) +test transplant merge + + $ hg init t1111 + $ cd t1111 + $ echo a > a + $ hg ci -Am adda + adding a + $ echo b >> a + $ hg ci -m appendb + $ echo c >> a + $ hg ci -m appendc + $ hg up -C 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo d >> a + $ hg ci -m appendd + created new head + +tranplant + + $ hg transplant -m 1 + applying 42dc4432fd35 + 1:42dc4432fd35 merged at a9f4acbac129 + $ cd .. + +test transplant into empty repository + + $ hg init empty + $ cd empty + $ hg transplant -s ../t -b tip -a + requesting all changes + adding changesets + adding manifests + adding file changes + added 4 changesets with 4 changes to 4 files + $ cd .. + + +test filter + + $ hg init filter + $ cd filter + $ cat <<'EOF' >test-filter + > #!/bin/sh + > sed 's/r1/r2/' $1 > $1.new + > mv $1.new $1 + > EOF + $ chmod +x test-filter + $ hg transplant -s ../t -b tip -a --filter ./test-filter + filtering .* + applying 17ab29e464c6 + 17ab29e464c6 transplanted to e9ffc54ea104 + filtering .* + applying 37a1297eb21b + 37a1297eb21b transplanted to 348b36d0b6a5 + filtering .* + applying 722f4667af76 + 722f4667af76 transplanted to 0aa6979afb95 + filtering .* + applying a53251cdf717 + a53251cdf717 transplanted to 14f8512272b5 + $ hg log --template '{rev} {parents} {desc}\n' + 3 b3 + 2 b2 + 1 b1 + 0 r2 + $ cd .. + + +test filter with failed patch + + $ cd filter + $ hg up 0 + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ echo foo > b1 + $ hg ci -d '0 0' -Am foo + adding b1 + adding test-filter + created new head + $ hg transplant 1 --filter ./test-filter + filtering .* + applying 348b36d0b6a5 + file b1 already exists + 1 out of 1 hunks FAILED -- saving rejects to file b1.rej + patch failed to apply + abort: Fix up the merge and run hg transplant --continue + $ cd .. + + +test with a win32ext like setup (differing EOLs) + + $ hg init twin1 + $ cd twin1 + $ echo a > a + $ echo b > b + $ echo b >> b + $ hg ci -Am t + adding a + adding b + $ echo a > b + $ echo b >> b + $ hg ci -m changeb + $ cd .. + + $ hg init twin2 + $ cd twin2 + $ echo '[patch]' >> .hg/hgrc + $ echo 'eol = crlf' >> .hg/hgrc + $ python -c "file('b', 'wb').write('b\r\nb\r\n')" + $ hg ci -m addb + nothing changed + $ hg transplant -s ../twin1 tip + applying 2e849d776c17 + 2e849d776c17 transplanted to 589cea8ba85b + $ python -c "print repr(file('b', 'rb').read())" + 'a\r\nb\r\n' + $ cd .. diff -r 3152c978496a -r 00fee6394daf tests/test-verify --- a/tests/test-verify Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -#!/bin/sh - -echo % prepare repo -hg init a -cd a -echo "some text" > FOO.txt -echo "another text" > bar.txt -echo "more text" > QUICK.txt -hg add -hg ci -mtest1 - -echo -echo % verify -hg verify - -echo -echo % verify with journal -touch .hg/store/journal -hg verify -rm .hg/store/journal - -echo -echo % introduce some bugs in repo -cd .hg/store/data -mv _f_o_o.txt.i X_f_o_o.txt.i -mv bar.txt.i xbar.txt.i -rm _q_u_i_c_k.txt.i - -echo -echo % verify -hg verify - -cd .. - -echo % test revlog corruption -hg init b -cd b - -touch a -hg add a -hg ci -m a - -echo 'corrupted' > b -dd if=.hg/store/data/a.i of=start bs=1 count=20 2>/dev/null -cat start b > .hg/store/data/a.i - -echo -echo % verify -hg verify - -exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-verify.out --- a/tests/test-verify.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -% prepare repo -adding FOO.txt -adding QUICK.txt -adding bar.txt - -% verify -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -3 files, 1 changesets, 3 total revisions - -% verify with journal -abandoned transaction found - run hg recover -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files -3 files, 1 changesets, 3 total revisions - -% introduce some bugs in repo - -% verify -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files - data/FOO.txt.i@0: missing revlog! - 0: empty or missing FOO.txt - FOO.txt@0: f62022d3d590 in manifests not found - data/QUICK.txt.i@0: missing revlog! - 0: empty or missing QUICK.txt - QUICK.txt@0: 88b857db8eba in manifests not found - data/bar.txt.i@0: missing revlog! - 0: empty or missing bar.txt - bar.txt@0: 256559129457 in manifests not found -3 files, 1 changesets, 0 total revisions -9 integrity errors encountered! -(first damaged changeset appears to be 0) -% test revlog corruption - -% verify -checking changesets -checking manifests -crosschecking files in changesets and manifests -checking files - a@0: broken revlog! (index data/a.i is corrupted) -warning: orphan revlog 'data/a.i' -1 files, 1 changesets, 0 total revisions -1 warnings encountered! -1 integrity errors encountered! -(first damaged changeset appears to be 0) diff -r 3152c978496a -r 00fee6394daf tests/test-verify.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-verify.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,87 @@ +prepare repo + + $ hg init a + $ cd a + $ echo "some text" > FOO.txt + $ echo "another text" > bar.txt + $ echo "more text" > QUICK.txt + $ hg add + adding FOO.txt + adding QUICK.txt + adding bar.txt + $ hg ci -mtest1 + +verify + + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 3 files, 1 changesets, 3 total revisions + +verify with journal + + $ touch .hg/store/journal + $ hg verify + abandoned transaction found - run hg recover + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + 3 files, 1 changesets, 3 total revisions + $ rm .hg/store/journal + +introduce some bugs in repo + + $ cd .hg/store/data + $ mv _f_o_o.txt.i X_f_o_o.txt.i + $ mv bar.txt.i xbar.txt.i + $ rm _q_u_i_c_k.txt.i + + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + data/FOO.txt.i@0: missing revlog! + 0: empty or missing FOO.txt + FOO.txt@0: f62022d3d590 in manifests not found + data/QUICK.txt.i@0: missing revlog! + 0: empty or missing QUICK.txt + QUICK.txt@0: 88b857db8eba in manifests not found + data/bar.txt.i@0: missing revlog! + 0: empty or missing bar.txt + bar.txt@0: 256559129457 in manifests not found + 3 files, 1 changesets, 0 total revisions + 9 integrity errors encountered! + (first damaged changeset appears to be 0) + + $ cd .. + +test revlog corruption + + $ hg init b + $ cd b + + $ touch a + $ hg add a + $ hg ci -m a + + $ echo 'corrupted' > b + $ dd if=.hg/store/data/a.i of=start bs=1 count=20 2>/dev/null + $ cat start b > .hg/store/data/a.i + + $ hg verify + checking changesets + checking manifests + crosschecking files in changesets and manifests + checking files + a@0: broken revlog! (index data/a.i is corrupted) + warning: orphan revlog 'data/a.i' + 1 files, 1 changesets, 0 total revisions + 1 warnings encountered! + 1 integrity errors encountered! + (first damaged changeset appears to be 0) + + $ exit 0 diff -r 3152c978496a -r 00fee6394daf tests/test-walk --- a/tests/test-walk Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -#!/bin/sh - -debugwalk() -{ - echo "hg debugwalk $@" - hg debugwalk "$@" - echo -} - -chdir() -{ - echo "cd $@" - cd "$@" - echo -} - -mkdir t -cd t -hg init -mkdir -p beans -for b in kidney navy turtle borlotti black pinto; do - echo $b > beans/$b -done -mkdir -p mammals/Procyonidae -for m in cacomistle coatimundi raccoon; do - echo $m > mammals/Procyonidae/$m -done -echo skunk > mammals/skunk -echo fennel > fennel -echo fenugreek > fenugreek -echo fiddlehead > fiddlehead -echo glob:glob > glob:glob -hg addremove -hg commit -m "commit #0" -d "1000000 0" -debugwalk -debugwalk -I. -chdir mammals -debugwalk -debugwalk -X ../beans -debugwalk -I '*k' -debugwalk -I 'glob:*k' -debugwalk -I 'relglob:*k' -debugwalk -I 'relglob:*k' . -debugwalk -I 're:.*k$' -debugwalk -I 'relre:.*k$' -debugwalk -I 'path:beans' -debugwalk -I 'relpath:../beans' -debugwalk . -debugwalk -I. -debugwalk Procyonidae -chdir Procyonidae -debugwalk . -debugwalk .. -chdir .. -debugwalk ../beans -debugwalk . -debugwalk .hg -debugwalk ../.hg -chdir .. -debugwalk -Ibeans -debugwalk -I '{*,{b,m}*/*}k' -debugwalk 'glob:mammals/../beans/b*' -debugwalk '-X*/Procyonidae' mammals -debugwalk path:mammals -debugwalk .. -debugwalk beans/../.. -debugwalk .hg -debugwalk beans/../.hg -debugwalk beans/../.hg/data -debugwalk beans/.hg -# Don't know how to test absolute paths without always getting a false -# error. -#debugwalk `pwd`/beans -#debugwalk `pwd`/.. -debugwalk glob:\* -debugwalk 'glob:**e' -debugwalk 're:.*[kb]$' -debugwalk path:beans/black -debugwalk path:beans//black -debugwalk relglob:Procyonidae -debugwalk 'relglob:Procyonidae/**' -debugwalk 'relglob:Procyonidae/**' fennel -debugwalk beans 'glob:beans/*' -debugwalk 'glob:mamm**' -debugwalk 'glob:mamm**' fennel -debugwalk 'glob:j*' -debugwalk NOEXIST -mkfifo fifo -debugwalk fifo -rm fenugreek -debugwalk fenugreek -hg rm fenugreek -debugwalk fenugreek -touch new -debugwalk new - -mkdir ignored -touch ignored/file -echo '^ignored$' > .hgignore -debugwalk ignored -debugwalk ignored/file - -chdir .. -debugwalk -R t t/mammals/skunk -mkdir t2 -chdir t2 -debugwalk -R ../t ../t/mammals/skunk -debugwalk --cwd ../t mammals/skunk diff -r 3152c978496a -r 00fee6394daf tests/test-walk.out --- a/tests/test-walk.out Thu Aug 12 18:10:42 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,303 +0,0 @@ -adding beans/black -adding beans/borlotti -adding beans/kidney -adding beans/navy -adding beans/pinto -adding beans/turtle -adding fennel -adding fenugreek -adding fiddlehead -adding glob:glob -adding mammals/Procyonidae/cacomistle -adding mammals/Procyonidae/coatimundi -adding mammals/Procyonidae/raccoon -adding mammals/skunk -hg debugwalk -f beans/black beans/black -f beans/borlotti beans/borlotti -f beans/kidney beans/kidney -f beans/navy beans/navy -f beans/pinto beans/pinto -f beans/turtle beans/turtle -f fennel fennel -f fenugreek fenugreek -f fiddlehead fiddlehead -f glob:glob glob:glob -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon -f mammals/skunk mammals/skunk - -hg debugwalk -I. -f beans/black beans/black -f beans/borlotti beans/borlotti -f beans/kidney beans/kidney -f beans/navy beans/navy -f beans/pinto beans/pinto -f beans/turtle beans/turtle -f fennel fennel -f fenugreek fenugreek -f fiddlehead fiddlehead -f glob:glob glob:glob -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon -f mammals/skunk mammals/skunk - -cd mammals - -hg debugwalk -f beans/black ../beans/black -f beans/borlotti ../beans/borlotti -f beans/kidney ../beans/kidney -f beans/navy ../beans/navy -f beans/pinto ../beans/pinto -f beans/turtle ../beans/turtle -f fennel ../fennel -f fenugreek ../fenugreek -f fiddlehead ../fiddlehead -f glob:glob ../glob:glob -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon -f mammals/skunk skunk - -hg debugwalk -X ../beans -f fennel ../fennel -f fenugreek ../fenugreek -f fiddlehead ../fiddlehead -f glob:glob ../glob:glob -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon -f mammals/skunk skunk - -hg debugwalk -I *k -f mammals/skunk skunk - -hg debugwalk -I glob:*k -f mammals/skunk skunk - -hg debugwalk -I relglob:*k -f beans/black ../beans/black -f fenugreek ../fenugreek -f mammals/skunk skunk - -hg debugwalk -I relglob:*k . -f mammals/skunk skunk - -hg debugwalk -I re:.*k$ -f beans/black ../beans/black -f fenugreek ../fenugreek -f mammals/skunk skunk - -hg debugwalk -I relre:.*k$ -f beans/black ../beans/black -f fenugreek ../fenugreek -f mammals/skunk skunk - -hg debugwalk -I path:beans -f beans/black ../beans/black -f beans/borlotti ../beans/borlotti -f beans/kidney ../beans/kidney -f beans/navy ../beans/navy -f beans/pinto ../beans/pinto -f beans/turtle ../beans/turtle - -hg debugwalk -I relpath:../beans -f beans/black ../beans/black -f beans/borlotti ../beans/borlotti -f beans/kidney ../beans/kidney -f beans/navy ../beans/navy -f beans/pinto ../beans/pinto -f beans/turtle ../beans/turtle - -hg debugwalk . -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon -f mammals/skunk skunk - -hg debugwalk -I. -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon -f mammals/skunk skunk - -hg debugwalk Procyonidae -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon - -cd Procyonidae - -hg debugwalk . -f mammals/Procyonidae/cacomistle cacomistle -f mammals/Procyonidae/coatimundi coatimundi -f mammals/Procyonidae/raccoon raccoon - -hg debugwalk .. -f mammals/Procyonidae/cacomistle cacomistle -f mammals/Procyonidae/coatimundi coatimundi -f mammals/Procyonidae/raccoon raccoon -f mammals/skunk ../skunk - -cd .. - -hg debugwalk ../beans -f beans/black ../beans/black -f beans/borlotti ../beans/borlotti -f beans/kidney ../beans/kidney -f beans/navy ../beans/navy -f beans/pinto ../beans/pinto -f beans/turtle ../beans/turtle - -hg debugwalk . -f mammals/Procyonidae/cacomistle Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi Procyonidae/coatimundi -f mammals/Procyonidae/raccoon Procyonidae/raccoon -f mammals/skunk skunk - -hg debugwalk .hg -abort: path 'mammals/.hg' is inside repo 'mammals' - -hg debugwalk ../.hg -abort: path contains illegal component: .hg - -cd .. - -hg debugwalk -Ibeans -f beans/black beans/black -f beans/borlotti beans/borlotti -f beans/kidney beans/kidney -f beans/navy beans/navy -f beans/pinto beans/pinto -f beans/turtle beans/turtle - -hg debugwalk -I {*,{b,m}*/*}k -f beans/black beans/black -f fenugreek fenugreek -f mammals/skunk mammals/skunk - -hg debugwalk glob:mammals/../beans/b* -f beans/black beans/black -f beans/borlotti beans/borlotti - -hg debugwalk -X*/Procyonidae mammals -f mammals/skunk mammals/skunk - -hg debugwalk path:mammals -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon -f mammals/skunk mammals/skunk - -hg debugwalk .. -abort: .. not under root - -hg debugwalk beans/../.. -abort: beans/../.. not under root - -hg debugwalk .hg -abort: path contains illegal component: .hg - -hg debugwalk beans/../.hg -abort: path contains illegal component: .hg - -hg debugwalk beans/../.hg/data -abort: path contains illegal component: .hg/data - -hg debugwalk beans/.hg -abort: path 'beans/.hg' is inside repo 'beans' - -hg debugwalk glob:* -f fennel fennel -f fenugreek fenugreek -f fiddlehead fiddlehead -f glob:glob glob:glob - -hg debugwalk glob:**e -f beans/turtle beans/turtle -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle - -hg debugwalk re:.*[kb]$ -f beans/black beans/black -f fenugreek fenugreek -f glob:glob glob:glob -f mammals/skunk mammals/skunk - -hg debugwalk path:beans/black -f beans/black beans/black exact - -hg debugwalk path:beans//black -f beans/black beans/black exact - -hg debugwalk relglob:Procyonidae - -hg debugwalk relglob:Procyonidae/** -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon - -hg debugwalk relglob:Procyonidae/** fennel -f fennel fennel exact -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon - -hg debugwalk beans glob:beans/* -f beans/black beans/black -f beans/borlotti beans/borlotti -f beans/kidney beans/kidney -f beans/navy beans/navy -f beans/pinto beans/pinto -f beans/turtle beans/turtle - -hg debugwalk glob:mamm** -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon -f mammals/skunk mammals/skunk - -hg debugwalk glob:mamm** fennel -f fennel fennel exact -f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle -f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi -f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon -f mammals/skunk mammals/skunk - -hg debugwalk glob:j* - -hg debugwalk NOEXIST -NOEXIST: No such file or directory - -hg debugwalk fifo -fifo: unsupported file type (type is fifo) - -hg debugwalk fenugreek -f fenugreek fenugreek exact - -hg debugwalk fenugreek -f fenugreek fenugreek exact - -hg debugwalk new -f new new exact - -hg debugwalk ignored - -hg debugwalk ignored/file -f ignored/file ignored/file exact - -cd .. - -hg debugwalk -R t t/mammals/skunk -f mammals/skunk t/mammals/skunk exact - -cd t2 - -hg debugwalk -R ../t ../t/mammals/skunk -f mammals/skunk ../t/mammals/skunk exact - -hg debugwalk --cwd ../t mammals/skunk -f mammals/skunk mammals/skunk exact - diff -r 3152c978496a -r 00fee6394daf tests/test-walk.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-walk.t Thu Aug 12 18:08:52 2010 -0500 @@ -0,0 +1,284 @@ + $ mkdir t + $ cd t + $ hg init + $ mkdir -p beans + $ for b in kidney navy turtle borlotti black pinto; do + > echo $b > beans/$b + $ done + $ mkdir -p mammals/Procyonidae + $ for m in cacomistle coatimundi raccoon; do + > echo $m > mammals/Procyonidae/$m + $ done + $ echo skunk > mammals/skunk + $ echo fennel > fennel + $ echo fenugreek > fenugreek + $ echo fiddlehead > fiddlehead + $ echo glob:glob > glob:glob + $ hg addremove + adding beans/black + adding beans/borlotti + adding beans/kidney + adding beans/navy + adding beans/pinto + adding beans/turtle + adding fennel + adding fenugreek + adding fiddlehead + adding glob:glob + adding mammals/Procyonidae/cacomistle + adding mammals/Procyonidae/coatimundi + adding mammals/Procyonidae/raccoon + adding mammals/skunk + $ hg commit -m "commit #0" -d "1000000 0" + + $ hg debugwalk + f beans/black beans/black + f beans/borlotti beans/borlotti + f beans/kidney beans/kidney + f beans/navy beans/navy + f beans/pinto beans/pinto + f beans/turtle beans/turtle + f fennel fennel + f fenugreek fenugreek + f fiddlehead fiddlehead + f glob:glob glob:glob + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + f mammals/skunk mammals/skunk + $ hg debugwalk -I. + f beans/black beans/black + f beans/borlotti beans/borlotti + f beans/kidney beans/kidney + f beans/navy beans/navy + f beans/pinto beans/pinto + f beans/turtle beans/turtle + f fennel fennel + f fenugreek fenugreek + f fiddlehead fiddlehead + f glob:glob glob:glob + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + f mammals/skunk mammals/skunk + + $ cd mammals + $ hg debugwalk + f beans/black ../beans/black + f beans/borlotti ../beans/borlotti + f beans/kidney ../beans/kidney + f beans/navy ../beans/navy + f beans/pinto ../beans/pinto + f beans/turtle ../beans/turtle + f fennel ../fennel + f fenugreek ../fenugreek + f fiddlehead ../fiddlehead + f glob:glob ../glob:glob + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + f mammals/skunk skunk + $ hg debugwalk -X ../beans + f fennel ../fennel + f fenugreek ../fenugreek + f fiddlehead ../fiddlehead + f glob:glob ../glob:glob + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + f mammals/skunk skunk + $ hg debugwalk -I '*k' + f mammals/skunk skunk + $ hg debugwalk -I 'glob:*k' + f mammals/skunk skunk + $ hg debugwalk -I 'relglob:*k' + f beans/black ../beans/black + f fenugreek ../fenugreek + f mammals/skunk skunk + $ hg debugwalk -I 'relglob:*k' . + f mammals/skunk skunk + $ hg debugwalk -I 're:.*k$' + f beans/black ../beans/black + f fenugreek ../fenugreek + f mammals/skunk skunk + $ hg debugwalk -I 'relre:.*k$' + f beans/black ../beans/black + f fenugreek ../fenugreek + f mammals/skunk skunk + $ hg debugwalk -I 'path:beans' + f beans/black ../beans/black + f beans/borlotti ../beans/borlotti + f beans/kidney ../beans/kidney + f beans/navy ../beans/navy + f beans/pinto ../beans/pinto + f beans/turtle ../beans/turtle + $ hg debugwalk -I 'relpath:../beans' + f beans/black ../beans/black + f beans/borlotti ../beans/borlotti + f beans/kidney ../beans/kidney + f beans/navy ../beans/navy + f beans/pinto ../beans/pinto + f beans/turtle ../beans/turtle + $ hg debugwalk . + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + f mammals/skunk skunk + $ hg debugwalk -I. + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + f mammals/skunk skunk + $ hg debugwalk Procyonidae + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + + $ cd Procyonidae + $ hg debugwalk . + f mammals/Procyonidae/cacomistle cacomistle + f mammals/Procyonidae/coatimundi coatimundi + f mammals/Procyonidae/raccoon raccoon + $ hg debugwalk .. + f mammals/Procyonidae/cacomistle cacomistle + f mammals/Procyonidae/coatimundi coatimundi + f mammals/Procyonidae/raccoon raccoon + f mammals/skunk ../skunk + $ cd .. + + $ hg debugwalk ../beans + f beans/black ../beans/black + f beans/borlotti ../beans/borlotti + f beans/kidney ../beans/kidney + f beans/navy ../beans/navy + f beans/pinto ../beans/pinto + f beans/turtle ../beans/turtle + $ hg debugwalk . + f mammals/Procyonidae/cacomistle Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi Procyonidae/coatimundi + f mammals/Procyonidae/raccoon Procyonidae/raccoon + f mammals/skunk skunk + $ hg debugwalk .hg + abort: path 'mammals/.hg' is inside repo 'mammals' + $ hg debugwalk ../.hg + abort: path contains illegal component: .hg + $ cd .. + + $ hg debugwalk -Ibeans + f beans/black beans/black + f beans/borlotti beans/borlotti + f beans/kidney beans/kidney + f beans/navy beans/navy + f beans/pinto beans/pinto + f beans/turtle beans/turtle + $ hg debugwalk -I '{*,{b,m}*/*}k' + f beans/black beans/black + f fenugreek fenugreek + f mammals/skunk mammals/skunk + $ hg debugwalk 'glob:mammals/../beans/b*' + f beans/black beans/black + f beans/borlotti beans/borlotti + $ hg debugwalk '-X*/Procyonidae' mammals + f mammals/skunk mammals/skunk + $ hg debugwalk path:mammals + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + f mammals/skunk mammals/skunk + $ hg debugwalk .. + abort: .. not under root + $ hg debugwalk beans/../.. + abort: beans/../.. not under root + $ hg debugwalk .hg + abort: path contains illegal component: .hg + $ hg debugwalk beans/../.hg + abort: path contains illegal component: .hg + $ hg debugwalk beans/../.hg/data + abort: path contains illegal component: .hg/data + $ hg debugwalk beans/.hg + abort: path 'beans/.hg' is inside repo 'beans' + +Don't know how to test absolute paths without always getting a false +error. +# hg debugwalk `pwd`/beans +# hg debugwalk `pwd`/.. + + $ hg debugwalk glob:\* + f fennel fennel + f fenugreek fenugreek + f fiddlehead fiddlehead + f glob:glob glob:glob + $ hg debugwalk 'glob:**e' + f beans/turtle beans/turtle + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + $ hg debugwalk 're:.*[kb]$' + f beans/black beans/black + f fenugreek fenugreek + f glob:glob glob:glob + f mammals/skunk mammals/skunk + $ hg debugwalk path:beans/black + f beans/black beans/black exact + $ hg debugwalk path:beans//black + f beans/black beans/black exact + $ hg debugwalk relglob:Procyonidae + $ hg debugwalk 'relglob:Procyonidae/**' + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + $ hg debugwalk 'relglob:Procyonidae/**' fennel + f fennel fennel exact + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + $ hg debugwalk beans 'glob:beans/*' + f beans/black beans/black + f beans/borlotti beans/borlotti + f beans/kidney beans/kidney + f beans/navy beans/navy + f beans/pinto beans/pinto + f beans/turtle beans/turtle + $ hg debugwalk 'glob:mamm**' + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + f mammals/skunk mammals/skunk + $ hg debugwalk 'glob:mamm**' fennel + f fennel fennel exact + f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle + f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi + f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon + f mammals/skunk mammals/skunk + $ hg debugwalk 'glob:j*' + $ hg debugwalk NOEXIST + NOEXIST: No such file or directory + + $ mkfifo fifo + $ hg debugwalk fifo + fifo: unsupported file type (type is fifo) + + $ rm fenugreek + $ hg debugwalk fenugreek + f fenugreek fenugreek exact + $ hg rm fenugreek + $ hg debugwalk fenugreek + f fenugreek fenugreek exact + $ touch new + $ hg debugwalk new + f new new exact + + $ mkdir ignored + $ touch ignored/file + $ echo '^ignored$' > .hgignore + $ hg debugwalk ignored + $ hg debugwalk ignored/file + f ignored/file ignored/file exact + + $ cd .. + $ hg debugwalk -R t t/mammals/skunk + f mammals/skunk t/mammals/skunk exact + $ mkdir t2 + $ cd t2 + $ hg debugwalk -R ../t ../t/mammals/skunk + f mammals/skunk ../t/mammals/skunk exact + $ hg debugwalk --cwd ../t mammals/skunk + f mammals/skunk mammals/skunk exact