* eval-jobs now efficiently evaluates all Hydra jobs from a

[?]
Mar 6, 2009, 4:55 PM
KD5237CUR4X3VRUD46H3CVU22NYS7LOPF3WXENWHNSF7GKEIQZ6QC

Dependencies

  • [2] YGRLM2SK * Export all relevant info about the derivation.
  • [3] IZ2AHLM3 * Export all relevant info about the derivation.
  • [4] 4LWGZL33
  • [5] 4N5APGRG * Start of a helper tool to evaluate job expressions efficiently.

Change contents

  • edit in src/c/eval-jobs.cc at line 29
    [4.218]
    [4.218]
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    Expr e, const string & attrPath);
    static void tryJobAlts(EvalState & state, XMLWriter & doc,
    const ATermMap & argsUsed, const ATermMap & argsLeft,
    const string & attrPath, Expr fun,
    ATermList formals, const ATermMap & actualArgs)
    {
    if (formals == ATempty) {
    findJobs(state, doc, argsUsed, argsLeft,
    makeCall(fun, makeAttrs(actualArgs)), attrPath);
    return;
    }
    Expr name, def; ATerm def2; ATermList values;
    if (!matchFormal(ATgetFirst(formals), name, def2)) abort();
    if ((values = (ATermList) argsLeft.get(name))) {
    for (ATermIterator i(ATreverse(values)); i; ++i) {
    ATermMap actualArgs2(actualArgs);
    ATermMap argsUsed2(argsUsed);
    ATermMap argsLeft2(argsLeft);
    actualArgs2.set(name, makeAttrRHS(*i, makeNoPos()));
    argsUsed2.set(name, *i);
    argsLeft2.remove(name);
    tryJobAlts(state, doc, argsUsed2, argsLeft2, attrPath, fun, ATgetNext(formals), actualArgs2);
    }
    }
    else if (!matchDefaultValue(def2, def))
    throw TypeError(format("cannot auto-call a function that has an argument without a default value (`%1%')")
    % aterm2String(name));
    else
    tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, fun, ATgetNext(formals), actualArgs);
    }
    static void findJobs(EvalState & state, XMLWriter & doc,
    const ATermMap & argsUsed, const ATermMap & argsLeft,
  • replacement in src/c/eval-jobs.cc at line 72
    [4.257][4.257:303]()
    std::cerr << "at `" << attrPath << "'\n";
    [4.257]
    [4.303]
    debug(format("at path `%1%'") % attrPath);
  • edit in src/c/eval-jobs.cc at line 89
    [2.98][4.639:680](),[4.639][4.639:680](),[4.680][2.99:112]()
    std::cerr << "derivation\n";
  • edit in src/c/eval-jobs.cc at line 102
    [4.1148]
    [4.1148]
    foreach (ATermMap::const_iterator, i, argsUsed) {
    XMLAttrs xmlAttrs2;
    xmlAttrs2["name"] = aterm2String(i->key);
    xmlAttrs2["value"] = showValue(i->value);
    doc.writeEmptyElement("arg", xmlAttrs2);
    }
  • edit in src/c/eval-jobs.cc at line 112
    [4.1174][4.1174:1212]()
    std::cerr << "attrset\n";
  • replacement in src/c/eval-jobs.cc at line 113
    [4.1269][4.1269:1316]()
    findJobs(state, doc, i->value,
    [4.1269]
    [4.1316]
    findJobs(state, doc, argsUsed, argsLeft, i->value,
  • replacement in src/c/eval-jobs.cc at line 119
    [3.146][4.1468:1503](),[4.1468][4.1468:1503](),[4.1503][3.147:369]()
    std::cerr << "function\n";
    ATermMap actualArgs(ATgetLength(formals));
    for (ATermIterator i(formals); i; ++i) {
    Expr name, def, value; ATerm def2;
    if (!matchFormal(*i, name, def2)) abort();
    }
    [3.146]
    [4.1503]
    tryJobAlts(state, doc, argsUsed, argsLeft, attrPath, e, formals, ATermMap());
  • replacement in src/c/eval-jobs.cc at line 121
    [4.1509][4.1509:1571]()
    else
    std::cerr << showValue(e) << "\n";
    [4.1509]
    [4.541]
    else
    printMsg(lvlError, format("unknown value: %1%") % showValue(e));
  • edit in src/c/eval-jobs.cc at line 131
    [4.613]
    [4.613]
    ATermMap autoArgs;
  • replacement in src/c/eval-jobs.cc at line 135
    [4.711][4.711:738]()
    if (arg[0] == '-')
    [4.711]
    [4.738]
    if (arg == "--arg") {
    /* This is like --arg in nix-instantiate, except that it
    supports multiple versions for the same argument.
    That is, autoArgs is a mapping from variable names to
    *lists* of values. */
    if (i == args.end()) throw UsageError("missing argument");
    string name = *i++;
    if (i == args.end()) throw UsageError("missing argument");
    string value = *i++;
    Expr e = parseExprFromString(state, value, absPath("."));
    autoArgs.set(toATerm(name), (ATerm) ATinsert(autoArgs.get(toATerm(name))
    ? (ATermList) autoArgs.get(toATerm(name))
    : ATempty, e));
    }
    else if (arg[0] == '-')
  • replacement in src/c/eval-jobs.cc at line 161
    [4.1699][4.1699:1732]()
    findJobs(state, doc, e, "");
    [4.1699]
    [4.1019]
    findJobs(state, doc, ATermMap(), autoArgs, e, "");