From b74b0f4e1c4efe5e278a1a9b9c59f08688af9115 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 9 Apr 2025 15:23:12 -0400 Subject: [PATCH] Fix another machine config parsing bug We were ignorning the result of `trim`, and after my last change we were also trimmming too early. --- src/libstore-tests/machines.cc | 14 ++++++++++++++ src/libstore/machines.cc | 9 +++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/libstore-tests/machines.cc b/src/libstore-tests/machines.cc index 3d8570946..084807130 100644 --- a/src/libstore-tests/machines.cc +++ b/src/libstore-tests/machines.cc @@ -85,6 +85,20 @@ TEST(machines, getMachinesWithCommentsAndSemicolonSeparator) { EXPECT_THAT(actual, Contains(Field(&Machine::storeUri, AuthorityMatches("nix@scabby.labs.cs.uu.nl")))); } +TEST(machines, getMachinesWithFunnyWhitespace) { + auto actual = Machine::parseConfig({}, + " # commment ; comment\n" + " nix@scratchy.labs.cs.uu.nl ; nix@itchy.labs.cs.uu.nl \n" + "\n \n" + "\n ;;; \n" + "\n ; ; \n" + "nix@scabby.labs.cs.uu.nl\n\n"); + EXPECT_THAT(actual, SizeIs(3)); + EXPECT_THAT(actual, Contains(Field(&Machine::storeUri, AuthorityMatches("nix@scratchy.labs.cs.uu.nl")))); + EXPECT_THAT(actual, Contains(Field(&Machine::storeUri, AuthorityMatches("nix@itchy.labs.cs.uu.nl")))); + EXPECT_THAT(actual, Contains(Field(&Machine::storeUri, AuthorityMatches("nix@scabby.labs.cs.uu.nl")))); +} + TEST(machines, getMachinesWithCorrectCompleteSingleBuilder) { auto actual = Machine::parseConfig({}, "nix@scratchy.labs.cs.uu.nl i686-linux " diff --git a/src/libstore/machines.cc b/src/libstore/machines.cc index 6ed4ac8b6..d98d06651 100644 --- a/src/libstore/machines.cc +++ b/src/libstore/machines.cc @@ -106,13 +106,14 @@ static std::vector expandBuilderLines(const std::string & builders) { std::vector result; for (auto line : tokenizeString>(builders, "\n")) { - trim(line); line.erase(std::find(line.begin(), line.end(), '#'), line.end()); for (auto entry : tokenizeString>(line, ";")) { - if (entry.empty()) continue; + entry = trim(entry); - if (entry[0] == '@') { - const std::string path = trim(std::string(entry, 1)); + if (entry.empty()) { + // skip blank entries + } else if (entry[0] == '@') { + const std::string path = trim(std::string_view{entry}.substr(1)); std::string text; try { text = readFile(path);