Commit 29960649 by Edward Thomson

win32: remove unnecessary findfile structure

parent ecbb01f5
...@@ -19,16 +19,11 @@ ...@@ -19,16 +19,11 @@
#define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1" #define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
#endif #endif
typedef struct { static int git_win32__expand_path(git_win32_path dest, const wchar_t *src)
git_win32_path path;
DWORD len;
} _findfile_path;
static int git_win32__expand_path(_findfile_path *dest, const wchar_t *src)
{ {
dest->len = ExpandEnvironmentStringsW(src, dest->path, ARRAY_SIZE(dest->path)); DWORD len = ExpandEnvironmentStringsW(src, dest, GIT_WIN_PATH_UTF16);
if (!dest->len || dest->len > ARRAY_SIZE(dest->path)) if (!len || len > GIT_WIN_PATH_UTF16)
return -1; return -1;
return 0; return 0;
...@@ -70,7 +65,7 @@ static wchar_t *win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen) ...@@ -70,7 +65,7 @@ static wchar_t *win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen)
return (path != base) ? path : NULL; return (path != base) ? path : NULL;
} }
static int win32_find_git_for_windows_architecture_root(_findfile_path *root_path, const wchar_t *subdir) static int win32_find_git_for_windows_architecture_root(git_win32_path root_path, const wchar_t *subdir)
{ {
/* Git for Windows >= 2 comes with a special architecture root (mingw64 and mingw32) /* Git for Windows >= 2 comes with a special architecture root (mingw64 and mingw32)
* under which the "share" folder is located, check which we need (none is also ok) */ * under which the "share" folder is located, check which we need (none is also ok) */
...@@ -83,25 +78,27 @@ static int win32_find_git_for_windows_architecture_root(_findfile_path *root_pat ...@@ -83,25 +78,27 @@ static int win32_find_git_for_windows_architecture_root(_findfile_path *root_pat
}; };
const wchar_t **roots = architecture_roots; const wchar_t **roots = architecture_roots;
size_t root_path_len = wcslen(root_path);
for (; *roots != NULL; ++roots) { for (; *roots != NULL; ++roots) {
git_win32_path tmp_root; git_win32_path tmp_root;
DWORD subdir_len; DWORD subdir_len;
if (wcscpy(tmp_root, root_path->path) && if (wcscpy(tmp_root, root_path) &&
root_path->len + wcslen(*roots) <= MAX_PATH && root_path_len + wcslen(*roots) <= MAX_PATH &&
wcscat(tmp_root, *roots) && wcscat(tmp_root, *roots) &&
!_waccess(tmp_root, F_OK)) { !_waccess(tmp_root, F_OK)) {
wcscpy(root_path->path, tmp_root); wcscpy(root_path, tmp_root);
root_path->len += (DWORD)wcslen(*roots); root_path_len += (DWORD)wcslen(*roots);
subdir_len = (DWORD)wcslen(subdir); subdir_len = (DWORD)wcslen(subdir);
if (root_path->len + subdir_len >= MAX_PATH) if (root_path_len + subdir_len >= MAX_PATH)
break; break;
// append subdir and check whether it exists for the Git installation // append subdir and check whether it exists for the Git installation
wcscat(tmp_root, subdir); wcscat(tmp_root, subdir);
if (!_waccess(tmp_root, F_OK)) { if (!_waccess(tmp_root, F_OK)) {
wcscpy(root_path->path, tmp_root); wcscpy(root_path, tmp_root);
root_path->len += subdir_len; root_path_len += subdir_len;
break; break;
} }
} }
...@@ -113,7 +110,7 @@ static int win32_find_git_for_windows_architecture_root(_findfile_path *root_pat ...@@ -113,7 +110,7 @@ static int win32_find_git_for_windows_architecture_root(_findfile_path *root_pat
static int win32_find_git_in_path(git_str *buf, const wchar_t *gitexe, const wchar_t *subdir) static int win32_find_git_in_path(git_str *buf, const wchar_t *gitexe, const wchar_t *subdir)
{ {
wchar_t *path, *env, lastch; wchar_t *path, *env, lastch;
_findfile_path root; git_win32_path root;
size_t gitexe_len = wcslen(gitexe); size_t gitexe_len = wcslen(gitexe);
DWORD len; DWORD len;
bool found = false; bool found = false;
...@@ -133,35 +130,34 @@ static int win32_find_git_in_path(git_str *buf, const wchar_t *gitexe, const wch ...@@ -133,35 +130,34 @@ static int win32_find_git_in_path(git_str *buf, const wchar_t *gitexe, const wch
env = path; env = path;
while ((env = win32_walkpath(env, root.path, MAX_PATH-1)) && *root.path) { while ((env = win32_walkpath(env, root, MAX_PATH-1)) && *root) {
root.len = (DWORD)wcslen(root.path); size_t root_len = wcslen(root);
lastch = root.path[root.len - 1]; lastch = root[root_len - 1];
/* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */ /* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */
if (lastch != L'/' && lastch != L'\\') { if (lastch != L'/' && lastch != L'\\') {
root.path[root.len++] = L'\\'; root[root_len++] = L'\\';
root.path[root.len] = L'\0'; root[root_len] = L'\0';
} }
if (root.len + gitexe_len >= MAX_PATH) if (root_len + gitexe_len >= MAX_PATH)
continue; continue;
wcscpy(&root.path[root.len], gitexe);
if (!_waccess(root.path, F_OK)) { if (!_waccess(root, F_OK)) {
/* check whether we found a Git for Windows installation and do some path adjustments OR just append subdir */ /* check whether we found a Git for Windows installation and do some path adjustments OR just append subdir */
if ((root.len > 5 && wcscmp(root.path - 4, L"cmd\\")) || wcscmp(root.path - 4, L"bin\\")) { if ((root_len > 5 && wcscmp(root - 4, L"cmd\\")) || wcscmp(root - 4, L"bin\\")) {
/* strip "bin" or "cmd" and try to find architecture root for appending subdir */ /* strip "bin" or "cmd" and try to find architecture root for appending subdir */
root.len -= 4; root_len -= 4;
root.path[root.len] = L'\0'; root[root_len] = L'\0';
if (win32_find_git_for_windows_architecture_root(&root, subdir)) if (win32_find_git_for_windows_architecture_root(root, subdir))
continue; continue;
} else { } else {
if (root.len + wcslen(subdir) >= MAX_PATH) if (root_len + wcslen(subdir) >= MAX_PATH)
continue; continue;
wcscat(root.path, subdir); wcscat(root, subdir);
} }
win32_path_to_8(buf, root.path); win32_path_to_8(buf, root);
found = true; found = true;
break; break;
} }
...@@ -181,21 +177,20 @@ static int win32_find_git_in_registry( ...@@ -181,21 +177,20 @@ static int win32_find_git_in_registry(
if (!RegOpenKeyExW(hive, key, 0, KEY_READ, &hKey)) { if (!RegOpenKeyExW(hive, key, 0, KEY_READ, &hKey)) {
DWORD dwType, cbData; DWORD dwType, cbData;
_findfile_path path; git_win32_path path;
/* Ensure that the buffer is big enough to have the suffix attached /* Ensure that the buffer is big enough to have the suffix attached
* after we receive the result. */ * after we receive the result. */
cbData = (DWORD)(sizeof(path) - wcslen(subdir) * sizeof(wchar_t)); cbData = (DWORD)(sizeof(path) - wcslen(subdir) * sizeof(wchar_t));
/* InstallLocation points to the root of the git directory */ /* InstallLocation points to the root of the git directory */
if (!RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType, (LPBYTE)path.path, &cbData) && if (!RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType, (LPBYTE)path, &cbData) &&
dwType == REG_SZ) { dwType == REG_SZ) {
path.len = cbData;
/* Convert to UTF-8, with forward slashes, and output the path /* Convert to UTF-8, with forward slashes, and output the path
* to the provided buffer */ * to the provided buffer */
if (!win32_find_git_for_windows_architecture_root(&path, subdir) && if (!win32_find_git_for_windows_architecture_root(path, subdir) &&
!win32_path_to_8(buf, path.path)) !win32_path_to_8(buf, path))
error = 0; error = 0;
} }
...@@ -208,17 +203,17 @@ static int win32_find_git_in_registry( ...@@ -208,17 +203,17 @@ static int win32_find_git_in_registry(
static int win32_find_existing_dirs( static int win32_find_existing_dirs(
git_str *out, const wchar_t *tmpl[]) git_str *out, const wchar_t *tmpl[])
{ {
_findfile_path path16; git_win32_path path16;
git_str buf = GIT_STR_INIT; git_str buf = GIT_STR_INIT;
git_str_clear(out); git_str_clear(out);
for (; *tmpl != NULL; tmpl++) { for (; *tmpl != NULL; tmpl++) {
if (!git_win32__expand_path(&path16, *tmpl) && if (!git_win32__expand_path(path16, *tmpl) &&
path16.path[0] != L'%' && path16[0] != L'%' &&
!_waccess(path16.path, F_OK)) !_waccess(path16, F_OK))
{ {
win32_path_to_8(&buf, path16.path); win32_path_to_8(&buf, path16);
if (buf.size) if (buf.size)
git_str_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr); git_str_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
......
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