status: prefer relative paths in Rust code
… when the repository root is under the current directory,
so the kernel needs to traverse fewer directory in every call
to `read_dir` or `symlink_metadata`.
Better yet would be to use libc functions like `openat` and `fstatat`
to remove such repeated traversals entirely, but the standard library
does not provide APIs based on those.
Maybe with a crate like https://crates.io/crates/openat instead?
Benchmarks of `rhg status` show that this patch is neutral in some configurations,
and makes the command up to ~20% faster in others.
Below is semi-arbitrary subset of results. The four numeric columns are:
time (in seconds) with this changeset’s parent, time with this changeset,
time difference (negative is better), time ratio (less than 1 is better).
```
mercurial-dirstate-v1 | default-plain-clean.no-iu.pbr | 0.0061 -> 0.0059: -0.0002 (0.97)
mercurial-dirstate-v2 | default-plain-clean.no-iu.pbr | 0.0029 -> 0.0028: -0.0001 (0.97)
mozilla-dirstate-v1 | default-plain-clean.no-iu.pbr | 0.2110 -> 0.2102: -0.0007 (1.00)
mozilla-dirstate-v2 | default-copies-clean.ignored.pbr | 0.0489 -> 0.0401: -0.0088 (0.82)
mozilla-dirstate-v2 | default-copies-clean.no-iu.pbr | 0.0479 -> 0.0393: -0.0085 (0.82)
mozilla-dirstate-v2 | default-copies-large.all.pbr | 0.1262 -> 0.1210: -0.0051 (0.96)
mozilla-dirstate-v2 | default-copies-small.ignored-unknown.pbr | 0.1262 -> 0.1200: -0.0062 (0.95)
mozilla-dirstate-v2 | default-copies-small.ignored.pbr | 0.0536 -> 0.0417: -0.0119 (0.78)
mozilla-dirstate-v2 | default-copies-small.no-iu.pbr | 0.0482 -> 0.0393: -0.0089 (0.81)
mozilla-dirstate-v2 | default-plain-clean.ignored.pbr | 0.0518 -> 0.0402: -0.0116 (0.78)
mozilla-dirstate-v2 | default-plain-clean.no-iu.pbr | 0.0481 -> 0.0392: -0.0088 (0.82)
mozilla-dirstate-v2 | default-plain-large.all.pbr | 0.1271 -> 0.1218: -0.0052 (0.96)
mozilla-dirstate-v2 | default-plain-small.ignored-unknown.pbr | 0.1225 -> 0.1202: -0.0022 (0.98)
mozilla-dirstate-v2 | default-plain-small.ignored.pbr | 0.0510 -> 0.0418: -0.0092 (0.82)
mozilla-dirstate-v2 | default-plain-small.no-iu.pbr | 0.0480 -> 0.0394: -0.0086 (0.82)
netbeans-dirstate-v1 | default-plain-clean.no-iu.pbr | 0.1442 -> 0.1422: -0.0020 (0.99)
netbeans-dirstate-v2 | default-plain-clean.no-iu.pbr | 0.0325 -> 0.0282: -0.0043 (0.87)
```
Differential Revision: https://phab.mercurial-scm.org/D12175
========================================================
Test the ability to access a hidden revision on a server
========================================================
#require serve
$ . $TESTDIR/testlib/obsmarker-common.sh
$ cat >> $HGRCPATH << EOF
> [phases]
> # public changeset are not obsolete
> publish=false
> [experimental]
> evolution=all
> [ui]
> logtemplate='{rev}:{node|short} {desc} [{phase}]\n'
> EOF
Setup a simple repository with some hidden revisions
----------------------------------------------------
Testing the `served.hidden` view
$ hg init repo-with-hidden
$ cd repo-with-hidden
$ echo 0 > a
$ hg ci -qAm "c_Public"
$ hg phase --public
$ echo 1 > a
$ hg ci -m "c_Amend_Old"
$ echo 2 > a
$ hg ci -m "c_Amend_New" --amend
$ hg up ".^"
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 3 > a
$ hg ci -m "c_Pruned"
created new head
$ hg debugobsolete --record-parents `getid 'desc("c_Pruned")'` -d '0 0'
1 new obsolescence markers
obsoleted 1 changesets
$ hg up ".^"
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 4 > a
$ hg ci -m "c_Secret" --secret
created new head
$ echo 5 > a
$ hg ci -m "c_Secret_Pruned" --secret
$ hg debugobsolete --record-parents `getid 'desc("c_Secret_Pruned")'` -d '0 0'
1 new obsolescence markers
obsoleted 1 changesets
$ hg up null
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg log -G -T '{rev}:{node|short} {desc} [{phase}]\n' --hidden
x 5:8d28cbe335f3 c_Secret_Pruned [secret]
|
o 4:1c6afd79eb66 c_Secret [secret]
|
| x 3:5d1575e42c25 c_Pruned [draft]
|/
| o 2:c33affeb3f6b c_Amend_New [draft]
|/
| x 1:be215fbb8c50 c_Amend_Old [draft]
|/
o 0:5f354f46e585 c_Public [public]
$ hg debugobsolete
be215fbb8c5090028b00154c1fe877ad1b376c61 c33affeb3f6b4e9621d1839d6175ddc07708807c 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
5d1575e42c25b7f2db75cd4e0b881b1c35158fae 0 {5f354f46e5853535841ec7a128423e991ca4d59b} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
8d28cbe335f311bc89332d7bbe8a07889b6914a0 0 {1c6afd79eb6663275bbe30097e162b1c24ced0f0} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
$ cd ..
Test the feature
================
Check cache pre-warm
--------------------
$ ls -1 repo-with-hidden/.hg/cache
branch2
branch2-base
branch2-served
branch2-served.hidden
branch2-visible
rbc-names-v1
rbc-revs-v1
tags2
tags2-visible
Check that the `served.hidden` repoview
---------------------------------------
$ hg -R repo-with-hidden serve -p $HGPORT -d --pid-file hg.pid --config web.view=served.hidden
$ cat hg.pid >> $DAEMON_PIDS
changesets in secret and higher phases are not visible through hgweb
$ hg -R repo-with-hidden log --template "revision: {rev}\\n" --rev "reverse(not secret())"
revision: 2
revision: 0
$ hg -R repo-with-hidden log --template "revision: {rev}\\n" --rev "reverse(not secret())" --hidden
revision: 3
revision: 2
revision: 1
revision: 0
$ get-with-headers.py localhost:$HGPORT 'log?style=raw' | grep revision:
revision: 3
revision: 2
revision: 1
revision: 0
$ killdaemons.py