tests/test-narrow-merge.t
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 13 Feb 2023 22:53:54 +0100
changeset 50054 44528f4a4d53
parent 48730 f1eb77dceb36
child 50722 7e5be4a7cda7
permissions -rw-r--r--
dirstate: explicitly write the dirstate after `keyword` "overwrite" I am working on making the dirstate write patterns more predictable. This patch is part of a small series of similar patches that adds a explicit dirstate write in a handful of location where the dirstate is updated "a bit in a strange way". With this explicit write, we are no longer relying on implicite write of the dirstate on `wlock` release. This make the world a better place.

#testcases flat tree

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

#if tree
  $ cat << EOF >> $HGRCPATH
  > [experimental]
  > treemanifest = 1
  > EOF
#endif

create full repo

  $ hg init master
  $ cd master
  $ cat >> .hg/hgrc <<EOF
  > [narrow]
  > serveellipses=True
  > EOF

  $ 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 modified > inside/f2
  $ hg ci -qm 'modify inside/f2'

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

  $ 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 6 changesets with 5 changes to 2 files (+4 heads)
  new changesets *:* (glob)
  updating to branch default
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ cd narrow

  $ hg update -q 0

Can merge in when no files outside narrow spec are involved

  $ hg update -q 'desc("modify inside/f1")'
  $ hg merge 'desc("modify inside/f2")'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ hg commit -m 'merge inside changes'

Can merge conflicting changes inside narrow spec

  $ hg update -q 'desc("modify inside/f1")'
  $ hg merge 'desc("conflicting inside/f1")' 2>&1 | egrep -v '(warning:|incomplete!)'
  merging inside/f1
  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
  use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
  $ echo modified3 > inside/f1
  $ hg resolve -m
  (no more unresolved files)
  $ hg commit -m 'merge inside/f1'

TODO: Can merge non-conflicting changes outside narrow spec

  $ hg update -q 'desc("modify inside/f1")'

#if flat

  $ hg merge 'desc("modify outside/f1")'
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)

status should be clean

  $ hg status
  ? inside/f1.orig

file out of the spec should still not be in the dirstate at all

  $ hg debugdirstate | grep outside/f1
  [1]

Commit that merge

  $ hg ci -m 'merge from outside to inside'

status should be clean

  $ hg status
  ? inside/f1.orig

file out of the spec should not be in the mergestate anymore

  $ hg debugmergestate | grep outside/f1
  [1]

file out of the spec should still not be in the dirstate at all

  $ hg debugdirstate | grep outside/f1
  [1]

The filenode used should come from p2

  $ hg manifest --debug --rev . | grep outside/f1
  83cd11431a3b2aff8a3995e5f27bcf33cdb5be98 644   outside/f1
  $ hg manifest --debug --rev 'p1(.)' | grep outside/f1
  c6b956c48be2cd4fa94be16002aba311143806fa 644   outside/f1
  $ hg manifest --debug --rev 'p2(.)' | grep outside/f1
  83cd11431a3b2aff8a3995e5f27bcf33cdb5be98 644   outside/f1


remove the commit to get in the previous situation again

  $ hg debugstrip -r .
  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
  saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/48eb25338b19-a1bb8350-backup.hg

#else

  $ hg merge 'desc("modify outside/f1")'
  abort: merge affects file 'outside/' outside narrow, which is not yet supported (tree !)
  (merging in the other direction may work)
  [255]

#endif

  $ hg update -q 'desc("modify outside/f1")'
  $ hg merge 'desc("modify inside/f1")'
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  (branch merge, don't forget to commit)
  $ hg ci -m 'merge from inside to outside'

Refuses merge of conflicting outside changes

  $ hg update -q 'desc("modify outside/f1")'
  $ hg merge 'desc("conflicting outside/f1")'
  abort: conflict in file 'outside/f1' is outside narrow clone (flat !)
  abort: conflict in file 'outside/' is outside narrow clone (tree !)
  [20]