changeset 44911:fd3b94f1712d

merge with stable
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 26 May 2020 08:07:24 -0700
parents 708ad5cf5e5a (current diff) 91e509a12dbc (diff)
children ba5688e3b3bd
files mercurial/dirstate.py mercurial/hook.py mercurial/localrepo.py mercurial/manifest.py rust/hg-core/src/matchers.rs setup.py
diffstat 20 files changed, 243 insertions(+), 142 deletions(-) [+]
line wrap: on
line diff
--- 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=()
--- 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 (
--- 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:
--- 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
--- 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)
--- 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!')
--- 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
 
 
--- 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')
--- 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:
--- 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-')
     }
--- 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)
--- 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)
--- /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.
--- 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.
--- 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()))?;
 
--- 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(
--- 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" <debugbuilddag> 0 -0000
+  committer "debugbuilddag" <debugbuilddag> 0 +0000
   data 2
   r0
   M 644 :1 mf
@@ -197,7 +197,7 @@
   
   commit refs/heads/default
   mark :7
-  committer "debugbuilddag" <debugbuilddag> 1 -0000
+  committer "debugbuilddag" <debugbuilddag> 1 +0000
   data 2
   r1
   from :3
@@ -245,7 +245,7 @@
   
   commit refs/heads/name1
   mark :11
-  committer "debugbuilddag" <debugbuilddag> 2 -0000
+  committer "debugbuilddag" <debugbuilddag> 2 +0000
   data 2
   r2
   from :7
@@ -293,7 +293,7 @@
   
   commit refs/heads/name1
   mark :15
-  committer "debugbuilddag" <debugbuilddag> 3 -0000
+  committer "debugbuilddag" <debugbuilddag> 3 +0000
   data 2
   r3
   from :11
@@ -341,7 +341,7 @@
   
   commit refs/heads/name1
   mark :19
-  committer "debugbuilddag" <debugbuilddag> 4 -0000
+  committer "debugbuilddag" <debugbuilddag> 4 +0000
   data 2
   r4
   from :15
@@ -389,7 +389,7 @@
   
   commit refs/heads/name2
   mark :23
-  committer "debugbuilddag" <debugbuilddag> 5 -0000
+  committer "debugbuilddag" <debugbuilddag> 5 +0000
   data 2
   r5
   from :7
@@ -437,7 +437,7 @@
   
   commit refs/heads/name2
   mark :27
-  committer "debugbuilddag" <debugbuilddag> 6 -0000
+  committer "debugbuilddag" <debugbuilddag> 6 +0000
   data 2
   r6
   from :23
@@ -485,7 +485,7 @@
   
   commit refs/heads/name2
   mark :31
-  committer "debugbuilddag" <debugbuilddag> 7 -0000
+  committer "debugbuilddag" <debugbuilddag> 7 +0000
   data 2
   r7
   from :27
@@ -533,7 +533,7 @@
   
   commit refs/heads/name2
   mark :35
-  committer "debugbuilddag" <debugbuilddag> 8 -0000
+  committer "debugbuilddag" <debugbuilddag> 8 +0000
   data 2
   r8
   from :31
@@ -581,7 +581,7 @@
   
   commit refs/heads/both
   mark :39
-  committer "debugbuilddag" <debugbuilddag> 9 -0000
+  committer "debugbuilddag" <debugbuilddag> 9 +0000
   data 2
   r9
   from :35
@@ -633,7 +633,7 @@
   
   commit refs/heads/both
   mark :43
-  committer "debugbuilddag" <debugbuilddag> 10 -0000
+  committer "debugbuilddag" <debugbuilddag> 10 +0000
   data 3
   r10
   from :39
@@ -681,7 +681,7 @@
   
   commit refs/heads/both
   mark :47
-  committer "debugbuilddag" <debugbuilddag> 11 -0000
+  committer "debugbuilddag" <debugbuilddag> 11 +0000
   data 3
   r11
   from :43
@@ -691,7 +691,7 @@
   
   commit refs/heads/both
   mark :48
-  committer "debugbuilddag" <debugbuilddag> 12 -0000
+  committer "debugbuilddag" <debugbuilddag> 12 +0230
   data 3
   r12
   from :43
@@ -699,7 +699,7 @@
   
   commit refs/heads/both
   mark :49
-  committer "test" <test> 13 -0000
+  committer "test" <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" <debugbuilddag> 0 -0000
+  committer "debugbuilddag" <debugbuilddag> 0 +0000
   data 2
   r0
   M 644 :1 mf
@@ -845,7 +845,7 @@
   
   commit refs/heads/default
   mark :7
-  committer "debugbuilddag" <debugbuilddag> 1 -0000
+  committer "debugbuilddag" <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]
--- 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 <<EOF > .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
--- 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
--- 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