1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-09 03:56:01 +01:00

Move exportPaths() / importPaths() out of the Store class (#13959)

This commit is contained in:
John Ericson 2025-09-10 15:39:20 -04:00 committed by GitHub
commit c0fd9146d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 57 additions and 49 deletions

View file

@ -1,3 +1,4 @@
#include "nix/store/export-import.hh"
#include "nix/util/serialise.hh" #include "nix/util/serialise.hh"
#include "nix/store/store-api.hh" #include "nix/store/store-api.hh"
#include "nix/util/archive.hh" #include "nix/util/archive.hh"
@ -8,27 +9,14 @@
namespace nix { namespace nix {
void Store::exportPaths(const StorePathSet & paths, Sink & sink) static void exportPath(Store & store, const StorePath & path, Sink & sink)
{ {
auto sorted = topoSortPaths(paths); auto info = store.queryPathInfo(path);
std::reverse(sorted.begin(), sorted.end());
for (auto & path : sorted) {
sink << 1;
exportPath(path, sink);
}
sink << 0;
}
void Store::exportPath(const StorePath & path, Sink & sink)
{
auto info = queryPathInfo(path);
HashSink hashSink(HashAlgorithm::SHA256); HashSink hashSink(HashAlgorithm::SHA256);
TeeSink teeSink(sink, hashSink); TeeSink teeSink(sink, hashSink);
narFromPath(path, teeSink); store.narFromPath(path, teeSink);
/* Refuse to export paths that have changed. This prevents /* Refuse to export paths that have changed. This prevents
filesystem corruption from spreading to other machines. filesystem corruption from spreading to other machines.
@ -37,16 +25,29 @@ void Store::exportPath(const StorePath & path, Sink & sink)
if (hash != info->narHash && info->narHash != Hash(info->narHash.algo)) if (hash != info->narHash && info->narHash != Hash(info->narHash.algo))
throw Error( throw Error(
"hash of path '%s' has changed from '%s' to '%s'!", "hash of path '%s' has changed from '%s' to '%s'!",
printStorePath(path), store.printStorePath(path),
info->narHash.to_string(HashFormat::Nix32, true), info->narHash.to_string(HashFormat::Nix32, true),
hash.to_string(HashFormat::Nix32, true)); hash.to_string(HashFormat::Nix32, true));
teeSink << exportMagic << printStorePath(path); teeSink << exportMagic << store.printStorePath(path);
CommonProto::write(*this, CommonProto::WriteConn{.to = teeSink}, info->references); CommonProto::write(store, CommonProto::WriteConn{.to = teeSink}, info->references);
teeSink << (info->deriver ? printStorePath(*info->deriver) : "") << 0; teeSink << (info->deriver ? store.printStorePath(*info->deriver) : "") << 0;
} }
StorePaths Store::importPaths(Source & source, CheckSigsFlag checkSigs) void exportPaths(Store & store, const StorePathSet & paths, Sink & sink)
{
auto sorted = store.topoSortPaths(paths);
std::reverse(sorted.begin(), sorted.end());
for (auto & path : sorted) {
sink << 1;
exportPath(store, path, sink);
}
sink << 0;
}
StorePaths importPaths(Store & store, Source & source, CheckSigsFlag checkSigs)
{ {
StorePaths res; StorePaths res;
while (true) { while (true) {
@ -66,17 +67,17 @@ StorePaths Store::importPaths(Source & source, CheckSigsFlag checkSigs)
if (magic != exportMagic) if (magic != exportMagic)
throw Error("Nix archive cannot be imported; wrong format"); throw Error("Nix archive cannot be imported; wrong format");
auto path = parseStorePath(readString(source)); auto path = store.parseStorePath(readString(source));
// Activity act(*logger, lvlInfo, "importing path '%s'", info.path); // Activity act(*logger, lvlInfo, "importing path '%s'", info.path);
auto references = CommonProto::Serialise<StorePathSet>::read(*this, CommonProto::ReadConn{.from = source}); auto references = CommonProto::Serialise<StorePathSet>::read(store, CommonProto::ReadConn{.from = source});
auto deriver = readString(source); auto deriver = readString(source);
auto narHash = hashString(HashAlgorithm::SHA256, saved.s); auto narHash = hashString(HashAlgorithm::SHA256, saved.s);
ValidPathInfo info{path, narHash}; ValidPathInfo info{path, narHash};
if (deriver != "") if (deriver != "")
info.deriver = parseStorePath(deriver); info.deriver = store.parseStorePath(deriver);
info.references = references; info.references = references;
info.narSize = saved.s.size(); info.narSize = saved.s.size();
@ -86,7 +87,7 @@ StorePaths Store::importPaths(Source & source, CheckSigsFlag checkSigs)
// Can't use underlying source, which would have been exhausted // Can't use underlying source, which would have been exhausted
auto source = StringSource(saved.s); auto source = StringSource(saved.s);
addToStore(info, source, NoRepair, checkSigs); store.addToStore(info, source, NoRepair, checkSigs);
res.push_back(info.path); res.push_back(info.path);
} }

View file

@ -0,0 +1,24 @@
#pragma once
#include "nix/store/store-api.hh"
namespace nix {
/**
* Magic header of exportPath() output (obsolete).
*/
const uint32_t exportMagic = 0x4558494e;
/**
* Export multiple paths in the format expected by `nix-store
* --import`. The paths will be sorted topologically.
*/
void exportPaths(Store & store, const StorePathSet & paths, Sink & sink);
/**
* Import a sequence of NAR dumps created by `exportPaths()` into the
* Nix store.
*/
StorePaths importPaths(Store & store, Source & source, CheckSigsFlag checkSigs = CheckSigs);
} // namespace nix

View file

@ -34,6 +34,7 @@ headers = [ config_pub_h ] + files(
'derived-path-map.hh', 'derived-path-map.hh',
'derived-path.hh', 'derived-path.hh',
'downstream-placeholder.hh', 'downstream-placeholder.hh',
'export-import.hh',
'filetransfer.hh', 'filetransfer.hh',
'gc-store.hh', 'gc-store.hh',
'globals.hh', 'globals.hh',

View file

@ -48,11 +48,6 @@ enum CheckSigsFlag : bool { NoCheckSigs = false, CheckSigs = true };
enum SubstituteFlag : bool { NoSubstitute = false, Substitute = true }; enum SubstituteFlag : bool { NoSubstitute = false, Substitute = true };
/**
* Magic header of exportPath() output (obsolete).
*/
const uint32_t exportMagic = 0x4558494e;
enum BuildMode : uint8_t { bmNormal, bmRepair, bmCheck }; enum BuildMode : uint8_t { bmNormal, bmRepair, bmCheck };
enum TrustedFlag : bool { NotTrusted = false, Trusted = true }; enum TrustedFlag : bool { NotTrusted = false, Trusted = true };
@ -804,21 +799,6 @@ public:
*/ */
StorePaths topoSortPaths(const StorePathSet & paths); StorePaths topoSortPaths(const StorePathSet & paths);
/**
* Export multiple paths in the format expected by nix-store
* --import.
*/
void exportPaths(const StorePathSet & paths, Sink & sink);
void exportPath(const StorePath & path, Sink & sink);
/**
* Import a sequence of NAR dumps created by exportPaths() into the
* Nix store. Optionally, the contents of the NARs are preloaded
* into the specified FS accessor to speed up subsequent access.
*/
StorePaths importPaths(Source & source, CheckSigsFlag checkSigs = CheckSigs);
struct Stats struct Stats
{ {
std::atomic<uint64_t> narInfoRead{0}; std::atomic<uint64_t> narInfoRead{0};

View file

@ -14,6 +14,7 @@
#include "nix/util/posix-source-accessor.hh" #include "nix/util/posix-source-accessor.hh"
#include "nix/store/globals.hh" #include "nix/store/globals.hh"
#include "nix/store/path-with-outputs.hh" #include "nix/store/path-with-outputs.hh"
#include "nix/store/export-import.hh"
#include "man-pages.hh" #include "man-pages.hh"
@ -774,7 +775,7 @@ static void opExport(Strings opFlags, Strings opArgs)
paths.insert(store->followLinksToStorePath(i)); paths.insert(store->followLinksToStorePath(i));
FdSink sink(getStandardOutput()); FdSink sink(getStandardOutput());
store->exportPaths(paths, sink); exportPaths(*store, paths, sink);
sink.flush(); sink.flush();
} }
@ -787,7 +788,7 @@ static void opImport(Strings opFlags, Strings opArgs)
throw UsageError("no arguments expected"); throw UsageError("no arguments expected");
FdSource source(STDIN_FILENO); FdSource source(STDIN_FILENO);
auto paths = store->importPaths(source, NoCheckSigs); auto paths = importPaths(*store, source, NoCheckSigs);
for (auto & i : paths) for (auto & i : paths)
cout << fmt("%s\n", store->printStorePath(i)) << std::flush; cout << fmt("%s\n", store->printStorePath(i)) << std::flush;

View file

@ -11,6 +11,7 @@
#include "nix/store/globals.hh" #include "nix/store/globals.hh"
#include "nix/store/store-open.hh" #include "nix/store/store-open.hh"
#include "nix/util/posix-source-accessor.hh" #include "nix/util/posix-source-accessor.hh"
#include "nix/store/export-import.hh"
#include <sodium.h> #include <sodium.h>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@ -233,7 +234,7 @@ StoreWrapper::exportPaths(int fd, ...)
StorePathSet paths; StorePathSet paths;
for (int n = 2; n < items; ++n) paths.insert(THIS->store->parseStorePath(SvPV_nolen(ST(n)))); for (int n = 2; n < items; ++n) paths.insert(THIS->store->parseStorePath(SvPV_nolen(ST(n))));
FdSink sink(fd); FdSink sink(fd);
THIS->store->exportPaths(paths, sink); exportPaths(*THIS->store, paths, sink);
} catch (Error & e) { } catch (Error & e) {
croak("%s", e.what()); croak("%s", e.what());
} }
@ -244,7 +245,7 @@ StoreWrapper::importPaths(int fd, int dontCheckSigs)
PPCODE: PPCODE:
try { try {
FdSource source(fd); FdSource source(fd);
THIS->store->importPaths(source, dontCheckSigs ? NoCheckSigs : CheckSigs); importPaths(*THIS->store, source, dontCheckSigs ? NoCheckSigs : CheckSigs);
} catch (Error & e) { } catch (Error & e) {
croak("%s", e.what()); croak("%s", e.what());
} }