The requirements is now recognised and dealt with and the associated files
properly handled.
The persistent nodemap should be ready for usage in the field now.
mharbison72 | |
Alphare | |
durin42 |
hg-reviewers |
The requirements is now recognised and dealt with and the associated files
properly handled.
The persistent nodemap should be ready for usage in the field now.
No Linters Available |
No Unit Test Coverage |
In D8431#125976, @mharbison72 wrote:s/requirements is not/requirement is now/ in the summary, but otherwise LGTM
Good catch, fixing it now.
This requirement needs documentation in mercurial/helptext/internals/requirements.txt. I've taken the rest of the stack, but am blocking this patch on that change.
Good catch. I updated the internal doc and https://www.mercurial-scm.org/wiki/MissingRequirement
Path | Packages | |||
---|---|---|---|---|
M | mercurial/upgrade.py (5 lines) | |||
M | tests/test-persistent-nodemap.t (96 lines) |
Commit | Parents | Author | Summary | Date |
---|---|---|---|---|
d6dad7db003a | c96ebe4659bb | Pierre-Yves David | Apr 14 2020, 12:09 AM |
Status | Author | Revision | |
---|---|---|---|
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute | ||
Closed | marmoute |
If an upgrade were to create a repository that dropped a requirement, | If an upgrade were to create a repository that dropped a requirement, | ||||
the dropped requirement must appear in the returned set for the upgrade | the dropped requirement must appear in the returned set for the upgrade | ||||
to be allowed. | to be allowed. | ||||
""" | """ | ||||
supported = { | supported = { | ||||
localrepo.SPARSEREVLOG_REQUIREMENT, | localrepo.SPARSEREVLOG_REQUIREMENT, | ||||
localrepo.SIDEDATA_REQUIREMENT, | localrepo.SIDEDATA_REQUIREMENT, | ||||
localrepo.COPIESSDC_REQUIREMENT, | localrepo.COPIESSDC_REQUIREMENT, | ||||
localrepo.NODEMAP_REQUIREMENT, | |||||
} | } | ||||
for name in compression.compengines: | for name in compression.compengines: | ||||
engine = compression.compengines[name] | engine = compression.compengines[name] | ||||
if engine.available() and engine.revlogheader(): | if engine.available() and engine.revlogheader(): | ||||
supported.add(b'exp-compression-%s' % name) | supported.add(b'exp-compression-%s' % name) | ||||
if engine.name() == b'zstd': | if engine.name() == b'zstd': | ||||
supported.add(b'revlog-compression-zstd') | supported.add(b'revlog-compression-zstd') | ||||
return supported | return supported | ||||
b'dotencode', | b'dotencode', | ||||
b'fncache', | b'fncache', | ||||
b'generaldelta', | b'generaldelta', | ||||
b'revlogv1', | b'revlogv1', | ||||
b'store', | b'store', | ||||
localrepo.SPARSEREVLOG_REQUIREMENT, | localrepo.SPARSEREVLOG_REQUIREMENT, | ||||
localrepo.SIDEDATA_REQUIREMENT, | localrepo.SIDEDATA_REQUIREMENT, | ||||
localrepo.COPIESSDC_REQUIREMENT, | localrepo.COPIESSDC_REQUIREMENT, | ||||
localrepo.NODEMAP_REQUIREMENT, | |||||
} | } | ||||
for name in compression.compengines: | for name in compression.compengines: | ||||
engine = compression.compengines[name] | engine = compression.compengines[name] | ||||
if engine.available() and engine.revlogheader(): | if engine.available() and engine.revlogheader(): | ||||
supported.add(b'exp-compression-%s' % name) | supported.add(b'exp-compression-%s' % name) | ||||
if engine.name() == b'zstd': | if engine.name() == b'zstd': | ||||
supported.add(b'revlog-compression-zstd') | supported.add(b'revlog-compression-zstd') | ||||
return supported | return supported | ||||
""" | """ | ||||
supported = { | supported = { | ||||
b'dotencode', | b'dotencode', | ||||
b'fncache', | b'fncache', | ||||
b'generaldelta', | b'generaldelta', | ||||
localrepo.SPARSEREVLOG_REQUIREMENT, | localrepo.SPARSEREVLOG_REQUIREMENT, | ||||
localrepo.SIDEDATA_REQUIREMENT, | localrepo.SIDEDATA_REQUIREMENT, | ||||
localrepo.COPIESSDC_REQUIREMENT, | localrepo.COPIESSDC_REQUIREMENT, | ||||
localrepo.NODEMAP_REQUIREMENT, | |||||
} | } | ||||
for name in compression.compengines: | for name in compression.compengines: | ||||
engine = compression.compengines[name] | engine = compression.compengines[name] | ||||
if engine.available() and engine.revlogheader(): | if engine.available() and engine.revlogheader(): | ||||
supported.add(b'exp-compression-%s' % name) | supported.add(b'exp-compression-%s' % name) | ||||
if engine.name() == b'zstd': | if engine.name() == b'zstd': | ||||
supported.add(b'revlog-compression-zstd') | supported.add(b'revlog-compression-zstd') | ||||
return supported | return supported | ||||
requirements: set of requirements for ``dstrepo`` | requirements: set of requirements for ``dstrepo`` | ||||
path: store file being examined | path: store file being examined | ||||
mode: the ``ST_MODE`` file type of ``path`` | mode: the ``ST_MODE`` file type of ``path`` | ||||
st: ``stat`` data structure for ``path`` | st: ``stat`` data structure for ``path`` | ||||
Function should return ``True`` if the file is to be copied. | Function should return ``True`` if the file is to be copied. | ||||
""" | """ | ||||
# Skip revlogs. | # Skip revlogs. | ||||
if path.endswith((b'.i', b'.d')): | if path.endswith((b'.i', b'.d', b'.n', b'.nd')): | ||||
return False | return False | ||||
# Skip transaction related files. | # Skip transaction related files. | ||||
if path.startswith(b'undo'): | if path.startswith(b'undo'): | ||||
return False | return False | ||||
# Only copy regular files. | # Only copy regular files. | ||||
if mode != stat.S_IFREG: | if mode != stat.S_IFREG: | ||||
return False | return False | ||||
# Skip other skipped files. | # Skip other skipped files. |
data-unused: 0 (no-pure no-rust !) | data-unused: 0 (no-pure no-rust !) | ||||
data-unused: 0.369% (pure !) | data-unused: 0.369% (pure !) | ||||
data-unused: 0.369% (rust !) | data-unused: 0.369% (rust !) | ||||
data-unused: 0.000% (no-pure no-rust !) | data-unused: 0.000% (no-pure no-rust !) | ||||
$ f --size --sha256 .hg/store/00changelog-*.nd | $ f --size --sha256 .hg/store/00changelog-*.nd | ||||
.hg/store/00changelog-????????????????.nd: size=121536, sha256=bb414468d225cf52d69132e1237afba34d4346ee2eb81b505027e6197b107f03 (glob) (pure !) | .hg/store/00changelog-????????????????.nd: size=121536, sha256=bb414468d225cf52d69132e1237afba34d4346ee2eb81b505027e6197b107f03 (glob) (pure !) | ||||
.hg/store/00changelog-????????????????.nd: size=121536, sha256=909ac727bc4d1c0fda5f7bff3c620c98bd4a2967c143405a1503439e33b377da (glob) (rust !) | .hg/store/00changelog-????????????????.nd: size=121536, sha256=909ac727bc4d1c0fda5f7bff3c620c98bd4a2967c143405a1503439e33b377da (glob) (rust !) | ||||
.hg/store/00changelog-????????????????.nd: size=121088, sha256=342d36d30d86dde67d3cb6c002606c4a75bcad665595d941493845066d9c8ee0 (glob) (no-pure no-rust !) | .hg/store/00changelog-????????????????.nd: size=121088, sha256=342d36d30d86dde67d3cb6c002606c4a75bcad665595d941493845066d9c8ee0 (glob) (no-pure no-rust !) | ||||
Test upgrade / downgrade | |||||
======================== | |||||
downgrading | |||||
$ cat << EOF >> .hg/hgrc | |||||
> [format] | |||||
> use-persistent-nodemap=no | |||||
> EOF | |||||
$ hg debugformat -v | |||||
format-variant repo config default | |||||
fncache: yes yes yes | |||||
dotencode: yes yes yes | |||||
generaldelta: yes yes yes | |||||
sparserevlog: yes yes yes | |||||
sidedata: no no no | |||||
persistent-nodemap: yes no no | |||||
copies-sdc: no no no | |||||
plain-cl-delta: yes yes yes | |||||
compression: zlib zlib zlib | |||||
compression-level: default default default | |||||
$ hg debugupgraderepo --run --no-backup --quiet | |||||
upgrade will perform the following actions: | |||||
requirements | |||||
preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store | |||||
removed: persistent-nodemap | |||||
$ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)' | |||||
[1] | |||||
$ hg debugnodemap --metadata | |||||
upgrading | |||||
$ cat << EOF >> .hg/hgrc | |||||
> [format] | |||||
> use-persistent-nodemap=yes | |||||
> EOF | |||||
$ hg debugformat -v | |||||
format-variant repo config default | |||||
fncache: yes yes yes | |||||
dotencode: yes yes yes | |||||
generaldelta: yes yes yes | |||||
sparserevlog: yes yes yes | |||||
sidedata: no no no | |||||
persistent-nodemap: no yes no | |||||
copies-sdc: no no no | |||||
plain-cl-delta: yes yes yes | |||||
compression: zlib zlib zlib | |||||
compression-level: default default default | |||||
$ hg debugupgraderepo --run --no-backup --quiet | |||||
upgrade will perform the following actions: | |||||
requirements | |||||
preserved: dotencode, fncache, generaldelta, revlogv1, sparserevlog, store | |||||
added: persistent-nodemap | |||||
$ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)' | |||||
00changelog-*.nd (glob) | |||||
00changelog.n | |||||
00manifest-*.nd (glob) | |||||
00manifest.n | |||||
$ hg debugnodemap --metadata | |||||
uid: * (glob) | |||||
tip-rev: 5005 | |||||
tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe | |||||
data-length: 121088 | |||||
data-unused: 0 | |||||
data-unused: 0.000% | |||||
Running unrelated upgrade | |||||
$ hg debugupgraderepo --run --no-backup --quiet --optimize re-delta-all | |||||
upgrade will perform the following actions: | |||||
requirements | |||||
preserved: dotencode, fncache, generaldelta, persistent-nodemap, revlogv1, sparserevlog, store | |||||
optimisations: re-delta-all | |||||
$ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)' | |||||
00changelog-*.nd (glob) | |||||
00changelog.n | |||||
00manifest-*.nd (glob) | |||||
00manifest.n | |||||
$ hg debugnodemap --metadata | |||||
uid: * (glob) | |||||
tip-rev: 5005 | |||||
tip-node: 90d5d3ba2fc47db50f712570487cb261a68c8ffe | |||||
data-length: 121088 | |||||
data-unused: 0 | |||||
data-unused: 0.000% |