Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
29960649
Commit
29960649
authored
Jan 15, 2022
by
Edward Thomson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
win32: remove unnecessary findfile structure
parent
ecbb01f5
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
37 additions
and
42 deletions
+37
-42
src/win32/findfile.c
+37
-42
No files found.
src/win32/findfile.c
View file @
29960649
...
...
@@ -19,16 +19,11 @@
#define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
#endif
typedef
struct
{
git_win32_path
path
;
DWORD
len
;
}
_findfile_path
;
static
int
git_win32__expand_path
(
_findfile_path
*
dest
,
const
wchar_t
*
src
)
static
int
git_win32__expand_path
(
git_win32_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
0
;
...
...
@@ -70,7 +65,7 @@ static wchar_t *win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen)
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)
* 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
};
const
wchar_t
**
roots
=
architecture_roots
;
size_t
root_path_len
=
wcslen
(
root_path
);
for
(;
*
roots
!=
NULL
;
++
roots
)
{
git_win32_path
tmp_root
;
DWORD
subdir_len
;
if
(
wcscpy
(
tmp_root
,
root_path
->
path
)
&&
root_path
->
len
+
wcslen
(
*
roots
)
<=
MAX_PATH
&&
if
(
wcscpy
(
tmp_root
,
root_path
)
&&
root_path
_
len
+
wcslen
(
*
roots
)
<=
MAX_PATH
&&
wcscat
(
tmp_root
,
*
roots
)
&&
!
_waccess
(
tmp_root
,
F_OK
))
{
wcscpy
(
root_path
->
path
,
tmp_root
);
root_path
->
len
+=
(
DWORD
)
wcslen
(
*
roots
);
wcscpy
(
root_path
,
tmp_root
);
root_path
_
len
+=
(
DWORD
)
wcslen
(
*
roots
);
subdir_len
=
(
DWORD
)
wcslen
(
subdir
);
if
(
root_path
->
len
+
subdir_len
>=
MAX_PATH
)
if
(
root_path
_
len
+
subdir_len
>=
MAX_PATH
)
break
;
// append subdir and check whether it exists for the Git installation
wcscat
(
tmp_root
,
subdir
);
if
(
!
_waccess
(
tmp_root
,
F_OK
))
{
wcscpy
(
root_path
->
path
,
tmp_root
);
root_path
->
len
+=
subdir_len
;
wcscpy
(
root_path
,
tmp_root
);
root_path
_
len
+=
subdir_len
;
break
;
}
}
...
...
@@ -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
)
{
wchar_t
*
path
,
*
env
,
lastch
;
_findfile
_path
root
;
git_win32
_path
root
;
size_t
gitexe_len
=
wcslen
(
gitexe
);
DWORD
len
;
bool
found
=
false
;
...
...
@@ -133,35 +130,34 @@ static int win32_find_git_in_path(git_str *buf, const wchar_t *gitexe, const wch
env
=
path
;
while
((
env
=
win32_walkpath
(
env
,
root
.
path
,
MAX_PATH
-
1
))
&&
*
root
.
path
)
{
root
.
len
=
(
DWORD
)
wcslen
(
root
.
path
);
lastch
=
root
.
path
[
root
.
len
-
1
];
while
((
env
=
win32_walkpath
(
env
,
root
,
MAX_PATH
-
1
))
&&
*
root
)
{
size_t
root_len
=
wcslen
(
root
);
lastch
=
root
[
root_
len
-
1
];
/* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */
if
(
lastch
!=
L'/'
&&
lastch
!=
L'\\'
)
{
root
.
path
[
root
.
len
++
]
=
L'\\'
;
root
.
path
[
root
.
len
]
=
L'\0'
;
root
[
root_
len
++
]
=
L'\\'
;
root
[
root_
len
]
=
L'\0'
;
}
if
(
root
.
len
+
gitexe_len
>=
MAX_PATH
)
if
(
root
_
len
+
gitexe_len
>=
MAX_PATH
)
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 */
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 */
root
.
len
-=
4
;
root
.
path
[
root
.
len
]
=
L'\0'
;
if
(
win32_find_git_for_windows_architecture_root
(
&
root
,
subdir
))
root
_
len
-=
4
;
root
[
root_
len
]
=
L'\0'
;
if
(
win32_find_git_for_windows_architecture_root
(
root
,
subdir
))
continue
;
}
else
{
if
(
root
.
len
+
wcslen
(
subdir
)
>=
MAX_PATH
)
if
(
root
_
len
+
wcslen
(
subdir
)
>=
MAX_PATH
)
continue
;
wcscat
(
root
.
path
,
subdir
);
wcscat
(
root
,
subdir
);
}
win32_path_to_8
(
buf
,
root
.
path
);
win32_path_to_8
(
buf
,
root
);
found
=
true
;
break
;
}
...
...
@@ -181,21 +177,20 @@ static int win32_find_git_in_registry(
if
(
!
RegOpenKeyExW
(
hive
,
key
,
0
,
KEY_READ
,
&
hKey
))
{
DWORD
dwType
,
cbData
;
_findfile
_path
path
;
git_win32
_path
path
;
/* Ensure that the buffer is big enough to have the suffix attached
* after we receive the result. */
cbData
=
(
DWORD
)(
sizeof
(
path
)
-
wcslen
(
subdir
)
*
sizeof
(
wchar_t
));
/* 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
)
{
path
.
len
=
cbData
;
/* Convert to UTF-8, with forward slashes, and output the path
* to the provided buffer */
if
(
!
win32_find_git_for_windows_architecture_root
(
&
path
,
subdir
)
&&
!
win32_path_to_8
(
buf
,
path
.
path
))
if
(
!
win32_find_git_for_windows_architecture_root
(
path
,
subdir
)
&&
!
win32_path_to_8
(
buf
,
path
))
error
=
0
;
}
...
...
@@ -208,17 +203,17 @@ static int win32_find_git_in_registry(
static
int
win32_find_existing_dirs
(
git_str
*
out
,
const
wchar_t
*
tmpl
[])
{
_findfile
_path
path16
;
git_win32
_path
path16
;
git_str
buf
=
GIT_STR_INIT
;
git_str_clear
(
out
);
for
(;
*
tmpl
!=
NULL
;
tmpl
++
)
{
if
(
!
git_win32__expand_path
(
&
path16
,
*
tmpl
)
&&
path16
.
path
[
0
]
!=
L'%'
&&
!
_waccess
(
path16
.
path
,
F_OK
))
if
(
!
git_win32__expand_path
(
path16
,
*
tmpl
)
&&
path16
[
0
]
!=
L'%'
&&
!
_waccess
(
path16
,
F_OK
))
{
win32_path_to_8
(
&
buf
,
path16
.
path
);
win32_path_to_8
(
&
buf
,
path16
);
if
(
buf
.
size
)
git_str_join
(
out
,
GIT_PATH_LIST_SEPARATOR
,
out
->
ptr
,
buf
.
ptr
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment