forked from lix-project/lix
Renamed HashFormat::Base32 to HashFormat::Nix32
...and also adjusted parsing accordingly. Also added CLI completion for HashFormats. https://github.com/NixOS/nix/issues/8876
This commit is contained in:
parent
837b889c41
commit
fc6f29053a
|
@ -304,7 +304,7 @@ static void fetch(EvalState & state, const PosIdx pos, Value * * args, Value & v
|
||||||
: hashFile(HashAlgorithm::SHA256, state.store->toRealPath(storePath));
|
: hashFile(HashAlgorithm::SHA256, state.store->toRealPath(storePath));
|
||||||
if (hash != *expectedHash)
|
if (hash != *expectedHash)
|
||||||
state.debugThrowLastTrace(EvalError((unsigned int) 102, "hash mismatch in file downloaded from '%s':\n specified: %s\n got: %s",
|
state.debugThrowLastTrace(EvalError((unsigned int) 102, "hash mismatch in file downloaded from '%s':\n specified: %s\n got: %s",
|
||||||
*url, expectedHash->to_string(HashFormat::Base32, true), hash.to_string(HashFormat::Base32, true)));
|
*url, expectedHash->to_string(HashFormat::Nix32, true), hash.to_string(HashFormat::Nix32, true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
state.allowAndSetStorePathString(storePath, v);
|
state.allowAndSetStorePathString(storePath, v);
|
||||||
|
|
|
@ -52,7 +52,7 @@ bool touchCacheFile(const Path & path, time_t touch_time)
|
||||||
Path getCachePath(std::string_view key)
|
Path getCachePath(std::string_view key)
|
||||||
{
|
{
|
||||||
return getCacheDir() + "/nix/gitv3/" +
|
return getCacheDir() + "/nix/gitv3/" +
|
||||||
hashString(HashAlgorithm::SHA256, key).to_string(HashFormat::Base32, false);
|
hashString(HashAlgorithm::SHA256, key).to_string(HashFormat::Nix32, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the name of the HEAD branch.
|
// Returns the name of the HEAD branch.
|
||||||
|
|
|
@ -267,7 +267,7 @@ struct MercurialInputScheme : InputScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Path cacheDir = fmt("%s/nix/hg/%s", getCacheDir(), hashString(HashAlgorithm::SHA256, actualUrl).to_string(HashFormat::Base32, false));
|
Path cacheDir = fmt("%s/nix/hg/%s", getCacheDir(), hashString(HashAlgorithm::SHA256, actualUrl).to_string(HashFormat::Nix32, false));
|
||||||
|
|
||||||
/* If this is a commit hash that we already have, we don't
|
/* If this is a commit hash that we already have, we don't
|
||||||
have to pull again. */
|
have to pull again. */
|
||||||
|
|
|
@ -165,7 +165,7 @@ ref<const ValidPathInfo> BinaryCacheStore::addToStoreCommon(
|
||||||
auto [fileHash, fileSize] = fileHashSink.finish();
|
auto [fileHash, fileSize] = fileHashSink.finish();
|
||||||
narInfo->fileHash = fileHash;
|
narInfo->fileHash = fileHash;
|
||||||
narInfo->fileSize = fileSize;
|
narInfo->fileSize = fileSize;
|
||||||
narInfo->url = "nar/" + narInfo->fileHash->to_string(HashFormat::Base32, false) + ".nar"
|
narInfo->url = "nar/" + narInfo->fileHash->to_string(HashFormat::Nix32, false) + ".nar"
|
||||||
+ (compression == "xz" ? ".xz" :
|
+ (compression == "xz" ? ".xz" :
|
||||||
compression == "bzip2" ? ".bz2" :
|
compression == "bzip2" ? ".bz2" :
|
||||||
compression == "zstd" ? ".zst" :
|
compression == "zstd" ? ".zst" :
|
||||||
|
|
|
@ -1067,7 +1067,7 @@ void LocalDerivationGoal::initTmpDir() {
|
||||||
env[i.first] = i.second;
|
env[i.first] = i.second;
|
||||||
} else {
|
} else {
|
||||||
auto hash = hashString(HashAlgorithm::SHA256, i.first);
|
auto hash = hashString(HashAlgorithm::SHA256, i.first);
|
||||||
std::string fn = ".attr-" + hash.to_string(HashFormat::Base32, false);
|
std::string fn = ".attr-" + hash.to_string(HashFormat::Nix32, false);
|
||||||
Path p = tmpDir + "/" + fn;
|
Path p = tmpDir + "/" + fn;
|
||||||
writeFile(p, rewriteStrings(i.second, inputRewrites));
|
writeFile(p, rewriteStrings(i.second, inputRewrites));
|
||||||
chownToBuilder(p);
|
chownToBuilder(p);
|
||||||
|
|
|
@ -61,7 +61,7 @@ std::string ContentAddress::render() const
|
||||||
+ makeFileIngestionPrefix(method);
|
+ makeFileIngestionPrefix(method);
|
||||||
},
|
},
|
||||||
}, method.raw)
|
}, method.raw)
|
||||||
+ this->hash.to_string(HashFormat::Base32, true);
|
+ this->hash.to_string(HashFormat::Nix32, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -958,7 +958,7 @@ void writeDerivation(Sink & out, const StoreDirConfig & store, const BasicDeriva
|
||||||
std::string hashPlaceholder(const OutputNameView outputName)
|
std::string hashPlaceholder(const OutputNameView outputName)
|
||||||
{
|
{
|
||||||
// FIXME: memoize?
|
// FIXME: memoize?
|
||||||
return "/" + hashString(HashAlgorithm::SHA256, concatStrings("nix-output:", outputName)).to_string(HashFormat::Base32, false);
|
return "/" + hashString(HashAlgorithm::SHA256, concatStrings("nix-output:", outputName)).to_string(HashFormat::Nix32, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ namespace nix {
|
||||||
|
|
||||||
std::string DownstreamPlaceholder::render() const
|
std::string DownstreamPlaceholder::render() const
|
||||||
{
|
{
|
||||||
return "/" + hash.to_string(HashFormat::Base32, false);
|
return "/" + hash.to_string(HashFormat::Nix32, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ DownstreamPlaceholder DownstreamPlaceholder::unknownDerivation(
|
||||||
xpSettings.require(Xp::DynamicDerivations);
|
xpSettings.require(Xp::DynamicDerivations);
|
||||||
auto compressed = compressHash(placeholder.hash, 20);
|
auto compressed = compressHash(placeholder.hash, 20);
|
||||||
auto clearText = "nix-computed-output:"
|
auto clearText = "nix-computed-output:"
|
||||||
+ compressed.to_string(HashFormat::Base32, false)
|
+ compressed.to_string(HashFormat::Nix32, false)
|
||||||
+ ":" + std::string { outputName };
|
+ ":" + std::string { outputName };
|
||||||
return DownstreamPlaceholder {
|
return DownstreamPlaceholder {
|
||||||
hashString(HashAlgorithm::SHA256, clearText)
|
hashString(HashAlgorithm::SHA256, clearText)
|
||||||
|
|
|
@ -41,7 +41,7 @@ void Store::exportPath(const StorePath & path, Sink & sink)
|
||||||
Hash hash = hashSink.currentHash().first;
|
Hash hash = hashSink.currentHash().first;
|
||||||
if (hash != info->narHash && info->narHash != Hash(info->narHash.algo))
|
if (hash != info->narHash && info->narHash != Hash(info->narHash.algo))
|
||||||
throw Error("hash of path '%s' has changed from '%s' to '%s'!",
|
throw Error("hash of path '%s' has changed from '%s' to '%s'!",
|
||||||
printStorePath(path), info->narHash.to_string(HashFormat::Base32, true), hash.to_string(HashFormat::Base32, true));
|
printStorePath(path), info->narHash.to_string(HashFormat::Nix32, true), hash.to_string(HashFormat::Nix32, true));
|
||||||
|
|
||||||
teeSink
|
teeSink
|
||||||
<< exportMagic
|
<< exportMagic
|
||||||
|
|
|
@ -50,7 +50,7 @@ static void makeSymlink(const Path & link, const Path & target)
|
||||||
|
|
||||||
void LocalStore::addIndirectRoot(const Path & path)
|
void LocalStore::addIndirectRoot(const Path & path)
|
||||||
{
|
{
|
||||||
std::string hash = hashString(HashAlgorithm::SHA1, path).to_string(HashFormat::Base32, false);
|
std::string hash = hashString(HashAlgorithm::SHA1, path).to_string(HashFormat::Nix32, false);
|
||||||
Path realRoot = canonPath(fmt("%1%/%2%/auto/%3%", stateDir, gcRootsDir, hash));
|
Path realRoot = canonPath(fmt("%1%/%2%/auto/%3%", stateDir, gcRootsDir, hash));
|
||||||
makeSymlink(realRoot, path);
|
makeSymlink(realRoot, path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1080,7 +1080,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
|
||||||
|
|
||||||
if (hashResult.first != info.narHash)
|
if (hashResult.first != info.narHash)
|
||||||
throw Error("hash mismatch importing path '%s';\n specified: %s\n got: %s",
|
throw Error("hash mismatch importing path '%s';\n specified: %s\n got: %s",
|
||||||
printStorePath(info.path), info.narHash.to_string(HashFormat::Base32, true), hashResult.first.to_string(HashFormat::Base32, true));
|
printStorePath(info.path), info.narHash.to_string(HashFormat::Nix32, true), hashResult.first.to_string(HashFormat::Nix32, true));
|
||||||
|
|
||||||
if (hashResult.second != info.narSize)
|
if (hashResult.second != info.narSize)
|
||||||
throw Error("size mismatch importing path '%s';\n specified: %s\n got: %s",
|
throw Error("size mismatch importing path '%s';\n specified: %s\n got: %s",
|
||||||
|
@ -1096,8 +1096,8 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
|
||||||
if (specified.hash != actualHash.hash) {
|
if (specified.hash != actualHash.hash) {
|
||||||
throw Error("ca hash mismatch importing path '%s';\n specified: %s\n got: %s",
|
throw Error("ca hash mismatch importing path '%s';\n specified: %s\n got: %s",
|
||||||
printStorePath(info.path),
|
printStorePath(info.path),
|
||||||
specified.hash.to_string(HashFormat::Base32, true),
|
specified.hash.to_string(HashFormat::Nix32, true),
|
||||||
actualHash.hash.to_string(HashFormat::Base32, true));
|
actualHash.hash.to_string(HashFormat::Nix32, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1389,7 +1389,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
|
||||||
for (auto & link : readDirectory(linksDir)) {
|
for (auto & link : readDirectory(linksDir)) {
|
||||||
printMsg(lvlTalkative, "checking contents of '%s'", link.name);
|
printMsg(lvlTalkative, "checking contents of '%s'", link.name);
|
||||||
Path linkPath = linksDir + "/" + link.name;
|
Path linkPath = linksDir + "/" + link.name;
|
||||||
std::string hash = hashPath(HashAlgorithm::SHA256, linkPath).first.to_string(HashFormat::Base32, false);
|
std::string hash = hashPath(HashAlgorithm::SHA256, linkPath).first.to_string(HashFormat::Nix32, false);
|
||||||
if (hash != link.name) {
|
if (hash != link.name) {
|
||||||
printError("link '%s' was modified! expected hash '%s', got '%s'",
|
printError("link '%s' was modified! expected hash '%s', got '%s'",
|
||||||
linkPath, link.name, hash);
|
linkPath, link.name, hash);
|
||||||
|
@ -1422,7 +1422,7 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
|
||||||
|
|
||||||
if (info->narHash != nullHash && info->narHash != current.first) {
|
if (info->narHash != nullHash && info->narHash != current.first) {
|
||||||
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
||||||
printStorePath(i), info->narHash.to_string(HashFormat::Base32, true), current.first.to_string(HashFormat::Base32, true));
|
printStorePath(i), info->narHash.to_string(HashFormat::Nix32, true), current.first.to_string(HashFormat::Nix32, true));
|
||||||
if (repair) repairPath(i); else errors = true;
|
if (repair) repairPath(i); else errors = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
|
@ -333,9 +333,9 @@ public:
|
||||||
(std::string(info->path.name()))
|
(std::string(info->path.name()))
|
||||||
(narInfo ? narInfo->url : "", narInfo != 0)
|
(narInfo ? narInfo->url : "", narInfo != 0)
|
||||||
(narInfo ? narInfo->compression : "", narInfo != 0)
|
(narInfo ? narInfo->compression : "", narInfo != 0)
|
||||||
(narInfo && narInfo->fileHash ? narInfo->fileHash->to_string(HashFormat::Base32, true) : "", narInfo && narInfo->fileHash)
|
(narInfo && narInfo->fileHash ? narInfo->fileHash->to_string(HashFormat::Nix32, true) : "", narInfo && narInfo->fileHash)
|
||||||
(narInfo ? narInfo->fileSize : 0, narInfo != 0 && narInfo->fileSize)
|
(narInfo ? narInfo->fileSize : 0, narInfo != 0 && narInfo->fileSize)
|
||||||
(info->narHash.to_string(HashFormat::Base32, true))
|
(info->narHash.to_string(HashFormat::Nix32, true))
|
||||||
(info->narSize)
|
(info->narSize)
|
||||||
(concatStringsSep(" ", info->shortRefs()))
|
(concatStringsSep(" ", info->shortRefs()))
|
||||||
(info->deriver ? std::string(info->deriver->to_string()) : "", (bool) info->deriver)
|
(info->deriver ? std::string(info->deriver->to_string()) : "", (bool) info->deriver)
|
||||||
|
|
|
@ -114,10 +114,10 @@ std::string NarInfo::to_string(const Store & store) const
|
||||||
assert(compression != "");
|
assert(compression != "");
|
||||||
res += "Compression: " + compression + "\n";
|
res += "Compression: " + compression + "\n";
|
||||||
assert(fileHash && fileHash->algo == HashAlgorithm::SHA256);
|
assert(fileHash && fileHash->algo == HashAlgorithm::SHA256);
|
||||||
res += "FileHash: " + fileHash->to_string(HashFormat::Base32, true) + "\n";
|
res += "FileHash: " + fileHash->to_string(HashFormat::Nix32, true) + "\n";
|
||||||
res += "FileSize: " + std::to_string(fileSize) + "\n";
|
res += "FileSize: " + std::to_string(fileSize) + "\n";
|
||||||
assert(narHash.algo == HashAlgorithm::SHA256);
|
assert(narHash.algo == HashAlgorithm::SHA256);
|
||||||
res += "NarHash: " + narHash.to_string(HashFormat::Base32, true) + "\n";
|
res += "NarHash: " + narHash.to_string(HashFormat::Nix32, true) + "\n";
|
||||||
res += "NarSize: " + std::to_string(narSize) + "\n";
|
res += "NarSize: " + std::to_string(narSize) + "\n";
|
||||||
|
|
||||||
res += "References: " + concatStringsSep(" ", shortRefs()) + "\n";
|
res += "References: " + concatStringsSep(" ", shortRefs()) + "\n";
|
||||||
|
|
|
@ -147,10 +147,10 @@ void LocalStore::optimisePath_(Activity * act, OptimiseStats & stats,
|
||||||
contents of the symlink (i.e. the result of readlink()), not
|
contents of the symlink (i.e. the result of readlink()), not
|
||||||
the contents of the target (which may not even exist). */
|
the contents of the target (which may not even exist). */
|
||||||
Hash hash = hashPath(HashAlgorithm::SHA256, path).first;
|
Hash hash = hashPath(HashAlgorithm::SHA256, path).first;
|
||||||
debug("'%1%' has hash '%2%'", path, hash.to_string(HashFormat::Base32, true));
|
debug("'%1%' has hash '%2%'", path, hash.to_string(HashFormat::Nix32, true));
|
||||||
|
|
||||||
/* Check if this is a known hash. */
|
/* Check if this is a known hash. */
|
||||||
Path linkPath = linksDir + "/" + hash.to_string(HashFormat::Base32, false);
|
Path linkPath = linksDir + "/" + hash.to_string(HashFormat::Nix32, false);
|
||||||
|
|
||||||
/* Maybe delete the link, if it has been corrupted. */
|
/* Maybe delete the link, if it has been corrupted. */
|
||||||
if (pathExists(linkPath)) {
|
if (pathExists(linkPath)) {
|
||||||
|
|
|
@ -146,7 +146,7 @@ static nlohmann::json pathInfoToJSON(
|
||||||
auto info = store.queryPathInfo(storePath);
|
auto info = store.queryPathInfo(storePath);
|
||||||
|
|
||||||
auto & jsonPath = jsonList.emplace_back(
|
auto & jsonPath = jsonList.emplace_back(
|
||||||
info->toJSON(store, false, HashFormat::Base32));
|
info->toJSON(store, false, HashFormat::Nix32));
|
||||||
|
|
||||||
// Add the path to the object whose metadata we are including.
|
// Add the path to the object whose metadata we are including.
|
||||||
jsonPath["path"] = store.printStorePath(storePath);
|
jsonPath["path"] = store.printStorePath(storePath);
|
||||||
|
|
|
@ -32,7 +32,7 @@ std::string ValidPathInfo::fingerprint(const Store & store) const
|
||||||
store.printStorePath(path));
|
store.printStorePath(path));
|
||||||
return
|
return
|
||||||
"1;" + store.printStorePath(path) + ";"
|
"1;" + store.printStorePath(path) + ";"
|
||||||
+ narHash.to_string(HashFormat::Base32, true) + ";"
|
+ narHash.to_string(HashFormat::Nix32, true) + ";"
|
||||||
+ std::to_string(narSize) + ";"
|
+ std::to_string(narSize) + ";"
|
||||||
+ concatStringsSep(",", store.printStorePathSet(references));
|
+ concatStringsSep(",", store.printStorePathSet(references));
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ StorePath::StorePath(std::string_view _baseName)
|
||||||
}
|
}
|
||||||
|
|
||||||
StorePath::StorePath(const Hash & hash, std::string_view _name)
|
StorePath::StorePath(const Hash & hash, std::string_view _name)
|
||||||
: baseName((hash.to_string(HashFormat::Base32, false) + "-").append(std::string(_name)))
|
: baseName((hash.to_string(HashFormat::Nix32, false) + "-").append(std::string(_name)))
|
||||||
{
|
{
|
||||||
checkName(baseName, name());
|
checkName(baseName, name());
|
||||||
}
|
}
|
||||||
|
|
|
@ -544,11 +544,45 @@ nlohmann::json Args::toJSON()
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hashFormatCompleter(AddCompletions & completions, size_t index, std::string_view prefix)
|
||||||
|
{
|
||||||
|
for (auto & format : hashFormats) {
|
||||||
|
if (hasPrefix(format, prefix)) {
|
||||||
|
completions.add(format);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Args::Flag Args::Flag::mkHashFormatFlagWithDefault(std::string &&longName, HashFormat * hf) {
|
||||||
|
assert(*hf == nix::HashFormat::SRI);
|
||||||
|
return Flag{
|
||||||
|
.longName = std::move(longName),
|
||||||
|
.description = "hash format ('base16', 'nix32', 'base64', 'sri'). Default: 'sri'",
|
||||||
|
.labels = {"hash-format"},
|
||||||
|
.handler = {[hf](std::string s) {
|
||||||
|
*hf = parseHashFormat(s);
|
||||||
|
}},
|
||||||
|
.completer = hashFormatCompleter,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Args::Flag Args::Flag::mkHashFormatOptFlag(std::string && longName, std::optional<HashFormat> * ohf) {
|
||||||
|
return Flag{
|
||||||
|
.longName = std::move(longName),
|
||||||
|
.description = "hash format ('base16', 'nix32', 'base64', 'sri').",
|
||||||
|
.labels = {"hash-format"},
|
||||||
|
.handler = {[ohf](std::string s) {
|
||||||
|
*ohf = std::optional<HashFormat>{parseHashFormat(s)};
|
||||||
|
}},
|
||||||
|
.completer = hashFormatCompleter,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
static void hashAlgoCompleter(AddCompletions & completions, size_t index, std::string_view prefix)
|
static void hashAlgoCompleter(AddCompletions & completions, size_t index, std::string_view prefix)
|
||||||
{
|
{
|
||||||
for (auto & type : hashAlgorithms)
|
for (auto & algo : hashAlgorithms)
|
||||||
if (hasPrefix(type, prefix))
|
if (hasPrefix(algo, prefix))
|
||||||
completions.add(type);
|
completions.add(algo);
|
||||||
}
|
}
|
||||||
|
|
||||||
Args::Flag Args::Flag::mkHashAlgoFlag(std::string && longName, HashAlgorithm * ha)
|
Args::Flag Args::Flag::mkHashAlgoFlag(std::string && longName, HashAlgorithm * ha)
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
enum struct HashAlgorithm : char;
|
enum struct HashAlgorithm : char;
|
||||||
|
enum struct HashFormat : int;
|
||||||
|
|
||||||
class MultiCommand;
|
class MultiCommand;
|
||||||
|
|
||||||
|
@ -177,6 +178,8 @@ protected:
|
||||||
|
|
||||||
static Flag mkHashAlgoFlag(std::string && longName, HashAlgorithm * ha);
|
static Flag mkHashAlgoFlag(std::string && longName, HashAlgorithm * ha);
|
||||||
static Flag mkHashAlgoOptFlag(std::string && longName, std::optional<HashAlgorithm> * oha);
|
static Flag mkHashAlgoOptFlag(std::string && longName, std::optional<HashAlgorithm> * oha);
|
||||||
|
static Flag mkHashFormatFlagWithDefault(std::string && longName, HashFormat * hf);
|
||||||
|
static Flag mkHashFormatOptFlag(std::string && longName, std::optional<HashFormat> * ohf);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -27,8 +27,9 @@ static size_t regularHashSize(HashAlgorithm type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::set<std::string> hashAlgorithms = {"md5", "sha1", "sha256", "sha512" };
|
const std::set<std::string> hashAlgorithms = {"md5", "sha1", "sha256", "sha512" };
|
||||||
|
|
||||||
|
const std::set<std::string> hashFormats = {"base64", "nix32", "base16", "sri" };
|
||||||
|
|
||||||
Hash::Hash(HashAlgorithm algo) : algo(algo)
|
Hash::Hash(HashAlgorithm algo) : algo(algo)
|
||||||
{
|
{
|
||||||
|
@ -81,7 +82,7 @@ static std::string printHash16(const Hash & hash)
|
||||||
|
|
||||||
|
|
||||||
// omitted: E O U T
|
// omitted: E O U T
|
||||||
const std::string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
|
const std::string nix32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
|
||||||
|
|
||||||
|
|
||||||
static std::string printHash32(const Hash & hash)
|
static std::string printHash32(const Hash & hash)
|
||||||
|
@ -100,7 +101,7 @@ static std::string printHash32(const Hash & hash)
|
||||||
unsigned char c =
|
unsigned char c =
|
||||||
(hash.hash[i] >> j)
|
(hash.hash[i] >> j)
|
||||||
| (i >= hash.hashSize - 1 ? 0 : hash.hash[i + 1] << (8 - j));
|
| (i >= hash.hashSize - 1 ? 0 : hash.hash[i + 1] << (8 - j));
|
||||||
s.push_back(base32Chars[c & 0x1f]);
|
s.push_back(nix32Chars[c & 0x1f]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
|
@ -110,7 +111,7 @@ static std::string printHash32(const Hash & hash)
|
||||||
std::string printHash16or32(const Hash & hash)
|
std::string printHash16or32(const Hash & hash)
|
||||||
{
|
{
|
||||||
assert(static_cast<char>(hash.algo));
|
assert(static_cast<char>(hash.algo));
|
||||||
return hash.to_string(hash.algo == HashAlgorithm::MD5 ? HashFormat::Base16 : HashFormat::Base32, false);
|
return hash.to_string(hash.algo == HashAlgorithm::MD5 ? HashFormat::Base16 : HashFormat::Nix32, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -125,7 +126,7 @@ std::string Hash::to_string(HashFormat hashFormat, bool includeAlgo) const
|
||||||
case HashFormat::Base16:
|
case HashFormat::Base16:
|
||||||
s += printHash16(*this);
|
s += printHash16(*this);
|
||||||
break;
|
break;
|
||||||
case HashFormat::Base32:
|
case HashFormat::Nix32:
|
||||||
s += printHash32(*this);
|
s += printHash32(*this);
|
||||||
break;
|
break;
|
||||||
case HashFormat::Base64:
|
case HashFormat::Base64:
|
||||||
|
@ -230,8 +231,8 @@ Hash::Hash(std::string_view rest, HashAlgorithm algo, bool isSRI)
|
||||||
for (unsigned int n = 0; n < rest.size(); ++n) {
|
for (unsigned int n = 0; n < rest.size(); ++n) {
|
||||||
char c = rest[rest.size() - n - 1];
|
char c = rest[rest.size() - n - 1];
|
||||||
unsigned char digit;
|
unsigned char digit;
|
||||||
for (digit = 0; digit < base32Chars.size(); ++digit) /* !!! slow */
|
for (digit = 0; digit < nix32Chars.size(); ++digit) /* !!! slow */
|
||||||
if (base32Chars[digit] == c) break;
|
if (nix32Chars[digit] == c) break;
|
||||||
if (digit >= 32)
|
if (digit >= 32)
|
||||||
throw BadHash("invalid base-32 hash '%s'", rest);
|
throw BadHash("invalid base-32 hash '%s'", rest);
|
||||||
unsigned int b = n * 5;
|
unsigned int b = n * 5;
|
||||||
|
@ -388,7 +389,11 @@ Hash compressHash(const Hash & hash, unsigned int newSize)
|
||||||
std::optional<HashFormat> parseHashFormatOpt(std::string_view hashFormatName)
|
std::optional<HashFormat> parseHashFormatOpt(std::string_view hashFormatName)
|
||||||
{
|
{
|
||||||
if (hashFormatName == "base16") return HashFormat::Base16;
|
if (hashFormatName == "base16") return HashFormat::Base16;
|
||||||
if (hashFormatName == "base32") return HashFormat::Base32;
|
if (hashFormatName == "nix32") return HashFormat::Nix32;
|
||||||
|
if (hashFormatName == "base32") {
|
||||||
|
warn(R"("base32" is a deprecated alias for hash format "nix32".)");
|
||||||
|
return HashFormat::Nix32;
|
||||||
|
}
|
||||||
if (hashFormatName == "base64") return HashFormat::Base64;
|
if (hashFormatName == "base64") return HashFormat::Base64;
|
||||||
if (hashFormatName == "sri") return HashFormat::SRI;
|
if (hashFormatName == "sri") return HashFormat::SRI;
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
@ -407,8 +412,8 @@ std::string_view printHashFormat(HashFormat HashFormat)
|
||||||
switch (HashFormat) {
|
switch (HashFormat) {
|
||||||
case HashFormat::Base64:
|
case HashFormat::Base64:
|
||||||
return "base64";
|
return "base64";
|
||||||
case HashFormat::Base32:
|
case HashFormat::Nix32:
|
||||||
return "base32";
|
return "nix32";
|
||||||
case HashFormat::Base16:
|
case HashFormat::Base16:
|
||||||
return "base16";
|
return "base16";
|
||||||
case HashFormat::SRI:
|
case HashFormat::SRI:
|
||||||
|
|
|
@ -20,9 +20,9 @@ const int sha1HashSize = 20;
|
||||||
const int sha256HashSize = 32;
|
const int sha256HashSize = 32;
|
||||||
const int sha512HashSize = 64;
|
const int sha512HashSize = 64;
|
||||||
|
|
||||||
extern std::set<std::string> hashAlgorithms;
|
extern const std::set<std::string> hashAlgorithms;
|
||||||
|
|
||||||
extern const std::string base32Chars;
|
extern const std::string nix32Chars;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Enumeration representing the hash formats.
|
* @brief Enumeration representing the hash formats.
|
||||||
|
@ -31,8 +31,8 @@ enum struct HashFormat : int {
|
||||||
/// @brief Base 64 encoding.
|
/// @brief Base 64 encoding.
|
||||||
/// @see [IETF RFC 4648, section 4](https://datatracker.ietf.org/doc/html/rfc4648#section-4).
|
/// @see [IETF RFC 4648, section 4](https://datatracker.ietf.org/doc/html/rfc4648#section-4).
|
||||||
Base64,
|
Base64,
|
||||||
/// @brief Nix-specific base-32 encoding. @see base32Chars
|
/// @brief Nix-specific base-32 encoding. @see nix32Chars
|
||||||
Base32,
|
Nix32,
|
||||||
/// @brief Lowercase hexadecimal encoding. @see base16Chars
|
/// @brief Lowercase hexadecimal encoding. @see base16Chars
|
||||||
Base16,
|
Base16,
|
||||||
/// @brief "<hash algo>:<Base 64 hash>", format of the SRI integrity attribute.
|
/// @brief "<hash algo>:<Base 64 hash>", format of the SRI integrity attribute.
|
||||||
|
@ -40,6 +40,8 @@ enum struct HashFormat : int {
|
||||||
SRI
|
SRI
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern const std::set<std::string> hashFormats;
|
||||||
|
|
||||||
struct Hash
|
struct Hash
|
||||||
{
|
{
|
||||||
constexpr static size_t maxHashSize = 64;
|
constexpr static size_t maxHashSize = 64;
|
||||||
|
|
|
@ -23,8 +23,8 @@ static void search(
|
||||||
static bool isBase32[256];
|
static bool isBase32[256];
|
||||||
std::call_once(initialised, [](){
|
std::call_once(initialised, [](){
|
||||||
for (unsigned int i = 0; i < 256; ++i) isBase32[i] = false;
|
for (unsigned int i = 0; i < 256; ++i) isBase32[i] = false;
|
||||||
for (unsigned int i = 0; i < base32Chars.size(); ++i)
|
for (unsigned int i = 0; i < nix32Chars.size(); ++i)
|
||||||
isBase32[(unsigned char) base32Chars[i]] = true;
|
isBase32[(unsigned char) nix32Chars[i]] = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (size_t i = 0; i + refLength <= s.size(); ) {
|
for (size_t i = 0; i + refLength <= s.size(); ) {
|
||||||
|
|
|
@ -406,7 +406,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
||||||
auto info = store->queryPathInfo(j);
|
auto info = store->queryPathInfo(j);
|
||||||
if (query == qHash) {
|
if (query == qHash) {
|
||||||
assert(info->narHash.algo == HashAlgorithm::SHA256);
|
assert(info->narHash.algo == HashAlgorithm::SHA256);
|
||||||
cout << fmt("%s\n", info->narHash.to_string(HashFormat::Base32, true));
|
cout << fmt("%s\n", info->narHash.to_string(HashFormat::Nix32, true));
|
||||||
} else if (query == qSize)
|
} else if (query == qSize)
|
||||||
cout << fmt("%d\n", info->narSize);
|
cout << fmt("%d\n", info->narSize);
|
||||||
}
|
}
|
||||||
|
@ -769,8 +769,8 @@ static void opVerifyPath(Strings opFlags, Strings opArgs)
|
||||||
if (current.first != info->narHash) {
|
if (current.first != info->narHash) {
|
||||||
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
||||||
store->printStorePath(path),
|
store->printStorePath(path),
|
||||||
info->narHash.to_string(HashFormat::Base32, true),
|
info->narHash.to_string(HashFormat::Nix32, true),
|
||||||
current.first.to_string(HashFormat::Base32, true));
|
current.first.to_string(HashFormat::Nix32, true));
|
||||||
status = 1;
|
status = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -898,7 +898,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
||||||
out << info->narSize // downloadSize
|
out << info->narSize // downloadSize
|
||||||
<< info->narSize;
|
<< info->narSize;
|
||||||
if (GET_PROTOCOL_MINOR(clientVersion) >= 4)
|
if (GET_PROTOCOL_MINOR(clientVersion) >= 4)
|
||||||
out << info->narHash.to_string(HashFormat::Base32, true)
|
out << info->narHash.to_string(HashFormat::Nix32, true)
|
||||||
<< renderContentAddress(info->ca)
|
<< renderContentAddress(info->ca)
|
||||||
<< info->sigs;
|
<< info->sigs;
|
||||||
} catch (InvalidPath &) {
|
} catch (InvalidPath &) {
|
||||||
|
|
|
@ -39,7 +39,7 @@ struct CmdHashBase : Command
|
||||||
addFlag({
|
addFlag({
|
||||||
.longName = "base32",
|
.longName = "base32",
|
||||||
.description = "Print the hash in base-32 (Nix-specific) format.",
|
.description = "Print the hash in base-32 (Nix-specific) format.",
|
||||||
.handler = {&hashFormat, HashFormat::Base32},
|
.handler = {&hashFormat, HashFormat::Nix32},
|
||||||
});
|
});
|
||||||
|
|
||||||
addFlag({
|
addFlag({
|
||||||
|
@ -120,7 +120,7 @@ struct CmdToBase : Command
|
||||||
{
|
{
|
||||||
return fmt("convert a hash to %s representation",
|
return fmt("convert a hash to %s representation",
|
||||||
hashFormat == HashFormat::Base16 ? "base-16" :
|
hashFormat == HashFormat::Base16 ? "base-16" :
|
||||||
hashFormat == HashFormat::Base32 ? "base-32" :
|
hashFormat == HashFormat::Nix32 ? "base-32" :
|
||||||
hashFormat == HashFormat::Base64 ? "base-64" :
|
hashFormat == HashFormat::Base64 ? "base-64" :
|
||||||
"SRI");
|
"SRI");
|
||||||
}
|
}
|
||||||
|
@ -143,24 +143,8 @@ struct CmdHashConvert : Command
|
||||||
std::vector<std::string> hashStrings;
|
std::vector<std::string> hashStrings;
|
||||||
|
|
||||||
CmdHashConvert(): to(HashFormat::SRI) {
|
CmdHashConvert(): to(HashFormat::SRI) {
|
||||||
addFlag({
|
addFlag(Args::Flag::mkHashFormatOptFlag("from", &from));
|
||||||
.longName = "from",
|
addFlag(Args::Flag::mkHashFormatFlagWithDefault("to", &to));
|
||||||
// TODO: List format choices. Maybe introduce a constant?
|
|
||||||
.description = "The format of the input hash.",
|
|
||||||
.labels = {"hash format"},
|
|
||||||
.handler = {[this](std::string str) {
|
|
||||||
from = parseHashFormat(str);
|
|
||||||
}},
|
|
||||||
});
|
|
||||||
addFlag({
|
|
||||||
.longName = "to",
|
|
||||||
// TODO: List format choices. Maybe introduce a constant?
|
|
||||||
.description = "The format of the output hash.",
|
|
||||||
.labels = {"hash format"},
|
|
||||||
.handler = {[this](std::string str) {
|
|
||||||
to = parseHashFormat(str);
|
|
||||||
}},
|
|
||||||
});
|
|
||||||
addFlag(Args::Flag::mkHashAlgoOptFlag("algo", &algo));
|
addFlag(Args::Flag::mkHashAlgoOptFlag("algo", &algo));
|
||||||
expectArgs({
|
expectArgs({
|
||||||
.label = "hashes",
|
.label = "hashes",
|
||||||
|
@ -170,7 +154,15 @@ struct CmdHashConvert : Command
|
||||||
|
|
||||||
std::string description() override
|
std::string description() override
|
||||||
{
|
{
|
||||||
return "convert between different hash formats, e.g. base16, nix32, base64 and sri.";
|
std::string descr( "convert between different hash formats. Choose from: ");
|
||||||
|
auto iter = hashFormats.begin();
|
||||||
|
assert(iter != hashFormats.end());
|
||||||
|
descr += *iter++;
|
||||||
|
while (iter != hashFormats.end()) {
|
||||||
|
descr += ", " + *iter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Category category() override { return catUtility; }
|
Category category() override { return catUtility; }
|
||||||
|
@ -197,7 +189,7 @@ struct CmdHash : NixMultiCommand
|
||||||
{"file", []() { return make_ref<CmdHashBase>(FileIngestionMethod::Flat);; }},
|
{"file", []() { return make_ref<CmdHashBase>(FileIngestionMethod::Flat);; }},
|
||||||
{"path", []() { return make_ref<CmdHashBase>(FileIngestionMethod::Recursive); }},
|
{"path", []() { return make_ref<CmdHashBase>(FileIngestionMethod::Recursive); }},
|
||||||
{"to-base16", []() { return make_ref<CmdToBase>(HashFormat::Base16); }},
|
{"to-base16", []() { return make_ref<CmdToBase>(HashFormat::Base16); }},
|
||||||
{"to-base32", []() { return make_ref<CmdToBase>(HashFormat::Base32); }},
|
{"to-base32", []() { return make_ref<CmdToBase>(HashFormat::Nix32); }},
|
||||||
{"to-base64", []() { return make_ref<CmdToBase>(HashFormat::Base64); }},
|
{"to-base64", []() { return make_ref<CmdToBase>(HashFormat::Base64); }},
|
||||||
{"to-sri", []() { return make_ref<CmdToBase>(HashFormat::SRI); }},
|
{"to-sri", []() { return make_ref<CmdToBase>(HashFormat::SRI); }},
|
||||||
})
|
})
|
||||||
|
@ -230,7 +222,7 @@ static int compatNixHash(int argc, char * * argv)
|
||||||
printVersion("nix-hash");
|
printVersion("nix-hash");
|
||||||
else if (*arg == "--flat") flat = true;
|
else if (*arg == "--flat") flat = true;
|
||||||
else if (*arg == "--base16") hashFormat = HashFormat::Base16;
|
else if (*arg == "--base16") hashFormat = HashFormat::Base16;
|
||||||
else if (*arg == "--base32") hashFormat = HashFormat::Base32;
|
else if (*arg == "--base32") hashFormat = HashFormat::Nix32;
|
||||||
else if (*arg == "--base64") hashFormat = HashFormat::Base64;
|
else if (*arg == "--base64") hashFormat = HashFormat::Base64;
|
||||||
else if (*arg == "--sri") hashFormat = HashFormat::SRI;
|
else if (*arg == "--sri") hashFormat = HashFormat::SRI;
|
||||||
else if (*arg == "--truncate") truncate = true;
|
else if (*arg == "--truncate") truncate = true;
|
||||||
|
@ -244,7 +236,7 @@ static int compatNixHash(int argc, char * * argv)
|
||||||
}
|
}
|
||||||
else if (*arg == "--to-base32") {
|
else if (*arg == "--to-base32") {
|
||||||
op = opTo;
|
op = opTo;
|
||||||
hashFormat = HashFormat::Base32;
|
hashFormat = HashFormat::Nix32;
|
||||||
}
|
}
|
||||||
else if (*arg == "--to-base64") {
|
else if (*arg == "--to-base64") {
|
||||||
op = opTo;
|
op = opTo;
|
||||||
|
|
|
@ -109,8 +109,8 @@ struct CmdVerify : StorePathsCommand
|
||||||
act2.result(resCorruptedPath, store->printStorePath(info->path));
|
act2.result(resCorruptedPath, store->printStorePath(info->path));
|
||||||
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
printError("path '%s' was modified! expected hash '%s', got '%s'",
|
||||||
store->printStorePath(info->path),
|
store->printStorePath(info->path),
|
||||||
info->narHash.to_string(HashFormat::Base32, true),
|
info->narHash.to_string(HashFormat::Nix32, true),
|
||||||
hash.first.to_string(HashFormat::Base32, true));
|
hash.first.to_string(HashFormat::Nix32, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,7 @@ try3() {
|
||||||
|
|
||||||
sri=$(nix hash convert --algo "$1" --from base16 "$2")
|
sri=$(nix hash convert --algo "$1" --from base16 "$2")
|
||||||
[ "$sri" = "$1-$4" ]
|
[ "$sri" = "$1-$4" ]
|
||||||
sri=$(nix hash convert --algo "$1" --from base32 "$3")
|
sri=$(nix hash convert --algo "$1" --from nix32 "$3")
|
||||||
[ "$sri" = "$1-$4" ]
|
[ "$sri" = "$1-$4" ]
|
||||||
sri=$(nix hash convert --algo "$1" --from base64 "$4")
|
sri=$(nix hash convert --algo "$1" --from base64 "$4")
|
||||||
[ "$sri" = "$1-$4" ]
|
[ "$sri" = "$1-$4" ]
|
||||||
|
@ -172,11 +172,11 @@ try3() {
|
||||||
# Asserting input format fails.
|
# Asserting input format fails.
|
||||||
#
|
#
|
||||||
|
|
||||||
fail=$(nix hash convert --algo "$1" --from base32 "$2" 2>&1 || echo "exit: $?")
|
fail=$(nix hash convert --algo "$1" --from nix32 "$2" 2>&1 || echo "exit: $?")
|
||||||
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
||||||
fail=$(nix hash convert --algo "$1" --from base16 "$3" 2>&1 || echo "exit: $?")
|
fail=$(nix hash convert --algo "$1" --from base16 "$3" 2>&1 || echo "exit: $?")
|
||||||
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
||||||
fail=$(nix hash convert --algo "$1" --from base32 "$4" 2>&1 || echo "exit: $?")
|
fail=$(nix hash convert --algo "$1" --from nix32 "$4" 2>&1 || echo "exit: $?")
|
||||||
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
[[ "$fail" == "error: input hash"*"exit: 1" ]]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
108
tests/functional/lang/eval-okay-convertHash.err.exp
Normal file
108
tests/functional/lang/eval-okay-convertHash.err.exp
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
||||||
|
warning: "base32" is a deprecated alias for hash format "nix32".
|
|
@ -1 +1 @@
|
||||||
{ hashesBase16 = [ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ]; hashesBase32 = [ "3y8bwfr609h3lh9ch0izcqq7fl" "26mrvc0v1nslch8r0w45zywsbc" "1v4gi57l97pmnylq6lmgxkhd5v" "143xibwh31h9bvxzalr0sjvbbvpa6ffs" "i4hj30pkrfdpgc5dbcgcydqviibfhm6d" "fxz2p030yba2bza71qhss79k3l5y24kd" "0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73" "0qy6iz9yh6a079757mxdmypx0gcmnzjd3ij5q78bzk00vxll82lh" "0mkygpci4r4yb8zz5rs2kxcgvw0a2yf5zlj6r8qgfll6pnrqf0xd" "0zdl9zrg8r3i9c1g90lgg9ip5ijzv3yhz91i0zzn3r8ap9ws784gkp9dk9j3aglhgf1amqb0pj21mh7h1nxcl18akqvvf7ggqsy30yg" "19ncrpp37dx0nzzjw4k6zaqkb9mzaq2myhgpzh5aff7qqcj5wwdxslg6ixwncm7gyq8l761gwf87fgsh2bwfyr52s53k2dkqvw8c24x" "2kz74snvckxldmmbisz9ikmy031d28cs6xfdbl6rhxx42glpyz4vww4lajrc5akklxwixl0js4g84233pxvmbykiic5m7i5m9r4nr11" ]; hashesBase64 = [ "1B2M2Y8AsgTpgAmY7PhCfg==" "bGnufyEcZAQZ1TZswHauRg==" "uzQ4+6vUYOptvSfRU+IjOw==" "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "zVToVowbN88eW62wd5vL84IhIYk=" "bRLhCx0zHa0hDkf9JdTyYIArfnc=" "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; hashesSRI = [ "md5-1B2M2Y8AsgTpgAmY7PhCfg==" "md5-bGnufyEcZAQZ1TZswHauRg==" "md5-uzQ4+6vUYOptvSfRU+IjOw==" "sha1-2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "sha1-zVToVowbN88eW62wd5vL84IhIYk=" "sha1-bRLhCx0zHa0hDkf9JdTyYIArfnc=" "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "sha256-kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "sha256-rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "sha512-nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "sha512-IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; }
|
{ hashesBase16 = [ "d41d8cd98f00b204e9800998ecf8427e" "6c69ee7f211c640419d5366cc076ae46" "bb3438fbabd460ea6dbd27d153e2233b" "da39a3ee5e6b4b0d3255bfef95601890afd80709" "cd54e8568c1b37cf1e5badb0779bcbf382212189" "6d12e10b1d331dad210e47fd25d4f260802b7e77" "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" "900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663" "ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56" "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" "9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653" "21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7" ]; hashesBase32 = [ "3y8bwfr609h3lh9ch0izcqq7fl" "26mrvc0v1nslch8r0w45zywsbc" "1v4gi57l97pmnylq6lmgxkhd5v" "143xibwh31h9bvxzalr0sjvbbvpa6ffs" "i4hj30pkrfdpgc5dbcgcydqviibfhm6d" "fxz2p030yba2bza71qhss79k3l5y24kd" "0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73" "0qy6iz9yh6a079757mxdmypx0gcmnzjd3ij5q78bzk00vxll82lh" "0mkygpci4r4yb8zz5rs2kxcgvw0a2yf5zlj6r8qgfll6pnrqf0xd" "0zdl9zrg8r3i9c1g90lgg9ip5ijzv3yhz91i0zzn3r8ap9ws784gkp9dk9j3aglhgf1amqb0pj21mh7h1nxcl18akqvvf7ggqsy30yg" "19ncrpp37dx0nzzjw4k6zaqkb9mzaq2myhgpzh5aff7qqcj5wwdxslg6ixwncm7gyq8l761gwf87fgsh2bwfyr52s53k2dkqvw8c24x" "2kz74snvckxldmmbisz9ikmy031d28cs6xfdbl6rhxx42glpyz4vww4lajrc5akklxwixl0js4g84233pxvmbykiic5m7i5m9r4nr11" ]; hashesBase64 = [ "1B2M2Y8AsgTpgAmY7PhCfg==" "bGnufyEcZAQZ1TZswHauRg==" "uzQ4+6vUYOptvSfRU+IjOw==" "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "zVToVowbN88eW62wd5vL84IhIYk=" "bRLhCx0zHa0hDkf9JdTyYIArfnc=" "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; hashesNix32 = [ "3y8bwfr609h3lh9ch0izcqq7fl" "26mrvc0v1nslch8r0w45zywsbc" "1v4gi57l97pmnylq6lmgxkhd5v" "143xibwh31h9bvxzalr0sjvbbvpa6ffs" "i4hj30pkrfdpgc5dbcgcydqviibfhm6d" "fxz2p030yba2bza71qhss79k3l5y24kd" "0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73" "0qy6iz9yh6a079757mxdmypx0gcmnzjd3ij5q78bzk00vxll82lh" "0mkygpci4r4yb8zz5rs2kxcgvw0a2yf5zlj6r8qgfll6pnrqf0xd" "0zdl9zrg8r3i9c1g90lgg9ip5ijzv3yhz91i0zzn3r8ap9ws784gkp9dk9j3aglhgf1amqb0pj21mh7h1nxcl18akqvvf7ggqsy30yg" "19ncrpp37dx0nzzjw4k6zaqkb9mzaq2myhgpzh5aff7qqcj5wwdxslg6ixwncm7gyq8l761gwf87fgsh2bwfyr52s53k2dkqvw8c24x" "2kz74snvckxldmmbisz9ikmy031d28cs6xfdbl6rhxx42glpyz4vww4lajrc5akklxwixl0js4g84233pxvmbykiic5m7i5m9r4nr11" ]; hashesSRI = [ "md5-1B2M2Y8AsgTpgAmY7PhCfg==" "md5-bGnufyEcZAQZ1TZswHauRg==" "md5-uzQ4+6vUYOptvSfRU+IjOw==" "sha1-2jmj7l5rSw0yVb/vlWAYkK/YBwk=" "sha1-zVToVowbN88eW62wd5vL84IhIYk=" "sha1-bRLhCx0zHa0hDkf9JdTyYIArfnc=" "sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=" "sha256-kApEad8AzL/QwUXG0eS3lT3Qr6+t11NOOkAZ6NOPxmM=" "sha256-rQOHs72GUvcwykbSX5wXCvD9WJ9C5/I/Wp5kEtl9flY=" "sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" "sha512-nQiG+MaziTmKFiV7x5eA+rmDHH/BHIqwf6cyy3s0j+reOC+SYXycUwX++6CvAqtf05pYfTMJl/9b0NsZ92ZmUw==" "sha512-IWRLcqolnlpYjNOvuvsdQxD0iJaA9sg7nVMVlqWihPNNvr/0CdI7zIau5rrRDIkWBvB1xvR1XLU22ifbVpPzpw==" ]; }
|
||||||
|
|
|
@ -5,12 +5,14 @@ let
|
||||||
map2' = f: fsts: snds: map2 f { inherit fsts snds; };
|
map2' = f: fsts: snds: map2 f { inherit fsts snds; };
|
||||||
getOutputHashes = hashes: {
|
getOutputHashes = hashes: {
|
||||||
hashesBase16 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base16";}) hashAlgos hashes;
|
hashesBase16 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base16";}) hashAlgos hashes;
|
||||||
|
hashesNix32 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "nix32";}) hashAlgos hashes;
|
||||||
hashesBase32 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base32";}) hashAlgos hashes;
|
hashesBase32 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base32";}) hashAlgos hashes;
|
||||||
hashesBase64 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base64";}) hashAlgos hashes;
|
hashesBase64 = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "base64";}) hashAlgos hashes;
|
||||||
hashesSRI = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "sri" ;}) hashAlgos hashes;
|
hashesSRI = map2' (hashAlgo: hash: builtins.convertHash { inherit hash hashAlgo; toHashFormat = "sri" ;}) hashAlgos hashes;
|
||||||
};
|
};
|
||||||
getOutputHashesColon = hashes: {
|
getOutputHashesColon = hashes: {
|
||||||
hashesBase16 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base16";}) hashAlgos hashes;
|
hashesBase16 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base16";}) hashAlgos hashes;
|
||||||
|
hashesNix32 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "nix32";}) hashAlgos hashes;
|
||||||
hashesBase32 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base32";}) hashAlgos hashes;
|
hashesBase32 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base32";}) hashAlgos hashes;
|
||||||
hashesBase64 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base64";}) hashAlgos hashes;
|
hashesBase64 = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "base64";}) hashAlgos hashes;
|
||||||
hashesSRI = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "sri" ;}) hashAlgos hashes;
|
hashesSRI = map2' (hashAlgo: hashBody: builtins.convertHash { hash = hashAlgo + ":" + hashBody; toHashFormat = "sri" ;}) hashAlgos hashes;
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace nix {
|
||||||
* --------------------------------------------------------------------------*/
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
||||||
TEST(hashFormat, testRoundTripPrintParse) {
|
TEST(hashFormat, testRoundTripPrintParse) {
|
||||||
for (const HashFormat hashFormat: { HashFormat::Base64, HashFormat::Base32, HashFormat::Base16, HashFormat::SRI}) {
|
for (const HashFormat hashFormat: { HashFormat::Base64, HashFormat::Nix32, HashFormat::Base16, HashFormat::SRI}) {
|
||||||
ASSERT_EQ(parseHashFormat(printHashFormat(hashFormat)), hashFormat);
|
ASSERT_EQ(parseHashFormat(printHashFormat(hashFormat)), hashFormat);
|
||||||
ASSERT_EQ(*parseHashFormatOpt(printHashFormat(hashFormat)), hashFormat);
|
ASSERT_EQ(*parseHashFormatOpt(printHashFormat(hashFormat)), hashFormat);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue