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:
commit
c0fd9146d6
6 changed files with 57 additions and 49 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
src/libstore/include/nix/store/export-import.hh
Normal file
24
src/libstore/include/nix/store/export-import.hh
Normal 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
|
||||||
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue