diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/filebuf.c | 2 | ||||
-rw-r--r-- | src/fileops.c | 25 | ||||
-rw-r--r-- | src/posix.c | 14 | ||||
-rw-r--r-- | src/posix.h | 1 | ||||
-rw-r--r-- | src/win32/posix.h | 1 | ||||
-rw-r--r-- | src/win32/posix_w32.c | 14 |
6 files changed, 32 insertions, 25 deletions
diff --git a/src/filebuf.c b/src/filebuf.c index 1a3fe6d9b..199418032 100644 --- a/src/filebuf.c +++ b/src/filebuf.c @@ -278,7 +278,7 @@ int git_filebuf_commit(git_filebuf *file, mode_t mode) goto cleanup; } - error = git_futils_mv_atomic(file->path_lock, file->path_original); + error = p_rename(file->path_lock, file->path_original); cleanup: git_filebuf_cleanup(file); diff --git a/src/fileops.c b/src/fileops.c index 2030c786d..955bb1bf6 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -8,29 +8,6 @@ #include "fileops.h" #include <ctype.h> -int git_futils_mv_atomic(const char *from, const char *to) -{ -#ifdef GIT_WIN32 - /* - * Win32 POSIX compilance my ass. If the destination - * file exists, the `rename` call fails. This is as - * close as it gets with the Win32 API. - */ - return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) ? GIT_SUCCESS : GIT_EOSERR; -#else - /* Don't even try this on Win32 */ - if (!link(from, to)) { - p_unlink(from); - return GIT_SUCCESS; - } - - if (!rename(from, to)) - return GIT_SUCCESS; - - return GIT_ERROR; -#endif -} - int git_futils_mkpath2file(const char *file_path, const mode_t mode) { int error = GIT_SUCCESS; @@ -216,7 +193,7 @@ int git_futils_mv_withpath(const char *from, const char *to, const mode_t dirmod if (git_futils_mkpath2file(to, dirmode) < GIT_SUCCESS) return GIT_EOSERR; /* The callee already takes care of setting the correct error message. */ - return git_futils_mv_atomic(from, to); /* The callee already takes care of setting the correct error message. */ + return p_rename(from, to); /* The callee already takes care of setting the correct error message. */ } int git_futils_mmap_ro(git_map *out, git_file fd, git_off_t begin, size_t len) diff --git a/src/posix.c b/src/posix.c index 7cd0749b6..8c19588ee 100644 --- a/src/posix.c +++ b/src/posix.c @@ -39,6 +39,20 @@ int p_getcwd(char *buffer_out, size_t size) return GIT_SUCCESS; } +int p_rename(const char *from, const char *to) +{ + if (!link(from, to)) { + p_unlink(from); + return GIT_SUCCESS; + } + + if (!rename(from, to)) + return GIT_SUCCESS; + + return GIT_ERROR; + +} + #endif int p_read(git_file fd, void *buf, size_t cnt) diff --git a/src/posix.h b/src/posix.h index 55cd35a38..c12b41364 100644 --- a/src/posix.h +++ b/src/posix.h @@ -45,6 +45,7 @@ extern int p_write(git_file fd, const void *buf, size_t cnt); extern int p_open(const char *path, int flags); extern int p_creat(const char *path, mode_t mode); extern int p_getcwd(char *buffer_out, size_t size); +extern int p_rename(const char *from, const char *to); #ifndef GIT_WIN32 diff --git a/src/win32/posix.h b/src/win32/posix.h index 7b5553061..ae6323679 100644 --- a/src/win32/posix.h +++ b/src/win32/posix.h @@ -48,5 +48,6 @@ extern int p_fsync(int fd); extern int p_open(const char *path, int flags); extern int p_creat(const char *path, mode_t mode); extern int p_getcwd(char *buffer_out, size_t size); +extern int p_rename(const char *from, const char *to); #endif diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 4b1b0074d..6f722581e 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -388,3 +388,17 @@ int p_access(const char* path, mode_t mode) return ret; } + +extern int p_rename(const char *from, const char *to) +{ + wchar_t *wfrom = gitwin_to_utf16(from); + wchar_t *wto = gitwin_to_utf16(to); + int ret; + + ret = MoveFileExW(wfrom, wto, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) ? GIT_SUCCESS : GIT_EOSERR; + + git__free(wfrom); + git__free(wto); + + return ret; +} |