test-status.t
1002 lines
| 18.5 KiB
| text/troff
|
Tads3Lexer
/ tests / test-status.t
|
r48882 | #testcases dirstate-v1 dirstate-v2 | ||
|
r48056 | |||
#if dirstate-v2 | ||||
r49049 | $ cat >> $HGRCPATH << EOF | |||
> [format] | ||||
r49523 | > use-dirstate-v2=1 | |||
r49049 | > [storage] | |||
> dirstate-v2.slow-path=allow | ||||
> EOF | ||||
|
r48056 | #endif | ||
|
r11782 | $ hg init repo1 | ||
$ cd repo1 | ||||
$ mkdir a b a/1 b/1 b/2 | ||||
$ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2 | ||||
hg status in repo root: | ||||
$ hg status | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
hg status . in repo root: | ||||
$ hg status . | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd a | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd a . | ||||
? 1/in_a_1 | ||||
? in_a | ||||
$ hg status --cwd a .. | ||||
? 1/in_a_1 | ||||
? in_a | ||||
? ../b/1/in_b_1 | ||||
? ../b/2/in_b_2 | ||||
? ../b/in_b | ||||
? ../in_root | ||||
$ hg status --cwd b | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd b . | ||||
? 1/in_b_1 | ||||
? 2/in_b_2 | ||||
? in_b | ||||
$ hg status --cwd b .. | ||||
? ../a/1/in_a_1 | ||||
? ../a/in_a | ||||
? 1/in_b_1 | ||||
? 2/in_b_2 | ||||
? in_b | ||||
? ../in_root | ||||
$ hg status --cwd a/1 | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd a/1 . | ||||
? in_a_1 | ||||
$ hg status --cwd a/1 .. | ||||
? in_a_1 | ||||
? ../in_a | ||||
$ hg status --cwd b/1 | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd b/1 . | ||||
? in_b_1 | ||||
$ hg status --cwd b/1 .. | ||||
? in_b_1 | ||||
? ../2/in_b_2 | ||||
? ../in_b | ||||
$ hg status --cwd b/2 | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
? in_root | ||||
$ hg status --cwd b/2 . | ||||
? in_b_2 | ||||
$ hg status --cwd b/2 .. | ||||
? ../1/in_b_1 | ||||
? in_b_2 | ||||
? ../in_b | ||||
|
r19107 | |||
combining patterns with root and patterns without a root works | ||||
$ hg st a/in_a re:.*b$ | ||||
? a/in_a | ||||
? b/in_b | ||||
|
r32872 | tweaking defaults works | ||
$ hg status --cwd a --config ui.tweakdefaults=yes | ||||
|
r38785 | ? 1/in_a_1 | ||
? in_a | ||||
? ../b/1/in_b_1 | ||||
? ../b/2/in_b_2 | ||||
? ../b/in_b | ||||
|
r32872 | ? ../in_root | ||
$ HGPLAIN=1 hg status --cwd a --config ui.tweakdefaults=yes | ||||
? a/1/in_a_1 (glob) | ||||
? a/in_a (glob) | ||||
? b/1/in_b_1 (glob) | ||||
? b/2/in_b_2 (glob) | ||||
? b/in_b (glob) | ||||
? in_root | ||||
$ HGPLAINEXCEPT=tweakdefaults hg status --cwd a --config ui.tweakdefaults=yes | ||||
|
r38785 | ? 1/in_a_1 | ||
? in_a | ||||
? ../b/1/in_b_1 | ||||
? ../b/2/in_b_2 | ||||
? ../b/in_b | ||||
|
r32887 | ? ../in_root (glob) | ||
|
r32872 | |||
|
r31589 | relative paths can be requested | ||
|
r41718 | $ hg status --cwd a --config ui.relative-paths=yes | ||
|
r41633 | ? 1/in_a_1 | ||
? in_a | ||||
? ../b/1/in_b_1 | ||||
? ../b/2/in_b_2 | ||||
? ../b/in_b | ||||
? ../in_root | ||||
|
r41718 | $ hg status --cwd a . --config ui.relative-paths=legacy | ||
? 1/in_a_1 | ||||
? in_a | ||||
$ hg status --cwd a . --config ui.relative-paths=no | ||||
? a/1/in_a_1 | ||||
? a/in_a | ||||
|
r41633 | commands.status.relative overrides ui.relative-paths | ||
$ cat >> $HGRCPATH <<EOF | ||||
> [ui] | ||||
> relative-paths = False | ||||
|
r31589 | > [commands] | ||
> status.relative = True | ||||
> EOF | ||||
$ hg status --cwd a | ||||
? 1/in_a_1 | ||||
? in_a | ||||
? ../b/1/in_b_1 | ||||
? ../b/2/in_b_2 | ||||
? ../b/in_b | ||||
? ../in_root | ||||
$ HGPLAIN=1 hg status --cwd a | ||||
|
r31766 | ? a/1/in_a_1 (glob) | ||
? a/in_a (glob) | ||||
? b/1/in_b_1 (glob) | ||||
? b/2/in_b_2 (glob) | ||||
? b/in_b (glob) | ||||
|
r31589 | ? in_root | ||
|
r32872 | if relative paths are explicitly off, tweakdefaults doesn't change it | ||
$ cat >> $HGRCPATH <<EOF | ||||
> [commands] | ||||
> status.relative = False | ||||
> EOF | ||||
$ hg status --cwd a --config ui.tweakdefaults=yes | ||||
|
r38785 | ? a/1/in_a_1 | ||
? a/in_a | ||||
? b/1/in_b_1 | ||||
? b/2/in_b_2 | ||||
? b/in_b | ||||
|
r32872 | ? in_root | ||
|
r11782 | $ cd .. | ||
$ hg init repo2 | ||||
$ cd repo2 | ||||
$ touch modified removed deleted ignored | ||||
$ echo "^ignored$" > .hgignore | ||||
|
r12156 | $ hg ci -A -m 'initial checkin' | ||
|
r11782 | adding .hgignore | ||
adding deleted | ||||
adding modified | ||||
adding removed | ||||
$ touch modified added unknown ignored | ||||
$ hg add added | ||||
$ hg remove removed | ||||
$ rm deleted | ||||
hg status: | ||||
$ hg status | ||||
A added | ||||
R removed | ||||
! deleted | ||||
? unknown | ||||
|
r49171 | hg status -n: | ||
|
r49285 | $ env RHG_ON_UNSUPPORTED=abort hg status -n | ||
|
r49171 | added | ||
removed | ||||
deleted | ||||
unknown | ||||
|
r11782 | hg status modified added removed deleted unknown never-existed ignored: | ||
$ hg status modified added removed deleted unknown never-existed ignored | ||||
|
r15521 | never-existed: * (glob) | ||
|
r11782 | A added | ||
R removed | ||||
! deleted | ||||
? unknown | ||||
$ hg copy modified copied | ||||
hg status -C: | ||||
$ hg status -C | ||||
A added | ||||
A copied | ||||
modified | ||||
R removed | ||||
! deleted | ||||
? unknown | ||||
hg status -A: | ||||
$ hg status -A | ||||
A added | ||||
A copied | ||||
modified | ||||
R removed | ||||
! deleted | ||||
? unknown | ||||
I ignored | ||||
C .hgignore | ||||
C modified | ||||
|
r38563 | $ hg status -A -T '{status} {path} {node|shortest}\n' | ||
A added ffff | ||||
A copied ffff | ||||
R removed ffff | ||||
! deleted ffff | ||||
? unknown ffff | ||||
I ignored ffff | ||||
C .hgignore ffff | ||||
C modified ffff | ||||
|
r22429 | $ hg status -A -Tjson | ||
[ | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "added", | ||
"status": "A" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "copied", | ||
|
r39406 | "source": "modified", | ||
|
r22429 | "status": "A" | ||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "removed", | ||
"status": "R" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "deleted", | ||
"status": "!" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "unknown", | ||
"status": "?" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "ignored", | ||
"status": "I" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": ".hgignore", | ||
"status": "C" | ||||
}, | ||||
{ | ||||
|
r44313 | "itemtype": "file", | ||
|
r22429 | "path": "modified", | ||
"status": "C" | ||||
} | ||||
] | ||||
|
r11782 | |||
|
r22430 | $ hg status -A -Tpickle > pickle | ||
|
r49725 | >>> import pickle | ||
|
r42010 | >>> from mercurial import util | ||
|
r40314 | >>> data = sorted((x[b'status'].decode(), x[b'path'].decode()) for x in pickle.load(open("pickle", r"rb"))) | ||
>>> for s, p in data: print("%s %s" % (s, p)) | ||||
! deleted | ||||
? pickle | ||||
? unknown | ||||
A added | ||||
A copied | ||||
C .hgignore | ||||
C modified | ||||
I ignored | ||||
R removed | ||||
|
r22430 | $ rm pickle | ||
|
r11782 | $ echo "^ignoreddir$" > .hgignore | ||
$ mkdir ignoreddir | ||||
$ touch ignoreddir/file | ||||
|
r25515 | Test templater support: | ||
|
r39406 | $ hg status -AT "[{status}]\t{if(source, '{source} -> ')}{path}\n" | ||
|
r25515 | [M] .hgignore | ||
[A] added | ||||
[A] modified -> copied | ||||
[R] removed | ||||
[!] deleted | ||||
[?] ignored | ||||
[?] unknown | ||||
[I] ignoreddir/file | ||||
[C] modified | ||||
$ hg status -AT default | ||||
M .hgignore | ||||
A added | ||||
A copied | ||||
modified | ||||
R removed | ||||
! deleted | ||||
? ignored | ||||
? unknown | ||||
I ignoreddir/file | ||||
C modified | ||||
$ hg status -T compact | ||||
abort: "status" not in template map | ||||
[255] | ||||
|
r11782 | hg status ignoreddir/file: | ||
$ hg status ignoreddir/file | ||||
hg status -i ignoreddir/file: | ||||
$ hg status -i ignoreddir/file | ||||
I ignoreddir/file | ||||
$ cd .. | ||||
|
r12328 | Check 'status -q' and some combinations | ||
|
r11782 | |||
$ hg init repo3 | ||||
$ cd repo3 | ||||
$ touch modified removed deleted ignored | ||||
$ echo "^ignored$" > .hgignore | ||||
$ hg commit -A -m 'initial checkin' | ||||
adding .hgignore | ||||
adding deleted | ||||
adding modified | ||||
adding removed | ||||
$ touch added unknown ignored | ||||
$ hg add added | ||||
$ echo "test" >> modified | ||||
$ hg remove removed | ||||
$ rm deleted | ||||
$ hg copy modified copied | ||||
|
r24419 | Specify working directory revision explicitly, that should be the same as | ||
"hg status" | ||||
$ hg status --change "wdir()" | ||||
M modified | ||||
A added | ||||
A copied | ||||
R removed | ||||
! deleted | ||||
? unknown | ||||
|
r12328 | Run status with 2 different flags. | ||
Check if result is the same or different. | ||||
If result is not as expected, raise error | ||||
|
r11782 | |||
$ assert() { | ||||
|
r12365 | > hg status $1 > ../a | ||
> hg status $2 > ../b | ||||
> if diff ../a ../b > /dev/null; then | ||||
> out=0 | ||||
> else | ||||
|
r11782 | > out=1 | ||
> fi | ||||
> if [ $3 -eq 0 ]; then | ||||
> df="same" | ||||
> else | ||||
> df="different" | ||||
> fi | ||||
> if [ $out -ne $3 ]; then | ||||
> echo "Error on $1 and $2, should be $df." | ||||
> fi | ||||
> } | ||||
|
r12328 | Assert flag1 flag2 [0-same | 1-different] | ||
|
r11782 | |||
$ assert "-q" "-mard" 0 | ||||
$ assert "-A" "-marduicC" 0 | ||||
$ assert "-qA" "-mardcC" 0 | ||||
$ assert "-qAui" "-A" 0 | ||||
$ assert "-qAu" "-marducC" 0 | ||||
$ assert "-qAi" "-mardicC" 0 | ||||
$ assert "-qu" "-u" 0 | ||||
$ assert "-q" "-u" 1 | ||||
$ assert "-m" "-a" 1 | ||||
$ assert "-r" "-d" 1 | ||||
$ cd .. | ||||
$ hg init repo4 | ||||
$ cd repo4 | ||||
$ touch modified removed deleted | ||||
|
r12156 | $ hg ci -q -A -m 'initial checkin' | ||
|
r11782 | $ touch added unknown | ||
$ hg add added | ||||
$ hg remove removed | ||||
$ rm deleted | ||||
$ echo x > modified | ||||
$ hg copy modified copied | ||||
$ hg ci -m 'test checkin' -d "1000001 0" | ||||
$ rm * | ||||
$ touch unrelated | ||||
$ hg ci -q -A -m 'unrelated checkin' -d "1000002 0" | ||||
hg status --change 1: | ||||
$ hg status --change 1 | ||||
M modified | ||||
A added | ||||
A copied | ||||
R removed | ||||
hg status --change 1 unrelated: | ||||
$ hg status --change 1 unrelated | ||||
hg status -C --change 1 added modified copied removed deleted: | ||||
$ hg status -C --change 1 added modified copied removed deleted | ||||
M modified | ||||
A added | ||||
A copied | ||||
modified | ||||
R removed | ||||
|
r15578 | hg status -A --change 1 and revset: | ||
|
r11782 | |||
|
r15578 | $ hg status -A --change '1|1' | ||
|
r11782 | M modified | ||
A added | ||||
A copied | ||||
modified | ||||
R removed | ||||
C deleted | ||||
|
r15848 | |||
$ cd .. | ||||
|
r27668 | hg status with --rev and reverted changes: | ||
$ hg init reverted-changes-repo | ||||
$ cd reverted-changes-repo | ||||
$ echo a > file | ||||
$ hg add file | ||||
$ hg ci -m a | ||||
$ echo b > file | ||||
$ hg ci -m b | ||||
reverted file should appear clean | ||||
$ hg revert -r 0 . | ||||
reverting file | ||||
$ hg status -A --rev 0 | ||||
C file | ||||
#if execbit | ||||
reverted file with changed flag should appear modified | ||||
$ chmod +x file | ||||
$ hg status -A --rev 0 | ||||
M file | ||||
|
r27743 | $ hg revert -r 0 . | ||
reverting file | ||||
|
r27749 | |||
reverted and committed file with changed flag should appear modified | ||||
$ hg co -C . | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ chmod +x file | ||||
$ hg ci -m 'change flag' | ||||
$ hg status -A --rev 1 --rev 2 | ||||
M file | ||||
$ hg diff -r 1 -r 2 | ||||
|
r27668 | #endif | ||
|
r31423 | $ cd .. | ||
|
r15848 | hg status of binary file starting with '\1\n', a separator for metadata: | ||
$ hg init repo5 | ||||
$ cd repo5 | ||||
|
r38037 | >>> open("010a", r"wb").write(b"\1\nfoo") and None | ||
|
r15848 | $ hg ci -q -A -m 'initial checkin' | ||
$ hg status -A | ||||
C 010a | ||||
|
r38037 | >>> open("010a", r"wb").write(b"\1\nbar") and None | ||
|
r15848 | $ hg status -A | ||
M 010a | ||||
$ hg ci -q -m 'modify 010a' | ||||
$ hg status -A --rev 0:1 | ||||
M 010a | ||||
$ touch empty | ||||
$ hg ci -q -A -m 'add another file' | ||||
$ hg status -A --rev 1:2 010a | ||||
C 010a | ||||
|
r16144 | |||
$ cd .. | ||||
test "hg status" with "directory pattern" which matches against files | ||||
only known on target revision. | ||||
$ hg init repo6 | ||||
$ cd repo6 | ||||
$ echo a > a.txt | ||||
$ hg add a.txt | ||||
$ hg commit -m '#0' | ||||
$ mkdir -p 1/2/3/4/5 | ||||
$ echo b > 1/2/3/4/5/b.txt | ||||
$ hg add 1/2/3/4/5/b.txt | ||||
$ hg commit -m '#1' | ||||
$ hg update -C 0 > /dev/null | ||||
$ hg status -A | ||||
C a.txt | ||||
the directory matching against specified pattern should be removed, | ||||
because directory existence prevents 'dirstate.walk()' from showing | ||||
warning message about such pattern. | ||||
$ test ! -d 1 | ||||
$ hg status -A --rev 1 1/2/3/4/5/b.txt | ||||
R 1/2/3/4/5/b.txt | ||||
$ hg status -A --rev 1 1/2/3/4/5 | ||||
R 1/2/3/4/5/b.txt | ||||
$ hg status -A --rev 1 1/2/3 | ||||
R 1/2/3/4/5/b.txt | ||||
$ hg status -A --rev 1 1 | ||||
R 1/2/3/4/5/b.txt | ||||
|
r22424 | $ hg status --config ui.formatdebug=True --rev 1 1 | ||
status = [ | ||||
|
r40313 | { | ||
|
r44313 | 'itemtype': 'file', | ||
|
r40313 | 'path': '1/2/3/4/5/b.txt', | ||
'status': 'R' | ||||
}, | ||||
|
r22424 | ] | ||
|
r17377 | #if windows | ||
$ hg --config ui.slash=false status -A --rev 1 1 | ||||
R 1\2\3\4\5\b.txt | ||||
#endif | ||||
|
r16144 | $ cd .. | ||
|
r23402 | |||
Status after move overwriting a file (issue4458) | ||||
================================================= | ||||
$ hg init issue4458 | ||||
$ cd issue4458 | ||||
$ echo a > a | ||||
$ echo b > b | ||||
$ hg commit -Am base | ||||
adding a | ||||
adding b | ||||
with --force | ||||
$ hg mv b --force a | ||||
$ hg st --copies | ||||
M a | ||||
b | ||||
R b | ||||
$ hg revert --all | ||||
reverting a | ||||
undeleting b | ||||
$ rm *.orig | ||||
without force | ||||
$ hg rm a | ||||
$ hg st --copies | ||||
R a | ||||
$ hg mv b a | ||||
$ hg st --copies | ||||
M a | ||||
b | ||||
R b | ||||
|
r24663 | using ui.statuscopies setting | ||
$ hg st --config ui.statuscopies=true | ||||
M a | ||||
b | ||||
R b | ||||
|
r50393 | $ hg st --config ui.statuscopies=true --no-copies | ||
M a | ||||
R b | ||||
|
r24663 | $ hg st --config ui.statuscopies=false | ||
M a | ||||
R b | ||||
|
r50393 | $ hg st --config ui.statuscopies=false --copies | ||
M a | ||||
b | ||||
R b | ||||
|
r35066 | $ hg st --config ui.tweakdefaults=yes | ||
M a | ||||
b | ||||
R b | ||||
|
r24663 | |||
|
r29000 | using log status template (issue5155) | ||
$ hg log -Tstatus -r 'wdir()' -C | ||||
changeset: 2147483647:ffffffffffff | ||||
parent: 0:8c55c58b4c0e | ||||
user: test | ||||
date: * (glob) | ||||
files: | ||||
M a | ||||
b | ||||
R b | ||||
|
r42701 | $ hg log -GTstatus -r 'wdir()' -C | ||
o changeset: 2147483647:ffffffffffff | ||||
| parent: 0:8c55c58b4c0e | ||||
~ user: test | ||||
date: * (glob) | ||||
files: | ||||
M a | ||||
|
r42702 | b | ||
|
r42701 | R b | ||
|
r29000 | |||
|
r23402 | Other "bug" highlight, the revision status does not report the copy information. | ||
This is buggy behavior. | ||||
$ hg commit -m 'blah' | ||||
$ hg st --copies --change . | ||||
M a | ||||
R b | ||||
|
r29000 | using log status template, the copy information is displayed correctly. | ||
$ hg log -Tstatus -r. -C | ||||
changeset: 1:6685fde43d21 | ||||
tag: tip | ||||
user: test | ||||
date: * (glob) | ||||
summary: blah | ||||
files: | ||||
M a | ||||
b | ||||
R b | ||||
|
r23402 | $ cd .. | ||
|
r45250 | |||
Make sure .hg doesn't show up even as a symlink | ||||
$ hg init repo0 | ||||
$ mkdir symlink-repo0 | ||||
$ cd symlink-repo0 | ||||
$ ln -s ../repo0/.hg | ||||
$ hg status | ||||
|
r47217 | |||
|
r47903 | If the size hasn’t changed but mtime has, status needs to read the contents | ||
of the file to check whether it has changed | ||||
$ echo 1 > a | ||||
$ echo 1 > b | ||||
$ touch -t 200102030000 a b | ||||
$ hg commit -Aqm '#0' | ||||
$ echo 2 > a | ||||
$ touch -t 200102040000 a b | ||||
$ hg status | ||||
M a | ||||
Asking specifically for the status of a deleted/removed file | ||||
$ rm a | ||||
$ rm b | ||||
$ hg status a | ||||
! a | ||||
$ hg rm a | ||||
$ hg rm b | ||||
$ hg status a | ||||
R a | ||||
|
r47964 | $ hg commit -qm '#1' | ||
$ hg status a | ||||
a: $ENOENT$ | ||||
|
r47903 | |||
|
r47217 | Check using include flag with pattern when status does not need to traverse | ||
the working directory (issue6483) | ||||
$ cd .. | ||||
$ hg init issue6483 | ||||
$ cd issue6483 | ||||
$ touch a.py b.rs | ||||
$ hg add a.py b.rs | ||||
$ hg st -aI "*.py" | ||||
A a.py | ||||
|
r48101 | |||
|
r47902 | Also check exclude pattern | ||
$ hg st -aX "*.rs" | ||||
A a.py | ||||
|
r47901 | issue6335 | ||
When a directory containing a tracked file gets symlinked, as of 5.8 | ||||
`hg st` only gives the correct answer about clean (or deleted) files | ||||
if also listing unknowns. | ||||
The tree-based dirstate and status algorithm fix this: | ||||
|
r49037 | #if symlink no-dirstate-v1 rust | ||
|
r47901 | |||
$ cd .. | ||||
$ hg init issue6335 | ||||
$ cd issue6335 | ||||
$ mkdir foo | ||||
$ touch foo/a | ||||
$ hg ci -Ama | ||||
adding foo/a | ||||
$ mv foo bar | ||||
$ ln -s bar foo | ||||
$ hg status | ||||
! foo/a | ||||
? bar/a | ||||
? foo | ||||
|
r49037 | $ hg status -c # incorrect output without the Rust implementation | ||
|
r47901 | $ hg status -cu | ||
? bar/a | ||||
? foo | ||||
|
r49037 | $ hg status -d # incorrect output without the Rust implementation | ||
|
r47901 | ! foo/a | ||
$ hg status -du | ||||
! foo/a | ||||
? bar/a | ||||
? foo | ||||
#endif | ||||
|
r47954 | |||
Create a repo with files in each possible status | ||||
$ cd .. | ||||
$ hg init repo7 | ||||
$ cd repo7 | ||||
$ mkdir subdir | ||||
$ touch clean modified deleted removed | ||||
$ touch subdir/clean subdir/modified subdir/deleted subdir/removed | ||||
$ echo ignored > .hgignore | ||||
$ hg ci -Aqm '#0' | ||||
$ echo 1 > modified | ||||
$ echo 1 > subdir/modified | ||||
$ rm deleted | ||||
$ rm subdir/deleted | ||||
$ hg rm removed | ||||
$ hg rm subdir/removed | ||||
$ touch unknown ignored | ||||
$ touch subdir/unknown subdir/ignored | ||||
Check the output | ||||
$ hg status | ||||
M modified | ||||
M subdir/modified | ||||
R removed | ||||
R subdir/removed | ||||
! deleted | ||||
! subdir/deleted | ||||
? subdir/unknown | ||||
? unknown | ||||
$ hg status -mard | ||||
M modified | ||||
M subdir/modified | ||||
R removed | ||||
R subdir/removed | ||||
! deleted | ||||
! subdir/deleted | ||||
$ hg status -A | ||||
M modified | ||||
M subdir/modified | ||||
R removed | ||||
R subdir/removed | ||||
! deleted | ||||
! subdir/deleted | ||||
? subdir/unknown | ||||
? unknown | ||||
I ignored | ||||
I subdir/ignored | ||||
C .hgignore | ||||
C clean | ||||
C subdir/clean | ||||
Note: `hg status some-name` creates a patternmatcher which is not supported | ||||
yet by the Rust implementation of status, but includematcher is supported. | ||||
--include is used below for that reason | ||||
|
r48135 | #if unix-permissions | ||
Not having permission to read a directory that contains tracked files makes | ||||
status emit a warning then behave as if the directory was empty or removed | ||||
entirely: | ||||
$ chmod 0 subdir | ||||
$ hg status --include subdir | ||||
subdir: Permission denied | ||||
R subdir/removed | ||||
! subdir/clean | ||||
! subdir/deleted | ||||
! subdir/modified | ||||
$ chmod 755 subdir | ||||
#endif | ||||
|
r47954 | Remove a directory that contains tracked files | ||
$ rm -r subdir | ||||
$ hg status --include subdir | ||||
R subdir/removed | ||||
! subdir/clean | ||||
! subdir/deleted | ||||
! subdir/modified | ||||
… and replace it by a file | ||||
$ touch subdir | ||||
$ hg status --include subdir | ||||
R subdir/removed | ||||
! subdir/clean | ||||
! subdir/deleted | ||||
! subdir/modified | ||||
? subdir | ||||
Replaced a deleted or removed file with a directory | ||||
$ mkdir deleted removed | ||||
$ touch deleted/1 removed/1 | ||||
$ hg status --include deleted --include removed | ||||
R removed | ||||
! deleted | ||||
? deleted/1 | ||||
? removed/1 | ||||
$ hg add removed/1 | ||||
$ hg status --include deleted --include removed | ||||
A removed/1 | ||||
R removed | ||||
! deleted | ||||
? deleted/1 | ||||
Deeply nested files in an ignored directory are still listed on request | ||||
$ echo ignored-dir >> .hgignore | ||||
$ mkdir ignored-dir | ||||
$ mkdir ignored-dir/subdir | ||||
$ touch ignored-dir/subdir/1 | ||||
$ hg status --ignored | ||||
I ignored | ||||
I ignored-dir/subdir/1 | ||||
|
r48120 | |||
|
r48101 | Check using include flag while listing ignored composes correctly (issue6514) | ||
$ cd .. | ||||
$ hg init issue6514 | ||||
$ cd issue6514 | ||||
$ mkdir ignored-folder | ||||
$ touch A.hs B.hs C.hs ignored-folder/other.txt ignored-folder/ctest.hs | ||||
$ cat >.hgignore <<EOF | ||||
> A.hs | ||||
> B.hs | ||||
> ignored-folder/ | ||||
> EOF | ||||
$ hg st -i -I 're:.*\.hs$' | ||||
I A.hs | ||||
I B.hs | ||||
I ignored-folder/ctest.hs | ||||
|
r48140 | |||
|
r49037 | #if rust dirstate-v2 | ||
|
r48140 | |||
Check read_dir caching | ||||
$ cd .. | ||||
$ hg init repo8 | ||||
$ cd repo8 | ||||
$ mkdir subdir | ||||
$ touch subdir/a subdir/b | ||||
$ hg ci -Aqm '#0' | ||||
The cached mtime is initially unset | ||||
|
r48483 | $ hg debugdirstate --all --no-dates | grep '^ ' | ||
0 -1 unset subdir | ||||
|
r48140 | |||
It is still not set when there are unknown files | ||||
$ touch subdir/unknown | ||||
$ hg status | ||||
? subdir/unknown | ||||
|
r48483 | $ hg debugdirstate --all --no-dates | grep '^ ' | ||
0 -1 unset subdir | ||||
|
r48140 | |||
|
r50448 | Now the directory is eligible for caching, so its mtime is saved in the dirstate | ||
|
r48140 | |||
$ rm subdir/unknown | ||||
|
r49286 | $ sleep 0.1 # ensure the kernel’s internal clock for mtimes has ticked | ||
|
r48140 | $ hg status | ||
|
r48483 | $ hg debugdirstate --all --no-dates | grep '^ ' | ||
0 -1 set subdir | ||||
|
r48140 | |||
This time the command should be ever so slightly faster since it does not need `read_dir("subdir")` | ||||
$ hg status | ||||
Creating a new file changes the directory’s mtime, invalidating the cache | ||||
$ touch subdir/unknown | ||||
$ hg status | ||||
? subdir/unknown | ||||
|
r48141 | $ rm subdir/unknown | ||
$ hg status | ||||
Removing a node from the dirstate resets the cache for its parent directory | ||||
$ hg forget subdir/a | ||||
|
r48483 | $ hg debugdirstate --all --no-dates | grep '^ ' | ||
0 -1 set subdir | ||||
|
r48141 | $ hg ci -qm '#1' | ||
|
r48483 | $ hg debugdirstate --all --no-dates | grep '^ ' | ||
0 -1 unset subdir | ||||
|
r48141 | $ hg status | ||
? subdir/a | ||||
|
r50448 | Changing the hgignore rules makes us recompute the status (and rewrite the dirstate). | ||
$ rm subdir/a | ||||
$ mkdir another-subdir | ||||
$ touch another-subdir/something-else | ||||
$ cat > "$TESTDIR"/extra-hgignore <<EOF | ||||
> something-else | ||||
> EOF | ||||
$ hg status --config ui.ignore.global="$TESTDIR"/extra-hgignore | ||||
$ hg debugdirstate --all --no-dates | grep '^ ' | ||||
0 -1 set subdir | ||||
$ hg status | ||||
? another-subdir/something-else | ||||
|
r50450 | One invocation of status is enough to populate the cache even if it's invalidated | ||
in the same run. | ||||
|
r50448 | |||
$ hg debugdirstate --all --no-dates | grep '^ ' | ||||
0 -1 set subdir | ||||
|
r48140 | #endif | ||