diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-04-08 23:00:32 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-04-08 23:00:33 +0400 |
commit | 967f8c918465312cc6cc1bcbcfacafcf95152bd8 (patch) | |
tree | 72882dba893944951e58755e1f7d6a753d555b98 | |
parent | d59c12d7ad39f942fc60578ba1e934822f40445b (diff) | |
parent | 69e4b3426a608b4965c1cb0c6eab5252d880178b (diff) |
Merge branch 'jk/pack-bitmap'
* jk/pack-bitmap:
pack-objects: do not reuse packfiles without --delta-base-offset
add `ignore_missing_links` mode to revwalk
-rw-r--r-- | builtin/pack-objects.c | 13 | ||||
-rw-r--r-- | list-objects.c | 5 | ||||
-rw-r--r-- | pack-bitmap.c | 2 | ||||
-rw-r--r-- | revision.c | 8 | ||||
-rw-r--r-- | revision.h | 3 | ||||
-rwxr-xr-x | t/t5310-pack-bitmaps.sh | 31 |
6 files changed, 56 insertions, 6 deletions
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index c1f4310871..de36c60ca1 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2439,12 +2439,23 @@ static void loosen_unused_packed_objects(struct rev_info *revs) } } +/* + * This tracks any options which a reader of the pack might + * not understand, and which would therefore prevent blind reuse + * of what we have on disk. + */ +static int pack_options_allow_reuse(void) +{ + return allow_ofs_delta; +} + static int get_object_list_from_bitmap(struct rev_info *revs) { if (prepare_bitmap_walk(revs) < 0) return -1; - if (!reuse_partial_packfile_from_bitmap( + if (pack_options_allow_reuse() && + !reuse_partial_packfile_from_bitmap( &reuse_packfile, &reuse_packfile_objects, &reuse_packfile_offset)) { diff --git a/list-objects.c b/list-objects.c index 206816fa9c..3595ee7a22 100644 --- a/list-objects.c +++ b/list-objects.c @@ -81,8 +81,11 @@ static void process_tree(struct rev_info *revs, die("bad tree object"); if (obj->flags & (UNINTERESTING | SEEN)) return; - if (parse_tree(tree) < 0) + if (parse_tree(tree) < 0) { + if (revs->ignore_missing_links) + return; die("bad tree object %s", sha1_to_hex(obj->sha1)); + } obj->flags |= SEEN; show(obj, path, name, cb_data); me.up = path; diff --git a/pack-bitmap.c b/pack-bitmap.c index ae0b57b950..91e4101531 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -727,8 +727,10 @@ int prepare_bitmap_walk(struct rev_info *revs) revs->pending.objects = NULL; if (haves) { + revs->ignore_missing_links = 1; haves_bitmap = find_objects(revs, haves, NULL); reset_revision_walk(); + revs->ignore_missing_links = 0; if (haves_bitmap == NULL) die("BUG: failed to perform bitmap walk"); diff --git a/revision.c b/revision.c index 794a8835c0..71e2337423 100644 --- a/revision.c +++ b/revision.c @@ -2960,9 +2960,11 @@ static struct commit *get_revision_1(struct rev_info *revs) if (revs->max_age != -1 && (commit->date < revs->max_age)) continue; - if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) - die("Failed to traverse parents of commit %s", - sha1_to_hex(commit->object.sha1)); + if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) { + if (!revs->ignore_missing_links) + die("Failed to traverse parents of commit %s", + sha1_to_hex(commit->object.sha1)); + } } switch (simplify_commit(revs, commit)) { diff --git a/revision.h b/revision.h index d9907dd460..a6205307cf 100644 --- a/revision.h +++ b/revision.h @@ -75,7 +75,8 @@ struct rev_info { enum rev_sort_order sort_order; unsigned int early_output:1, - ignore_missing:1; + ignore_missing:1, + ignore_missing_links:1; /* Traversal flags */ unsigned int dense:1, diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh index f13525caa3..f4f02ba918 100755 --- a/t/t5310-pack-bitmaps.sh +++ b/t/t5310-pack-bitmaps.sh @@ -3,6 +3,10 @@ test_description='exercise basic bitmap functionality' . ./test-lib.sh +objpath () { + echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')" +} + test_expect_success 'setup repo with moderate-sized history' ' for i in $(test_seq 1 10); do test_commit $i @@ -115,6 +119,33 @@ test_expect_success 'fetch (full bitmap)' ' test_cmp expect actual ' +test_expect_success 'create objects for missing-HAVE tests' ' + blob=$(echo "missing have" | git hash-object -w --stdin) && + tree=$(printf "100644 blob $blob\tfile\n" | git mktree) && + parent=$(echo parent | git commit-tree $tree) && + commit=$(echo commit | git commit-tree $tree -p $parent) && + cat >revs <<-EOF + HEAD + ^HEAD^ + ^$commit + EOF +' + +test_expect_success 'pack with missing blob' ' + rm $(objpath $blob) && + git pack-objects --stdout --revs <revs >/dev/null +' + +test_expect_success 'pack with missing tree' ' + rm $(objpath $tree) && + git pack-objects --stdout --revs <revs >/dev/null +' + +test_expect_success 'pack with missing parent' ' + rm $(objpath $parent) && + git pack-objects --stdout --revs <revs >/dev/null +' + test_lazy_prereq JGIT ' type jgit ' |