nodemap: gate the feature behind a new requirement
Now that the feature is working smoothly, a question was still open, should we
gate the feature behind a new requirement or just treat it as a cache to be
warmed by those who can and ignored by other.
The advantage of using the cache approach is a transparent upgrade/downgrade
story, making the feature easier to move to. However having out of date cache
can come with a significant performance hit for process who expect an up to
date cache but found none. In this case the file needs to be stored under
`.hg/cache`.
The "requirement" approach guarantee that the persistent nodemap is up to date.
However, it comes with a less flexible activation story since an explicite
upgrade is required. In this case the file can be stored in `.hg/store`.
This wiki page is relevant to this questions:
https://www.mercurial-scm.org/wiki/ComputedIndexPlan
So which one should we take? Another element came into plan, the persistent
nodemap use the `add` method of the transaction, it is used to keep track of a
file content before a transaction in case we need to rollback it back. It turns
out that the `transaction.add` API does not support file stored anywhere than
`.hg/store`. Making it support file stored elsewhere is possible, require a
change in on disk transaction format. Updating on disk file requires…
introducing a new requirements.
As a result, we pick the second option "gating the persistent nodemap behind a
new requirements".
Differential Revision: https://phab.mercurial-scm.org/D8417
Testing cloning with the EOL extension
$ cat >> $HGRCPATH <<EOF
> [extensions]
> eol =
>
> [eol]
> native = CRLF
> EOF
setup repository
$ hg init repo
$ cd repo
$ cat > .hgeol <<EOF
> [patterns]
> **.txt = native
> EOF
$ printf "first\r\nsecond\r\nthird\r\n" > a.txt
$ hg commit --addremove -m 'checkin'
adding .hgeol
adding a.txt
Test commit of removed .hgeol and how it immediately makes the automatic
changes explicit and committable.
$ cd ..
$ hg clone repo repo-2
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd repo-2
$ cat a.txt
first\r (esc)
second\r (esc)
third\r (esc)
$ hg cat a.txt
first
second
third
$ hg remove .hgeol
$ touch a.txt * # ensure consistent st dirtyness checks, ignoring dirstate timing
$ hg st -v --debug
M a.txt
R .hgeol
$ hg commit -m 'remove eol'
$ hg exp
# HG changeset patch
# User test
# Date 0 0
# Thu Jan 01 00:00:00 1970 +0000
# Node ID 3c20c2d90333b6ecdc8f7aa8f9b73223c7c7a608
# Parent 90f94e2cf4e24628afddd641688dfe4cd476d6e4
remove eol
diff -r 90f94e2cf4e2 -r 3c20c2d90333 .hgeol
--- a/.hgeol Thu Jan 01 00:00:00 1970 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-[patterns]
-**.txt = native
diff -r 90f94e2cf4e2 -r 3c20c2d90333 a.txt
--- a/a.txt Thu Jan 01 00:00:00 1970 +0000
+++ b/a.txt Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +1,3 @@
-first
-second
-third
+first\r (esc)
+second\r (esc)
+third\r (esc)
$ hg push --quiet
$ cd ..
Test clone of repo with .hgeol in working dir, but no .hgeol in default
checkout revision tip. The repo is correctly updated to be consistent and have
the exact content checked out without filtering, ignoring the current .hgeol in
the source repo:
$ cat repo/.hgeol
[patterns]
**.txt = native
$ hg clone repo repo-3 -v --debug
linked 7 files
updating to branch default
resolving manifests
branchmerge: False, force: False, partial: False
ancestor: 000000000000, local: 000000000000+, remote: 3c20c2d90333
calling hook preupdate.eol: hgext.eol.preupdate
a.txt: remote created -> g
getting a.txt
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd repo-3
$ cat a.txt
first\r (esc)
second\r (esc)
third\r (esc)
Test clone of revision with .hgeol
$ cd ..
$ hg clone -r 0 repo repo-4
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
new changesets 90f94e2cf4e2
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd repo-4
$ cat .hgeol
[patterns]
**.txt = native
$ cat a.txt
first\r (esc)
second\r (esc)
third\r (esc)
$ cd ..