summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 69530cb)
raw | patch | inline | side by side (parent: 69530cb)
author | Junio C Hamano <gitster@pobox.com> | |
Sat, 29 Nov 2008 03:55:25 +0000 (19:55 -0800) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Sat, 29 Nov 2008 03:58:24 +0000 (19:58 -0800) |
This uses the extended index flag mechanism introduced earlier to mark
the entries added to the index via "git add -N" with CE_INTENT_TO_ADD.
The logic to detect an "intent to add" entry for the purpose of allowing
"git rm --cached $path" is tightened to check not just for a staged empty
blob, but with the CE_INTENT_TO_ADD bit. This protects an empty blob that
was explicitly added and then modified in the work tree from being dropped
with this sequence:
$ >empty
$ git add empty
$ echo "non empty" >empty
$ git rm --cached empty
Signed-off-by: Junio C Hamano <gitster@pobox.com>
the entries added to the index via "git add -N" with CE_INTENT_TO_ADD.
The logic to detect an "intent to add" entry for the purpose of allowing
"git rm --cached $path" is tightened to check not just for a staged empty
blob, but with the CE_INTENT_TO_ADD bit. This protects an empty blob that
was explicitly added and then modified in the work tree from being dropped
with this sequence:
$ >empty
$ git add empty
$ echo "non empty" >empty
$ git rm --cached empty
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-rm.c | patch | blob | history | |
cache.h | patch | blob | history | |
read-cache.c | patch | blob | history | |
t/t3600-rm.sh | patch | blob | history |
diff --git a/builtin-rm.c b/builtin-rm.c
index 3d03da09df0b2831dd5a6bcbc09e75db356260a1..c11f45585825962e61bdee4bdd6df206f0a141c6 100644 (file)
--- a/builtin-rm.c
+++ b/builtin-rm.c
* "intent to add" entry.
*/
if (local_changes && staged_changes) {
- if (!index_only || !is_empty_blob_sha1(ce->sha1))
+ if (!index_only || !(ce->ce_flags & CE_INTENT_TO_ADD))
errs = error("'%s' has staged content different "
"from both the file and the HEAD\n"
"(use -f to force removal)", name);
index ef2e7f93f766ded444bd5f8c82d5df8717ff70f5..f15b3fc906b8a3525e3d81b2c2fb826b5fec44b8 100644 (file)
--- a/cache.h
+++ b/cache.h
/*
* Extended on-disk flags
*/
+#define CE_INTENT_TO_ADD 0x20000000
/* CE_EXTENDED2 is for future extension */
#define CE_EXTENDED2 0x80000000
-#define CE_EXTENDED_FLAGS (0)
+#define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD)
/*
* Safeguard to avoid saving wrong flags:
diff --git a/read-cache.c b/read-cache.c
index abc627ba0b42244a0bc609fe5e26fb08c101319e..fa30a0f88577be6ec33832ea34f8a71e7ba6b0ea 100644 (file)
--- a/read-cache.c
+++ b/read-cache.c
ce->ce_flags = namelen;
if (!intent_only)
fill_stat_cache_info(ce, st);
+ else
+ ce->ce_flags |= CE_INTENT_TO_ADD;
if (trust_executable_bit && has_symlinks)
ce->ce_mode = create_ce_mode(st_mode);
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 5b4d6f71387ce7f30cb7ee6b596357aa1942ab6e..b7d46e50a87f2609e67f595470021450b1f838a6 100755 (executable)
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
test_must_fail git ls-files --error-unmatch baz
'
-test_expect_failure 'refuse to remove cached empty file with modifications' '
- touch empty &&
+test_expect_success 'refuse to remove cached empty file with modifications' '
+ >empty &&
git add empty &&
echo content >empty &&
test_must_fail git rm --cached empty