object: remove OFS_DELTA and REF_DELTA values
authorEdward Thomson <[email protected]>
Fri, 3 Jan 2025 09:43:32 +0000 (3 09:43 +0000)
committerEdward Thomson <[email protected]>
Fri, 3 Jan 2025 13:28:19 +0000 (3 13:28 +0000)
Deltas are not objects, they're entries in a packfile. Remove them from
the object enum.

include/git2/types.h
src/libgit2/indexer.c
src/libgit2/pack-objects.c
src/libgit2/pack.c
src/libgit2/pack.h
tests/libgit2/object/raw/hash.c
tests/libgit2/object/raw/type2string.c
tests/libgit2/repo/hashfile.c

index a4afd18..fdccd96 100644 (file)
@@ -76,9 +76,7 @@ typedef enum {
        GIT_OBJECT_COMMIT =    1, /**< A commit object. */
        GIT_OBJECT_TREE =      2, /**< A tree (directory listing) object. */
        GIT_OBJECT_BLOB =      3, /**< A file revision object. */
-       GIT_OBJECT_TAG =       4, /**< An annotated tag object. */
-       GIT_OBJECT_OFS_DELTA = 6, /**< A delta, base is given by an offset. */
-       GIT_OBJECT_REF_DELTA = 7  /**< A delta, base is given by object id. */
+       GIT_OBJECT_TAG =       4  /**< An annotated tag object. */
 } git_object_t;
 
 /**
index f1c85cb..cdd2b24 100644 (file)
@@ -319,9 +319,9 @@ static int advance_delta_offset(git_indexer *idx, git_object_t type)
 {
        git_mwindow *w = NULL;
 
-       GIT_ASSERT_ARG(type == GIT_OBJECT_REF_DELTA || type == GIT_OBJECT_OFS_DELTA);
+       GIT_ASSERT_ARG(type == GIT_PACKFILE_REF_DELTA || type == GIT_PACKFILE_OFS_DELTA);
 
-       if (type == GIT_OBJECT_REF_DELTA) {
+       if (type == GIT_PACKFILE_REF_DELTA) {
                idx->off += git_oid_size(idx->oid_type);
        } else {
                off64_t base_off;
@@ -813,7 +813,7 @@ static int read_stream_object(git_indexer *idx, git_indexer_progress *stats)
                git_hash_init(&idx->hash_ctx);
                git_str_clear(&idx->entry_data);
 
-               if (type == GIT_OBJECT_REF_DELTA || type == GIT_OBJECT_OFS_DELTA) {
+               if (type == GIT_PACKFILE_REF_DELTA || type == GIT_PACKFILE_OFS_DELTA) {
                        error = advance_delta_offset(idx, type);
                        if (error == GIT_EBUFS) {
                                idx->off = entry_start;
@@ -1094,7 +1094,7 @@ static int fix_thin_pack(git_indexer *idx, git_indexer_progress *stats)
                if (error < 0)
                        return error;
 
-               if (type == GIT_OBJECT_REF_DELTA) {
+               if (type == GIT_PACKFILE_REF_DELTA) {
                        found_ref_delta = 1;
                        break;
                }
index ced98e8..efdd68a 100644 (file)
@@ -338,7 +338,7 @@ static int write_object(
                                goto done;
 
                data_len = po->delta_size;
-               type = GIT_OBJECT_REF_DELTA;
+               type = GIT_PACKFILE_REF_DELTA;
        } else {
                if ((error = git_odb_read(&obj, pb->odb, &po->id)) < 0)
                        goto done;
@@ -354,7 +354,7 @@ static int write_object(
            (error = git_hash_update(&pb->ctx, hdr, hdr_len)) < 0)
                goto done;
 
-       if (type == GIT_OBJECT_REF_DELTA) {
+       if (type == GIT_PACKFILE_REF_DELTA) {
                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;
index cf63b20..a70975a 100644 (file)
@@ -390,7 +390,7 @@ int git_packfile__object_header(size_t *out, unsigned char *hdr, size_t size, gi
        unsigned char *hdr_base;
        unsigned char c;
 
-       GIT_ASSERT_ARG(type >= GIT_OBJECT_COMMIT && type <= GIT_OBJECT_REF_DELTA);
+       GIT_ASSERT_ARG(type >= GIT_OBJECT_COMMIT && type <= GIT_PACKFILE_REF_DELTA);
 
        /* TODO: add support for chunked objects; see git.git 6c0d19b1 */
 
