summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2014-04-08 12:00:32 -0700
committerJunio C Hamano <gitster@pobox.com>2014-04-08 12:00:33 -0700
commit967f8c918465312cc6cc1bcbcfacafcf95152bd8 (patch)
tree72882dba893944951e58755e1f7d6a753d555b98
parentd59c12d7ad39f942fc60578ba1e934822f40445b (diff)
parent69e4b3426a608b4965c1cb0c6eab5252d880178b (diff)
downloadgit-967f8c918465312cc6cc1bcbcfacafcf95152bd8.tar.gz
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.c13
-rw-r--r--list-objects.c5
-rw-r--r--pack-bitmap.c2
-rw-r--r--revision.c8
-rw-r--r--revision.h3
-rwxr-xr-xt/t5310-pack-bitmaps.sh31
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
'