revert: triage "deleted" files into more appropriate categories
Status can return file as "deleted". This is only a special case
related to working directory state: file is recorded as tracked but no
file exists on disk. This will never be a state obtainable from
manifest comparisons.
"Deleted" files have another working directory status shadowed by the lack of
file. They will -alway- be touched by revert. The "lack of file" can be seen as
a modification. The file will never match the same "content" as in the revert
target. From there we have two options:
1. The file exists in the target and can be seen as "modified".
2. The file does not exist in the target and can be seen as "added".
So now we just dispatch elements from delete into appropriate categories.
$ hg init
Revision 0:
$ echo "unchanged" > unchanged
$ echo "remove me" > remove
$ echo "copy me" > copy
$ echo "move me" > move
$ for i in 1 2 3 4 5 6 7 8 9; do
> echo "merge ok $i" >> zzz1_merge_ok
> done
$ echo "merge bad" > zzz2_merge_bad
$ hg ci -Am "revision 0"
adding copy
adding move
adding remove
adding unchanged
adding zzz1_merge_ok
adding zzz2_merge_bad
Revision 1:
$ hg rm remove
$ hg mv move moved
$ hg cp copy copied
$ echo "added" > added
$ hg add added
$ echo "new first line" > zzz1_merge_ok
$ hg cat zzz1_merge_ok >> zzz1_merge_ok
$ echo "new last line" >> zzz2_merge_bad
$ hg ci -m "revision 1"
Local changes to revision 0:
$ hg co 0
4 files updated, 0 files merged, 3 files removed, 0 files unresolved
$ echo "new last line" >> zzz1_merge_ok
$ echo "another last line" >> zzz2_merge_bad
$ hg diff --nodates | grep "^[+-][^<>]"
--- a/zzz1_merge_ok
+++ b/zzz1_merge_ok
+new last line
--- a/zzz2_merge_bad
+++ b/zzz2_merge_bad
+another last line
$ hg st
M zzz1_merge_ok
M zzz2_merge_bad
Local merge with bad merge tool:
$ HGMERGE=false hg co
merging zzz1_merge_ok
merging zzz2_merge_bad
merging zzz2_merge_bad failed!
3 files updated, 1 files merged, 2 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
$ hg co 0
merging zzz1_merge_ok
merging zzz2_merge_bad
warning: conflicts during merge.
merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
2 files updated, 1 files merged, 3 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
$ hg diff --nodates | grep "^[+-][^<>]"
--- a/zzz1_merge_ok
+++ b/zzz1_merge_ok
+new last line
--- a/zzz2_merge_bad
+++ b/zzz2_merge_bad
+another last line
+=======
$ hg st
M zzz1_merge_ok
M zzz2_merge_bad
? zzz2_merge_bad.orig
Local merge with conflicts:
$ hg co
merging zzz1_merge_ok
merging zzz2_merge_bad
warning: conflicts during merge.
merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
3 files updated, 1 files merged, 2 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
$ hg co 0
merging zzz1_merge_ok
merging zzz2_merge_bad
warning: conflicts during merge.
merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
2 files updated, 1 files merged, 3 files removed, 1 files unresolved
use 'hg resolve' to retry unresolved file merges
[1]
$ hg diff --nodates | grep "^[+-][^<>]"
--- a/zzz1_merge_ok
+++ b/zzz1_merge_ok
+new last line
--- a/zzz2_merge_bad
+++ b/zzz2_merge_bad
+another last line
+=======
+=======
+new last line
+=======
$ hg st
M zzz1_merge_ok
M zzz2_merge_bad
? zzz2_merge_bad.orig
Local merge without conflicts:
$ hg revert zzz2_merge_bad
$ hg co
merging zzz1_merge_ok
4 files updated, 1 files merged, 2 files removed, 0 files unresolved
$ hg diff --nodates | grep "^[+-][^<>]"
--- a/zzz1_merge_ok
+++ b/zzz1_merge_ok
+new last line
$ hg st
M zzz1_merge_ok
? zzz2_merge_bad.orig