summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2012-08-01 03:45:09 +0200
committerAndreas Gruenbacher <agruen@linbit.com>2012-08-01 04:25:16 +0200
commit57eb3007ab9cb7ee732c8edcea3195c512b8042f (patch)
tree6a4c5957543289871bef28e4e48b564105ea6bbe
parentea4212ee512edb4a8c0b8559e961d8e06855db9d (diff)
downloadpatch-57eb3007ab9cb7ee732c8edcea3195c512b8042f.tar.gz
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.
-rw-r--r--src/patch.c25
1 files 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);