# HG changeset patch # User Raphaël Gomès # Date 1620060919 -7200 # Node ID 7431f5ab0d2a42e25f57168f2978c1ee271f4482 # Parent 12450fbea288e1a021e6bbd33f1b6352a9b120fb# Parent 067f2c53fb24506c9e9fb4639871b13b19a85f8a branching: merge stable into default diff -r 12450fbea288 -r 7431f5ab0d2a .hgsigs --- a/.hgsigs Fri Apr 30 02:11:58 2021 +0200 +++ b/.hgsigs Mon May 03 18:55:19 2021 +0200 @@ -208,3 +208,5 @@ 9da65e3cf3706ff41e08b311381c588440c27baf 0 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 diff -r 12450fbea288 -r 7431f5ab0d2a .hgtags --- a/.hgtags Fri Apr 30 02:11:58 2021 +0200 +++ b/.hgtags Mon May 03 18:55:19 2021 +0200 @@ -221,3 +221,5 @@ 9da65e3cf3706ff41e08b311381c588440c27baf 5.7rc0 0e2e7300f4302b02412b0b734717697049494c4c 5.7 d5d9177c0045d206db575bae6daa98e2cb2fe5bc 5.7.1 +f67b8946bb1b6cfa8328dbf8d6a9128b69ccdcb4 5.8rc0 +8d2b62d716b095507effaa8d56f87cd27ba659ab 5.8rc1 diff -r 12450fbea288 -r 7431f5ab0d2a hgext/git/dirstate.py --- a/hgext/git/dirstate.py Fri Apr 30 02:11:58 2021 +0200 +++ b/hgext/git/dirstate.py Mon May 03 18:55:19 2021 +0200 @@ -63,7 +63,7 @@ pygit2.GIT_STATUS_WT_RENAMED: b'a', pygit2.GIT_STATUS_WT_TYPECHANGE: b'n', pygit2.GIT_STATUS_WT_UNREADABLE: b'?', - pygit2.GIT_STATUS_INDEX_MODIFIED | pygit2.GIT_STATUS_WT_MODIFIED: 'm', + pygit2.GIT_STATUS_INDEX_MODIFIED | pygit2.GIT_STATUS_WT_MODIFIED: b'm', } diff -r 12450fbea288 -r 7431f5ab0d2a hgext/git/gitlog.py --- a/hgext/git/gitlog.py Fri Apr 30 02:11:58 2021 +0200 +++ b/hgext/git/gitlog.py Mon May 03 18:55:19 2021 +0200 @@ -65,7 +65,8 @@ def hasnode(self, n): t = self._db.execute( - 'SELECT node FROM changelog WHERE node = ?', (n,) + 'SELECT node FROM changelog WHERE node = ?', + (pycompat.sysstr(n),), ).fetchone() return t is not None @@ -144,7 +145,7 @@ def revs(self, start=0, stop=None): if stop is None: - stop = self.tip() + stop = self.tiprev() t = self._db.execute( 'SELECT rev FROM changelog ' 'WHERE rev >= ? AND rev <= ? ' @@ -156,8 +157,11 @@ def tiprev(self): t = self._db.execute( 'SELECT rev FROM changelog ' 'ORDER BY REV DESC ' 'LIMIT 1' - ) - return next(t) + ).fetchone() + + if t is not None: + return t[0] + return -1 def _partialmatch(self, id): if sha1nodeconstants.wdirhex.startswith(id): @@ -165,7 +169,8 @@ candidates = [ bin(x[0]) for x in self._db.execute( - 'SELECT node FROM changelog WHERE node LIKE ?', (id + b'%',) + 'SELECT node FROM changelog WHERE node LIKE ?', + (pycompat.sysstr(id + b'%'),), ) ] if sha1nodeconstants.nullhex.startswith(id): @@ -213,10 +218,11 @@ n = self.node(nodeorrev) else: n = nodeorrev + extra = {b'branch': b'default'} # handle looking up nullid if n == sha1nodeconstants.nullid: return hgchangelog._changelogrevision( - extra={}, manifest=sha1nodeconstants.nullid + extra=extra, manifest=sha1nodeconstants.nullid ) hn = gitutil.togitnode(n) # We've got a real commit! @@ -233,7 +239,7 @@ for r in self._db.execute( 'SELECT filename FROM changedfiles ' 'WHERE node = ? and filenode = ?', - (hn, sha1nodeconstants.nullhex), + (hn, gitutil.nullgit), ) ] c = self.gitrepo[hn] @@ -247,7 +253,7 @@ filesremoved=filesremoved, description=c.message.encode('utf8'), # TODO do we want to handle extra? how? - extra={b'branch': b'default'}, + extra=extra, ) def ancestors(self, revs, stoprev=0, inclusive=False): diff -r 12450fbea288 -r 7431f5ab0d2a hgext/git/index.py --- a/hgext/git/index.py Fri Apr 30 02:11:58 2021 +0200 +++ b/hgext/git/index.py Mon May 03 18:55:19 2021 +0200 @@ -278,7 +278,7 @@ for pos, commit in enumerate(walker): if prog is not None: prog.update(pos) - p1 = p2 = sha1nodeconstants.nullhex + p1 = p2 = gitutil.nullgit if len(commit.parents) > 2: raise error.ProgrammingError( ( diff -r 12450fbea288 -r 7431f5ab0d2a hgext/phabricator.py --- a/hgext/phabricator.py Fri Apr 30 02:11:58 2021 +0200 +++ b/hgext/phabricator.py Mon May 03 18:55:19 2021 +0200 @@ -403,7 +403,7 @@ def callconduit(ui, name, params): """call Conduit API, params is a dict. return json.loads result, or None""" host, token = readurltoken(ui) - url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo() + url, authinfo = urlutil.url(b'/'.join([host, b'api', name])).authinfo() ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params))) params = params.copy() params[b'__conduit__'] = { diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/dirstateguard.py --- a/mercurial/dirstateguard.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/dirstateguard.py Mon May 03 18:55:19 2021 +0200 @@ -7,11 +7,13 @@ from __future__ import absolute_import +import os from .i18n import _ from . import ( error, narrowspec, + requirements, util, ) @@ -34,13 +36,22 @@ self._repo = repo self._active = False self._closed = False - self._backupname = b'dirstate.backup.%s.%d' % (name, id(self)) - self._narrowspecbackupname = b'narrowspec.backup.%s.%d' % ( - name, - id(self), - ) + + def getname(prefix): + fd, fname = repo.vfs.mkstemp(prefix=prefix) + os.close(fd) + return fname + + self._backupname = getname(b'dirstate.backup.%s.' % name) repo.dirstate.savebackup(repo.currenttransaction(), self._backupname) - narrowspec.savewcbackup(repo, self._narrowspecbackupname) + # Don't make this the empty string, things may join it with stuff and + # blindly try to unlink it, which could be bad. + self._narrowspecbackupname = None + if requirements.NARROW_REQUIREMENT in repo.requirements: + self._narrowspecbackupname = getname( + b'narrowspec.backup.%s.' % name + ) + narrowspec.savewcbackup(repo, self._narrowspecbackupname) self._active = True def __del__(self): @@ -62,12 +73,14 @@ self._repo.dirstate.clearbackup( self._repo.currenttransaction(), self._backupname ) - narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) + if self._narrowspecbackupname: + narrowspec.clearwcbackup(self._repo, self._narrowspecbackupname) self._active = False self._closed = True def _abort(self): - narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) + if self._narrowspecbackupname: + narrowspec.restorewcbackup(self._repo, self._narrowspecbackupname) self._repo.dirstate.restorebackup( self._repo.currenttransaction(), self._backupname ) diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/extensions.py --- a/mercurial/extensions.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/extensions.py Mon May 03 18:55:19 2021 +0200 @@ -930,7 +930,11 @@ def moduleversion(module): '''return version information from given module as a string''' if util.safehasattr(module, b'getversion') and callable(module.getversion): - version = module.getversion() + try: + version = module.getversion() + except Exception: + version = b'unknown' + elif util.safehasattr(module, b'__version__'): version = module.__version__ else: diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/hg.py --- a/mercurial/hg.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/hg.py Mon May 03 18:55:19 2021 +0200 @@ -1273,7 +1273,7 @@ srcs = urlutil.get_pull_paths(repo, ui, [source], opts.get(b'branch')) srcs = list(srcs) if len(srcs) != 1: - msg = _('for now, incoming supports only a single source, %d provided') + msg = _(b'for now, incoming supports only a single source, %d provided') msg %= len(srcs) raise error.Abort(msg) source, branches = srcs[0] diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/mail.py --- a/mercurial/mail.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/mail.py Mon May 03 18:55:19 2021 +0200 @@ -220,6 +220,7 @@ def _mbox(mbox, sender, recipients, msg): '''write mails to mbox''' + # TODO: use python mbox library for proper locking with open(mbox, b'ab+') as fp: # Should be time.asctime(), but Windows prints 2-characters day # of month instead of one. Make them print the same thing. diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/repoview.py --- a/mercurial/repoview.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/repoview.py Mon May 03 18:55:19 2021 +0200 @@ -464,18 +464,24 @@ return delattr(self._unfilteredrepo, attr) -# Python <3.4 easily leaks types via __mro__. See -# https://bugs.python.org/issue17950. We cache dynamically created types -# so they won't be leaked on every invocation of repo.filtered(). +# Dynamically created classes introduce memory cycles via __mro__. See +# https://bugs.python.org/issue17950. +# This need of the garbage collector can turn into memory leak in +# Python <3.4, which is the first version released with PEP 442. _filteredrepotypes = weakref.WeakKeyDictionary() def newtype(base): """Create a new type with the repoview mixin and the given base class""" - if base not in _filteredrepotypes: + ref = _filteredrepotypes.get(base) + if ref is not None: + cls = ref() + if cls is not None: + return cls - class filteredrepo(repoview, base): - pass + class filteredrepo(repoview, base): + pass - _filteredrepotypes[base] = filteredrepo - return _filteredrepotypes[base] + _filteredrepotypes[base] = weakref.ref(filteredrepo) + # do not reread from weakref to be 100% sure not to return None + return filteredrepo diff -r 12450fbea288 -r 7431f5ab0d2a mercurial/upgrade_utils/actions.py --- a/mercurial/upgrade_utils/actions.py Fri Apr 30 02:11:58 2021 +0200 +++ b/mercurial/upgrade_utils/actions.py Mon May 03 18:55:19 2021 +0200 @@ -5,15 +5,13 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -# See https://github.com/google/pytype/issues/860 -# pytype: skip-file - from __future__ import absolute_import from ..i18n import _ from .. import ( error, localrepo, + pycompat, requirements, revlog, util, @@ -21,6 +19,13 @@ from ..utils import compression +if pycompat.TYPE_CHECKING: + from typing import ( + List, + Type, + ) + + # list of requirements that request a clone of all revlog if added/removed RECLONES_REQUIREMENTS = { requirements.GENERALDELTA_REQUIREMENT, @@ -110,7 +115,7 @@ return hash(self.name) -allformatvariant = [] +allformatvariant = [] # type: List[Type['formatvariant']] def registerformatvariant(cls): diff -r 12450fbea288 -r 7431f5ab0d2a relnotes/5.8 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relnotes/5.8 Mon May 03 18:55:19 2021 +0200 @@ -0,0 +1,68 @@ +== New Features == + + * `hg purge` is now a core command using `--confirm` by default. + + * The `rev-branch-cache` is now updated incrementally whenever changesets + are added. + + * The new options `experimental.bundlecompthreads` and + `experimental.bundlecompthreads.` can be used to instruct + the compression engines for bundle operations to use multiple threads + for compression. The default is single threaded operation. Currently + only supported for zstd. + +== Default Format Change == + +These changes affects newly created repositories (or new clone) done with +Mercurial 5.8. + + * The `ZSTD` compression will now be used by default for new repositories + when available. This compression format was introduced in Mercurial 5.0, + released in May 2019. See `hg help config.format.revlog-compression` for + details. + + * Mercurial installation built with the Rust parts will now use the + "persistent nodemap" feature by default. This feature was introduced in + Mercurial 5.4 (May 2020). However Mercurial instalation built without the + fast Rust implementation will refuse to interract with them by default. + This restriction can be lifted through configuration. + + See `hg help config.format.use-persistent-nodemap` for details + +== New Experimental Features == + + * There's a new `diff.merge` config option to show the changes + relative to an automerge for merge changesets. This makes it + easier to detect and review manual changes performed in merge + changesets. It is supported by `hg diff --change`, `hg log -p` + `hg incoming -p`, and `hg outgoing -p` so far. + + +== Bug Fixes == + + * gracefully recover from inconsistent persistent-nodemap data from disk. + + +== Backwards Compatibility Changes == + + * In normal repositories, the first parent of a changeset is not null, + unless both parents are null (like the first changeset). Some legacy + repositories violate this condition. The revlog code will now + silentely swap the parents if this condition is tested. This can + change the output of `hg log` when explicitly asking for first or + second parent. The changesets "nodeid" are not affected. + + +== Internal API Changes == + + * `changelog.branchinfo` is deprecated and will be removed after 5.8. + It is superseded by `changelogrevision.branchinfo`. + + * Callbacks for revlog.addgroup and the changelog._nodeduplicatecallback hook + now get a revision number as argument instead of a node. + + * revlog.addrevision returns the revision number instead of the node. + + * `nodes.nullid` and related constants are being phased out as part of + the deprecation of SHA1. Repository instances and related classes + provide access via `nodeconstants` and in some cases `nullid` attributes. diff -r 12450fbea288 -r 7431f5ab0d2a relnotes/next --- a/relnotes/next Fri Apr 30 02:11:58 2021 +0200 +++ b/relnotes/next Mon May 03 18:55:19 2021 +0200 @@ -1,49 +1,21 @@ == New Features == - * `hg purge` is now a core command using `--confirm` by default. - - * The `rev-branch-cache` is now updated incrementally whenever changesets - are added. + +== Default Format Change == - * The new options `experimental.bundlecompthreads` and - `experimental.bundlecompthreads.` can be used to instruct - the compression engines for bundle operations to use multiple threads - for compression. The default is single threaded operation. Currently - only supported for zstd. +These changes affects newly created repositories (or new clone) done with +Mercurial 5.8. + == New Experimental Features == - * There's a new `diff.merge` config option to show the changes - relative to an automerge for merge changesets. This makes it - easier to detect and review manual changes performed in merge - changesets. It is supported by `hg diff --change`, `hg log -p` - `hg incoming -p`, and `hg outgoing -p` so far. - == Bug Fixes == - == Backwards Compatibility Changes == - * In normal repositories, the first parent of a changeset is not null, - unless both parents are null (like the first changeset). Some legacy - repositories violate this condition. The revlog code will now - silentely swap the parents if this condition is tested. This can - change the output of `hg log` when explicitly asking for first or - second parent. - == Internal API Changes == - * `changelog.branchinfo` is deprecated and will be removed after 5.8. - It is superseded by `changelogrevision.branchinfo`. - * Callbacks for revlog.addgroup and the changelog._nodeduplicatecallback hook - now get a revision number as argument instead of a node. - - * revlog.addrevision returns the revision number instead of the node. - - * `nodes.nullid` and related constants are being phased out as part of - the deprecation of SHA1. Repository instances and related classes - provide access via `nodeconstants` and in some cases `nullid` attributes. diff -r 12450fbea288 -r 7431f5ab0d2a setup.py --- a/setup.py Fri Apr 30 02:11:58 2021 +0200 +++ b/setup.py Mon May 03 18:55:19 2021 +0200 @@ -437,6 +437,10 @@ version = '%(latesttag)s+hg%(latesttagdistance)s.%(node).12s' % kw else: version = '0+hg' + kw.get('node', '')[:12] +elif os.path.exists('mercurial/__version__.py'): + with open('mercurial/__version__.py') as f: + data = f.read() + version = re.search('version = b"(.*)"', data).group(1) if version: versionb = version diff -r 12450fbea288 -r 7431f5ab0d2a tests/run-tests.py --- a/tests/run-tests.py Fri Apr 30 02:11:58 2021 +0200 +++ b/tests/run-tests.py Mon May 03 18:55:19 2021 +0200 @@ -326,7 +326,7 @@ default_defaults = { 'jobs': ('HGTEST_JOBS', multiprocessing.cpu_count()), - 'timeout': ('HGTEST_TIMEOUT', 180), + 'timeout': ('HGTEST_TIMEOUT', 360), 'slowtimeout': ('HGTEST_SLOWTIMEOUT', 1500), 'port': ('HGTEST_PORT', 20059), 'shell': ('HGTEST_SHELL', 'sh'), diff -r 12450fbea288 -r 7431f5ab0d2a tests/test-git-interop.t --- a/tests/test-git-interop.t Fri Apr 30 02:11:58 2021 +0200 +++ b/tests/test-git-interop.t Mon May 03 18:55:19 2021 +0200 @@ -7,6 +7,7 @@ > GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME > GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL > GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE + > HGUSER="test "; export HGUSER > count=10 > gitcommit() { > GIT_AUTHOR_DATE="2007-01-01 00:00:$count +0000"; @@ -49,6 +50,22 @@ > log-index-cache-miss = yes > EOF +Test some edge cases around a commitless repo first + $ mkdir empty + $ cd empty + $ git init + Initialized empty Git repository in $TESTTMP/empty/.git/ + $ hg init --git + $ hg heads + [1] + $ hg tip + changeset: -1:000000000000 + tag: tip + user: + date: Thu Jan 01 00:00:00 1970 +0000 + + $ cd .. + Make a new repo with git: $ mkdir foo $ cd foo @@ -67,6 +84,7 @@ On branch master Untracked files: (use "git add ..." to include in what will be committed) + (?) gamma nothing added to commit but untracked files present (use "git add" to track) @@ -134,6 +152,7 @@ On branch master Untracked files: (use "git add ..." to include in what will be committed) + (?) gamma nothing added to commit but untracked files present (use "git add" to track) @@ -153,7 +172,9 @@ $ git status On branch master Changes to be committed: - (use "git restore --staged ..." to unstage) + (use "git restore --staged ..." to unstage) (?) + (use "git reset HEAD ..." to unstage) (?) + (?) new file: gamma @@ -165,6 +186,7 @@ On branch master Untracked files: (use "git add ..." to include in what will be committed) + (?) gamma nothing added to commit but untracked files present (use "git add" to track) @@ -175,7 +197,7 @@ hg log FILE $ echo a >> alpha - $ hg ci -m 'more alpha' --traceback --date '1583522787 18000' + $ hg ci -m 'more alpha' --traceback --date '1583558723 18000' $ echo b >> beta $ hg ci -m 'more beta' heads mismatch, rebuilding dagcache @@ -184,16 +206,16 @@ heads mismatch, rebuilding dagcache $ hg log -G alpha heads mismatch, rebuilding dagcache - @ changeset: 4:6626247b7dc8 + @ changeset: 4:cf6ddf5d9b8a : bookmark: master : tag: tip - : user: test + : user: test : date: Thu Jan 01 00:00:00 1970 +0000 : summary: even more alpha : - o changeset: 2:a1983dd7fb19 - : user: test - : date: Fri Mar 06 14:26:27 2020 -0500 + o changeset: 2:5b2c80b027ce + : user: test + : date: Sat Mar 07 00:25:23 2020 -0500 : summary: more alpha : o changeset: 0:c5864c9d16fb @@ -202,8 +224,8 @@ summary: Add alpha $ hg log -G beta - o changeset: 3:d8ee22687733 - : user: test + o changeset: 3:980d4f79a9c6 + : user: test : date: Thu Jan 01 00:00:00 1970 +0000 : summary: more beta : @@ -214,7 +236,7 @@ $ hg log -r "children(3d9be8deba43)" -T"{node|short} {children}\n" - a1983dd7fb19 3:d8ee22687733 + 5b2c80b027ce 3:980d4f79a9c6 hg annotate @@ -258,13 +280,29 @@ node|shortest works correctly $ hg log -T '{node}\n' | sort 3d9be8deba43482be2c81a4cb4be1f10d85fa8bc - 6626247b7dc8f231b183b8a4761c89139baca2ad - a1983dd7fb19cbd83ad5a1c2fc8bf3d775dea12f - ae1ab744f95bfd5b07cf573baef98a778058537b + 5b2c80b027ce4250f88957326c199a2dc48dad60 + 980d4f79a9c617d60d0fe1fb383753c4a61bea8e + c1a41c49866ecc9c5411be932653e5b430961dd5 c5864c9d16fb3431fe2c175ff84dc6accdbb2c18 - d8ee22687733a1991813560b15128cd9734f4b48 - $ hg log -r ae1ab744f95bfd5b07cf573baef98a778058537b --template "{shortest(node,1)}\n" - ae + cf6ddf5d9b8a120bf90020342bcf7a96d0167279 + $ hg log -r c1a41c49866ecc9c5411be932653e5b430961dd5 --template "{shortest(node,1)}\n" + c1 + +This covers gitlog._partialmatch() + $ hg log -r c + abort: ambiguous revision identifier: c + [10] + $ hg log -r c1 + changeset: 5:c1a41c49866e + bookmark: master + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: Introduce file a/mu + + $ hg log -r dead + abort: unknown revision 'dead' + [255] This coveres changelog.findmissing() $ hg merge --preview 3d9be8deba43 @@ -320,14 +358,14 @@ $ hg ex -r . # HG changeset patch - # User test + # User test # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 80adc61cf57e99f6a412d83fee6239d1556cefcf - # Parent ae1ab744f95bfd5b07cf573baef98a778058537b + # Node ID 6024eda7986da123aa6797dd4603bd399d49bf5c + # Parent c1a41c49866ecc9c5411be932653e5b430961dd5 test interactive commit - diff -r ae1ab744f95b -r 80adc61cf57e alpha + diff -r c1a41c49866e -r 6024eda7986d alpha --- a/alpha Thu Jan 01 00:00:00 1970 +0000 +++ b/alpha Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +1,4 @@ @@ -336,8 +374,8 @@ a +bar $ git show - commit 80adc61cf57e99f6a412d83fee6239d1556cefcf - Author: test + commit 6024eda7986da123aa6797dd4603bd399d49bf5c + Author: test Date: Thu Jan 1 00:00:00 1970 +0000 test interactive commit @@ -358,3 +396,30 @@ $ hg rm beta $ hg ci -m 'remove beta' +This covers changelog.tiprev() (issue6510) + $ hg log -r '(.^^):' + heads mismatch, rebuilding dagcache + changeset: 5:c1a41c49866e + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: Introduce file a/mu + + changeset: 6:6024eda7986d + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: test interactive commit + + changeset: 7:1a0fee76bfc4 + bookmark: master + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: remove beta + +This covers changelog.headrevs() with a non-None arg + $ hg log -r 'heads(.)' -Tcompact + 7[tip][master] 1a0fee76bfc4 1970-01-01 00:00 +0000 test + remove beta + + + diff -r 12450fbea288 -r 7431f5ab0d2a tests/test-transaction-rollback-on-sigpipe.t --- a/tests/test-transaction-rollback-on-sigpipe.t Fri Apr 30 02:11:58 2021 +0200 +++ b/tests/test-transaction-rollback-on-sigpipe.t Mon May 03 18:55:19 2021 +0200 @@ -22,14 +22,14 @@ $ killable_pipe=`pwd`/killable_pipe.sh $ script $killable_pipe < #!/bin/bash + > #!/usr/bin/env bash > echo \$\$ >> $pidfile > exec cat > EOF $ remotecmd=`pwd`/remotecmd.sh $ script $remotecmd < #!/bin/bash + > #!/usr/bin/env bash > hg "\$@" 1> >($killable_pipe) 2> >($killable_pipe >&2) > EOF @@ -38,7 +38,7 @@ $ hook_script=`pwd`/pretxnchangegroup.sh $ script $hook_script < #!/bin/bash + > #!/usr/bin/env bash > for pid in \$(cat $pidfile) ; do > kill \$pid > while kill -0 \$pid 2>/dev/null ; do