Nix::Store::derivationFromPath: Return derivation outputs

This commit is contained in:
Eelco Dolstra 2013-02-05 16:02:57 +01:00
parent d6143801fd
commit 8add116acd
1 changed files with 12 additions and 9 deletions

View File

@ -15,7 +15,7 @@
using namespace nix; using namespace nix;
void doInit() void doInit()
{ {
if (!store) { if (!store) {
try { try {
@ -237,32 +237,35 @@ SV * derivationFromPath(char * drvPath)
doInit(); doInit();
Derivation drv = derivationFromPath(*store, drvPath); Derivation drv = derivationFromPath(*store, drvPath);
hash = newHV(); hash = newHV();
/* TODO: handle drv.outputs */ HV * outputs = newHV();
for (DerivationOutputs::iterator i = drv.outputs.begin(); i != drv.outputs.end(); ++i)
hv_store(outputs, i->first.c_str(), i->first.size(), newSVpv(i->second.path.c_str(), 0), 0);
hv_stores(hash, "outputs", newRV((SV *) outputs));
AV * inputDrvs = newAV(); AV * inputDrvs = newAV();
for (DerivationInputs::iterator i = drv.inputDrvs.begin(); i != drv.inputDrvs.end(); ++i) for (DerivationInputs::iterator i = drv.inputDrvs.begin(); i != drv.inputDrvs.end(); ++i)
av_push(inputDrvs, newSVpv(i->first.c_str(), 0)); // !!! ignores i->second av_push(inputDrvs, newSVpv(i->first.c_str(), 0)); // !!! ignores i->second
hv_stores(hash, "inputDrvs", newRV((SV *) inputDrvs)); hv_stores(hash, "inputDrvs", newRV((SV *) inputDrvs));
AV * inputSrcs = newAV(); AV * inputSrcs = newAV();
for (PathSet::iterator i = drv.inputSrcs.begin(); i != drv.inputSrcs.end(); ++i) for (PathSet::iterator i = drv.inputSrcs.begin(); i != drv.inputSrcs.end(); ++i)
av_push(inputSrcs, newSVpv(i->c_str(), 0)); av_push(inputSrcs, newSVpv(i->c_str(), 0));
hv_stores(hash, "inputSrcs", newRV((SV *) inputSrcs)); hv_stores(hash, "inputSrcs", newRV((SV *) inputSrcs));
hv_stores(hash, "platform", newSVpv(drv.platform.c_str(), 0)); hv_stores(hash, "platform", newSVpv(drv.platform.c_str(), 0));
hv_stores(hash, "builder", newSVpv(drv.builder.c_str(), 0)); hv_stores(hash, "builder", newSVpv(drv.builder.c_str(), 0));
AV * args = newAV(); AV * args = newAV();
for (Strings::iterator i = drv.args.begin(); i != drv.args.end(); ++i) for (Strings::iterator i = drv.args.begin(); i != drv.args.end(); ++i)
av_push(args, newSVpv(i->c_str(), 0)); av_push(args, newSVpv(i->c_str(), 0));
hv_stores(hash, "args", newRV((SV *) args)); hv_stores(hash, "args", newRV((SV *) args));
HV * env = newHV(); HV * env = newHV();
for (StringPairs::iterator i = drv.env.begin(); i != drv.env.end(); ++i) for (StringPairs::iterator i = drv.env.begin(); i != drv.env.end(); ++i)
hv_store(env, i->first.c_str(), i->first.size(), newSVpv(i->second.c_str(), 0), 0); hv_store(env, i->first.c_str(), i->first.size(), newSVpv(i->second.c_str(), 0), 0);
hv_stores(hash, "env", newRV((SV *) env)); hv_stores(hash, "env", newRV((SV *) env));
RETVAL = newRV_noinc((SV *)hash); RETVAL = newRV_noinc((SV *)hash);
} catch (Error & e) { } catch (Error & e) {
croak(e.what()); croak(e.what());