]> git.ipfire.org Git - thirdparty/git.git/commitdiff
packfile: drop has_pack_index()
authorJeff King <peff@peff.net>
Fri, 25 Oct 2024 07:00:09 +0000 (03:00 -0400)
committerTaylor Blau <me@ttaylorr.com>
Fri, 25 Oct 2024 21:35:46 +0000 (17:35 -0400)
The has_pack_index() function has several oddities that may make it
surprising if you are trying to find out if we have a pack with some
$hash:

  - it is not looking for a valid pack that we found while searching
    object directories. It just looks for any pack-$hash.idx file in the
    pack directory.

  - it only looks in the local directory, not any alternates

  - it takes a bare "unsigned char" hash, which we try to avoid these
    days

The only caller it has is in the dumb http code; it wants to know if we
already have the pack idx in question. This can happen if we downloaded
the pack (and generated its index) during a previous fetch.

Before the previous patch ("dumb-http: store downloaded pack idx as
tempfile"), it could also happen if we downloaded the .idx from the
remote but didn't get the matching .pack. But since that patch, we don't
hold on to those .idx files. So there's no need to look for the .idx
file in the filesystem; we can just scan through the packed_git list to
see if we have it.

That lets us simplify the dumb http code a bit, as we know that if we
have the .idx we have the matching .pack already. And it lets us get rid
of this odd function that is unlikely to be needed again.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
http.c
packfile.c
packfile.h

diff --git a/http.c b/http.c
index 9642cad2e331f7351bde9cffa02fba74c59e8ab2..03802b90495cf91b8da5abb79603987e205d41b3 100644 (file)
--- a/http.c
+++ b/http.c
@@ -2420,15 +2420,17 @@ static char *fetch_pack_index(unsigned char *hash, const char *base_url)
 static int fetch_and_setup_pack_index(struct packed_git **packs_head,
        unsigned char *sha1, const char *base_url)
 {
-       struct packed_git *new_pack;
+       struct packed_git *new_pack, *p;
        char *tmp_idx = NULL;
        int ret;
 
-       if (has_pack_index(sha1)) {
-               new_pack = parse_pack_index(sha1, sha1_pack_index_name(sha1));
-               if (!new_pack)
-                       return -1; /* parse_pack_index() already issued error message */
-               goto add_pack;
+       /*
+        * If we already have the pack locally, no need to fetch its index or
+        * even add it to list; we already have all of its objects.
+        */
+       for (p = get_all_packs(the_repository); p; p = p->next) {
+               if (hasheq(p->hash, sha1, the_repository->hash_algo))
+                       return 0;
        }
 
        tmp_idx = fetch_pack_index(sha1, base_url);
@@ -2450,7 +2452,6 @@ static int fetch_and_setup_pack_index(struct packed_git **packs_head,
        if (ret)
                return -1;
 
-add_pack:
        new_pack->next = *packs_head;
        *packs_head = new_pack;
        return 0;
index 16d3bcf7f70340653082ca2ed350789f8b81e35e..0ead2290d403f34e56c2cec486a54f85fadb3af1 100644 (file)
@@ -2160,14 +2160,6 @@ int has_object_kept_pack(const struct object_id *oid, unsigned flags)
        return find_kept_pack_entry(the_repository, oid, flags, &e);
 }
 
-int has_pack_index(const unsigned char *sha1)
-{
-       struct stat st;
-       if (stat(sha1_pack_index_name(sha1), &st))
-               return 0;
-       return 1;
-}
-
 int for_each_object_in_pack(struct packed_git *p,
                            each_packed_object_fn cb, void *data,
                            enum for_each_object_flags flags)
index 0f7865822916ff0b18a43fd40fbe2c1e9ecdfa87..b4df3546a3e20f8fb052d430db3ee151c9d4abba 100644 (file)
@@ -193,8 +193,6 @@ int find_kept_pack_entry(struct repository *r, const struct object_id *oid, unsi
 int has_object_pack(const struct object_id *oid);
 int has_object_kept_pack(const struct object_id *oid, unsigned flags);
 
-int has_pack_index(const unsigned char *sha1);
-
 /*
  * Return 1 if an object in a promisor packfile is or refers to the given
  * object, 0 otherwise.