From aa16021efcd969a44b480d0964e07d52167517db Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 9 Jun 2005 15:34:04 -0700 Subject: [PATCH] git-read-tree: remove deleted files in the working directory Only when "-u" is used of course. --- read-cache.c | 2 ++ read-tree.c | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/read-cache.c b/read-cache.c index 0d949f69..d358933b 100644 --- a/read-cache.c +++ b/read-cache.c @@ -452,6 +452,8 @@ int write_cache(int newfd, struct cache_entry **cache, int entries) for (i = 0; i < entries; i++) { struct cache_entry *ce = cache[i]; + if (!ce->ce_mode) + continue; if (ce_write(&c, newfd, ce, ce_size(ce)) < 0) return -1; } diff --git a/read-tree.c b/read-tree.c index b3a3c4ab..ee7a46c9 100644 --- a/read-tree.c +++ b/read-tree.c @@ -124,6 +124,15 @@ static int merged_entry(struct cache_entry *merge, struct cache_entry *old, stru return 1; } +static int deleted_entry(struct cache_entry *ce, struct cache_entry *old, struct cache_entry **dst) +{ + if (old) + verify_uptodate(old); + ce->ce_mode = 0; + *dst++ = ce; + return 1; +} + static int threeway_merge(struct cache_entry *stages[4], struct cache_entry **dst) { struct cache_entry *old = stages[0]; @@ -183,23 +192,21 @@ static int twoway_merge(struct cache_entry **src, struct cache_entry **dst) } else if (oldtree && !newtree && same(current, oldtree)) { /* 10 or 11 */ - verify_uptodate(current); - return 0; + return deleted_entry(oldtree, current, dst); } else if (oldtree && newtree && same(current, oldtree) && !same(current, newtree)) { /* 20 or 21 */ - verify_uptodate(current); - return merged_entry(newtree, NULL, dst); + return merged_entry(newtree, current, dst); } else /* all other failures */ return -1; } else if (newtree) - return merged_entry(newtree, NULL, dst); + return merged_entry(newtree, current, dst); else - return 0; + return deleted_entry(oldtree, current, dst); } /* @@ -236,6 +243,11 @@ static void check_updates(struct cache_entry **src, int nr) unsigned short mask = htons(CE_UPDATE); while (nr--) { struct cache_entry *ce = *src++; + if (!ce->ce_mode) { + if (update) + unlink(ce->name); + continue; + } if (ce->ce_flags & mask) { ce->ce_flags &= ~mask; if (update) -- 2.11.0