aboutsummaryrefslogtreecommitdiffstats
path: root/bundle.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2014-10-30 10:45:41 -0700
committerJunio C Hamano <gitster@pobox.com>2014-10-30 14:45:52 -0700
commit5e626b91d4a5d2cfee8747facd53d7661f1f9112 (patch)
treea97e13af4d2c822ec26e306d68d51c4e8e79f754 /bundle.c
parent8828f2985f1967201c256fb01f92a91acfdb5001 (diff)
downloadgit-5e626b91d4a5d2cfee8747facd53d7661f1f9112.tar.gz
bundle: split out a helper function to create pack data
The create_bundle() function, while it does one single logical thing, takes a rather large implementation to do so. Let's start separating what it does into smaller steps to make it easier to see what is going on. This is a first step to separate out the actual pack-data generation, after the earlier part of the function figures out which part of the history to place in the bundle. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'bundle.c')
-rw-r--r--bundle.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/bundle.c b/bundle.c
index c846092e9c..9c87532ff7 100644
--- a/bundle.c
+++ b/bundle.c
@@ -235,6 +235,41 @@ out:
return result;
}
+static int write_pack_data(int bundle_fd, struct lock_file *lock, struct rev_info *revs)
+{
+ struct child_process pack_objects = CHILD_PROCESS_INIT;
+ int i;
+
+ argv_array_pushl(&pack_objects.args,
+ "pack-objects", "--all-progress-implied",
+ "--stdout", "--thin", "--delta-base-offset",
+ NULL);
+ pack_objects.in = -1;
+ pack_objects.out = bundle_fd;
+ pack_objects.git_cmd = 1;
+ 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)
+ write_or_die(pack_objects.in, "^", 1);
+ write_or_die(pack_objects.in, sha1_to_hex(object->sha1), 40);
+ write_or_die(pack_objects.in, "\n", 1);
+ }
+ close(pack_objects.in);
+ if (finish_command(&pack_objects))
+ return error(_("pack-objects died"));
+ return 0;
+}
+
int create_bundle(struct bundle_header *header, const char *path,
int argc, const char **argv)
{
@@ -381,34 +416,9 @@ int create_bundle(struct bundle_header *header, const char *path,
write_or_die(bundle_fd, "\n", 1);
/* write pack */
- child_process_init(&rls);
- argv_array_pushl(&rls.args,
- "pack-objects", "--all-progress-implied",
- "--stdout", "--thin", "--delta-base-offset",
- NULL);
- rls.in = -1;
- rls.out = bundle_fd;
- rls.git_cmd = 1;
- if (start_command(&rls))
- 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;
+ if (write_pack_data(bundle_fd, &lock, &revs))
+ return -1;
- for (i = 0; i < revs.pending.nr; i++) {
- struct object *object = revs.pending.objects[i].item;
- if (object->flags & UNINTERESTING)
- write_or_die(rls.in, "^", 1);
- write_or_die(rls.in, sha1_to_hex(object->sha1), 40);
- write_or_die(rls.in, "\n", 1);
- }
- close(rls.in);
- if (finish_command(&rls))
- return error(_("pack-objects died"));
if (!bundle_to_stdout) {
if (commit_lock_file(&lock))
die_errno(_("cannot create '%s'"), path);