mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 17:27:53 +03:00
42c14b3ed1
I accidentally did 'hg forget .' and tried to undo the operation with 'hg add .'. I expected the files to be reported as either modified or clean, but they were still reported as removed. It turns out that forgotten files are only added back if they are listed explicitly, as shown by the following two invocations. This makes it hard to recover from the mistake of forgetting a lot of files. $ hg forget README && hg add README && hg status -A README C README $ hg forget README && hg add . && hg status -A README R README The problem lies in cmdutil.add(). That method checks that the file isn't already tracked before adding it, but it does so by checking the dirstate, which does have an entry for forgotten files (state 'r'). We should instead be checking whether the file exists in the workingctx. The workingctx is also what we later call add() on, and that method takes care of transforming the add() into a normallookup() on the dirstate. Since we're changing repo.dirstate into wctx, let's also change repo.walk into wctx.walk for consistency (repo.walk calls wctx.walk, so we're simply inlining the call).
173 lines
2.9 KiB
Perl
173 lines
2.9 KiB
Perl
$ hg init a
|
|
$ cd a
|
|
$ echo a > a
|
|
$ hg add -n
|
|
adding a
|
|
$ hg st
|
|
? a
|
|
$ hg add
|
|
adding a
|
|
$ hg st
|
|
A a
|
|
$ hg forget a
|
|
$ hg add
|
|
adding a
|
|
$ hg st
|
|
A a
|
|
|
|
$ echo b > b
|
|
$ hg add -n b
|
|
$ hg st
|
|
A a
|
|
? b
|
|
$ hg add b
|
|
$ hg st
|
|
A a
|
|
A b
|
|
|
|
should fail
|
|
|
|
$ hg add b
|
|
b already tracked!
|
|
$ hg st
|
|
A a
|
|
A b
|
|
|
|
#if no-windows
|
|
$ echo foo > con.xml
|
|
$ hg --config ui.portablefilenames=jump add con.xml
|
|
abort: ui.portablefilenames value is invalid ('jump')
|
|
[255]
|
|
$ hg --config ui.portablefilenames=abort add con.xml
|
|
abort: filename contains 'con', which is reserved on Windows: 'con.xml'
|
|
[255]
|
|
$ hg st
|
|
A a
|
|
A b
|
|
? con.xml
|
|
$ hg add con.xml
|
|
warning: filename contains 'con', which is reserved on Windows: 'con.xml'
|
|
$ hg st
|
|
A a
|
|
A b
|
|
A con.xml
|
|
$ hg forget con.xml
|
|
$ rm con.xml
|
|
#endif
|
|
|
|
#if eol-in-paths
|
|
$ echo bla > 'hello:world'
|
|
$ hg --config ui.portablefilenames=abort add
|
|
adding hello:world
|
|
abort: filename contains ':', which is reserved on Windows: 'hello:world'
|
|
[255]
|
|
$ hg st
|
|
A a
|
|
A b
|
|
? hello:world
|
|
$ hg --config ui.portablefilenames=ignore add
|
|
adding hello:world
|
|
$ hg st
|
|
A a
|
|
A b
|
|
A hello:world
|
|
#endif
|
|
|
|
$ hg ci -m 0 --traceback
|
|
|
|
should fail
|
|
|
|
$ hg add a
|
|
a already tracked!
|
|
|
|
$ echo aa > a
|
|
$ hg ci -m 1
|
|
$ hg up 0
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ echo aaa > a
|
|
$ hg ci -m 2
|
|
created new head
|
|
|
|
$ hg merge
|
|
merging a
|
|
warning: conflicts during merge.
|
|
merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
|
|
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
|
|
use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
|
|
[1]
|
|
$ hg st
|
|
M a
|
|
? a.orig
|
|
|
|
should fail
|
|
|
|
$ hg add a
|
|
a already tracked!
|
|
$ hg st
|
|
M a
|
|
? a.orig
|
|
$ hg resolve -m a
|
|
(no more unresolved files)
|
|
$ hg ci -m merge
|
|
|
|
Issue683: peculiarity with hg revert of an removed then added file
|
|
|
|
$ hg forget a
|
|
$ hg add a
|
|
$ hg st
|
|
? a.orig
|
|
$ hg rm a
|
|
$ hg st
|
|
R a
|
|
? a.orig
|
|
$ echo a > a
|
|
$ hg add a
|
|
$ hg st
|
|
M a
|
|
? a.orig
|
|
|
|
Forgotten file can be added back (as either clean or modified)
|
|
|
|
$ hg forget b
|
|
$ hg add b
|
|
$ hg st -A b
|
|
C b
|
|
$ hg forget b
|
|
$ echo modified > b
|
|
$ hg add b
|
|
$ hg st -A b
|
|
M b
|
|
$ hg revert -qC b
|
|
|
|
$ hg add c && echo "unexpected addition of missing file"
|
|
c: * (glob)
|
|
[1]
|
|
$ echo c > c
|
|
$ hg add d c && echo "unexpected addition of missing file"
|
|
d: * (glob)
|
|
[1]
|
|
$ hg st
|
|
M a
|
|
A c
|
|
? a.orig
|
|
$ hg up -C
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
forget and get should have the right order: added but missing dir should be
|
|
forgotten before file with same name is added
|
|
|
|
$ echo file d > d
|
|
$ hg add d
|
|
$ hg ci -md
|
|
$ hg rm d
|
|
$ mkdir d
|
|
$ echo a > d/a
|
|
$ hg add d/a
|
|
$ rm -r d
|
|
$ hg up -C
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
$ cat d
|
|
file d
|
|
|
|
$ cd ..
|