mirror of
https://github.com/git/git.git
synced 2026-08-09 09:34:14 +00:00
loose: load loose object map for the correct source
When loading the loose object map via `load_one_loose_object_map()` we pass in both a repository and the corresponding source. We ultimately don't really respect the passed-in source though as we instead always load the map via the common directory. This doesn't make any sense though, as the function is called in a loop through all sources, and as such the expectation is that we'll load the map that belongs to the given source. The consequence is that we'll ignore loose object maps of any configured alternates. Fix this bug by instead loading the map via the loose source's path. Helped-by: Toon Claes <toon@iotcl.com> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
9a0c4701dc
commit
695bfd981e
18
loose.c
18
loose.c
@@ -61,9 +61,11 @@ static int insert_loose_map(struct odb_source_loose *loose,
|
||||
return inserted;
|
||||
}
|
||||
|
||||
static int load_one_loose_object_map(struct repository *repo, struct odb_source_loose *loose)
|
||||
static int load_one_loose_object_map(struct odb_source_loose *loose)
|
||||
{
|
||||
struct strbuf buf = STRBUF_INIT, path = STRBUF_INIT;
|
||||
struct repository *repo = loose->base.odb->repo;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
char *path;
|
||||
FILE *fp;
|
||||
int ret = -1;
|
||||
|
||||
@@ -78,10 +80,10 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
|
||||
insert_loose_map(loose, repo->hash_algo->empty_blob, repo->compat_hash_algo->empty_blob);
|
||||
insert_loose_map(loose, repo->hash_algo->null_oid, repo->compat_hash_algo->null_oid);
|
||||
|
||||
repo_common_path_replace(repo, &path, "objects/loose-object-idx");
|
||||
fp = fopen(path.buf, "rb");
|
||||
path = xstrfmt("%s/loose-object-idx", loose->base.path);
|
||||
fp = fopen(path, "rb");
|
||||
if (!fp) {
|
||||
strbuf_release(&path);
|
||||
free(path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -102,7 +104,7 @@ static int load_one_loose_object_map(struct repository *repo, struct odb_source_
|
||||
err:
|
||||
fclose(fp);
|
||||
strbuf_release(&buf);
|
||||
strbuf_release(&path);
|
||||
free(path);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -117,10 +119,10 @@ int repo_read_loose_object_map(struct repository *repo)
|
||||
|
||||
for (source = repo->objects->sources; source; source = source->next) {
|
||||
struct odb_source_files *files = odb_source_files_downcast(source);
|
||||
if (load_one_loose_object_map(repo, files->loose) < 0) {
|
||||
if (load_one_loose_object_map(files->loose) < 0)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -187,6 +187,24 @@ do
|
||||
eval signedtag3_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag3) &&
|
||||
eval signedtag4_${hash}_oid=$(git hash-object -t tag -w ../${hash}_signedtag4)
|
||||
'
|
||||
|
||||
test_expect_success 'rev-parse maps oid of object borrowed from alternate' '
|
||||
for repo in alt borrow
|
||||
do
|
||||
test_when_finished "rm -rf $repo" &&
|
||||
git init --object-format=$hash $repo &&
|
||||
git -C $repo config set core.repositoryformatversion 1 &&
|
||||
git -C $repo config set extensions.compatObjectFormat $(compat_hash $hash) || exit 1
|
||||
done &&
|
||||
|
||||
git -C alt commit --allow-empty --message A &&
|
||||
echo "$(pwd)/alt/.git/objects" >borrow/.git/objects/info/alternates &&
|
||||
|
||||
oid=$(git -C alt rev-parse HEAD) &&
|
||||
git -C alt rev-parse --output-object-format=$(compat_hash $hash) "$oid" >expect &&
|
||||
git -C borrow rev-parse --output-object-format=$(compat_hash $hash) "$oid" >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
done
|
||||
cd "$base"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user