tests/test-symlink-placeholder.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 09 Apr 2024 02:54:12 +0200
changeset 51577 b5d494f7d28a
parent 38080 0a10f142299d
permissions -rw-r--r--
push: rework the computation of fallbackheads to be correct The previous computation tried to be smart but ended up being wrong. This was caught by phase movement test while reworking the phase discovery logic to be faster. The previous logic was failing to catch case where the pushed set was not based on a common heads (i.e. when the discovery seemed to have "over discovered" content, outside the pushed set) In the following graph, `e` is a common head and we `hg push -r f`. We need to detect `c` as a fallback heads and we previous failed to do so:: e | d f |/ c | b | a The performance impact of the change seems minimal. On the most impacted repository at hand (mozilla-try), the slowdown seems mostly mixed in the overall noise `hg push` but seems to be in the hundred of milliseconds order of magnitude. When using rust, we seems to be a bit faster, probably because we leverage more accelaratd internals. I added a couple of performance related common for further investigation later on.

#require symlink

Create extension that can disable symlink support:

  $ cat > nolink.py <<EOF
  > from mercurial import extensions, util
  > def setflags(orig, f, l, x):
  >     pass
  > def checklink(orig, path):
  >     return False
  > def extsetup(ui):
  >     extensions.wrapfunction(util, 'setflags', setflags)
  >     extensions.wrapfunction(util, 'checklink', checklink)
  > EOF

  $ hg init unix-repo
  $ cd unix-repo
  $ echo foo > a
  $ ln -s a b
  $ hg ci -Am0
  adding a
  adding b
  $ cd ..

Simulate a checkout shared on NFS/Samba:

  $ hg clone -q unix-repo shared
  $ cd shared
  $ rm b
  $ echo foo > b
  $ hg --config extensions.n=$TESTTMP/nolink.py status --debug
  ignoring suspect symlink placeholder "b"

Make a clone using placeholders:

  $ hg --config extensions.n=$TESTTMP/nolink.py clone . ../win-repo
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd ../win-repo
  $ cat b
  a (no-eol)
  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug

Empty placeholder:

  $ rm b
  $ touch b
  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
  ignoring suspect symlink placeholder "b"

Write binary data to the placeholder:

  >>> open('b', 'w').write('this is a binary\0') and None
  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
  ignoring suspect symlink placeholder "b"

Write a long string to the placeholder:

  >>> open('b', 'w').write('this' * 1000) and None
  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
  ignoring suspect symlink placeholder "b"

Commit shouldn't succeed:

  $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
  nothing changed
  [1]

Write a valid string to the placeholder:

  >>> open('b', 'w').write('this') and None
  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
  M b
  $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
  $ hg manifest tip --verbose
  644   a
  644 @ b

  $ cd ..