mirror of
https://github.com/neovim/neovim.git
synced 2025-10-16 06:46:07 +00:00
Change to canonicalize only when reparse point in included
This commit is contained in:
@@ -6711,8 +6711,10 @@ static void f_resolve(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char *v = os_resolve_shortcut(fname);
|
char *v = os_resolve_shortcut(fname);
|
||||||
if (v == NULL) {
|
if (v == NULL) {
|
||||||
|
if (os_is_reparse_point_include(fname)) {
|
||||||
v = os_realpath(fname, v);
|
v = os_realpath(fname, v);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
rettv->vval.v_string = (char_u *)(v == NULL ? xstrdup(fname) : v);
|
rettv->vval.v_string = (char_u *)(v == NULL ? xstrdup(fname) : v);
|
||||||
#else
|
#else
|
||||||
# ifdef HAVE_READLINK
|
# ifdef HAVE_READLINK
|
||||||
|
@@ -1257,4 +1257,49 @@ shortcut_end:
|
|||||||
return rfname;
|
return rfname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define is_path_sep(c) ((c) == L'\\' || (c) == L'/')
|
||||||
|
/// Returns true if the path contains a reparse point (junction or symbolic
|
||||||
|
/// link). Otherwise false in returned.
|
||||||
|
bool os_is_reparse_point_include(const char *path)
|
||||||
|
{
|
||||||
|
wchar_t *p, *q, *utf16_path;
|
||||||
|
wchar_t buf[MAX_PATH];
|
||||||
|
DWORD attr;
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
const int r = utf8_to_utf16(path, -1, &utf16_path);
|
||||||
|
if (r != 0) {
|
||||||
|
EMSG2("utf8_to_utf16 failed: %d", r);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = utf16_path;
|
||||||
|
if (isalpha(p[0]) && p[1] == L':' && is_path_sep(p[2])) {
|
||||||
|
p += 3;
|
||||||
|
} else if (is_path_sep(p[0]) && is_path_sep(p[1])) {
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*p != L'\0') {
|
||||||
|
q = wcspbrk(p, L"\\/");
|
||||||
|
if (q == NULL) {
|
||||||
|
p = q = utf16_path + wcslen(utf16_path);
|
||||||
|
} else {
|
||||||
|
p = q + 1;
|
||||||
|
}
|
||||||
|
if (q - utf16_path >= MAX_PATH) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wcsncpy(buf, utf16_path, (size_t)(q - utf16_path));
|
||||||
|
buf[q - utf16_path] = L'\0';
|
||||||
|
attr = GetFileAttributesW(buf);
|
||||||
|
if (attr != INVALID_FILE_ATTRIBUTES
|
||||||
|
&& (attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0) {
|
||||||
|
result = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xfree(utf16_path);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user