From 4b37666ccbab015e75fda745c29a2f5d58a54482 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 12 Aug 2007 10:44:06 -0700 Subject: [PATCH] builtin-bundle create - use lock_file "git bundle create" left an invalid, partially written bundle if an error occured during creation. Signed-off-by: Junio C Hamano --- builtin-bundle.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/builtin-bundle.c b/builtin-bundle.c index f4b4f034f..1b650069c 100644 --- a/builtin-bundle.c +++ b/builtin-bundle.c @@ -189,7 +189,9 @@ static int list_heads(struct bundle_header *header, int argc, const char **argv) static int create_bundle(struct bundle_header *header, const char *path, int argc, const char **argv) { + static struct lock_file lock; int bundle_fd = -1; + int bundle_to_stdout; const char **argv_boundary = xmalloc((argc + 4) * sizeof(const char *)); const char **argv_pack = xmalloc(5 * sizeof(const char *)); int i, ref_count = 0; @@ -198,14 +200,11 @@ static int create_bundle(struct bundle_header *header, const char *path, struct child_process rls; FILE *rls_fout; - /* - * NEEDSWORK: this should use something like lock-file - * to create temporary that is cleaned up upon error. - */ - bundle_fd = (!strcmp(path, "-") ? 1 : - open(path, O_CREAT | O_EXCL | O_WRONLY, 0666)); - if (bundle_fd < 0) - return error("Could not create '%s': %s", path, strerror(errno)); + bundle_to_stdout = !strcmp(path, "-"); + if (bundle_to_stdout) + bundle_fd = 1; + else + bundle_fd = hold_lock_file_for_update(&lock, path, 1); /* write signature */ write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature)); @@ -341,6 +340,9 @@ static int create_bundle(struct bundle_header *header, const char *path, } if (finish_command(&rls)) return error ("pack-objects died"); + close(bundle_fd); + if (!bundle_to_stdout) + commit_lock_file(&lock); return 0; } -- 2.30.2