# HG changeset patch # User Martin von Zweigbergk # Date 1590505644 25200 # Node ID fd3b94f1712d2c76ce48248d9be2dbc8c53c2ba7 # Parent 708ad5cf5e5a7666ec6619829a68c6ef8d4cb3e0# Parent 91e509a12dbc4cd6cf2dcb9dae3ed383932132ac merge with stable diff -r 708ad5cf5e5a -r fd3b94f1712d contrib/bash_completion --- a/contrib/bash_completion Sun May 17 18:33:45 2020 -0400 +++ b/contrib/bash_completion Tue May 26 08:07:24 2020 -0700 @@ -160,7 +160,10 @@ if [[ -n "$aliashg" ]]; then aliashg=${aliashg#"alias $hg='"} aliashg=${aliashg%"'"} - hg=$aliashg + # `source`d aliases break completion, so ignore them + if [[ "${aliashg:0:7}" != "source " ]]; then + hg=$aliashg + fi fi COMPREPLY=() diff -r 708ad5cf5e5a -r fd3b94f1712d hgdemandimport/demandimportpy3.py --- a/hgdemandimport/demandimportpy3.py Sun May 17 18:33:45 2020 -0400 +++ b/hgdemandimport/demandimportpy3.py Tue May 26 08:07:24 2020 -0700 @@ -97,9 +97,18 @@ def __setattr__(self, name, value): return setattr(object.__getattribute__(self, "_finder"), name, value) - def find_spec(self, *args, **kwargs): + def find_spec(self, fullname, path, target=None): finder = object.__getattribute__(self, "_finder") - spec = finder.find_spec(*args, **kwargs) + try: + find_spec = finder.find_spec + except AttributeError: + loader = finder.find_module(fullname, path) + if loader is None: + spec = None + else: + spec = importlib.util.spec_from_loader(fullname, loader) + else: + spec = find_spec(fullname, path, target) # Lazy loader requires exec_module(). if ( diff -r 708ad5cf5e5a -r fd3b94f1712d hgext/fastexport.py --- a/hgext/fastexport.py Sun May 17 18:33:45 2020 -0400 +++ b/hgext/fastexport.py Tue May 26 08:07:24 2020 -0700 @@ -53,7 +53,7 @@ def convert_to_git_date(date): timestamp, utcoff = date - tzsign = b"+" if utcoff < 0 else b"-" + tzsign = b"+" if utcoff <= 0 else b"-" if utcoff % 60 != 0: raise error.Abort( _(b"UTC offset in %b is not an integer number of seconds") % (date,) @@ -80,7 +80,7 @@ ctx = repo[rev] revid = ctx.hex() if revid in marks: - ui.warn(_(b"warning: revision %s already exported, skipped\n") % revid) + ui.debug(b"warning: revision %s already exported, skipped\n" % revid) return parents = [p for p in ctx.parents() if p.rev() != nullrev] for p in parents: diff -r 708ad5cf5e5a -r fd3b94f1712d hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py Sun May 17 18:33:45 2020 -0400 +++ b/hgext/fsmonitor/__init__.py Tue May 26 08:07:24 2020 -0700 @@ -667,7 +667,7 @@ class poststatus(object): def __init__(self, startclock): - self._startclock = startclock + self._startclock = pycompat.sysbytes(startclock) def __call__(self, wctx, status): clock = wctx.repo()._fsmonitorstate.getlastclock() or self._startclock diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/bookmarks.py --- a/mercurial/bookmarks.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/bookmarks.py Tue May 26 08:07:24 2020 -0700 @@ -754,7 +754,8 @@ if changed: tr = trfunc() changes = [] - for b, node, writer, msg in sorted(changed): + key = lambda t: (t[0], t[1] or b'') + for b, node, writer, msg in sorted(changed, key=key): changes.append((b, node)) writer(msg) localmarks.applychanges(repo, tr, changes) diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/dirstate.py --- a/mercurial/dirstate.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/dirstate.py Tue May 26 08:07:24 2020 -0700 @@ -103,6 +103,13 @@ # raises an exception). self._cwd + def prefetch_parents(self): + """make sure the parents are loaded + + Used to avoid a race condition. + """ + self._pl + @contextlib.contextmanager def parentchange(self): '''Context manager for handling dirstate parents. @@ -1748,10 +1755,23 @@ @propertycache def _rustmap(self): - self._rustmap = rustmod.DirstateMap(self._root) + """ + Fills the Dirstatemap when called. + Use `self._inner_rustmap` if reading the dirstate is not necessary. + """ + self._rustmap = self._inner_rustmap self.read() return self._rustmap + @propertycache + def _inner_rustmap(self): + """ + Does not fill the Dirstatemap when called. This allows for + optimizations where only setting/getting the parents is needed. + """ + self._inner_rustmap = rustmod.DirstateMap(self._root) + return self._inner_rustmap + @property def copymap(self): return self._rustmap.copymap() @@ -1761,6 +1781,7 @@ def clear(self): self._rustmap.clear() + self._inner_rustmap.clear() self.setparents(nullid, nullid) util.clearcachedproperty(self, b"_dirs") util.clearcachedproperty(self, b"_alldirs") @@ -1817,7 +1838,7 @@ st = b'' try: - self._parents = self._rustmap.parents(st) + self._parents = self._inner_rustmap.parents(st) except ValueError: raise error.Abort( _(b'working directory state appears damaged!') diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/hook.py --- a/mercurial/hook.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/hook.py Tue May 26 08:07:24 2020 -0700 @@ -210,7 +210,7 @@ # in that section uses "_fromuntrusted" as its command. untrustedhooks = _hookitems(ui, _untrusted=True) for name, value in untrustedhooks.items(): - trustedvalue = hooks.get(name, (None, None, name, _fromuntrusted)) + trustedvalue = hooks.get(name, ((), (), name, _fromuntrusted)) if value != trustedvalue: (lp, lo, lk, lv) = trustedvalue hooks[name] = (lp, lo, lk, _fromuntrusted) @@ -226,7 +226,7 @@ continue priority = ui.configint(b'hooks', b'priority.%s' % name, 0) - hooks[name] = (-priority, len(hooks), name, cmd) + hooks[name] = ((-priority,), (len(hooks),), name, cmd) return hooks diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/localrepo.py --- a/mercurial/localrepo.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/localrepo.py Tue May 26 08:07:24 2020 -0700 @@ -1456,6 +1456,8 @@ @storecache(b'00changelog.i') def changelog(self): + # load dirstate before changelog to avoid race see issue6303 + self.dirstate.prefetch_parents() return self.store.changelog(txnutil.mayhavepending(self.root)) @storecache(b'00manifest.i') diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/manifest.py --- a/mercurial/manifest.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/manifest.py Tue May 26 08:07:24 2020 -0700 @@ -1455,18 +1455,29 @@ if not self._dirty or self._opener is None: return # rotate backwards to the first used node - with self._opener( - self._file, b'w', atomictemp=True, checkambig=True - ) as fp: - node = self._head.prev - while True: - if node.key in self._cache: - fp.write(node.key) - fp.write(struct.pack(b'>L', len(node.value))) - fp.write(node.value) - if node is self._head: - break - node = node.prev + try: + with self._opener( + self._file, b'w', atomictemp=True, checkambig=True + ) as fp: + node = self._head.prev + while True: + if node.key in self._cache: + fp.write(node.key) + fp.write(struct.pack(b'>L', len(node.value))) + fp.write(node.value) + if node is self._head: + break + node = node.prev + except IOError: + # We could not write the cache (eg: permission error) + # the content can be missing. + # + # We could try harder and see if we could recreate a wcache + # directory were we coudl write too. + # + # XXX the error pass silently, having some way to issue an error + # log `ui.log` would be nice. + pass def __len__(self): if not self._read: diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/url.py --- a/mercurial/url.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/url.py Tue May 26 08:07:24 2020 -0700 @@ -225,7 +225,7 @@ def _generic_proxytunnel(self): proxyheaders = { - x: self.headers[x] + pycompat.bytestr(x): pycompat.bytestr(self.headers[x]) for x in self.headers if x.lower().startswith('proxy-') } diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/utils/procutil.py --- a/mercurial/utils/procutil.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/utils/procutil.py Tue May 26 08:07:24 2020 -0700 @@ -16,6 +16,7 @@ import signal import subprocess import sys +import threading import time from ..i18n import _ @@ -604,6 +605,15 @@ pid = os.fork() if pid: if not ensurestart: + # Even though we're not waiting on the child process, + # we still must call waitpid() on it at some point so + # it's not a zombie/defunct. This is especially relevant for + # chg since the parent process won't die anytime soon. + # We use a thread to make the overhead tiny. + def _do_wait(): + os.waitpid(pid, 0) + + threading.Thread(target=_do_wait, daemon=True).start() return # Parent process (_pid, status) = os.waitpid(pid, 0) diff -r 708ad5cf5e5a -r fd3b94f1712d mercurial/wireprotov1server.py --- a/mercurial/wireprotov1server.py Sun May 17 18:33:45 2020 -0400 +++ b/mercurial/wireprotov1server.py Tue May 26 08:07:24 2020 -0700 @@ -391,7 +391,7 @@ res = exchange.filterclonebundleentries(repo, res) if not res: return None - cl = repo.changelog + cl = repo.unfiltered().changelog heads_anc = cl.ancestors([cl.rev(rev) for rev in heads], inclusive=True) common_anc = cl.ancestors([cl.rev(rev) for rev in common], inclusive=True) compformats = clientcompressionsupport(proto) diff -r 708ad5cf5e5a -r fd3b94f1712d relnotes/5.4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/relnotes/5.4 Tue May 26 08:07:24 2020 -0700 @@ -0,0 +1,93 @@ +== New Features == + + * `hg purge`/`hg clean` can now delete ignored files instead of + untracked files, with the new -i flag. + + * `hg pull` now has a `--confirm` flag to prompt before applying changes. + Config option `pull.confirm` is also added for that. + + * `hg log` now defaults to using an '%' symbol for commits involved + in unresolved merge conflicts. That includes unresolved conflicts + caused by e.g. `hg update --merge` and `hg graft`. '@' still takes + precedence, so what used to be marked '@' still is. + + * New `conflictlocal()` and `conflictother()` revsets return the + commits that are being merged, when there are conflicts. Also works + for conflicts caused by e.g. `hg graft`. + + * `hg copy --forget` can be used to unmark a file as copied. + + * The `format.revlog-compression` configuration entry now accept a list. The + first available option will be used. for example setting:: + + [format] + revlog-compression=zstd, zlib + + Will use `zstd` compression for new repositories is available, and will + simply fall back to `zlib` if not. + + * `hg debugmergestate` output is now templated, which may be useful + e.g. for IDEs that want to help the user resolve merge conflicts. + + +== New Experimental Features == + + * `hg copy` now supports a `--at-rev` argument to mark files as + copied in the specified commit. It only works with `--after` for + now (i.e., it's only useful for marking files copied using non-hg + `cp` as copied). + + * Use `hg copy --forget --at-rev REV` to unmark already committed + copies. + +== Bug Fixes == + + * Fix server exception when concurrent pushes delete the same bookmark + + * Prevent pushes of divergent bookmarks (foo@remote) + + * The push error "remote repository changed while pushing - please + try again" now only happens when a concurrent push changed related + heads (instead of when a concurrent pushed any revision). + + +== Backwards Compatibility Changes == + + * When `hg rebase` pauses for merge conflict resolution, the working + copy will no longer have the rebased node as a second parent. You + can use the new `conflictparents()` revset for finding the other + parent during a conflict. + + * `hg rebase` now accepts repeated `--source` and `--base` + arguments. For example, `hg rebase --source 'A + B'` is equivalent + to `hg rebase --source A --source B`. This is a + backwards-incompatible change because it will break overriding an + alias `myrebase = rebase --source A` by `hg myrebase --source B` + (it will now rebase `(A + B)::` instead of `B::`). + + * `hg recover` does not verify the validity of the whole repository + anymore. You can pass `--verify` or call `hg verify` if necessary. + + * `hg debugmergestate` output format changed. Let us know if that is + causing you problems and we'll roll it back. + + * Resolved merge conflicts are now cleared by `hg commit` even if the + working copy has no changes. + + +== Internal API Changes == + + * The deprecated `ui.progress()` has now been deleted. Please use + `ui.makeprogress()` instead. + + * `hg.merge()` now takes a `ctx` instead of the previous `repo` and + `node` arguments. + + * `hg.merge()` has lost its `abort` argument. Please call + `hg.abortmerge()` directly instead. + + * `hg.merge()` has lost its `mergeforce` argument. It should have + only ever been called with the same value as the `force` argument. + + * The `*others` argument of `cmdutil.check_incompatible_arguments()` + changed from being varargs argument to being a single collection. diff -r 708ad5cf5e5a -r fd3b94f1712d relnotes/next --- a/relnotes/next Sun May 17 18:33:45 2020 -0400 +++ b/relnotes/next Tue May 26 08:07:24 2020 -0700 @@ -1,93 +1,11 @@ == New Features == - * `hg purge`/`hg clean` can now delete ignored files instead of - untracked files, with the new -i flag. - - * `hg pull` now has a `--confirm` flag to prompt before applying changes. - Config option `pull.confirm` is also added for that. - - * `hg log` now defaults to using an '%' symbol for commits involved - in unresolved merge conflicts. That includes unresolved conflicts - caused by e.g. `hg update --merge` and `hg graft`. '@' still takes - precedence, so what used to be marked '@' still is. - - * New `conflictlocal()` and `conflictother()` revsets return the - commits that are being merged, when there are conflicts. Also works - for conflicts caused by e.g. `hg graft`. - - * `hg copy --forget` can be used to unmark a file as copied. - - * The `format.revlog-compression` configuration entry now accept a list. The - first available option will be used. for example setting:: - - [format] - revlog-compression=zstd, zlib - - Will use `zstd` compression for new repositories is available, and will - simply fall back to `zlib` if not. - - * `hg debugmergestate` output is now templated, which may be useful - e.g. for IDEs that want to help the user resolve merge conflicts. - == New Experimental Features == - * `hg copy` now supports a `--at-rev` argument to mark files as - copied in the specified commit. It only works with `--after` for - now (i.e., it's only useful for marking files copied using non-hg - `cp` as copied). - - * Use `hg copy --forget --at-rev REV` to unmark already committed - copies. - -== Bug Fixes == - - * Fix server exception when concurrent pushes delete the same bookmark - - * Prevent pushes of divergent bookmarks (foo@remote) - - * The push error "remote repository changed while pushing - please - try again" now only happens when a concurrent push changed related - heads (instead of when a concurrent pushed any revision). - == Backwards Compatibility Changes == - * When `hg rebase` pauses for merge conflict resolution, the working - copy will no longer have the rebased node as a second parent. You - can use the new `conflictparents()` revset for finding the other - parent during a conflict. - - * `hg rebase` now accepts repeated `--source` and `--base` - arguments. For example, `hg rebase --source 'A + B'` is equivalent - to `hg rebase --source A --source B`. This is a - backwards-incompatible change because it will break overriding an - alias `myrebase = rebase --source A` by `hg myrebase --source B` - (it will now rebase `(A + B)::` instead of `B::`). - - * `hg recover` does not verify the validity of the whole repository - anymore. You can pass `--verify` or call `hg verify` if necessary. - - * `hg debugmergestate` output format changed. Let us know if that is - causing you problems and we'll roll it back. - - * Resolved merge conflicts are now cleared by `hg commit` even if the - working copy has no changes. - == Internal API Changes == - * The deprecated `ui.progress()` has now been deleted. Please use - `ui.makeprogress()` instead. - - * `hg.merge()` now takes a `ctx` instead of the previous `repo` and - `node` arguments. - - * `hg.merge()` has lost its `abort` argument. Please call - `hg.abortmerge()` directly instead. - - * `hg.merge()` has lost its `mergeforce` argument. It should have - only ever been called with the same value as the `force` argument. - - * The `*others` argument of `cmdutil.check_incompatible_arguments()` - changed from being varargs argument to being a single collection. diff -r 708ad5cf5e5a -r fd3b94f1712d rust/hg-core/src/matchers.rs --- a/rust/hg-core/src/matchers.rs Sun May 17 18:33:45 2020 -0400 +++ b/rust/hg-core/src/matchers.rs Tue May 26 08:07:24 2020 -0700 @@ -366,6 +366,10 @@ let pattern_string = unsafe { String::from_utf8_unchecked(escaped_bytes) }; let re = regex::bytes::RegexBuilder::new(&pattern_string) .unicode(false) + // Big repos with big `.hgignore` will hit the default limit and + // incur a significant performance hit. One repo's `hg status` hit + // multiple *minutes*. + .dfa_size_limit(50 * (1 << 20)) .build() .map_err(|e| PatternError::UnsupportedSyntax(e.to_string()))?; diff -r 708ad5cf5e5a -r fd3b94f1712d setup.py --- a/setup.py Sun May 17 18:33:45 2020 -0400 +++ b/setup.py Tue May 26 08:07:24 2020 -0700 @@ -13,7 +13,7 @@ # bug link: https://bugs.python.org/issue25270 supportedpy = ','.join( [ - '>=2.7', + '>=2.7.4', '!=3.0.*', '!=3.1.*', '!=3.2.*', @@ -54,7 +54,7 @@ # should have a chance of getting a 4.2 release, and when we ratchet # the version requirement forward again hopefully everyone will get # something that works for them. -if sys.version_info < (2, 7, 0, 'final'): +if sys.version_info < (2, 7, 4, 'final'): pip_message = ( 'This may be due to an out of date pip. ' 'Make sure you have pip >= 9.0.1.' @@ -74,7 +74,7 @@ except Exception: pass error = """ -Mercurial does not support Python older than 2.7. +Mercurial does not support Python older than 2.7.4. Python {py} detected. {pip} """.format( diff -r 708ad5cf5e5a -r fd3b94f1712d tests/test-fastexport.t --- a/tests/test-fastexport.t Sun May 17 18:33:45 2020 -0400 +++ b/tests/test-fastexport.t Tue May 26 08:07:24 2020 -0700 @@ -10,7 +10,7 @@ $ hg up -r 10 13 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg rm nf10 - $ hg commit -u debugbuilddag --date 'Thu Jan 01 00:00:12 1970 +0000' -m r12 + $ hg commit -u debugbuilddag --date 'Thu Jan 01 02:30:12 1970 +0230' -m r12 created new head $ hg up -r 11 4 files updated, 0 files merged, 0 files removed, 0 files unresolved @@ -20,20 +20,20 @@ $ hg commit -m debugbuilddag --date 'Thu Jan 01 00:00:13 1970 +0000' $ hg log -G - @ changeset: 13:e5c379648af4 + @ changeset: 13:5544befcb7ce |\ branch: both | | tag: tip | | parent: 11:2cbd52c10e88 - | | parent: 12:4f31c9604af6 + | | parent: 12:66d0c21243be | | user: test | | date: Thu Jan 01 00:00:13 1970 +0000 | | summary: debugbuilddag | | - | o changeset: 12:4f31c9604af6 + | o changeset: 12:66d0c21243be | | branch: both | | parent: 10:9220596cb068 | | user: debugbuilddag - | | date: Thu Jan 01 00:00:12 1970 +0000 + | | date: Thu Jan 01 02:30:12 1970 +0230 | | summary: r12 | | o | changeset: 11:2cbd52c10e88 @@ -150,7 +150,7 @@ commit refs/heads/default mark :3 - committer "debugbuilddag" 0 -0000 + committer "debugbuilddag" 0 +0000 data 2 r0 M 644 :1 mf @@ -197,7 +197,7 @@ commit refs/heads/default mark :7 - committer "debugbuilddag" 1 -0000 + committer "debugbuilddag" 1 +0000 data 2 r1 from :3 @@ -245,7 +245,7 @@ commit refs/heads/name1 mark :11 - committer "debugbuilddag" 2 -0000 + committer "debugbuilddag" 2 +0000 data 2 r2 from :7 @@ -293,7 +293,7 @@ commit refs/heads/name1 mark :15 - committer "debugbuilddag" 3 -0000 + committer "debugbuilddag" 3 +0000 data 2 r3 from :11 @@ -341,7 +341,7 @@ commit refs/heads/name1 mark :19 - committer "debugbuilddag" 4 -0000 + committer "debugbuilddag" 4 +0000 data 2 r4 from :15 @@ -389,7 +389,7 @@ commit refs/heads/name2 mark :23 - committer "debugbuilddag" 5 -0000 + committer "debugbuilddag" 5 +0000 data 2 r5 from :7 @@ -437,7 +437,7 @@ commit refs/heads/name2 mark :27 - committer "debugbuilddag" 6 -0000 + committer "debugbuilddag" 6 +0000 data 2 r6 from :23 @@ -485,7 +485,7 @@ commit refs/heads/name2 mark :31 - committer "debugbuilddag" 7 -0000 + committer "debugbuilddag" 7 +0000 data 2 r7 from :27 @@ -533,7 +533,7 @@ commit refs/heads/name2 mark :35 - committer "debugbuilddag" 8 -0000 + committer "debugbuilddag" 8 +0000 data 2 r8 from :31 @@ -581,7 +581,7 @@ commit refs/heads/both mark :39 - committer "debugbuilddag" 9 -0000 + committer "debugbuilddag" 9 +0000 data 2 r9 from :35 @@ -633,7 +633,7 @@ commit refs/heads/both mark :43 - committer "debugbuilddag" 10 -0000 + committer "debugbuilddag" 10 +0000 data 3 r10 from :39 @@ -681,7 +681,7 @@ commit refs/heads/both mark :47 - committer "debugbuilddag" 11 -0000 + committer "debugbuilddag" 11 +0000 data 3 r11 from :43 @@ -691,7 +691,7 @@ commit refs/heads/both mark :48 - committer "debugbuilddag" 12 -0000 + committer "debugbuilddag" 12 +0230 data 3 r12 from :43 @@ -699,7 +699,7 @@ commit refs/heads/both mark :49 - committer "test" 13 -0000 + committer "test" 13 +0000 data 13 debugbuilddag from :47 @@ -754,8 +754,8 @@ 33fbc651630ffa7ccbebfe4eb91320a873e7291c 868d828870663d075cdcff502d26cf8445ce068e 2cbd52c10e88ce604402dc83a869ec4f07765b3d - 4f31c9604af676986343d775b05695f535e8db5e - e5c379648af4c9fa3b5546ab7ee6e61a36082830 + 66d0c21243be072f82ced64aa730ab0367252451 + 5544befcb7ce4a558ed9e19909e16af574a2a3c6 $ hg fastexport --export-marks fastexport.marks2 -r 0 blob @@ -793,7 +793,7 @@ commit refs/heads/default mark :3 - committer "debugbuilddag" 0 -0000 + committer "debugbuilddag" 0 +0000 data 2 r0 M 644 :1 mf @@ -845,7 +845,7 @@ commit refs/heads/default mark :7 - committer "debugbuilddag" 1 -0000 + committer "debugbuilddag" 1 +0000 data 2 r1 from :3 @@ -861,5 +861,5 @@ data 4 foo - abort: Unable to parse user into person and email for revision 4f71ca786403919cd16669d94ff7cd1c09437a44 + abort: Unable to parse user into person and email for revision 65a3f69b9b519de73d755472c1ab05990ab8a7f7 [255] diff -r 708ad5cf5e5a -r fd3b94f1712d tests/test-pull-bundle.t --- a/tests/test-pull-bundle.t Sun May 17 18:33:45 2020 -0400 +++ b/tests/test-pull-bundle.t Tue May 26 08:07:24 2020 -0700 @@ -36,6 +36,8 @@ $ cat < .hg/hgrc > [server] > pullbundle = True + > [experimental] + > evolution = True > [extensions] > blackbox = > EOF @@ -185,3 +187,24 @@ * sending pullbundle "0.hg" (glob) * sending pullbundle "0.hg" (glob) $ rm repo/.hg/blackbox.log + +Test processing when nodes used in the pullbundle.manifest end up being hidden + + $ hg --repo repo debugobsolete ed1b79f46b9a29f5a6efa59cf12fcfca43bead5a + 1 new obsolescence markers + obsoleted 1 changesets + $ hg serve --repo repo --config server.view=visible -p $HGPORT -d --pid-file=hg.pid -E errors.log + $ cat hg.pid >> $DAEMON_PIDS + $ hg clone http://localhost:$HGPORT repo-obs + requesting all changes + adding changesets + adding manifests + adding file changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files + new changesets bbd179dfa0a7:effea6de0384 + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ killdaemons.py diff -r 708ad5cf5e5a -r fd3b94f1712d tests/test-static-http.t --- a/tests/test-static-http.t Sun May 17 18:33:45 2020 -0400 +++ b/tests/test-static-http.t Tue May 26 08:07:24 2020 -0700 @@ -233,6 +233,7 @@ /.hg/cache/hgtagsfnodes1 /.hg/cache/rbc-names-v1 /.hg/cache/rbc-revs-v1 + /.hg/dirstate /.hg/requires /.hg/store/00changelog.i /.hg/store/00manifest.i @@ -250,6 +251,7 @@ /remote-with-names/.hg/cache/rbc-names-v1 /remote-with-names/.hg/cache/rbc-revs-v1 /remote-with-names/.hg/cache/tags2-served + /remote-with-names/.hg/dirstate /remote-with-names/.hg/localtags /remote-with-names/.hg/requires /remote-with-names/.hg/store/00changelog.i @@ -266,6 +268,7 @@ /remote/.hg/cache/rbc-names-v1 /remote/.hg/cache/rbc-revs-v1 /remote/.hg/cache/tags2-served + /remote/.hg/dirstate /remote/.hg/localtags /remote/.hg/requires /remote/.hg/store/00changelog.i @@ -278,6 +281,7 @@ /remote/.hg/store/data/~2ehgtags.i (py37 !) /remotempty/.hg/bookmarks /remotempty/.hg/bookmarks.current + /remotempty/.hg/dirstate /remotempty/.hg/requires /remotempty/.hg/store/00changelog.i /remotempty/.hg/store/00manifest.i @@ -286,6 +290,7 @@ /sub/.hg/cache/hgtagsfnodes1 /sub/.hg/cache/rbc-names-v1 /sub/.hg/cache/rbc-revs-v1 + /sub/.hg/dirstate /sub/.hg/requires /sub/.hg/store/00changelog.i /sub/.hg/store/00manifest.i diff -r 708ad5cf5e5a -r fd3b94f1712d tests/testlib/wait-on-file --- a/tests/testlib/wait-on-file Sun May 17 18:33:45 2020 -0400 +++ b/tests/testlib/wait-on-file Tue May 26 08:07:24 2020 -0700 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # # wait up to TIMEOUT seconds until a WAIT_ON_FILE is created. # @@ -11,9 +11,12 @@ timer="$1" -# if the test timeout have been extended, explicitly extend the provided timer +# Scale the timeout to match the sleep steps below, i.e. 1/0.02. +timer=$(( 50 * $timer )) +# If the test timeout have been extended, also scale the timer relative +# to the normal timing. if [ "$HGTEST_TIMEOUT_DEFAULT" -lt "$HGTEST_TIMEOUT" ]; then - timer=$(( ( 100 * $timer * $HGTEST_TIMEOUT) / $HGTEST_TIMEOUT_DEFAULT )) + timer=$(( ( $timer * $HGTEST_TIMEOUT) / $HGTEST_TIMEOUT_DEFAULT )) fi wait_on="$2" @@ -22,15 +25,13 @@ create="$3" fi -if [ -n "$create" ]; -then +if [ -n "$create" ]; then touch "$create" create="" fi -while [ "$timer" -gt 0 ] && [ ! -f "$wait_on" ]; -do +while [ "$timer" -gt 0 ] && [ ! -f "$wait_on" ]; do timer=$(( $timer - 1)) - sleep 0.01 + sleep 0.02 done if [ "$timer" -le 0 ]; then echo "file not created after $1 seconds: $wait_on" >&2