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

Only when "-u" is used of course.
This commit is contained in:
Linus Torvalds 2005-06-09 15:34:04 -07:00
Родитель 22f77b772d
Коммит aa16021efc
2 изменённых файлов: 20 добавлений и 6 удалений

Просмотреть файл

@ -452,6 +452,8 @@ int write_cache(int newfd, struct cache_entry **cache, int entries)
for (i = 0; i < entries; i++) { for (i = 0; i < entries; i++) {
struct cache_entry *ce = cache[i]; struct cache_entry *ce = cache[i];
if (!ce->ce_mode)
continue;
if (ce_write(&c, newfd, ce, ce_size(ce)) < 0) if (ce_write(&c, newfd, ce, ce_size(ce)) < 0)
return -1; return -1;
} }

Просмотреть файл

@ -124,6 +124,15 @@ static int merged_entry(struct cache_entry *merge, struct cache_entry *old, stru
return 1; 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) static int threeway_merge(struct cache_entry *stages[4], struct cache_entry **dst)
{ {
struct cache_entry *old = stages[0]; 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)) { else if (oldtree && !newtree && same(current, oldtree)) {
/* 10 or 11 */ /* 10 or 11 */
verify_uptodate(current); return deleted_entry(oldtree, current, dst);
return 0;
} }
else if (oldtree && newtree && else if (oldtree && newtree &&
same(current, oldtree) && !same(current, newtree)) { same(current, oldtree) && !same(current, newtree)) {
/* 20 or 21 */ /* 20 or 21 */
verify_uptodate(current); return merged_entry(newtree, current, dst);
return merged_entry(newtree, NULL, dst);
} }
else else
/* all other failures */ /* all other failures */
return -1; return -1;
} }
else if (newtree) else if (newtree)
return merged_entry(newtree, NULL, dst); return merged_entry(newtree, current, dst);
else 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); unsigned short mask = htons(CE_UPDATE);
while (nr--) { while (nr--) {
struct cache_entry *ce = *src++; struct cache_entry *ce = *src++;
if (!ce->ce_mode) {
if (update)
unlink(ce->name);
continue;
}
if (ce->ce_flags & mask) { if (ce->ce_flags & mask) {
ce->ce_flags &= ~mask; ce->ce_flags &= ~mask;
if (update) if (update)