aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/legacy-ssh-store.cc24
-rw-r--r--src/libstore/serve-protocol.cc44
-rw-r--r--src/libstore/serve-protocol.hh3
-rw-r--r--src/nix-store/nix-store.cc12
-rw-r--r--tests/unit/libstore/serve-protocol.cc77
-rw-r--r--unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.3.binbin0 -> 184 bytes
-rw-r--r--unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.4.binbin0 -> 648 bytes
7 files changed, 132 insertions, 28 deletions
diff --git a/src/libstore/legacy-ssh-store.cc b/src/libstore/legacy-ssh-store.cc
index 7e119ce49..890c8a149 100644
--- a/src/libstore/legacy-ssh-store.cc
+++ b/src/libstore/legacy-ssh-store.cc
@@ -172,24 +172,12 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
if (p.empty()) return callback(nullptr);
auto path2 = parseStorePath(p);
assert(path == path2);
- /* Hash will be set below. FIXME construct ValidPathInfo at end. */
- auto info = std::make_shared<ValidPathInfo>(path, Hash::dummy);
-
- auto deriver = readString(conn->from);
- if (deriver != "")
- info->deriver = parseStorePath(deriver);
- info->references = ServeProto::Serialise<StorePathSet>::read(*this, *conn);
- readLongLong(conn->from); // download size
- info->narSize = readLongLong(conn->from);
-
- {
- auto s = readString(conn->from);
- if (s == "")
- throw Error("NAR hash is now mandatory");
- info->narHash = Hash::parseAnyPrefixed(s);
- }
- info->ca = ContentAddress::parseOpt(readString(conn->from));
- info->sigs = readStrings<StringSet>(conn->from);
+ auto info = std::make_shared<ValidPathInfo>(
+ path,
+ ServeProto::Serialise<UnkeyedValidPathInfo>::read(*this, *conn));
+
+ if (info->narHash == Hash::dummy)
+ throw Error("NAR hash is now mandatory");
auto s = readString(conn->from);
assert(s == "");
diff --git a/src/libstore/serve-protocol.cc b/src/libstore/serve-protocol.cc
index 97a0ddf0e..2e15d28d5 100644
--- a/src/libstore/serve-protocol.cc
+++ b/src/libstore/serve-protocol.cc
@@ -6,6 +6,7 @@
#include "serve-protocol.hh"
#include "serve-protocol-impl.hh"
#include "archive.hh"
+#include "path-info.hh"
#include <nlohmann/json.hpp>
@@ -55,4 +56,47 @@ void ServeProto::Serialise<BuildResult>::write(const Store & store, ServeProto::
}
}
+
+UnkeyedValidPathInfo ServeProto::Serialise<UnkeyedValidPathInfo>::read(const Store & store, ReadConn conn)
+{
+ /* Hash should be set below unless very old `nix-store --serve`.
+ Caller should assert that it did set it. */
+ UnkeyedValidPathInfo info { Hash::dummy };
+
+ auto deriver = readString(conn.from);
+ if (deriver != "")
+ info.deriver = store.parseStorePath(deriver);
+ info.references = ServeProto::Serialise<StorePathSet>::read(store, conn);
+
+ readLongLong(conn.from); // download size, unused
+ info.narSize = readLongLong(conn.from);
+
+ if (GET_PROTOCOL_MINOR(conn.version) >= 4) {
+ auto s = readString(conn.from);
+ if (!s.empty())
+ info.narHash = Hash::parseAnyPrefixed(s);
+ info.ca = ContentAddress::parseOpt(readString(conn.from));
+ info.sigs = readStrings<StringSet>(conn.from);
+ }
+
+ return info;
+}
+
+void ServeProto::Serialise<UnkeyedValidPathInfo>::write(const Store & store, WriteConn conn, const UnkeyedValidPathInfo & info)
+{
+ conn.to
+ << (info.deriver ? store.printStorePath(*info.deriver) : "");
+
+ ServeProto::write(store, conn, info.references);
+ // !!! Maybe we want compression?
+ conn.to
+ << info.narSize // downloadSize, lie a little
+ << info.narSize;
+ if (GET_PROTOCOL_MINOR(conn.version) >= 4)
+ conn.to
+ << info.narHash.to_string(Base32, true)
+ << renderContentAddress(info.ca)
+ << info.sigs;
+}
+
}
diff --git a/src/libstore/serve-protocol.hh b/src/libstore/serve-protocol.hh
index ba159f6e9..3f82c8177 100644
--- a/src/libstore/serve-protocol.hh
+++ b/src/libstore/serve-protocol.hh
@@ -18,6 +18,7 @@ struct Source;
// items being serialised
struct BuildResult;
+struct UnkeyedValidPathInfo;
/**
@@ -141,6 +142,8 @@ inline std::ostream & operator << (std::ostream & s, ServeProto::Command op)
template<>
DECLARE_SERVE_SERIALISER(BuildResult);
+template<>
+DECLARE_SERVE_SERIALISER(UnkeyedValidPathInfo);
template<typename T>
DECLARE_SERVE_SERIALISER(std::vector<T>);
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 79002626d..d53e93b7f 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -891,16 +891,8 @@ static void opServe(Strings opFlags, Strings opArgs)
for (auto & i : paths) {
try {
auto info = store->queryPathInfo(i);
- out << store->printStorePath(info->path)
- << (info->deriver ? store->printStorePath(*info->deriver) : "");
- ServeProto::write(*store, wconn, info->references);
- // !!! Maybe we want compression?
- out << info->narSize // downloadSize
- << info->narSize;
- if (GET_PROTOCOL_MINOR(clientVersion) >= 4)
- out << info->narHash.to_string(Base32, true)
- << renderContentAddress(info->ca)
- << info->sigs;
+ out << store->printStorePath(info->path);
+ ServeProto::write(*store, wconn, static_cast<const UnkeyedValidPathInfo &>(*info));
} catch (InvalidPath &) {
}
}
diff --git a/tests/unit/libstore/serve-protocol.cc b/tests/unit/libstore/serve-protocol.cc
index b67b19dbf..138f31b47 100644
--- a/tests/unit/libstore/serve-protocol.cc
+++ b/tests/unit/libstore/serve-protocol.cc
@@ -227,6 +227,83 @@ VERSIONED_CHARACTERIZATION_TEST(
VERSIONED_CHARACTERIZATION_TEST(
ServeProtoTest,
+ unkeyedValidPathInfo_2_3,
+ "unkeyed-valid-path-info-2.3",
+ 2 << 8 | 3,
+ (std::tuple<UnkeyedValidPathInfo, UnkeyedValidPathInfo> {
+ ({
+ UnkeyedValidPathInfo info { Hash::dummy };
+ info.narSize = 34878;
+ info;
+ }),
+ ({
+ UnkeyedValidPathInfo info { Hash::dummy };
+ info.deriver = StorePath {
+ "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar.drv",
+ };
+ info.references = {
+ StorePath {
+ "g1w7hyyyy1w7hy3qg1w7hy3qgqqqqy3q-foo.drv",
+ },
+ };
+ info.narSize = 34878;
+ info;
+ }),
+ }))
+
+VERSIONED_CHARACTERIZATION_TEST(
+ ServeProtoTest,
+ unkeyedValidPathInfo_2_4,
+ "unkeyed-valid-path-info-2.4",
+ 2 << 8 | 4,
+ (std::tuple<UnkeyedValidPathInfo, UnkeyedValidPathInfo> {
+ ({
+ UnkeyedValidPathInfo info {
+ Hash::parseSRI("sha256-FePFYIlMuycIXPZbWi7LGEiMmZSX9FMbaQenWBzm1Sc="),
+ };
+ info.deriver = StorePath {
+ "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar.drv",
+ };
+ info.references = {
+ StorePath {
+ "g1w7hyyyy1w7hy3qg1w7hy3qgqqqqy3q-foo.drv",
+ },
+ };
+ info.narSize = 34878;
+ info;
+ }),
+ ({
+ ValidPathInfo info {
+ *LibStoreTest::store,
+ "foo",
+ FixedOutputInfo {
+ .method = FileIngestionMethod::Recursive,
+ .hash = hashString(HashType::htSHA256, "(...)"),
+ .references = {
+ .others = {
+ StorePath {
+ "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar",
+ },
+ },
+ .self = true,
+ },
+ },
+ Hash::parseSRI("sha256-FePFYIlMuycIXPZbWi7LGEiMmZSX9FMbaQenWBzm1Sc="),
+ };
+ info.deriver = StorePath {
+ "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar.drv",
+ };
+ info.narSize = 34878;
+ info.sigs = {
+ "fake-sig-1",
+ "fake-sig-2",
+ },
+ static_cast<UnkeyedValidPathInfo>(std::move(info));
+ }),
+ }))
+
+VERSIONED_CHARACTERIZATION_TEST(
+ ServeProtoTest,
vector,
"vector",
defaultVersion,
diff --git a/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.3.bin b/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.3.bin
new file mode 100644
index 000000000..8056ec055
--- /dev/null
+++ b/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.3.bin
Binary files differ
diff --git a/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.4.bin b/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.4.bin
new file mode 100644
index 000000000..521b5c423
--- /dev/null
+++ b/unit-test-data/libstore/serve-protocol/unkeyed-valid-path-info-2.4.bin
Binary files differ