mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 20:42:23 +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