@@ -105,32 +105,65 @@ GIT_INLINE(void) git_win32__timeval_to_filetime(
105
105
ft -> dwLowDateTime = (ticks & 0xffffffffLL );
106
106
}
107
107
108
- GIT_INLINE (int ) git_win32__file_attribute_to_stat (
108
+ GIT_INLINE (void ) git_win32__stat_init (
109
109
struct stat * st ,
110
- const WIN32_FILE_ATTRIBUTE_DATA * attrdata ,
111
- const wchar_t * path )
110
+ DWORD dwFileAttributes ,
111
+ DWORD nFileSizeHigh ,
112
+ DWORD nFileSizeLow ,
113
+ FILETIME ftCreationTime ,
114
+ FILETIME ftLastAccessTime ,
115
+ FILETIME ftLastWriteTime )
112
116
{
113
117
mode_t mode = S_IREAD ;
114
118
115
- if (attrdata -> dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
119
+ memset (st , 0 , sizeof (struct stat ));
120
+
121
+ if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
116
122
mode |= S_IFDIR ;
117
123
else
118
124
mode |= S_IFREG ;
119
125
120
- if ((attrdata -> dwFileAttributes & FILE_ATTRIBUTE_READONLY ) == 0 )
126
+ if ((dwFileAttributes & FILE_ATTRIBUTE_READONLY ) == 0 )
121
127
mode |= S_IWRITE ;
122
128
123
129
st -> st_ino = 0 ;
124
130
st -> st_gid = 0 ;
125
131
st -> st_uid = 0 ;
126
132
st -> st_nlink = 1 ;
127
133
st -> st_mode = mode ;
128
- st -> st_size = ((git_off_t )attrdata -> nFileSizeHigh << 32 ) + attrdata -> nFileSizeLow ;
134
+ st -> st_size = ((git_off_t )nFileSizeHigh << 32 ) + nFileSizeLow ;
129
135
st -> st_dev = _getdrive () - 1 ;
130
136
st -> st_rdev = st -> st_dev ;
131
- git_win32__filetime_to_timespec (& (attrdata -> ftLastAccessTime ), & (st -> st_atim ));
132
- git_win32__filetime_to_timespec (& (attrdata -> ftLastWriteTime ), & (st -> st_mtim ));
133
- git_win32__filetime_to_timespec (& (attrdata -> ftCreationTime ), & (st -> st_ctim ));
137
+ git_win32__filetime_to_timespec (& ftLastAccessTime , & (st -> st_atim ));
138
+ git_win32__filetime_to_timespec (& ftLastWriteTime , & (st -> st_mtim ));
139
+ git_win32__filetime_to_timespec (& ftCreationTime , & (st -> st_ctim ));
140
+ }
141
+
142
+ GIT_INLINE (void ) git_win32__file_information_to_stat (
143
+ struct stat * st ,
144
+ const BY_HANDLE_FILE_INFORMATION * fileinfo )
145
+ {
146
+ git_win32__stat_init (st ,
147
+ fileinfo -> dwFileAttributes ,
148
+ fileinfo -> nFileSizeHigh ,
149
+ fileinfo -> nFileSizeLow ,
150
+ fileinfo -> ftCreationTime ,
151
+ fileinfo -> ftLastAccessTime ,
152
+ fileinfo -> ftLastWriteTime );
153
+ }
154
+
155
+ GIT_INLINE (int ) git_win32__file_attribute_to_stat (
156
+ struct stat * st ,
157
+ const WIN32_FILE_ATTRIBUTE_DATA * attrdata ,
158
+ const wchar_t * path )
159
+ {
160
+ git_win32__stat_init (st ,
161
+ attrdata -> dwFileAttributes ,
162
+ attrdata -> nFileSizeHigh ,
163
+ attrdata -> nFileSizeLow ,
164
+ attrdata -> ftCreationTime ,
165
+ attrdata -> ftLastAccessTime ,
166
+ attrdata -> ftLastWriteTime );
134
167
135
168
if (attrdata -> dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT && path ) {
136
169
git_win32_path target ;
@@ -139,7 +172,7 @@ GIT_INLINE(int) git_win32__file_attribute_to_stat(
139
172
st -> st_mode = (st -> st_mode & ~S_IFMT ) | S_IFLNK ;
140
173
141
174
/* st_size gets the UTF-8 length of the target name, in bytes,
142
- * not counting the NULL terminator */
175
+ * not counting the NULL terminator */
143
176
if ((st -> st_size = git__utf16_to_8 (NULL , 0 , target )) < 0 ) {
144
177
giterr_set (GITERR_OS , "Could not convert reparse point name for '%s'" , path );
145
178
return -1 ;
0 commit comments