Merge pull request #2504 from dscho/access-repo-via-junction

Handle `git add <file>` where <file> traverses an NTFS junction
This commit is contained in:
Johannes Schindelin
2020-02-01 12:13:45 +01:00
committed by Derrick Stolee
5 changed files with 51 additions and 0 deletions

View File

@@ -95,6 +95,9 @@ char *strbuf_realpath(struct strbuf *resolved, const char *path,
goto error_out;
}
if (platform_strbuf_realpath(resolved, path))
return resolved->buf;
strbuf_addstr(&remaining, path);
get_root_part(resolved, &remaining);

View File

@@ -1077,6 +1077,37 @@ struct tm *localtime_r(const time_t *timep, struct tm *result)
return NULL;
}
char *mingw_strbuf_realpath(struct strbuf *resolved, const char *path)
{
wchar_t wpath[MAX_PATH];
HANDLE h;
DWORD ret;
int len;
if (xutftowcs_path(wpath, path) < 0)
return NULL;
h = CreateFileW(wpath, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (h == INVALID_HANDLE_VALUE)
return NULL;
ret = GetFinalPathNameByHandleW(h, wpath, ARRAY_SIZE(wpath), 0);
CloseHandle(h);
if (!ret || ret >= ARRAY_SIZE(wpath))
return NULL;
len = wcslen(wpath) * 3;
strbuf_grow(resolved, len);
len = xwcstoutf(resolved->buf, normalize_ntpath(wpath), len);
if (len < 0)
return NULL;
resolved->len = len;
return resolved->buf;
}
char *mingw_getcwd(char *pointer, int len)
{
wchar_t cwd[MAX_PATH], wpointer[MAX_PATH];

View File

@@ -449,6 +449,8 @@ int mingw_is_mount_point(struct strbuf *path);
#define PATH_SEP ';'
char *mingw_query_user_email(void);
#define query_user_email mingw_query_user_email
char *mingw_strbuf_realpath(struct strbuf *resolved, const char *path);
#define platform_strbuf_realpath mingw_strbuf_realpath
#if !defined(__MINGW64_VERSION_MAJOR) && (!defined(_MSC_VER) || _MSC_VER < 1800)
#define PRIuMAX "I64u"
#define PRId64 "I64d"

View File

@@ -405,6 +405,10 @@ static inline int git_has_dir_sep(const char *path)
#define query_user_email() NULL
#endif
#ifndef platform_strbuf_realpath
#define platform_strbuf_realpath(resolved, path) NULL
#endif
#ifdef __TANDEM
#include <floss.h(floss_execl,floss_execlp,floss_execv,floss_execvp)>
#include <floss.h(floss_getpwuid)>

View File

@@ -423,4 +423,15 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '
git add "$downcased"
'
test_expect_success MINGW 'can add files via NTFS junctions' '
test_when_finished "cmd //c rmdir junction && rm -rf target" &&
test_create_repo target &&
cmd //c "mklink /j junction target" &&
>target/via-junction &&
git -C junction add "$(pwd)/junction/via-junction" &&
echo via-junction >expect &&
git -C target diff --cached --name-only >actual &&
test_cmp expect actual
'
test_done