diff --git a/src/fileops.c b/src/fileops.c index 581dc350d..3d35c193f 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -105,6 +105,19 @@ void gitfo_free_buf(gitfo_buf *obj) obj->data = NULL; } +int gitfo_move_file(char *from, char *to) +{ + if (!link(from, to)) { + gitfo_unlink(from); + return GIT_SUCCESS; + } + + if (!rename(from, to)) + return GIT_SUCCESS; + + return git_os_error(); +} + int gitfo_map_ro(git_map *out, git_file fd, off_t begin, size_t len) { if (git__mmap(out, len, GIT_PROT_READ, GIT_MAP_SHARED, fd, begin) < 0) diff --git a/src/fileops.h b/src/fileops.h index 568464205..175396917 100644 --- a/src/fileops.h +++ b/src/fileops.h @@ -69,6 +69,7 @@ extern off_t gitfo_size(git_file fd); extern int gitfo_read_file(gitfo_buf *obj, const char *path); extern void gitfo_free_buf(gitfo_buf *obj); +extern int gitfo_move_file(char *from, char *to); #define gitfo_unlink(p) unlink(p) #define gitfo_rmdir(p) rmdir(p)