]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/pack-objects.c
Merge branch 'ab/detox-gettext-tests'
[thirdparty/git.git] / builtin / pack-objects.c
index 2a00358f3452febd9c647cdb9029e5a04f89833d..6d62aaf59a030de6845dd1d27c9e9fa9421267b9 100644 (file)
@@ -419,7 +419,7 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
 {
        struct packed_git *p = IN_PACK(entry);
        struct pack_window *w_curs = NULL;
-       struct revindex_entry *revidx;
+       uint32_t pos;
        off_t offset;
        enum object_type type = oe_type(entry);
        off_t datalen;
@@ -436,10 +436,15 @@ static off_t write_reuse_object(struct hashfile *f, struct object_entry *entry,
                                              type, entry_size);
 
        offset = entry->in_pack_offset;
-       revidx = find_pack_revindex(p, offset);
-       datalen = revidx[1].offset - offset;
+       if (offset_to_pack_pos(p, offset, &pos) < 0)
+               die(_("write_reuse_object: could not locate %s, expected at "
+                     "offset %"PRIuMAX" in pack %s"),
+                   oid_to_hex(&entry->idx.oid), (uintmax_t)offset,
+                   p->pack_name);
+       datalen = pack_pos_to_offset(p, pos + 1) - offset;
        if (!pack_to_stdout && p->index_version > 1 &&
-           check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) {
+           check_pack_crc(p, &w_curs, offset, datalen,
+                          pack_pos_to_index(p, pos))) {
                error(_("bad packed object CRC for %s"),
                      oid_to_hex(&entry->idx.oid));
                unuse_pack(&w_curs);
@@ -629,7 +634,7 @@ static int mark_tagged(const char *path, const struct object_id *oid, int flag,
 
        if (entry)
                entry->tagged = 1;
-       if (!peel_ref(path, &peeled)) {
+       if (!peel_iterated_oid(oid, &peeled)) {
                entry = packlist_find(&to_pack, &peeled);
                if (entry)
                        entry->tagged = 1;
@@ -863,8 +868,8 @@ static void write_reused_pack_one(size_t pos, struct hashfile *out,
        enum object_type type;
        unsigned long size;
 
-       offset = reuse_packfile->revindex[pos].offset;
-       next = reuse_packfile->revindex[pos + 1].offset;
+       offset = pack_pos_to_offset(reuse_packfile, pos);
+       next = pack_pos_to_offset(reuse_packfile, pos + 1);
 
        record_reused_object(offset, offset - hashfile_total(out));
 
@@ -884,11 +889,17 @@ static void write_reused_pack_one(size_t pos, struct hashfile *out,
 
                /* Convert to REF_DELTA if we must... */
                if (!allow_ofs_delta) {
-                       int base_pos = find_revindex_position(reuse_packfile, base_offset);
+                       uint32_t base_pos;
                        struct object_id base_oid;
 
+                       if (offset_to_pack_pos(reuse_packfile, base_offset, &base_pos) < 0)
+                               die(_("expected object at offset %"PRIuMAX" "
+                                     "in pack %s"),
+                                   (uintmax_t)base_offset,
+                                   reuse_packfile->pack_name);
+
                        nth_packed_object_id(&base_oid, reuse_packfile,
-                                            reuse_packfile->revindex[base_pos].nr);
+                                            pack_pos_to_index(reuse_packfile, base_pos));
 
                        len = encode_in_pack_object_header(header, sizeof(header),
                                                           OBJ_REF_DELTA, size);
@@ -941,7 +952,7 @@ static size_t write_reused_pack_verbatim(struct hashfile *out,
                off_t to_write;
 
                written = (pos * BITS_IN_EWORD);
-               to_write = reuse_packfile->revindex[written].offset
+               to_write = pack_pos_to_offset(reuse_packfile, written)
                        - sizeof(struct pack_header);
 
                /* We're recording one chunk, not one object. */
@@ -1806,11 +1817,11 @@ static void check_object(struct object_entry *entry, uint32_t object_index)
                                goto give_up;
                        }
                        if (reuse_delta && !entry->preferred_base) {
-                               struct revindex_entry *revidx;
-                               revidx = find_pack_revindex(p, ofs);
-                               if (!revidx)
+                               uint32_t pos;
+                               if (offset_to_pack_pos(p, ofs, &pos) < 0)
                                        goto give_up;
-                               if (!nth_packed_object_id(&base_ref, p, revidx->nr))
+                               if (!nth_packed_object_id(&base_ref, p,
+                                                         pack_pos_to_index(p, pos)))
                                        have_base = 1;
                        }
                        entry->in_pack_header_size = used + used_0;
@@ -2803,13 +2814,11 @@ static void add_tag_chain(const struct object_id *oid)
        }
 }
 
-static int add_ref_tag(const char *path, const struct object_id *oid, int flag, void *cb_data)
+static int add_ref_tag(const char *tag, const struct object_id *oid, int flag, void *cb_data)
 {
        struct object_id peeled;
 
-       if (starts_with(path, "refs/tags/") && /* is a tag? */
-           !peel_ref(path, &peeled)    && /* peelable? */
-           obj_is_packed(&peeled)) /* object packed? */
+       if (!peel_iterated_oid(oid, &peeled) && obj_is_packed(&peeled))
                add_tag_chain(oid);
        return 0;
 }
@@ -2944,6 +2953,13 @@ static int git_pack_config(const char *k, const char *v, void *cb)
                            pack_idx_opts.version);
                return 0;
        }
+       if (!strcmp(k, "pack.writereverseindex")) {
+               if (git_config_bool(k, v))
+                       pack_idx_opts.flags |= WRITE_REV;
+               else
+                       pack_idx_opts.flags &= ~WRITE_REV;
+               return 0;
+       }
        if (!strcmp(k, "uploadpack.blobpackfileuri")) {
                struct configured_exclusion *ex = xmalloc(sizeof(*ex));
                const char *oid_end, *pack_end;
@@ -3583,6 +3599,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 
        reset_pack_idx_option(&pack_idx_opts);
        git_config(git_pack_config, NULL);
+       if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
+               pack_idx_opts.flags |= WRITE_REV;
 
        progress = isatty(2);
        argc = parse_options(argc, argv, prefix, pack_objects_options,
@@ -3740,7 +3758,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
        }
        cleanup_preferred_base();
        if (include_tag && nr_result)
-               for_each_ref(add_ref_tag, NULL);
+               for_each_tag_ref(add_ref_tag, NULL);
        stop_progress(&progress_state);
        trace2_region_leave("pack-objects", "enumerate-objects",
                            the_repository);