Mercurial > hg-stable
changeset 20011:cb466830826a stable
merge with i18n
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 16 Nov 2013 12:34:05 -0500 |
parents | 2802bedbd45f (diff) 84755bf59469 (current diff) |
children | a1d88278beff 28445179df90 0c1682560db6 |
files | |
diffstat | 22 files changed, 231 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/contrib/check-code.py Mon Nov 04 10:52:41 2013 -0200 +++ b/contrib/check-code.py Sat Nov 16 12:34:05 2013 -0500 @@ -26,8 +26,25 @@ return re.compile(pat) def repquote(m): - t = re.sub(r"\w", "x", m.group('text')) - t = re.sub(r"[^\s\nx]", "o", t) + fromc = '.:' + tochr = 'pq' + def encodechr(i): + if i > 255: + return 'u' + c = chr(i) + if c in ' \n': + return c + if c.isalpha(): + return 'x' + if c.isdigit(): + return 'n' + try: + return tochr[fromc.find(c)] + except (ValueError, IndexError): + return 'o' + t = m.group('text') + tt = ''.join(encodechr(i) for i in xrange(256)) + t = t.translate(tt) return m.group('quote') + t + m.group('quote') def reppython(m): @@ -263,6 +280,7 @@ ], # warnings [ + (r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"), ] ] @@ -449,6 +467,8 @@ else: p, msg = pat ignore = None + if i >= nerrs: + msg = "warning: " + msg pos = 0 n = 0 @@ -482,8 +502,7 @@ bl, bu, br = blamecache[n] if bl == l: bd = '%s@%s' % (bu, br) - if i >= nerrs: - msg = "warning: " + msg + errors.append((f, lineno and n + 1, l, msg, bd)) result = False
--- a/hgext/eol.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/eol.py Sat Nov 16 12:34:05 2013 -0500 @@ -49,6 +49,7 @@ native = LF .. note:: + The rules will first apply when files are touched in the working copy, e.g. by updating to null and back to tip to touch all files.
--- a/hgext/keyword.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/keyword.py Sat Nov 16 12:34:05 2013 -0500 @@ -53,6 +53,7 @@ svn = True .. note:: + The more specific you are in your filename patterns the less you lose speed in huge repositories.
--- a/hgext/mq.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/mq.py Sat Nov 16 12:34:05 2013 -0500 @@ -2622,6 +2622,7 @@ With arguments, set guards for the named patch. .. note:: + Specifying negative guards now requires '--'. To set guards on another patch::
--- a/hgext/rebase.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/rebase.py Sat Nov 16 12:34:05 2013 -0500 @@ -346,6 +346,9 @@ commitmsg = ui.edit(commitmsg, repo.ui.username()) newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg, extrafn=extrafn, editor=editor) + for oldrev in state.iterkeys(): + if state[oldrev] > nullmerge: + state[oldrev] = newrev if 'qtip' in repo.tags(): updatemq(repo, state, skipped, **opts) @@ -689,7 +692,7 @@ def abort(repo, originalwd, target, state): 'Restore the repository to its original state' - dstates = [s for s in state.values() if s != nullrev] + dstates = [s for s in state.values() if s > nullrev] immutable = [d for d in dstates if not repo[d].mutable()] cleanup = True if immutable:
--- a/hgext/share.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/share.py Sat Nov 16 12:34:05 2013 -0500 @@ -17,6 +17,7 @@ history with another repository. .. note:: + using rollback or extensions that destroy/modify history (mq, rebase, etc.) can cause considerable confusion with shared clones. In particular, if two shared clones are both updated to
--- a/hgext/strip.py Mon Nov 04 10:52:41 2013 -0200 +++ b/hgext/strip.py Sat Nov 16 12:34:05 2013 -0500 @@ -51,7 +51,9 @@ if update: checklocalchanges(repo, force=force) urev, p2 = repo.changelog.parents(revs[0]) - if p2 != nullid and p2 in [x.node for x in repo.mq.applied]: + if (util.safehasattr(repo, 'mq') and + p2 != nullid + and p2 in [x.node for x in repo.mq.applied]): urev = p2 hg.clean(repo, urev) repo.dirstate.write()
--- a/mercurial/commands.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/commands.py Sat Nov 16 12:34:05 2013 -0500 @@ -397,6 +397,7 @@ changes and the merged result is left uncommitted. .. note:: + backout cannot be used to fix either an unwanted or incorrect merge. @@ -937,6 +938,7 @@ """set or show the current branch name .. note:: + Branch names are permanent and global. Use :hg:`bookmark` to create a light-weight bookmark instead. See :hg:`help glossary` for more information about named branches and bookmarks. @@ -2707,6 +2709,7 @@ Differences between files are shown using the unified diff format. .. note:: + diff may generate unexpected results for merges, as it will default to comparing against the working directory's first parent changeset if no revisions are specified. @@ -2796,6 +2799,7 @@ comment. .. note:: + export may generate unexpected diff output for merge changesets, as it will compare the merge changeset against its first parent only. @@ -2928,6 +2932,7 @@ continued with the -c/--continue option. .. note:: + The -c/--continue option does not reapply earlier options. .. container:: verbose @@ -3979,12 +3984,14 @@ changed files and full commit message are shown. .. note:: + log -p/--patch may generate unexpected diff output for merge changesets, as it will only compare the merge changeset against its first parent. Also, only files different from BOTH parents will appear in files:. .. note:: + for performance reasons, log FILE may omit duplicate changes made on branches and will not show deletions. To see all changes including duplicates and deletions, use the --removed @@ -4652,6 +4659,7 @@ only create a new branch without forcing other changes. .. note:: + Extra care should be taken with the -f/--force option, which will push all new heads on all branches, an action which will almost always cause confusion for collaborators. @@ -4976,6 +4984,7 @@ """restore files to their checkout state .. note:: + To check out earlier revisions, you should use :hg:`update REV`. To cancel an uncommitted merge (and lose your changes), use :hg:`update --clean .`. @@ -5306,6 +5315,7 @@ unless explicitly requested with -u/--unknown or -i/--ignored. .. note:: + status may appear to disagree with diff if permissions have changed or a merge has occurred. The standard diff format does not report permission changes and diff only reports changes
--- a/mercurial/hgweb/webcommands.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/hgweb/webcommands.py Sat Nov 16 12:34:05 2013 -0500 @@ -151,9 +151,9 @@ yield web.repo[r] searchfuncs = { - MODE_REVISION: (revsearch, _('exact revision search')), - MODE_KEYWORD: (keywordsearch, _('literal keyword search')), - MODE_REVSET: (revsetsearch, _('revset expression search')), + MODE_REVISION: (revsearch, 'exact revision search'), + MODE_KEYWORD: (keywordsearch, 'literal keyword search'), + MODE_REVSET: (revsetsearch, 'revset expression search'), } def getsearchmode(query):
--- a/mercurial/merge.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/merge.py Sat Nov 16 12:34:05 2013 -0500 @@ -384,7 +384,7 @@ return actions def actionkey(a): - return a[1] == "r" and -1 or 0, a + return a[1] in "rf" and -1 or 0, a def getremove(repo, mctx, overwrite, args): """apply usually-non-interactive updates to the working directory
--- a/mercurial/minirst.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/minirst.py Sat Nov 16 12:34:05 2013 -0500 @@ -106,6 +106,12 @@ # Partially minimized form: remove space and both # colons. blocks[i]['lines'][-1] = blocks[i]['lines'][-1][:-3] + elif len(blocks[i]['lines']) == 1 and \ + blocks[i]['lines'][0].lstrip(' ').startswith('.. ') and \ + blocks[i]['lines'][0].find(' ', 3) == -1: + # directive on its onw line, not a literal block + i += 1 + continue else: # Fully minimized form: remove just one colon. blocks[i]['lines'][-1] = blocks[i]['lines'][-1][:-1] @@ -375,6 +381,9 @@ if (blocks[i]['type'] == blocks[i - 1]['type'] and blocks[i]['type'] in ('bullet', 'option', 'field')): i += 1 + elif not blocks[i - 1]['lines']: + # no lines in previous block, do not seperate + i += 1 else: blocks.insert(i, dict(lines=[''], indent=0, type='margin')) i += 2 @@ -447,6 +456,8 @@ indent = ' ' * block['indent'] if block['type'] == 'admonition': admonition = _admonitiontitles[block['admonitiontitle']] + if not block['lines']: + return indent + admonition + '\n' hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip()) defindent = indent + hang * ' ' @@ -625,9 +636,9 @@ blocks = splitparagraphs(blocks) blocks = updatefieldlists(blocks) blocks = updateoptionlists(blocks) + blocks = findadmonitions(blocks) blocks = addmargins(blocks) blocks = prunecomments(blocks) - blocks = findadmonitions(blocks) return blocks, pruned def formatblocks(blocks, width):
--- a/mercurial/phases.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/phases.py Sat Nov 16 12:34:05 2013 -0500 @@ -185,6 +185,8 @@ # be replaced without us being notified. if rev == nullrev: return public + if rev < nullrev: + raise ValueError(_('cannot lookup negative revision')) if self._phaserevs is None or rev >= len(self._phaserevs): self._phaserevs = self.getphaserevs(repo, rebuild=True) return self._phaserevs[rev]
--- a/mercurial/util.py Mon Nov 04 10:52:41 2013 -0200 +++ b/mercurial/util.py Sat Nov 16 12:34:05 2013 -0500 @@ -563,7 +563,7 @@ lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9'''.split() _winreservedchars = ':*?"<>|' def checkwinfilename(path): - '''Check that the base-relative path is a valid filename on Windows. + r'''Check that the base-relative path is a valid filename on Windows. Returns None if the path is ok, or a UI string describing the problem. >>> checkwinfilename("just/a/normal/path") @@ -577,11 +577,19 @@ >>> checkwinfilename("foo/bar/bla:.txt") "filename contains ':', which is reserved on Windows" >>> checkwinfilename("foo/bar/b\07la.txt") - "filename contains '\\\\x07', which is invalid on Windows" + "filename contains '\\x07', which is invalid on Windows" >>> checkwinfilename("foo/bar/bla ") "filename ends with ' ', which is not allowed on Windows" >>> checkwinfilename("../bar") + >>> checkwinfilename("foo\\") + "filename ends with '\\', which is invalid on Windows" + >>> checkwinfilename("foo\\/bar") + "directory name ends with '\\', which is invalid on Windows" ''' + if path.endswith('\\'): + return _("filename ends with '\\', which is invalid on Windows") + if '\\/' in path: + return _("directory name ends with '\\', which is invalid on Windows") for n in path.replace('\\', '/').split('/'): if not n: continue
--- a/tests/test-add.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-add.t Sat Nov 16 12:34:05 2013 -0500 @@ -136,5 +136,23 @@ M a A c ? a.orig + $ hg up -C + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + +forget and get should have the right order: added but missing dir should be +forgotten before file with same name is added + + $ echo file d > d + $ hg add d + $ hg ci -md + $ hg rm d + $ mkdir d + $ echo a > d/a + $ hg add d/a + $ rm -r d + $ hg up -C + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cat d + file d $ cd ..
--- a/tests/test-check-code.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-check-code.t Sat Nov 16 12:34:05 2013 -0500 @@ -185,12 +185,20 @@ $ cat > warning.t <<EOF > $ function warnonly { > > } + > $ diff -N aaa + > $ function onwarn {} > EOF $ "$check_code" warning.t $ "$check_code" --warn warning.t warning.t:1: > $ function warnonly { warning: don't use 'function', use old style + warning.t:3: + > $ diff -N aaa + warning: don't use 'diff -N' + warning.t:4: + > $ function onwarn {} + warning: don't use 'function', use old style [1] $ cat > raise-format.py <<EOF > raise SomeException, message @@ -204,3 +212,42 @@ don't use old-style two-argument raise, use Exception(message) [1] + $ cat > rst.py <<EOF + > """problematic rst text + > + > .. note:: + > wrong + > """ + > + > ''' + > + > .. note:: + > + > valid + > + > new text + > + > .. note:: + > + > also valid + > ''' + > + > """mixed + > + > .. note:: + > + > good + > + > .. note:: + > plus bad + > """ + > EOF + $ $check_code -w rst.py + rst.py:3: + > .. note:: + warning: add two newlines after '.. note::' + rst.py:26: + > .. note:: + warning: add two newlines after '.. note::' + [1] +
--- a/tests/test-commit-amend.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-commit-amend.t Sat Nov 16 12:34:05 2013 -0500 @@ -750,10 +750,8 @@ $ hg branch closewithamend marked working directory as branch closewithamend (branches are permanent and global, did you want a bookmark?) - $ hg ci -Am.. - adding cc.orig - adding obs.py - adding obs.pyc + $ hg add obs.py + $ hg ci -m.. $ hg ci --amend --close-branch -m 'closing' abort: can only close branch heads [255]
--- a/tests/test-extension.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-extension.t Sat Nov 16 12:34:05 2013 -0500 @@ -131,6 +131,13 @@ Check "from __future__ import absolute_import" support for external libraries +#if windows + $ PATHSEP=";" +#else + $ PATHSEP=":" +#endif + $ export PATHSEP + $ mkdir $TESTTMP/libroot $ echo "s = 'libroot/ambig.py'" > $TESTTMP/libroot/ambig.py $ mkdir $TESTTMP/libroot/mod @@ -148,9 +155,9 @@ > def extsetup(): > print 'ambigabs.s=%s' % ambigabs.s > EOF - $ (PYTHONPATH=$PYTHONPATH:$TESTTMP/libroot; hg --config extensions.loadabs=loadabs.py root) + $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}/libroot; hg --config extensions.loadabs=loadabs.py root) ambigabs.s=libroot/ambig.py - $TESTTMP/a + $TESTTMP/a (glob) #endif #if no-py3k @@ -163,9 +170,9 @@ > def extsetup(): > print 'ambigrel.s=%s' % ambigrel.s > EOF - $ (PYTHONPATH=$PYTHONPATH:$TESTTMP/libroot; hg --config extensions.loadrel=loadrel.py root) + $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}/libroot; hg --config extensions.loadrel=loadrel.py root) ambigrel.s=libroot/mod/ambig.py - $TESTTMP/a + $TESTTMP/a (glob) #endif Check absolute/relative import of extension specific modules @@ -220,10 +227,10 @@ (extroot) import extroot: this is extroot.__init__ (extroot) from extroot.bar import s: this is extroot.bar (extroot) import extroot.bar in func(): this is extroot.bar - $TESTTMP/a + $TESTTMP/a (glob) #if no-py3k - $ rm -f $TESTTMP/extroot/foo.* + $ rm "$TESTTMP"/extroot/foo.* $ cat > $TESTTMP/extroot/foo.py <<EOF > # test relative import > buf = [] @@ -256,7 +263,7 @@ (extroot) import sub1: this is extroot.sub1.__init__ (extroot) from bar import s: this is extroot.bar (extroot) import bar in func(): this is extroot.bar - $TESTTMP/a + $TESTTMP/a (glob) #endif $ cd .. @@ -732,59 +739,59 @@ $ echo '# enable extension locally' >> src/.hg/hgrc $ echo "reposetuptest = $TESTTMP/reposetuptest.py" >> src/.hg/hgrc $ hg -R src status - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ hg clone -U src clone-dst1 - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ hg init push-dst1 $ hg -q -R src push push-dst1 - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ hg init pull-src1 $ hg -q -R pull-src1 pull src - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ echo '[extensions]' >> $HGRCPATH $ echo '# disable extension globally and explicitly' >> $HGRCPATH $ echo 'reposetuptest = !' >> $HGRCPATH $ hg clone -U src clone-dst2 - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ hg init push-dst2 $ hg -q -R src push push-dst2 - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ hg init pull-src2 $ hg -q -R pull-src2 pull src - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/src (glob) $ echo '[extensions]' >> $HGRCPATH $ echo '# enable extension globally' >> $HGRCPATH $ echo "reposetuptest = $TESTTMP/reposetuptest.py" >> $HGRCPATH $ hg clone -U src clone-dst3 - reposetup() for $TESTTMP/reposetup-test/src - reposetup() for $TESTTMP/reposetup-test/clone-dst3 + reposetup() for $TESTTMP/reposetup-test/src (glob) + reposetup() for $TESTTMP/reposetup-test/clone-dst3 (glob) $ hg init push-dst3 - reposetup() for $TESTTMP/reposetup-test/push-dst3 + reposetup() for $TESTTMP/reposetup-test/push-dst3 (glob) $ hg -q -R src push push-dst3 - reposetup() for $TESTTMP/reposetup-test/src - reposetup() for $TESTTMP/reposetup-test/push-dst3 + reposetup() for $TESTTMP/reposetup-test/src (glob) + reposetup() for $TESTTMP/reposetup-test/push-dst3 (glob) $ hg init pull-src3 - reposetup() for $TESTTMP/reposetup-test/pull-src3 + reposetup() for $TESTTMP/reposetup-test/pull-src3 (glob) $ hg -q -R pull-src3 pull src - reposetup() for $TESTTMP/reposetup-test/pull-src3 - reposetup() for $TESTTMP/reposetup-test/src + reposetup() for $TESTTMP/reposetup-test/pull-src3 (glob) + reposetup() for $TESTTMP/reposetup-test/src (glob) $ echo '[extensions]' >> src/.hg/hgrc $ echo '# disable extension locally' >> src/.hg/hgrc $ echo 'reposetuptest = !' >> src/.hg/hgrc $ hg clone -U src clone-dst4 - reposetup() for $TESTTMP/reposetup-test/clone-dst4 + reposetup() for $TESTTMP/reposetup-test/clone-dst4 (glob) $ hg init push-dst4 - reposetup() for $TESTTMP/reposetup-test/push-dst4 + reposetup() for $TESTTMP/reposetup-test/push-dst4 (glob) $ hg -q -R src push push-dst4 - reposetup() for $TESTTMP/reposetup-test/push-dst4 + reposetup() for $TESTTMP/reposetup-test/push-dst4 (glob) $ hg init pull-src4 - reposetup() for $TESTTMP/reposetup-test/pull-src4 + reposetup() for $TESTTMP/reposetup-test/pull-src4 (glob) $ hg -q -R pull-src4 pull src - reposetup() for $TESTTMP/reposetup-test/pull-src4 + reposetup() for $TESTTMP/reposetup-test/pull-src4 (glob) disabling in command line overlays with all configuration $ hg --config extensions.reposetuptest=! clone -U src clone-dst5 @@ -827,8 +834,8 @@ $ echo "reposetuptest = $TESTTMP/reposetuptest.py" >> parent/.hg/hgrc $ cp parent/.hg/hgrc parent/sub2/.hg/hgrc $ hg -R parent status -S -A - reposetup() for $TESTTMP/reposetup-test/parent - reposetup() for $TESTTMP/reposetup-test/parent/sub2 + reposetup() for $TESTTMP/reposetup-test/parent (glob) + reposetup() for $TESTTMP/reposetup-test/parent/sub2 (glob) C .hgsub C .hgsubstate C sub1/1
--- a/tests/test-minirst.py Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-minirst.py Sat Nov 16 12:34:05 2013 -0500 @@ -202,6 +202,7 @@ admonitions = """ .. note:: + This is a note - Bullet 1
--- a/tests/test-minirst.py.out Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-minirst.py.out Sat Nov 16 12:34:05 2013 -0500 @@ -683,7 +683,10 @@ html format: ---------------------------------------------------------------------- <p> -<b>Note:</b> This is a note +<b>Note:</b> +</p> +<p> +This is a note </p> <ul> <li> Bullet 1
--- a/tests/test-rebase-abort.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-rebase-abort.t Sat Nov 16 12:34:05 2013 -0500 @@ -181,3 +181,46 @@ $ cd .. + +rebase abort should not leave working copy in a merge state if tip-1 is public +(issue4082) + + $ hg init abortpublic + $ cd abortpublic + $ echo a > a && hg ci -Aqm a + $ hg book master + $ hg book foo + $ echo b > b && hg ci -Aqm b + $ hg up -q master + $ echo c > c && hg ci -Aqm c + $ hg phase -p -r . + $ hg up -q foo + $ echo C > c && hg ci -Aqm C + $ hg log -G --template "{rev} {desc} {bookmarks}" + @ 3 C foo + | + | o 2 c master + | | + o | 1 b + |/ + o 0 a + + + $ hg rebase -d master -r foo + merging c + warning: conflicts during merge. + merging c incomplete! (edit conflicts, then use 'hg resolve --mark') + unresolved conflicts (see hg resolve, then hg rebase --continue) + [1] + $ hg rebase --abort + rebase aborted + $ hg log -G --template "{rev} {desc} {bookmarks}" + @ 3 C foo + | + | o 2 c master + | | + o | 1 b + |/ + o 0 a + + $ cd ..
--- a/tests/test-rebase-collapse.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-rebase-collapse.t Sat Nov 16 12:34:05 2013 -0500 @@ -57,11 +57,11 @@ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob) $ hg tglogp - o 5:secret 'Collapsed revision + @ 5:secret 'Collapsed revision | * B | * C | * D' - @ 4:draft 'H' + o 4:draft 'H' | | o 3:draft 'G' |/| @@ -737,12 +737,13 @@ $ touch b $ hg commit -Am b adding b + $ hg book foo $ hg rebase -d 0 -r "1::2" --collapse -m collapsed saved backup bundle to $TESTTMP/collapseaddremove/.hg/strip-backup/*-backup.hg (glob) - $ hg tglog - o 1: 'collapsed' + $ hg log -G --template "{rev}: '{desc}' {bookmarks}" + @ 1: 'collapsed' foo | - @ 0: 'base' + o 0: 'base' $ hg manifest --rev tip b
--- a/tests/test-rebase-detach.t Mon Nov 04 10:52:41 2013 -0200 +++ b/tests/test-rebase-detach.t Sat Nov 16 12:34:05 2013 -0500 @@ -329,11 +329,11 @@ saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob) $ hg tglog - o 8: 'Collapsed revision + @ 8: 'Collapsed revision | * I | * Merge | * J' - @ 7: 'H' + o 7: 'H' | | o 6: 'G' |/|