summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2022-01-22 09:03:34 -0500
committerEdward Thomson <ethomson@edwardthomson.com>2022-01-22 17:36:31 -0500
commit0ec5855f8e3867b0bb0620f709382437933e71c4 (patch)
tree2f546e3b89169bdad1e5bc4131ac203f67c6f196
parentef6acbaf5bb7eedf7d61436f5cc438bd6ccf1547 (diff)
downloadlibgit2-ethomson/oidmadness.tar.gz
midx: use raw oidsethomson/oidmadness
The multi-pack index uses raw object IDs, use a raw type for them.
-rw-r--r--src/midx.c25
-rw-r--r--src/midx.h3
2 files changed, 16 insertions, 12 deletions
diff --git a/src/midx.c b/src/midx.c
index eb99e7373..83b8d4246 100644
--- a/src/midx.c
+++ b/src/midx.c
@@ -115,7 +115,7 @@ static int midx_parse_oid_lookup(
struct git_midx_chunk *chunk_oid_lookup)
{
uint32_t i;
- git_oid *oid, *prev_oid, zero_oid = {{0}};
+ git_oid_raw *oid, *prev_oid, zero_oid = {{0}};
if (chunk_oid_lookup->offset == 0)
return midx_error("missing OID Lookup chunk");
@@ -124,10 +124,10 @@ static int midx_parse_oid_lookup(
if (chunk_oid_lookup->length != idx->num_objects * GIT_OID_RAWSZ)
return midx_error("OID Lookup chunk has wrong length");
- idx->oid_lookup = oid = (git_oid *)(data + chunk_oid_lookup->offset);
+ idx->oid_lookup = oid = (git_oid_raw *)(data + chunk_oid_lookup->offset);
prev_oid = &zero_oid;
for (i = 0; i < idx->num_objects; ++i, ++oid) {
- if (git_oid_cmp(prev_oid, oid) >= 0)
+ if (git_oid_raw_cmp(prev_oid->id, oid->id) >= 0)
return midx_error("OID Lookup index is non-monotonic");
prev_oid = oid;
}
@@ -384,7 +384,7 @@ int git_midx_entry_find(
int pos, found = 0;
size_t pack_index;
uint32_t hi, lo;
- const git_oid *current = NULL;
+ const git_oid_raw *current = NULL;
const unsigned char *object_offset;
off64_t offset;
@@ -406,18 +406,17 @@ int git_midx_entry_find(
if (pos < (int)idx->num_objects) {
current = idx->oid_lookup + pos;
- if (!git_oid_ncmp(short_oid, current, len))
+ if (!git_oid_raw_ncmp(short_oid->id, current->id, len))
found = 1;
}
}
if (found && len != GIT_OID_HEXSZ && pos + 1 < (int)idx->num_objects) {
/* Check for ambiguousity */
- const git_oid *next = current + 1;
+ const git_oid_raw *next = current + 1;
- if (!git_oid_ncmp(short_oid, next, len)) {
+ if (!git_oid_raw_ncmp(short_oid->id, next->id, len))
found = 2;
- }
}
if (!found)
@@ -445,7 +444,7 @@ int git_midx_entry_find(
return midx_error("invalid index into the packfile names table");
e->pack_index = pack_index;
e->offset = offset;
- git_oid_cpy(&e->sha1, current);
+ git_oid_fromraw(&e->sha1, current->id);
return 0;
}
@@ -454,13 +453,17 @@ int git_midx_foreach_entry(
git_odb_foreach_cb cb,
void *data)
{
+ git_oid oid;
size_t i;
int error;
GIT_ASSERT_ARG(idx);
for (i = 0; i < idx->num_objects; ++i) {
- if ((error = cb(&idx->oid_lookup[i], data)) != 0)
+ if ((error = git_oid_fromraw(&oid, idx->oid_lookup[i].id)) < 0)
+ return error;
+
+ if ((error = cb(&oid, data)) != 0)
return git_error_set_after_callback(error);
}
@@ -746,7 +749,7 @@ static int midx_write(
/* Fill the OID Lookup table. */
git_vector_foreach (&object_entries, i, entry) {
- error = git_str_put(&oid_lookup, (const char *)&entry->sha1, sizeof(entry->sha1));
+ error = git_str_put(&oid_lookup, (char *)&entry->sha1.id, GIT_OID_RAWSZ);
if (error < 0)
goto cleanup;
}
diff --git a/src/midx.h b/src/midx.h
index 7dd851bd3..591e0e1bb 100644
--- a/src/midx.h
+++ b/src/midx.h
@@ -17,6 +17,7 @@
#include "map.h"
#include "mwindow.h"
#include "odb.h"
+#include "oid.h"
/*
* A multi-pack-index file.
@@ -40,7 +41,7 @@ typedef struct git_midx_file {
uint32_t num_objects;
/* The OID Lookup table. */
- git_oid *oid_lookup;
+ git_oid_raw *oid_lookup;
/* The Object Offsets table. Each entry has two 4-byte fields with the pack index and the offset. */
const unsigned char *object_offsets;