Comments (16)
I also tested it better, it's reproducible in Windows 7 with the same criterias
from git.
I spotted the cause: mingw_chdir("S:/") fails in mingw.c
this is because normalize_ntpath removes the trailing slash in mingw.c:341 , and if you try to run _wchdir("S:") that function fails (it probably just changes the current drive) , you have to use _wchdir("S:") to switch to the root directory.
I'm not sure how to do a patch without messing-up everything, anyway in 1.9.5 it worked correctly.
from git.
@QbProg could you install the Git SDK -- unless you have it already -- and try out this patch?
diff --git a/compat/mingw.c b/compat/mingw.c
index 8e1993f..d1baaeb 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -316,7 +316,7 @@ static void process_phantom_symlinks(void)
}
/* Normalizes NT paths as returned by some low-level APIs. */
-static wchar_t *normalize_ntpath(wchar_t *wbuf)
+static wchar_t *normalize_ntpath(wchar_t *wbuf, int keep_trailing_slashes)
{
int i;
/* fix absolute path prefixes */
@@ -338,8 +338,9 @@ static wchar_t *normalize_ntpath(wchar_t *wbuf)
if (wbuf[i] == '\\')
wbuf[i] = '/';
/* remove potential trailing slashes */
- while (i && wbuf[i - 1] == '/')
- wbuf[--i] = 0;
+ if (!keep_trailing_slashes)
+ while (i && wbuf[i - 1] == '/')
+ wbuf[--i] = 0;
return wbuf;
}
@@ -621,7 +622,7 @@ int mingw_chdir(const char *dirname)
CloseHandle(hnd);
}
- result = _wchdir(normalize_ntpath(wdirname));
+ result = _wchdir(normalize_ntpath(wdirname, 0));
current_directory_len = GetCurrentDirectoryW(0, NULL);
return result;
}
@@ -2290,7 +2291,7 @@ int readlink(const char *path, char *buf, size_t bufsiz)
* so convert to a (hopefully large enough) temporary buffer, then memcpy
* the requested number of bytes (including '\0' for robustness).
*/
- if ((len = xwcstoutf(tmpbuf, normalize_ntpath(wbuf), MAX_LONG_PATH)) < 0)
+ if ((len = xwcstoutf(tmpbuf, normalize_ntpath(wbuf, 1), MAX_LONG_PATH)) < 0)
return -1;
memcpy(buf, tmpbuf, min(bufsiz, len + 1));
return min(bufsiz, len);
from git.
it seems not working.
IHMO it is the _wchdir(normalize_ntpath(wdirname,0)) which should have 1 for keep_trailing_slashes since it's in that point that the function fails
I don't know if it's correct but you could automatically avoid the trailing slash deletion only if the path is a root. You could check this using Win32 "PathIsRoot" (requires shlwapi) or else just check if
(strlen == 3 && str[1] == L':' && (str[2] == L'' || str[2] == L'/'))
(given that you have a correct absolute path and you already stripped special path indicators)
from git.
This patch should solve the issue , but I didn't run the tests
diff --git a/compat/mingw.c b/compat/mingw.c
index 1d10707..706b527 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -333,13 +333,18 @@ static wchar_t *normalize_ntpath(wchar_t *wbuf)
*wbuf = '\\';
}
}
+
+ int is_root = (wcslen(wbuf) == 3) && (wbuf[1] == L':') && (wbuf[2] == L'\\' || wbuf[2] == '/');
+
/* convert backslashes to slashes */
for (i = 0; wbuf[i]; i++)
if (wbuf[i] == '\\')
wbuf[i] = '/';
/* remove potential trailing slashes */
- while (i && wbuf[i - 1] == '/')
- wbuf[--i] = 0;
+ if(!is_root)
+ while (i && wbuf[i - 1] == '/')
+ wbuf[--i] = 0;
+
return wbuf;
}
from git.
I actually would really prefer to have a solution that does not depend on testing for the root directory. Are you sure that _wchdir(L"C:/Windows/")
fails?
from git.
_wchdir("C:") fails, while _wchdir("C:") succeed. This is windows related I think.
from git.
What about _wchdir(L"C:/");
? And _wchdir(L"C:/Windows/");
?
from git.
they work. Also _wchdir(L"C:/Windows") works because is not root
the problem is exactly that normalize_ntpath removes the trailing slash.
from git.
@QbProg yep, so I just mixed up my 0s and 1s, right? Could you please test my patch again (which would maybe also handle cases such as _wchdir(L"//server/")
, at least that is as general as I wanted the patch to be), with the 0 and the 1 properly adjusted, as per your analysis?
from git.
@dscho the patch with the 0 and 1 switched works!
I was not able to test a network path since I don't have a network here :)
Thank you!
from git.
Thanks for testing! As to the network share, I will test that once I am done releasing 2.4.4.1.
from git.
@QbProg I am busy working toward a 3rd release candidate of Git for Windows 2.x which will include this fix.
from git.
@QbProg could you please test the new Git for Windows 2.4.4.2?
from git.
tested rc3 (git version 2.4.4.windows.2), it's fixed! thank you!
from git.
Excellent!
from git.
Related Issues (20)
- Redirect to Git for Windows 2.x HOT 10
- Why I am not able to use curl commands ? HOT 1
- "Entrust Root Certification Authority - G2" is not trusted HOT 5
- umeng123
- Windows installer not cryptographically signed. HOT 3
- Using mingw-perl HOT 5
- git rev-list crashes when --show-notes and --grep are specified HOT 2
- Git SVN crash HOT 3
- Git daemon and TortoiseGit HOT 2
- fox
- Git Blame - file.dot is not a Word Document HOT 3
- Missing patch tool for release candidate of Git for Windows. HOT 1
- Custom mergetool cmd support in git GUI HOT 1
- Git.exe is stuck if I run a wrong command. HOT 1
- Not able to clone gerrit repo over https via gitbash(windows client) HOT 5
- please add a release to announce the move of release downloads to the git-for-windows repo HOT 7
- <invalid>
- Filename too long when cloning a repo HOT 3
- Cannot Create Shortcut, Cannot Find App, Cannot Open App HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from git.