view tests/test-narrow-rebase.t @ 46095:93e09d370003

treemanifest: stop storing full path for each item in manifest._lazydirs This information is obtainable, if needed, based on the lazydirs key (which is the entry name) and the manifest's `dir()` method. ### Performance This is actually both a memory and a performance improvement, but it's likely to be a very small one in most situations. In the pathological repo I've been using for testing other performance work I've done recently, this reduced the time for a rebase operation (rebasing two commits across a public-phase change that touches a sibling of one of my tracked directories where the common parent is massive (>>10k entries)): #### Before ``` Time (mean ± σ): 4.059 s ± 0.121 s [User: 0.9 ms, System: 0.6 ms] Range (min … max): 3.941 s … 4.352 s 10 runs ``` #### After ``` Time (mean ± σ): 3.707 s ± 0.060 s [User: 0.8 ms, System: 0.8 ms] Range (min … max): 3.648 s … 3.818 s 10 runs ``` Differential Revision: https://phab.mercurial-scm.org/D9553
author Kyle Lippincott <spectral@google.com>
date Thu, 03 Dec 2020 14:39:39 -0800
parents f90a5c211251
children 8e855e9984a6
line wrap: on
line source

#testcases continuecommand continueflag
#if continueflag
  $ cat >> $HGRCPATH <<EOF
  > [alias]
  > continue = rebase --continue
  > EOF
#endif

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

create full repo

  $ hg init master
  $ cd master

  $ mkdir inside
  $ echo inside1 > inside/f1
  $ echo inside2 > inside/f2
  $ mkdir outside
  $ echo outside1 > outside/f1
  $ echo outside2 > outside/f2
  $ hg ci -Aqm 'initial'

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

  $ hg update -q 0
  $ echo modified2 > inside/f2
  $ hg ci -qm 'modify inside/f2'

  $ hg update -q 0
  $ echo modified > outside/f1
  $ hg ci -qm 'modify outside/f1'

  $ hg update -q 0
  $ echo modified2 > outside/f1
  $ hg ci -qm 'conflicting outside/f1'

  $ cd ..

  $ hg clone --narrow ssh://user@dummy/master narrow --include inside
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 5 changesets with 4 changes to 2 files (+3 heads)
  new changesets *:* (glob)
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd narrow
  $ cat >> $HGRCPATH <<EOF
  > [extensions]
  > rebase=
  > EOF

  $ hg update -q 0

Can rebase onto commit where no files outside narrow spec are involved

  $ hg update -q 0
  $ echo modified > inside/f2
  $ hg ci -qm 'modify inside/f2'
  $ hg rebase -d 'desc("modify inside/f1")'
  rebasing 5:c2f36d04e05d tip "modify inside/f2"
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-rebase.hg (glob)

Can rebase onto conflicting changes inside narrow spec

  $ hg update -q 0
  $ echo conflicting > inside/f1
  $ hg ci -qm 'conflicting inside/f1'
  $ hg rebase -d 'desc("modify inside/f1")' 2>&1 | egrep -v '(warning:|incomplete!)'
  rebasing 6:cdce97fbf653 tip "conflicting inside/f1"
  merging inside/f1
  unresolved conflicts (see 'hg resolve', then 'hg rebase --continue')
  $ echo modified3 > inside/f1
  $ hg resolve -m 2>&1 | grep -v continue:
  (no more unresolved files)
  $ hg continue
  rebasing 6:cdce97fbf653 tip "conflicting inside/f1"
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-rebase.hg (glob)

Can rebase onto non-conflicting changes outside narrow spec

  $ hg update -q 0
  $ echo modified > inside/f2
  $ hg ci -qm 'modify inside/f2'
  $ hg rebase -d 'desc("modify outside/f1")'
  rebasing 7:c2f36d04e05d tip "modify inside/f2"
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-rebase.hg (glob)

Rebase interrupts on conflicting changes outside narrow spec

  $ hg update -q 'desc("conflicting outside/f1")'
  $ hg phase -f -d .
  $ hg rebase -d 'desc("modify outside/f1")'
  rebasing 4:707c035aadb6 "conflicting outside/f1"
  abort: conflict in file 'outside/f1' is outside narrow clone
  [255]