test-fileset.t
606 lines
| 11.2 KiB
| text/troff
|
Tads3Lexer
/ tests / test-fileset.t
Patrick Mezard
|
r17362 | $ fileset() { | ||
> hg debugfileset "$@" | ||||
> } | ||||
$ hg init repo | ||||
$ cd repo | ||||
$ echo a > a1 | ||||
$ echo a > a2 | ||||
$ echo b > b1 | ||||
Patrick Mezard
|
r17364 | $ echo b > b2 | ||
Patrick Mezard
|
r17362 | $ hg ci -Am addfiles | ||
adding a1 | ||||
adding a2 | ||||
adding b1 | ||||
Patrick Mezard
|
r17364 | adding b2 | ||
Patrick Mezard
|
r17362 | |||
Test operators and basic patterns | ||||
Yuya Nishihara
|
r25255 | $ fileset -v a1 | ||
('symbol', 'a1') | ||||
Patrick Mezard
|
r17362 | a1 | ||
Yuya Nishihara
|
r25255 | $ fileset -v 'a*' | ||
('symbol', 'a*') | ||||
Patrick Mezard
|
r17362 | a1 | ||
a2 | ||||
Yuya Nishihara
|
r25255 | $ fileset -v '"re:a\d"' | ||
('string', 're:a\\d') | ||||
Patrick Mezard
|
r17362 | a1 | ||
a2 | ||||
Yuya Nishihara
|
r25255 | $ fileset -v 'a1 or a2' | ||
(or | ||||
('symbol', 'a1') | ||||
('symbol', 'a2')) | ||||
Patrick Mezard
|
r17362 | a1 | ||
a2 | ||||
$ fileset 'a1 | a2' | ||||
a1 | ||||
a2 | ||||
$ fileset 'a* and "*1"' | ||||
a1 | ||||
$ fileset 'a* & "*1"' | ||||
a1 | ||||
$ fileset 'not (r"a*")' | ||||
b1 | ||||
Patrick Mezard
|
r17364 | b2 | ||
Patrick Mezard
|
r17362 | $ fileset '! ("a*")' | ||
b1 | ||||
Patrick Mezard
|
r17364 | b2 | ||
Patrick Mezard
|
r17363 | $ fileset 'a* - a1' | ||
a2 | ||||
Matt Mackall
|
r19470 | $ fileset 'a_b' | ||
Yuya Nishihara
|
r26233 | $ fileset '"\xy"' | ||
hg: parse error: invalid \x escape | ||||
[255] | ||||
Patrick Mezard
|
r17362 | |||
Patrick Mezard
|
r17364 | Test files status | ||
$ rm a1 | ||||
$ hg rm a2 | ||||
$ echo b >> b2 | ||||
$ hg cp b1 c1 | ||||
$ echo c > c2 | ||||
$ echo c > c3 | ||||
$ cat > .hgignore <<EOF | ||||
> \.hgignore | ||||
> 2$ | ||||
> EOF | ||||
$ fileset 'modified()' | ||||
b2 | ||||
$ fileset 'added()' | ||||
c1 | ||||
$ fileset 'removed()' | ||||
a2 | ||||
$ fileset 'deleted()' | ||||
a1 | ||||
liscju
|
r27024 | $ fileset 'missing()' | ||
a1 | ||||
Patrick Mezard
|
r17364 | $ fileset 'unknown()' | ||
c3 | ||||
$ fileset 'ignored()' | ||||
.hgignore | ||||
c2 | ||||
$ fileset 'hgignore()' | ||||
a2 | ||||
b2 | ||||
$ fileset 'clean()' | ||||
b1 | ||||
$ fileset 'copied()' | ||||
c1 | ||||
Pierre-Yves David
|
r31193 | Test files status in different revisions | ||
$ hg status -m | ||||
M b2 | ||||
$ fileset -r0 'revs("wdir()", modified())' --traceback | ||||
b2 | ||||
$ hg status -a | ||||
A c1 | ||||
$ fileset -r0 'revs("wdir()", added())' | ||||
c1 | ||||
$ hg status --change 0 -a | ||||
A a1 | ||||
A a2 | ||||
A b1 | ||||
A b2 | ||||
$ hg status -mru | ||||
M b2 | ||||
R a2 | ||||
? c3 | ||||
$ fileset -r0 'added() and revs("wdir()", modified() or removed() or unknown())' | ||||
b2 | ||||
a2 | ||||
$ fileset -r0 'added() or revs("wdir()", added())' | ||||
a1 | ||||
a2 | ||||
b1 | ||||
b2 | ||||
c1 | ||||
Patrick Mezard
|
r17365 | Test files properties | ||
>>> file('bin', 'wb').write('\0a') | ||||
$ fileset 'binary()' | ||||
Patrick Mezard
|
r17366 | $ fileset 'binary() and unknown()' | ||
bin | ||||
Patrick Mezard
|
r17367 | $ echo '^bin$' >> .hgignore | ||
$ fileset 'binary() and ignored()' | ||||
bin | ||||
Patrick Mezard
|
r17366 | $ hg add bin | ||
$ fileset 'binary()' | ||||
bin | ||||
Patrick Mezard
|
r17365 | |||
Patrick Mezard
|
r17368 | $ fileset 'grep("b{1}")' | ||
b2 | ||||
c1 | ||||
b1 | ||||
$ fileset 'grep("missingparens(")' | ||||
hg: parse error: invalid match pattern: unbalanced parenthesis | ||||
[255] | ||||
Patrick Mezard
|
r17369 | #if execbit | ||
$ chmod +x b2 | ||||
$ fileset 'exec()' | ||||
b2 | ||||
#endif | ||||
#if symlink | ||||
$ ln -s b2 b2link | ||||
$ fileset 'symlink() and unknown()' | ||||
b2link | ||||
$ hg add b2link | ||||
#endif | ||||
Siddharth Agarwal
|
r24408 | #if no-windows | ||
$ echo foo > con.xml | ||||
Siddharth Agarwal
|
r24430 | $ fileset 'not portable()' | ||
Siddharth Agarwal
|
r24408 | con.xml | ||
Siddharth Agarwal
|
r24430 | $ hg --config ui.portablefilenames=ignore add con.xml | ||
Siddharth Agarwal
|
r24408 | #endif | ||
Patrick Mezard
|
r17369 | >>> file('1k', 'wb').write(' '*1024) | ||
>>> file('2k', 'wb').write(' '*2048) | ||||
$ hg add 1k 2k | ||||
$ fileset 'size("bar")' | ||||
hg: parse error: couldn't parse size: bar | ||||
[255] | ||||
timeless
|
r27518 | $ fileset '(1k, 2k)' | ||
hg: parse error: can't use a list in this context | ||||
(see hg help "filesets.x or y") | ||||
[255] | ||||
Patrick Mezard
|
r17369 | $ fileset 'size(1k)' | ||
1k | ||||
$ fileset '(1k or 2k) and size("< 2k")' | ||||
1k | ||||
$ fileset '(1k or 2k) and size("<=2k")' | ||||
1k | ||||
2k | ||||
$ fileset '(1k or 2k) and size("> 1k")' | ||||
2k | ||||
$ fileset '(1k or 2k) and size(">=1K")' | ||||
1k | ||||
2k | ||||
$ fileset '(1k or 2k) and size(".5KB - 1.5kB")' | ||||
1k | ||||
r25925 | $ fileset 'size("1M")' | |||
$ fileset 'size("1 GB")' | ||||
Patrick Mezard
|
r17369 | |||
Test merge states | ||||
$ hg ci -m manychanges | ||||
$ hg up -C 0 | ||||
* files updated, 0 files merged, * files removed, 0 files unresolved (glob) | ||||
$ echo c >> b2 | ||||
$ hg ci -m diverging b2 | ||||
created new head | ||||
$ fileset 'resolved()' | ||||
$ fileset 'unresolved()' | ||||
$ hg merge | ||||
merging b2 | ||||
Siddharth Agarwal
|
r26614 | warning: conflicts while merging b2! (edit, then use 'hg resolve --mark') | ||
Matt Harbison
|
r26953 | * files updated, 0 files merged, 1 files removed, 1 files unresolved (glob) | ||
Patrick Mezard
|
r17369 | use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon | ||
[1] | ||||
$ fileset 'resolved()' | ||||
$ fileset 'unresolved()' | ||||
b2 | ||||
$ echo e > b2 | ||||
$ hg resolve -m b2 | ||||
Pierre-Yves David
|
r21947 | (no more unresolved files) | ||
Patrick Mezard
|
r17369 | $ fileset 'resolved()' | ||
b2 | ||||
$ fileset 'unresolved()' | ||||
$ hg ci -m merge | ||||
Test subrepo predicate | ||||
$ hg init sub | ||||
$ echo a > sub/suba | ||||
$ hg -R sub add sub/suba | ||||
$ hg -R sub ci -m sub | ||||
$ echo 'sub = sub' > .hgsub | ||||
Matt Harbison
|
r25558 | $ hg init sub2 | ||
$ echo b > sub2/b | ||||
$ hg -R sub2 ci -Am sub2 | ||||
adding b | ||||
$ echo 'sub2 = sub2' >> .hgsub | ||||
Patrick Mezard
|
r17369 | $ fileset 'subrepo()' | ||
$ hg add .hgsub | ||||
$ fileset 'subrepo()' | ||||
sub | ||||
Matt Harbison
|
r25558 | sub2 | ||
Patrick Mezard
|
r17369 | $ fileset 'subrepo("sub")' | ||
sub | ||||
$ fileset 'subrepo("glob:*")' | ||||
sub | ||||
Matt Harbison
|
r25558 | sub2 | ||
Patrick Mezard
|
r17370 | $ hg ci -m subrepo | ||
Patrick Mezard
|
r17369 | |||
Matt Harbison
|
r25558 | Test that .hgsubstate is updated as appropriate during a conversion. The | ||
saverev property is enough to alter the hashes of the subrepo. | ||||
$ hg init ../converted | ||||
$ hg --config extensions.convert= convert --config convert.hg.saverev=True \ | ||||
> sub ../converted/sub | ||||
initializing destination ../converted/sub repository | ||||
scanning source... | ||||
sorting... | ||||
converting... | ||||
0 sub | ||||
$ hg clone -U sub2 ../converted/sub2 | ||||
$ hg --config extensions.convert= convert --config convert.hg.saverev=True \ | ||||
> . ../converted | ||||
scanning source... | ||||
sorting... | ||||
converting... | ||||
4 addfiles | ||||
3 manychanges | ||||
2 diverging | ||||
1 merge | ||||
0 subrepo | ||||
no ".hgsubstate" updates will be made for "sub2" | ||||
$ hg up -q -R ../converted -r tip | ||||
$ hg --cwd ../converted cat sub/suba sub2/b -r tip | ||||
a | ||||
b | ||||
$ oldnode=`hg log -r tip -T "{node}\n"` | ||||
$ newnode=`hg log -R ../converted -r tip -T "{node}\n"` | ||||
Yuya Nishihara
|
r25587 | $ [ "$oldnode" != "$newnode" ] || echo "nothing changed" | ||
Matt Harbison
|
r25558 | |||
Patrick Mezard
|
r17370 | Test with a revision | ||
$ hg log -G --template '{rev} {desc}\n' | ||||
@ 4 subrepo | ||||
| | ||||
o 3 merge | ||||
|\ | ||||
| o 2 diverging | ||||
| | | ||||
o | 1 manychanges | ||||
|/ | ||||
o 0 addfiles | ||||
$ echo unknown > unknown | ||||
$ fileset -r1 'modified()' | ||||
b2 | ||||
$ fileset -r1 'added() and c1' | ||||
c1 | ||||
$ fileset -r1 'removed()' | ||||
a2 | ||||
$ fileset -r1 'deleted()' | ||||
$ fileset -r1 'unknown()' | ||||
$ fileset -r1 'ignored()' | ||||
$ fileset -r1 'hgignore()' | ||||
b2 | ||||
bin | ||||
$ fileset -r1 'binary()' | ||||
bin | ||||
$ fileset -r1 'size(1k)' | ||||
1k | ||||
$ fileset -r3 'resolved()' | ||||
$ fileset -r3 'unresolved()' | ||||
#if execbit | ||||
$ fileset -r1 'exec()' | ||||
b2 | ||||
#endif | ||||
#if symlink | ||||
$ fileset -r1 'symlink()' | ||||
b2link | ||||
#endif | ||||
Siddharth Agarwal
|
r24408 | #if no-windows | ||
$ fileset -r1 'not portable()' | ||||
con.xml | ||||
Matt Harbison
|
r24424 | $ hg forget 'con.xml' | ||
Siddharth Agarwal
|
r24408 | #endif | ||
Patrick Mezard
|
r17370 | $ fileset -r4 'subrepo("re:su.*")' | ||
sub | ||||
Matt Harbison
|
r25558 | sub2 | ||
Patrick Mezard
|
r17370 | $ fileset -r4 'subrepo("sub")' | ||
sub | ||||
Patrick Mezard
|
r17371 | $ fileset -r4 'b2 or c1' | ||
b2 | ||||
c1 | ||||
Patrick Mezard
|
r17370 | |||
Matt Mackall
|
r18842 | >>> open('dos', 'wb').write("dos\r\n") | ||
>>> open('mixed', 'wb').write("dos\r\nunix\n") | ||||
>>> open('mac', 'wb').write("mac\r") | ||||
$ hg add dos mixed mac | ||||
FUJIWARA Katsunori
|
r27459 | (remove a1, to examine safety of 'eol' on removed files) | ||
$ rm a1 | ||||
Matt Mackall
|
r18842 | $ fileset 'eol(dos)' | ||
dos | ||||
mixed | ||||
$ fileset 'eol(unix)' | ||||
FUJIWARA Katsunori
|
r27459 | mixed | ||
Matt Mackall
|
r18842 | .hgsub | ||
.hgsubstate | ||||
b1 | ||||
b2 | ||||
c1 | ||||
$ fileset 'eol(mac)' | ||||
mac | ||||
FUJIWARA Katsunori
|
r27459 | |||
Test safety of 'encoding' on removed files | ||||
$ fileset 'encoding("ascii")' | ||||
dos | ||||
mac | ||||
mixed | ||||
.hgsub | ||||
.hgsubstate | ||||
1k | ||||
2k | ||||
b1 | ||||
b2 | ||||
Matt Harbison
|
r31853 | b2link (symlink !) | ||
FUJIWARA Katsunori
|
r27459 | bin | ||
c1 | ||||
FUJIWARA Katsunori
|
r27464 | |||
Test detection of unintentional 'matchctx.existing()' invocation | ||||
$ cat > $TESTTMP/existingcaller.py <<EOF | ||||
FUJIWARA Katsunori
|
r28447 | > from mercurial import registrar | ||
FUJIWARA Katsunori
|
r27464 | > | ||
FUJIWARA Katsunori
|
r28447 | > filesetpredicate = registrar.filesetpredicate() | ||
> @filesetpredicate('existingcaller()', callexisting=False) | ||||
FUJIWARA Katsunori
|
r27464 | > def existingcaller(mctx, x): | ||
> # this 'mctx.existing()' invocation is unintentional | ||||
> return [f for f in mctx.existing()] | ||||
> EOF | ||||
$ cat >> .hg/hgrc <<EOF | ||||
> [extensions] | ||||
> existingcaller = $TESTTMP/existingcaller.py | ||||
> EOF | ||||
$ fileset 'existingcaller()' 2>&1 | tail -1 | ||||
AssertionError: unexpected existing() invocation | ||||
Pierre-Yves David
|
r31193 | |||
Test 'revs(...)' | ||||
================ | ||||
small reminder of the repository state | ||||
$ hg log -G | ||||
Matt Harbison
|
r31852 | @ changeset: 4:* (glob) | ||
Pierre-Yves David
|
r31193 | | tag: tip | ||
| user: test | ||||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: subrepo | ||||
| | ||||
Matt Harbison
|
r31852 | o changeset: 3:* (glob) | ||
Pierre-Yves David
|
r31193 | |\ parent: 2:55b05bdebf36 | ||
Matt Harbison
|
r31852 | | | parent: 1:* (glob) | ||
Pierre-Yves David
|
r31193 | | | user: test | ||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | summary: merge | ||||
| | | ||||
| o changeset: 2:55b05bdebf36 | ||||
| | parent: 0:8a9576c51c1f | ||||
| | user: test | ||||
| | date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| | summary: diverging | ||||
| | | ||||
Matt Harbison
|
r31852 | o | changeset: 1:* (glob) | ||
Pierre-Yves David
|
r31193 | |/ user: test | ||
| date: Thu Jan 01 00:00:00 1970 +0000 | ||||
| summary: manychanges | ||||
| | ||||
o changeset: 0:8a9576c51c1f | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: addfiles | ||||
$ hg status --change 0 | ||||
A a1 | ||||
A a2 | ||||
A b1 | ||||
A b2 | ||||
$ hg status --change 1 | ||||
M b2 | ||||
A 1k | ||||
A 2k | ||||
Matt Harbison
|
r31830 | A b2link (no-windows !) | ||
Pierre-Yves David
|
r31193 | A bin | ||
A c1 | ||||
Matt Harbison
|
r31830 | A con.xml (no-windows !) | ||
Pierre-Yves David
|
r31193 | R a2 | ||
$ hg status --change 2 | ||||
M b2 | ||||
$ hg status --change 3 | ||||
M b2 | ||||
A 1k | ||||
A 2k | ||||
Matt Harbison
|
r31830 | A b2link (no-windows !) | ||
Pierre-Yves David
|
r31193 | A bin | ||
A c1 | ||||
Matt Harbison
|
r31830 | A con.xml (no-windows !) | ||
Pierre-Yves David
|
r31193 | R a2 | ||
$ hg status --change 4 | ||||
A .hgsub | ||||
A .hgsubstate | ||||
$ hg status | ||||
A dos | ||||
A mac | ||||
A mixed | ||||
Matt Harbison
|
r31830 | R con.xml (no-windows !) | ||
Pierre-Yves David
|
r31193 | ! a1 | ||
? b2.orig | ||||
? c3 | ||||
? unknown | ||||
Test files at -r0 should be filtered by files at wdir | ||||
----------------------------------------------------- | ||||
$ fileset -r0 '* and revs("wdir()", *)' | ||||
a1 | ||||
b1 | ||||
b2 | ||||
Test that "revs()" work at all | ||||
------------------------------ | ||||
$ fileset "revs('2', modified())" | ||||
b2 | ||||
Test that "revs()" work for file missing in the working copy/current context | ||||
---------------------------------------------------------------------------- | ||||
(a2 not in working copy) | ||||
$ fileset "revs('0', added())" | ||||
a1 | ||||
a2 | ||||
b1 | ||||
b2 | ||||
(none of the file exist in "0") | ||||
$ fileset -r 0 "revs('4', added())" | ||||
.hgsub | ||||
.hgsubstate | ||||
Call with empty revset | ||||
-------------------------- | ||||
$ fileset "revs('2-2', modified())" | ||||
Call with revset matching multiple revs | ||||
--------------------------------------- | ||||
$ fileset "revs('0+4', added())" | ||||
a1 | ||||
a2 | ||||
b1 | ||||
b2 | ||||
.hgsub | ||||
.hgsubstate | ||||
overlapping set | ||||
$ fileset "revs('1+2', modified())" | ||||
b2 | ||||
Pierre-Yves David
|
r31195 | |||
test 'status(...)' | ||||
================= | ||||
Simple case | ||||
----------- | ||||
$ fileset "status(3, 4, added())" | ||||
.hgsub | ||||
.hgsubstate | ||||
use rev to restrict matched file | ||||
----------------------------------------- | ||||
$ hg status --removed --rev 0 --rev 1 | ||||
R a2 | ||||
$ fileset "status(0, 1, removed())" | ||||
a2 | ||||
$ fileset "* and status(0, 1, removed())" | ||||
$ fileset -r 4 "status(0, 1, removed())" | ||||
a2 | ||||
$ fileset -r 4 "* and status(0, 1, removed())" | ||||
$ fileset "revs('4', * and status(0, 1, removed()))" | ||||
$ fileset "revs('0', * and status(0, 1, removed()))" | ||||
a2 | ||||
check wdir() | ||||
------------ | ||||
$ hg status --removed --rev 4 | ||||
Matt Harbison
|
r31830 | R con.xml (no-windows !) | ||
Pierre-Yves David
|
r31195 | $ fileset "status(4, 'wdir()', removed())" | ||
Matt Harbison
|
r31830 | con.xml (no-windows !) | ||
Pierre-Yves David
|
r31195 | |||
$ hg status --removed --rev 2 | ||||
R a2 | ||||
$ fileset "status('2', 'wdir()', removed())" | ||||
a2 | ||||
test backward status | ||||
-------------------- | ||||
$ hg status --removed --rev 0 --rev 4 | ||||
R a2 | ||||
$ hg status --added --rev 4 --rev 0 | ||||
A a2 | ||||
$ fileset "status(4, 0, added())" | ||||
a2 | ||||
test cross branch status | ||||
------------------------ | ||||
$ hg status --added --rev 1 --rev 2 | ||||
A a2 | ||||
$ fileset "status(1, 2, added())" | ||||
a2 | ||||
test with multi revs revset | ||||
--------------------------- | ||||
$ hg status --added --rev 0:1 --rev 3:4 | ||||
A .hgsub | ||||
A .hgsubstate | ||||
A 1k | ||||
A 2k | ||||
Matt Harbison
|
r31830 | A b2link (no-windows !) | ||
Pierre-Yves David
|
r31195 | A bin | ||
A c1 | ||||
Matt Harbison
|
r31830 | A con.xml (no-windows !) | ||
Pierre-Yves David
|
r31195 | $ fileset "status('0:1', '3:4', added())" | ||
.hgsub | ||||
.hgsubstate | ||||
1k | ||||
2k | ||||
Matt Harbison
|
r31830 | b2link (no-windows !) | ||
Pierre-Yves David
|
r31195 | bin | ||
c1 | ||||
Matt Harbison
|
r31830 | con.xml (no-windows !) | ||
Pierre-Yves David
|
r31195 | |||
tests with empty value | ||||
---------------------- | ||||
Fully empty revset | ||||
$ fileset "status('', '4', added())" | ||||
hg: parse error: first argument to status must be a revision | ||||
[255] | ||||
$ fileset "status('2', '', added())" | ||||
hg: parse error: second argument to status must be a revision | ||||
[255] | ||||
Empty revset will error at the revset layer | ||||
$ fileset "status(' ', '4', added())" | ||||
hg: parse error at 1: not a prefix: end | ||||
[255] | ||||
$ fileset "status('2', ' ', added())" | ||||
hg: parse error at 1: not a prefix: end | ||||
[255] | ||||