Junio C Hamano <gits...@pobox.com> 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 <gits...@pobox.com>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to