Commit 46c37911 by Russell Belfer

Merge pull request #1638 from brodie/brodie/handle-duplicate-objects-across-packs

odb_pack: handle duplicate objects from different packs
parents c7d4904c d19bcb33
...@@ -259,23 +259,26 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen ...@@ -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( ...@@ -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) ...@@ -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);
} }
......
P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack P pack-e87994ad581c9af946de0eb890175c08cd005f38.pack
P pack-f4ef1aa326265de7d05018ee51acc0a8717fe1ea.pack
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment