Skip to content

Commit 4dcd95a

Browse files
authored
Vcs.parse fix (#1963)
* Vcs.parse fix: split by char instead of (malformed) regex * VcsParseTest * move VcsParseTest to modules/build (see #1976) * VcsParseTest fix * Vcs.parse: fix github parsing
1 parent 064bae2 commit 4dcd95a

File tree

2 files changed

+93
-2
lines changed

2 files changed

+93
-2
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package scala.build.options.publish
2+
3+
import scala.build.Positioned
4+
import scala.build.errors.{BuildException, MalformedInputError}
5+
6+
import munit.Assertions.assertEquals
7+
8+
class VcsParseTest extends munit.FunSuite {
9+
test("valid GitHub") {
10+
val actual = Vcs.parse(Positioned.none("github:VirtusLab/scala-cli"))
11+
val expected: Either[BuildException, Vcs] = Right(Vcs(
12+
"https://github.com/VirtusLab/scala-cli.git",
13+
"scm:git:github.com/VirtusLab/scala-cli.git",
14+
"scm:git:[email protected]:VirtusLab/scala-cli.git"
15+
))
16+
17+
assertEquals(expected, actual)
18+
}
19+
20+
test("invalid GitHub: missing /") {
21+
val actual = Vcs.parse(Positioned.none("github:scala-cli"))
22+
val expected =
23+
Left(new MalformedInputError("github-vcs", "github:scala-cli", "github:org/project", Nil))
24+
25+
assert(actual.isInstanceOf[Left[BuildException, Vcs]])
26+
assertEquals(expected.toString, actual.toString)
27+
}
28+
29+
test("invalid GitHub: too many /") {
30+
val actual = Vcs.parse(Positioned.none("github:github.com/VirtusLab/scala-cli"))
31+
val expected = Left(new MalformedInputError(
32+
"github-vcs",
33+
"github:github.com/VirtusLab/scala-cli",
34+
"github:org/project",
35+
Nil
36+
))
37+
38+
assert(actual.isInstanceOf[Left[BuildException, Vcs]])
39+
assertEquals(expected.toString, actual.toString)
40+
}
41+
42+
test("valid generic") {
43+
val actual = Vcs.parse(Positioned.none(
44+
"https://github.com/VirtusLab/scala-cli.git|scm:git:github.com/VirtusLab/scala-cli.git|scm:git:[email protected]:VirtusLab/scala-cli.git"
45+
))
46+
val expected: Either[BuildException, Vcs] = Right(Vcs(
47+
"https://github.com/VirtusLab/scala-cli.git",
48+
"scm:git:github.com/VirtusLab/scala-cli.git",
49+
"scm:git:[email protected]:VirtusLab/scala-cli.git"
50+
))
51+
52+
assertEquals(expected, actual)
53+
}
54+
55+
test("invalid generic: missing |") {
56+
val actual = Vcs.parse(Positioned.none(
57+
"https://github.com/VirtusLab/scala-cli|scm:git:github.com/VirtusLab/scala-cli.git"
58+
))
59+
val expected = Left(new MalformedInputError(
60+
"vcs",
61+
"https://github.com/VirtusLab/scala-cli|scm:git:github.com/VirtusLab/scala-cli.git",
62+
"url|connection|developer-connection",
63+
Nil
64+
))
65+
66+
assert(actual.isInstanceOf[Left[BuildException, Vcs]])
67+
assertEquals(expected.toString, actual.toString)
68+
}
69+
70+
test("invalid generic: extra |") {
71+
val actual = Vcs.parse(Positioned.none("a|b|c|d"))
72+
val expected =
73+
Left(new MalformedInputError("vcs", "a|b|c|d", "url|connection|developer-connection", Nil))
74+
75+
assert(actual.isInstanceOf[Left[BuildException, Vcs]])
76+
assertEquals(expected.toString, actual.toString)
77+
}
78+
79+
test("invalid generic: gibberish") {
80+
val actual = Vcs.parse(Positioned.none("sfrgt pagdhn"))
81+
val expected = Left(new MalformedInputError(
82+
"vcs",
83+
"sfrgt pagdhn",
84+
"url|connection|developer-connection",
85+
Nil
86+
))
87+
88+
assert(actual.isInstanceOf[Left[BuildException, Vcs]])
89+
assertEquals(expected.toString, actual.toString)
90+
}
91+
}

modules/options/src/main/scala/scala/build/options/publish/Vcs.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ object Vcs {
1313

1414
def parse(input: Positioned[String]): Either[BuildException, Vcs] =
1515
if (input.value.startsWith("github:"))
16-
input.value.stripPrefix("github:").split("/", 2) match {
16+
input.value.stripPrefix("github:").split('/') match {
1717
case Array(org, project) =>
1818
val vcs = Vcs(
1919
s"https://github.com/$org/$project.git",
@@ -32,7 +32,7 @@ object Vcs {
3232
)
3333
}
3434
else
35-
input.value.split("|", 3) match {
35+
input.value.split('|') match {
3636
case Array(url, conn, devConn) =>
3737
val vcs = Vcs(url, conn, devConn)
3838
Right(vcs)

0 commit comments

Comments
 (0)