Skip to content

Commit

Permalink
apply: split out removal and creation into different phases.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Jul 17, 2006
1 parent c28c571 commit eed4664
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions builtin-apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}

Expand Down

0 comments on commit eed4664

Please sign in to comment.