tests/test-narrow-debugrebuilddirstate.t
author Arseniy Alekseyev <aalekseyev@janestreet.com>
Mon, 15 Apr 2024 16:33:37 +0100
branchstable
changeset 51571 74230abb2504
parent 39871 01c0f01b562b
permissions -rw-r--r--
match: strengthen visit_children_set invariant, Recursive means "all files" My previous interpretation of "Recursive" was too relaxed: I thought it instructed the caller to do something like this: > you can stop calling `visit_children_set` because you'll need to descend into > every directory recursively, but you should still check every file if it > matches or not Whereas the real instruction seems to be: > I guarantee that everything in this subtree matches, you can stop > querying the matcher for all files and dirs altogether. The evidence to support this: - the test actually passes with the stronger invariant, revealing no exceptions from this rule - the implementation of `visit_children_set` for `DifferenceMatcher` clearly relies on this requirement, so it must hold for that not to lead to bugs.

  $ . "$TESTDIR/narrow-library.sh"
  $ hg init master
  $ cd master
  $ echo treemanifest >> .hg/requires
  $ echo 'contents of file' > file
  $ mkdir foo
  $ echo 'contents of foo/bar' > foo/bar
  $ hg ci -Am 'some change'
  adding file
  adding foo/bar

  $ cd ..
  $ hg clone --narrow ssh://user@dummy/master copy --include=foo
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  new changesets * (glob)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd copy

  $ hg debugdirstate --no-dates
  n *         20 *               foo/bar (glob)
  $ mv .hg/dirstate .hg/old_dirstate
  $ dd bs=40 count=1 if=.hg/old_dirstate of=.hg/dirstate 2>/dev/null
  $ hg debugdirstate
  $ hg debugrebuilddirstate
  $ hg debugdirstate
  n *         * unset               foo/bar (glob)