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:
parent
45067fc973
commit
539e75069f
13
sha1_file.c
13
sha1_file.c
@ -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)
|
||||
|
24
t/t7702-repack-cyclic-alternate.sh
Executable file
24
t/t7702-repack-cyclic-alternate.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user