Skip to content

Commit

Permalink
git add --intent-to-add: fix removal of cached emptiness
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Nov 29, 2008
1 parent 69530cb commit 388b2ac
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 4 deletions.
2 changes: 1 addition & 1 deletion builtin-rm.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ static int check_local_mod(unsigned char *head, int index_only)
* "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);
Expand Down
3 changes: 2 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,10 +176,11 @@ struct cache_entry {
/*
* 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:
Expand Down
2 changes: 2 additions & 0 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
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);
Expand Down
4 changes: 2 additions & 2 deletions t/t3600-rm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ test_expect_success 'but with -f it should work.' '
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
Expand Down

0 comments on commit 388b2ac

Please sign in to comment.