void test_core_buffer__10(void) { git_buf a = GIT_BUF_INIT; cl_git_pass(git_buf_join_n(&a, '/', 1, "test")); cl_assert_equal_s(a.ptr, "test"); cl_git_pass(git_buf_join_n(&a, '/', 1, "string")); cl_assert_equal_s(a.ptr, "test/string"); git_buf_clear(&a); cl_git_pass(git_buf_join_n(&a, '/', 3, "test", "string", "join")); cl_assert_equal_s(a.ptr, "test/string/join"); cl_git_pass(git_buf_join_n(&a, '/', 2, a.ptr, "more")); cl_assert_equal_s(a.ptr, "test/string/join/test/string/join/more"); git_buf_free(&a); }
void test_refs_pack__empty(void) { /* create a packfile for an empty folder */ git_buf temp_path = GIT_BUF_INIT; cl_git_pass(git_buf_join_n(&temp_path, '/', 3, git_repository_path(g_repo), GIT_REFS_HEADS_DIR, "empty_dir")); cl_git_pass(git_futils_mkdir_r(temp_path.ptr, NULL, GIT_REFS_DIR_MODE)); git_buf_free(&temp_path); packall(); }
int git_blob_create_fromchunks( git_oid *oid, git_repository *repo, const char *hintpath, int (*source_cb)(char *content, size_t max_length, void *payload), void *payload) { int error = -1, read_bytes; char *content = NULL; git_filebuf file = GIT_FILEBUF_INIT; git_buf path = GIT_BUF_INIT; if (git_buf_join_n( &path, '/', 3, git_repository_path(repo), GIT_OBJECTS_DIR, "streamed") < 0) goto cleanup; content = git__malloc(BUFFER_SIZE); GITERR_CHECK_ALLOC(content); if (git_filebuf_open(&file, git_buf_cstr(&path), GIT_FILEBUF_TEMPORARY) < 0) goto cleanup; while (1) { read_bytes = source_cb(content, BUFFER_SIZE, payload); assert(read_bytes <= BUFFER_SIZE); if (read_bytes <= 0) break; if (git_filebuf_write(&file, content, read_bytes) < 0) goto cleanup; } if (read_bytes < 0) goto cleanup; if (git_filebuf_flush(&file) < 0) goto cleanup; error = blob_create_internal(oid, repo, file.path_lock, hintpath, hintpath != NULL); cleanup: git_buf_free(&path); git_filebuf_cleanup(&file); git__free(content); return error; }
static void check_joinbuf_n_4( const char *a, const char *b, const char *c, const char *d, const char *expected) { char sep = ';'; git_buf buf = GIT_BUF_INIT; git_buf_join_n(&buf, sep, 4, a, b, c, d); cl_assert(git_buf_oom(&buf) == 0); cl_assert_equal_s(expected, git_buf_cstr(&buf)); git_buf_free(&buf); }
static void check_joinpath_n( const char *path_a, const char *path_b, const char *path_c, const char *path_d, const char *expected_path) { git_buf joined_path = GIT_BUF_INIT; cl_git_pass(git_buf_join_n(&joined_path, '/', 4, path_a, path_b, path_c, path_d)); cl_assert_equal_s(expected_path, joined_path.ptr); git_buf_dispose(&joined_path); }
void test_refs_reflog_reflog__reading_the_reflog_from_a_reference_with_no_log_returns_an_empty_one(void) { git_reflog *reflog; const char *refname = "refs/heads/subtrees"; git_buf subtrees_log_path = GIT_BUF_INIT; git_buf_join_n(&subtrees_log_path, '/', 3, git_repository_path(g_repo), GIT_REFLOG_DIR, refname); cl_assert_equal_i(false, git_path_isfile(git_buf_cstr(&subtrees_log_path))); cl_git_pass(git_reflog_read(&reflog, g_repo, refname)); cl_assert_equal_i(0, (int)git_reflog_entrycount(reflog)); git_reflog_free(reflog); git_buf_dispose(&subtrees_log_path); }
int git_reference_has_log( git_reference *ref) { git_buf path = GIT_BUF_INIT; int result; assert(ref); if (git_buf_join_n(&path, '/', 3, ref->db->repo->path_repository, GIT_REFLOG_DIR, ref->name) < 0) return -1; result = git_path_isfile(git_buf_cstr(&path)); git_buf_free(&path); return result; }
static void check_joinbuf_n_2( const char *a, const char *b, const char *expected) { char sep = '/'; git_buf buf = GIT_BUF_INIT; git_buf_sets(&buf, a); cl_assert(git_buf_oom(&buf) == 0); git_buf_join_n(&buf, sep, 1, b); cl_assert(git_buf_oom(&buf) == 0); cl_assert_equal_s(expected, git_buf_cstr(&buf)); git_buf_free(&buf); }
void test_refs_reflog_reflog__reading_a_reflog_with_invalid_format_returns_error(void) { git_reflog *reflog; const git_error *error; const char *refname = "refs/heads/newline"; const char *refmessage = "Reflog*message with a newline and enough content after it to pass the GIT_REFLOG_SIZE_MIN check inside reflog_parse."; git_reference *ref; git_oid id; git_buf logpath = GIT_BUF_INIT, logcontents = GIT_BUF_INIT; char *star; git_oid_fromstr(&id, current_master_tip); /* create a new branch */ cl_git_pass(git_reference_create(&ref, g_repo, refname, &id, 1, refmessage)); /* corrupt the branch reflog by introducing a newline inside the reflog message (we replace '*' with '\n') */ git_buf_join_n(&logpath, '/', 3, git_repository_path(g_repo), GIT_REFLOG_DIR, refname); cl_git_pass(git_futils_readbuffer(&logcontents, git_buf_cstr(&logpath))); cl_assert((star = strchr(git_buf_cstr(&logcontents), '*')) != NULL); *star = '\n'; cl_git_rewritefile(git_buf_cstr(&logpath), git_buf_cstr(&logcontents)); /* confirm that the file was rewritten successfully and now contains a '\n' in the expected location */ cl_git_pass(git_futils_readbuffer(&logcontents, git_buf_cstr(&logpath))); cl_assert(strstr(git_buf_cstr(&logcontents), "Reflog\nmessage") != NULL); /* clear the error state so we can capture the error generated by git_reflog_read */ giterr_clear(); cl_git_fail(git_reflog_read(&reflog, g_repo, refname)); error = giterr_last(); cl_assert(error != NULL); cl_assert_equal_s("unable to parse OID - contains invalid characters", error->message); git_reference_free(ref); git_buf_dispose(&logpath); git_buf_dispose(&logcontents); }
/* test join */ void test_core_buffer__8(void) { git_buf a = GIT_BUF_INIT; git_buf_join_n(&a, '/', 1, "foo"); cl_assert(git_buf_oom(&a) == 0); cl_assert_equal_s("foo", git_buf_cstr(&a)); git_buf_join_n(&a, '/', 1, "bar"); cl_assert(git_buf_oom(&a) == 0); cl_assert_equal_s("foo/bar", git_buf_cstr(&a)); git_buf_join_n(&a, '/', 1, "baz"); cl_assert(git_buf_oom(&a) == 0); cl_assert_equal_s("foo/bar/baz", git_buf_cstr(&a)); git_buf_free(&a); check_joinbuf_2(NULL, "", ""); check_joinbuf_2(NULL, "a", "a"); check_joinbuf_2(NULL, "/a", "/a"); check_joinbuf_2("", "", ""); check_joinbuf_2("", "a", "a"); check_joinbuf_2("", "/a", "/a"); check_joinbuf_2("a", "", "a/"); check_joinbuf_2("a", "/", "a/"); check_joinbuf_2("a", "b", "a/b"); check_joinbuf_2("/", "a", "/a"); check_joinbuf_2("/", "", "/"); check_joinbuf_2("/a", "/b", "/a/b"); check_joinbuf_2("/a", "/b/", "/a/b/"); check_joinbuf_2("/a/", "b/", "/a/b/"); check_joinbuf_2("/a/", "/b/", "/a/b/"); check_joinbuf_2("/a/", "//b/", "/a/b/"); check_joinbuf_2("/abcd", "/defg", "/abcd/defg"); check_joinbuf_2("/abcd", "/defg/", "/abcd/defg/"); check_joinbuf_2("/abcd/", "defg/", "/abcd/defg/"); check_joinbuf_2("/abcd/", "/defg/", "/abcd/defg/"); check_joinbuf_n_2("", "", ""); check_joinbuf_n_2("", "a", "a"); check_joinbuf_n_2("", "/a", "/a"); check_joinbuf_n_2("a", "", "a/"); check_joinbuf_n_2("a", "/", "a/"); check_joinbuf_n_2("a", "b", "a/b"); check_joinbuf_n_2("/", "a", "/a"); check_joinbuf_n_2("/", "", "/"); check_joinbuf_n_2("/a", "/b", "/a/b"); check_joinbuf_n_2("/a", "/b/", "/a/b/"); check_joinbuf_n_2("/a/", "b/", "/a/b/"); check_joinbuf_n_2("/a/", "/b/", "/a/b/"); check_joinbuf_n_2("/abcd", "/defg", "/abcd/defg"); check_joinbuf_n_2("/abcd", "/defg/", "/abcd/defg/"); check_joinbuf_n_2("/abcd/", "defg/", "/abcd/defg/"); check_joinbuf_n_2("/abcd/", "/defg/", "/abcd/defg/"); check_joinbuf_n_4("", "", "", "", ""); check_joinbuf_n_4("", "a", "", "", "a;"); check_joinbuf_n_4("a", "", "", "", "a;"); check_joinbuf_n_4("", "", "", "a", "a"); check_joinbuf_n_4("a", "b", "", ";c;d;", "a;b;c;d;"); check_joinbuf_n_4("a", "b", "", ";c;d", "a;b;c;d"); check_joinbuf_n_4("abcd", "efgh", "ijkl", "mnop", "abcd;efgh;ijkl;mnop"); check_joinbuf_n_4("abcd;", "efgh;", "ijkl;", "mnop;", "abcd;efgh;ijkl;mnop;"); check_joinbuf_n_4(";abcd;", ";efgh;", ";ijkl;", ";mnop;", ";abcd;efgh;ijkl;mnop;"); }
void test_clone_local__hardlinks(void) { git_repository *repo; git_clone_options opts = GIT_CLONE_OPTIONS_INIT; git_buf buf = GIT_BUF_INIT; struct stat st; /* * In this first clone, we just copy over, since the temp dir * will often be in a different filesystem, so we cannot * link. It also allows us to control the number of links */ opts.bare = true; opts.local = GIT_CLONE_LOCAL_NO_LINKS; cl_git_pass(git_clone(&repo, cl_fixture("testrepo.git"), "./clone.git", &opts)); git_repository_free(repo); /* This second clone is in the same filesystem, so we can hardlink */ opts.local = GIT_CLONE_LOCAL; cl_git_pass(git_clone(&repo, cl_git_path_url("clone.git"), "./clone2.git", &opts)); #ifndef GIT_WIN32 git_buf_clear(&buf); cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); cl_git_pass(p_stat(buf.ptr, &st)); cl_assert_equal_i(2, st.st_nlink); #endif git_repository_free(repo); git_buf_clear(&buf); opts.local = GIT_CLONE_LOCAL_NO_LINKS; cl_git_pass(git_clone(&repo, cl_git_path_url("clone.git"), "./clone3.git", &opts)); git_buf_clear(&buf); cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); cl_git_pass(p_stat(buf.ptr, &st)); cl_assert_equal_i(1, st.st_nlink); git_repository_free(repo); /* this one should automatically use links */ cl_git_pass(git_clone(&repo, "./clone.git", "./clone4.git", NULL)); #ifndef GIT_WIN32 git_buf_clear(&buf); cl_git_pass(git_buf_join_n(&buf, '/', 4, git_repository_path(repo), "objects", "08", "b041783f40edfe12bb406c9c9a8a040177c125")); cl_git_pass(p_stat(buf.ptr, &st)); cl_assert_equal_i(3, st.st_nlink); #endif git_buf_free(&buf); git_repository_free(repo); cl_git_pass(git_futils_rmdir_r("./clone.git", NULL, GIT_RMDIR_REMOVE_FILES)); cl_git_pass(git_futils_rmdir_r("./clone2.git", NULL, GIT_RMDIR_REMOVE_FILES)); cl_git_pass(git_futils_rmdir_r("./clone3.git", NULL, GIT_RMDIR_REMOVE_FILES)); cl_git_pass(git_futils_rmdir_r("./clone4.git", NULL, GIT_RMDIR_REMOVE_FILES)); }