sha1_file: do not add own object directory as alternate

When adding alternate object directories, we try not to add the
directory of the current repository to avoid cycles.  Unfortunately,
that test was broken, since it compared an absolute with a relative
path.

Signed-off-by: Ephrim Khong <dr.khong@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ephrim Khong 2014-07-15 13:29:45 +02:00 committed by Junio C Hamano
parent 45067fc973
commit 539e75069f
2 changed files with 33 additions and 4 deletions

View File

@ -256,9 +256,9 @@ static int git_open_noatime(const char *name);
* SHA1, an extra slash for the first level indirection, and the
* terminating NUL.
*/
static int link_alt_odb_entry(const char *entry, const char *relative_base, int depth)
static int link_alt_odb_entry(const char *entry, const char *relative_base,
int depth, const char *normalized_objdir)
{
const char *objdir = get_object_directory();
struct alternate_object_database *ent;
struct alternate_object_database *alt;
int pfxlen, entlen;
@ -308,7 +308,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, int
return -1;
}
}
if (!strcmp(ent->base, objdir)) {
if (!strcmp_icase(ent->base, normalized_objdir)) {
free(ent);
return -1;
}
@ -332,6 +332,7 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
struct string_list entries = STRING_LIST_INIT_NODUP;
char *alt_copy;
int i;
struct strbuf objdirbuf = STRBUF_INIT;
if (depth > 5) {
error("%s: ignoring alternate object stores, nesting too deep.",
@ -339,6 +340,9 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
return;
}
strbuf_addstr(&objdirbuf, absolute_path(get_object_directory()));
normalize_path_copy(objdirbuf.buf, objdirbuf.buf);
alt_copy = xmemdupz(alt, len);
string_list_split_in_place(&entries, alt_copy, sep, -1);
for (i = 0; i < entries.nr; i++) {
@ -349,11 +353,12 @@ static void link_alt_odb_entries(const char *alt, int len, int sep,
error("%s: ignoring relative alternate object store %s",
relative_base, entry);
} else {
link_alt_odb_entry(entry, relative_base, depth);
link_alt_odb_entry(entry, relative_base, depth, objdirbuf.buf);
}
}
string_list_clear(&entries, 0);
free(alt_copy);
strbuf_release(&objdirbuf);
}
void read_info_alternates(const char * relative_base, int depth)

View File

@ -0,0 +1,24 @@
#!/bin/sh
#
# Copyright (c) 2014 Ephrim Khong
#
test_description='repack involving cyclic alternate'
. ./test-lib.sh
test_expect_success setup '
GIT_OBJECT_DIRECTORY=.git//../.git/objects &&
export GIT_OBJECT_DIRECTORY &&
touch a &&
git add a &&
git commit -m 1 &&
git repack -adl &&
echo "$(pwd)"/.git/objects/../objects >.git/objects/info/alternates
'
test_expect_success 're-packing repository with itsself as alternate' '
git repack -adl &&
git fsck
'
test_done