narrowspec: move module into core
Having support for parsing the narrow specification in core is
necessary for moving many other parts of narrow to core.
We do still want to harmonize the narrow spec with the sparse
spec. And the format needs to be documented. But this shouldn't
hold up the code moving to core.
Differential Revision: https://phab.mercurial-scm.org/D2201
$ . "$TESTDIR/narrow-library.sh"
create full repo
$ hg init master
$ cd master
$ echo init > init
$ hg ci -Aqm 'initial'
$ mkdir inside
$ echo inside > inside/f1
$ mkdir outside
$ echo outside > outside/f1
$ hg ci -Aqm 'add inside and outside'
$ echo modified > inside/f1
$ hg ci -qm 'modify inside'
$ echo modified > outside/f1
$ hg ci -qm 'modify outside'
$ cd ..
$ hg clone --narrow ssh://user@dummy/master narrow --include inside
requesting all changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 2 changes to 1 files
new changesets *:* (glob)
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd narrow
$ hg debugindex -c
rev offset length base linkrev nodeid p1 p2
0 0 64 0 0 9958b1af2add 000000000000 000000000000
1 64 81 1 1 2db4ce2a3bfe 9958b1af2add 000000000000
2 145 75 2 2 0980ee31a742 2db4ce2a3bfe 000000000000
3 220 (76|77) 3 3 4410145019b7 0980ee31a742 000000000000 (re)
$ hg update -q 0
Can update to revision with changes inside
$ hg update -q 'desc("add inside and outside")'
$ hg update -q 'desc("modify inside")'
$ find *
inside
inside/f1
$ cat inside/f1
modified
Can update to revision with changes outside
$ hg update -q 'desc("modify outside")'
$ find *
inside
inside/f1
$ cat inside/f1
modified
Can update with a deleted file inside
$ hg rm inside/f1
$ hg update -q 'desc("modify inside")'
$ hg update -q 'desc("modify outside")'
$ hg update -q 'desc("initial")'
$ hg update -q 'desc("modify inside")'
Can update with a moved file inside
$ hg mv inside/f1 inside/f2
$ hg update -q 'desc("modify outside")'
$ hg update -q 'desc("initial")'
$ hg update -q 'desc("modify inside")'