checkout: add test coverage of dirs and subtrees
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
diff --git a/tests-clar/checkout/tree.c b/tests-clar/checkout/tree.c
index 32b64e5..5f99043 100644
--- a/tests-clar/checkout/tree.c
+++ b/tests-clar/checkout/tree.c
@@ -4,26 +4,66 @@
#include "repository.h"
static git_repository *g_repo;
+static git_checkout_opts g_opts;
+static git_object *g_object;
void test_checkout_tree__initialize(void)
{
g_repo = cl_git_sandbox_init("testrepo");
+
+ memset(&g_opts, 0, sizeof(g_opts));
+ g_opts.checkout_strategy = GIT_CHECKOUT_CREATE_MISSING;
}
void test_checkout_tree__cleanup(void)
{
+ git_object_free(g_object);
+
cl_git_sandbox_cleanup();
}
void test_checkout_tree__cannot_checkout_a_non_treeish(void)
{
- git_oid oid;
- git_blob *blob;
+ /* blob */
+ cl_git_pass(git_revparse_single(&g_object, g_repo, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd"));
+
+ cl_git_fail(git_checkout_tree(g_repo, g_object, NULL, NULL));
+}
+
+void test_checkout_tree__can_checkout_a_subdirectory_from_a_commit(void)
+{
+ git_strarray paths;
+ char *entries[] = { "ab/de/" };
+
+ paths.strings = entries;
+ paths.count = 1;
+ g_opts.paths = &paths;
+
+ cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees"));
+
+ cl_assert_equal_i(false, git_path_isdir("./testrepo/ab/"));
+
+ cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts, NULL));
+
+ cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/2.txt"));
+ cl_assert_equal_i(true, git_path_isfile("./testrepo/ab/de/fgh/1.txt"));
+}
+
+void test_checkout_tree__can_checkout_a_subdirectory_from_a_subtree(void)
+{
+ git_strarray paths;
+ char *entries[] = { "de/" };
+
+ paths.strings = entries;
+ paths.count = 1;
+ g_opts.paths = &paths;
+
+ cl_git_pass(git_revparse_single(&g_object, g_repo, "subtrees:ab"));
- cl_git_pass(git_oid_fromstr(&oid, "a71586c1dfe8a71c6cbf6c129f404c5642ff31bd"));
- cl_git_pass(git_blob_lookup(&blob, g_repo, &oid));
+ cl_assert_equal_i(false, git_path_isdir("./testrepo/de/"));
- cl_git_fail(git_checkout_tree(g_repo, (git_object *)blob, NULL, NULL));
+ cl_git_pass(git_checkout_tree(g_repo, g_object, &g_opts, NULL));
- git_blob_free(blob);
+ cl_assert_equal_i(true, git_path_isfile("./testrepo/de/2.txt"));
+ cl_assert_equal_i(true, git_path_isfile("./testrepo/de/fgh/1.txt"));
}