Commit 50a762a5 by nulltoken

path: Teach UNC paths to git_path_dirname_r()

Fix libgit2/libgit2sharp#256
parent 34b6f05f
...@@ -19,6 +19,22 @@ ...@@ -19,6 +19,22 @@
#define LOOKS_LIKE_DRIVE_PREFIX(S) (git__isalpha((S)[0]) && (S)[1] == ':') #define LOOKS_LIKE_DRIVE_PREFIX(S) (git__isalpha((S)[0]) && (S)[1] == ':')
static bool looks_like_network_computer_name(const char *path, int pos)
{
if (pos < 3)
return false;
if (path[0] != '/' || path[1] != '/')
return false;
while (pos-- > 2) {
if (path[pos] == '/')
return false;
}
return true;
}
/* /*
* Based on the Android implementation, BSD licensed. * Based on the Android implementation, BSD licensed.
* Check http://android.git.kernel.org/ * Check http://android.git.kernel.org/
...@@ -111,6 +127,15 @@ int git_path_dirname_r(git_buf *buffer, const char *path) ...@@ -111,6 +127,15 @@ int git_path_dirname_r(git_buf *buffer, const char *path)
len = 3; len = 3;
goto Exit; goto Exit;
} }
/* Similarly checks if we're dealing with a network computer name
'//computername/.git' will return '//computername/' */
if (looks_like_network_computer_name(path, len)) {
len++;
goto Exit;
}
#endif #endif
Exit: Exit:
......
...@@ -91,6 +91,10 @@ void test_core_path__00_dirname(void) ...@@ -91,6 +91,10 @@ void test_core_path__00_dirname(void)
#ifdef GIT_WIN32 #ifdef GIT_WIN32
check_dirname("C:/path/", "C:/"); check_dirname("C:/path/", "C:/");
check_dirname("C:/path", "C:/"); check_dirname("C:/path", "C:/");
check_dirname("//computername/path/", "//computername/");
check_dirname("//computername/path", "//computername/");
check_dirname("//computername/sub/path/", "//computername/sub");
check_dirname("//computername/sub/path", "//computername/sub");
#endif #endif
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment