mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-04 18:13:39 +00:00

Untangle git_futils_mkdir from git_futils_mkdir_ext - the latter assumes that we own everything beneath the base, as if it were being called with a base of the repository or working directory, and is tailored towards checkout and ensuring that there is no bogosity beneath the base that must be cleaned up. This is (at best) slow and (at worst) unsafe in the larger context of a filesystem where we do not own things and cannot do things like unlink symlinks that are in our way.
153 lines
4.3 KiB
C
153 lines
4.3 KiB
C
#include "clar_libgit2.h"
|
|
#include "fileops.h"
|
|
#include "path.h"
|
|
#include "posix.h"
|
|
|
|
void test_core_copy__file(void)
|
|
{
|
|
struct stat st;
|
|
const char *content = "This is some stuff to copy\n";
|
|
|
|
cl_git_mkfile("copy_me", content);
|
|
|
|
cl_git_pass(git_futils_cp("copy_me", "copy_me_two", 0664));
|
|
|
|
cl_git_pass(git_path_lstat("copy_me_two", &st));
|
|
cl_assert(S_ISREG(st.st_mode));
|
|
cl_assert(strlen(content) == (size_t)st.st_size);
|
|
|
|
cl_git_pass(p_unlink("copy_me_two"));
|
|
cl_git_pass(p_unlink("copy_me"));
|
|
}
|
|
|
|
void test_core_copy__file_in_dir(void)
|
|
{
|
|
struct stat st;
|
|
const char *content = "This is some other stuff to copy\n";
|
|
|
|
cl_git_pass(git_futils_mkdir("an_dir/in_a_dir", 0775, GIT_MKDIR_PATH));
|
|
cl_git_mkfile("an_dir/in_a_dir/copy_me", content);
|
|
cl_assert(git_path_isdir("an_dir"));
|
|
|
|
cl_git_pass(git_futils_mkpath2file
|
|
("an_dir/second_dir/and_more/copy_me_two", 0775));
|
|
|
|
cl_git_pass(git_futils_cp
|
|
("an_dir/in_a_dir/copy_me",
|
|
"an_dir/second_dir/and_more/copy_me_two",
|
|
0664));
|
|
|
|
cl_git_pass(git_path_lstat("an_dir/second_dir/and_more/copy_me_two", &st));
|
|
cl_assert(S_ISREG(st.st_mode));
|
|
cl_assert(strlen(content) == (size_t)st.st_size);
|
|
|
|
cl_git_pass(git_futils_rmdir_r("an_dir", NULL, GIT_RMDIR_REMOVE_FILES));
|
|
cl_assert(!git_path_isdir("an_dir"));
|
|
}
|
|
|
|
void assert_hard_link(const char *path)
|
|
{
|
|
/* we assert this by checking that there's more than one link to the file */
|
|
struct stat st;
|
|
|
|
cl_assert(git_path_isfile(path));
|
|
cl_git_pass(p_stat(path, &st));
|
|
cl_assert(st.st_nlink > 1);
|
|
}
|
|
|
|
void test_core_copy__tree(void)
|
|
{
|
|
struct stat st;
|
|
const char *content = "File content\n";
|
|
|
|
cl_git_pass(git_futils_mkdir("src/b", 0775, GIT_MKDIR_PATH));
|
|
cl_git_pass(git_futils_mkdir("src/c/d", 0775, GIT_MKDIR_PATH));
|
|
cl_git_pass(git_futils_mkdir("src/c/e", 0775, GIT_MKDIR_PATH));
|
|
|
|
cl_git_mkfile("src/f1", content);
|
|
cl_git_mkfile("src/b/f2", content);
|
|
cl_git_mkfile("src/c/f3", content);
|
|
cl_git_mkfile("src/c/d/f4", content);
|
|
cl_git_mkfile("src/c/d/.f5", content);
|
|
|
|
#ifndef GIT_WIN32
|
|
cl_assert(p_symlink("../../b/f2", "src/c/d/l1") == 0);
|
|
#endif
|
|
|
|
cl_assert(git_path_isdir("src"));
|
|
cl_assert(git_path_isdir("src/b"));
|
|
cl_assert(git_path_isdir("src/c/d"));
|
|
cl_assert(git_path_isfile("src/c/d/f4"));
|
|
|
|
/* copy with no empty dirs, yes links, no dotfiles, no overwrite */
|
|
|
|
cl_git_pass(
|
|
git_futils_cp_r("src", "t1", GIT_CPDIR_COPY_SYMLINKS, 0) );
|
|
|
|
cl_assert(git_path_isdir("t1"));
|
|
cl_assert(git_path_isdir("t1/b"));
|
|
cl_assert(git_path_isdir("t1/c"));
|
|
cl_assert(git_path_isdir("t1/c/d"));
|
|
cl_assert(!git_path_isdir("t1/c/e"));
|
|
|
|
cl_assert(git_path_isfile("t1/f1"));
|
|
cl_assert(git_path_isfile("t1/b/f2"));
|
|
cl_assert(git_path_isfile("t1/c/f3"));
|
|
cl_assert(git_path_isfile("t1/c/d/f4"));
|
|
cl_assert(!git_path_isfile("t1/c/d/.f5"));
|
|
|
|
cl_git_pass(git_path_lstat("t1/c/f3", &st));
|
|
cl_assert(S_ISREG(st.st_mode));
|
|
cl_assert(strlen(content) == (size_t)st.st_size);
|
|
|
|
#ifndef GIT_WIN32
|
|
cl_git_pass(git_path_lstat("t1/c/d/l1", &st));
|
|
cl_assert(S_ISLNK(st.st_mode));
|
|
#endif
|
|
|
|
cl_git_pass(git_futils_rmdir_r("t1", NULL, GIT_RMDIR_REMOVE_FILES));
|
|
cl_assert(!git_path_isdir("t1"));
|
|
|
|
/* copy with empty dirs, no links, yes dotfiles, no overwrite */
|
|
|
|
cl_git_pass(
|
|
git_futils_cp_r("src", "t2", GIT_CPDIR_CREATE_EMPTY_DIRS | GIT_CPDIR_COPY_DOTFILES, 0) );
|
|
|
|
cl_assert(git_path_isdir("t2"));
|
|
cl_assert(git_path_isdir("t2/b"));
|
|
cl_assert(git_path_isdir("t2/c"));
|
|
cl_assert(git_path_isdir("t2/c/d"));
|
|
cl_assert(git_path_isdir("t2/c/e"));
|
|
|
|
cl_assert(git_path_isfile("t2/f1"));
|
|
cl_assert(git_path_isfile("t2/b/f2"));
|
|
cl_assert(git_path_isfile("t2/c/f3"));
|
|
cl_assert(git_path_isfile("t2/c/d/f4"));
|
|
cl_assert(git_path_isfile("t2/c/d/.f5"));
|
|
|
|
#ifndef GIT_WIN32
|
|
cl_git_fail(git_path_lstat("t2/c/d/l1", &st));
|
|
#endif
|
|
|
|
cl_git_pass(git_futils_rmdir_r("t2", NULL, GIT_RMDIR_REMOVE_FILES));
|
|
cl_assert(!git_path_isdir("t2"));
|
|
|
|
#ifndef GIT_WIN32
|
|
cl_git_pass(git_futils_cp_r("src", "t3", GIT_CPDIR_CREATE_EMPTY_DIRS | GIT_CPDIR_LINK_FILES, 0));
|
|
cl_assert(git_path_isdir("t3"));
|
|
|
|
cl_assert(git_path_isdir("t3"));
|
|
cl_assert(git_path_isdir("t3/b"));
|
|
cl_assert(git_path_isdir("t3/c"));
|
|
cl_assert(git_path_isdir("t3/c/d"));
|
|
cl_assert(git_path_isdir("t3/c/e"));
|
|
|
|
assert_hard_link("t3/f1");
|
|
assert_hard_link("t3/b/f2");
|
|
assert_hard_link("t3/c/f3");
|
|
assert_hard_link("t3/c/d/f4");
|
|
#endif
|
|
|
|
cl_git_pass(git_futils_rmdir_r("src", NULL, GIT_RMDIR_REMOVE_FILES));
|
|
}
|