summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2016-10-03 20:36:26 (GMT)
committerJunio C Hamano <gitster@pobox.com>2016-10-10 20:52:37 (GMT)
commitea0fc3b4176a424a2b20eb76a6a503dc4d59cebb (patch)
treefcb3e3cc6bf9b74eaf5c1f7596701bb0a0135f3d
parent087b6d584062f5b704356286d6445bcc84d686fb (diff)
downloadgit-ea0fc3b4176a424a2b20eb76a6a503dc4d59cebb.zip
git-ea0fc3b4176a424a2b20eb76a6a503dc4d59cebb.tar.gz
git-ea0fc3b4176a424a2b20eb76a6a503dc4d59cebb.tar.bz2
alternates: use fspathcmp to detect duplicates
On a case-insensitive filesystem, we should realize that "a/objects" and "A/objects" are the same path. We already use fspathcmp() to check against the main object directory, but until recently we couldn't use it for comparing against other alternates (because their paths were not NUL-terminated strings). But now we can, so let's do so. Note that we also need to adjust count-objects to load the config, so that it can see the setting of core.ignorecase (this is required by the test, but is also a general bugfix for users of count-objects). Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin/count-objects.c2
-rw-r--r--sha1_file.c2
-rwxr-xr-xt/t5613-info-alternate.sh17
3 files changed, 20 insertions, 1 deletions
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index a700409..a04b4f2 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -97,6 +97,8 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
OPT_END(),
};
+ git_config(git_default_config, NULL);
+
argc = parse_options(argc, argv, prefix, opts, count_objects_usage, 0);
/* we do not take arguments other than flags for now */
if (argc)
diff --git a/sha1_file.c b/sha1_file.c
index 9cad56f..0646519 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -260,7 +260,7 @@ static int alt_odb_usable(struct strbuf *path, const char *normalized_objdir)
* thing twice, or object directory itself.
*/
for (alt = alt_odb_list; alt; alt = alt->next) {
- if (!strcmp(path->buf, alt->path))
+ if (!fspathcmp(path->buf, alt->path))
return 0;
}
if (!fspathcmp(path->buf, normalized_objdir))
diff --git a/t/t5613-info-alternate.sh b/t/t5613-info-alternate.sh
index 76f1a20..895f46b 100755
--- a/t/t5613-info-alternate.sh
+++ b/t/t5613-info-alternate.sh
@@ -119,4 +119,21 @@ test_expect_success 'relative duplicates are eliminated' '
test_cmp expect actual.alternates
'
+test_expect_success CASE_INSENSITIVE_FS 'dup finding can be case-insensitive' '
+ git init --bare insensitive.git &&
+ # the previous entry for "A" will have used uppercase
+ cat >insensitive.git/objects/info/alternates <<-\EOF &&
+ ../../C/.git/objects
+ ../../a/.git/objects
+ EOF
+ cat >expect <<-EOF &&
+ alternate: $(pwd)/C/.git/objects
+ alternate: $(pwd)/B/.git/objects
+ alternate: $(pwd)/A/.git/objects
+ EOF
+ git -C insensitive.git count-objects -v >actual &&
+ grep ^alternate: actual >actual.alternates &&
+ test_cmp expect actual.alternates
+'
+
test_done