Commit 52d552e9 by Vicent Martí

Merge pull request #510 from nulltoken/topic/commit-oid-generation

commit: add test to ensure predictability of generation of commit, tree and blob object ids
parents dcb7447c 8fae76c5
......@@ -129,6 +129,9 @@ 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);
......@@ -159,9 +162,6 @@ 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_buildfromindex__cleanup(void);
extern void test_object_tree_buildfromindex__generate_predictable_object_ids(void);
extern void test_object_tree_buildfromindex__initialize(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);
......
......@@ -200,6 +200,9 @@ static const struct clay_func _clay_cb_network_remotes[] = {
{"refspec_parsing", &test_network_remotes__refspec_parsing},
{"transform", &test_network_remotes__transform}
};
static const struct clay_func _clay_cb_object_commit_commitstagedfile[] = {
{"generate_predictable_object_ids", &test_object_commit_commitstagedfile__generate_predictable_object_ids}
};
static const struct clay_func _clay_cb_object_raw_chars[] = {
{"build_valid_oid_from_raw_bytes", &test_object_raw_chars__build_valid_oid_from_raw_bytes},
{"find_invalid_chars_in_oid", &test_object_raw_chars__find_invalid_chars_in_oid}
......@@ -246,9 +249,6 @@ static const struct clay_func _clay_cb_object_raw_type2string[] = {
{"convert_string_to_type", &test_object_raw_type2string__convert_string_to_type},
{"convert_type_to_string", &test_object_raw_type2string__convert_type_to_string}
};
static const struct clay_func _clay_cb_object_tree_buildfromindex[] = {
{"generate_predictable_object_ids", &test_object_tree_buildfromindex__generate_predictable_object_ids}
};
static const struct clay_func _clay_cb_object_tree_diff[] = {
{"addition", &test_object_tree_diff__addition},
{"deletion", &test_object_tree_diff__deletion},
......@@ -400,6 +400,12 @@ static const struct clay_suite _clay_suites[] = {
_clay_cb_network_remotes, 4
},
{
"object::commit::commitstagedfile",
{"initialize", &test_object_commit_commitstagedfile__initialize},
{"cleanup", &test_object_commit_commitstagedfile__cleanup},
_clay_cb_object_commit_commitstagedfile, 1
},
{
"object::raw::chars",
{NULL, NULL},
{NULL, NULL},
......@@ -448,12 +454,6 @@ static const struct clay_suite _clay_suites[] = {
_clay_cb_object_raw_type2string, 3
},
{
"object::tree::buildfromindex",
{"initialize", &test_object_tree_buildfromindex__initialize},
{"cleanup", &test_object_tree_buildfromindex__cleanup},
_clay_cb_object_tree_buildfromindex, 1
},
{
"object::tree::diff",
{"initialize", &test_object_tree_diff__initialize},
{"cleanup", &test_object_tree_diff__cleanup},
......
......@@ -13,7 +13,7 @@ static void file_create(const char *filename, const char *content)
cl_git_pass(p_close(fd));
}
void test_object_tree_buildfromindex__initialize(void)
void test_object_commit_commitstagedfile__initialize(void)
{
cl_fixture("treebuilder");
cl_git_pass(git_repository_init(&repo, "treebuilder/", 0));
......@@ -21,40 +21,98 @@ void test_object_tree_buildfromindex__initialize(void)
cl_assert(repo != NULL);
}
void test_object_tree_buildfromindex__cleanup(void)
void test_object_commit_commitstagedfile__cleanup(void)
{
git_repository_free(repo);
cl_fixture_cleanup("treebuilder");
}
void test_object_tree_buildfromindex__generate_predictable_object_ids(void)
void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
{
git_index *index;
git_oid blob_oid, tree_oid, expected_tree_oid;
git_index_entry *entry;
git_oid expected_blob_oid, tree_oid, expected_tree_oid, commit_oid, expected_commit_oid;
git_signature *signature;
git_tree *tree;
/*
* Add a new file to the index
* The test below replicates the following git scenario
*
* $ echo "test" > test.txt
* $ git hash-object test.txt
* 9daeafb9864cf43055ae93beb0afd6c7d144bfa4
*
* $ git add .
* $ git commit -m "Initial commit"
*
* $ git log
* commit 1fe3126578fc4eca68c193e4a3a0a14a0704624d
* Author: nulltoken <emeric.fermas@gmail.com>
* Date: Wed Dec 14 08:29:03 2011 +0100
*
* Initial commit
*
* $ git show 1fe3 --format=raw
* commit 1fe3126578fc4eca68c193e4a3a0a14a0704624d
* tree 2b297e643c551e76cfa1f93810c50811382f9117
* author nulltoken <emeric.fermas@gmail.com> 1323847743 +0100
* committer nulltoken <emeric.fermas@gmail.com> 1323847743 +0100
*
* Initial commit
*
* diff --git a/test.txt b/test.txt
* new file mode 100644
* index 0000000..9daeafb
* --- /dev/null
* +++ b/test.txt
* @@ -0,0 +1 @@
* +test
*
* $ git ls-tree 2b297
* 100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt
*/
cl_git_pass(git_repository_index(&index, repo));
cl_git_pass(git_oid_fromstr(&expected_commit_oid, "1fe3126578fc4eca68c193e4a3a0a14a0704624d"));
cl_git_pass(git_oid_fromstr(&expected_tree_oid, "2b297e643c551e76cfa1f93810c50811382f9117"));
cl_git_pass(git_oid_fromstr(&expected_blob_oid, "9daeafb9864cf43055ae93beb0afd6c7d144bfa4"));
/*
* Add a new file to the index
*/
file_create("treebuilder/test.txt", "test\n");
cl_git_pass(git_repository_index(&index, repo));
cl_git_pass(git_index_add(index, "test.txt", 0));
entry = git_index_get(index, 0);
/* $ echo "test" | git hash-object --stdin */
cl_git_pass(git_oid_fromstr(&blob_oid, "9daeafb9864cf43055ae93beb0afd6c7d144bfa4"));
cl_assert(git_oid_cmp(&blob_oid, &entry->oid) == 0);
cl_assert(git_oid_cmp(&expected_blob_oid, &entry->oid) == 0);
/*
* Build the tree from the index
*/
cl_git_pass(git_tree_create_fromindex(&tree_oid, index));
cl_git_pass(git_oid_fromstr(&expected_tree_oid, "2b297e643c551e76cfa1f93810c50811382f9117"));
cl_assert(git_oid_cmp(&expected_tree_oid, &tree_oid) == 0);
/*
* Commit the staged file
*/
cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60));
cl_git_pass(git_tree_lookup(&tree, repo, &tree_oid));
cl_git_pass(git_commit_create_v(
&commit_oid,
repo,
"HEAD",
signature,
signature,
NULL,
"Initial commit\n", // Note: the trailing linefeed is mandatory to replicate git behavior
tree,
0));
cl_assert(git_oid_cmp(&expected_commit_oid, &commit_oid) == 0);
git_signature_free(signature);
git_tree_free(tree);
git_index_free(index);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment