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.hh100
1 files changed, 79 insertions, 21 deletions
diff --git a/src/libstore/content-address.hh b/src/libstore/content-address.hh
index f6a6f5140..c49ab269f 100644
--- a/src/libstore/content-address.hh
+++ b/src/libstore/content-address.hh
@@ -2,16 +2,56 @@
#include <variant>
#include "hash.hh"
+#include "path.hh"
+#include "comparator.hh"
namespace nix {
+/*
+ * Content addressing method
+ */
+
+/* We only have one way to hash text with references, so this is a single-value
+ type, mainly useful with std::variant.
+*/
+struct TextHashMethod : std::monostate { };
+
enum struct FileIngestionMethod : uint8_t {
Flat = false,
Recursive = true
};
+struct FixedOutputHashMethod {
+ FileIngestionMethod fileIngestionMethod;
+ HashType hashType;
+};
+
+/* Compute the prefix to the hash algorithm which indicates how the files were
+ ingested. */
+std::string makeFileIngestionPrefix(FileIngestionMethod m);
+
+
+/* Just the type of a content address. Combine with the hash itself, and we
+ have a `ContentAddress` as defined below. Combine that, in turn, with info
+ on references, and we have `ContentAddressWithReferences`, as defined
+ further below. */
+typedef std::variant<
+ TextHashMethod,
+ FixedOutputHashMethod
+> ContentAddressMethod;
+
+ContentAddressMethod parseContentAddressMethod(std::string_view rawCaMethod);
+
+std::string renderContentAddressMethod(ContentAddressMethod caMethod);
+
+/*
+ * Mini content address
+ */
+
struct TextHash {
Hash hash;
+
+ GENERATE_CMP(TextHash, me->hash);
};
/// Pair of a hash, and how the file system was ingested
@@ -19,6 +59,8 @@ struct FixedOutputHash {
FileIngestionMethod method;
Hash hash;
std::string printMethodAlgo() const;
+
+ GENERATE_CMP(FixedOutputHash, me->method, me->hash);
};
/*
@@ -37,14 +79,6 @@ typedef std::variant<
FixedOutputHash // for path computed by makeFixedOutputPath
> ContentAddress;
-/* Compute the prefix to the hash algorithm which indicates how the files were
- 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);
@@ -55,23 +89,47 @@ std::optional<ContentAddress> parseContentAddressOpt(std::string_view rawCaOpt);
Hash getContentAddressHash(const ContentAddress & ca);
+
/*
- We only have one way to hash text with references, so this is single-value
- type is only useful in std::variant.
-*/
-struct TextHashMethod { };
-struct FixedOutputHashMethod {
- FileIngestionMethod fileIngestionMethod;
- HashType hashType;
+ * References set
+ */
+
+struct StoreReferences {
+ StorePathSet others;
+ bool self = false;
+
+ bool empty() const;
+ size_t size() const;
+
+ GENERATE_CMP(StoreReferences, me->self, me->others);
};
-typedef std::variant<
- TextHashMethod,
- FixedOutputHashMethod
- > ContentAddressMethod;
+/*
+ * Full content address
+ *
+ * See the schema for store paths in store-api.cc
+ */
-ContentAddressMethod parseContentAddressMethod(std::string_view rawCaMethod);
+// This matches the additional info that we need for makeTextPath
+struct TextInfo : TextHash {
+ // References for the paths, self references disallowed
+ StorePathSet references;
-std::string renderContentAddressMethod(ContentAddressMethod caMethod);
+ GENERATE_CMP(TextInfo, *(const TextHash *)me, me->references);
+};
+
+struct FixedOutputInfo : FixedOutputHash {
+ // References for the paths
+ StoreReferences references;
+
+ GENERATE_CMP(FixedOutputInfo, *(const FixedOutputHash *)me, me->references);
+};
+
+typedef std::variant<
+ TextInfo,
+ FixedOutputInfo
+> ContentAddressWithReferences;
+
+ContentAddressWithReferences caWithoutRefs(const ContentAddress &);
}