Junio C Hamano <gitster@xxxxxxxxx> writes: > Probably three helper functions: > > - The first is to find tops and bottoms (this translates fuzzy > specifications such as "--since 30.days" into a more concrete > revision range "^A ^B ... Z" to establish bundle prerequisites), > which is done by running a "rev-list --boundary". > > - The second is to show refs, while paying attention to things like > "--10 maint master" which may result in the tip of 'maint' not > being shown at all. I am not sure if this part can/should take > advantage of revs.cmdline, though. > > - The last is to create the actual pack data. > > I agree with your analysis on the change in column.c and trailer.c > > Thanks. So here are a few patches on top of René's change. This is the third point in the above list. -- >8 -- Subject: [PATCH] bundle: split out a helper function to create a pack data The create_bundle() function, while it does one single logical thing and tries to do it well, that single logical thing takes a rather large implementation. Let's start separating what it does into smaller steps to make it easier 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@xxxxxxxxx> --- bundle.c | 64 +++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/bundle.c b/bundle.c index c846092..9c87532 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); -- 2.1.3-612-g493e79e -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html