summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2023-04-05 12:23:05 +0100
committerEdward Thomson <ethomson@edwardthomson.com>2023-04-10 11:02:12 +0100
commite61fac75520eacc4ea45b293d50af339662d8312 (patch)
treef5f6cb084ca04692259ad182cd29892adf5620b7
parenta850a4211a498f37688ad32b487a942c88eb31a8 (diff)
downloadlibgit2-e61fac75520eacc4ea45b293d50af339662d8312.tar.gz
packbuilder: write sha256 trailers when expected
-rw-r--r--src/libgit2/pack-objects.c18
-rw-r--r--src/libgit2/pack-objects.h2
2 files changed, 15 insertions, 5 deletions
diff --git a/src/libgit2/pack-objects.c b/src/libgit2/pack-objects.c
index 20a5dfcbd..d6fd60326 100644
--- a/src/libgit2/pack-objects.c
+++ b/src/libgit2/pack-objects.c
@@ -127,6 +127,7 @@ out:
int git_packbuilder_new(git_packbuilder **out, git_repository *repo)
{
+ git_hash_algorithm_t hash_algorithm;
git_packbuilder *pb;
*out = NULL;
@@ -134,6 +135,11 @@ int git_packbuilder_new(git_packbuilder **out, git_repository *repo)
pb = git__calloc(1, sizeof(*pb));
GIT_ERROR_CHECK_ALLOC(pb);
+ pb->oid_type = repo->oid_type;
+
+ hash_algorithm = git_oid_algorithm(pb->oid_type);
+ GIT_ASSERT(hash_algorithm);
+
if (git_oidmap_new(&pb->object_ix) < 0 ||
git_oidmap_new(&pb->walk_objects) < 0 ||
git_pool_init(&pb->object_pool, sizeof(struct walk_object)) < 0)
@@ -142,7 +148,7 @@ int git_packbuilder_new(git_packbuilder **out, git_repository *repo)
pb->repo = repo;
pb->nr_threads = 1; /* do not spawn any thread by default */
- if (git_hash_ctx_init(&pb->ctx, GIT_HASH_ALGORITHM_SHA1) < 0 ||
+ if (git_hash_ctx_init(&pb->ctx, hash_algorithm) < 0 ||
git_zstream_init(&pb->zstream, GIT_ZSTREAM_DEFLATE) < 0 ||
git_repository_odb(&pb->odb, repo) < 0 ||
packbuilder_config(pb) < 0)
@@ -315,9 +321,11 @@ static int write_object(
git_object_t type;
unsigned char hdr[10], *zbuf = NULL;
void *data = NULL;
- size_t hdr_len, zbuf_len = COMPRESS_BUFLEN, data_len;
+ size_t hdr_len, zbuf_len = COMPRESS_BUFLEN, data_len, oid_size;
int error;
+ oid_size = git_oid_size(pb->oid_type);
+
/*
* If we have a delta base, let's use the delta to save space.
* Otherwise load the whole object. 'data' ends up pointing to
@@ -347,8 +355,8 @@ static int write_object(
goto done;
if (type == GIT_OBJECT_REF_DELTA) {
- if ((error = write_cb(po->delta->id.id, GIT_OID_SHA1_SIZE, cb_data)) < 0 ||
- (error = git_hash_update(&pb->ctx, po->delta->id.id, GIT_OID_SHA1_SIZE)) < 0)
+ if ((error = write_cb(po->delta->id.id, oid_size, cb_data)) < 0 ||
+ (error = git_hash_update(&pb->ctx, po->delta->id.id, oid_size)) < 0)
goto done;
}
@@ -668,7 +676,7 @@ static int write_pack(git_packbuilder *pb,
if ((error = git_hash_final(entry_oid.id, &pb->ctx)) < 0)
goto done;
- error = write_cb(entry_oid.id, GIT_OID_SHA1_SIZE, cb_data);
+ error = write_cb(entry_oid.id, git_oid_size(pb->oid_type), cb_data);
done:
/* if callback cancelled writing, we must still free delta_data */
diff --git a/src/libgit2/pack-objects.h b/src/libgit2/pack-objects.h
index 2faa3ec7f..c6bc52fdc 100644
--- a/src/libgit2/pack-objects.h
+++ b/src/libgit2/pack-objects.h
@@ -56,6 +56,8 @@ struct git_packbuilder {
git_repository *repo; /* associated repository */
git_odb *odb; /* associated object database */
+ git_oid_t oid_type;
+
git_hash_ctx ctx;
git_zstream zstream;