aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/downstream-placeholder.cc
blob: d6af5c951c9ae785b931062f52e776f31d90521f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "downstream-placeholder.hh"
#include "derivations.hh"

namespace nix {

std::string DownstreamPlaceholder::render() const
{
    return "/" + hash.to_string(Base::Base32, false);
}


DownstreamPlaceholder DownstreamPlaceholder::unknownCaOutput(
    const StorePath & drvPath,
    OutputNameView outputName,
    const ExperimentalFeatureSettings & xpSettings)
{
    xpSettings.require(Xp::CaDerivations);
    auto drvNameWithExtension = drvPath.name();
    auto drvName = drvNameWithExtension.substr(0, drvNameWithExtension.size() - 4);
    auto clearText = "nix-upstream-output:" + std::string { drvPath.hashPart() } + ":" + outputPathName(drvName, outputName);
    return DownstreamPlaceholder {
        hashString(HashType::SHA256, clearText)
    };
}

DownstreamPlaceholder DownstreamPlaceholder::unknownDerivation(
    const DownstreamPlaceholder & placeholder,
    OutputNameView outputName,
    const ExperimentalFeatureSettings & xpSettings)
{
    xpSettings.require(Xp::DynamicDerivations);
    auto compressed = compressHash(placeholder.hash, 20);
    auto clearText = "nix-computed-output:"
        + compressed.to_string(Base::Base32, false)
        + ":" + std::string { outputName };
    return DownstreamPlaceholder {
        hashString(HashType::SHA256, clearText)
    };
}

DownstreamPlaceholder DownstreamPlaceholder::fromSingleDerivedPathBuilt(
    const SingleDerivedPath::Built & b,
    const ExperimentalFeatureSettings & xpSettings)
{
    return std::visit(overloaded {
        [&](const SingleDerivedPath::Opaque & o) {
            return DownstreamPlaceholder::unknownCaOutput(o.path, b.output, xpSettings);
        },
        [&](const SingleDerivedPath::Built & b2) {
            return DownstreamPlaceholder::unknownDerivation(
                DownstreamPlaceholder::fromSingleDerivedPathBuilt(b2, xpSettings),
                b.output,
                xpSettings);
        },
    }, b.drvPath->raw());
}

}