2020-06-02 00:32:27 +03:00
|
|
|
|
#pragma once
|
2023-04-01 06:18:41 +03:00
|
|
|
|
///@file
|
2020-06-02 00:32:27 +03:00
|
|
|
|
|
2020-06-02 01:53:31 +03:00
|
|
|
|
#include <variant>
|
2020-06-02 00:32:27 +03:00
|
|
|
|
#include "hash.hh"
|
|
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* An enumeration of the ways we can serialize file system objects.
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
enum struct FileIngestionMethod : uint8_t {
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Flat-file hashing. Directly ingest the contents of a single file
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
Flat = false,
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Recursive (or NAR) hashing. Serializes the file-system object in Nix
|
|
|
|
|
* Archive format and ingest that
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
Recursive = true
|
|
|
|
|
};
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Somewhat obscure, used by \ref Derivation derivations and
|
|
|
|
|
* `builtins.toFile` currently.
|
|
|
|
|
*/
|
2020-06-02 02:26:40 +03:00
|
|
|
|
struct TextHash {
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Hash of the contents of the text/file.
|
|
|
|
|
*/
|
2020-06-02 02:26:40 +03:00
|
|
|
|
Hash hash;
|
|
|
|
|
};
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* For path computed by makeFixedOutputPath.
|
|
|
|
|
*/
|
2020-06-19 18:18:19 +03:00
|
|
|
|
struct FixedOutputHash {
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* How the file system objects are serialized
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
FileIngestionMethod method;
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Hash of that serialization
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
Hash hash;
|
2023-03-26 01:12:44 +02:00
|
|
|
|
|
2020-06-02 00:32:27 +03:00
|
|
|
|
std::string printMethodAlgo() const;
|
|
|
|
|
};
|
|
|
|
|
|
2023-03-26 01:12:44 +02: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-02 01:53:31 +03:00
|
|
|
|
typedef std::variant<
|
2023-03-26 01:12:44 +02:00
|
|
|
|
TextHash,
|
|
|
|
|
FixedOutputHash
|
2020-06-02 01:53:31 +03:00
|
|
|
|
> ContentAddress;
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Compute the prefix to the hash algorithm which indicates how the
|
|
|
|
|
* files were ingested.
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
std::string makeFileIngestionPrefix(const FileIngestionMethod m);
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Compute the content-addressability assertion (ValidPathInfo::ca) for
|
|
|
|
|
* paths created by Store::makeFixedOutputPath() / Store::addToStore().
|
|
|
|
|
*/
|
2020-06-02 00:32:27 +03:00
|
|
|
|
std::string makeFixedOutputCA(FileIngestionMethod method, const Hash & hash);
|
|
|
|
|
|
2020-06-02 02:26:40 +03:00
|
|
|
|
std::string renderContentAddress(ContentAddress ca);
|
|
|
|
|
|
|
|
|
|
std::string renderContentAddress(std::optional<ContentAddress> ca);
|
|
|
|
|
|
2020-06-02 18:00:10 +03:00
|
|
|
|
ContentAddress parseContentAddress(std::string_view rawCa);
|
2020-06-02 03:37:43 +03:00
|
|
|
|
|
2020-06-02 18:00:10 +03:00
|
|
|
|
std::optional<ContentAddress> parseContentAddressOpt(std::string_view rawCaOpt);
|
2020-06-02 03:37:43 +03:00
|
|
|
|
|
2020-07-10 14:21:37 +03:00
|
|
|
|
Hash getContentAddressHash(const ContentAddress & ca);
|
|
|
|
|
|
2020-09-17 18:15:05 +03:00
|
|
|
|
/*
|
|
|
|
|
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;
|
|
|
|
|
};
|
|
|
|
|
|
2023-03-26 01:12:44 +02:00
|
|
|
|
/**
|
|
|
|
|
* Ways of content addressing but not a complete ContentAddress.
|
|
|
|
|
*
|
|
|
|
|
* A ContentAddress without a Hash.
|
|
|
|
|
*/
|
2020-09-17 18:15:05 +03:00
|
|
|
|
typedef std::variant<
|
|
|
|
|
TextHashMethod,
|
|
|
|
|
FixedOutputHashMethod
|
|
|
|
|
> ContentAddressMethod;
|
|
|
|
|
|
|
|
|
|
ContentAddressMethod parseContentAddressMethod(std::string_view rawCaMethod);
|
|
|
|
|
|
|
|
|
|
std::string renderContentAddressMethod(ContentAddressMethod caMethod);
|
|
|
|
|
|
2020-06-02 00:32:27 +03:00
|
|
|
|
}
|