##// END OF EJS Templates
branching: merge default into stable...
branching: merge default into stable This mark the start of the 5.9 freeze.

File last commit:

r48483:284a2026 default
r48559:d7515d29 merge 5.9rc0 stable
Show More
test-status.t
974 lines | 17.9 KiB | text/troff | Tads3Lexer
Simon Sapin
dirstate-v2: Add a variant of some tests, that uses the new format...
r48056 #testcases dirstate-v1 dirstate-v1-tree dirstate-v2
#if no-rust
$ hg init repo0 --config format.exp-dirstate-v2=1
abort: dirstate v2 format requested by config but not supported (requires Rust extensions)
[255]
#endif
Simon Sapin
dirstate-tree: Add a dirstate-v1-tree variant of some tests...
r47900
#if dirstate-v1-tree
#require rust
$ echo '[experimental]' >> $HGRCPATH
$ echo 'dirstate-tree.in-memory=1' >> $HGRCPATH
#endif
Simon Sapin
dirstate-v2: Add a variant of some tests, that uses the new format...
r48056 #if dirstate-v2
#require rust
$ echo '[format]' >> $HGRCPATH
$ echo 'exp-dirstate-v2=1' >> $HGRCPATH
#endif
Nicolas Dumazet
tests: unify test-status
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
Mads Kiilerich
match: fix root calculation for combining regexps with simple paths...
r19107
combining patterns with root and patterns without a root works
$ hg st a/in_a re:.*b$
? a/in_a
? b/in_b
Augie Fackler
ui: add support for a tweakdefaults knob...
r32872 tweaking defaults works
$ hg status --cwd a --config ui.tweakdefaults=yes
Gregory Szorc
ui: remove commands.status.terse=u from ui.tweakdefaults...
r38785 ? 1/in_a_1
? in_a
? ../b/1/in_b_1
? ../b/2/in_b_2
? ../b/in_b
Augie Fackler
ui: add support for a tweakdefaults knob...
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
Gregory Szorc
ui: remove commands.status.terse=u from ui.tweakdefaults...
r38785 ? 1/in_a_1
? in_a
? ../b/1/in_b_1
? ../b/2/in_b_2
? ../b/in_b
Matt Harbison
test-status: glob fixes for Windows
r32887 ? ../in_root (glob)
Augie Fackler
ui: add support for a tweakdefaults knob...
r32872
Martin von Zweigbergk
status: support commands.status.relative config...
r31589 relative paths can be requested
Martin von Zweigbergk
status: if ui.relative-paths=no, don't use relative paths even with patterns...
r41718 $ hg status --cwd a --config ui.relative-paths=yes
Martin von Zweigbergk
status: introduce higher-level ui.relative-paths...
r41633 ? 1/in_a_1
? in_a
? ../b/1/in_b_1
? ../b/2/in_b_2
? ../b/in_b
? ../in_root
Martin von Zweigbergk
status: if ui.relative-paths=no, don't use relative paths even with patterns...
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
Martin von Zweigbergk
status: introduce higher-level ui.relative-paths...
r41633 commands.status.relative overrides ui.relative-paths
$ cat >> $HGRCPATH <<EOF
> [ui]
> relative-paths = False
Martin von Zweigbergk
status: support commands.status.relative config...
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
Matt Harbison
tests: add globs for Windows
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)
Martin von Zweigbergk
status: support commands.status.relative config...
r31589 ? in_root
Augie Fackler
ui: add support for a tweakdefaults knob...
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
Gregory Szorc
ui: remove commands.status.terse=u from ui.tweakdefaults...
r38785 ? a/1/in_a_1
? a/in_a
? b/1/in_b_1
? b/2/in_b_2
? b/in_b
Augie Fackler
ui: add support for a tweakdefaults knob...
r32872 ? in_root
Nicolas Dumazet
tests: unify test-status
r11782 $ cd ..
$ hg init repo2
$ cd repo2
$ touch modified removed deleted ignored
$ echo "^ignored$" > .hgignore
Martin Geisler
tests: remove unneeded -d flags...
r12156 $ hg ci -A -m 'initial checkin'
Nicolas Dumazet
tests: unify test-status
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
hg status modified added removed deleted unknown never-existed ignored:
$ hg status modified added removed deleted unknown never-existed ignored
Mads Kiilerich
tests: hide 'No such file or directory' messages...
r15521 never-existed: * (glob)
Nicolas Dumazet
tests: unify test-status
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
Yuya Nishihara
status: add support for log-like template keywords and functions...
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
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 $ hg status -A -Tjson
[
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "added",
"status": "A"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "copied",
Yuya Nishihara
status: rename {copy} to {source} for compatibility with {file_copies} (BC)...
r39406 "source": "modified",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "status": "A"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "removed",
"status": "R"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "deleted",
"status": "!"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "unknown",
"status": "?"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "ignored",
"status": "I"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": ".hgignore",
"status": "C"
},
{
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 "itemtype": "file",
Matt Mackall
commands: add hidden -T option for files/manifest/status/tags...
r22429 "path": "modified",
"status": "C"
}
]
Nicolas Dumazet
tests: unify test-status
r11782
Matt Mackall
formatter: add pickle format...
r22430 $ hg status -A -Tpickle > pickle
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485 >>> from __future__ import print_function
Pulkit Goyal
tests: make test-status.t compatible with test-check-module-imports.t...
r42010 >>> from mercurial import util
>>> pickle = util.pickle
Mark Thomas
py3: fix test-status.t...
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
Matt Mackall
formatter: add pickle format...
r22430 $ rm pickle
Nicolas Dumazet
tests: unify test-status
r11782 $ echo "^ignoreddir$" > .hgignore
$ mkdir ignoreddir
$ touch ignoreddir/file
Matt Mackall
tests: test basic template support for status
r25515 Test templater support:
Yuya Nishihara
status: rename {copy} to {source} for compatibility with {file_copies} (BC)...
r39406 $ hg status -AT "[{status}]\t{if(source, '{source} -> ')}{path}\n"
Matt Mackall
tests: test basic template support for status
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]
Nicolas Dumazet
tests: unify test-status
r11782 hg status ignoreddir/file:
$ hg status ignoreddir/file
hg status -i ignoreddir/file:
$ hg status -i ignoreddir/file
I ignoreddir/file
$ cd ..
Matt Mackall
tests: fix a bunch of pointless #s in unified tests
r12328 Check 'status -q' and some combinations
Nicolas Dumazet
tests: unify test-status
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
Yuya Nishihara
revset: add wdir() function to specify workingctx revision by command...
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
Matt Mackall
tests: fix a bunch of pointless #s in unified tests
r12328 Run status with 2 different flags.
Check if result is the same or different.
If result is not as expected, raise error
Nicolas Dumazet
tests: unify test-status
r11782
$ assert() {
Matt Mackall
tests: cleanup exit code handling in unified tests
r12365 > hg status $1 > ../a
> hg status $2 > ../b
> if diff ../a ../b > /dev/null; then
> out=0
> else
Nicolas Dumazet
tests: unify test-status
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
> }
Matt Mackall
tests: fix a bunch of pointless #s in unified tests
r12328 Assert flag1 flag2 [0-same | 1-different]
Nicolas Dumazet
tests: unify test-status
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
Martin Geisler
tests: remove unneeded -d flags...
r12156 $ hg ci -q -A -m 'initial checkin'
Nicolas Dumazet
tests: unify test-status
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
Patrick Mezard
status: support revsets with --change
r15578 hg status -A --change 1 and revset:
Nicolas Dumazet
tests: unify test-status
r11782
Patrick Mezard
status: support revsets with --change
r15578 $ hg status -A --change '1|1'
Nicolas Dumazet
tests: unify test-status
r11782 M modified
A added
A copied
modified
R removed
C deleted
Yuya Nishihara
filectx: fix cmp() of file starting with '\1\n'...
r15848
$ cd ..
Martin von Zweigbergk
status: revert + flag-change == modified...
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
Matt Harbison
test-status: stabilize for no-execbit platforms...
r27743 $ hg revert -r 0 .
reverting file
Martin von Zweigbergk
context: check for differing flags a little earlier...
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
Martin von Zweigbergk
status: revert + flag-change == modified...
r27668 #endif
Ryan McElroy
tests: properly drop back to root dir in test-status.t
r31423 $ cd ..
Yuya Nishihara
filectx: fix cmp() of file starting with '\1\n'...
r15848 hg status of binary file starting with '\1\n', a separator for metadata:
$ hg init repo5
$ cd repo5
Pulkit Goyal
py3: suppress the value returned by .write() calls...
r38037 >>> open("010a", r"wb").write(b"\1\nfoo") and None
Yuya Nishihara
filectx: fix cmp() of file starting with '\1\n'...
r15848 $ hg ci -q -A -m 'initial checkin'
$ hg status -A
C 010a
Pulkit Goyal
py3: suppress the value returned by .write() calls...
r38037 >>> open("010a", r"wb").write(b"\1\nbar") and None
Yuya Nishihara
filectx: fix cmp() of file starting with '\1\n'...
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
FUJIWARA Katsunori
localrepository: use 'changectx.dirs()' in 'status()' for directory patterns...
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
Matt Mackall
formatter: make debug style match Python syntax
r22424 $ hg status --config ui.formatdebug=True --rev 1 1
status = [
Yuya Nishihara
formatter: make debug output prettier...
r40313 {
Rodrigo Damazio Bovendorp
status: outputting structured unfinished-operation information...
r44313 'itemtype': 'file',
Yuya Nishihara
formatter: make debug output prettier...
r40313 'path': '1/2/3/4/5/b.txt',
'status': 'R'
},
Matt Mackall
formatter: make debug style match Python syntax
r22424 ]
Patrick Mezard
test-status.t: test ui.slash on Windows
r17377 #if windows
$ hg --config ui.slash=false status -A --rev 1 1
R 1\2\3\4\5\b.txt
#endif
FUJIWARA Katsunori
localrepository: use 'changectx.dirs()' in 'status()' for directory patterns...
r16144 $ cd ..
Pierre-Yves David
rename: properly report removed and added file as modified (issue4458)...
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
Mathias De Maré
commands: add ui.statuscopies config knob...
r24663 using ui.statuscopies setting
$ hg st --config ui.statuscopies=true
M a
b
R b
$ hg st --config ui.statuscopies=false
M a
R b
Martin von Zweigbergk
tweakdefaults: turn on ui.statuscopies...
r35066 $ hg st --config ui.tweakdefaults=yes
M a
b
R b
Mathias De Maré
commands: add ui.statuscopies config knob...
r24663
Yuya Nishihara
log: fix status template to list copy source per dest (issue5155)...
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
Martin von Zweigbergk
tests: demonstrate missing copy information in working copy with graphlog...
r42701 $ hg log -GTstatus -r 'wdir()' -C
o changeset: 2147483647:ffffffffffff
| parent: 0:8c55c58b4c0e
~ user: test
date: * (glob)
files:
M a
Martin von Zweigbergk
logcmdutil: also check for copies in null revision and working copy...
r42702 b
Martin von Zweigbergk
tests: demonstrate missing copy information in working copy with graphlog...
r42701 R b
Yuya Nishihara
log: fix status template to list copy source per dest (issue5155)...
r29000
Pierre-Yves David
rename: properly report removed and added file as modified (issue4458)...
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
Yuya Nishihara
log: fix status template to list copy source per dest (issue5155)...
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
Pierre-Yves David
rename: properly report removed and added file as modified (issue4458)...
r23402 $ cd ..
Raphaël Gomès
rust-status: check for '.hg' regardless of file type (issue6300)...
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
Raphaël Gomès
status: add test that shows that the Rust implementation has a bug...
r47217
Simon Sapin
status: Add tests for some more edge cases...
r47903 If the size hasnt 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
Simon Sapin
dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`...
r47964 $ hg commit -qm '#1'
$ hg status a
a: $ENOENT$
Simon Sapin
status: Add tests for some more edge cases...
r47903
Raphaël Gomès
status: add test that shows that the Rust implementation has a bug...
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
Raphaël Gomès
rust-status: highlight a bug in Rust-augmented status...
r48101
Simon Sapin
status: Extend issue 6483 test to exclude patterns...
r47902 Also check exclude pattern
$ hg st -aX "*.rs"
A a.py
Simon Sapin
dirstate-tree: Add a test showing that issue 6335 is fixed...
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:
#if symlink no-dirstate-v1
$ 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
$ hg status -c # incorrect output with `dirstate-v1`
$ hg status -cu
? bar/a
? foo
$ hg status -d # incorrect output with `dirstate-v1`
! foo/a
$ hg status -du
! foo/a
? bar/a
? foo
#endif
Simon Sapin
status: Add some more tests...
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
Simon Sapin
dirstate-tree: Fix status algorithm with unreadable directory...
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
Simon Sapin
status: Add some more tests...
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
Matt Harbison
merge with stable
r48120
Raphaël Gomès
rust-status: highlight a bug in Rust-augmented status...
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
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140
#if dirstate-v2
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
Simon Sapin
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate...
r48483 $ hg debugdirstate --all --no-dates | grep '^ '
0 -1 unset subdir
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140
It is still not set when there are unknown files
$ touch subdir/unknown
$ hg status
? subdir/unknown
Simon Sapin
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate...
r48483 $ hg debugdirstate --all --no-dates | grep '^ '
0 -1 unset subdir
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140
Now the directory is eligible for caching, so its mtime is save in the dirstate
$ rm subdir/unknown
$ hg status
Simon Sapin
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate...
r48483 $ hg debugdirstate --all --no-dates | grep '^ '
0 -1 set subdir
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
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 directorys mtime, invalidating the cache
$ touch subdir/unknown
$ hg status
? subdir/unknown
Simon Sapin
dirstate-v2: Drop parent directory cache when removing a dirstate node...
r48141 $ rm subdir/unknown
$ hg status
Removing a node from the dirstate resets the cache for its parent directory
$ hg forget subdir/a
Simon Sapin
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate...
r48483 $ hg debugdirstate --all --no-dates | grep '^ '
0 -1 set subdir
Simon Sapin
dirstate-v2: Drop parent directory cache when removing a dirstate node...
r48141 $ hg ci -qm '#1'
Simon Sapin
dirstate-v2: Separate iterators for dirfoldmap and debugdirstate...
r48483 $ hg debugdirstate --all --no-dates | grep '^ '
0 -1 unset subdir
Simon Sapin
dirstate-v2: Drop parent directory cache when removing a dirstate node...
r48141 $ hg status
? subdir/a
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140 #endif