Skip to content

Commit 46035d9

Browse files
authored
Merge pull request libgit2#3882 from pks-t/pks/fix-fetch-refspec-dst-parsing
refspec: do not set empty rhs for fetch refspecs
2 parents ce54e77 + 1eee631 commit 46035d9

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

src/refspec.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
5353

5454
if (rhs) {
5555
size_t rlen = strlen(++rhs);
56-
is_glob = (1 <= rlen && strchr(rhs, '*'));
57-
refspec->dst = git__strndup(rhs, rlen);
56+
if (rlen || !is_fetch) {
57+
is_glob = (1 <= rlen && strchr(rhs, '*'));
58+
refspec->dst = git__strndup(rhs, rlen);
59+
}
5860
}
5961

6062
llen = (rhs ? (size_t)(rhs - lhs - 1) : strlen(lhs));

tests/online/fetchhead.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@ static void fetchhead_test_clone(void)
3535
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
3636
}
3737

38+
static int count_references(void)
39+
{
40+
git_strarray array;
41+
int refs;
42+
43+
cl_git_pass(git_reference_list(&array, g_repo));
44+
refs = array.count;
45+
46+
git_strarray_free(&array);
47+
48+
return refs;
49+
}
50+
3851
static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fetchhead)
3952
{
4053
git_remote *remote;
@@ -101,3 +114,41 @@ void test_online_fetchhead__no_merges(void)
101114
cl_git_pass(git_tag_delete(g_repo, "commit_tree"));
102115
fetchhead_test_fetch(NULL, FETCH_HEAD_NO_MERGE_DATA3);
103116
}
117+
118+
void test_online_fetchhead__explicit_dst_refspec_creates_branch(void)
119+
{
120+
git_reference *ref;
121+
int refs;
122+
123+
fetchhead_test_clone();
124+
refs = count_references();
125+
fetchhead_test_fetch("refs/heads/first-merge:refs/heads/explicit-refspec", FETCH_HEAD_EXPLICIT_DATA);
126+
127+
cl_git_pass(git_branch_lookup(&ref, g_repo, "explicit-refspec", GIT_BRANCH_ALL));
128+
cl_assert_equal_i(refs + 1, count_references());
129+
}
130+
131+
void test_online_fetchhead__empty_dst_refspec_creates_no_branch(void)
132+
{
133+
git_reference *ref;
134+
int refs;
135+
136+
fetchhead_test_clone();
137+
refs = count_references();
138+
139+
fetchhead_test_fetch("refs/heads/first-merge", FETCH_HEAD_EXPLICIT_DATA);
140+
cl_git_fail(git_branch_lookup(&ref, g_repo, "first-merge", GIT_BRANCH_ALL));
141+
142+
cl_assert_equal_i(refs, count_references());
143+
}
144+
145+
void test_online_fetchhead__colon_only_dst_refspec_creates_no_branch(void)
146+
{
147+
int refs;
148+
149+
fetchhead_test_clone();
150+
refs = count_references();
151+
fetchhead_test_fetch("refs/heads/first-merge:", FETCH_HEAD_EXPLICIT_DATA);
152+
153+
cl_assert_equal_i(refs, count_references());
154+
}

0 commit comments

Comments
 (0)