]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: peeling non-the_repository iterators is BUG
authorJonathan Tan <jonathantanmy@google.com>
Fri, 8 Oct 2021 21:08:16 +0000 (14:08 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 8 Oct 2021 22:06:06 +0000 (15:06 -0700)
There is currently no support for peeling the current ref of an iterator
iterating over a non-the_repository ref store, and none is needed. Thus,
for now, BUG() if that happens.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/files-backend.c
refs/packed-backend.c
refs/ref-cache.c
refs/ref-cache.h

index 3f213d24b0a2d0f80504e915af97578ef3de099d..8ee6ac210365c2fe407c423f0caa1a4cb18e7adf 100644 (file)
@@ -833,7 +833,7 @@ static struct ref_iterator *files_ref_iterator_begin(
         */
 
        loose_iter = cache_ref_iterator_begin(get_loose_ref_cache(refs),
-                                             prefix, 1);
+                                             prefix, ref_store->repo, 1);
 
        /*
         * The packed-refs file might contain broken references, for
@@ -1165,7 +1165,8 @@ static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
 
        packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR, &err);
 
-       iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL, 0);
+       iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL,
+                                       the_repository, 0);
        while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
                /*
                 * If the loose reference can be packed, add an entry
index 63f78bbaeadf5b521e3afe9e1d968e96312ae996..216121871962e4eeccabc6030cc22f2fdb65c27f 100644 (file)
@@ -886,6 +886,9 @@ static int packed_ref_iterator_peel(struct ref_iterator *ref_iterator,
        struct packed_ref_iterator *iter =
                (struct packed_ref_iterator *)ref_iterator;
 
+       if (iter->repo != the_repository)
+               BUG("peeling for non-the_repository is not supported");
+
        if ((iter->base.flags & REF_KNOWS_PEELED)) {
                oidcpy(peeled, &iter->peeled);
                return is_null_oid(&iter->peeled) ? -1 : 0;
index 49d732f6db961c8daa1f0ff0f4589059420f636c..97a6ac349ee314178ee690b0b742d6cadbb78141 100644 (file)
@@ -435,6 +435,8 @@ struct cache_ref_iterator {
         * on from there.)
         */
        struct cache_ref_iterator_level *levels;
+
+       struct repository *repo;
 };
 
 static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator)
@@ -491,6 +493,11 @@ static int cache_ref_iterator_advance(struct ref_iterator *ref_iterator)
 static int cache_ref_iterator_peel(struct ref_iterator *ref_iterator,
                                   struct object_id *peeled)
 {
+       struct cache_ref_iterator *iter =
+               (struct cache_ref_iterator *)ref_iterator;
+
+       if (iter->repo != the_repository)
+               BUG("peeling for non-the_repository is not supported");
        return peel_object(ref_iterator->oid, peeled) ? -1 : 0;
 }
 
@@ -513,6 +520,7 @@ static struct ref_iterator_vtable cache_ref_iterator_vtable = {
 
 struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
                                              const char *prefix,
+                                             struct repository *repo,
                                              int prime_dir)
 {
        struct ref_dir *dir;
@@ -547,5 +555,7 @@ struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
                level->prefix_state = PREFIX_CONTAINS_DIR;
        }
 
+       iter->repo = repo;
+
        return ref_iterator;
 }
index 3bfb89d2b343e958ed094a7fd922f2fd6e0c4178..7877bf86edb26ab1218372044e7bf4876542d183 100644 (file)
@@ -238,6 +238,7 @@ struct ref_entry *find_ref_entry(struct ref_dir *dir, const char *refname);
  */
 struct ref_iterator *cache_ref_iterator_begin(struct ref_cache *cache,
                                              const char *prefix,
+                                             struct repository *repo,
                                              int prime_dir);
 
 #endif /* REFS_REF_CACHE_H */