From: Linus Torvalds <torvalds@ppc970.osdl.org>
Date: Thu, 9 Jun 2005 22:34:04 +0000 (-0700)
Subject: git-read-tree: remove deleted files in the working directory
X-Git-Tag: v0.99~295
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=aa16021efcd969a44b480d0964e07d52167517db;p=git.git

git-read-tree: remove deleted files in the working directory

Only when "-u" is used of course.
---

diff --git a/read-cache.c b/read-cache.c
index 0d949f691..d358933b2 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 b3a3c4ab5..ee7a46c90 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)