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 check for obsolescence and instability during push
=======================================================
$ . $TESTDIR/testlib/obsmarker-common.sh
$ cat >> $HGRCPATH << EOF
> [phases]
> publish=false
> [experimental]
> evolution = all
> EOF
Tests that pushing orphaness to the server is detected
======================================================
initial setup
$ mkdir base
$ cd base
$ hg init server
$ cd server
$ mkcommit root
$ hg phase --public .
$ mkcommit commit_A0_
$ mkcommit commit_B0_
$ cd ..
$ hg init client
$ cd client
$ echo '[paths]' >> .hg/hgrc
$ echo 'default=../server' >> .hg/hgrc
$ hg pull
pulling from $TESTTMP/base/server
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 3 files
new changesets 1e4be0697311:c09d8ab29fda (2 drafts)
(run 'hg update' to get a working copy)
$ hg up 'desc("root")'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(having some unrelated change affects discovery result, we should ideally test both case)
$ hg branch unrelated --quiet
$ mkcommit unrelated
$ hg up null
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ hg log -G
o changeset: 3:16affbe0f986
| branch: unrelated
| tag: tip
| parent: 0:1e4be0697311
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unrelated
|
| o changeset: 2:c09d8ab29fda
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | summary: commit_B0_
| |
| o changeset: 1:37624bf21024
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: commit_A0_
|
o changeset: 0:1e4be0697311
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ cd ..
$ cd ..
Orphan from pruning
-------------------
Setup
$ cp -R base check-pruned
$ cd check-pruned/client
$ hg debugobsolete --record-parents `getid 'desc("commit_A0_")'`
1 new obsolescence markers
obsoleted 1 changesets
1 new orphan changesets
$ hg log -G
o changeset: 3:16affbe0f986
| branch: unrelated
| tag: tip
| parent: 0:1e4be0697311
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unrelated
|
| * changeset: 2:c09d8ab29fda
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | instability: orphan
| | summary: commit_B0_
| |
| x changeset: 1:37624bf21024
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| obsolete: pruned
| summary: commit_A0_
|
o changeset: 0:1e4be0697311
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
Pushing the result is prevented with a message
$ hg push --new-branch
pushing to $TESTTMP/check-pruned/server
searching for changes
abort: push includes orphan changeset: c09d8ab29fda!
[255]
$ cd ../..
Orphan from superseding
-----------------------
Setup
$ cp -R base check-superseded
$ cd check-superseded/client
$ hg up 'desc("commit_A0_")'
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch other
marked working directory as branch other
$ hg commit --amend -m commit_A1_
1 new orphan changesets
$ hg log -G
@ changeset: 4:df9b82a99e21
| branch: other
| tag: tip
| parent: 0:1e4be0697311
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: commit_A1_
|
| o changeset: 3:16affbe0f986
|/ branch: unrelated
| parent: 0:1e4be0697311
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unrelated
|
| * changeset: 2:c09d8ab29fda
| | user: test
| | date: Thu Jan 01 00:00:00 1970 +0000
| | instability: orphan
| | summary: commit_B0_
| |
| x changeset: 1:37624bf21024
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| obsolete: rewritten using amend as 4:df9b82a99e21
| summary: commit_A0_
|
o changeset: 0:1e4be0697311
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
Pushing the result is prevented with a message
$ hg push --new-branch
pushing to $TESTTMP/check-superseded/server
searching for changes
abort: push includes orphan changeset: c09d8ab29fda!
[255]
$ cd ../..
Tests that user get warned if it is about to publish obsolete/unstable content
------------------------------------------------------------------------------
Orphan from pruning
-------------------
Make sure the only difference is phase:
$ cd check-pruned/client
$ hg push --force --rev 'not desc("unrelated")'
pushing to $TESTTMP/check-pruned/server
searching for changes
no changes found
1 new obsolescence markers
obsoleted 1 changesets
1 new orphan changesets
[1]
Check something prevents a silent publication of the obsolete changeset
$ hg push --publish --new-branch
pushing to $TESTTMP/check-pruned/server
searching for changes
abort: push includes orphan changeset: c09d8ab29fda!
[255]
$ cd ../..
Orphan from superseding
-----------------------
Make sure the only difference is phase:
$ cd check-superseded/client
$ hg push --force --rev 'not desc("unrelated")'
pushing to $TESTTMP/check-superseded/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files (+1 heads)
1 new obsolescence markers
obsoleted 1 changesets
1 new orphan changesets
Check something prevents a silent publication of the obsolete changeset
$ hg push --publish --new-branch
pushing to $TESTTMP/check-superseded/server
searching for changes
abort: push includes orphan changeset: c09d8ab29fda!
[255]
$ cd ../..