tests/test-narrow-copies.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 09 Apr 2024 22:36:35 +0200
changeset 51594 e3a5ec2d236a
parent 45771 f90a5c211251
permissions -rw-r--r--
outgoing: rework the handling of the `missingroots` case to be faster The previous implementation was slow, to the point it was taking a significant amount of `hg bundle --type none-streamv2` call. We rework the code to compute the same value much faster, making the operation disappear from the `hg bundle --type none-streamv2` profile. Someone would remark that producing a streamclone does not requires an `outgoing` object. However that is a matter for another day. There is other user of `missingroots` (non stream `hg bundle` call for example), and they will also benefit from this rework. We implement an old TODO in the process, directly computing the missing and common attribute as we have most element at hand already. ### benchmark.name = hg.command.bundle # bin-env-vars.hg.flavor = default # bin-env-vars.hg.py-re2-module = default # benchmark.variants.revs = all # benchmark.variants.type = none-streamv2 ## data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog before: 7.750458 after: 6.665565 (-14.00%, -1.08) ## data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog before: 0.700229 after: 0.496050 (-29.16%, -0.20) ## data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog before: 346.508952 after: 316.749699 (-8.59%, -29.76) ## data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog before: 3.401700 after: 2.915810 (-14.28%, -0.49) ## data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog before: 1.870798 after: 1.461583 (-21.87%, -0.41) note: this whole `missingroots` of outgoing has a limited number of callers and could likely be replace by something simpler (like taking an explicit "missing_revs" set for example). However this is a wider change and we focus on a small impact, quick rework that does not change the API for now.


  $ . "$TESTDIR/narrow-library.sh"

create full repo

  $ hg init master
  $ cd master

  $ mkdir inside
  $ echo inside > inside/f1
  $ mkdir outside
  $ echo outside > outside/f2
  $ hg ci -Aqm 'initial'

  $ hg mv outside/f2 inside/f2
  $ hg ci -qm 'move f2 from outside'

  $ echo modified > inside/f2
  $ hg ci -qm 'modify inside/f2'

  $ mkdir outside
  $ echo new > outside/f3
  $ hg ci -Aqm 'add outside/f3'
  $ cd ..

  $ hg clone --narrow ssh://user@dummy/master narrow --include inside -r 2
  adding changesets
  adding manifests
  adding file changes
  added 3 changesets with 3 changes to 2 files
  new changesets *:* (glob)
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd narrow

  $ hg co 'desc("move f2")'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg status
  $ hg diff
  $ hg diff --change . --git
  diff --git a/inside/f2 b/inside/f2
  new file mode 100644
  --- /dev/null
  +++ b/inside/f2
  @@ -0,0 +1,1 @@
  +outside

  $ hg log --follow inside/f2 -r tip
  changeset:   2:bcfb756e0ca9
  tag:         tip
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     modify inside/f2
  
  changeset:   1:5a016133b2bb
  user:        test
  date:        Thu Jan 01 00:00:00 1970 +0000
  summary:     move f2 from outside
  
  $ echo new > inside/f4
  $ hg ci -Aqm 'add inside/f4'
  $ hg pull -q
  $ hg --config extensions.rebase= rebase -d tip
  rebasing 3:4f84b666728c "add inside/f4"
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/4f84b666728c-4269b76e-rebase.hg

  $ hg co -q 0
  $ echo modified > inside/f1
  $ hg ci -qm 'modify inside/f1'
  $ echo new > inside/f5
  $ hg ci -Aqm 'add inside/f5'
  $ hg --config extensions.rebase= rebase -d 'public()' -r .
  rebasing 6:610b60178c28 tip "add inside/f5"
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/610b60178c28-65716a78-rebase.hg