]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-write.c: extract 'write_rev_file_order'
authorTaylor Blau <me@ttaylorr.com>
Tue, 30 Mar 2021 15:04:29 +0000 (11:04 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 1 Apr 2021 20:07:37 +0000 (13:07 -0700)
Existing callers provide the reverse index code with an array of 'struct
pack_idx_entry *'s, which is then sorted by pack order (comparing the
offsets of each object within the pack).

Prepare for the multi-pack index to write a .rev file by providing a way
to write the reverse index without an array of pack_idx_entry (which the
MIDX code does not have).

Instead, callers can invoke 'write_rev_index_positions()', which takes
an array of uint32_t's. The ith entry in this array specifies the ith
object's (in index order) position within the pack (in pack order).

Expose this new function for use in a later patch, and rewrite the
existing write_rev_file() in terms of this new function.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pack-write.c
pack.h

index 680c36755dd2f112fefb20c9b86f59f36e4c59c5..279770fd6123212d061426888f2da607697dfac5 100644 (file)
@@ -201,21 +201,12 @@ static void write_rev_header(struct hashfile *f)
 }
 
 static void write_rev_index_positions(struct hashfile *f,
-                                     struct pack_idx_entry **objects,
+                                     uint32_t *pack_order,
                                      uint32_t nr_objects)
 {
-       uint32_t *pack_order;
        uint32_t i;
-
-       ALLOC_ARRAY(pack_order, nr_objects);
-       for (i = 0; i < nr_objects; i++)
-               pack_order[i] = i;
-       QSORT_S(pack_order, nr_objects, pack_order_cmp, objects);
-
        for (i = 0; i < nr_objects; i++)
                hashwrite_be32(f, pack_order[i]);
-
-       free(pack_order);
 }
 
 static void write_rev_trailer(struct hashfile *f, const unsigned char *hash)
@@ -228,6 +219,29 @@ const char *write_rev_file(const char *rev_name,
                           uint32_t nr_objects,
                           const unsigned char *hash,
                           unsigned flags)
+{
+       uint32_t *pack_order;
+       uint32_t i;
+       const char *ret;
+
+       ALLOC_ARRAY(pack_order, nr_objects);
+       for (i = 0; i < nr_objects; i++)
+               pack_order[i] = i;
+       QSORT_S(pack_order, nr_objects, pack_order_cmp, objects);
+
+       ret = write_rev_file_order(rev_name, pack_order, nr_objects, hash,
+                                  flags);
+
+       free(pack_order);
+
+       return ret;
+}
+
+const char *write_rev_file_order(const char *rev_name,
+                                uint32_t *pack_order,
+                                uint32_t nr_objects,
+                                const unsigned char *hash,
+                                unsigned flags)
 {
        struct hashfile *f;
        int fd;
@@ -262,7 +276,7 @@ const char *write_rev_file(const char *rev_name,
 
        write_rev_header(f);
 
-       write_rev_index_positions(f, objects, nr_objects);
+       write_rev_index_positions(f, pack_order, nr_objects);
        write_rev_trailer(f, hash);
 
        if (rev_name && adjust_shared_perm(rev_name) < 0)
diff --git a/pack.h b/pack.h
index afdcf8f5c74df66eb3ea2dc10bf825d1b53ec17b..09c2a7dd3a7cb10b0b62ae0ab7ceb10014d0943b 100644 (file)
--- a/pack.h
+++ b/pack.h
@@ -94,6 +94,7 @@ struct ref;
 void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought);
 
 const char *write_rev_file(const char *rev_name, struct pack_idx_entry **objects, uint32_t nr_objects, const unsigned char *hash, unsigned flags);
+const char *write_rev_file_order(const char *rev_name, uint32_t *pack_order, uint32_t nr_objects, const unsigned char *hash, unsigned flags);
 
 /*
  * The "hdr" output buffer should be at least this big, which will handle sizes