summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/config.txt6
-rw-r--r--cache.h1
-rw-r--r--config.c5
-rw-r--r--config.mak.uname2
-rw-r--r--environment.c5
-rw-r--r--read-cache.c2
-rwxr-xr-xt/t1014-read-tree-confusing.sh13
7 files changed, 34 insertions, 0 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 0677bd8..097fdd4 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -239,6 +239,12 @@ core.protectHFS::
be considered equivalent to `.git` on an HFS+ filesystem.
Defaults to `true` on Mac OS, and `false` elsewhere.
+core.protectNTFS::
+ If set to true, do not allow checkout of paths that would
+ cause problems with the NTFS filesystem, e.g. conflict with
+ 8.3 "short" names.
+ Defaults to `true` on Windows, and `false` elsewhere.
+
core.trustctime::
If false, the ctime differences between the index and the
working tree are ignored; useful when the inode change time
diff --git a/cache.h b/cache.h
index d17b1d6..29ed24b 100644
--- a/cache.h
+++ b/cache.h
@@ -585,6 +585,7 @@ extern int core_preload_index;
extern int core_apply_sparse_checkout;
extern int precomposed_unicode;
extern int protect_hfs;
+extern int protect_ntfs;
/*
* The character that begins a commented line in user-editable file
diff --git a/config.c b/config.c
index b519ced..2cd64b6 100644
--- a/config.c
+++ b/config.c
@@ -886,6 +886,11 @@ static int git_default_core_config(const char *var, const char *value)
return 0;
}
+ if (!strcmp(var, "core.protectntfs")) {
+ protect_ntfs = git_config_bool(var, value);
+ return 0;
+ }
+
/* Add other config variables here and to Documentation/config.txt. */
return 0;
}
diff --git a/config.mak.uname b/config.mak.uname
index 23af148..ec7ed7a 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -362,6 +362,7 @@ ifeq ($(uname_S),Windows)
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
PTHREAD_LIBS =
lib =
+ BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
ifndef DEBUG
BASIC_CFLAGS += -GL -Os -MT
BASIC_LDFLAGS += -LTCG
@@ -506,6 +507,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
COMPAT_OBJS += compat/mingw.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/dirent.o
+ BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
BASIC_LDFLAGS += -Wl,--large-address-aware
EXTLIBS += -lws2_32
GITLIBS += git.res
diff --git a/environment.c b/environment.c
index 828b574..184748d 100644
--- a/environment.c
+++ b/environment.c
@@ -68,6 +68,11 @@ unsigned long pack_size_limit_cfg;
#endif
int protect_hfs = PROTECT_HFS_DEFAULT;
+#ifndef PROTECT_NTFS_DEFAULT
+#define PROTECT_NTFS_DEFAULT 0
+#endif
+int protect_ntfs = PROTECT_NTFS_DEFAULT;
+
/*
* The character that begins a commented line in user-editable file
* that is subject to stripspace.
diff --git a/read-cache.c b/read-cache.c
index 7f48a08..4fa208b 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -789,6 +789,8 @@ int verify_path(const char *path)
inside:
if (protect_hfs && is_hfs_dotgit(path))
return 0;
+ if (protect_ntfs && is_ntfs_dotgit(path))
+ return 0;
c = *path++;
if ((c == '.' && !verify_dotfile(path)) ||
is_dir_sep(c) || c == '\0')
diff --git a/t/t1014-read-tree-confusing.sh b/t/t1014-read-tree-confusing.sh
index ec310d5..2f5a25d 100755
--- a/t/t1014-read-tree-confusing.sh
+++ b/t/t1014-read-tree-confusing.sh
@@ -15,8 +15,17 @@ test_expect_success 'enable core.protectHFS for rejection tests' '
git config core.protectHFS true
'
+test_expect_success 'enable core.protectNTFS for rejection tests' '
+ git config core.protectNTFS true
+'
+
while read path pretty; do
: ${pretty:=$path}
+ case "$path" in
+ *SPACE)
+ path="${path%SPACE} "
+ ;;
+ esac
test_expect_success "reject $pretty at end of path" '
printf "100644 blob %s\t%s" "$blob" "$path" >tree &&
bogus=$(git mktree <tree) &&
@@ -36,6 +45,10 @@ done <<-EOF
${u200c}.Git {u200c}.Git
.gI${u200c}T .gI{u200c}T
.GiT${u200c} .GiT{u200c}
+git~1
+.git.SPACE .git.{space}
+.\\\\.GIT\\\\foobar backslashes
+.git\\\\foobar backslashes2
EOF
test_expect_success 'utf-8 paths allowed with core.protectHFS off' '