aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/content-address.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/content-address.hh')
-rw-r--r--src/libstore/content-address.hh102
1 files changed, 98 insertions, 4 deletions
diff --git a/src/libstore/content-address.hh b/src/libstore/content-address.hh
index f6a6f5140..e15d76bd7 100644
--- a/src/libstore/content-address.hh
+++ b/src/libstore/content-address.hh
@@ -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
+ }
+};
+
}