lix/src/libstore/file-hash.hh

60 lines
1.8 KiB
C++
Raw Normal View History

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-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-01 21:32:27 +00:00
}