Fix build and handling of string inputs starting with a dash

[?]
Aug 13, 2014, 2:24 PM
7GKAIP3VYKM4MGGHOGBB3DR2M6B6SENBR5IZQVJYO65AWT4BW7LAC

Dependencies

  • [2] WMWBCZPR
  • [3] FGUL3HAZ hydra-eval-jobs: Don't go into an infinite recursion
  • [4] 7D6RFSAA Fix build for new nixUnstable
  • [5] AEKIREIH * Updated hydra_eval_jobs for the new evaluator.
  • [6] 3PNG7NIB Remove trailing whitespace
  • [7] 4N5APGRG * Start of a helper tool to evaluate job expressions efficiently.
  • [8] KD5237CU * eval-jobs now efficiently evaluates all Hydra jobs from a
  • [9] 7YCFGMZB * Report evaluation errors per job, and don't bail out if a job fails
  • [10] POPU2ATH * hydra_scheduler: use eval-jobs.
  • [11] A63IHCMX * Register GC roots properly.
  • [12] 4XR2A7QD * Fix building hydra_eval_jobs against the sqlite branch.
  • [13] 52JSLNC6 * Build fix.
  • [14] MIC2O6ZF Use evalFile() instead of parseExprFromFile()
  • [15] 4LWGZL33
  • [16] AEFNBIIW * Merge the GC branch.
  • [17] 77VF5TC6 * For ease of use during debugging, don't require --gc-roots-dir.
  • [18] AYMPPH7G Don't write one character at a time, it's inefficient
  • [19] SM5M2J3A Pass inputs to release expressions using -I
  • [20] EBG4P4SY Doh - clear $NIX_PATH properly
  • [21] YGRLM2SK * Export all relevant info about the derivation.

