match-trees: stop using the_repository

Stop using `the_repository` in the "match-trees" subsystem by passing
down the already-available repository parameters to internal functions
as required.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2024-12-17 07:44:01 +01:00
committed by Junio C Hamano
parent e1335a9407
commit d4cd757051

View File

@@ -1,4 +1,3 @@
#define USE_THE_REPOSITORY_VARIABLE
#define DISABLE_SIGN_COMPARE_WARNINGS #define DISABLE_SIGN_COMPARE_WARNINGS
#include "git-compat-util.h" #include "git-compat-util.h"
@@ -8,6 +7,7 @@
#include "tree.h" #include "tree.h"
#include "tree-walk.h" #include "tree-walk.h"
#include "object-store-ll.h" #include "object-store-ll.h"
#include "repository.h"
static int score_missing(unsigned mode) static int score_missing(unsigned mode)
{ {
@@ -54,14 +54,15 @@ static int score_matches(unsigned mode1, unsigned mode2)
return score; return score;
} }
static void *fill_tree_desc_strict(struct tree_desc *desc, static void *fill_tree_desc_strict(struct repository *r,
struct tree_desc *desc,
const struct object_id *hash) const struct object_id *hash)
{ {
void *buffer; void *buffer;
enum object_type type; enum object_type type;
unsigned long size; unsigned long size;
buffer = repo_read_object_file(the_repository, hash, &type, &size); buffer = repo_read_object_file(r, hash, &type, &size);
if (!buffer) if (!buffer)
die("unable to read tree (%s)", oid_to_hex(hash)); die("unable to read tree (%s)", oid_to_hex(hash));
if (type != OBJ_TREE) if (type != OBJ_TREE)
@@ -80,12 +81,13 @@ static int base_name_entries_compare(const struct name_entry *a,
/* /*
* Inspect two trees, and give a score that tells how similar they are. * Inspect two trees, and give a score that tells how similar they are.
*/ */
static int score_trees(const struct object_id *hash1, const struct object_id *hash2) static int score_trees(struct repository *r,
const struct object_id *hash1, const struct object_id *hash2)
{ {
struct tree_desc one; struct tree_desc one;
struct tree_desc two; struct tree_desc two;
void *one_buf = fill_tree_desc_strict(&one, hash1); void *one_buf = fill_tree_desc_strict(r, &one, hash1);
void *two_buf = fill_tree_desc_strict(&two, hash2); void *two_buf = fill_tree_desc_strict(r, &two, hash2);
int score = 0; int score = 0;
for (;;) { for (;;) {
@@ -133,7 +135,8 @@ static int score_trees(const struct object_id *hash1, const struct object_id *ha
/* /*
* Match one itself and its subtrees with two and pick the best match. * Match one itself and its subtrees with two and pick the best match.
*/ */
static void match_trees(const struct object_id *hash1, static void match_trees(struct repository *r,
const struct object_id *hash1,
const struct object_id *hash2, const struct object_id *hash2,
int *best_score, int *best_score,
char **best_match, char **best_match,
@@ -141,7 +144,7 @@ static void match_trees(const struct object_id *hash1,
int recurse_limit) int recurse_limit)
{ {
struct tree_desc one; struct tree_desc one;
void *one_buf = fill_tree_desc_strict(&one, hash1); void *one_buf = fill_tree_desc_strict(r, &one, hash1);
while (one.size) { while (one.size) {
const char *path; const char *path;
@@ -152,7 +155,7 @@ static void match_trees(const struct object_id *hash1,
elem = tree_entry_extract(&one, &path, &mode); elem = tree_entry_extract(&one, &path, &mode);
if (!S_ISDIR(mode)) if (!S_ISDIR(mode))
goto next; goto next;
score = score_trees(elem, hash2); score = score_trees(r, elem, hash2);
if (*best_score < score) { if (*best_score < score) {
free(*best_match); free(*best_match);
*best_match = xstrfmt("%s%s", base, path); *best_match = xstrfmt("%s%s", base, path);
@@ -160,7 +163,7 @@ static void match_trees(const struct object_id *hash1,
} }
if (recurse_limit) { if (recurse_limit) {
char *newbase = xstrfmt("%s%s/", base, path); char *newbase = xstrfmt("%s%s/", base, path);
match_trees(elem, hash2, best_score, best_match, match_trees(r, elem, hash2, best_score, best_match,
newbase, recurse_limit - 1); newbase, recurse_limit - 1);
free(newbase); free(newbase);
} }
@@ -175,7 +178,8 @@ static void match_trees(const struct object_id *hash1,
* A tree "oid1" has a subdirectory at "prefix". Come up with a tree object by * A tree "oid1" has a subdirectory at "prefix". Come up with a tree object by
* replacing it with another tree "oid2". * replacing it with another tree "oid2".
*/ */
static int splice_tree(const struct object_id *oid1, const char *prefix, static int splice_tree(struct repository *r,
const struct object_id *oid1, const char *prefix,
const struct object_id *oid2, struct object_id *result) const struct object_id *oid2, struct object_id *result)
{ {
char *subpath; char *subpath;
@@ -194,7 +198,7 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
if (*subpath) if (*subpath)
subpath++; subpath++;
buf = repo_read_object_file(the_repository, oid1, &type, &sz); buf = repo_read_object_file(r, oid1, &type, &sz);
if (!buf) if (!buf)
die("cannot read tree %s", oid_to_hex(oid1)); die("cannot read tree %s", oid_to_hex(oid1));
init_tree_desc(&desc, oid1, buf, sz); init_tree_desc(&desc, oid1, buf, sz);
@@ -232,15 +236,15 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
oid_to_hex(oid1)); oid_to_hex(oid1));
if (*subpath) { if (*subpath) {
struct object_id tree_oid; struct object_id tree_oid;
oidread(&tree_oid, rewrite_here, the_repository->hash_algo); oidread(&tree_oid, rewrite_here, r->hash_algo);
status = splice_tree(&tree_oid, subpath, oid2, &subtree); status = splice_tree(r, &tree_oid, subpath, oid2, &subtree);
if (status) if (status)
return status; return status;
rewrite_with = &subtree; rewrite_with = &subtree;
} else { } else {
rewrite_with = oid2; rewrite_with = oid2;
} }
hashcpy(rewrite_here, rewrite_with->hash, the_repository->hash_algo); hashcpy(rewrite_here, rewrite_with->hash, r->hash_algo);
status = write_object_file(buf, sz, OBJ_TREE, result); status = write_object_file(buf, sz, OBJ_TREE, result);
free(buf); free(buf);
return status; return status;
@@ -271,7 +275,7 @@ void shift_tree(struct repository *r,
if (!depth_limit) if (!depth_limit)
depth_limit = 2; depth_limit = 2;
add_score = del_score = score_trees(hash1, hash2); add_score = del_score = score_trees(r, hash1, hash2);
add_prefix = xcalloc(1, 1); add_prefix = xcalloc(1, 1);
del_prefix = xcalloc(1, 1); del_prefix = xcalloc(1, 1);
@@ -279,13 +283,13 @@ void shift_tree(struct repository *r,
* See if one's subtree resembles two; if so we need to prefix * See if one's subtree resembles two; if so we need to prefix
* two with a few fake trees to match the prefix. * two with a few fake trees to match the prefix.
*/ */
match_trees(hash1, hash2, &add_score, &add_prefix, "", depth_limit); match_trees(r, hash1, hash2, &add_score, &add_prefix, "", depth_limit);
/* /*
* See if two's subtree resembles one; if so we need to * See if two's subtree resembles one; if so we need to
* pick only subtree of two. * pick only subtree of two.
*/ */
match_trees(hash2, hash1, &del_score, &del_prefix, "", depth_limit); match_trees(r, hash2, hash1, &del_score, &del_prefix, "", depth_limit);
/* Assume we do not have to do any shifting */ /* Assume we do not have to do any shifting */
oidcpy(shifted, hash2); oidcpy(shifted, hash2);
@@ -306,7 +310,7 @@ void shift_tree(struct repository *r,
if (!*add_prefix) if (!*add_prefix)
goto out; goto out;
splice_tree(hash1, add_prefix, hash2, shifted); splice_tree(r, hash1, add_prefix, hash2, shifted);
out: out:
free(add_prefix); free(add_prefix);
@@ -340,16 +344,16 @@ void shift_tree_by(struct repository *r,
if (candidate == 3) { if (candidate == 3) {
/* Both are plausible -- we need to evaluate the score */ /* Both are plausible -- we need to evaluate the score */
int best_score = score_trees(hash1, hash2); int best_score = score_trees(r, hash1, hash2);
int score; int score;
candidate = 0; candidate = 0;
score = score_trees(&sub1, hash2); score = score_trees(r, &sub1, hash2);
if (score > best_score) { if (score > best_score) {
candidate = 1; candidate = 1;
best_score = score; best_score = score;
} }
score = score_trees(&sub2, hash1); score = score_trees(r, &sub2, hash1);
if (score > best_score) if (score > best_score)
candidate = 2; candidate = 2;
} }
@@ -365,7 +369,7 @@ void shift_tree_by(struct repository *r,
* shift tree2 down by adding shift_prefix above it * shift tree2 down by adding shift_prefix above it
* to match tree1. * to match tree1.
*/ */
splice_tree(hash1, shift_prefix, hash2, shifted); splice_tree(r, hash1, shift_prefix, hash2, shifted);
else else
/* /*
* shift tree2 up by removing shift_prefix from it * shift tree2 up by removing shift_prefix from it