From aba8a8a83a89d577769a39a69e9b90e3ed0d4f82 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 19 Apr 2023 14:13:30 -0400 Subject: [PATCH] Add a few more content addressing methods Good to round out the library interface. --- src/libstore/content-address.cc | 68 ++++++++++++++++++++++++--------- src/libstore/content-address.hh | 23 ++++++++--- 2 files changed, 67 insertions(+), 24 deletions(-) diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc index 2bde23e79..8a65059e3 100644 --- a/src/libstore/content-address.cc +++ b/src/libstore/content-address.cc @@ -154,38 +154,32 @@ std::string renderContentAddress(std::optional ca) return ca ? ca->render() : ""; } -ContentAddressWithReferences ContentAddressWithReferences::fromParts( - ContentAddressMethod method, Hash hash, StoreReferences refs) +ContentAddress ContentAddress::fromParts( + ContentAddressMethod method, Hash hash) { return std::visit(overloaded { - [&](TextIngestionMethod _) -> ContentAddressWithReferences { - if (refs.self) - throw UsageError("Cannot have a self reference with text hashing scheme"); - return TextInfo { - .hash = { .hash = std::move(hash) }, - .references = std::move(refs.others), + [&](TextIngestionMethod _) -> ContentAddress { + return TextHash { + .hash = std::move(hash), }; }, - [&](FileIngestionMethod m2) -> ContentAddressWithReferences { - return FixedOutputInfo { - .hash = { - .method = m2, - .hash = std::move(hash), - }, - .references = std::move(refs), + [&](FileIngestionMethod m2) -> ContentAddress { + return FixedOutputHash { + .method = std::move(m2), + .hash = std::move(hash), }; }, }, method.raw); } -ContentAddressMethod ContentAddressWithReferences::getMethod() const +ContentAddressMethod ContentAddress::getMethod() const { return std::visit(overloaded { - [](const TextInfo & th) -> ContentAddressMethod { + [](const TextHash & th) -> ContentAddressMethod { return TextIngestionMethod {}; }, - [](const FixedOutputInfo & fsh) -> ContentAddressMethod { - return fsh.hash.method; + [](const FixedOutputHash & fsh) -> ContentAddressMethod { + return fsh.method; }, }, raw); } @@ -229,6 +223,42 @@ ContentAddressWithReferences ContentAddressWithReferences::withoutRefs(const Con }, ca.raw); } +ContentAddressWithReferences ContentAddressWithReferences::fromParts( + ContentAddressMethod method, Hash hash, StoreReferences refs) +{ + return std::visit(overloaded { + [&](TextIngestionMethod _) -> ContentAddressWithReferences { + if (refs.self) + throw UsageError("Cannot have a self reference with text hashing scheme"); + return TextInfo { + .hash = { .hash = std::move(hash) }, + .references = std::move(refs.others), + }; + }, + [&](FileIngestionMethod m2) -> ContentAddressWithReferences { + return FixedOutputInfo { + .hash = { + .method = m2, + .hash = std::move(hash), + }, + .references = std::move(refs), + }; + }, + }, method.raw); +} + +ContentAddressMethod ContentAddressWithReferences::getMethod() const +{ + return std::visit(overloaded { + [](const TextInfo & th) -> ContentAddressMethod { + return TextIngestionMethod {}; + }, + [](const FixedOutputInfo & fsh) -> ContentAddressMethod { + return fsh.hash.method; + }, + }, raw); +} + Hash ContentAddressWithReferences::getHash() const { return std::visit(overloaded { diff --git a/src/libstore/content-address.hh b/src/libstore/content-address.hh index 8668acacf..eb01e9ce4 100644 --- a/src/libstore/content-address.hh +++ b/src/libstore/content-address.hh @@ -154,8 +154,9 @@ struct ContentAddress { } /** - * Compute the content-addressability assertion (ValidPathInfo::ca) for - * paths created by Store::makeFixedOutputPath() / Store::addToStore(). + * Compute the content-addressability assertion + * (`ValidPathInfo::ca`) for paths created by + * `Store::makeFixedOutputPath()` / `Store::addToStore()`. */ std::string render() const; @@ -163,6 +164,18 @@ struct ContentAddress static std::optional parseOpt(std::string_view rawCaOpt); + /** + * Create a `ContentAddress` from 2 parts: + * + * @param method Way ingesting the file system data. + * + * @param hash Hash of ingested file system data. + */ + static ContentAddress fromParts( + ContentAddressMethod method, Hash hash); + + ContentAddressMethod getMethod() const; + const Hash & getHash() const; }; @@ -251,13 +264,13 @@ struct ContentAddressWithReferences { } /** - * Create a ContentAddressWithReferences from a mere ContentAddress, by - * assuming no references in all cases. + * Create a `ContentAddressWithReferences` from a mere + * `ContentAddress`, by assuming no references in all cases. */ static ContentAddressWithReferences withoutRefs(const ContentAddress &); /** - * Create a ContentAddressWithReferences from 3 parts: + * Create a `ContentAddressWithReferences` from 3 parts: * * @param method Way ingesting the file system data. *