2020-06-01 21:32:27 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2020-06-01 22:53:31 +00:00
|
|
|
|
#include <variant>
|
2020-06-01 21:32:27 +00:00
|
|
|
|
#include "hash.hh"
|
|
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
|
|
enum struct FileIngestionMethod : uint8_t {
|
|
|
|
|
Flat = false,
|
|
|
|
|
Recursive = true
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-01 23:26:40 +00:00
|
|
|
|
struct TextHash {
|
|
|
|
|
Hash hash;
|
2020-06-02 00:37:43 +00:00
|
|
|
|
TextHash(const TextHash &) = default;
|
|
|
|
|
TextHash(TextHash &&) = default;
|
|
|
|
|
TextHash & operator = (const TextHash &) = default;
|
2020-06-01 23:26:40 +00:00
|
|
|
|
};
|
|
|
|
|
|
2020-06-01 21:32:27 +00:00
|
|
|
|
/// Pair of a hash, and how the file system was ingested
|
|
|
|
|
struct FileSystemHash {
|
|
|
|
|
FileIngestionMethod method;
|
|
|
|
|
Hash hash;
|
|
|
|
|
FileSystemHash(FileIngestionMethod method, Hash hash)
|
|
|
|
|
: method(std::move(method))
|
|
|
|
|
, hash(std::move(hash))
|
|
|
|
|
{ }
|
|
|
|
|
FileSystemHash(const FileSystemHash &) = default;
|
|
|
|
|
FileSystemHash(FileSystemHash &&) = default;
|
|
|
|
|
FileSystemHash & operator = (const FileSystemHash &) = default;
|
|
|
|
|
std::string printMethodAlgo() const;
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-01 22:53:31 +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 makeTextPath() / addTextToStore().
|
|
|
|
|
|
|
|
|
|
* ‘fixed:<r?>:<ht>:<h>’: For paths computed by
|
|
|
|
|
makeFixedOutputPath() / addToStore().
|
|
|
|
|
*/
|
|
|
|
|
typedef std::variant<
|
2020-06-01 23:26:40 +00:00
|
|
|
|
TextHash, // for paths computed by makeTextPath() / addTextToStore
|
2020-06-01 22:53:31 +00:00
|
|
|
|
FileSystemHash // for path computed by makeFixedOutputPath
|
|
|
|
|
> ContentAddress;
|
|
|
|
|
|
2020-06-01 21:32:27 +00:00
|
|
|
|
/* 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);
|
|
|
|
|
|
2020-06-01 23:26:40 +00:00
|
|
|
|
std::string renderContentAddress(ContentAddress ca);
|
|
|
|
|
|
|
|
|
|
std::string renderContentAddress(std::optional<ContentAddress> ca);
|
|
|
|
|
|
2020-06-02 15:00:10 +00:00
|
|
|
|
ContentAddress parseContentAddress(std::string_view rawCa);
|
2020-06-02 00:37:43 +00:00
|
|
|
|
|
2020-06-02 15:00:10 +00:00
|
|
|
|
std::optional<ContentAddress> parseContentAddressOpt(std::string_view rawCaOpt);
|
2020-06-02 00:37:43 +00:00
|
|
|
|
|
2020-06-01 21:32:27 +00:00
|
|
|
|
}
|