bundle: get (mostly) rid of `the_repository`

Refactor "bundle.c" so that we don't depend on `the_repository` anymore.
This conversion is trivial for most of the part, as we already have a
repository available in all calling conexts.

The only exception is that we use `get_log_output_encoding()`, which
implicitly depends on `the_repository`. Add an `extern` declaration for
this function so that we can drop `USE_THE_REPOSITORY_VARIABLE` and not
accidentally introduce more uses of `the_repository`.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Patrick Steinhardt 2026-08-21 08:30:05 +02:00 committed by Junio C Hamano
parent 3f0986b27c
commit 9e8558a31d
1 changed files with 21 additions and 11 deletions

View File

@ -1,4 +1,3 @@
#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS

#include "git-compat-util.h"
@ -21,6 +20,13 @@
#include "connected.h"
#include "write-or-die.h"

/*
* NEEDSWORK: this function implicitly depends on `the_repository` and is not
* available because we dropped USE_THE_REPOSITORY_VARIABLE. We can remove the
* declaration once it's accessible via `repo_config_values`.
*/
extern const char *get_log_output_encoding(void);

static const char v2_bundle_signature[] = "# v2 git bundle\n";
static const char v3_bundle_signature[] = "# v3 git bundle\n";
static struct {
@ -294,7 +300,8 @@ int list_bundle_refs(struct bundle_header *header, int argc, const char **argv)
return list_refs(&header->references, argc, argv);
}

static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
static int is_tag_in_date_range(struct repository *repo,
struct object *tag, struct rev_info *revs)
{
size_t size;
enum object_type type;
@ -305,7 +312,7 @@ static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
if (revs->max_age == -1 && revs->min_age == -1)
goto out;

buf = odb_read_object(the_repository->objects, &tag->oid, &type, &size);
buf = odb_read_object(repo->objects, &tag->oid, &type, &size);
if (!buf)
goto out;
line = memmem(buf, size, "\ntagger ", 8);
@ -362,7 +369,8 @@ static int write_pack_data(int bundle_fd, struct rev_info *revs, struct strvec *
struct object *object = revs->pending.objects[i].item;
if (object->flags & UNINTERESTING)
write_or_die(pack_objects.in, "^", 1);
write_or_die(pack_objects.in, oid_to_hex(&object->oid), the_hash_algo->hexsz);
write_or_die(pack_objects.in, oid_to_hex(&object->oid),
revs->repo->hash_algo->hexsz);
write_or_die(pack_objects.in, "\n", 1);
}
close(pack_objects.in);
@ -395,10 +403,10 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)

if (e->item->flags & UNINTERESTING)
continue;
if (repo_dwim_ref(the_repository, e->name, strlen(e->name),
if (repo_dwim_ref(revs->repo, e->name, strlen(e->name),
&oid, &ref, 0) != 1)
goto skip_write_ref;
if (refs_read_ref_full(get_main_ref_store(the_repository), e->name, RESOLVE_REF_READING, &oid, &flag))
if (refs_read_ref_full(get_main_ref_store(revs->repo), e->name, RESOLVE_REF_READING, &oid, &flag))
flag = 0;
display_ref = (flag & REF_ISSYMREF) ? e->name : ref;

@ -406,7 +414,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
goto skip_write_ref;

if (e->item->type == OBJ_TAG &&
!is_tag_in_date_range(e->item, revs)) {
!is_tag_in_date_range(revs->repo, e->item, revs)) {
e->item->flags |= UNINTERESTING;
goto skip_write_ref;
}
@ -428,7 +436,8 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)

ref_count++;
strset_add(&objects, display_ref);
write_or_die(bundle_fd, oid_to_hex(&e->item->oid), the_hash_algo->hexsz);
write_or_die(bundle_fd, oid_to_hex(&e->item->oid),
revs->repo->hash_algo->hexsz);
write_or_die(bundle_fd, " ", 1);
write_or_die(bundle_fd, display_ref, strlen(display_ref));
write_or_die(bundle_fd, "\n", 1);
@ -507,7 +516,7 @@ int create_bundle(struct repository *r, const char *path,
* SHA1.
* 2. @filter is required because we parsed an object filter.
*/
if (the_hash_algo != &hash_algos[GIT_HASH_SHA1_LEGACY] || revs.filter.choice)
if (r->hash_algo != &hash_algos[GIT_HASH_SHA1_LEGACY] || revs.filter.choice)
min_version = 3;

if (argc > 1) {
@ -528,14 +537,15 @@ int create_bundle(struct repository *r, const char *path,
if (version < 2 || version > 3) {
die(_("unsupported bundle version %d"), version);
} else if (version < min_version) {
die(_("cannot write bundle version %d with algorithm %s"), version, the_hash_algo->name);
die(_("cannot write bundle version %d with algorithm %s"), version,
r->hash_algo->name);
} else if (version == 2) {
write_or_die(bundle_fd, v2_bundle_signature, strlen(v2_bundle_signature));
} else {
const char *capability = "@object-format=";
write_or_die(bundle_fd, v3_bundle_signature, strlen(v3_bundle_signature));
write_or_die(bundle_fd, capability, strlen(capability));
write_or_die(bundle_fd, the_hash_algo->name, strlen(the_hash_algo->name));
write_or_die(bundle_fd, r->hash_algo->name, strlen(r->hash_algo->name));
write_or_die(bundle_fd, "\n", 1);

if (revs.filter.choice) {