diff options
| author | nulltoken <emeric.fermas@gmail.com> | 2011-09-11 18:46:08 +0200 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2011-09-15 01:14:36 +0200 |
| commit | d8b903dab0ab1a9fa6d8515825fa5dd19de68fca (patch) | |
| tree | 134663453c40ed6e9fabdd06863fe2b2418af62f /tests/t18-status.c | |
| parent | 56453d346864e312ec138626a3fc920c39890f0d (diff) | |
| download | libgit2-d8b903dab0ab1a9fa6d8515825fa5dd19de68fca.tar.gz | |
status: enhance determination of statuses for a whole directory
- Should increase performance through usage of a walker
- No callback invocation for unaltered entries
Diffstat (limited to 'tests/t18-status.c')
| -rw-r--r-- | tests/t18-status.c | 259 |
1 files changed, 230 insertions, 29 deletions
diff --git a/tests/t18-status.c b/tests/t18-status.c index 774dab6b1..19951117e 100644 --- a/tests/t18-status.c +++ b/tests/t18-status.c @@ -33,15 +33,26 @@ static const char *test_blob_oid = "d4fa8600b4f37d7516bef4816ae2c64dbf029e3a"; #define STATUS_WORKDIR_FOLDER TEST_RESOURCES "/status/" #define STATUS_REPOSITORY_TEMP_FOLDER TEMP_REPO_FOLDER ".gitted/" +static int file_create(const char *filename, const char *content) +{ + int fd; + + fd = p_creat(filename, 0644); + if (fd == 0) + return GIT_ERROR; + if (p_write(fd, content, strlen(content)) != 0) + return GIT_ERROR; + if (p_close(fd) != 0) + return GIT_ERROR; + + return GIT_SUCCESS; +} + BEGIN_TEST(file0, "test retrieving OID from a file apart from the ODB") git_oid expected_id, actual_id; char filename[] = "new_file"; - int fd; - fd = p_creat(filename, 0644); - must_pass(fd); - must_pass(p_write(fd, "new_file\n", 9)); - must_pass(p_close(fd)); + must_pass(file_create(filename, "new_file\n\0")); must_pass(git_odb_hashfile(&actual_id, filename, GIT_OBJ_BLOB)); @@ -51,8 +62,7 @@ BEGIN_TEST(file0, "test retrieving OID from a file apart from the ODB") must_pass(p_unlink(filename)); END_TEST -static const char *entry_paths[] = { - "current_file", +static const char *entry_paths0[] = { "file_deleted", "modified_file", "new_file", @@ -65,13 +75,12 @@ static const char *entry_paths[] = { "staged_new_file_deleted_file", "staged_new_file_modified_file", - "subdir/current_file", "subdir/deleted_file", "subdir/modified_file", "subdir/new_file", }; -static const unsigned int entry_statuses[] = { - GIT_STATUS_CURRENT, + +static const unsigned int entry_statuses0[] = { GIT_STATUS_WT_DELETED, GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_NEW, @@ -84,38 +93,41 @@ static const unsigned int entry_statuses[] = { GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED, GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED, - GIT_STATUS_CURRENT, GIT_STATUS_WT_DELETED, GIT_STATUS_WT_MODIFIED, GIT_STATUS_WT_NEW, }; -#define ENTRY_COUNT 16 - -static unsigned int get_expected_entry_status(const char *path) -{ - int i; - for (i = 0; i < ENTRY_COUNT; ++i) - if (!strcmp(path, entry_paths[i])) - return entry_statuses[i]; - - return (unsigned int)-1; -} +#define ENTRY_COUNT0 14 struct status_entry_counts { int wrong_status_flags_count; + int wrong_sorted_path; int entry_count; + const unsigned int* expected_statuses; + const char** expected_paths; + int expected_entry_count; }; static int status_cb(const char *path, unsigned int status_flags, void *payload) { - unsigned int expected_status_flags = get_expected_entry_status(path); struct status_entry_counts *counts = (struct status_entry_counts *)payload; - counts->entry_count++; - if (status_flags != expected_status_flags) + if (counts->entry_count > counts->expected_entry_count) { + counts->wrong_status_flags_count++; + goto exit; + } + + if (strcmp(path, counts->expected_paths[counts->entry_count])) { + counts->wrong_sorted_path++; + goto exit; + } + + if (status_flags != counts->expected_statuses[counts->entry_count]) counts->wrong_status_flags_count++; +exit: + counts->entry_count++; return GIT_SUCCESS; } @@ -128,9 +140,195 @@ BEGIN_TEST(statuscb0, "test retrieving status for worktree of repository") must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); memset(&counts, 0x0, sizeof(struct status_entry_counts)); + counts.expected_entry_count = ENTRY_COUNT0; + counts.expected_paths = entry_paths0; + counts.expected_statuses = entry_statuses0; + + git_status_foreach(repo, status_cb, &counts); + must_be_true(counts.entry_count == counts.expected_entry_count); + must_be_true(counts.wrong_status_flags_count == 0); + must_be_true(counts.wrong_sorted_path == 0); + + git_repository_free(repo); + + git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); +END_TEST + +static int status_cb1(const char *path, unsigned int status_flags, void *payload) +{ + int *count = (int *)payload;; + + GIT_UNUSED_ARG(path); + GIT_UNUSED_ARG(status_flags); + + *count++; + + return GIT_SUCCESS; +} + +BEGIN_TEST(statuscb1, "test retrieving status for a worktree of an empty repository") + git_repository *repo; + int count = 0; + + must_pass(copydir_recurs(EMPTY_REPOSITORY_FOLDER, TEST_STD_REPO_FOLDER)); + must_pass(remove_placeholders(TEST_STD_REPO_FOLDER, "dummy-marker.txt")); + must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); + + git_status_foreach(repo, status_cb1, &count); + must_be_true(count == 0); + + git_repository_free(repo); + + git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); +END_TEST + +static const char *entry_paths2[] = { + "current_file", + "file_deleted", + "modified_file", + "staged_changes", + "staged_changes_file_deleted", + "staged_changes_modified_file", + "staged_delete_file_deleted", + "staged_delete_modified_file", + "staged_new_file", + "staged_new_file_deleted_file", + "staged_new_file_modified_file", + "subdir/current_file", + "subdir/deleted_file", + "subdir/modified_file", +}; + +static const unsigned int entry_statuses2[] = { + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_INDEX_DELETED, + GIT_STATUS_INDEX_DELETED, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, +}; + +#define ENTRY_COUNT2 14 + +BEGIN_TEST(statuscb2, "test retrieving status for a purged worktree of an valid repository") + git_repository *repo; + struct status_entry_counts counts; + + must_pass(copydir_recurs(STATUS_WORKDIR_FOLDER, TEMP_REPO_FOLDER)); + must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); + must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); + + /* Purging the working */ + must_pass(p_unlink(TEMP_REPO_FOLDER "current_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "modified_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "new_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "staged_changes")); + must_pass(p_unlink(TEMP_REPO_FOLDER "staged_changes_modified_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "staged_delete_modified_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "staged_new_file")); + must_pass(p_unlink(TEMP_REPO_FOLDER "staged_new_file_modified_file")); + must_pass(git_futils_rmdir_r(TEMP_REPO_FOLDER "subdir", 1)); + + memset(&counts, 0x0, sizeof(struct status_entry_counts)); + counts.expected_entry_count = ENTRY_COUNT2; + counts.expected_paths = entry_paths2; + counts.expected_statuses = entry_statuses2; + + git_status_foreach(repo, status_cb, &counts); + must_be_true(counts.entry_count == counts.expected_entry_count); + must_be_true(counts.wrong_status_flags_count == 0); + must_be_true(counts.wrong_sorted_path == 0); + + git_repository_free(repo); + + git_futils_rmdir_r(TEMP_REPO_FOLDER, 1); +END_TEST + +static const char *entry_paths3[] = { + ".HEADER", + "42-is-not-prime.sigh", + "README.md", + "current_file", + "current_file/current_file", + "current_file/modified_file", + "current_file/new_file", + "file_deleted", + "modified_file", + "new_file", + "staged_changes", + "staged_changes_file_deleted", + "staged_changes_modified_file", + "staged_delete_file_deleted", + "staged_delete_modified_file", + "staged_new_file", + "staged_new_file_deleted_file", + "staged_new_file_modified_file", + "subdir", + "subdir/current_file", + "subdir/deleted_file", + "subdir/modified_file", +}; + +static const unsigned int entry_statuses3[] = { + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_MODIFIED, + GIT_STATUS_WT_NEW, + GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED, + GIT_STATUS_INDEX_DELETED, + GIT_STATUS_WT_NEW | GIT_STATUS_INDEX_DELETED, + GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_DELETED | GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, + GIT_STATUS_WT_NEW, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, + GIT_STATUS_WT_DELETED, +}; + +#define ENTRY_COUNT3 22 + +BEGIN_TEST(statuscb3, "test retrieving status for a worktree where a file and a subdir have been renamed and some files have been added") + git_repository *repo; + struct status_entry_counts counts; + + must_pass(copydir_recurs(STATUS_WORKDIR_FOLDER, TEMP_REPO_FOLDER)); + must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); + must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); + + must_pass(git_futils_mv_atomic(TEMP_REPO_FOLDER "current_file", TEMP_REPO_FOLDER "swap")); + must_pass(git_futils_mv_atomic(TEMP_REPO_FOLDER "subdir", TEMP_REPO_FOLDER "current_file")); + must_pass(git_futils_mv_atomic(TEMP_REPO_FOLDER "swap", TEMP_REPO_FOLDER "subdir")); + + must_pass(file_create(TEMP_REPO_FOLDER ".HEADER", "dummy")); + must_pass(file_create(TEMP_REPO_FOLDER "42-is-not-prime.sigh", "dummy")); + must_pass(file_create(TEMP_REPO_FOLDER "README.md", "dummy")); + + memset(&counts, 0x0, sizeof(struct status_entry_counts)); + counts.expected_entry_count = ENTRY_COUNT3; + counts.expected_paths = entry_paths3; + counts.expected_statuses = entry_statuses3; + git_status_foreach(repo, status_cb, &counts); - must_be_true(counts.entry_count == ENTRY_COUNT); + must_be_true(counts.entry_count == counts.expected_entry_count); must_be_true(counts.wrong_status_flags_count == 0); + must_be_true(counts.wrong_sorted_path == 0); git_repository_free(repo); @@ -146,9 +344,9 @@ BEGIN_TEST(singlestatus0, "test retrieving status for single file") must_pass(git_futils_mv_atomic(STATUS_REPOSITORY_TEMP_FOLDER, TEST_STD_REPO_FOLDER)); must_pass(git_repository_open(&repo, TEST_STD_REPO_FOLDER)); - for (i = 0; i < ENTRY_COUNT; ++i) { - must_pass(git_status_file(&status_flags, repo, entry_paths[i])); - must_be_true(status_flags == entry_statuses[i]); + for (i = 0; i < ENTRY_COUNT0; ++i) { + must_pass(git_status_file(&status_flags, repo, entry_paths0[i])); + must_be_true(status_flags == entry_statuses0[i]); } git_repository_free(repo); @@ -238,6 +436,9 @@ BEGIN_SUITE(status) ADD_TEST(file0); ADD_TEST(statuscb0); + ADD_TEST(statuscb1); + ADD_TEST(statuscb2); + ADD_TEST(statuscb3); ADD_TEST(singlestatus0); ADD_TEST(singlestatus1); |
