From 57eb3007ab9cb7ee732c8edcea3195c512b8042f Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Wed, 1 Aug 2012 03:45:09 +0200 Subject: Allow to process only part of the deferred output file list * src/patch.c (output_files): Add parameter to specify which file to stop at. (main): Pass NULL to output_files() to process the entire list. --- src/patch.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/patch.c b/src/patch.c index e0e4f38..ae6d0b6 100644 --- a/src/patch.c +++ b/src/patch.c @@ -61,7 +61,7 @@ static void output_file (char const *, int *, const struct stat *, char const *, static void init_files_to_delete (void); static void init_files_to_output (void); static void delete_files (void); -static void output_files (void); +static void output_files (struct stat const *); #ifdef ENABLE_MERGE static bool merge; @@ -197,7 +197,7 @@ main (int argc, char **argv) if (have_git_diff != pch_git_diff ()) { have_git_diff = ! have_git_diff; - output_files (); + output_files (NULL); } if (TMPREJNAME_needs_removal) @@ -597,7 +597,7 @@ main (int argc, char **argv) } if (outstate.ofp && (ferror (outstate.ofp) || fclose (outstate.ofp) != 0)) write_fatal (); - output_files (); + output_files (NULL); delete_files (); cleanup (); if (somefailed) @@ -1792,7 +1792,7 @@ gl_list_clear (gl_list_t list) } static void -output_files (void) +output_files (struct stat const *st) { gl_list_iterator_t iter; const void *elt; @@ -1802,12 +1802,27 @@ output_files (void) { const struct file_to_output *file_to_output = elt; int from_needs_removal = 1; + struct stat const *from_st = &file_to_output->from_st; output_file_now (file_to_output->from, &from_needs_removal, - &file_to_output->from_st, file_to_output->to, + from_st, file_to_output->to, file_to_output->mode, file_to_output->backup); if (from_needs_removal) unlink (file_to_output->from); + + if (st && st->st_dev == from_st->st_dev && st->st_ino == from_st->st_ino) + { + /* Free the list up to here. */ + for (;;) + { + const void *elt2 = gl_list_get_at (files_to_output, 0); + gl_list_remove_at (files_to_output, 0); + if (elt == elt2) + break; + } + gl_list_iterator_free (&iter); + return; + } } gl_list_iterator_free (&iter); gl_list_clear (files_to_output); -- cgit v1.2.1