mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-20 06:54:32 +00:00
Merge remote-tracking branch 'drizzd/diff-index-tests' into development
Conflicts: tests-clay/clay.h tests-clay/clay_main.c
This commit is contained in:
commit
7a704309ae
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
/tests-clay/clay.h
|
||||
/tests-clay/clay_main.c
|
||||
/apidocs
|
||||
/trash-*.exe
|
||||
/libgit2.pc
|
||||
|
@ -49,6 +49,7 @@ OPTION (BUILD_SHARED_LIBS "Build Shared Library (OFF for Static)" ON)
|
||||
OPTION (THREADSAFE "Build libgit2 as threadsafe" OFF)
|
||||
OPTION (BUILD_TESTS "Build Tests" ON)
|
||||
OPTION (BUILD_CLAY "Build Tests using the Clay suite" OFF)
|
||||
OPTION (TAGS "Generate tags" OFF)
|
||||
|
||||
# Platform specific compilation flags
|
||||
IF (MSVC)
|
||||
@ -91,7 +92,7 @@ FILE(GLOB SRC_H include/git2/*.h)
|
||||
|
||||
# On Windows use specific platform sources
|
||||
IF (WIN32 AND NOT CYGWIN)
|
||||
ADD_DEFINITIONS(-DWIN32 -D_DEBUG)
|
||||
ADD_DEFINITIONS(-DWIN32 -D_DEBUG)
|
||||
FILE(GLOB SRC src/*.c src/transports/*.c src/win32/*.c)
|
||||
ELSE()
|
||||
FILE(GLOB SRC src/*.c src/transports/*.c src/unix/*.c)
|
||||
@ -113,9 +114,9 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libgit2.pc.in ${CMAKE_CURRENT_BINARY_
|
||||
|
||||
# Install
|
||||
INSTALL(TARGETS git2
|
||||
RUNTIME DESTINATION ${INSTALL_BIN}
|
||||
LIBRARY DESTINATION ${INSTALL_LIB}
|
||||
ARCHIVE DESTINATION ${INSTALL_LIB}
|
||||
RUNTIME DESTINATION ${INSTALL_BIN}
|
||||
LIBRARY DESTINATION ${INSTALL_LIB}
|
||||
ARCHIVE DESTINATION ${INSTALL_LIB}
|
||||
)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/libgit2.pc DESTINATION ${INSTALL_LIB}/pkgconfig )
|
||||
INSTALL(DIRECTORY include/git2 DESTINATION ${INSTALL_INC} )
|
||||
@ -126,7 +127,7 @@ IF (BUILD_TESTS)
|
||||
SET(TEST_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/tests/resources" CACHE PATH "Path to test resources.")
|
||||
ADD_DEFINITIONS(-DTEST_RESOURCES=\"${TEST_RESOURCES}\")
|
||||
|
||||
INCLUDE_DIRECTORIES(tests)
|
||||
INCLUDE_DIRECTORIES(tests)
|
||||
FILE(GLOB SRC_TEST tests/t??-*.c)
|
||||
|
||||
ADD_EXECUTABLE(libgit2_test tests/test_main.c tests/test_lib.c tests/test_helpers.c ${SRC} ${SRC_TEST} ${SRC_ZLIB} ${SRC_HTTP})
|
||||
@ -142,13 +143,22 @@ IF (BUILD_TESTS)
|
||||
ENDIF ()
|
||||
|
||||
IF (BUILD_CLAY)
|
||||
FIND_PACKAGE(PythonInterp REQUIRED)
|
||||
|
||||
SET(CLAY_FIXTURES "${CMAKE_CURRENT_SOURCE_DIR}/tests/resources/")
|
||||
SET(CLAY_PATH "${CMAKE_CURRENT_SOURCE_DIR}/tests-clay")
|
||||
ADD_DEFINITIONS(-DCLAY_FIXTURE_PATH=\"${CLAY_FIXTURES}\")
|
||||
|
||||
INCLUDE_DIRECTORIES(tests-clay)
|
||||
FILE(GLOB_RECURSE SRC_TEST tests-clay/*.c)
|
||||
INCLUDE_DIRECTORIES(${CLAY_PATH})
|
||||
FILE(GLOB_RECURSE SRC_TEST ${CLAY_PATH}/*/*.c ${CLAY_PATH}/clay_helpers.c ${CLAY_PATH}/testlib.c)
|
||||
|
||||
ADD_EXECUTABLE(libgit2_clay ${SRC} ${SRC_TEST} ${SRC_ZLIB} ${SRC_HTTP})
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT ${CLAY_PATH}/clay_main.c ${CLAY_PATH}/clay.h
|
||||
COMMAND ${PYTHON_EXECUTABLE} clay -vtap .
|
||||
DEPENDS ${CLAY_PATH}/clay ${SRC_TEST}
|
||||
WORKING_DIRECTORY ${CLAY_PATH}
|
||||
)
|
||||
ADD_EXECUTABLE(libgit2_clay ${SRC} ${CLAY_PATH}/clay_main.c ${SRC_TEST} ${SRC_ZLIB} ${SRC_HTTP})
|
||||
TARGET_LINK_LIBRARIES(libgit2_clay ${CMAKE_THREAD_LIBS_INIT})
|
||||
IF (WIN32)
|
||||
TARGET_LINK_LIBRARIES(libgit2_clay ws2_32)
|
||||
@ -159,3 +169,22 @@ IF (BUILD_CLAY)
|
||||
ENABLE_TESTING()
|
||||
ADD_TEST(libgit2_clay libgit2_clay)
|
||||
ENDIF ()
|
||||
|
||||
IF (TAGS)
|
||||
FIND_PROGRAM(CTAGS ctags)
|
||||
IF (NOT CTAGS)
|
||||
message(FATAL_ERROR "Could not find ctags command")
|
||||
ENDIF ()
|
||||
|
||||
FILE(GLOB_RECURSE SRC_ALL *.[ch])
|
||||
|
||||
ADD_CUSTOM_COMMAND(
|
||||
OUTPUT tags
|
||||
COMMAND ${CTAGS} -a ${SRC_ALL}
|
||||
DEPENDS ${SRC_ALL}
|
||||
)
|
||||
ADD_CUSTOM_TARGET(
|
||||
do_tags ALL
|
||||
DEPENDS tags
|
||||
)
|
||||
ENDIF ()
|
||||
|
@ -301,6 +301,17 @@ GIT_EXTERN(const git_index_entry_unmerged *) git_index_get_unmerged_byindex(git_
|
||||
*/
|
||||
GIT_EXTERN(int) git_index_entry_stage(const git_index_entry *entry);
|
||||
|
||||
/**
|
||||
* Read a tree into the index file
|
||||
*
|
||||
* The current index contents will be replaced by the specified tree.
|
||||
*
|
||||
* @param index an existing index object
|
||||
* @param tree tree to read
|
||||
* @return GIT_SUCCESS or an error code
|
||||
*/
|
||||
GIT_EXTERN(int) git_index_read_tree(git_index *index, git_tree *tree);
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
#endif
|
||||
|
42
src/index.c
42
src/index.c
@ -10,6 +10,7 @@
|
||||
#include "common.h"
|
||||
#include "repository.h"
|
||||
#include "index.h"
|
||||
#include "tree.h"
|
||||
#include "tree-cache.h"
|
||||
#include "hash.h"
|
||||
#include "git2/odb.h"
|
||||
@ -936,3 +937,44 @@ int git_index_entry_stage(const git_index_entry *entry)
|
||||
{
|
||||
return (entry->flags & GIT_IDXENTRY_STAGEMASK) >> GIT_IDXENTRY_STAGESHIFT;
|
||||
}
|
||||
|
||||
static int read_tree_cb(const char *root, git_tree_entry *tentry, void *data)
|
||||
{
|
||||
int ret = GIT_SUCCESS;
|
||||
git_index *index = data;
|
||||
git_index_entry *entry = NULL;
|
||||
git_buf path = GIT_BUF_INIT;
|
||||
|
||||
if (entry_is_tree(tentry))
|
||||
goto exit;
|
||||
|
||||
ret = git_buf_joinpath(&path, root, tentry->filename);
|
||||
if (ret < GIT_SUCCESS)
|
||||
goto exit;
|
||||
|
||||
entry = git__calloc(1, sizeof(git_index_entry));
|
||||
if (!entry) {
|
||||
ret = GIT_ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
entry->mode = tentry->attr;
|
||||
entry->oid = tentry->oid;
|
||||
entry->path = git_buf_detach(&path);
|
||||
|
||||
ret = index_insert(index, entry, 0);
|
||||
|
||||
exit:
|
||||
git_buf_free(&path);
|
||||
|
||||
if (ret < GIT_SUCCESS)
|
||||
index_entry_free(entry);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int git_index_read_tree(git_index *index, git_tree *tree)
|
||||
{
|
||||
git_index_clear(index);
|
||||
|
||||
return git_tree_walk(tree, read_tree_cb, GIT_TREEWALK_POST, index);
|
||||
}
|
||||
|
@ -349,9 +349,6 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
||||
{
|
||||
assert(out && repo);
|
||||
|
||||
if (repo->is_bare)
|
||||
return git__throw(GIT_EBAREINDEX, "Cannot open index in bare repository");
|
||||
|
||||
if (repo->_index == NULL) {
|
||||
int error;
|
||||
git_buf index_path = GIT_BUF_INIT;
|
||||
|
35
src/tree.c
35
src/tree.c
@ -15,8 +15,6 @@
|
||||
#define MAX_FILEMODE 0777777
|
||||
#define MAX_FILEMODE_BYTES 6
|
||||
|
||||
#define ENTRY_IS_TREE(e) ((e)->attr & 040000)
|
||||
|
||||
static int valid_attributes(const int attributes)
|
||||
{
|
||||
return attributes >= 0 && attributes <= MAX_FILEMODE;
|
||||
@ -33,8 +31,8 @@ static int entry_sort_cmp(const void *a, const void *b)
|
||||
const git_tree_entry *entry_b = (const git_tree_entry *)(b);
|
||||
|
||||
return git_futils_cmp_path(
|
||||
entry_a->filename, entry_a->filename_len, ENTRY_IS_TREE(entry_a),
|
||||
entry_b->filename, entry_b->filename_len, ENTRY_IS_TREE(entry_b));
|
||||
entry_a->filename, entry_a->filename_len, entry_is_tree(entry_a),
|
||||
entry_b->filename, entry_b->filename_len, entry_is_tree(entry_b));
|
||||
}
|
||||
|
||||
|
||||
@ -717,7 +715,7 @@ static int tree_walk_post(
|
||||
if (callback(path->ptr, entry, payload) < 0)
|
||||
continue;
|
||||
|
||||
if (ENTRY_IS_TREE(entry)) {
|
||||
if (entry_is_tree(entry)) {
|
||||
git_tree *subtree;
|
||||
size_t path_len = path->size;
|
||||
|
||||
@ -961,15 +959,22 @@ static int cmp_tentry_ientry(git_tree_entry *tentry, git_index_entry *ientry)
|
||||
return git_oid_cmp(&tentry->oid, &ientry->oid);
|
||||
}
|
||||
|
||||
static void make_tentry(git_tree_entry *tentry, git_index_entry *ientry, git_buf *buf)
|
||||
static void make_tentry(git_tree_entry *tentry, git_index_entry *ientry)
|
||||
{
|
||||
char *last_slash;
|
||||
|
||||
memset(tentry, 0x0, sizeof(git_tree_entry));
|
||||
tentry->attr = ientry->mode;
|
||||
|
||||
last_slash = strrchr(ientry->path, '/');
|
||||
if (last_slash)
|
||||
last_slash++;
|
||||
else
|
||||
last_slash = ientry->path;
|
||||
tentry->filename = last_slash;
|
||||
|
||||
git_oid_cpy(&tentry->oid, &ientry->oid);
|
||||
if (buf != NULL) {
|
||||
tentry->filename = buf->ptr;
|
||||
tentry->filename_len = buf->size;
|
||||
}
|
||||
tentry->filename_len = strlen(tentry->filename);
|
||||
}
|
||||
|
||||
static int diff_index_cb(const char *root, git_tree_entry *tentry, void *data)
|
||||
@ -980,7 +985,7 @@ static int diff_index_cb(const char *root, git_tree_entry *tentry, void *data)
|
||||
git_buf fn_buf = GIT_BUF_INIT;
|
||||
int cmp, error = GIT_SUCCESS;
|
||||
|
||||
if (ENTRY_IS_TREE(tentry))
|
||||
if (entry_is_tree(tentry))
|
||||
return GIT_SUCCESS;
|
||||
|
||||
git_buf_puts(&fn_buf, root);
|
||||
@ -993,25 +998,24 @@ static int diff_index_cb(const char *root, git_tree_entry *tentry, void *data)
|
||||
|
||||
/* Like with 'git diff-index', the index is the right side*/
|
||||
cmp = strcmp(git_buf_cstr(&fn_buf), ientry->path);
|
||||
git_buf_free(&fn_buf);
|
||||
if (cmp == 0) {
|
||||
cbdata->i++;
|
||||
if (!cmp_tentry_ientry(tentry, ientry))
|
||||
goto exit;
|
||||
/* modification */
|
||||
make_tentry(&fake_entry, ientry, &fn_buf);
|
||||
make_tentry(&fake_entry, ientry);
|
||||
if ((error = signal_modification(tentry, &fake_entry, cbdata->cb, cbdata->data)) < 0)
|
||||
goto exit;
|
||||
} else if (cmp < 0) {
|
||||
/* deletion */
|
||||
memcpy(&fake_entry, tentry, sizeof(git_tree_entry));
|
||||
fake_entry.filename = fn_buf.ptr;
|
||||
fake_entry.filename_len = fn_buf.size;
|
||||
if ((error = signal_deletion(tentry, cbdata->cb, cbdata->data)) < 0)
|
||||
goto exit;
|
||||
} else {
|
||||
/* addition */
|
||||
cbdata->i++;
|
||||
make_tentry(&fake_entry, ientry, &fn_buf);
|
||||
make_tentry(&fake_entry, ientry);
|
||||
if ((error = signal_addition(&fake_entry, cbdata->cb, cbdata->data)) < 0)
|
||||
goto exit;
|
||||
/*
|
||||
@ -1024,7 +1028,6 @@ static int diff_index_cb(const char *root, git_tree_entry *tentry, void *data)
|
||||
}
|
||||
|
||||
exit:
|
||||
git_buf_free(&fn_buf);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,11 @@ struct git_treebuilder {
|
||||
};
|
||||
|
||||
|
||||
GIT_INLINE(unsigned int) entry_is_tree(const struct git_tree_entry *e)
|
||||
{
|
||||
return e->attr & 040000;
|
||||
}
|
||||
|
||||
void git_tree__free(git_tree *tree);
|
||||
int git_tree__parse(git_tree *tree, git_odb_object *obj);
|
||||
|
||||
|
@ -9,13 +9,9 @@ https://github.com/tanoku/clay
|
||||
|
||||
* Write your modules and tests. Use good, meaningful names.
|
||||
|
||||
* Mix the tests:
|
||||
|
||||
./clay -vtap .
|
||||
|
||||
* Make sure you actually build the tests by setting:
|
||||
|
||||
BUILD_CLAY=ON
|
||||
cmake -DBUILD_CLAY=ON build/
|
||||
|
||||
* Test:
|
||||
|
||||
|
@ -1,234 +0,0 @@
|
||||
#ifndef __CLAY_TEST_H__
|
||||
#define __CLAY_TEST_H__
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
void clay__assert(
|
||||
int condition,
|
||||
const char *file,
|
||||
int line,
|
||||
const char *error,
|
||||
const char *description,
|
||||
int should_abort);
|
||||
|
||||
void cl_set_cleanup(void (*cleanup)(void *), void *opaque);
|
||||
void cl_fs_cleanup(void);
|
||||
|
||||
#ifdef CLAY_FIXTURE_PATH
|
||||
const char *cl_fixture(const char *fixture_name);
|
||||
void cl_fixture_sandbox(const char *fixture_name);
|
||||
void cl_fixture_cleanup(const char *fixture_name);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Assertion macros with explicit error message
|
||||
*/
|
||||
#define cl_must_pass_(expr, desc) clay__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 1)
|
||||
#define cl_must_fail_(expr, desc) clay__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 1)
|
||||
#define cl_assert_(expr, desc) clay__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 1)
|
||||
|
||||
/**
|
||||
* Check macros with explicit error message
|
||||
*/
|
||||
#define cl_check_pass_(expr, desc) clay__assert((expr) >= 0, __FILE__, __LINE__, "Function call failed: " #expr, desc, 0)
|
||||
#define cl_check_fail_(expr, desc) clay__assert((expr) < 0, __FILE__, __LINE__, "Expected function call to fail: " #expr, desc, 0)
|
||||
#define cl_check_(expr, desc) clay__assert((expr) != 0, __FILE__, __LINE__, "Expression is not true: " #expr, desc, 0)
|
||||
|
||||
/**
|
||||
* Assertion macros with no error message
|
||||
*/
|
||||
#define cl_must_pass(expr) cl_must_pass_(expr, NULL)
|
||||
#define cl_must_fail(expr) cl_must_fail_(expr, NULL)
|
||||
#define cl_assert(expr) cl_assert_(expr, NULL)
|
||||
|
||||
/**
|
||||
* Check macros with no error message
|
||||
*/
|
||||
#define cl_check_pass(expr) cl_check_pass_(expr, NULL)
|
||||
#define cl_check_fail(expr) cl_check_fail_(expr, NULL)
|
||||
#define cl_check(expr) cl_check_(expr, NULL)
|
||||
|
||||
/**
|
||||
* Forced failure/warning
|
||||
*/
|
||||
#define cl_fail(desc) clay__assert(0, __FILE__, __LINE__, "Test failed.", desc, 1)
|
||||
#define cl_warning(desc) clay__assert(0, __FILE__, __LINE__, "Warning during test execution:", desc, 0)
|
||||
|
||||
/**
|
||||
* Test method declarations
|
||||
*/
|
||||
extern void clay_on_init(void);
|
||||
extern void clay_on_shutdown(void);
|
||||
extern void test_attr_file__assign_variants(void);
|
||||
extern void test_attr_file__check_attr_examples(void);
|
||||
extern void test_attr_file__match_variants(void);
|
||||
extern void test_attr_file__simple_read(void);
|
||||
extern void test_attr_lookup__assign_variants(void);
|
||||
extern void test_attr_lookup__check_attr_examples(void);
|
||||
extern void test_attr_lookup__from_buffer(void);
|
||||
extern void test_attr_lookup__match_variants(void);
|
||||
extern void test_attr_lookup__simple(void);
|
||||
extern void test_attr_repo__bad_macros(void);
|
||||
extern void test_attr_repo__cleanup(void);
|
||||
extern void test_attr_repo__foreach(void);
|
||||
extern void test_attr_repo__get_many(void);
|
||||
extern void test_attr_repo__get_one(void);
|
||||
extern void test_attr_repo__initialize(void);
|
||||
extern void test_attr_repo__macros(void);
|
||||
extern void test_attr_repo__manpage_example(void);
|
||||
extern void test_buf_basic__printf(void);
|
||||
extern void test_buf_basic__resize(void);
|
||||
extern void test_config_add__cleanup(void);
|
||||
extern void test_config_add__initialize(void);
|
||||
extern void test_config_add__to_existing_section(void);
|
||||
extern void test_config_add__to_new_section(void);
|
||||
extern void test_config_new__write_new_config(void);
|
||||
extern void test_config_read__blank_lines(void);
|
||||
extern void test_config_read__case_sensitive(void);
|
||||
extern void test_config_read__empty_files(void);
|
||||
extern void test_config_read__header_in_last_line(void);
|
||||
extern void test_config_read__invalid_ext_headers(void);
|
||||
extern void test_config_read__lone_variable(void);
|
||||
extern void test_config_read__multiline_value(void);
|
||||
extern void test_config_read__number_suffixes(void);
|
||||
extern void test_config_read__prefixes(void);
|
||||
extern void test_config_read__simple_read(void);
|
||||
extern void test_config_read__subsection_header(void);
|
||||
extern void test_config_stress__cleanup(void);
|
||||
extern void test_config_stress__dont_break_on_invalid_input(void);
|
||||
extern void test_config_stress__initialize(void);
|
||||
extern void test_config_write__cleanup(void);
|
||||
extern void test_config_write__delete_inexistent(void);
|
||||
extern void test_config_write__delete_value(void);
|
||||
extern void test_config_write__initialize(void);
|
||||
extern void test_config_write__replace_value(void);
|
||||
extern void test_core_buffer__0(void);
|
||||
extern void test_core_buffer__1(void);
|
||||
extern void test_core_buffer__2(void);
|
||||
extern void test_core_buffer__3(void);
|
||||
extern void test_core_buffer__4(void);
|
||||
extern void test_core_buffer__5(void);
|
||||
extern void test_core_buffer__6(void);
|
||||
extern void test_core_buffer__7(void);
|
||||
extern void test_core_buffer__8(void);
|
||||
extern void test_core_buffer__9(void);
|
||||
extern void test_core_dirent__dont_traverse_dot(void);
|
||||
extern void test_core_dirent__dont_traverse_empty_folders(void);
|
||||
extern void test_core_dirent__traverse_slash_terminated_folder(void);
|
||||
extern void test_core_dirent__traverse_subfolder(void);
|
||||
extern void test_core_dirent__traverse_weird_filenames(void);
|
||||
extern void test_core_filebuf__0(void);
|
||||
extern void test_core_filebuf__1(void);
|
||||
extern void test_core_filebuf__2(void);
|
||||
extern void test_core_filebuf__3(void);
|
||||
extern void test_core_filebuf__4(void);
|
||||
extern void test_core_filebuf__5(void);
|
||||
extern void test_core_oid__initialize(void);
|
||||
extern void test_core_oid__streq(void);
|
||||
extern void test_core_path__0_dirname(void);
|
||||
extern void test_core_path__1_basename(void);
|
||||
extern void test_core_path__2_topdir(void);
|
||||
extern void test_core_path__5_joins(void);
|
||||
extern void test_core_path__6_long_joins(void);
|
||||
extern void test_core_path__7_path_to_dir(void);
|
||||
extern void test_core_path__8_self_join(void);
|
||||
extern void test_core_rmdir__delete_recursive(void);
|
||||
extern void test_core_rmdir__fail_to_delete_non_empty_dir(void);
|
||||
extern void test_core_rmdir__initialize(void);
|
||||
extern void test_core_string__0(void);
|
||||
extern void test_core_string__1(void);
|
||||
extern void test_core_strtol__int32(void);
|
||||
extern void test_core_strtol__int64(void);
|
||||
extern void test_core_vector__0(void);
|
||||
extern void test_core_vector__1(void);
|
||||
extern void test_core_vector__2(void);
|
||||
extern void test_core_vector__3(void);
|
||||
extern void test_core_vector__4(void);
|
||||
extern void test_core_vector__5(void);
|
||||
extern void test_index_rename__single_file(void);
|
||||
extern void test_network_remotelocal__cleanup(void);
|
||||
extern void test_network_remotelocal__initialize(void);
|
||||
extern void test_network_remotelocal__retrieve_advertised_references(void);
|
||||
extern void test_network_remotes__cleanup(void);
|
||||
extern void test_network_remotes__fnmatch(void);
|
||||
extern void test_network_remotes__initialize(void);
|
||||
extern void test_network_remotes__parsing(void);
|
||||
extern void test_network_remotes__refspec_parsing(void);
|
||||
extern void test_network_remotes__transform(void);
|
||||
extern void test_object_commit_commitstagedfile__cleanup(void);
|
||||
extern void test_object_commit_commitstagedfile__generate_predictable_object_ids(void);
|
||||
extern void test_object_commit_commitstagedfile__initialize(void);
|
||||
extern void test_object_raw_chars__build_valid_oid_from_raw_bytes(void);
|
||||
extern void test_object_raw_chars__find_invalid_chars_in_oid(void);
|
||||
extern void test_object_raw_compare__compare_allocfmt_oids(void);
|
||||
extern void test_object_raw_compare__compare_fmt_oids(void);
|
||||
extern void test_object_raw_compare__compare_pathfmt_oids(void);
|
||||
extern void test_object_raw_compare__succeed_on_copy_oid(void);
|
||||
extern void test_object_raw_compare__succeed_on_oid_comparison_equal(void);
|
||||
extern void test_object_raw_compare__succeed_on_oid_comparison_greater(void);
|
||||
extern void test_object_raw_compare__succeed_on_oid_comparison_lesser(void);
|
||||
extern void test_object_raw_convert__succeed_on_oid_to_string_conversion(void);
|
||||
extern void test_object_raw_convert__succeed_on_oid_to_string_conversion_big(void);
|
||||
extern void test_object_raw_fromstr__fail_on_invalid_oid_string(void);
|
||||
extern void test_object_raw_fromstr__succeed_on_valid_oid_string(void);
|
||||
extern void test_object_raw_hash__hash_buffer_in_single_call(void);
|
||||
extern void test_object_raw_hash__hash_by_blocks(void);
|
||||
extern void test_object_raw_hash__hash_commit_object(void);
|
||||
extern void test_object_raw_hash__hash_junk_data(void);
|
||||
extern void test_object_raw_hash__hash_multi_byte_object(void);
|
||||
extern void test_object_raw_hash__hash_one_byte_object(void);
|
||||
extern void test_object_raw_hash__hash_tag_object(void);
|
||||
extern void test_object_raw_hash__hash_tree_object(void);
|
||||
extern void test_object_raw_hash__hash_two_byte_object(void);
|
||||
extern void test_object_raw_hash__hash_vector(void);
|
||||
extern void test_object_raw_hash__hash_zero_length_object(void);
|
||||
extern void test_object_raw_short__oid_shortener_no_duplicates(void);
|
||||
extern void test_object_raw_short__oid_shortener_stresstest_git_oid_shorten(void);
|
||||
extern void test_object_raw_size__validate_oid_size(void);
|
||||
extern void test_object_raw_type2string__check_type_is_loose(void);
|
||||
extern void test_object_raw_type2string__convert_string_to_type(void);
|
||||
extern void test_object_raw_type2string__convert_type_to_string(void);
|
||||
extern void test_object_tree_diff__addition(void);
|
||||
extern void test_object_tree_diff__cleanup(void);
|
||||
extern void test_object_tree_diff__deletion(void);
|
||||
extern void test_object_tree_diff__initialize(void);
|
||||
extern void test_object_tree_diff__modification(void);
|
||||
extern void test_object_tree_diff__more(void);
|
||||
extern void test_object_tree_frompath__cleanup(void);
|
||||
extern void test_object_tree_frompath__fail_when_processing_an_invalid_path(void);
|
||||
extern void test_object_tree_frompath__fail_when_processing_an_unknown_tree_segment(void);
|
||||
extern void test_object_tree_frompath__initialize(void);
|
||||
extern void test_object_tree_frompath__retrieve_tree_from_path_to_treeentry(void);
|
||||
extern void test_odb_loose__cleanup(void);
|
||||
extern void test_odb_loose__exists(void);
|
||||
extern void test_odb_loose__initialize(void);
|
||||
extern void test_odb_loose__simple_reads(void);
|
||||
extern void test_odb_packed__cleanup(void);
|
||||
extern void test_odb_packed__initialize(void);
|
||||
extern void test_odb_packed__mass_read(void);
|
||||
extern void test_odb_packed__read_header_0(void);
|
||||
extern void test_odb_packed__read_header_1(void);
|
||||
extern void test_odb_sorting__alternate_backends_sorting(void);
|
||||
extern void test_odb_sorting__basic_backends_sorting(void);
|
||||
extern void test_odb_sorting__cleanup(void);
|
||||
extern void test_odb_sorting__initialize(void);
|
||||
extern void test_refs_crashes__double_free(void);
|
||||
extern void test_repo_getters__cleanup(void);
|
||||
extern void test_repo_getters__empty(void);
|
||||
extern void test_repo_getters__head_detached(void);
|
||||
extern void test_repo_getters__head_orphan(void);
|
||||
extern void test_repo_getters__initialize(void);
|
||||
extern void test_repo_init__bare_repo(void);
|
||||
extern void test_repo_init__bare_repo_noslash(void);
|
||||
extern void test_repo_init__initialize(void);
|
||||
extern void test_repo_init__standard_repo(void);
|
||||
extern void test_repo_init__standard_repo_noslash(void);
|
||||
extern void test_repo_open__bare_empty_repo(void);
|
||||
extern void test_repo_open__standard_empty_repo(void);
|
||||
extern void test_status_single__hash_single_file(void);
|
||||
extern void test_status_worktree__cleanup(void);
|
||||
extern void test_status_worktree__empty_repository(void);
|
||||
extern void test_status_worktree__initialize(void);
|
||||
extern void test_status_worktree__whole_repository(void);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
46
tests-clay/index/read_tree.c
Normal file
46
tests-clay/index/read_tree.c
Normal file
@ -0,0 +1,46 @@
|
||||
#include "clay_libgit2.h"
|
||||
#include "testlib.h"
|
||||
#include "posix.h"
|
||||
|
||||
/* Test that reading and writing a tree is a no-op */
|
||||
void test_index_read_tree__read_write_involution(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
git_oid tree_oid;
|
||||
git_tree *tree;
|
||||
git_oid expected;
|
||||
|
||||
p_mkdir("read_tree", 0700);
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "./read_tree", 0));
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
|
||||
cl_assert(git_index_entrycount(index) == 0);
|
||||
|
||||
p_mkdir("./read_tree/abc", 0700);
|
||||
|
||||
/* Sort order: '-' < '/' < '_' */
|
||||
file_create("./read_tree/abc-d", NULL);
|
||||
file_create("./read_tree/abc/d", NULL);
|
||||
file_create("./read_tree/abc_d", NULL);
|
||||
|
||||
cl_git_pass(git_index_add(index, "abc-d", 0));
|
||||
cl_git_pass(git_index_add(index, "abc_d", 0));
|
||||
cl_git_pass(git_index_add(index, "abc/d", 0));
|
||||
|
||||
/* write-tree */
|
||||
cl_git_pass(git_tree_create_fromindex(&expected, index));
|
||||
|
||||
/* read-tree */
|
||||
git_tree_lookup(&tree, repo, &expected);
|
||||
cl_git_pass(git_index_read_tree(index, tree));
|
||||
|
||||
cl_git_pass(git_tree_create_fromindex(&tree_oid, index));
|
||||
cl_assert(git_oid_cmp(&expected, &tree_oid) == 0);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
|
||||
cl_fixture_cleanup("read_tree");
|
||||
}
|
@ -1,16 +1,7 @@
|
||||
#include "clay_libgit2.h"
|
||||
#include "testlib.h"
|
||||
#include "posix.h"
|
||||
|
||||
static void file_create(const char *filename, const char *content)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = p_creat(filename, 0666);
|
||||
cl_assert(fd != 0);
|
||||
cl_git_pass(p_write(fd, content, strlen(content)));
|
||||
cl_git_pass(p_close(fd));
|
||||
}
|
||||
|
||||
void test_index_rename__single_file(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
|
@ -2,8 +2,8 @@
|
||||
#include "tree.h"
|
||||
#include "repository.h"
|
||||
|
||||
static unsigned int expect_idx;
|
||||
static git_repository *repo;
|
||||
static git_index *theindex;
|
||||
static git_tree *atree, *btree;
|
||||
static git_oid aoid, boid;
|
||||
|
||||
@ -27,9 +27,18 @@ static int diff_cb(const git_tree_diff_data *diff, void *data)
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
static void test_diff(git_tree *a, git_tree *b, git_tree_diff_cb cb, void *data)
|
||||
{
|
||||
cl_must_pass(git_tree_diff(a, b, cb, data));
|
||||
|
||||
cl_git_pass(git_index_read_tree(theindex, b));
|
||||
cl_git_pass(git_tree_diff_index_recursive(a, theindex, cb, data));
|
||||
}
|
||||
|
||||
void test_object_tree_diff__initialize(void)
|
||||
{
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_git_pass(git_repository_index(&theindex, repo));
|
||||
}
|
||||
|
||||
void test_object_tree_diff__cleanup(void)
|
||||
@ -58,7 +67,7 @@ void test_object_tree_diff__addition(void)
|
||||
cl_must_pass(git_tree_lookup(&atree, repo, &aoid));
|
||||
cl_must_pass(git_tree_lookup(&btree, repo, &boid));
|
||||
|
||||
cl_must_pass(git_tree_diff(atree, btree, diff_cb, &expect));
|
||||
test_diff(atree, btree, diff_cb, &expect);
|
||||
}
|
||||
|
||||
void test_object_tree_diff__deletion(void)
|
||||
@ -79,7 +88,7 @@ void test_object_tree_diff__deletion(void)
|
||||
cl_must_pass(git_tree_lookup(&atree, repo, &aoid));
|
||||
cl_must_pass(git_tree_lookup(&btree, repo, &boid));
|
||||
|
||||
cl_must_pass(git_tree_diff(atree, btree, diff_cb, &expect));
|
||||
test_diff(atree, btree, diff_cb, &expect);
|
||||
}
|
||||
|
||||
void test_object_tree_diff__modification(void)
|
||||
@ -101,13 +110,20 @@ void test_object_tree_diff__modification(void)
|
||||
cl_must_pass(git_tree_lookup(&atree, repo, &aoid));
|
||||
cl_must_pass(git_tree_lookup(&btree, repo, &boid));
|
||||
|
||||
cl_must_pass(git_tree_diff(atree, btree, diff_cb, &expect));
|
||||
test_diff(atree, btree, diff_cb, &expect);
|
||||
}
|
||||
|
||||
struct diff_more_data {
|
||||
git_tree_diff_data expect[3];
|
||||
int expect_idx;
|
||||
};
|
||||
|
||||
static int diff_more_cb(const git_tree_diff_data *diff, void *data)
|
||||
{
|
||||
git_tree_diff_data *expect = (git_tree_diff_data *) data;
|
||||
diff_cmp(diff, &expect[expect_idx++]);
|
||||
struct diff_more_data *more_data = data;
|
||||
diff_cmp(diff, &more_data->expect[more_data->expect_idx]);
|
||||
|
||||
more_data->expect_idx = (more_data->expect_idx + 1) % ARRAY_SIZE(more_data->expect);
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
@ -116,9 +132,10 @@ void test_object_tree_diff__more(void)
|
||||
{
|
||||
char *astr = "814889a078c031f61ed08ab5fa863aea9314344d";
|
||||
char *bstr = "75057dd4114e74cca1d750d0aee1647c903cb60a";
|
||||
git_tree_diff_data expect[3];
|
||||
struct diff_more_data more_data;
|
||||
git_tree_diff_data *expect = more_data.expect;
|
||||
|
||||
memset(expect, 0x0, 3 * sizeof(git_tree_diff_data));
|
||||
memset(&more_data, 0x0, sizeof(struct diff_more_data));
|
||||
/* M README */
|
||||
expect[0].old_attr = 0100644;
|
||||
expect[0].new_attr = 0100644;
|
||||
@ -146,5 +163,5 @@ void test_object_tree_diff__more(void)
|
||||
cl_must_pass(git_tree_lookup(&atree, repo, &aoid));
|
||||
cl_must_pass(git_tree_lookup(&btree, repo, &boid));
|
||||
|
||||
cl_must_pass(git_tree_diff(atree, btree, diff_more_cb, expect));
|
||||
test_diff(atree, btree, diff_more_cb, &more_data);
|
||||
}
|
||||
|
20
tests-clay/testlib.c
Normal file
20
tests-clay/testlib.c
Normal file
@ -0,0 +1,20 @@
|
||||
#include "clay.h"
|
||||
#include "testlib.h"
|
||||
#include "posix.h"
|
||||
|
||||
void file_create(const char *filename, const char *content)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = p_creat(filename, 0666);
|
||||
cl_assert(fd != 0);
|
||||
|
||||
if (content) {
|
||||
cl_must_pass(p_write(fd, content, strlen(content)));
|
||||
} else {
|
||||
cl_must_pass(p_write(fd, filename, strlen(filename)));
|
||||
cl_must_pass(p_write(fd, "\n", 1));
|
||||
}
|
||||
|
||||
cl_must_pass(p_close(fd));
|
||||
}
|
6
tests-clay/testlib.h
Normal file
6
tests-clay/testlib.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef INCLUDE_testlib_h__
|
||||
#define INCLUDE_testlib_h__
|
||||
|
||||
void file_create(const char *filename, const char *content);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user