lix/src/libstore/content-address.hh

120 lines
2.9 KiB
C++
Raw Normal View History

2020-06-01 21:32:27 +00:00
#pragma once
///@file
2020-06-01 21:32:27 +00:00
2020-06-01 22:53:31 +00:00
#include <variant>
2020-06-01 21:32:27 +00:00
#include "hash.hh"
#include "comparator.hh"
2020-06-01 21:32:27 +00:00
namespace nix {
/**
* An enumeration of the ways we can serialize file system objects.
*/
2020-06-01 21:32:27 +00:00
enum struct FileIngestionMethod : uint8_t {
/**
* Flat-file hashing. Directly ingest the contents of a single file
*/
2020-06-01 21:32:27 +00:00
Flat = false,
/**
* Recursive (or NAR) hashing. Serializes the file-system object in Nix
* Archive format and ingest that
*/
2020-06-01 21:32:27 +00:00
Recursive = true
};
/**
* Somewhat obscure, used by \ref Derivation derivations and
* `builtins.toFile` currently.
*/
2020-06-01 23:26:40 +00:00
struct TextHash {
/**
* Hash of the contents of the text/file.
*/
2020-06-01 23:26:40 +00:00
Hash hash;
GENERATE_CMP(TextHash, me->hash);
2020-06-01 23:26:40 +00:00
};
/**
* For path computed by makeFixedOutputPath.
*/
struct FixedOutputHash {
/**
* How the file system objects are serialized
*/
2020-06-01 21:32:27 +00:00
FileIngestionMethod method;
/**
* Hash of that serialization
*/
2020-06-01 21:32:27 +00:00
Hash hash;
2020-06-01 21:32:27 +00:00
std::string printMethodAlgo() const;
GENERATE_CMP(FixedOutputHash, me->method, me->hash);
2020-06-01 21:32:27 +00:00
};
/**
* We've accumulated several types of content-addressed paths over the
* years; fixed-output derivations support multiple hash algorithms and
* serialisation methods (flat file vs NAR). Thus, ca has one of the
* following forms:
*
* - text:sha256:<sha256 hash of file contents>: For paths
* computed by Store::makeTextPath() / Store::addTextToStore().
*
* - fixed:<r?>:<ht>:<h>: For paths computed by
* Store::makeFixedOutputPath() / Store::addToStore().
*/
2020-06-01 22:53:31 +00:00
typedef std::variant<
TextHash,
FixedOutputHash
2020-06-01 22:53:31 +00:00
> ContentAddress;
/**
* Compute the prefix to the hash algorithm which indicates how the
* files were ingested.
*/
2020-06-01 21:32:27 +00:00
std::string makeFileIngestionPrefix(const FileIngestionMethod m);
/**
* Compute the content-addressability assertion (ValidPathInfo::ca) for
* paths created by Store::makeFixedOutputPath() / Store::addToStore().
*/
2020-06-01 21:32:27 +00:00
std::string makeFixedOutputCA(FileIngestionMethod method, const Hash & hash);
2020-06-01 23:26:40 +00:00
std::string renderContentAddress(ContentAddress ca);
std::string renderContentAddress(std::optional<ContentAddress> ca);
ContentAddress parseContentAddress(std::string_view rawCa);
2020-06-02 00:37:43 +00:00
std::optional<ContentAddress> parseContentAddressOpt(std::string_view rawCaOpt);
2020-06-02 00:37:43 +00:00
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;
};
/**
* Ways of content addressing but not a complete ContentAddress.
*
* A ContentAddress without a Hash.
*/
typedef std::variant<
TextHashMethod,
FixedOutputHashMethod
> ContentAddressMethod;
ContentAddressMethod parseContentAddressMethod(std::string_view rawCaMethod);
std::string renderContentAddressMethod(ContentAddressMethod caMethod);
2020-06-01 21:32:27 +00:00
}