Change contents

  • edit in src/c/hydra-eval-jobs.cc at line 18
    [5.475][5.475:494](),[5.494][3.0:53](),[3.53][5.71:73](),[5.541][5.71:73](),[5.73][5.0:1](),[5.1][5.73:74](),[5.73][5.73:74]()
    void printHelp()
    {
    std::cout << "Syntax: hydra-eval-jobs <expr>\n";
    }
  • replacement in src/c/hydra-eval-jobs.cc at line 224
    [5.545][5.545:568]()
    void run(Strings args)
    [5.545]
    [5.568]
    int main(int argc, char * * argv)
  • replacement in src/c/hydra-eval-jobs.cc at line 230
    [5.807][4.73:387](),[4.387][5.591:613](),[5.591][5.591:613](),[5.613][5.2474:2497]()
    /* FIXME: hack */
    Strings searchPath;
    Strings args2;
    for (Strings::iterator i = args.begin(); i != args.end(); ) {
    string arg = *i++;
    if (!parseSearchPathArg(arg, i, args.end(), searchPath))
    args2.push_back(arg);
    }
    args = args2;
    EvalState state(searchPath);
    Path releaseExpr;
    AutoArgs autoArgs;
    [5.807]
    [5.27]
    return handleExceptions(argv[0], [&]() {
    initNix();
  • replacement in src/c/hydra-eval-jobs.cc at line 233
    [5.618][5.618:711](),[5.711][5.951:1002](),[5.1002][5.2157:2604](),[5.2157][5.2157:2604](),[5.2604][5.1132:1176](),[5.1176][5.2519:2551](),[5.2519][5.2519:2551](),[5.2551][5.0:80]()
    for (Strings::iterator i = args.begin(); i != args.end(); ) {
    string arg = *i++;
    if (arg == "--arg" || arg == "--argstr") {
    /* 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++;
    Value * v = state.allocValue();
    if (arg == "--arg")
    state.eval(state.parseExprFromString(value, absPath(".")), *v);
    [5.28]
    [5.2631]
    Strings searchPath;
    Path releaseExpr;
    std::map<string, Strings> autoArgs_;
    parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
    if (*arg == "--arg" || *arg == "--argstr") {
    /* 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. */
    auto what = *arg;
    string name = getArg(what, arg, end);
    string value = getArg(what, arg, end);
    autoArgs_[name].push_back((what == "--arg" ? 'E' : 'S') + value);
    }
    else if (parseSearchPathArg(arg, end, searchPath))
    ;
    else if (*arg == "--gc-roots-dir")
    gcRootsDir = getArg(*arg, arg, end);
    else if (*arg != "" && arg->at(0) == '-')
    return false;
  • replacement in src/c/hydra-eval-jobs.cc at line 255
    [5.2648][5.1259:1296](),[5.1296][5.2684:2747](),[5.2684][5.2684:2747](),[5.2747][5.2857:2867](),[5.2857][5.2857:2867](),[5.2867][5.426:582](),[5.219][5.2867:2899](),[5.582][5.2867:2899](),[5.2867][5.2867:2899](),[5.2899][5.738:854](),[5.738][5.738:854]()
    mkString(*v, value);
    autoArgs[state.symbols.create(name)].push_back(v);
    }
    else if (arg == "--gc-roots-dir") {
    if (i == args.end()) throw UsageError("missing argument");
    gcRootsDir = *i++;
    }
    else if (arg[0] == '-')
    throw UsageError(format("unknown flag `%1%'") % arg);
    else
    releaseExpr = arg;
    }
    [5.2648]
    [5.854]
    releaseExpr = absPath(*arg);
    return true;
    });
  • replacement in src/c/hydra-eval-jobs.cc at line 259
    [5.855][5.189:261]()
    if (releaseExpr == "") throw UsageError("no expression specified");
    [5.855]
    [5.808]
    if (releaseExpr == "") throw UsageError("no expression specified");
  • replacement in src/c/hydra-eval-jobs.cc at line 261
    [5.809][5.193:282](),[5.588][5.193:282]()
    if (gcRootsDir == "") printMsg(lvlError, "warning: `--gc-roots-dir' not specified");
    [5.809]
    [5.810]
    if (gcRootsDir == "") printMsg(lvlError, "warning: `--gc-roots-dir' not specified");
  • replacement in src/c/hydra-eval-jobs.cc at line 263
    [5.266][5.855:880](),[5.811][5.855:880](),[5.855][5.855:880]()
    store = openStore();
    [5.811]
    [5.880]
    EvalState state(searchPath);
  • replacement in src/c/hydra-eval-jobs.cc at line 265
    [5.134][5.2802:2815](),[5.2802][5.2802:2815](),[5.2815][5.112:148]()
    Value v;
    state.evalFile(releaseExpr, v);
    [5.881]
    [5.1624]
    AutoArgs autoArgs;
    for (auto & i : autoArgs_) {
    for (auto & j : i.second) {
    Value * v = state.allocValue();
    if (j[0] == 'E')
    state.eval(state.parseExprFromString(string(j, 1), absPath(".")), *v);
    else
    mkString(*v, string(j, 1));
    autoArgs[state.symbols.create(i.first)].push_back(v);
    }
    }
    //evalAutoArgs(state, autoArgs_, autoArgs);
  • replacement in src/c/hydra-eval-jobs.cc at line 278
    [5.1336][5.1625:1699](),[5.1625][5.1625:1699](),[5.1699][5.2842:2897]()
    XMLWriter doc(true, std::cout);
    XMLOpenElement root(doc, "jobs");
    findJobs(state, doc, ArgsUsed(), autoArgs, v, "");
    [5.1625]
    [2.0]
    store = openStore();
  • replacement in src/c/hydra-eval-jobs.cc at line 280
    [2.1][2.1:25](),[2.25][5.1019:1021](),[5.1732][5.1019:1021](),[5.2897][5.1019:1021](),[5.2955][5.1019:1021](),[5.1019][5.1019:1021]()
    state.printStats();
    }
    [2.1]
    [5.1021]
    Value v;
    state.evalFile(releaseExpr, v);
  • edit in src/c/hydra-eval-jobs.cc at line 283
    [5.1022]
    [5.1022]
    XMLWriter doc(true, std::cout);
    XMLOpenElement root(doc, "jobs");
    findJobs(state, doc, ArgsUsed(), autoArgs, v, "");
  • replacement in src/c/hydra-eval-jobs.cc at line 287
    [5.1023][3.351:389]()
    string programId = "hydra-eval-jobs";
    [5.1023]
    state.printStats();
    });
    }