On Wed, Oct 29, 2014 at 12:16:05PM -0700, Junio C Hamano wrote:

> 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

I was not planning to work on this, but since you did the first and
third bullet points, I think it makes sense to start the second one with
this cleanup:

-- >8 --
Subject: bundle: split out ref writing from bundle_create

The bundle_create() function has a number of logical steps:
process the input, write the refs, and write the packfile.
Recent commits split the first and third into separate
sub-functions. It's worth splitting the middle step out,
too, if only because it makes the progression of the steps
more obvious.

Signed-off-by: Jeff King <p...@peff.net>
---
Obviously this should be dropped if somebody is actively working on the
revs.cmdline thing you mentioned, as it would conflict horribly. But I
think it is a nice step for somebody working on it later, because the
revs.cmdline changes should be isolated to write_bundle_refs.

 bundle.c | 97 ++++++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 58 insertions(+), 39 deletions(-)

diff --git a/bundle.c b/bundle.c
index 0ca8737..ca4803b 100644
--- a/bundle.c
+++ b/bundle.c
@@ -310,43 +310,22 @@ static int compute_and_write_prerequistes(int bundle_fd,
        return 0;
 }
 
-int create_bundle(struct bundle_header *header, const char *path,
-                 int argc, const char **argv)
+/*
+ * Write out bundle refs based on the tips already
+ * parsed into revs.pending. As a side effect, may
+ * manipulate revs.pending to include additional
+ * necessary objects (like tags).
+ *
+ * Returns the number of refs written, or negative
+ * on error.
+ */
+static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 {
-       static struct lock_file lock;
-       int bundle_fd = -1;
-       int bundle_to_stdout;
-       int i, ref_count = 0;
-       struct rev_info revs;
-
-       bundle_to_stdout = !strcmp(path, "-");
-       if (bundle_to_stdout)
-               bundle_fd = 1;
-       else
-               bundle_fd = hold_lock_file_for_update(&lock, path,
-                                                     LOCK_DIE_ON_ERROR);
-
-       /* write signature */
-       write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
-
-       /* init revs to list objects for pack-objects later */
-       save_commit_buffer = 0;
-       init_revisions(&revs, NULL);
-
-       /* write prerequisites */
-       if (compute_and_write_prerequistes(bundle_fd, &revs, argc, argv))
-               return -1;
-
-       /* write references */
-       argc = setup_revisions(argc, argv, &revs, NULL);
-
-       if (argc > 1)
-               return error(_("unrecognized argument: %s"), argv[1]);
-
-       object_array_remove_duplicates(&revs.pending);
+       int i;
+       int ref_count = 0;
 
-       for (i = 0; i < revs.pending.nr; i++) {
-               struct object_array_entry *e = revs.pending.objects + i;
+       for (i = 0; i < revs->pending.nr; i++) {
+               struct object_array_entry *e = revs->pending.objects + i;
                unsigned char sha1[20];
                char *ref;
                const char *display_ref;
@@ -361,7 +340,7 @@ int create_bundle(struct bundle_header *header, const char 
*path,
                display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
 
                if (e->item->type == OBJ_TAG &&
-                               !is_tag_in_date_range(e->item, &revs)) {
+                               !is_tag_in_date_range(e->item, revs)) {
                        e->item->flags |= UNINTERESTING;
                        continue;
                }
@@ -407,7 +386,7 @@ int create_bundle(struct bundle_header *header, const char 
*path,
                                 */
                                obj = parse_object_or_die(sha1, e->name);
                                obj->flags |= SHOWN;
-                               add_pending_object(&revs, obj, e->name);
+                               add_pending_object(revs, obj, e->name);
                        }
                        free(ref);
                        continue;
@@ -420,11 +399,51 @@ int create_bundle(struct bundle_header *header, const 
char *path,
                write_or_die(bundle_fd, "\n", 1);
                free(ref);
        }
-       if (!ref_count)
-               die(_("Refusing to create empty bundle."));
 
        /* end header */
        write_or_die(bundle_fd, "\n", 1);
+       return ref_count;
+}
+
+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;
+       int ref_count = 0;
+       struct rev_info revs;
+
+       bundle_to_stdout = !strcmp(path, "-");
+       if (bundle_to_stdout)
+               bundle_fd = 1;
+       else
+               bundle_fd = hold_lock_file_for_update(&lock, path,
+                                                     LOCK_DIE_ON_ERROR);
+
+       /* write signature */
+       write_or_die(bundle_fd, bundle_signature, strlen(bundle_signature));
+
+       /* init revs to list objects for pack-objects later */
+       save_commit_buffer = 0;
+       init_revisions(&revs, NULL);
+
+       /* write prerequisites */
+       if (compute_and_write_prerequistes(bundle_fd, &revs, argc, argv))
+               return -1;
+
+       argc = setup_revisions(argc, argv, &revs, NULL);
+
+       if (argc > 1)
+               return error(_("unrecognized argument: %s"), argv[1]);
+
+       object_array_remove_duplicates(&revs.pending);
+
+       ref_count = write_bundle_refs(bundle_fd, &revs);
+       if (!ref_count)
+               die(_("Refusing to create empty bundle."));
+       else if (ref_count < 0)
+               return -1;
 
        /* write pack */
        if (write_pack_data(bundle_fd, &lock, &revs))
-- 
2.1.2.596.g7379948

--
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