Skip to content

Commit 119bdd8

Browse files
authored
Merge pull request libgit2#4231 from wabain/open-revrange
revparse: support open-ended ranges
2 parents 924f5d1 + 8b107dc commit 119bdd8

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

src/revparse.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -892,16 +892,35 @@ int git_revparse(
892892
const char *rstr;
893893
revspec->flags = GIT_REVPARSE_RANGE;
894894

895+
/*
896+
* Following git.git, don't allow '..' because it makes command line
897+
* arguments which can be either paths or revisions ambiguous when the
898+
* path is almost certainly intended. The empty range '...' is still
899+
* allowed.
900+
*/
901+
if (!git__strcmp(spec, "..")) {
902+
giterr_set(GITERR_INVALID, "Invalid pattern '..'");
903+
return GIT_EINVALIDSPEC;
904+
}
905+
895906
lstr = git__substrdup(spec, dotdot - spec);
896907
rstr = dotdot + 2;
897908
if (dotdot[2] == '.') {
898909
revspec->flags |= GIT_REVPARSE_MERGE_BASE;
899910
rstr++;
900911
}
901912

902-
error = git_revparse_single(&revspec->from, repo, lstr);
903-
if (!error)
904-
error = git_revparse_single(&revspec->to, repo, rstr);
913+
error = git_revparse_single(
914+
&revspec->from,
915+
repo,
916+
*lstr == '\0' ? "HEAD" : lstr);
917+
918+
if (!error) {
919+
error = git_revparse_single(
920+
&revspec->to,
921+
repo,
922+
*rstr == '\0' ? "HEAD" : rstr);
923+
}
905924

906925
git__free((void*)lstr);
907926
} else {

tests/refs/revparse.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ static void test_id(
122122
test_id_inrepo(spec, expected_left, expected_right, expected_flags, g_repo);
123123
}
124124

125+
static void test_invalid_revspec(const char* invalid_spec)
126+
{
127+
git_revspec revspec;
128+
129+
cl_assert_equal_i(
130+
GIT_EINVALIDSPEC, git_revparse(&revspec, g_repo, invalid_spec));
131+
}
132+
125133
void test_refs_revparse__initialize(void)
126134
{
127135
cl_git_pass(git_repository_open(&g_repo, cl_fixture("testrepo.git")));
@@ -749,6 +757,33 @@ void test_refs_revparse__parses_range_operator(void)
749757
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
750758
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
751759
GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
760+
761+
test_id("HEAD~3..",
762+
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
763+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
764+
GIT_REVPARSE_RANGE);
765+
766+
test_id("HEAD~3...",
767+
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
768+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
769+
GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
770+
771+
test_id("..HEAD~3",
772+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
773+
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
774+
GIT_REVPARSE_RANGE);
775+
776+
test_id("...HEAD~3",
777+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
778+
"4a202b346bb0fb0db7eff3cffeb3c70babbd2045",
779+
GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
780+
781+
test_id("...",
782+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
783+
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
784+
GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
785+
786+
test_invalid_revspec("..");
752787
}
753788

754789
void test_refs_revparse__ext_retrieves_both_the_reference_and_its_target(void)

0 commit comments

Comments
 (0)