зеркало из https://github.com/microsoft/git.git
apply: split out removal and creation into different phases.
This reworks write_out_result() loop so we first remove the paths that are to go away and then create them after finishing all the removal. This is necessary when a patch creates a file "foo" and removes a file "foo/bar". Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
c28c571c14
Коммит
eed46644ca
|
@ -2059,32 +2059,42 @@ static void create_file(struct patch *patch)
|
|||
cache_tree_invalidate_path(active_cache_tree, path);
|
||||
}
|
||||
|
||||
static void write_out_one_result(struct patch *patch)
|
||||
/* phase zero is to remove, phase one is to create */
|
||||
static void write_out_one_result(struct patch *patch, int phase)
|
||||
{
|
||||
if (patch->is_delete > 0) {
|
||||
remove_file(patch);
|
||||
if (phase == 0)
|
||||
remove_file(patch);
|
||||
return;
|
||||
}
|
||||
if (patch->is_new > 0 || patch->is_copy) {
|
||||
create_file(patch);
|
||||
if (phase == 1)
|
||||
create_file(patch);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Rename or modification boils down to the same
|
||||
* thing: remove the old, write the new
|
||||
*/
|
||||
remove_file(patch);
|
||||
if (phase == 0)
|
||||
remove_file(patch);
|
||||
if (phase == 1)
|
||||
create_file(patch);
|
||||
}
|
||||
|
||||
static void write_out_results(struct patch *list, int skipped_patch)
|
||||
{
|
||||
int phase;
|
||||
|
||||
if (!list && !skipped_patch)
|
||||
die("No changes");
|
||||
|
||||
while (list) {
|
||||
write_out_one_result(list);
|
||||
list = list->next;
|
||||
for (phase = 0; phase < 2; phase++) {
|
||||
struct patch *l = list;
|
||||
while (l) {
|
||||
write_out_one_result(l, phase);
|
||||
l = l->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче