diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-08-12 10:44:06 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-08-13 13:04:18 -0700 |
commit | 4b37666ccbab015e75fda745c29a2f5d58a54482 (patch) | |
tree | f5ac0822c88138c242e55b5d302a89b595a414fc /builtin-bundle.c | |
parent | 95eb6853af73ba91188a481a882076fa2639f15f (diff) | |
download | git-4b37666ccbab015e75fda745c29a2f5d58a54482.tar.gz |
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 <gitster@pobox.com>
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; } |