зеркало из https://github.com/microsoft/git.git
git-bundle: avoid packing objects which are in the prerequisites
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>
This commit is contained in:
Родитель
8315588b59
Коммит
18449ab0e9
|
@ -305,6 +305,10 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
||||||
/* write signature */
|
/* write signature */
|
||||||
write_or_die(bundle_fd, bundle_signature, strlen(bundle_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 */
|
/* write prerequisites */
|
||||||
memcpy(argv_boundary + 3, argv + 1, argc * sizeof(const char *));
|
memcpy(argv_boundary + 3, argv + 1, argc * sizeof(const char *));
|
||||||
argv_boundary[0] = "rev-list";
|
argv_boundary[0] = "rev-list";
|
||||||
|
@ -316,8 +320,15 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
||||||
if (pid < 0)
|
if (pid < 0)
|
||||||
return -1;
|
return -1;
|
||||||
while ((i = read_string(out, buffer, sizeof(buffer))) > 0)
|
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);
|
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)
|
while ((i = waitpid(pid, &status, 0)) < 0)
|
||||||
if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
return error("rev-list died");
|
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));
|
return error("rev-list died %d", WEXITSTATUS(status));
|
||||||
|
|
||||||
/* write references */
|
/* write references */
|
||||||
save_commit_buffer = 0;
|
|
||||||
init_revisions(&revs, NULL);
|
|
||||||
revs.tag_objects = 1;
|
revs.tag_objects = 1;
|
||||||
revs.tree_objects = 1;
|
revs.tree_objects = 1;
|
||||||
revs.blob_objects = 1;
|
revs.blob_objects = 1;
|
||||||
|
|
|
@ -128,4 +128,15 @@ test_expect_success 'unbundle 2' '
|
||||||
test "tip" = "$(git log -1 --pretty=oneline master | cut -b42-)"
|
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
|
test_done
|
||||||
|
|
Загрузка…
Ссылка в новой задаче