git-bundle: avoid packing objects which are in the prerequisites
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Wed, 7 Mar 2007 23:43:05 +0000 (00:43 +0100)
committerJunio C Hamano <junkio@cox.net>
Thu, 8 Mar 2007 01:38:48 +0000 (17:38 -0800)
When saying something like "--since=1.day.ago" or "--max-count=5",
git-bundle finds the boundary commits which are recorded as
prerequisites. However, it failed to tell pack-objects _not_ to
pack the objects which are in these.

Fix that. And add a test for that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-bundle.c
t/t5510-fetch.sh

index 3b3bc2582d9ebed74e16bd2144b371b7884191c6..70d44791939ec4a2027f8dc2ec715cff48e43e16 100644 (file)
@@ -305,6 +305,10 @@ static int create_bundle(struct bundle_header *header, const char *path,
        /* 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 */
        memcpy(argv_boundary + 3, argv + 1, argc * sizeof(const char *));
        argv_boundary[0] = "rev-list";
@@ -316,8 +320,15 @@ static int create_bundle(struct bundle_header *header, const char *path,
        if (pid < 0)
                return -1;
        while ((i = read_string(out, buffer, sizeof(buffer))) > 0)
-               if (buffer[0] == '-')
+               if (buffer[0] == '-') {
+                       unsigned char sha1[20];
                        write_or_die(bundle_fd, buffer, i);
+                       if (!get_sha1_hex(buffer + 1, sha1)) {
+                               struct object *object = parse_object(sha1);
+                               object->flags |= UNINTERESTING;
+                               add_pending_object(&revs, object, buffer);
+                       }
+               }
        while ((i = waitpid(pid, &status, 0)) < 0)
                if (errno != EINTR)
                        return error("rev-list died");
@@ -325,8 +336,6 @@ static int create_bundle(struct bundle_header *header, const char *path,
                return error("rev-list died %d", WEXITSTATUS(status));
 
        /* write references */
-       save_commit_buffer = 0;
-       init_revisions(&revs, NULL);
        revs.tag_objects = 1;
        revs.tree_objects = 1;
        revs.blob_objects = 1;
index ad589dd0dfb857ea2596e57215cf4c6e0f608afc..ee3f397a9bf8d4a08c2f897f0ae094b8ea686344 100755 (executable)
@@ -128,4 +128,15 @@ test_expect_success 'unbundle 2' '
        test "tip" = "$(git log -1 --pretty=oneline master | cut -b42-)"
 '
 
+test_expect_success 'bundle does not prerequisite objects' '
+       cd "$D" &&
+       touch file2 &&
+       git add file2 &&
+       git commit -m add.file2 file2 &&
+       git bundle create bundle3 -1 HEAD &&
+       sed "1,4d" < bundle3 > bundle.pack &&
+       git index-pack bundle.pack &&
+       test 4 = $(git verify-pack -v bundle.pack | wc -l)
+'
+
 test_done