@@ -532,7 +532,7 @@ int git_packfile_resolve_header(
        if (error < 0)
                return error;
 
-       if (type == GIT_OBJECT_OFS_DELTA || type == GIT_OBJECT_REF_DELTA) {
+       if (type == GIT_PACKFILE_OFS_DELTA || type == GIT_PACKFILE_REF_DELTA) {
                size_t base_size;
                git_packfile_stream stream;
 
@@ -553,12 +553,12 @@ int git_packfile_resolve_header(
                base_offset = 0;
        }
 
-       while (type == GIT_OBJECT_OFS_DELTA || type == GIT_OBJECT_REF_DELTA) {
+       while (type == GIT_PACKFILE_OFS_DELTA || type == GIT_PACKFILE_REF_DELTA) {
                curpos = base_offset;
                error = git_packfile_unpack_header(&size, &type, p, &w_curs, &curpos);
                if (error < 0)
                        return error;
-               if (type != GIT_OBJECT_OFS_DELTA && type != GIT_OBJECT_REF_DELTA)
+               if (type != GIT_PACKFILE_OFS_DELTA && type != GIT_PACKFILE_REF_DELTA)
                        break;
 
                error = get_delta_base(&base_offset, p, &w_curs, &curpos, type, base_offset);
@@ -635,7 +635,7 @@ static int pack_dependency_chain(git_dependency_chain *chain_out,
                elem->type = type;
                elem->base_key = obj_offset;
 
-               if (type != GIT_OBJECT_OFS_DELTA && type != GIT_OBJECT_REF_DELTA)
+               if (type != GIT_PACKFILE_OFS_DELTA && type != GIT_PACKFILE_REF_DELTA)
                        break;
 
                error = get_delta_base(&base_offset, p, &w_curs, &curpos, type, obj_offset);
@@ -675,7 +675,7 @@ int git_packfile_unpack(
        git_pack_cache_entry *cached = NULL;
        struct pack_chain_elem small_stack[SMALL_STACK_SIZE];
        size_t stack_size = 0, elem_pos, alloclen;
-       git_object_t base_type;
+       int base_type;
 
        error = git_mutex_lock(&p->lock);
        if (error < 0) {
@@ -735,8 +735,8 @@ int git_packfile_unpack(
                if (error < 0)
                        goto cleanup;
                break;
-       case GIT_OBJECT_OFS_DELTA:
-       case GIT_OBJECT_REF_DELTA:
+       case GIT_PACKFILE_OFS_DELTA:
+       case GIT_PACKFILE_REF_DELTA:
                error = packfile_error("dependency chain ends in a delta");
                goto cleanup;
        default:
@@ -983,7 +983,7 @@ int get_delta_base(
         * than the hash size is stupid, as then a REF_DELTA would be
         * smaller to store.
         */
-       if (type == GIT_OBJECT_OFS_DELTA) {
+       if (type == GIT_PACKFILE_OFS_DELTA) {
                unsigned used = 0;
                unsigned char c = base_info[used++];
                size_t unsigned_base_offset = c & 127;
@@ -1000,7 +1000,7 @@ int get_delta_base(
                        return packfile_error("out of bounds");
                base_offset = delta_obj_offset - unsigned_base_offset;
                *curpos += used;
-       } else if (type == GIT_OBJECT_REF_DELTA) {
+       } else if (type == GIT_PACKFILE_REF_DELTA) {
                git_oid base_oid;
                git_oid_from_raw(&base_oid, base_info, p->oid_type);
 
index 4fd0921..e802d60 100644 (file)
@@ -33,6 +33,10 @@ typedef int git_pack_foreach_entry_offset_cb(
 #define PACK_SIGNATURE 0x5041434b      /* "PACK" */
 #define PACK_VERSION 2
 #define pack_version_ok(v) ((v) == htonl(2))
+
+#define GIT_PACKFILE_OFS_DELTA 6
+#define GIT_PACKFILE_REF_DELTA 7
+
 struct git_pack_header {
        uint32_t hdr_signature;
        uint32_t hdr_version;
index 3bfadda..914096f 100644 (file)
@@ -87,16 +87,16 @@ void test_object_raw_hash__hash_junk_data(void)
        junk_obj.data = some_data;
        hash_object_fail(&id, &junk_obj);
 
-       junk_obj.type = 0; /* EXT1 */
+       junk_obj.type = 0; /* unused */
        hash_object_fail(&id, &junk_obj);
 
-       junk_obj.type = 5; /* EXT2 */
+       junk_obj.type = 5; /* unused */
        hash_object_fail(&id, &junk_obj);
 
-       junk_obj.type = GIT_OBJECT_OFS_DELTA;
+       junk_obj.type = 6; /* packfile offset delta */
        hash_object_fail(&id, &junk_obj);
 
-       junk_obj.type = GIT_OBJECT_REF_DELTA;
+       junk_obj.type = 7; /* packfile ref delta */
        hash_object_fail(&id, &junk_obj);
 
        junk_obj.type = 42;
index 6f0b476..e3a0764 100644 (file)
@@ -7,14 +7,14 @@
 void test_object_raw_type2string__convert_type_to_string(void)
 {
        cl_assert_equal_s(git_object_type2string(GIT_OBJECT_INVALID), "");
-       cl_assert_equal_s(git_object_type2string(0), ""); /* EXT1 */
+       cl_assert_equal_s(git_object_type2string(0), ""); /* unused */
        cl_assert_equal_s(git_object_type2string(GIT_OBJECT_COMMIT), "commit");
        cl_assert_equal_s(git_object_type2string(GIT_OBJECT_TREE), "tree");
        cl_assert_equal_s(git_object_type2string(GIT_OBJECT_BLOB), "blob");
        cl_assert_equal_s(git_object_type2string(GIT_OBJECT_TAG), "tag");
-       cl_assert_equal_s(git_object_type2string(5), ""); /* EXT2 */
-       cl_assert_equal_s(git_object_type2string(GIT_OBJECT_OFS_DELTA), "OFS_DELTA");
-       cl_assert_equal_s(git_object_type2string(GIT_OBJECT_REF_DELTA), "REF_DELTA");
+       cl_assert_equal_s(git_object_type2string(5), ""); /* unused */
+       cl_assert_equal_s(git_object_type2string(6), ""); /* packfile offset delta */
+       cl_assert_equal_s(git_object_type2string(7), ""); /* packfile ref delta */
 
        cl_assert_equal_s(git_object_type2string(-2), "");
        cl_assert_equal_s(git_object_type2string(8), "");
@@ -29,8 +29,8 @@ void test_object_raw_type2string__convert_string_to_type(void)
        cl_assert(git_object_string2type("tree") == GIT_OBJECT_TREE);
        cl_assert(git_object_string2type("blob") == GIT_OBJECT_BLOB);
        cl_assert(git_object_string2type("tag") == GIT_OBJECT_TAG);
-       cl_assert(git_object_string2type("OFS_DELTA") == GIT_OBJECT_OFS_DELTA);
-       cl_assert(git_object_string2type("REF_DELTA") == GIT_OBJECT_REF_DELTA);
+       cl_assert(git_object_string2type("OFS_DELTA") == GIT_OBJECT_INVALID);
+       cl_assert(git_object_string2type("REF_DELTA") == GIT_OBJECT_INVALID);
 
        cl_assert(git_object_string2type("CoMmIt") == GIT_OBJECT_INVALID);
        cl_assert(git_object_string2type("hohoho") == GIT_OBJECT_INVALID);
@@ -39,14 +39,14 @@ void test_object_raw_type2string__convert_string_to_type(void)
 void test_object_raw_type2string__check_type_is_valid(void)
 {
        cl_assert(git_object_type_is_valid(GIT_OBJECT_INVALID) == 0);
-       cl_assert(git_object_type_is_valid(0) == 0); /* EXT1 */
+       cl_assert(git_object_type_is_valid(0) == 0); /* unused */
        cl_assert(git_object_type_is_valid(GIT_OBJECT_COMMIT) == 1);
        cl_assert(git_object_type_is_valid(GIT_OBJECT_TREE) == 1);
        cl_assert(git_object_type_is_valid(GIT_OBJECT_BLOB) == 1);
        cl_assert(git_object_type_is_valid(GIT_OBJECT_TAG) == 1);
-       cl_assert(git_object_type_is_valid(5) == 0); /* EXT2 */
-       cl_assert(git_object_type_is_valid(GIT_OBJECT_OFS_DELTA) == 0);
-       cl_assert(git_object_type_is_valid(GIT_OBJECT_REF_DELTA) == 0);
+       cl_assert(git_object_type_is_valid(5) == 0); /* unused */
+       cl_assert(git_object_type_is_valid(6) == 0); /* packfile offset delta */
+       cl_assert(git_object_type_is_valid(7) == 0); /* packfile ref delta */
 
        cl_assert(git_object_type_is_valid(-2) == 0);
        cl_assert(git_object_type_is_valid(8) == 0);
index f053cb9..64b8dfa 100644 (file)
@@ -34,7 +34,7 @@ void test_repo_hashfile__simple(void)
 
        /* hash with invalid type */
        cl_git_fail(git_odb__hashfile(&a, full.ptr, GIT_OBJECT_ANY, GIT_OID_SHA1));
-       cl_git_fail(git_repository_hashfile(&b, _repo, full.ptr, GIT_OBJECT_OFS_DELTA, NULL));
+       cl_git_fail(git_repository_hashfile(&b, _repo, full.ptr, 6, NULL));
 
        git_str_dispose(&full);
 }