@matheusbsbs / matheus-bagliano / commits / 094085e336
Fork 0

pack-objects: don't loosen objects available in alternate or kept packs

If pack-objects is called with the --unpack-unreachable option then it will unpack (i.e. loosen) all unreferenced objects from local not-kept packs, including those that also exist in packs residing in an alternate object database or a locally kept pack. The only user of this option is git-repack. In this case, repack will follow the call to pack-objects with a call to prune-packed, which will delete these newly loosened objects, making the act of loosening a waste of time. The unnecessary loosening can be avoided by checking whether an object exists in a non-local pack or a locally kept pack before loosening it. This fixes the 'local packed unreachable obs that exist in alternate ODB are not loosened' test in t7700. Signed-off-by: Brandon Casey <drafnel@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Brandon Casey committed Mar 21, 2009 at 17:26 UTC 094085e3362c592c932b41525ed37152ec171192
2 files changed +26 -2
builtin-pack-objects.c
+25 -1
@@ -1944,6 +1944,29 @@ static void add_objects_in_unpacked_packs(struct rev_info *revs)
1944 free(in_pack.array);
1945 }
1946
1947 +static int has_sha1_pack_kept_or_nonlocal(const unsigned char *sha1)
1948 +{
1949 + static struct packed_git *last_found = (void *)1;
1950 + struct packed_git *p;
1951 +
1952 + p = (last_found != (void *)1) ? last_found : packed_git;
1953 +
1954 + while (p) {
1955 + if ((!p->pack_local || p->pack_keep) &&
1956 + find_pack_entry_one(sha1, p)) {
1957 + last_found = p;
1958 + return 1;
1959 + }
1960 + if (p == last_found)
1961 + p = packed_git;
1962 + else
1963 + p = p->next;
1964 + if (p == last_found)
1965 + p = p->next;
1966 + }
1967 + return 0;
1968 +}
1969 +
1970 static void loosen_unused_packed_objects(struct rev_info *revs)
1971 {
1972 struct packed_git *p;
@@ -1959,7 +1982,8 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
1982
1983 for (i = 0; i < p->num_objects; i++) {
1984 sha1 = nth_packed_object_sha1(p, i);
1962 - if (!locate_object_entry(sha1))
1985 + if (!locate_object_entry(sha1) &&
1986 + !has_sha1_pack_kept_or_nonlocal(sha1))
1987 if (force_object_loose(sha1, p->mtime))
1988 die("unable to force loose object");
1989 }
t/t7700-repack.sh
+1 -1
@@ -113,7 +113,7 @@ test_expect_success 'packed unreachable obs in alternate ODB are not loosened' '
113 test_must_fail git show $csha1
114 '
115
116 -test_expect_failure 'local packed unreachable obs that exist in alternate ODB are not loosened' '
116 +test_expect_success 'local packed unreachable obs that exist in alternate ODB are not loosened' '
117 echo `pwd`/alt_objects > .git/objects/info/alternates &&
118 echo "$csha1" | git pack-objects --non-empty --all --reflog pack &&
119 rm -f .git/objects/pack/* &&