forked from lix-project/lix
Add a way to get all the outputs of a derivation with their label
Generalize `queryDerivationOutputNames` and `queryDerivationOutputs` by adding a `queryDerivationOutputMap` that returns the map `outputName=>outputPath` (not that this is not equivalent to merging the results of `queryDerivationOutputs` and `queryDerivationOutputNames` as sets don't preserve the order, so we would end up with an incorrect mapping). squash! Add a way to get all the outputs of a derivation with their label Rename StorePathMap to OutputPathMap
This commit is contained in:
parent
3c50e84387
commit
d38f860c3e
|
@ -2750,8 +2750,8 @@ struct RestrictedStore : public LocalFSStore
|
||||||
void queryReferrers(const StorePath & path, StorePathSet & referrers) override
|
void queryReferrers(const StorePath & path, StorePathSet & referrers) override
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
StorePathSet queryDerivationOutputs(const StorePath & path) override
|
OutputPathMap queryDerivationOutputMap(const StorePath & path) override
|
||||||
{ throw Error("queryDerivationOutputs"); }
|
{ throw Error("queryDerivationOutputMap"); }
|
||||||
|
|
||||||
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override
|
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override
|
||||||
{ throw Error("queryPathFromHashPart"); }
|
{ throw Error("queryPathFromHashPart"); }
|
||||||
|
|
|
@ -347,6 +347,15 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case wopQueryDerivationOutputMap: {
|
||||||
|
auto path = store->parseStorePath(readString(from));
|
||||||
|
logger->startWork();
|
||||||
|
OutputPathMap outputs = store->queryDerivationOutputMap(path);
|
||||||
|
logger->stopWork();
|
||||||
|
writeOutputPathMap(*store, to, outputs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case wopQueryDeriver: {
|
case wopQueryDeriver: {
|
||||||
auto path = store->parseStorePath(readString(from));
|
auto path = store->parseStorePath(readString(from));
|
||||||
logger->startWork();
|
logger->startWork();
|
||||||
|
|
|
@ -774,17 +774,20 @@ StorePathSet LocalStore::queryValidDerivers(const StorePath & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePathSet LocalStore::queryDerivationOutputs(const StorePath & path)
|
OutputPathMap LocalStore::queryDerivationOutputMap(const StorePath & path)
|
||||||
{
|
{
|
||||||
return retrySQLite<StorePathSet>([&]() {
|
return retrySQLite<OutputPathMap>([&]() {
|
||||||
auto state(_state.lock());
|
auto state(_state.lock());
|
||||||
|
|
||||||
auto useQueryDerivationOutputs(state->stmtQueryDerivationOutputs.use()
|
auto useQueryDerivationOutputs(state->stmtQueryDerivationOutputs.use()
|
||||||
(queryValidPathId(*state, path)));
|
(queryValidPathId(*state, path)));
|
||||||
|
|
||||||
StorePathSet outputs;
|
OutputPathMap outputs;
|
||||||
while (useQueryDerivationOutputs.next())
|
while (useQueryDerivationOutputs.next())
|
||||||
outputs.insert(parseStorePath(useQueryDerivationOutputs.getStr(1)));
|
outputs.emplace(
|
||||||
|
useQueryDerivationOutputs.getStr(0),
|
||||||
|
parseStorePath(useQueryDerivationOutputs.getStr(1))
|
||||||
|
);
|
||||||
|
|
||||||
return outputs;
|
return outputs;
|
||||||
});
|
});
|
||||||
|
|
|
@ -133,7 +133,7 @@ public:
|
||||||
|
|
||||||
StorePathSet queryValidDerivers(const StorePath & path) override;
|
StorePathSet queryValidDerivers(const StorePath & path) override;
|
||||||
|
|
||||||
StorePathSet queryDerivationOutputs(const StorePath & path) override;
|
OutputPathMap queryDerivationOutputMap(const StorePath & path) override;
|
||||||
|
|
||||||
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
|
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@ public:
|
||||||
|
|
||||||
typedef std::set<StorePath> StorePathSet;
|
typedef std::set<StorePath> StorePathSet;
|
||||||
typedef std::vector<StorePath> StorePaths;
|
typedef std::vector<StorePath> StorePaths;
|
||||||
|
typedef std::map<string, StorePath> OutputPathMap;
|
||||||
|
|
||||||
/* Extension of derivations in the Nix store. */
|
/* Extension of derivations in the Nix store. */
|
||||||
const std::string drvExtension = ".drv";
|
const std::string drvExtension = ".drv";
|
||||||
|
|
|
@ -38,6 +38,32 @@ void writeStorePaths(const Store & store, Sink & out, const StorePathSet & paths
|
||||||
out << store.printStorePath(i);
|
out << store.printStorePath(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map<string, StorePath> readOutputPathMap(const Store & store, Source & from)
|
||||||
|
{
|
||||||
|
std::map<string, StorePath> pathMap;
|
||||||
|
auto rawInput = readStrings<Strings>(from);
|
||||||
|
auto curInput = rawInput.begin();
|
||||||
|
while (curInput != rawInput.end()) {
|
||||||
|
string thisKey = *curInput;
|
||||||
|
curInput = std::next(curInput);
|
||||||
|
if (curInput == rawInput.end()) {
|
||||||
|
throw Error("Got an odd number of elements from the daemon when trying to read a map… that's odd");
|
||||||
|
}
|
||||||
|
string thisValue = *curInput;
|
||||||
|
curInput = std::next(curInput);
|
||||||
|
pathMap.emplace(thisKey, store.parseStorePath(thisValue));
|
||||||
|
}
|
||||||
|
return pathMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeOutputPathMap(const Store & store, Sink & out, const std::map<string, StorePath> & pathMap)
|
||||||
|
{
|
||||||
|
out << 2*pathMap.size();
|
||||||
|
for (auto & i : pathMap) {
|
||||||
|
out << i.first;
|
||||||
|
out << store.printStorePath(i.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO: Separate these store impls into different files, give them better names */
|
/* TODO: Separate these store impls into different files, give them better names */
|
||||||
RemoteStore::RemoteStore(const Params & params)
|
RemoteStore::RemoteStore(const Params & params)
|
||||||
|
@ -412,12 +438,24 @@ StorePathSet RemoteStore::queryValidDerivers(const StorePath & path)
|
||||||
StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
|
StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
|
||||||
{
|
{
|
||||||
auto conn(getConnection());
|
auto conn(getConnection());
|
||||||
|
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 0x16) {
|
||||||
|
return Store::queryDerivationOutputs(path);
|
||||||
|
}
|
||||||
conn->to << wopQueryDerivationOutputs << printStorePath(path);
|
conn->to << wopQueryDerivationOutputs << printStorePath(path);
|
||||||
conn.processStderr();
|
conn.processStderr();
|
||||||
return readStorePaths<StorePathSet>(*this, conn->from);
|
return readStorePaths<StorePathSet>(*this, conn->from);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OutputPathMap RemoteStore::queryDerivationOutputMap(const StorePath & path)
|
||||||
|
{
|
||||||
|
auto conn(getConnection());
|
||||||
|
conn->to << wopQueryDerivationOutputMap << printStorePath(path);
|
||||||
|
conn.processStderr();
|
||||||
|
return readOutputPathMap(*this, conn->from);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<StorePath> RemoteStore::queryPathFromHashPart(const std::string & hashPart)
|
std::optional<StorePath> RemoteStore::queryPathFromHashPart(const std::string & hashPart)
|
||||||
{
|
{
|
||||||
auto conn(getConnection());
|
auto conn(getConnection());
|
||||||
|
|
|
@ -51,6 +51,7 @@ public:
|
||||||
|
|
||||||
StorePathSet queryDerivationOutputs(const StorePath & path) override;
|
StorePathSet queryDerivationOutputs(const StorePath & path) override;
|
||||||
|
|
||||||
|
OutputPathMap queryDerivationOutputMap(const StorePath & path) override;
|
||||||
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
|
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
|
||||||
|
|
||||||
StorePathSet querySubstitutablePaths(const StorePathSet & paths) override;
|
StorePathSet querySubstitutablePaths(const StorePathSet & paths) override;
|
||||||
|
|
|
@ -242,6 +242,16 @@ bool Store::PathInfoCacheValue::isKnownNow()
|
||||||
return std::chrono::steady_clock::now() < time_point + ttl;
|
return std::chrono::steady_clock::now() < time_point + ttl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StorePathSet Store::queryDerivationOutputs(const StorePath & path)
|
||||||
|
{
|
||||||
|
auto outputMap = this->queryDerivationOutputMap(path);
|
||||||
|
StorePathSet outputPaths;
|
||||||
|
for (auto & i: outputMap) {
|
||||||
|
outputPaths.emplace(std::move(i.second));
|
||||||
|
}
|
||||||
|
return outputPaths;
|
||||||
|
}
|
||||||
|
|
||||||
bool Store::isValidPath(const StorePath & storePath)
|
bool Store::isValidPath(const StorePath & storePath)
|
||||||
{
|
{
|
||||||
std::string hashPart(storePath.hashPart());
|
std::string hashPart(storePath.hashPart());
|
||||||
|
|
|
@ -418,8 +418,11 @@ public:
|
||||||
virtual StorePathSet queryValidDerivers(const StorePath & path) { return {}; };
|
virtual StorePathSet queryValidDerivers(const StorePath & path) { return {}; };
|
||||||
|
|
||||||
/* Query the outputs of the derivation denoted by `path'. */
|
/* Query the outputs of the derivation denoted by `path'. */
|
||||||
virtual StorePathSet queryDerivationOutputs(const StorePath & path)
|
virtual StorePathSet queryDerivationOutputs(const StorePath & path);
|
||||||
{ unsupported("queryDerivationOutputs"); }
|
|
||||||
|
/* Query the mapping outputName=>outputPath for the given derivation */
|
||||||
|
virtual OutputPathMap queryDerivationOutputMap(const StorePath & path)
|
||||||
|
{ unsupported("queryDerivationOutputMap"); }
|
||||||
|
|
||||||
/* Query the full store path given the hash part of a valid store
|
/* Query the full store path given the hash part of a valid store
|
||||||
path, or empty if the path doesn't exist. */
|
path, or empty if the path doesn't exist. */
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace nix {
|
||||||
#define WORKER_MAGIC_1 0x6e697863
|
#define WORKER_MAGIC_1 0x6e697863
|
||||||
#define WORKER_MAGIC_2 0x6478696f
|
#define WORKER_MAGIC_2 0x6478696f
|
||||||
|
|
||||||
#define PROTOCOL_VERSION 0x115
|
#define PROTOCOL_VERSION 0x116
|
||||||
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
|
#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
|
||||||
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
|
#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ typedef enum {
|
||||||
wopSetOptions = 19,
|
wopSetOptions = 19,
|
||||||
wopCollectGarbage = 20,
|
wopCollectGarbage = 20,
|
||||||
wopQuerySubstitutablePathInfo = 21,
|
wopQuerySubstitutablePathInfo = 21,
|
||||||
wopQueryDerivationOutputs = 22,
|
wopQueryDerivationOutputs = 22, // obsolete
|
||||||
wopQueryAllValidPaths = 23,
|
wopQueryAllValidPaths = 23,
|
||||||
wopQueryFailedPaths = 24,
|
wopQueryFailedPaths = 24,
|
||||||
wopClearFailedPaths = 25,
|
wopClearFailedPaths = 25,
|
||||||
|
@ -49,6 +49,7 @@ typedef enum {
|
||||||
wopNarFromPath = 38,
|
wopNarFromPath = 38,
|
||||||
wopAddToStoreNar = 39,
|
wopAddToStoreNar = 39,
|
||||||
wopQueryMissing = 40,
|
wopQueryMissing = 40,
|
||||||
|
wopQueryDerivationOutputMap = 41,
|
||||||
} WorkerOp;
|
} WorkerOp;
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,5 +70,6 @@ template<class T> T readStorePaths(const Store & store, Source & from);
|
||||||
|
|
||||||
void writeStorePaths(const Store & store, Sink & out, const StorePathSet & paths);
|
void writeStorePaths(const Store & store, Sink & out, const StorePathSet & paths);
|
||||||
|
|
||||||
|
void writeOutputPathMap(const Store & store, Sink & out, const OutputPathMap & paths);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue