Skip to content

Commit

Permalink
sha1_file: do not add own object directory as alternate
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Ephrim Khong authored and Junio C Hamano committed Jul 15, 2014
1 parent 45067fc commit 539e750
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
13 changes: 9 additions & 4 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -332,13 +332,17 @@ 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.",
relative_base);
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++) {
Expand All @@ -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)
Expand Down
24 changes: 24 additions & 0 deletions t/t7702-repack-cyclic-alternate.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 539e750

Please sign in to comment.