diff options
-rw-r--r-- | Documentation/config.txt | 6 | ||||
-rw-r--r-- | cache.h | 1 | ||||
-rw-r--r-- | config.c | 5 | ||||
-rw-r--r-- | config.mak.uname | 2 | ||||
-rw-r--r-- | environment.c | 5 | ||||
-rw-r--r-- | read-cache.c | 2 | ||||
-rwxr-xr-x | t/t1014-read-tree-confusing.sh | 13 |
7 files changed, 34 insertions, 0 deletions
diff --git a/Documentation/config.txt b/Documentation/config.txt index 0677bd8df5..097fdd47e1 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 @@ -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 @@ -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 23af148837..ec7ed7ac3b 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 828b574a29..184748da3e 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 7f48a08c15..4fa208b662 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 ec310d5938..2f5a25d503 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' ' |