Merge branch 'ek/alt-odb-entry-fix'
* ek/alt-odb-entry-fix: sha1_file: do not add own object directory as alternate
This commit is contained in:
commit
a8c565b227
13
sha1_file.c
13
sha1_file.c
@ -268,9 +268,9 @@ static struct alternate_object_database **alt_odb_tail;
|
||||
* 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;
|
||||
@ -321,7 +321,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;
|
||||
}
|
||||
@ -345,6 +345,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.",
|
||||
@ -352,6 +353,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++) {
|
||||
@ -362,11 +366,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