aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-12 16:12:21 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-12 23:53:33 +0000
commit230c9b4329b3d285e57f4cce058c121256187da1 (patch)
treed17f75152403cc73f03d7934a3900b7ebb1bf0cc /src/libstore
parentfedfc913ad75984b476e7838d6254c547f9134d5 (diff)
Change types to prepare the way for CA derivations
We've added the variant to `DerivationOutput` to support them, but made `DerivationOutput::path` partial to avoid actually implementing them. With this chage, we can all collaborate on "just" removing `DerivationOutput::path` calls to implement CA derivations.
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/derivations.cc71
-rw-r--r--src/libstore/derivations.hh21
2 files changed, 68 insertions, 24 deletions
diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc
index 09683a005..375d089ec 100644
--- a/src/libstore/derivations.cc
+++ b/src/libstore/derivations.cc
@@ -8,15 +8,20 @@
namespace nix {
-StorePath DerivationOutput::path(const Store & store, std::string_view drvName) const
+std::optional<StorePath> DerivationOutput::pathOpt(const Store & store, std::string_view drvName) const
{
return std::visit(overloaded {
- [](DerivationOutputInputAddressed doi) {
- return doi.path;
+ [](DerivationOutputInputAddressed doi) -> std::optional<StorePath> {
+ return { doi.path };
+ },
+ [&](DerivationOutputFixed dof) -> std::optional<StorePath> {
+ return {
+ store.makeFixedOutputPath(dof.hash.method, dof.hash.hash, drvName)
+ };
+ },
+ [](DerivationOutputFloating dof) -> std::optional<StorePath> {
+ return std::nullopt;
},
- [&](DerivationOutputFixed dof) {
- return store.makeFixedOutputPath(dof.hash.method, dof.hash.hash, drvName);
- }
}, output);
}
@@ -128,14 +133,21 @@ static DerivationOutput parseDerivationOutput(const Store & store, istringstream
}
const HashType hashType = parseHashType(hashAlgo);
- return DerivationOutput {
- .output = DerivationOutputFixed {
- .hash = FixedOutputHash {
- .method = std::move(method),
- .hash = Hash(hash, hashType),
- },
- }
- };
+ return hash != ""
+ ? DerivationOutput {
+ .output = DerivationOutputFixed {
+ .hash = FixedOutputHash {
+ .method = std::move(method),
+ .hash = Hash(hash, hashType),
+ },
+ }
+ }
+ : DerivationOutput {
+ .output = DerivationOutputFloating {
+ .method = std::move(method),
+ .hashType = std::move(hashType),
+ },
+ };
} else
return DerivationOutput {
.output = DerivationOutputInputAddressed {
@@ -292,6 +304,10 @@ string Derivation::unparse(const Store & store, bool maskOutputs,
s += ','; printUnquotedString(s, dof.hash.printMethodAlgo());
s += ','; printUnquotedString(s, dof.hash.hash.to_string(Base16, false));
},
+ [&](DerivationOutputFloating dof) {
+ s += ','; printUnquotedString(s, makeFileIngestionPrefix(dof.method) + printHashType(dof.hashType));
+ s += ','; printUnquotedString(s, "");
+ },
}, i.second.output);
s += ')';
}
@@ -439,14 +455,21 @@ static DerivationOutput readDerivationOutput(Source & in, const Store & store)
hashAlgo = string(hashAlgo, 2);
}
auto hashType = parseHashType(hashAlgo);
- return DerivationOutput {
- .output = DerivationOutputFixed {
- .hash = FixedOutputHash {
- .method = std::move(method),
- .hash = Hash(hash, hashType),
- },
- }
- };
+ return hash != ""
+ ? DerivationOutput {
+ .output = DerivationOutputFixed {
+ .hash = FixedOutputHash {
+ .method = std::move(method),
+ .hash = Hash(hash, hashType),
+ },
+ }
+ }
+ : DerivationOutput {
+ .output = DerivationOutputFloating {
+ .method = std::move(method),
+ .hashType = std::move(hashType),
+ },
+ };
} else
return DerivationOutput {
.output = DerivationOutputInputAddressed {
@@ -514,6 +537,10 @@ void writeDerivation(Sink & out, const Store & store, const BasicDerivation & dr
out << dof.hash.printMethodAlgo()
<< dof.hash.hash.to_string(Base16, false);
},
+ [&](DerivationOutputFloating dof) {
+ out << (makeFileIngestionPrefix(dof.method) + printHashType(dof.hashType))
+ << "";
+ },
}, i.second.output);
}
writeStorePaths(store, out, drv.inputSrcs);
diff --git a/src/libstore/derivations.hh b/src/libstore/derivations.hh
index 4dc542536..36ac09210 100644
--- a/src/libstore/derivations.hh
+++ b/src/libstore/derivations.hh
@@ -15,6 +15,8 @@ namespace nix {
struct DerivationOutputInputAddressed
{
+ /* Will need to become `std::optional<StorePath>` once input-addressed
+ derivations are allowed to depend on cont-addressed derivations */
StorePath path;
};
@@ -23,13 +25,28 @@ struct DerivationOutputFixed
FixedOutputHash hash; /* hash used for expected hash computation */
};
+struct DerivationOutputFloating
+{
+ /* information used for expected hash computation */
+ FileIngestionMethod method;
+ HashType hashType;
+};
+
struct DerivationOutput
{
std::variant<
DerivationOutputInputAddressed,
- DerivationOutputFixed
+ DerivationOutputFixed,
+ DerivationOutputFloating
> output;
- StorePath path(const Store & store, std::string_view drvName) const;
+ std::optional<HashType> hashAlgoOpt(const Store & store) const;
+ std::optional<StorePath> pathOpt(const Store & store, std::string_view drvName) const;
+ /* DEPRECATED: Remove after CA drvs are fully implemented */
+ StorePath path(const Store & store, std::string_view drvName) const {
+ auto p = pathOpt(store, drvName);
+ if (!p) throw Error("floating content-addressed derivations are not yet implemented");
+ return *p;
+ }
};
typedef std::map<string, DerivationOutput> DerivationOutputs;