Skip to content

Commit

Permalink
builtin-bundle create - use lock_file
Browse files Browse the repository at this point in the history
"git bundle create" left an invalid, partially written bundle if
an error occured during creation.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Aug 13, 2007
1 parent 95eb685 commit 4b37666
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions builtin-bundle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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));
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 4b37666

Please sign in to comment.