mirror of
https://git.proxmox.com/git/libgit2
synced 2025-10-30 07:02:25 +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);
|
return git_odb__error_notfound("failed to find pack entry", oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned pack_entry_find_prefix_inner(
|
static int pack_entry_find_prefix(
|
||||||
struct git_pack_entry *e,
|
struct git_pack_entry *e,
|
||||||
struct pack_backend *backend,
|
struct pack_backend *backend,
|
||||||
const git_oid *short_oid,
|
const git_oid *short_oid,
|
||||||
size_t len,
|
size_t len)
|
||||||
struct git_pack_file *last_found)
|
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
size_t i;
|
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) {
|
if (last_found) {
|
||||||
error = git_pack_entry_find(e, last_found, short_oid, len);
|
error = git_pack_entry_find(e, last_found, short_oid, len);
|
||||||
if (error == GIT_EAMBIGUOUS)
|
if (error == GIT_EAMBIGUOUS)
|
||||||
return error;
|
return error;
|
||||||
if (!error)
|
if (!error) {
|
||||||
found = 1;
|
git_oid_cpy(&found_full_oid, &e->sha1);
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < backend->packs.length; ++i) {
|
for (i = 0; i < backend->packs.length; ++i) {
|
||||||
@ -289,28 +292,16 @@ static unsigned pack_entry_find_prefix_inner(
|
|||||||
if (error == GIT_EAMBIGUOUS)
|
if (error == GIT_EAMBIGUOUS)
|
||||||
return error;
|
return error;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
if (++found > 1)
|
if (found && git_oid_cmp(&e->sha1, &found_full_oid))
|
||||||
break;
|
return git_odb__error_ambiguous("found multiple pack entries");
|
||||||
|
git_oid_cpy(&found_full_oid, &e->sha1);
|
||||||
|
found = true;
|
||||||
backend->last_found = p;
|
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)
|
if (!found)
|
||||||
return git_odb__error_notfound("no matching pack entry for prefix", short_oid);
|
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
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,11 +16,14 @@ void test_odb_mixed__cleanup(void)
|
|||||||
|
|
||||||
void test_odb_mixed__dup_oid(void) {
|
void test_odb_mixed__dup_oid(void) {
|
||||||
const char hex[] = "ce013625030ba8dba906f756967f9e9ca394464a";
|
const char hex[] = "ce013625030ba8dba906f756967f9e9ca394464a";
|
||||||
|
const char short_hex[] = "ce01362";
|
||||||
git_oid oid;
|
git_oid oid;
|
||||||
git_odb_object *obj;
|
git_odb_object *obj;
|
||||||
|
|
||||||
cl_git_pass(git_oid_fromstr(&oid, hex));
|
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_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);
|
git_odb_object_free(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +1,3 @@
|
|||||||
P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack
|
P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack
|
||||||
|
P pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user