mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-28 04:29:42 +00:00
odb_pack: handle duplicate objects from different packs
This is based on 24634c6fd0
.
This also corrects an issue with error codes being mixed up with the
number of found objects.
This commit is contained in:
parent
c7d4904c47
commit
d19bcb3352
@ -259,23 +259,26 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen
|
||||
return git_odb__error_notfound("failed to find pack entry", oid);
|
||||
}
|
||||
|
||||
static unsigned pack_entry_find_prefix_inner(
|
||||
struct git_pack_entry *e,
|
||||
struct pack_backend *backend,
|
||||
const git_oid *short_oid,
|
||||
size_t len,
|
||||
struct git_pack_file *last_found)
|
||||
static int pack_entry_find_prefix(
|
||||
struct git_pack_entry *e,
|
||||
struct pack_backend *backend,
|
||||
const git_oid *short_oid,
|
||||
size_t len)
|
||||
{
|
||||
int error;
|
||||
size_t i;
|
||||
unsigned found = 0;
|
||||
git_oid found_full_oid = {{0}};
|
||||
bool found = false;
|
||||
struct git_pack_file *last_found = backend->last_found;
|
||||
|
||||
if (last_found) {
|
||||
error = git_pack_entry_find(e, last_found, short_oid, len);
|
||||
if (error == GIT_EAMBIGUOUS)
|
||||
return error;
|
||||
if (!error)
|
||||
found = 1;
|
||||
if (!error) {
|
||||
git_oid_cpy(&found_full_oid, &e->sha1);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < backend->packs.length; ++i) {
|
||||
@ -289,28 +292,16 @@ static unsigned pack_entry_find_prefix_inner(
|
||||
if (error == GIT_EAMBIGUOUS)
|
||||
return error;
|
||||
if (!error) {
|
||||
if (++found > 1)
|
||||
break;
|
||||
if (found && git_oid_cmp(&e->sha1, &found_full_oid))
|
||||
return git_odb__error_ambiguous("found multiple pack entries");
|
||||
git_oid_cpy(&found_full_oid, &e->sha1);
|
||||
found = true;
|
||||
backend->last_found = p;
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
static int pack_entry_find_prefix(
|
||||
struct git_pack_entry *e,
|
||||
struct pack_backend *backend,
|
||||
const git_oid *short_oid,
|
||||
size_t len)
|
||||
{
|
||||
struct git_pack_file *last_found = backend->last_found;
|
||||
unsigned int found = pack_entry_find_prefix_inner(e, backend, short_oid, len, last_found);
|
||||
|
||||
if (!found)
|
||||
return git_odb__error_notfound("no matching pack entry for prefix", short_oid);
|
||||
else if (found > 1)
|
||||
return git_odb__error_ambiguous("found multiple pack entries");
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
@ -16,11 +16,14 @@ void test_odb_mixed__cleanup(void)
|
||||
|
||||
void test_odb_mixed__dup_oid(void) {
|
||||
const char hex[] = "ce013625030ba8dba906f756967f9e9ca394464a";
|
||||
const char short_hex[] = "ce01362";
|
||||
git_oid oid;
|
||||
git_odb_object *obj;
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid, hex));
|
||||
cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, GIT_OID_HEXSZ));
|
||||
cl_git_pass(git_oid_fromstrn(&oid, short_hex, sizeof(short_hex) - 1));
|
||||
cl_git_pass(git_odb_read_prefix(&obj, _odb, &oid, sizeof(short_hex) - 1));
|
||||
git_odb_object_free(obj);
|
||||
}
|
||||
|
||||
|
@ -1,2 +1,3 @@
|
||||
P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack
|
||||
P pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user