summaryrefslogtreecommitdiff
path: root/bundle.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-08-25 14:57:09 -0700
committerJunio C Hamano <gitster@pobox.com>2015-08-25 14:57:09 -0700
commitdb86e61cbbc4c59a0886366bbf392498e64b53c8 (patch)
tree8b92645b8adeddaf02caa483579c64dbc09370fe /bundle.c
parent424f89f098a045785471cccb4f7307cc5b05bc54 (diff)
parent9e9033166b3a6b34aad917891b9210fa194fdfd9 (diff)
Merge branch 'mh/tempfile'
The "lockfile" API has been rebuilt on top of a new "tempfile" API. * mh/tempfile: credential-cache--daemon: use tempfile module credential-cache--daemon: delete socket from main() gc: use tempfile module to handle gc.pid file lock_repo_for_gc(): compute the path to "gc.pid" only once diff: use tempfile module setup_temporary_shallow(): use tempfile module write_shared_index(): use tempfile module register_tempfile(): new function to handle an existing temporary file tempfile: add several functions for creating temporary files prepare_tempfile_object(): new function, extracted from create_tempfile() tempfile: a new module for handling temporary files commit_lock_file(): use get_locked_file_path() lockfile: add accessor get_lock_file_path() lockfile: add accessors get_lock_file_fd() and get_lock_file_fp() create_bundle(): duplicate file descriptor to avoid closing it twice lockfile: move documentation to lockfile.h and lockfile.c
Diffstat (limited to 'bundle.c')
-rw-r--r--bundle.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/bundle.c b/bundle.c
index f732c920aa..b9dacc0241 100644
--- a/bundle.c
+++ b/bundle.c
@@ -235,7 +235,9 @@ out:
return result;
}
-static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_info *revs)
+
+/* Write the pack data to bundle_fd, then close it if it is > 1. */
+static int write_pack_data(int bundle_fd, struct rev_info *revs)
{
struct child_process pack_objects = CHILD_PROCESS_INIT;
int i;
@@ -250,13 +252,6 @@ static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_inf
if (start_command(&pack_objects))
return error(_("Could not spawn pack-objects"));
- /*
- * start_command closed bundle_fd if it was > 1
- * so set the lock fd to -1 so commit_lock_file()
- * won't fail trying to close it.
- */
- lock->fd = -1;
-
for (i = 0; i < revs->pending.nr; i++) {
struct object *object = revs->pending.objects[i].item;
if (object->flags & UNINTERESTING)
@@ -416,10 +411,21 @@ int create_bundle(struct bundle_header *header, const char *path,
bundle_to_stdout = !strcmp(path, "-");
if (bundle_to_stdout)
bundle_fd = 1;
- else
+ else {
bundle_fd = hold_lock_file_for_update(&lock, path,
LOCK_DIE_ON_ERROR);
+ /*
+ * write_pack_data() will close the fd passed to it,
+ * but commit_lock_file() will also try to close the
+ * lockfile's fd. So make a copy of the file
+ * descriptor to avoid trying to close it twice.
+ */
+ bundle_fd = dup(bundle_fd);
+ if (bundle_fd < 0)
+ die_errno("unable to dup file descriptor");
+ }
+
/* write signature */
write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
@@ -445,7 +451,7 @@ int create_bundle(struct bundle_header *header, const char *path,
return -1;
/* write pack */
- if (write_pack_data(bundle_fd, &lock, &revs))
+ if (write_pack_data(bundle_fd, &revs))
return -1;
if (!bundle_to_stdout) {