Skip to content

Commit 00a9d35

Browse files
committed
Fix source links to allow branch names with slashes
1 parent f35899e commit 00a9d35

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

scaladoc/src/dotty/tools/scaladoc/SourceLinks.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ case class WebBasedSourceLink(prefix: String, revision: String, subPath: String)
4343
s"$prefix/$action/$finalRevision$subPath/${pathToString(path)}$linePart"
4444

4545
class SourceLinkParser(revision: Option[String]) extends ArgParser[SourceLink]:
46-
val KnownProvider = raw"(\w+):\/\/([^\/#]+)\/([^\/#]+)(\/[^\/#]+)?(#.+)?".r
46+
val KnownProvider = raw"(\w+):\/\/([^\/#]+)\/([^\/#]+)(\/[^#]+)?(#.+)?".r
4747
val BrokenKnownProvider = raw"(\w+):\/\/.+".r
4848
val ScalaDocPatten = raw"€\{(TPL_NAME|TPL_OWNER|FILE_PATH|FILE_EXT|FILE_LINE|FILE_PATH_EXT)\}".r
4949
val SupportedScalaDocPatternReplacements = Map(
@@ -63,6 +63,12 @@ class SourceLinkParser(revision: Option[String]) extends ArgParser[SourceLink]:
6363

6464
def parse(string: String): Either[String, SourceLink] =
6565
val res = string match
66+
case scaladocSetting if ScalaDocPatten.findFirstIn(scaladocSetting).nonEmpty =>
67+
val all = ScalaDocPatten.findAllIn(scaladocSetting)
68+
val (supported, unsupported) = all.partition(SupportedScalaDocPatternReplacements.contains)
69+
if unsupported.nonEmpty then Left(s"Unsupported patterns from scaladoc format are used: ${unsupported.mkString(" ")}")
70+
else Right(TemplateSourceLink(supported.foldLeft(string)((template, pattern) =>
71+
template.replace(pattern, SupportedScalaDocPatternReplacements(pattern)))))
6672
case KnownProvider(name, organization, repo, rawRevision, rawSubPath) =>
6773
val subPath = Option(rawSubPath).fold("")("/" + _.drop(1))
6874
val pathRev = Option(rawRevision).map(_.drop(1)).orElse(revision)
@@ -81,12 +87,6 @@ class SourceLinkParser(revision: Option[String]) extends ArgParser[SourceLink]:
8187
Left(s"'$other' is not a known provider, please provide full source path template.")
8288
case BrokenKnownProvider("gitlab" | "github") =>
8389
Left(s"Does not match known provider syntax: `<name>://organization/repository`")
84-
case scaladocSetting if ScalaDocPatten.findFirstIn(scaladocSetting).nonEmpty =>
85-
val all = ScalaDocPatten.findAllIn(scaladocSetting)
86-
val (supported, unsupported) = all.partition(SupportedScalaDocPatternReplacements.contains)
87-
if unsupported.nonEmpty then Left(s"Unsupported patterns from scaladoc format are used: ${unsupported.mkString(" ")}")
88-
else Right(TemplateSourceLink(supported.foldLeft(string)((template, pattern) =>
89-
template.replace(pattern, SupportedScalaDocPatternReplacements(pattern)))))
9090
case other =>
9191
Left("Does not match any implemented source link syntax")
9292
res match {

scaladoc/test/dotty/tools/scaladoc/source-links/SourceLinksTest.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class SourceLinkTest:
3333
Seq(
3434
"github://lampepfl/dotty",
3535
"gitlab://lampepfl/dotty",
36+
"github://lampepfl/dotty/branch/withslash",
3637
"https://github.com/scala/scala/blob/2.13.x€{FILE_PATH_EXT}#€{FILE_LINE}"
3738
).foreach{ template =>
3839
test(template)
@@ -45,12 +46,6 @@ class SourceLinkTest:
4546
val template = s"$provider://ala/ma"
4647
val res = SourceLinkParser(None).parse(template)
4748
assertTrue(s"Expected failure containing missing revision: $res", res.left.exists(_.contains("revision")))
48-
49-
Seq(s"$provider://ala/ma/", s"$provider://ala", s"$provider://ala/ma/develop/on/master").foreach { template =>
50-
val res = SourceLinkParser(Some("develop")).parse(template)
51-
assertTrue(s"Expected failure syntax info: $res", res.left.exists(_.contains("syntax")))
52-
}
53-
5449
}
5550

5651
class SourceLinksTest:
@@ -142,6 +137,13 @@ class SourceLinksTest:
142137
("project/Build.scala", 54, edit) -> "https://github.com/scala/scala/blob/2.13.x/project/Build.scala#L54",
143138
)
144139

140+
testLink(Seq("github://lampepfl/dotty/branch/withslash#src/lib"), None)(
141+
"project/Build.scala" -> "https://github.com/lampepfl/dotty/blob/branch/withslash/src/lib/project/Build.scala",
142+
("project/Build.scala", 54) -> "https://github.com/lampepfl/dotty/blob/branch/withslash/src/lib/project/Build.scala#L54",
143+
("project/Build.scala", edit) -> "https://github.com/lampepfl/dotty/edit/branch/withslash/src/lib/project/Build.scala",
144+
("project/Build.scala", 54, edit) -> "https://github.com/lampepfl/dotty/edit/branch/withslash/src/lib/project/Build.scala#L54",
145+
)
146+
145147
@Test
146148
def testBasicPrefixedPaths =
147149
testLink(Seq("src=gitlab://lampepfl/dotty"), Some("develop"))(

0 commit comments

Comments
 (0)