Signed-off-by: Derrick Stolee <dsto...@microsoft.com>
---
 midx.c     |  2 +-
 midx.h     |  1 +
 packfile.c | 15 +++++++++++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/midx.c b/midx.c
index 3242646fe0..e46f392fa4 100644
--- a/midx.c
+++ b/midx.c
@@ -214,7 +214,7 @@ struct object_id *nth_midxed_object_oid(struct object_id 
*oid,
        return oid;
 }
 
-static off_t nth_midxed_offset(struct midxed_git *m, uint32_t pos)
+off_t nth_midxed_offset(struct midxed_git *m, uint32_t pos)
 {
        const unsigned char *offset_data;
        uint32_t offset32;
diff --git a/midx.h b/midx.h
index c1db58d8c4..6996b5ff6b 100644
--- a/midx.h
+++ b/midx.h
@@ -9,6 +9,7 @@
 
 struct midxed_git *load_midxed_git(const char *object_dir);
 int bsearch_midx(const struct object_id *oid, struct midxed_git *m, uint32_t 
*result);
+off_t nth_midxed_offset(struct midxed_git *m, uint32_t n);
 struct object_id *nth_midxed_object_oid(struct object_id *oid,
                                        struct midxed_git *m,
                                        uint32_t n);
diff --git a/packfile.c b/packfile.c
index 479cb69b9f..9b814c89c7 100644
--- a/packfile.c
+++ b/packfile.c
@@ -1794,6 +1794,21 @@ off_t find_pack_entry_one(const unsigned char *sha1,
        uint32_t result;
 
        if (!index) {
+               /*
+                * If we have a MIDX, then we want to
+                * check the MIDX for the offset instead.
+                */
+               struct midxed_git *m;
+
+               for (m = get_midxed_git(the_repository); m; m = m->next) {
+                       if (midx_contains_pack(m, p->pack_name)) {
+                               if (bsearch_midx(&oid, m, &result))
+                                       return nth_midxed_offset(m, result);
+
+                               break;
+                       }
+               }
+
                if (open_pack_index(p))
                        return 0;
        }
-- 
2.18.0.rc1

Reply via email to