Remove hydra-eval-guile-jobs
[?]
Feb 15, 2020, 2:12 PM
Q6VFUIC6XO46PDXITZ72E7V4ATKA2PWO7USK37NTCO2LBKNGCFYACDependencies
- [2]
SVDJSA6Uhydra-eval-guile-jobs: Adjust to multiple-output format. - [3]
UL6TSQEAhydra-eval-guile-jobs: Use `--fresh-auto-compile'. - [4]
3K3GDTUQhydra-eval-guile-jobs: Honor $NIX_STORE_DIR. - [5]
YHDX3LB6hydra-eval-guile-jobs: Add "This file is part of Hydra". - [6]
3HVZCXJRShut up warnings - [7]
UXRNODRJRemove hydra-build and the old hydra-queue-runner - [8]
SW7STLQ7Cache flake-based jobset evaluations - [9]
6EAXKZCUUse the overlay from the nix flake - [10]
M3A5PZIHhydra: Clarify the dependency on BDW-GC. - [11]
UGA45FNCAdd a plugin for backing up builds in s3 - [12]
IMQRX4MPhydra-eval-jobs: Use JSON instead of XML - [13]
G2ZB6464first test, not yet in buildprocess - [14]
KX5L74EYadd nix-prefetch- scripts for now, were externals in svn - [15]
FDE3BJAP* Refactoring. - [16]
RFE6T5LG* Store jobset evaluations in the database explicitly. This includes - [17]
OVR2RWBIhydra-evaluator: Always pick the jobset that hasn't been evaluated longest - [18]
M2CFFNJYRemove unused file - [19]
4CELXP7PRemove the longDescription field - [20]
E6QWSAFLAdd hydra-dev-server which uses the classic Catalyst server - [21]
L4AI5YL6Rename hydra_*.pl to hydra-* - [22]
5SHCWE7X* Prevent repeated evaluation of a jobset with the same inputs. This - [23]
FJILMA6Gconfigure: Preserve the user's $CPPFLAGS and $LDFLAGS. - [24]
UEMB7PTHAdd option eval_substituter - [25]
P3M6UFMPMerge remote-tracking branch 'origin/master' into flake - [26]
W2VB36NMguile: Raise default absolute timeout to from 2h to 20h. - [27]
D5QIOJGP* Move everything up one directory. - [28]
VML3XVFYhydra-eval-guile-jobs: Allow use of the installed Guix. - [29]
XHOZT4WTAdd a command `hydra-create-user' for managing user accounts - [30]
MPFSVI5XPedantry: CLOCK_REALTIME -> CLOCK_MONOTONIC - [31]
N22GPKYT* Put info about logs / build products in the DB. - [32]
FAIJDQKZ - [33]
WQXF2T3Dhydra-evaluator: Don't require $HYDRA_CONFIG - [34]
KNLKTCDMUse pkgconfig to find Nix - [35]
HP5WJLQUhydra-eval-{jobs,jobset}: Pass file name as <...> - [36]
6MGFQDR2deleted some old scripts - [37]
2KJFOYGShydra: Actually check for Nix in `configure'. - [38]
RXVJFQ5AEvaluator cleanups - [39]
3ZURHKX5Update .gitignore - [40]
VU2OLHD2Move most of AddBuilds to hydra-eval-jobset - [41]
HXS5NUHWhydra-eval-guile-jobs: Adjust to <license> objects. - [42]
4YCF3KBGConcurrent hydra-evaluator - [43]
6WRGCITDEnable declarative projects. - [44]
STZE4KKRFix build against Nix master - [45]
5M6YEYUJhydra-backfill-ids: create to add jobset_id values to Builds and Jobs - [46]
QAJK5MCERemove obsolete hydra-control script - [47]
GBCPEGYCAdd a .gitignore - [48]
QMW24O5SAdd support for Guile & Guix. - [49]
ARD6Z67TDo incremental SVN checkouts - [50]
Q6SOGMDQHydra/28: Rename "scheduler" to "evaluator" - [51]
IE2PRAQUhydra-queue-runner: Send build notifications - [52]
POPU2ATH* hydra_scheduler: use eval-jobs. - [53]
Y6H7Y3OTCapture the path to `guile', when available. - [54]
5PXVIXLHDeclarative projects: Include the fetch info for the declarative input in the project eval - [55]
DODOGD7MSend queue runner stats to statsd - [56]
IS7GUIWYhydra-eval-guile-jobs: Register derivations as GC roots. - [57]
ZPHREC7Xhydra-eval-jobset: Support flakes - [58]
NNQ7IQJXset scripts to executable - [59]
DBPIYHMAhydra: add nix-prefetch-* to tarball - [60]
3ZCEPLNO - [61]
FV2M6MOThydra: use autoconf/-make - [62]
AMFMXR52Provide a command ‘hydra-init’ to initialise/upgrade the database - [*]
T4LLYESZ* Nix expression for building Hydra.
Change contents
- edit in .gitignore at line 18
/src/script/hydra-eval-guile-jobs - edit in configure.ac at line 55
PKG_CHECK_MODULES([GUILE], [guile-2.0], [HAVE_GUILE=yes], [HAVE_GUILE=no]) - edit in configure.ac at line 56
if test "x$HAVE_GUILE" = xyes; thenAC_PATH_PROG([GUILE], [guile])elseGUILE="guile"fiAC_SUBST([GUILE]) - edit in configure.ac at line 74
src/script/hydra-eval-guile-jobs - replacement in configure.ac at line 78
AC_CONFIG_COMMANDS([executable-scripts],[chmod +x src/script/hydra-eval-guile-jobs])AC_CONFIG_COMMANDS([executable-scripts], []) - edit in flake.nix at line 109
guile # optional, for Guile + Guix support - edit in flake.nix at line 110
boehmgc - file deletion: hydra-eval-guile-jobs.in hydra-eval-guile-jobs[10.2543]→[10.667:715](∅→∅),[10.715]→[10.2679:2679](∅→∅),[10.2543]→[10.11339:11384](∅→∅),[10.11384]→[10.2679:2679](∅→∅)
#!/bin/sh# Aside from this initial boilerplate, this is actually -*- scheme -*- code.main="(module-ref (resolve-interface '(hydra-eval-guile-jobs)) 'eval-guile-jobs)"# Keep the host's GUILE_LOAD_PATH unchanged to allow the installed Guix to# be used. This moves Guix modules possibly out of control, but solves# bootstrapping issues.## Use `--fresh-auto-compile' to ignore any available .go, and force# recompilation. This is because checkouts in the store has mtime set to# the epoch, and thus .go files look newer, even though they may not# correspond.exec ${GUILE:-@GUILE@} --no-auto-compile --fresh-auto-compile \-l "$0" -c "(apply $main (cdr (command-line)))" "$@"!#;;; Copyright © 2012, 2013, 2014 Ludovic Courtès <ludo@gnu.org>;;;;;; This file is part of Hydra.;;;;;; Hydra is free software: you can redistribute it and/or modify;;; it under the terms of the GNU General Public License as published by;;; the Free Software Foundation, either version 3 of the License, or;;; (at your option) any later version.;;;;;; Hydra is distributed in the hope that it will be useful,;;; but WITHOUT ANY WARRANTY; without even the implied warranty of;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the;;; GNU General Public License for more details.;;;;;; You should have received a copy of the GNU General Public License;;; along with Hydra. If not, see <http://www.gnu.org/licenses/>.(define-module (hydra-eval-guile-jobs)#:use-module (sxml simple)#:use-module (ice-9 match)#:use-module (ice-9 regex)#:use-module (srfi srfi-1)#:use-module (srfi srfi-11)#:export (job-evaluations->xmleval-guile-jobs))(define (guix-variable module name)"Dynamically link variable NAME under Guix module MODULE and return it.Note: this is used instead of `@', because when using `@' in an uncompiledfile, Guile tries to load the module directly as it reads the source, whichfails in our case, leading to the creation of empty (guix ...) modules.";; TODO: fail with an XML error description(let ((m (resolve-interface `(guix ,module))))(module-ref m name)))(define (%derivation-system drv);; XXX: Awful hack to workaround the fact that `derivation-system', which;; is a macro, cannot be referred to dynamically.(struct-ref drv 3))(define strip-store-path(let* ((store (or (getenv "NIX_STORE_DIR") "/nix/store"))(store-path-rx(make-regexp (string-append "^.*" (regexp-quote store)"/[^-]+-(.+)$"))))(lambda (path)(or (and=> (regexp-exec store-path-rx path)(lambda (match)(let ((path (match:substring match 1)))path)))path))))(define (derivation-path->name drv)"Return the base name of DRV, sans hash and `.drv' extension."(let ((d (strip-store-path drv)))(if (string-suffix? ".drv" d)(string-drop-right d 4)d)))(define (register-gc-root drv roots-dir)"Register a permanent garbage collector root under ROOTS-DIR for DRV."(let ((root (string-append roots-dir "/" (basename drv))))(unless (file-exists? root)(symlink drv root))))(define* (job-evaluations->sxml jobs#:key gc-roots-dir)"Return the hydra-eval-jobs SXML form for the result of JOBS, a list ofsymbol/thunk pairs."`(*TOP*(*PI* xml "version='1.0' encoding='utf-8'")"\n"(jobs "\n",@(map (match-lambda(((? symbol? name) . (? thunk? thunk))(let* ((result (save-module-excursion(lambda ()(set-current-module %user-module)(with-output-to-port (%make-void-port "w")thunk))))(drv (assoc-ref result 'derivation)))(define (opt-attr xml-name name)(match (assoc name result)((_ . value)`((,xml-name ,value)))(_'())));; XXX: Add <arg ...> tags?`(job (@ (jobName ,name)(drvPath ,drv),@(opt-attr 'homepage 'home-page)(license,(let loop ((license (assoc-ref result 'license)))(match license((? struct?)(struct-ref license 0))((l ...)(string-join (map loop l)))(_ "")))),@(opt-attr 'description 'description)(maintainers,(string-join (or (assoc-ref result 'maintainers)'())", "))(maxSilent,(number->string (or (assoc-ref result'max-silent-time)3600)))(timeout,(number->string (or (assoc-ref result 'timeout)72000)))(nixName ,(derivation-path->name drv))(schedulingPriority,(number->string (or (assoc-ref result'scheduling-priority)10)))(system,(call-with-input-file drv(compose %derivation-system(guix-variable 'derivations'read-derivation)))))"\n"))))jobs))))(define* (job-evaluations->xml jobs port#:key gc-roots-dir)(set-port-encoding! port "UTF-8")(sxml->xml (job-evaluations->sxml jobs #:gc-roots-dir gc-roots-dir)port));;;;;; Command-line entry point.;;;(define (parse-arguments args)"Traverse ARGS, a list of command-line arguments compatible with`hydra-eval-jobs', and return the name of the file that defines the jobs, anexpression that returns the entry point in that file (a unary procedure), thelist of name/value pairs passed to that entry point, as well as a GC rootdirectory or #f."(define (module-directory dir)(let ((d (string-append dir "/share/guile/site/2.0")))(if (file-exists? d)ddir)))(let loop ((args args)(result '())(file #f)(entry 'hydra-jobs)(roots-dir #f))(match args(()(if (not file)(error "hydra-eval-guile-jobs: no expression file given")(values file entry (reverse result) roots-dir)))(("-I" name=dir rest ...)(let* ((dir (match (string-tokenize name=dir(char-set-complement (char-set#\=)))((_ dir) dir)((dir) dir)))(dir* (module-directory dir)))(format (current-error-port) "adding `~a' to the load path~%" dir*)(set! %load-path (cons dir* %load-path))(set! %load-compiled-path (cons dir* %load-compiled-path)))(loop rest result file entry roots-dir))(("--argstr" name value rest ...)(loop rest (alist-cons (string->symbol name) value result)file entry roots-dir))(("--arg" name expr rest ...)(let ((value (eval (call-with-input-string expr read)(current-module))))(loop rest (alist-cons (string->symbol name) value result)file entry roots-dir)))(("--gc-roots-dir" dir rest ...)(loop rest result file entry dir))(("-j" _ rest ...) ; XXX: what's this?(loop rest result file entry roots-dir))(("--entry" expr rest ...) ; entry point, like `guile -e'(let ((expr (call-with-input-string expr read)))(loop rest result file expr roots-dir)))((file rest ...) ; source file that defines the jobs(loop rest result file entry roots-dir))(_(error "hydra-eval-guile-jobs: invalid arguments" args)))))(define %user-module;; Hydra user module.;; TODO: Make it a sandbox.(let ((m (make-module)))(beautify-user-module! m)m))(define (eval-guile-jobs . args)(setlocale LC_ALL "")(let-values (((file entry args gc-roots-dir)(parse-arguments args)))(save-module-excursion(lambda ()(set-current-module %user-module);; The standard output must contain only XML.(with-output-to-port (%make-void-port "w")(lambda ()(primitive-load file)))))(let* ((entry (eval entry %user-module))(store ((guix-variable 'store 'open-connection)))(jobs (entry store args)))(unless (string? gc-roots-dir)(format (current-error-port)"warning: --gc-roots-dir not specified~%"))(job-evaluations->xml jobs (current-output-port)#:gc-roots-dir gc-roots-dir))));; Resolve Guix modules lazily.,(map (match-lambda((name . path)`(output (@ (name ,name) (path ,path)))))((guix-variable 'derivations'derivation-path->output-paths)drv))(when gc-roots-dir;; Register DRV as a GC root so that it's not collected by;; the time 'hydra-queue-runner' attempts to build it.(register-gc-root drv gc-roots-dir)) - replacement in src/script/Makefile.am at line 2
$(distributable_scripts) \hydra-eval-guile-jobs.in$(distributable_scripts) - replacement in src/script/Makefile.am at line 19
$(distributable_scripts) \hydra-eval-guile-jobs[10.611]$(distributable_scripts) - replacement in src/script/hydra-eval-jobset at line 267
my ($exprType, $value) = @_;my $result;if ($exprType eq "guile") {if ($value eq "true") {$result = "#t";} else {$result = "#f";}$result = $value;} else {$result = $value;}return $result;my ($value) = @_;return $value; - replacement in src/script/hydra-eval-jobset at line 273
my ($exprType, $input) = @_;my $result;if ($exprType eq "guile") {$result = "'((file-name . \"" . ${input}->{storePath} . "\")" .(defined $input->{revision} ? "(revision . \"" . $input->{revision} . "\")" : "") .(defined $input->{revCount} ? "(revision-count . " . $input->{revCount} . ")" : "") .(defined $input->{gitTag} ? "(git-tag . \"" . $input->{gitTag} . "\")" : "") .(defined $input->{shortRev} ? "(short-revision . \"" . $input->{shortRev} . "\")" : "") .(defined $input->{version} ? "(version . \"" . $input->{version} . "\")" : "") .")";} else {$result = "{ outPath = builtins.storePath " . $input->{storePath} . "" ."; inputType = \"" . $input->{type} . "\"" .(defined $input->{uri} ? "; uri = \"" . $input->{uri} . "\"" : "") .(defined $input->{revNumber} ? "; rev = " . $input->{revNumber} . "" : "") .(defined $input->{revision} ? "; rev = \"" . $input->{revision} . "\"" : "") .(defined $input->{revCount} ? "; revCount = " . $input->{revCount} . "" : "") .(defined $input->{gitTag} ? "; gitTag = \"" . $input->{gitTag} . "\"" : "") .(defined $input->{shortRev} ? "; shortRev = \"" . $input->{shortRev} . "\"" : "") .(defined $input->{version} ? "; version = \"" . $input->{version} . "\"" : "") .(defined $input->{outputName} ? "; outputName = \"" . $input->{outputName} . "\"" : "") .(defined $input->{drvPath} ? "; drvPath = builtins.storePath " . $input->{drvPath} . "" : "") .";}";}return $result;my ($input) = @_;return"{ outPath = builtins.storePath " . $input->{storePath} . "" ."; inputType = \"" . $input->{type} . "\"" .(defined $input->{uri} ? "; uri = \"" . $input->{uri} . "\"" : "") .(defined $input->{revNumber} ? "; rev = " . $input->{revNumber} . "" : "") .(defined $input->{revision} ? "; rev = \"" . $input->{revision} . "\"" : "") .(defined $input->{revCount} ? "; revCount = " . $input->{revCount} . "" : "") .(defined $input->{gitTag} ? "; gitTag = \"" . $input->{gitTag} . "\"" : "") .(defined $input->{shortRev} ? "; shortRev = \"" . $input->{shortRev} . "\"" : "") .(defined $input->{version} ? "; version = \"" . $input->{version} . "\"" : "") .(defined $input->{outputName} ? "; outputName = \"" . $input->{outputName} . "\"" : "") .(defined $input->{drvPath} ? "; drvPath = builtins.storePath " . $input->{drvPath} . "" : "") .";}"; - replacement in src/script/hydra-eval-jobset at line 291
my ($inputInfo, $exprType) = @_;my ($inputInfo) = @_; - replacement in src/script/hydra-eval-jobset at line 308
push @res, "--arg", $input, booleanToString($exprType, $alt->{value});push @res, "--arg", $input, booleanToString($alt->{value}); - edit in src/script/hydra-eval-jobset at line 311
die "input type ‘nix’ only supported for Nix-based jobsets\n" unless $exprType eq "nix"; - edit in src/script/hydra-eval-jobset at line 314
die "input type ‘eval’ only supported for Nix-based jobsets\n" unless $exprType eq "nix"; - replacement in src/script/hydra-eval-jobset at line 322
push @res, "--arg", $input, buildInputToString($exprType, $alt);push @res, "--arg", $input, buildInputToString($alt); - replacement in src/script/hydra-eval-jobset at line 331
my ($inputInfo, $exprType, $nixExprInputName, $nixExprPath, $flakeRef) = @_;my ($inputInfo, $nixExprInputName, $nixExprPath, $flakeRef) = @_; - edit in src/script/hydra-eval-jobset at line 343
my $evaluator = ($exprType eq "guile") ? "hydra-eval-guile-jobs" : "hydra-eval-jobs"; - replacement in src/script/hydra-eval-jobset at line 344
@cmd = ($evaluator,@cmd = ("hydra-eval-jobs", - replacement in src/script/hydra-eval-jobset at line 348
inputsToArgs($inputInfo, $exprType));inputsToArgs($inputInfo)); - edit in src/script/hydra-eval-jobset at line 581
my $exprType = $jobset->nixexprpath =~ /.scm$/ ? "guile" : "nix"; - replacement in src/script/hydra-eval-jobset at line 616
my @args = ($jobset->nixexprinput, $jobset->nixexprpath, inputsToArgs($inputInfo, $exprType));my @args = ($jobset->nixexprinput, $jobset->nixexprpath, inputsToArgs($inputInfo)); - replacement in src/script/hydra-eval-jobset at line 631
my $jobs = evalJobs($inputInfo, $exprType, $jobset->nixexprinput, $jobset->nixexprpath, $flakeRef);my $jobs = evalJobs($inputInfo, $jobset->nixexprinput, $jobset->nixexprpath, $flakeRef);