aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/outputs-spec.cc7
-rw-r--r--src/libstore/tests/outputs-spec.cc7
2 files changed, 11 insertions, 3 deletions
diff --git a/src/libstore/outputs-spec.cc b/src/libstore/outputs-spec.cc
index a9e4320d5..096443cb2 100644
--- a/src/libstore/outputs-spec.cc
+++ b/src/libstore/outputs-spec.cc
@@ -21,7 +21,8 @@ bool OutputsSpec::contains(const std::string & outputName) const
std::optional<OutputsSpec> OutputsSpec::parseOpt(std::string_view s)
{
- static std::regex regex(R"((\*)|([a-z]+(,[a-z]+)*))");
+ // See checkName() for valid output name characters.
+ static std::regex regex(R"((\*)|([a-zA-Z\+\-\._\?=]+(,[a-zA-Z\+\-\._\?=]+)*))");
std::smatch match;
std::string s2 { s }; // until some improves std::regex
@@ -42,7 +43,7 @@ OutputsSpec OutputsSpec::parse(std::string_view s)
{
std::optional spec = parseOpt(s);
if (!spec)
- throw Error("Invalid outputs specifier: '%s'", s);
+ throw Error("invalid outputs specifier '%s'", s);
return *spec;
}
@@ -65,7 +66,7 @@ std::pair<std::string_view, ExtendedOutputsSpec> ExtendedOutputsSpec::parse(std:
{
std::optional spec = parseOpt(s);
if (!spec)
- throw Error("Invalid extended outputs specifier: '%s'", s);
+ throw Error("invalid extended outputs specifier '%s'", s);
return *spec;
}
diff --git a/src/libstore/tests/outputs-spec.cc b/src/libstore/tests/outputs-spec.cc
index c9c2cafd0..836ba7e82 100644
--- a/src/libstore/tests/outputs-spec.cc
+++ b/src/libstore/tests/outputs-spec.cc
@@ -40,6 +40,13 @@ TEST(OutputsSpec, names_out) {
ASSERT_EQ(expected.to_string(), str);
}
+TEST(OutputsSpec, names_underscore) {
+ std::string_view str = "a_b";
+ OutputsSpec expected = OutputsSpec::Names { "a_b" };
+ ASSERT_EQ(OutputsSpec::parse(str), expected);
+ ASSERT_EQ(expected.to_string(), str);
+}
+
TEST(OutputsSpec, names_out_bin) {
OutputsSpec expected = OutputsSpec::Names { "out", "bin" };
ASSERT_EQ(OutputsSpec::parse("out,bin"), expected);