Skip to content

Commit 18d9913

Browse files
committed
[POC] Support the literal "." path
Fix #381
1 parent 341e86b commit 18d9913

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

os/src/Path.scala

+12-9
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,18 @@ object PathChunk extends PathChunkMacros {
3535
}
3636
}.reverse
3737
private[os] def segmentsFromStringLiteralValidation(literal: String): Array[String] = {
38-
val stringSegments = segmentsFromString(literal)
39-
val validSegmnts = reduceUps(validLiteralSegments(stringSegments))
40-
val sanitizedLiteral = validSegmnts.mkString("/")
41-
if (validSegmnts.isEmpty) throw InvalidSegment(
42-
literal,
43-
s"Literal path sequence [$literal] doesn't affect path being formed, please remove it"
44-
)
45-
if (literal != sanitizedLiteral) throw NonCanonicalLiteral(literal, sanitizedLiteral)
46-
stringSegments
38+
if (literal == ".") Array.empty
39+
else {
40+
val stringSegments = segmentsFromString(literal)
41+
val validSegments = reduceUps(validLiteralSegments(stringSegments))
42+
val sanitizedLiteral = validSegments.mkString("/")
43+
if (validSegments.isEmpty) throw InvalidSegment(
44+
literal,
45+
s"Literal path sequence [$literal] doesn't affect path being formed, please remove it"
46+
)
47+
if (literal != sanitizedLiteral) throw NonCanonicalLiteral(literal, sanitizedLiteral)
48+
stringSegments
49+
}
4750
}
4851
private def validLiteralSegments(segments: Array[String]): Array[String] = {
4952
val AllowedLiteralSegment = ".."

os/test/src/PathTests.scala

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ object PathTests extends TestSuite {
6060
assert(root / "hello" / ".." / "world" == root / "hello" / os.up / "world")
6161
assert(root / "hello" / "../world" == root / "hello" / os.up / "world")
6262
}
63+
test("literal [.]") {
64+
assert(root / "." == root)
65+
}
6366

6467
test("Compile errors") {
6568

@@ -122,13 +125,11 @@ object PathTests extends TestSuite {
122125
compileError("""root / "//foo/" """).check("", nonCanonicalLiteral("//foo/", "foo"))
123126

124127
compileError(""" rel / "src" / "" """).check("", removeLiteralErr(""))
125-
compileError(""" rel / "src" / "." """).check("", removeLiteralErr("."))
126128

127129
compileError(""" root / "src/" """).check("", nonCanonicalLiteral("src/", "src"))
128130
compileError(""" root / "src/." """).check("", nonCanonicalLiteral("src/.", "src"))
129131

130132
compileError(""" root / "" """).check("", removeLiteralErr(""))
131-
compileError(""" root / "." """).check("", removeLiteralErr("."))
132133

133134
}
134135
}

0 commit comments

Comments
 (0)