diff options
| author | Vicent Martà <vicent@github.com> | 2012-09-25 14:35:33 -0700 |
|---|---|---|
| committer | Vicent Martà <vicent@github.com> | 2012-09-25 14:35:33 -0700 |
| commit | 3f7c5497c3c93431f01e7f892c71f71f7ef6e655 (patch) | |
| tree | 11fbf058764125e09358fdcc4f778b1cbb3bdf51 /tests-clar | |
| parent | d75074f4c02e8d8928d20261a891d94d26d41ea7 (diff) | |
| parent | 0adfa20aefcd18262214a22042d303721cc7d23a (diff) | |
| download | libgit2-3f7c5497c3c93431f01e7f892c71f71f7ef6e655.tar.gz | |
Merge pull request #938 from nulltoken/topic/is_valid_name
Topic/is valid name
Diffstat (limited to 'tests-clar')
| -rw-r--r-- | tests-clar/network/refspecs.c | 83 | ||||
| -rw-r--r-- | tests-clar/refs/create.c | 2 | ||||
| -rw-r--r-- | tests-clar/refs/isvalidname.c | 23 | ||||
| -rw-r--r-- | tests-clar/refs/lookup.c | 2 | ||||
| -rw-r--r-- | tests-clar/refs/normalize.c | 88 | ||||
| -rw-r--r-- | tests-clar/refs/read.c | 4 | ||||
| -rw-r--r-- | tests-clar/resources/testrepo.git/HEAD_TRACKER (renamed from tests-clar/resources/testrepo.git/head-tracker) | 0 | ||||
| -rw-r--r-- | tests-clar/resources/testrepo/.gitted/HEAD_TRACKER (renamed from tests-clar/resources/testrepo/.gitted/head-tracker) | 0 |
8 files changed, 177 insertions, 25 deletions
diff --git a/tests-clar/network/refspecs.c b/tests-clar/network/refspecs.c new file mode 100644 index 000000000..bfe0af48c --- /dev/null +++ b/tests-clar/network/refspecs.c @@ -0,0 +1,83 @@ +#include "clar_libgit2.h" +#include "refspec.h" +#include "remote.h" + +static void assert_refspec(unsigned int direction, const char *input, bool is_expected_to_be_valid) +{ + git_refspec refspec; + int error; + + error = git_refspec__parse(&refspec, input, direction == GIT_DIR_FETCH); + + if (is_expected_to_be_valid) + cl_assert_equal_i(0, error); + else + cl_assert_equal_i(GIT_ERROR, error); +} + +void test_network_refspecs__parsing(void) +{ + // Ported from https://github.com/git/git/blob/abd2bde78bd994166900290434a2048e660dabed/t/t5511-refspec.sh + + assert_refspec(GIT_DIR_PUSH, "", false); + assert_refspec(GIT_DIR_PUSH, ":", true); + assert_refspec(GIT_DIR_PUSH, "::", false); + assert_refspec(GIT_DIR_PUSH, "+:", true); + + assert_refspec(GIT_DIR_FETCH, "", true); + assert_refspec(GIT_DIR_PUSH, ":", true); + assert_refspec(GIT_DIR_FETCH, "::", false); + + assert_refspec(GIT_DIR_PUSH, "refs/heads/*:refs/remotes/frotz/*", true); + assert_refspec(GIT_DIR_PUSH, "refs/heads/*:refs/remotes/frotz", false); + assert_refspec(GIT_DIR_PUSH, "refs/heads:refs/remotes/frotz/*", false); + assert_refspec(GIT_DIR_PUSH, "refs/heads/master:refs/remotes/frotz/xyzzy", true); + + /* + * These have invalid LHS, but we do not have a formal "valid sha-1 + * expression syntax checker" so they are not checked with the current + * code. They will be caught downstream anyway, but we may want to + * have tighter check later... + */ + //assert_refspec(GIT_DIR_PUSH, "refs/heads/master::refs/remotes/frotz/xyzzy", false); + //assert_refspec(GIT_DIR_PUSH, "refs/heads/maste :refs/remotes/frotz/xyzzy", false); + + assert_refspec(GIT_DIR_FETCH, "refs/heads/*:refs/remotes/frotz/*", true); + assert_refspec(GIT_DIR_FETCH, "refs/heads/*:refs/remotes/frotz", false); + assert_refspec(GIT_DIR_FETCH, "refs/heads:refs/remotes/frotz/*", false); + assert_refspec(GIT_DIR_FETCH, "refs/heads/master:refs/remotes/frotz/xyzzy", true); + assert_refspec(GIT_DIR_FETCH, "refs/heads/master::refs/remotes/frotz/xyzzy", false); + assert_refspec(GIT_DIR_FETCH, "refs/heads/maste :refs/remotes/frotz/xyzzy", false); + + assert_refspec(GIT_DIR_PUSH, "master~1:refs/remotes/frotz/backup", true); + assert_refspec(GIT_DIR_FETCH, "master~1:refs/remotes/frotz/backup", false); + assert_refspec(GIT_DIR_PUSH, "HEAD~4:refs/remotes/frotz/new", true); + assert_refspec(GIT_DIR_FETCH, "HEAD~4:refs/remotes/frotz/new", false); + + assert_refspec(GIT_DIR_PUSH, "HEAD", true); + assert_refspec(GIT_DIR_FETCH, "HEAD", true); + assert_refspec(GIT_DIR_PUSH, "refs/heads/ nitfol", false); + assert_refspec(GIT_DIR_FETCH, "refs/heads/ nitfol", false); + + assert_refspec(GIT_DIR_PUSH, "HEAD:", false); + assert_refspec(GIT_DIR_FETCH, "HEAD:", true); + assert_refspec(GIT_DIR_PUSH, "refs/heads/ nitfol:", false); + assert_refspec(GIT_DIR_FETCH, "refs/heads/ nitfol:", false); + + assert_refspec(GIT_DIR_PUSH, ":refs/remotes/frotz/deleteme", true); + assert_refspec(GIT_DIR_FETCH, ":refs/remotes/frotz/HEAD-to-me", true); + assert_refspec(GIT_DIR_PUSH, ":refs/remotes/frotz/delete me", false); + assert_refspec(GIT_DIR_FETCH, ":refs/remotes/frotz/HEAD to me", false); + + assert_refspec(GIT_DIR_FETCH, "refs/heads/*/for-linus:refs/remotes/mine/*-blah", false); + assert_refspec(GIT_DIR_PUSH, "refs/heads/*/for-linus:refs/remotes/mine/*-blah", false); + + assert_refspec(GIT_DIR_FETCH, "refs/heads*/for-linus:refs/remotes/mine/*", false); + assert_refspec(GIT_DIR_PUSH, "refs/heads*/for-linus:refs/remotes/mine/*", false); + + assert_refspec(GIT_DIR_FETCH, "refs/heads/*/*/for-linus:refs/remotes/mine/*", false); + assert_refspec(GIT_DIR_PUSH, "refs/heads/*/*/for-linus:refs/remotes/mine/*", false); + + assert_refspec(GIT_DIR_FETCH, "refs/heads/*/for-linus:refs/remotes/mine/*", true); + assert_refspec(GIT_DIR_PUSH, "refs/heads/*/for-linus:refs/remotes/mine/*", true); +} diff --git a/tests-clar/refs/create.c b/tests-clar/refs/create.c index 2e42cb607..af5b203a3 100644 --- a/tests-clar/refs/create.c +++ b/tests-clar/refs/create.c @@ -27,7 +27,7 @@ void test_refs_create__symbolic(void) git_oid id; git_buf ref_path = GIT_BUF_INIT; - const char *new_head_tracker = "another-head-tracker"; + const char *new_head_tracker = "ANOTHER_HEAD_TRACKER"; git_oid_fromstr(&id, current_master_tip); diff --git a/tests-clar/refs/isvalidname.c b/tests-clar/refs/isvalidname.c new file mode 100644 index 000000000..99761de32 --- /dev/null +++ b/tests-clar/refs/isvalidname.c @@ -0,0 +1,23 @@ +#include "clar_libgit2.h" + +void test_refs_isvalidname__can_detect_invalid_formats(void) +{ + cl_assert_equal_i(false, git_reference_is_valid_name("refs/tags/0.17.0^{}")); + cl_assert_equal_i(false, git_reference_is_valid_name("TWO/LEVELS")); + cl_assert_equal_i(false, git_reference_is_valid_name("ONE.LEVEL")); + cl_assert_equal_i(false, git_reference_is_valid_name("HEAD/")); + cl_assert_equal_i(false, git_reference_is_valid_name("NO_TRAILING_UNDERSCORE_")); + cl_assert_equal_i(false, git_reference_is_valid_name("_NO_LEADING_UNDERSCORE")); + cl_assert_equal_i(false, git_reference_is_valid_name("HEAD/aa")); + cl_assert_equal_i(false, git_reference_is_valid_name("lower_case")); + cl_assert_equal_i(false, git_reference_is_valid_name("")); +} + +void test_refs_isvalidname__wont_hopefully_choke_on_valid_formats(void) +{ + cl_assert_equal_i(true, git_reference_is_valid_name("refs/tags/0.17.0")); + cl_assert_equal_i(true, git_reference_is_valid_name("refs/LEVELS")); + cl_assert_equal_i(true, git_reference_is_valid_name("HEAD")); + cl_assert_equal_i(true, git_reference_is_valid_name("ONE_LEVEL")); + cl_assert_equal_i(true, git_reference_is_valid_name("refs/stash")); +} diff --git a/tests-clar/refs/lookup.c b/tests-clar/refs/lookup.c index ab563ac2b..71ab1b7b8 100644 --- a/tests-clar/refs/lookup.c +++ b/tests-clar/refs/lookup.c @@ -25,7 +25,7 @@ void test_refs_lookup__with_resolve(void) cl_assert(git_reference_cmp(a, b) == 0); git_reference_free(b); - cl_git_pass(git_reference_lookup_resolved(&b, g_repo, "head-tracker", 5)); + cl_git_pass(git_reference_lookup_resolved(&b, g_repo, "HEAD_TRACKER", 5)); cl_assert(git_reference_cmp(a, b) == 0); git_reference_free(b); diff --git a/tests-clar/refs/normalize.c b/tests-clar/refs/normalize.c index 4e80e4b0b..a144ef5c0 100644 --- a/tests-clar/refs/normalize.c +++ b/tests-clar/refs/normalize.c @@ -5,9 +5,10 @@ #include "reflog.h" // Helpers -static void ensure_refname_normalized(unsigned int flags, - const char *input_refname, - const char *expected_refname) +static void ensure_refname_normalized( + unsigned int flags, + const char *input_refname, + const char *expected_refname) { char buffer_out[GIT_REFNAME_MAX]; @@ -38,17 +39,7 @@ void test_refs_normalize__can_normalize_a_direct_reference_name(void) ensure_refname_normalized( GIT_REF_FORMAT_NORMAL, "refs/heads/v@ation", "refs/heads/v@ation"); ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "/refs///heads///a", "refs/heads/a"); -} - -void test_refs_normalize__can_normalize_some_specific_one_level_direct_reference_names(void) -{ - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "HEAD", "HEAD"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "MERGE_HEAD", "MERGE_HEAD"); - ensure_refname_normalized( - GIT_REF_FORMAT_NORMAL, "FETCH_HEAD", "FETCH_HEAD"); + GIT_REF_FORMAT_NORMAL, "refs///heads///a", "refs/heads/a"); } void test_refs_normalize__cannot_normalize_any_direct_reference_name(void) @@ -62,6 +53,8 @@ void test_refs_normalize__cannot_normalize_any_direct_reference_name(void) ensure_refname_invalid( GIT_REF_FORMAT_NORMAL, ""); ensure_refname_invalid( + GIT_REF_FORMAT_NORMAL, "/refs/heads/a/"); + ensure_refname_invalid( GIT_REF_FORMAT_NORMAL, "refs/heads/a/"); ensure_refname_invalid( GIT_REF_FORMAT_NORMAL, "refs/heads/a."); @@ -97,9 +90,9 @@ void test_refs_normalize__symbolic(void) GIT_REF_FORMAT_ALLOW_ONELEVEL, "///"); ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "a", "a"); + GIT_REF_FORMAT_ALLOW_ONELEVEL, "ALL_CAPS_AND_UNDERSCORES", "ALL_CAPS_AND_UNDERSCORES"); ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "a/b", "a/b"); + GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/MixedCasing", "refs/MixedCasing"); ensure_refname_normalized( GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs///heads///a", "refs/heads/a"); @@ -115,7 +108,7 @@ void test_refs_normalize__symbolic(void) * See https://github.com/spearce/JGit/commit/e4bf8f6957bbb29362575d641d1e77a02d906739 */ void test_refs_normalize__jgit_suite(void) { - // tests borrowed from JGit + // tests borrowed from JGit /* EmptyString */ ensure_refname_invalid( @@ -127,10 +120,9 @@ void test_refs_normalize__jgit_suite(void) ensure_refname_invalid( GIT_REF_FORMAT_NORMAL, "master"); ensure_refname_normalized( - GIT_REF_FORMAT_ALLOW_ONELEVEL, "heads/master", "heads/master"); + GIT_REF_FORMAT_NORMAL, "heads/master", "heads/master"); /* ValidHead */ - ensure_refname_normalized( GIT_REF_FORMAT_ALLOW_ONELEVEL, "refs/heads/master", "refs/heads/master"); ensure_refname_normalized( @@ -310,7 +302,61 @@ void test_refs_normalize__buffer_has_to_be_big_enough_to_hold_the_normalized_ver char buffer_out[21]; cl_git_pass(git_reference_normalize_name( - buffer_out, 21, "//refs//heads/long///name", GIT_REF_FORMAT_NORMAL)); + buffer_out, 21, "refs//heads///long///name", GIT_REF_FORMAT_NORMAL)); cl_git_fail(git_reference_normalize_name( - buffer_out, 20, "//refs//heads/long///name", GIT_REF_FORMAT_NORMAL)); + buffer_out, 20, "refs//heads///long///name", GIT_REF_FORMAT_NORMAL)); +} + +#define ONE_LEVEL_AND_REFSPEC \ + GIT_REF_FORMAT_ALLOW_ONELEVEL \ + | GIT_REF_FORMAT_REFSPEC_PATTERN + +void test_refs_normalize__refspec_pattern(void) +{ + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/*foo/bar"); + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/foo*/bar"); + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "heads/f*o/bar"); + + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "foo"); + ensure_refname_normalized( + ONE_LEVEL_AND_REFSPEC, "FOO", "FOO"); + + ensure_refname_normalized( + GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/bar", "foo/bar"); + ensure_refname_normalized( + ONE_LEVEL_AND_REFSPEC, "foo/bar", "foo/bar"); + + ensure_refname_normalized( + GIT_REF_FORMAT_REFSPEC_PATTERN, "*/foo", "*/foo"); + ensure_refname_normalized( + ONE_LEVEL_AND_REFSPEC, "*/foo", "*/foo"); + + ensure_refname_normalized( + GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/*/bar", "foo/*/bar"); + ensure_refname_normalized( + ONE_LEVEL_AND_REFSPEC, "foo/*/bar", "foo/*/bar"); + + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "*"); + ensure_refname_normalized( + ONE_LEVEL_AND_REFSPEC, "*", "*"); + + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "foo/*/*"); + ensure_refname_invalid( + ONE_LEVEL_AND_REFSPEC, "foo/*/*"); + + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "*/foo/*"); + ensure_refname_invalid( + ONE_LEVEL_AND_REFSPEC, "*/foo/*"); + + ensure_refname_invalid( + GIT_REF_FORMAT_REFSPEC_PATTERN, "*/*/foo"); + ensure_refname_invalid( + ONE_LEVEL_AND_REFSPEC, "*/*/foo"); } diff --git a/tests-clar/refs/read.c b/tests-clar/refs/read.c index f33658754..6ab6bf586 100644 --- a/tests-clar/refs/read.c +++ b/tests-clar/refs/read.c @@ -6,7 +6,7 @@ static const char *loose_tag_ref_name = "refs/tags/e90810b"; static const char *non_existing_tag_ref_name = "refs/tags/i-do-not-exist"; -static const char *head_tracker_sym_ref_name = "head-tracker"; +static const char *head_tracker_sym_ref_name = "HEAD_TRACKER"; static const char *current_head_target = "refs/heads/master"; static const char *current_master_tip = "a65fedf39aefe402d3bb6e24df4d4f5fe4547750"; static const char *packed_head_name = "refs/heads/packed"; @@ -221,7 +221,7 @@ void test_refs_read__unfound_return_ENOTFOUND(void) { git_reference *reference; - cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&reference, g_repo, "test/master")); + cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&reference, g_repo, "TEST_MASTER")); cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&reference, g_repo, "refs/test/master")); cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&reference, g_repo, "refs/tags/test/master")); cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&reference, g_repo, "refs/tags/test/farther/master")); diff --git a/tests-clar/resources/testrepo.git/head-tracker b/tests-clar/resources/testrepo.git/HEAD_TRACKER index 40d876b4c..40d876b4c 100644 --- a/tests-clar/resources/testrepo.git/head-tracker +++ b/tests-clar/resources/testrepo.git/HEAD_TRACKER diff --git a/tests-clar/resources/testrepo/.gitted/head-tracker b/tests-clar/resources/testrepo/.gitted/HEAD_TRACKER index 40d876b4c..40d876b4c 100644 --- a/tests-clar/resources/testrepo/.gitted/head-tracker +++ b/tests-clar/resources/testrepo/.gitted/HEAD_TRACKER |
