mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-11 00:36:20 +02:00
parent
8e222fbb12
commit
e97ac09abe
4 changed files with 148 additions and 119 deletions
|
@ -1,4 +1,4 @@
|
||||||
#include "store-api.hh"
|
#include "store-dir-config.hh"
|
||||||
|
|
||||||
#include <sodium.h>
|
#include <sodium.h>
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ StorePath StorePath::random(std::string_view name)
|
||||||
return StorePath(hash, name);
|
return StorePath(hash, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
StorePath Store::parseStorePath(std::string_view path) const
|
StorePath StoreDirConfig::parseStorePath(std::string_view path) const
|
||||||
{
|
{
|
||||||
auto p = canonPath(std::string(path));
|
auto p = canonPath(std::string(path));
|
||||||
if (dirOf(p) != storeDir)
|
if (dirOf(p) != storeDir)
|
||||||
|
@ -62,7 +62,7 @@ StorePath Store::parseStorePath(std::string_view path) const
|
||||||
return StorePath(baseNameOf(p));
|
return StorePath(baseNameOf(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<StorePath> Store::maybeParseStorePath(std::string_view path) const
|
std::optional<StorePath> StoreDirConfig::maybeParseStorePath(std::string_view path) const
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return parseStorePath(path);
|
return parseStorePath(path);
|
||||||
|
@ -71,24 +71,24 @@ std::optional<StorePath> Store::maybeParseStorePath(std::string_view path) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Store::isStorePath(std::string_view path) const
|
bool StoreDirConfig::isStorePath(std::string_view path) const
|
||||||
{
|
{
|
||||||
return (bool) maybeParseStorePath(path);
|
return (bool) maybeParseStorePath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
StorePathSet Store::parseStorePathSet(const PathSet & paths) const
|
StorePathSet StoreDirConfig::parseStorePathSet(const PathSet & paths) const
|
||||||
{
|
{
|
||||||
StorePathSet res;
|
StorePathSet res;
|
||||||
for (auto & i : paths) res.insert(parseStorePath(i));
|
for (auto & i : paths) res.insert(parseStorePath(i));
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Store::printStorePath(const StorePath & path) const
|
std::string StoreDirConfig::printStorePath(const StorePath & path) const
|
||||||
{
|
{
|
||||||
return (storeDir + "/").append(path.to_string());
|
return (storeDir + "/").append(path.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
PathSet Store::printStorePathSet(const StorePathSet & paths) const
|
PathSet StoreDirConfig::printStorePathSet(const StorePathSet & paths) const
|
||||||
{
|
{
|
||||||
PathSet res;
|
PathSet res;
|
||||||
for (auto & i : paths) res.insert(printStorePath(i));
|
for (auto & i : paths) res.insert(printStorePath(i));
|
||||||
|
|
|
@ -23,13 +23,13 @@ using json = nlohmann::json;
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
|
||||||
bool Store::isInStore(PathView path) const
|
bool StoreDirConfig::isInStore(PathView path) const
|
||||||
{
|
{
|
||||||
return isInDir(path, storeDir);
|
return isInDir(path, storeDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::pair<StorePath, Path> Store::toStorePath(PathView path) const
|
std::pair<StorePath, Path> StoreDirConfig::toStorePath(PathView path) const
|
||||||
{
|
{
|
||||||
if (!isInStore(path))
|
if (!isInStore(path))
|
||||||
throw Error("path '%1%' is not in the Nix store", path);
|
throw Error("path '%1%' is not in the Nix store", path);
|
||||||
|
@ -143,7 +143,7 @@ StorePath Store::followLinksToStorePath(std::string_view path) const
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeStorePath(std::string_view type,
|
StorePath StoreDirConfig::makeStorePath(std::string_view type,
|
||||||
std::string_view hash, std::string_view name) const
|
std::string_view hash, std::string_view name) const
|
||||||
{
|
{
|
||||||
/* e.g., "source:sha256:1abc...:/nix/store:foo.tar.gz" */
|
/* e.g., "source:sha256:1abc...:/nix/store:foo.tar.gz" */
|
||||||
|
@ -154,14 +154,14 @@ StorePath Store::makeStorePath(std::string_view type,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeStorePath(std::string_view type,
|
StorePath StoreDirConfig::makeStorePath(std::string_view type,
|
||||||
const Hash & hash, std::string_view name) const
|
const Hash & hash, std::string_view name) const
|
||||||
{
|
{
|
||||||
return makeStorePath(type, hash.to_string(HashFormat::Base16, true), name);
|
return makeStorePath(type, hash.to_string(HashFormat::Base16, true), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeOutputPath(std::string_view id,
|
StorePath StoreDirConfig::makeOutputPath(std::string_view id,
|
||||||
const Hash & hash, std::string_view name) const
|
const Hash & hash, std::string_view name) const
|
||||||
{
|
{
|
||||||
return makeStorePath("output:" + std::string { id }, hash, outputPathName(name, id));
|
return makeStorePath("output:" + std::string { id }, hash, outputPathName(name, id));
|
||||||
|
@ -172,7 +172,7 @@ StorePath Store::makeOutputPath(std::string_view id,
|
||||||
hacky, but we can't put them in, say, <s2> (per the grammar above)
|
hacky, but we can't put them in, say, <s2> (per the grammar above)
|
||||||
since that would be ambiguous. */
|
since that would be ambiguous. */
|
||||||
static std::string makeType(
|
static std::string makeType(
|
||||||
const Store & store,
|
const StoreDirConfig & store,
|
||||||
std::string && type,
|
std::string && type,
|
||||||
const StoreReferences & references)
|
const StoreReferences & references)
|
||||||
{
|
{
|
||||||
|
@ -185,7 +185,7 @@ static std::string makeType(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeFixedOutputPath(std::string_view name, const FixedOutputInfo & info) const
|
StorePath StoreDirConfig::makeFixedOutputPath(std::string_view name, const FixedOutputInfo & info) const
|
||||||
{
|
{
|
||||||
if (info.hash.type == htSHA256 && info.method == FileIngestionMethod::Recursive) {
|
if (info.hash.type == htSHA256 && info.method == FileIngestionMethod::Recursive) {
|
||||||
return makeStorePath(makeType(*this, "source", info.references), info.hash, name);
|
return makeStorePath(makeType(*this, "source", info.references), info.hash, name);
|
||||||
|
@ -201,7 +201,7 @@ StorePath Store::makeFixedOutputPath(std::string_view name, const FixedOutputInf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeTextPath(std::string_view name, const TextInfo & info) const
|
StorePath StoreDirConfig::makeTextPath(std::string_view name, const TextInfo & info) const
|
||||||
{
|
{
|
||||||
assert(info.hash.type == htSHA256);
|
assert(info.hash.type == htSHA256);
|
||||||
return makeStorePath(
|
return makeStorePath(
|
||||||
|
@ -214,7 +214,7 @@ StorePath Store::makeTextPath(std::string_view name, const TextInfo & info) cons
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::makeFixedOutputPathFromCA(std::string_view name, const ContentAddressWithReferences & ca) const
|
StorePath StoreDirConfig::makeFixedOutputPathFromCA(std::string_view name, const ContentAddressWithReferences & ca) const
|
||||||
{
|
{
|
||||||
// New template
|
// New template
|
||||||
return std::visit(overloaded {
|
return std::visit(overloaded {
|
||||||
|
@ -228,7 +228,7 @@ StorePath Store::makeFixedOutputPathFromCA(std::string_view name, const ContentA
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::pair<StorePath, Hash> Store::computeStorePathFromDump(
|
std::pair<StorePath, Hash> StoreDirConfig::computeStorePathFromDump(
|
||||||
Source & dump,
|
Source & dump,
|
||||||
std::string_view name,
|
std::string_view name,
|
||||||
FileIngestionMethod method,
|
FileIngestionMethod method,
|
||||||
|
@ -247,7 +247,7 @@ std::pair<StorePath, Hash> Store::computeStorePathFromDump(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePath Store::computeStorePathForText(
|
StorePath StoreDirConfig::computeStorePathForText(
|
||||||
std::string_view name,
|
std::string_view name,
|
||||||
std::string_view s,
|
std::string_view s,
|
||||||
const StorePathSet & references) const
|
const StorePathSet & references) const
|
||||||
|
@ -1315,7 +1315,7 @@ std::optional<ValidPathInfo> decodeValidPathInfo(const Store & store, std::istre
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Store::showPaths(const StorePathSet & paths)
|
std::string StoreDirConfig::showPaths(const StorePathSet & paths)
|
||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
for (auto & i : paths) {
|
for (auto & i : paths) {
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "config.hh"
|
#include "config.hh"
|
||||||
#include "path-info.hh"
|
#include "path-info.hh"
|
||||||
#include "repair-flag.hh"
|
#include "repair-flag.hh"
|
||||||
|
#include "store-dir-config.hh"
|
||||||
|
|
||||||
#include <nlohmann/json_fwd.hpp>
|
#include <nlohmann/json_fwd.hpp>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
@ -64,7 +65,6 @@ MakeError(InvalidPath, Error);
|
||||||
MakeError(Unsupported, Error);
|
MakeError(Unsupported, Error);
|
||||||
MakeError(SubstituteGone, Error);
|
MakeError(SubstituteGone, Error);
|
||||||
MakeError(SubstituterDisabled, Error);
|
MakeError(SubstituterDisabled, Error);
|
||||||
MakeError(BadStorePath, Error);
|
|
||||||
|
|
||||||
MakeError(InvalidStoreURI, Error);
|
MakeError(InvalidStoreURI, Error);
|
||||||
|
|
||||||
|
@ -97,11 +97,11 @@ struct KeyedBuildResult;
|
||||||
|
|
||||||
typedef std::map<StorePath, std::optional<ContentAddress>> StorePathCAMap;
|
typedef std::map<StorePath, std::optional<ContentAddress>> StorePathCAMap;
|
||||||
|
|
||||||
struct StoreConfig : public Config
|
struct StoreConfig : public StoreDirConfig
|
||||||
{
|
{
|
||||||
typedef std::map<std::string, std::string> Params;
|
typedef std::map<std::string, std::string> Params;
|
||||||
|
|
||||||
using Config::Config;
|
using StoreDirConfig::StoreDirConfig;
|
||||||
|
|
||||||
StoreConfig() = delete;
|
StoreConfig() = delete;
|
||||||
|
|
||||||
|
@ -131,15 +131,6 @@ struct StoreConfig : public Config
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
const PathSetting storeDir_{this, settings.nixStore,
|
|
||||||
"store",
|
|
||||||
R"(
|
|
||||||
Logical location of the Nix store, usually
|
|
||||||
`/nix/store`. Note that you can only copy store paths
|
|
||||||
between stores if they have the same `store` setting.
|
|
||||||
)"};
|
|
||||||
const Path storeDir = storeDir_;
|
|
||||||
|
|
||||||
const Setting<int> pathInfoCacheSize{this, 65536, "path-info-cache-size",
|
const Setting<int> pathInfoCacheSize{this, 65536, "path-info-cache-size",
|
||||||
"Size of the in-memory store path metadata cache."};
|
"Size of the in-memory store path metadata cache."};
|
||||||
|
|
||||||
|
@ -224,45 +215,6 @@ public:
|
||||||
|
|
||||||
virtual std::string getUri() = 0;
|
virtual std::string getUri() = 0;
|
||||||
|
|
||||||
StorePath parseStorePath(std::string_view path) const;
|
|
||||||
|
|
||||||
std::optional<StorePath> maybeParseStorePath(std::string_view path) const;
|
|
||||||
|
|
||||||
std::string printStorePath(const StorePath & path) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deprecated
|
|
||||||
*
|
|
||||||
* \todo remove
|
|
||||||
*/
|
|
||||||
StorePathSet parseStorePathSet(const PathSet & paths) const;
|
|
||||||
|
|
||||||
PathSet printStorePathSet(const StorePathSet & path) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Display a set of paths in human-readable form (i.e., between quotes
|
|
||||||
* and separated by commas).
|
|
||||||
*/
|
|
||||||
std::string showPaths(const StorePathSet & paths);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if ‘path’ is in the Nix store (but not the Nix
|
|
||||||
* store itself).
|
|
||||||
*/
|
|
||||||
bool isInStore(PathView path) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return true if ‘path’ is a store path, i.e. a direct child of the
|
|
||||||
* Nix store.
|
|
||||||
*/
|
|
||||||
bool isStorePath(std::string_view path) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Split a path like /nix/store/<hash>-<name>/<bla> into
|
|
||||||
* /nix/store/<hash>-<name> and /<bla>.
|
|
||||||
*/
|
|
||||||
std::pair<StorePath, Path> toStorePath(PathView path) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Follow symlinks until we end up with a path in the Nix store.
|
* Follow symlinks until we end up with a path in the Nix store.
|
||||||
*/
|
*/
|
||||||
|
@ -274,55 +226,6 @@ public:
|
||||||
*/
|
*/
|
||||||
StorePath followLinksToStorePath(std::string_view path) const;
|
StorePath followLinksToStorePath(std::string_view path) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a unique store path name.
|
|
||||||
*/
|
|
||||||
StorePath makeStorePath(std::string_view type,
|
|
||||||
std::string_view hash, std::string_view name) const;
|
|
||||||
StorePath makeStorePath(std::string_view type,
|
|
||||||
const Hash & hash, std::string_view name) const;
|
|
||||||
|
|
||||||
StorePath makeOutputPath(std::string_view id,
|
|
||||||
const Hash & hash, std::string_view name) const;
|
|
||||||
|
|
||||||
StorePath makeFixedOutputPath(std::string_view name, const FixedOutputInfo & info) const;
|
|
||||||
|
|
||||||
StorePath makeTextPath(std::string_view name, const TextInfo & info) const;
|
|
||||||
|
|
||||||
StorePath makeFixedOutputPathFromCA(std::string_view name, const ContentAddressWithReferences & ca) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read-only variant of addToStoreFromDump(). It returns the store
|
|
||||||
* path to which a NAR or flat file would be written.
|
|
||||||
*/
|
|
||||||
std::pair<StorePath, Hash> computeStorePathFromDump(
|
|
||||||
Source & dump,
|
|
||||||
std::string_view name,
|
|
||||||
FileIngestionMethod method = FileIngestionMethod::Recursive,
|
|
||||||
HashType hashAlgo = htSHA256,
|
|
||||||
const StorePathSet & references = {}) const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Preparatory part of addTextToStore().
|
|
||||||
*
|
|
||||||
* !!! Computation of the path should take the references given to
|
|
||||||
* addTextToStore() into account, otherwise we have a (relatively
|
|
||||||
* minor) security hole: a caller can register a source file with
|
|
||||||
* bogus references. If there are too many references, the path may
|
|
||||||
* not be garbage collected when it has to be (not really a problem,
|
|
||||||
* the caller could create a root anyway), or it may be garbage
|
|
||||||
* collected when it shouldn't be (more serious).
|
|
||||||
*
|
|
||||||
* Hashing the references would solve this (bogus references would
|
|
||||||
* simply yield a different store path, so other users wouldn't be
|
|
||||||
* affected), but it has some backwards compatibility issues (the
|
|
||||||
* hashing scheme changes), so I'm not doing that for now.
|
|
||||||
*/
|
|
||||||
StorePath computeStorePathForText(
|
|
||||||
std::string_view name,
|
|
||||||
std::string_view s,
|
|
||||||
const StorePathSet & references) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether a path is valid.
|
* Check whether a path is valid.
|
||||||
*/
|
*/
|
||||||
|
|
126
src/libstore/store-dir-config.hh
Normal file
126
src/libstore/store-dir-config.hh
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "path.hh"
|
||||||
|
#include "hash.hh"
|
||||||
|
#include "content-address.hh"
|
||||||
|
#include "globals.hh"
|
||||||
|
#include "config.hh"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <variant>
|
||||||
|
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
MakeError(BadStorePath, Error);
|
||||||
|
|
||||||
|
struct StoreDirConfig : public Config
|
||||||
|
{
|
||||||
|
using Config::Config;
|
||||||
|
|
||||||
|
StoreDirConfig() = delete;
|
||||||
|
|
||||||
|
virtual ~StoreDirConfig() = default;
|
||||||
|
|
||||||
|
const PathSetting storeDir_{this, settings.nixStore,
|
||||||
|
"store",
|
||||||
|
R"(
|
||||||
|
Logical location of the Nix store, usually
|
||||||
|
`/nix/store`. Note that you can only copy store paths
|
||||||
|
between stores if they have the same `store` setting.
|
||||||
|
)"};
|
||||||
|
const Path storeDir = storeDir_;
|
||||||
|
|
||||||
|
// pure methods
|
||||||
|
|
||||||
|
StorePath parseStorePath(std::string_view path) const;
|
||||||
|
|
||||||
|
std::optional<StorePath> maybeParseStorePath(std::string_view path) const;
|
||||||
|
|
||||||
|
std::string printStorePath(const StorePath & path) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deprecated
|
||||||
|
*
|
||||||
|
* \todo remove
|
||||||
|
*/
|
||||||
|
StorePathSet parseStorePathSet(const PathSet & paths) const;
|
||||||
|
|
||||||
|
PathSet printStorePathSet(const StorePathSet & path) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a set of paths in human-readable form (i.e., between quotes
|
||||||
|
* and separated by commas).
|
||||||
|
*/
|
||||||
|
std::string showPaths(const StorePathSet & paths);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if ‘path’ is in the Nix store (but not the Nix
|
||||||
|
* store itself).
|
||||||
|
*/
|
||||||
|
bool isInStore(PathView path) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if ‘path’ is a store path, i.e. a direct child of the
|
||||||
|
* Nix store.
|
||||||
|
*/
|
||||||
|
bool isStorePath(std::string_view path) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split a path like /nix/store/<hash>-<name>/<bla> into
|
||||||
|
* /nix/store/<hash>-<name> and /<bla>.
|
||||||
|
*/
|
||||||
|
std::pair<StorePath, Path> toStorePath(PathView path) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a unique store path name.
|
||||||
|
*/
|
||||||
|
StorePath makeStorePath(std::string_view type,
|
||||||
|
std::string_view hash, std::string_view name) const;
|
||||||
|
StorePath makeStorePath(std::string_view type,
|
||||||
|
const Hash & hash, std::string_view name) const;
|
||||||
|
|
||||||
|
StorePath makeOutputPath(std::string_view id,
|
||||||
|
const Hash & hash, std::string_view name) const;
|
||||||
|
|
||||||
|
StorePath makeFixedOutputPath(std::string_view name, const FixedOutputInfo & info) const;
|
||||||
|
|
||||||
|
StorePath makeTextPath(std::string_view name, const TextInfo & info) const;
|
||||||
|
|
||||||
|
StorePath makeFixedOutputPathFromCA(std::string_view name, const ContentAddressWithReferences & ca) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read-only variant of addToStoreFromDump(). It returns the store
|
||||||
|
* path to which a NAR or flat file would be written.
|
||||||
|
*/
|
||||||
|
std::pair<StorePath, Hash> computeStorePathFromDump(
|
||||||
|
Source & dump,
|
||||||
|
std::string_view name,
|
||||||
|
FileIngestionMethod method = FileIngestionMethod::Recursive,
|
||||||
|
HashType hashAlgo = htSHA256,
|
||||||
|
const StorePathSet & references = {}) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preparatory part of addTextToStore().
|
||||||
|
*
|
||||||
|
* !!! Computation of the path should take the references given to
|
||||||
|
* addTextToStore() into account, otherwise we have a (relatively
|
||||||
|
* minor) security hole: a caller can register a source file with
|
||||||
|
* bogus references. If there are too many references, the path may
|
||||||
|
* not be garbage collected when it has to be (not really a problem,
|
||||||
|
* the caller could create a root anyway), or it may be garbage
|
||||||
|
* collected when it shouldn't be (more serious).
|
||||||
|
*
|
||||||
|
* Hashing the references would solve this (bogus references would
|
||||||
|
* simply yield a different store path, so other users wouldn't be
|
||||||
|
* affected), but it has some backwards compatibility issues (the
|
||||||
|
* hashing scheme changes), so I'm not doing that for now.
|
||||||
|
*/
|
||||||
|
StorePath computeStorePathForText(
|
||||||
|
std::string_view name,
|
||||||
|
std::string_view s,
|
||||||
|
const StorePathSet & references) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue