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
0cd063fd
Commit
0cd063fd
authored
Nov 15, 2012
by
Scott J. Goldman
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1071 from arrbee/alternate-fix-strcmp
Win32 fixes for diff/checkout/reset
parents
96acc0b6
402b92cf
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
272 additions
and
69 deletions
+272
-69
src/checkout.c
+1
-1
src/diff.c
+4
-4
src/fileops.c
+2
-2
src/pathspec.c
+4
-4
src/unix/posix.h
+3
-0
src/util.c
+30
-0
src/util.h
+5
-0
src/win32/posix.h
+8
-0
src/win32/posix_w32.c
+76
-51
src/win32/utf-conv.c
+4
-4
src/win32/utf-conv.h
+2
-2
tests-clar/core/stat.c
+117
-0
tests-clar/reset/hard.c
+16
-1
No files found.
src/checkout.c
View file @
0cd063fd
...
@@ -282,7 +282,7 @@ static int checkout_confirm_update_blob(
...
@@ -282,7 +282,7 @@ static int checkout_confirm_update_blob(
if
(
git_buf_puts
(
data
->
path
,
delta
->
new_file
.
path
)
<
0
)
if
(
git_buf_puts
(
data
->
path
,
delta
->
new_file
.
path
)
<
0
)
return
-
1
;
return
-
1
;
if
((
error
=
p_
stat
(
git_buf_cstr
(
data
->
path
),
&
st
))
<
0
)
{
if
((
error
=
p_
lstat_posixly
(
git_buf_cstr
(
data
->
path
),
&
st
))
<
0
)
{
if
(
errno
==
ENOENT
)
{
if
(
errno
==
ENOENT
)
{
if
(
update_only
)
if
(
update_only
)
action
=
CHECKOUT_ACTION__NONE
;
action
=
CHECKOUT_ACTION__NONE
;
...
...
src/diff.c
View file @
0cd063fd
...
@@ -554,15 +554,15 @@ static int diff_list_init_from_iterators(
...
@@ -554,15 +554,15 @@ static int diff_list_init_from_iterators(
if
(
!
old_iter
->
ignore_case
&&
!
new_iter
->
ignore_case
)
{
if
(
!
old_iter
->
ignore_case
&&
!
new_iter
->
ignore_case
)
{
diff
->
opts
.
flags
&=
~
GIT_DIFF_DELTAS_ARE_ICASE
;
diff
->
opts
.
flags
&=
~
GIT_DIFF_DELTAS_ARE_ICASE
;
diff
->
strcomp
=
strcmp
;
diff
->
strcomp
=
git__
strcmp
;
diff
->
strncomp
=
strncmp
;
diff
->
strncomp
=
git__
strncmp
;
diff
->
pfxcomp
=
git__prefixcmp
;
diff
->
pfxcomp
=
git__prefixcmp
;
diff
->
entrycomp
=
git_index_entry__cmp
;
diff
->
entrycomp
=
git_index_entry__cmp
;
}
else
{
}
else
{
diff
->
opts
.
flags
|=
GIT_DIFF_DELTAS_ARE_ICASE
;
diff
->
opts
.
flags
|=
GIT_DIFF_DELTAS_ARE_ICASE
;
diff
->
strcomp
=
strcasecmp
;
diff
->
strcomp
=
git__
strcasecmp
;
diff
->
strncomp
=
strncasecmp
;
diff
->
strncomp
=
git__
strncasecmp
;
diff
->
pfxcomp
=
git__prefixcmp_icase
;
diff
->
pfxcomp
=
git__prefixcmp_icase
;
diff
->
entrycomp
=
git_index_entry__cmp_icase
;
diff
->
entrycomp
=
git_index_entry__cmp_icase
;
}
}
...
...
src/fileops.c
View file @
0cd063fd
...
@@ -377,7 +377,7 @@ static int futils__rm_first_parent(git_buf *path, const char *ceiling)
...
@@ -377,7 +377,7 @@ static int futils__rm_first_parent(git_buf *path, const char *ceiling)
if
(
!
path
->
size
||
git__prefixcmp
(
path
->
ptr
,
ceiling
)
!=
0
)
if
(
!
path
->
size
||
git__prefixcmp
(
path
->
ptr
,
ceiling
)
!=
0
)
error
=
0
;
error
=
0
;
else
if
(
p_lstat
(
path
->
ptr
,
&
st
)
==
0
)
{
else
if
(
p_lstat
_posixly
(
path
->
ptr
,
&
st
)
==
0
)
{
if
(
S_ISREG
(
st
.
st_mode
)
||
S_ISLNK
(
st
.
st_mode
))
if
(
S_ISREG
(
st
.
st_mode
)
||
S_ISLNK
(
st
.
st_mode
))
error
=
p_unlink
(
path
->
ptr
);
error
=
p_unlink
(
path
->
ptr
);
else
if
(
!
S_ISDIR
(
st
.
st_mode
))
else
if
(
!
S_ISDIR
(
st
.
st_mode
))
...
@@ -397,7 +397,7 @@ static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path)
...
@@ -397,7 +397,7 @@ static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path)
struct
stat
st
;
struct
stat
st
;
futils__rmdir_data
*
data
=
opaque
;
futils__rmdir_data
*
data
=
opaque
;
if
((
data
->
error
=
p_lstat
(
path
->
ptr
,
&
st
))
<
0
)
{
if
((
data
->
error
=
p_lstat
_posixly
(
path
->
ptr
,
&
st
))
<
0
)
{
if
(
errno
==
ENOENT
)
if
(
errno
==
ENOENT
)
data
->
error
=
0
;
data
->
error
=
0
;
else
if
(
errno
==
ENOTDIR
)
{
else
if
(
errno
==
ENOTDIR
)
{
...
...
src/pathspec.c
View file @
0cd063fd
...
@@ -122,11 +122,11 @@ bool git_pathspec_match_path(
...
@@ -122,11 +122,11 @@ bool git_pathspec_match_path(
fnmatch_flags
=
FNM_CASEFOLD
;
fnmatch_flags
=
FNM_CASEFOLD
;
if
(
casefold
)
{
if
(
casefold
)
{
use_strcmp
=
strcasecmp
;
use_strcmp
=
git__
strcasecmp
;
use_strncmp
=
strncasecmp
;
use_strncmp
=
git__
strncasecmp
;
}
else
{
}
else
{
use_strcmp
=
strcmp
;
use_strcmp
=
git__
strcmp
;
use_strncmp
=
strncmp
;
use_strncmp
=
git__
strncmp
;
}
}
git_vector_foreach
(
vspec
,
i
,
match
)
{
git_vector_foreach
(
vspec
,
i
,
match
)
{
...
...
src/unix/posix.h
View file @
0cd063fd
...
@@ -23,4 +23,7 @@
...
@@ -23,4 +23,7 @@
#define p_setenv(n,v,o) setenv(n,v,o)
#define p_setenv(n,v,o) setenv(n,v,o)
#define p_inet_pton(a, b, c) inet_pton(a, b, c)
#define p_inet_pton(a, b, c) inet_pton(a, b, c)
/* see win32/posix.h for explanation about why this exists */
#define p_lstat_posixly(p,b) lstat(p,b)
#endif
#endif
src/util.c
View file @
0cd063fd
...
@@ -174,6 +174,36 @@ int git__strtol32(int32_t *result, const char *nptr, const char **endptr, int ba
...
@@ -174,6 +174,36 @@ int git__strtol32(int32_t *result, const char *nptr, const char **endptr, int ba
return
error
;
return
error
;
}
}
int
git__strcmp
(
const
char
*
a
,
const
char
*
b
)
{
while
(
*
a
&&
*
b
&&
*
a
==
*
b
)
++
a
,
++
b
;
return
(
int
)(
*
(
const
unsigned
char
*
)
a
)
-
(
int
)(
*
(
const
unsigned
char
*
)
b
);
}
int
git__strcasecmp
(
const
char
*
a
,
const
char
*
b
)
{
while
(
*
a
&&
*
b
&&
tolower
(
*
a
)
==
tolower
(
*
b
))
++
a
,
++
b
;
return
(
tolower
(
*
a
)
-
tolower
(
*
b
));
}
int
git__strncmp
(
const
char
*
a
,
const
char
*
b
,
size_t
sz
)
{
while
(
sz
&&
*
a
&&
*
b
&&
*
a
==
*
b
)
--
sz
,
++
a
,
++
b
;
if
(
!
sz
)
return
0
;
return
(
int
)(
*
(
const
unsigned
char
*
)
a
)
-
(
int
)(
*
(
const
unsigned
char
*
)
b
);
}
int
git__strncasecmp
(
const
char
*
a
,
const
char
*
b
,
size_t
sz
)
{
while
(
sz
&&
*
a
&&
*
b
&&
tolower
(
*
a
)
==
tolower
(
*
b
))
--
sz
,
++
a
,
++
b
;
return
!
sz
?
0
:
(
tolower
(
*
a
)
-
tolower
(
*
b
));
}
void
git__strntolower
(
char
*
str
,
size_t
len
)
void
git__strntolower
(
char
*
str
,
size_t
len
)
{
{
size_t
i
;
size_t
i
;
...
...
src/util.h
View file @
0cd063fd
...
@@ -134,6 +134,11 @@ extern int git__bsearch(
...
@@ -134,6 +134,11 @@ extern int git__bsearch(
extern
int
git__strcmp_cb
(
const
void
*
a
,
const
void
*
b
);
extern
int
git__strcmp_cb
(
const
void
*
a
,
const
void
*
b
);
extern
int
git__strcmp
(
const
char
*
a
,
const
char
*
b
);
extern
int
git__strcasecmp
(
const
char
*
a
,
const
char
*
b
);
extern
int
git__strncmp
(
const
char
*
a
,
const
char
*
b
,
size_t
sz
);
extern
int
git__strncasecmp
(
const
char
*
a
,
const
char
*
b
,
size_t
sz
);
typedef
struct
{
typedef
struct
{
short
refcount
;
short
refcount
;
void
*
owner
;
void
*
owner
;
...
...
src/win32/posix.h
View file @
0cd063fd
...
@@ -50,4 +50,12 @@ extern int p_recv(GIT_SOCKET socket, void *buffer, size_t length, int flags);
...
@@ -50,4 +50,12 @@ extern int p_recv(GIT_SOCKET socket, void *buffer, size_t length, int flags);
extern
int
p_send
(
GIT_SOCKET
socket
,
const
void
*
buffer
,
size_t
length
,
int
flags
);
extern
int
p_send
(
GIT_SOCKET
socket
,
const
void
*
buffer
,
size_t
length
,
int
flags
);
extern
int
p_inet_pton
(
int
af
,
const
char
*
src
,
void
*
dst
);
extern
int
p_inet_pton
(
int
af
,
const
char
*
src
,
void
*
dst
);
/* p_lstat is almost but not quite POSIX correct. Specifically, the use of
* ENOTDIR is wrong, in that it does not mean precisely that a non-directory
* entry was encountered. Making it correct is potentially expensive,
* however, so this is a separate version of p_lstat to use when correct
* POSIX ENOTDIR semantics is required.
*/
extern
int
p_lstat_posixly
(
const
char
*
filename
,
struct
stat
*
buf
);
#endif
#endif
src/win32/posix_w32.c
View file @
0cd063fd
...
@@ -52,17 +52,33 @@ GIT_INLINE(time_t) filetime_to_time_t(const FILETIME *ft)
...
@@ -52,17 +52,33 @@ GIT_INLINE(time_t) filetime_to_time_t(const FILETIME *ft)
return
(
time_t
)
winTime
;
return
(
time_t
)
winTime
;
}
}
static
int
do_lstat
(
const
char
*
file_name
,
struct
stat
*
buf
)
#define WIN32_IS_WSEP(CH) ((CH) == L'/' || (CH) == L'\\')
static
int
do_lstat
(
const
char
*
file_name
,
struct
stat
*
buf
,
int
posix_enotdir
)
{
{
WIN32_FILE_ATTRIBUTE_DATA
fdata
;
WIN32_FILE_ATTRIBUTE_DATA
fdata
;
wchar_t
fbuf
[
GIT_WIN_PATH
];
wchar_t
fbuf
[
GIT_WIN_PATH
]
,
lastch
;
DWORD
last_error
;
DWORD
last_error
;
int
flen
;
flen
=
git__utf8_to_16
(
fbuf
,
GIT_WIN_PATH
,
file_name
);
git__utf8_to_16
(
fbuf
,
GIT_WIN_PATH
,
file_name
);
/* truncate trailing slashes */
for
(;
flen
>
0
;
--
flen
)
{
lastch
=
fbuf
[
flen
-
1
];
if
(
WIN32_IS_WSEP
(
lastch
))
fbuf
[
flen
-
1
]
=
L'\0'
;
else
if
(
lastch
!=
L'\0'
)
break
;
}
if
(
GetFileAttributesExW
(
fbuf
,
GetFileExInfoStandard
,
&
fdata
))
{
if
(
GetFileAttributesExW
(
fbuf
,
GetFileExInfoStandard
,
&
fdata
))
{
int
fMode
=
S_IREAD
;
int
fMode
=
S_IREAD
;
if
(
!
buf
)
return
0
;
if
(
fdata
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
)
if
(
fdata
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
)
fMode
|=
S_IFDIR
;
fMode
|=
S_IFDIR
;
else
else
...
@@ -84,48 +100,61 @@ static int do_lstat(const char *file_name, struct stat *buf)
...
@@ -84,48 +100,61 @@ static int do_lstat(const char *file_name, struct stat *buf)
buf
->
st_atime
=
filetime_to_time_t
(
&
(
fdata
.
ftLastAccessTime
));
buf
->
st_atime
=
filetime_to_time_t
(
&
(
fdata
.
ftLastAccessTime
));
buf
->
st_mtime
=
filetime_to_time_t
(
&
(
fdata
.
ftLastWriteTime
));
buf
->
st_mtime
=
filetime_to_time_t
(
&
(
fdata
.
ftLastWriteTime
));
buf
->
st_ctime
=
filetime_to_time_t
(
&
(
fdata
.
ftCreationTime
));
buf
->
st_ctime
=
filetime_to_time_t
(
&
(
fdata
.
ftCreationTime
));
return
0
;
return
0
;
}
}
last_error
=
GetLastError
();
last_error
=
GetLastError
();
if
(
last_error
==
ERROR_FILE_NOT_FOUND
)
errno
=
ENOENT
;
else
if
(
last_error
==
ERROR_PATH_NOT_FOUND
)
errno
=
ENOTDIR
;
return
-
1
;
/* ERROR_PATH_NOT_FOUND can mean either that a parent directory is
}
* missing or that an expected directory is a regular file. If we need
* POSIX behavior, then ENOTDIR must only be set for the second case
* (i.e. entry that is not a dir), and the first case should be ENOENT.
*/
int
p_lstat
(
const
char
*
file_name
,
struct
stat
*
buf
)
if
(
last_error
==
ERROR_PATH_NOT_FOUND
&&
posix_enotdir
)
{
{
/* scan up path until we find an existing item */
int
error
;
while
(
1
)
{
size_t
namelen
;
/* remove last directory component */
char
*
alt_name
;
for
(
--
flen
;
flen
>
0
&&
!
WIN32_IS_WSEP
(
fbuf
[
flen
]);
--
flen
)
;
if
(
do_lstat
(
file_name
,
buf
)
==
0
)
if
(
flen
<=
0
)
{
return
0
;
last_error
=
ERROR_FILE_NOT_FOUND
;
break
;
}
/* if file_name ended in a '/', Windows returned ENOENT;
fbuf
[
flen
]
=
L'\0'
;
* try again without trailing slashes
*/
namelen
=
strlen
(
file_name
);
if
(
namelen
&&
file_name
[
namelen
-
1
]
!=
'/'
)
return
-
1
;
while
(
namelen
&&
file_name
[
namelen
-
1
]
==
'/'
)
if
(
GetFileAttributesExW
(
fbuf
,
GetFileExInfoStandard
,
&
fdata
))
{
--
namelen
;
if
(
fdata
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
)
last_error
=
ERROR_FILE_NOT_FOUND
;
else
last_error
=
ERROR_PATH_NOT_FOUND
;
break
;
}
if
(
!
namelen
)
last_error
=
GetLastError
();
return
-
1
;
if
(
last_error
==
ERROR_FILE_NOT_FOUND
)
break
;
}
}
if
(
last_error
==
ERROR_FILE_NOT_FOUND
)
errno
=
ENOENT
;
else
if
(
last_error
==
ERROR_PATH_NOT_FOUND
)
errno
=
ENOTDIR
;
alt_name
=
git__strndup
(
file_name
,
namelen
);
if
(
!
alt_name
)
return
-
1
;
return
-
1
;
}
error
=
do_lstat
(
alt_name
,
buf
);
int
p_lstat
(
const
char
*
filename
,
struct
stat
*
buf
)
{
return
do_lstat
(
filename
,
buf
,
0
);
}
git__free
(
alt_name
);
int
p_lstat_posixly
(
const
char
*
filename
,
struct
stat
*
buf
)
return
error
;
{
return
do_lstat
(
filename
,
buf
,
1
);
}
}
int
p_readlink
(
const
char
*
link
,
char
*
target
,
size_t
target_len
)
int
p_readlink
(
const
char
*
link
,
char
*
target
,
size_t
target_len
)
...
@@ -268,7 +297,7 @@ int p_getcwd(char *buffer_out, size_t size)
...
@@ -268,7 +297,7 @@ int p_getcwd(char *buffer_out, size_t size)
int
p_stat
(
const
char
*
path
,
struct
stat
*
buf
)
int
p_stat
(
const
char
*
path
,
struct
stat
*
buf
)
{
{
return
do_lstat
(
path
,
buf
);
return
do_lstat
(
path
,
buf
,
0
);
}
}
int
p_chdir
(
const
char
*
path
)
int
p_chdir
(
const
char
*
path
)
...
@@ -301,46 +330,42 @@ int p_hide_directory__w32(const char *path)
...
@@ -301,46 +330,42 @@ int p_hide_directory__w32(const char *path)
char
*
p_realpath
(
const
char
*
orig_path
,
char
*
buffer
)
char
*
p_realpath
(
const
char
*
orig_path
,
char
*
buffer
)
{
{
int
ret
,
buffer_sz
=
0
;
int
ret
;
wchar_t
orig_path_w
[
GIT_WIN_PATH
];
wchar_t
orig_path_w
[
GIT_WIN_PATH
];
wchar_t
buffer_w
[
GIT_WIN_PATH
];
wchar_t
buffer_w
[
GIT_WIN_PATH
];
git__utf8_to_16
(
orig_path_w
,
GIT_WIN_PATH
,
orig_path
);
git__utf8_to_16
(
orig_path_w
,
GIT_WIN_PATH
,
orig_path
);
/* Implicitly use GetCurrentDirectory which can be a threading issue */
ret
=
GetFullPathNameW
(
orig_path_w
,
GIT_WIN_PATH
,
buffer_w
,
NULL
);
ret
=
GetFullPathNameW
(
orig_path_w
,
GIT_WIN_PATH
,
buffer_w
,
NULL
);
/* According to MSDN, a return value equals to zero means a failure. */
/* According to MSDN, a return value equals to zero means a failure. */
if
(
ret
==
0
||
ret
>
GIT_WIN_PATH
)
{
if
(
ret
==
0
||
ret
>
GIT_WIN_PATH
)
buffer
=
NULL
;
buffer
=
NULL
;
goto
done
;
else
if
(
GetFileAttributesW
(
buffer_w
)
==
INVALID_FILE_ATTRIBUTES
)
{
buffer
=
NULL
;
errno
=
ENOENT
;
}
}
if
(
buffer
==
NULL
)
{
else
if
(
buffer
==
NULL
)
{
buffer_sz
=
WideCharToMultiByte
(
CP_UTF8
,
0
,
buffer_w
,
-
1
,
NULL
,
0
,
NULL
,
NULL
);
int
buffer_sz
=
WideCharToMultiByte
(
CP_UTF8
,
0
,
buffer_w
,
-
1
,
NULL
,
0
,
NULL
,
NULL
);
if
(
!
buffer_sz
||
if
(
!
buffer_sz
||
!
(
buffer
=
(
char
*
)
git__malloc
(
buffer_sz
))
||
!
(
buffer
=
(
char
*
)
git__malloc
(
buffer_sz
))
||
!
WideCharToMultiByte
(
CP_UTF8
,
0
,
buffer_w
,
-
1
,
buffer
,
buffer_sz
,
NULL
,
NULL
))
!
WideCharToMultiByte
(
CP_UTF8
,
0
,
buffer_w
,
-
1
,
buffer
,
buffer_sz
,
NULL
,
NULL
))
{
{
git__free
(
buffer
);
git__free
(
buffer
);
buffer
=
NULL
;
buffer
=
NULL
;
goto
done
;
}
}
else
{
if
(
!
WideCharToMultiByte
(
CP_UTF8
,
0
,
buffer_w
,
-
1
,
buffer
,
GIT_PATH_MAX
,
NULL
,
NULL
))
{
buffer
=
NULL
;
goto
done
;
}
}
}
}
if
(
!
git_path_exists
(
buffer
))
{
else
if
(
!
WideCharToMultiByte
(
if
(
buffer_sz
>
0
)
CP_UTF8
,
0
,
buffer_w
,
-
1
,
buffer
,
GIT_PATH_MAX
,
NULL
,
NULL
))
git__free
(
buffer
);
buffer
=
NULL
;
buffer
=
NULL
;
errno
=
ENOENT
;
}
done
:
if
(
buffer
)
if
(
buffer
)
git_path_mkposix
(
buffer
);
git_path_mkposix
(
buffer
);
...
...
src/win32/utf-conv.c
View file @
0cd063fd
...
@@ -70,12 +70,12 @@ void git__utf8_to_16(wchar_t *dest, size_t length, const char *src)
...
@@ -70,12 +70,12 @@ void git__utf8_to_16(wchar_t *dest, size_t length, const char *src)
}
}
#endif
#endif
void
git__utf8_to_16
(
wchar_t
*
dest
,
size_t
length
,
const
char
*
src
)
int
git__utf8_to_16
(
wchar_t
*
dest
,
size_t
length
,
const
char
*
src
)
{
{
MultiByteToWideChar
(
CP_UTF8
,
0
,
src
,
-
1
,
dest
,
(
int
)
length
);
return
MultiByteToWideChar
(
CP_UTF8
,
0
,
src
,
-
1
,
dest
,
(
int
)
length
);
}
}
void
git__utf16_to_8
(
char
*
out
,
const
wchar_t
*
input
)
int
git__utf16_to_8
(
char
*
out
,
const
wchar_t
*
input
)
{
{
WideCharToMultiByte
(
CP_UTF8
,
0
,
input
,
-
1
,
out
,
GIT_WIN_PATH
,
NULL
,
NULL
);
return
WideCharToMultiByte
(
CP_UTF8
,
0
,
input
,
-
1
,
out
,
GIT_WIN_PATH
,
NULL
,
NULL
);
}
}
src/win32/utf-conv.h
View file @
0cd063fd
...
@@ -12,8 +12,8 @@
...
@@ -12,8 +12,8 @@
#define GIT_WIN_PATH (260 + 1)
#define GIT_WIN_PATH (260 + 1)
void
git__utf8_to_16
(
wchar_t
*
dest
,
size_t
length
,
const
char
*
src
);
int
git__utf8_to_16
(
wchar_t
*
dest
,
size_t
length
,
const
char
*
src
);
void
git__utf16_to_8
(
char
*
dest
,
const
wchar_t
*
src
);
int
git__utf16_to_8
(
char
*
dest
,
const
wchar_t
*
src
);
#endif
#endif
tests-clar/core/stat.c
0 → 100644
View file @
0cd063fd
#include "clar_libgit2.h"
#include "fileops.h"
#include "path.h"
#include "posix.h"
void
test_core_stat__initialize
(
void
)
{
cl_git_pass
(
git_futils_mkdir
(
"root/d1/d2"
,
NULL
,
0755
,
GIT_MKDIR_PATH
));
cl_git_mkfile
(
"root/file"
,
"whatever
\n
"
);
cl_git_mkfile
(
"root/d1/file"
,
"whatever
\n
"
);
}
void
test_core_stat__cleanup
(
void
)
{
git_futils_rmdir_r
(
"root"
,
NULL
,
GIT_RMDIR_REMOVE_FILES
);
}
#ifdef GIT_WIN32
#define cl_assert_last_error(val) \
do { werr = GetLastError(); cl_assert_equal_i((val), (int)werr); } while (0)
#else
#define cl_assert_last_error(val)
#endif
#define cl_assert_error(val) \
do { err = errno; cl_assert_equal_i((val), err); } while (0)
void
test_core_stat__0
(
void
)
{
struct
stat
st
;
int
err
;
#ifdef GIT_WIN32
DWORD
werr
;
#endif
cl_assert_equal_i
(
0
,
p_lstat
(
"root"
,
&
st
));
cl_assert
(
S_ISDIR
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert_equal_i
(
0
,
p_lstat
(
"root/"
,
&
st
));
cl_assert
(
S_ISDIR
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert_equal_i
(
0
,
p_lstat
(
"root/file"
,
&
st
));
cl_assert
(
S_ISREG
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert_equal_i
(
0
,
p_lstat
(
"root/d1"
,
&
st
));
cl_assert
(
S_ISDIR
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert_equal_i
(
0
,
p_lstat
(
"root/d1/"
,
&
st
));
cl_assert
(
S_ISDIR
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert_equal_i
(
0
,
p_lstat
(
"root/d1/file"
,
&
st
));
cl_assert
(
S_ISREG
(
st
.
st_mode
));
cl_assert_last_error
(
0
);
cl_assert_error
(
0
);
cl_assert
(
p_lstat
(
"root/missing"
,
&
st
)
<
0
);
cl_assert_last_error
(
ERROR_FILE_NOT_FOUND
);
cl_assert_error
(
ENOENT
);
cl_assert
(
p_lstat
(
"root/missing/but/could/be/created"
,
&
st
)
<
0
);
cl_assert_last_error
(
ERROR_PATH_NOT_FOUND
);
#ifdef GIT_WIN32
cl_assert_error
(
ENOTDIR
);
#else
cl_assert_error
(
ENOENT
);
#endif
cl_assert
(
p_lstat_posixly
(
"root/missing/but/could/be/created"
,
&
st
)
<
0
);
cl_assert_error
(
ENOENT
);
cl_assert
(
p_lstat
(
"root/d1/missing"
,
&
st
)
<
0
);
cl_assert_last_error
(
ERROR_FILE_NOT_FOUND
);
cl_assert_error
(
ENOENT
);
cl_assert
(
p_lstat
(
"root/d1/missing/deeper/path"
,
&
st
)
<
0
);
cl_assert_last_error
(
ERROR_PATH_NOT_FOUND
);
#ifdef GIT_WIN32
cl_assert_error
(
ENOTDIR
);
#else
cl_assert_error
(
ENOENT
);
#endif
cl_assert
(
p_lstat_posixly
(
"root/d1/missing/deeper/path"
,
&
st
)
<
0
);
cl_assert_error
(
ENOENT
);
cl_assert
(
p_lstat_posixly
(
"root/d1/file/deeper/path"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat
(
"root/file/invalid"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat_posixly
(
"root/file/invalid"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat
(
"root/file/invalid/deeper_path"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat_posixly
(
"root/file/invalid/deeper_path"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat_posixly
(
"root/d1/file/extra"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
cl_assert
(
p_lstat_posixly
(
"root/d1/file/further/invalid/items"
,
&
st
)
<
0
);
cl_assert_error
(
ENOTDIR
);
}
tests-clar/reset/hard.c
View file @
0cd063fd
...
@@ -19,6 +19,21 @@ void test_reset_hard__cleanup(void)
...
@@ -19,6 +19,21 @@ void test_reset_hard__cleanup(void)
cl_git_sandbox_cleanup
();
cl_git_sandbox_cleanup
();
}
}
static
int
strequal_ignore_eol
(
const
char
*
exp
,
const
char
*
str
)
{
while
(
*
exp
&&
*
str
)
{
if
(
*
exp
!=
*
str
)
{
while
(
*
exp
==
'\r'
||
*
exp
==
'\n'
)
++
exp
;
while
(
*
str
==
'\r'
||
*
str
==
'\n'
)
++
str
;
if
(
*
exp
!=
*
str
)
return
false
;
}
else
{
exp
++
;
str
++
;
}
}
return
(
!*
exp
&&
!*
str
);
}
void
test_reset_hard__resetting_reverts_modified_files
(
void
)
void
test_reset_hard__resetting_reverts_modified_files
(
void
)
{
{
git_buf
path
=
GIT_BUF_INIT
,
content
=
GIT_BUF_INIT
;
git_buf
path
=
GIT_BUF_INIT
,
content
=
GIT_BUF_INIT
;
...
@@ -61,7 +76,7 @@ void test_reset_hard__resetting_reverts_modified_files(void)
...
@@ -61,7 +76,7 @@ void test_reset_hard__resetting_reverts_modified_files(void)
cl_git_pass
(
git_buf_joinpath
(
&
path
,
wd
,
files
[
i
]));
cl_git_pass
(
git_buf_joinpath
(
&
path
,
wd
,
files
[
i
]));
if
(
after
[
i
])
{
if
(
after
[
i
])
{
cl_git_pass
(
git_futils_readbuffer
(
&
content
,
path
.
ptr
));
cl_git_pass
(
git_futils_readbuffer
(
&
content
,
path
.
ptr
));
cl_assert
_equal_s
(
after
[
i
],
content
.
ptr
);
cl_assert
(
strequal_ignore_eol
(
after
[
i
],
content
.
ptr
)
);
}
else
{
}
else
{
cl_assert
(
!
git_path_exists
(
path
.
ptr
));
cl_assert
(
!
git_path_exists
(
path
.
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