mirror of
https://github.com/NixOS/nix.git
synced 2025-11-25 11:49:35 +01:00
Use PathReferences more widely
This commit is contained in:
parent
dae4409071
commit
f8d562c0a7
29 changed files with 431 additions and 205 deletions
|
|
@ -2,14 +2,20 @@
|
|||
|
||||
#include <variant>
|
||||
#include "hash.hh"
|
||||
#include "path.hh"
|
||||
|
||||
namespace nix {
|
||||
|
||||
/*
|
||||
* Mini content address
|
||||
*/
|
||||
|
||||
enum struct FileIngestionMethod : uint8_t {
|
||||
Flat = false,
|
||||
Recursive = true
|
||||
};
|
||||
|
||||
|
||||
struct TextHash {
|
||||
Hash hash;
|
||||
};
|
||||
|
|
@ -41,10 +47,6 @@ typedef std::variant<
|
|||
ingested. */
|
||||
std::string makeFileIngestionPrefix(const FileIngestionMethod m);
|
||||
|
||||
/* Compute the content-addressability assertion (ValidPathInfo::ca)
|
||||
for paths created by makeFixedOutputPath() / addToStore(). */
|
||||
std::string makeFixedOutputCA(FileIngestionMethod method, const Hash & hash);
|
||||
|
||||
std::string renderContentAddress(ContentAddress ca);
|
||||
|
||||
std::string renderContentAddress(std::optional<ContentAddress> ca);
|
||||
|
|
@ -74,4 +76,96 @@ ContentAddressMethod parseContentAddressMethod(std::string_view rawCaMethod);
|
|||
|
||||
std::string renderContentAddressMethod(ContentAddressMethod caMethod);
|
||||
|
||||
/*
|
||||
* References set
|
||||
*/
|
||||
|
||||
template<typename Ref>
|
||||
struct PathReferences
|
||||
{
|
||||
std::set<Ref> references;
|
||||
bool hasSelfReference = false;
|
||||
|
||||
bool operator == (const PathReferences<Ref> & other) const
|
||||
{
|
||||
return references == other.references
|
||||
&& hasSelfReference == other.hasSelfReference;
|
||||
}
|
||||
|
||||
/* Functions to view references + hasSelfReference as one set, mainly for
|
||||
compatibility's sake. */
|
||||
StorePathSet referencesPossiblyToSelf(const Ref & self) const;
|
||||
void insertReferencePossiblyToSelf(const Ref & self, Ref && ref);
|
||||
void setReferencesPossiblyToSelf(const Ref & self, std::set<Ref> && refs);
|
||||
};
|
||||
|
||||
template<typename Ref>
|
||||
StorePathSet PathReferences<Ref>::referencesPossiblyToSelf(const Ref & self) const
|
||||
{
|
||||
StorePathSet refs { references };
|
||||
if (hasSelfReference)
|
||||
refs.insert(self);
|
||||
return refs;
|
||||
}
|
||||
|
||||
template<typename Ref>
|
||||
void PathReferences<Ref>::insertReferencePossiblyToSelf(const Ref & self, Ref && ref)
|
||||
{
|
||||
if (ref == self)
|
||||
hasSelfReference = true;
|
||||
else
|
||||
references.insert(std::move(ref));
|
||||
}
|
||||
|
||||
template<typename Ref>
|
||||
void PathReferences<Ref>::setReferencesPossiblyToSelf(const Ref & self, std::set<Ref> && refs)
|
||||
{
|
||||
if (refs.count(self))
|
||||
hasSelfReference = true;
|
||||
refs.erase(self);
|
||||
|
||||
references = refs;
|
||||
}
|
||||
|
||||
/*
|
||||
* Full content address
|
||||
*
|
||||
* See the schema for store paths in store-api.cc
|
||||
*/
|
||||
|
||||
// This matches the additional info that we need for makeTextPath
|
||||
struct TextInfo : TextHash {
|
||||
// References for the paths, self references disallowed
|
||||
StorePathSet references;
|
||||
};
|
||||
|
||||
struct FixedOutputInfo : FixedOutputHash {
|
||||
// References for the paths
|
||||
PathReferences<StorePath> references;
|
||||
};
|
||||
|
||||
typedef std::variant<
|
||||
TextInfo,
|
||||
FixedOutputInfo
|
||||
> ContentAddressWithReferences;
|
||||
|
||||
ContentAddressWithReferences caWithoutRefs(const ContentAddress &);
|
||||
|
||||
struct StorePathDescriptor {
|
||||
std::string name;
|
||||
ContentAddressWithReferences info;
|
||||
|
||||
bool operator == (const StorePathDescriptor & other) const
|
||||
{
|
||||
return name == other.name;
|
||||
// FIXME second field
|
||||
}
|
||||
|
||||
bool operator < (const StorePathDescriptor & other) const
|
||||
{
|
||||
return name < other.name;
|
||||
// FIXME second field
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue