diff options
Diffstat (limited to 'builtin-bundle.c')
-rw-r--r-- | builtin-bundle.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/builtin-bundle.c b/builtin-bundle.c index f4b4f034f4..1b650069c9 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; } |