Commit Graph

126 Commits

Author SHA1 Message Date
Ludovic Courtès 2096ebe63f base: Catch errors in the 'process-build-log' handler.
Previously, when an exception was raised from
'handle-build-event' (e.g., a "database is locked" error), we'd throw,
thereby leaving PORT open and we'd never read from it again.  Thus, the
corresponding 'guix-daemon' process would eventually get stuck in a
'write' call to that socket, and its build processes would stall.

* src/cuirass/base.scm (exception-reporter): New procedure.
(spawn-builds): Use it.
2018-03-18 00:58:19 +01:00
Ludovic Courtès aa4c778494 base: Move database update from 'evaluate' process to the main process.
Fixes <https://bugs.gnu.org/30618>.
Reported by Andreas Enge <andreas@enge.fr>.

* bin/evaluate.in (fill-job): Remove.
(main): Remove 'database' command-line argument.  Remove DB and its
uses.  Write an (evaluation EVAL JOBS) sexp.
* src/cuirass/base.scm (evaluate)[augment-job]: New procedure.
Use it.  Adjust to read (evaluation EVAL JOBS) sexp.  Call
'db-add-evaluation' and 'db-add-derivation'.
2018-03-01 17:25:14 +01:00
Ludovic Courtès ad577114dd base: 'spawn-builds' correctly keeps track of remaining builds.
Fixes <https://bugs.gnu.org/30645>.
Reported by Andreas Enge <andreas@enge.fr>.

* src/cuirass/base.scm (spawn-builds): Fix TOTAL vs. COUNT mismatches.
2018-03-01 17:21:44 +01:00
Ludovic Courtès 8080c17c21 cuirass: Clear the build queue when starting.
* src/cuirass/base.scm (clear-build-queue): New procedure.
* bin/cuirass.in (main): Call it.
2018-02-14 20:16:35 +01:00
Ludovic Courtès 57410b6cc2 base: Account for derivations built behind our back.
Previously any derivation not directly built by Cuirass would be
considered as failed because 'handle-build-event' wouldn't see any build
event.  Here we just make sure the build status recorded in the database
corresponds to reality.

* src/cuirass/base.scm (update-build-statuses!): New procedure.
(spawn-builds): Call it after 'build-derivations&'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès 49ec76487a base: Fix computation of build success/failure.
* src/cuirass/base.scm (build-packages)[register]: Make 'db-add-build' a
tail call.
Fix computation of 'outs'.
2018-02-08 14:19:19 +01:00
Ludovic Courtès 0ff3c23274 base: Explicitly enable #:print-build-trace.
This is purely "defensive programming" since the default value for
'print-build-trace' is currently #t.

* src/cuirass/base.scm (with-store): Pass #:print-build-trace to
'set-build-options'.
2018-02-08 14:19:19 +01:00
Danny Milosavljevic eb01f46987 database: Use 'sqlite-bind' to avoid SQL injection.
* src/cuirass/database.scm (%sqlite-exec): Remove.
(sqlite-exec): Turn back into a procedure.  Use 'sqlite-bind'.  Add
'normalize' procedure and use it.
(db-add-specification, db-add-derivation, db-get-derivation)
(db-add-evaluation, db-add-build, db-update-build-status!)
(db-get-build, db-get-stamp, db-add-stamp): Use question marks in SQL
queries.
* src/cuirass/base.scm (build-packages)[register]: Make #:log
non-false.
* tests/database.scm (make-dummy-job): Add #:job-name, #:system,
 #:nix-name, and #:eval-id.  This is necessary because 'sqlite-bind'
would now translate #f to a real NULL (before it would translate to the
string "#f"...), and would thus report violations of the non-NULL
constraint.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
2018-02-08 14:18:27 +01:00
Ludovic Courtès e656f42571 base: Remove useless 'log-message' calls.
* src/cuirass/base.scm (build-packages): Remove useless 'log-message'
calls.
2018-02-05 23:01:26 +01:00
Ludovic Courtès e5220dbed3 base: Log the number of builds performed.
* src/cuirass/base.scm (spawn-builds): Log the number of builds
performed, not the number of remaining builds.
2018-02-05 23:01:26 +01:00
Ludovic Courtès 161d6abef8 base: Work around Fibers I/O scheduling bug.
Works around <https://github.com/wingo/fibers/issues/19>.

The effect in practice would be that we'd usually not reach the
'close-pipe' call in 'evaluate', leaving zombie processes behind us,
never executing the continuation, and additionally spinning fast on a
sequence of epoll_wait/epoll_ctl calls.

* src/cuirass/base.scm <top level>: Monkey-patch (fibers internal).
2018-01-30 23:58:47 +01:00
Ludovic Courtès e0588239d2 base: Make build log processing non-blocking.
We used to have 'build-derivations' write to the custom binary port
returned by 'build-event-output-port'.  However, custom binary ports
constitute continuation barriers, thereby preventing fibers from being
suspended.

To make build log processing non-blocking, we therefore invert this
inversion of control and use a suspendable I/O procedure,
'read-line/non-blocking', when reading the build log.

* src/cuirass/base.scm (read-line/non-blocking, process-build-log)
(build-derivations&): New procedures.
(%newline, build-event-output-port): Remove.
(spawn-builds): Use 'build-derivations&' instead of 'build-derivations'
with 'build-event-output-port'.
2018-01-29 18:06:47 +01:00
Ludovic Courtès 5e959dd8f2 base: 'spawn-builds' shuffles jobs.
* src/cuirass/base.scm (shuffle-jobs): New procedure.
(spawn-builds): Use it.
2018-01-29 18:06:47 +01:00
Ludovic Courtès 1e539e10cc base: 'spawn-builds' logs the beginning of each new batch.
* src/cuirass/base.scm (spawn-builds): Add 'log-message' call.
2018-01-29 18:06:47 +01:00
Ludovic Courtès e11bcf926d base: 'build-event-output-port' no longer reads past the buffer.
Fixes a bug whereby 'build-event-output-port' would sometimes read more
than COUNT from BV, which would usually result in a 'decoding-error'
exception from 'utf8->string'.

* src/cuirass/base.scm (build-event-output-port)[write!]: Use
'bytevector-range' to honor COUNT and OFFSET.
2018-01-26 15:56:40 +01:00
Ludovic Courtès 39cf6e6ed0 base: Make repository fetching and compilation non-blocking.
Previously these calls would effectively suspend execution of all the
fibers until they had completed.

* src/cuirass/base.scm (process-specs): Wrap 'fetch-repository' and
'compile' calls in 'non-blocking'.
2018-01-26 14:43:48 +01:00
Ludovic Courtès 44f95d407c base: Do not restart builds that turn out to have succeeded already.
* src/cuirass/base.scm (restart-builds): Mark as succeeded the subset of
VALID with at least one valid output.
2018-01-26 14:06:09 +01:00
Ludovic Courtès 047e927126 base: Do not pass bogus store file names to 'db-update-build-status!'.
* src/cuirass/base.scm (handle-build-event)[valid?]: New procedure.
Use it when handling 'build-started', 'build-succeeded', and
'build-failed' events.
2018-01-26 14:04:41 +01:00
Ludovic Courtès c2cbee8b4f base: Delete duplicate builds when restarting them.
* src/cuirass/base.scm (build-derivation=?): New procedure.
(restart-builds): Call 'delete-duplicates' on BUILDS.
2018-01-25 11:31:06 +01:00
Ludovic Courtès 71fb7eac92 base: Remove unneeded import.
* src/cuirass/base.scm: Remove unneeded #:use-module.
2018-01-25 10:41:37 +01:00
Ludovic Courtès 49a341866a base: Build derivations in batches.
This works around a scalability issue in guix-daemon when passing a long
list of derivations to 'build-derivations'.

* src/cuirass/base.scm (spawn-builds): New procedure.
(restart-builds, build-packages): Use it.
2018-01-25 10:36:24 +01:00
Ludovic Courtès c9ae80a757 base: Buffer input pipe of the 'evaluate' process.
* src/cuirass/base.scm (read/non-blocking): Add 'setvbuf' call.
2018-01-25 09:48:18 +01:00
Ludovic Courtès 9c96852c60 base: Extract 'read/non-blocking'.
* src/cuirass/base.scm (read/non-blocking): New procedure.
(evaluate): Use it instead of inline code.
2018-01-25 09:47:48 +01:00
Ludovic Courtès 1d7f4f07d9 base: Be more verbose about restarted builds.
* src/cuirass/base.scm (handle-build-event): Remove unused 'log-port'
parameter.
(restart-builds): Wrap 'build-derivations' in 'guard'.  Add
'log-message' calls.
2018-01-24 14:09:28 +01:00
Ludovic Courtès c62bb26e81 base: Populate the 'Outputs' table.
Fixes a regression introduced in
d7306a4f48 whereby 'register' would pass
the empty list as #:outputs to 'db-add-build'.

* src/cuirass/base.scm (build-packages)[register]: Always include
outputs.
2018-01-24 14:00:11 +01:00
Ludovic Courtès 4306667a49 base: Always set 'keep-going' when opening the store.
Previously 'restart-builds' would lack it, for instance.

* src/cuirass/base.scm (process-specs): Move 'set-build-options' call
to...
(with-store): ... here.
2018-01-23 23:53:41 +01:00
Ludovic Courtès d544f3e6ba cuirass: Fix scope mismatch.
Previously STORE would be closed on the first context switch, before
'restart-builds' has completed, leading to an error (writing to a closed
port).

* src/cuirass/base.scm (restart-builds): Remove 'store' parameter.  Wrap
body in 'with-store'.
* bin/cuirass.in (main): Adjust accordingly.
2018-01-23 23:45:24 +01:00
Ludovic Courtès dd30a1a25c base: Restart pending builds upfront.
* src/cuirass/database.scm (db-get-builds)[format-where-clause]:
Honor (status pending) filter.
* src/cuirass/base.scm (restart-builds): New procedure.
* bin/cuirass.in (main): Fetch pending builds.  Start fiber that invokes
'restart-builds' on them.
2018-01-23 23:40:07 +01:00
Ludovic Courtès fdf47d6df3 base: Add missing argument.
* src/cuirass/base.scm (build-packages): In 'filter-map' call, add
missing argument to 'db-get-build'.
2018-01-23 22:22:22 +01:00
Ludovic Courtès f1b3a12c1d base: Use 'log-message' some more.
* src/cuirass/base.scm (build-packages): Use 'log-message' instead of
'format'.
2018-01-23 18:31:35 +01:00
Ludovic Courtès d7306a4f48 base: Update build status and start/stop time according to build log.
Now the database is updated as things are built, rather than after the
whole batch of derivation builds has completed.

* src/cuirass/base.scm (handle-build-event): Call
'db-update-build-status!'.
(build-packages)[register]: Set #:starttime and #:stoptime to 0.
Set #:status to 'scheduled'.
Define 'build-ids' and use it to determine the overall result.
2018-01-23 18:29:38 +01:00
Ludovic Courtès b0f1a438ff Add a 'build-status' enumeration.
* src/cuirass/utils.scm (define-enumeration): New macro.
* src/cuirass/database.scm (build-status): New macro.
* src/cuirass/base.scm (build-packages)[hydra-build-status]: Remove.
Use the 'build-status' macro instead.
2018-01-23 17:37:08 +01:00
Ludovic Courtès f92ad7001f Fix scope mismatch.
* src/cuirass/base.scm (process-specs): Add new 'with-database' within
the fiber.
2018-01-23 09:31:11 +01:00
Ludovic Courtès ee11ba1d93 Introduce concurrency with Fibers.
* README: Mark Fibers as required.
* configure.ac: Check for Guile 2.2 only.  Check for (fibers).
* bin/cuirass.in (main): Use (fibers).  Run 'process-specs' and web
server in separate fibers.
* src/cuirass/base.scm (with-store): New macro.
(non-blocking-port): New procedure.
(evaluate): Use 'non-blocking-port'.  Use 'read-string' followed by 'read'.
(process-specs): Move 'db-add-stamp' right after 'string=?' comparison.
Run evaluation and subsequent builds in a separate fiber.
* src/cuirass/http.scm (run-cuirass-server): Pass 'fibers as the second
argument to 'run-server'.  Use 'log-message' instead of 'format'.
* src/cuirass/database.scm (with-database): Remove 'dynamic-wind'.
2018-01-22 23:39:51 +01:00
Ludovic Courtès 0d3225a08b Improve build event logging.
* src/cuirass/base.scm (handle-build-event): Add 'build-failed'; shorten
message for 'build-remote'.
2018-01-22 14:50:43 +01:00
Ludovic Courtès 47cd2d7470 Log activity of the main loop.
* src/cuirass/base.scm (process-specs): Add 'log-message' calls.
2018-01-22 13:30:03 +01:00
Ludovic Courtès 70f21349bd Add (cuirass logging) module.
* src/cuirass/logging.scm: New file.
* Makefile.am (dist_pkgmodule_DATA): Add it.
* src/cuirass/base.scm (handle-build-event): Use 'log-message' instead
of 'log'.
2018-01-22 13:29:55 +01:00
Ludovic Courtès 327d7be013 Initialize libgit's TLS certificate directory once and for all.
* src/cuirass/base.scm (prepare-git): New procedure.  Body moved from...
(process-specs): ... here.  Remove it.
* bin/cuirass.in (main): Call 'prepare-git'.
2018-01-22 13:16:10 +01:00
Ludovic Courtès 1f701262e1 Monitor and report build events.
* src/cuirass/base.scm (%newline): New variable.
(build-event-output-port, handle-build-event): New procedures.
(build-packages): Use 'handle-build-event'.
2018-01-22 10:11:37 +01:00
Ludovic Courtès 9cfea9fe2e Do not mistakenly use 'GIT_SSL_CAINFO' as a directory name.
'GIT_SSL_CAINFO' designates a single-file certificate bundle, not a
directory; thus it must be passed as the second argument to
'set-tls-certificate-locations!'.

* src/cuirass/base.scm (process-specs): Pass $SSL_CERT_DIR as the first
argument to 'set-tls-certificate-locations!', and $GIT_SSL_CAINFO or
$SSL_CERT_FILE as the second argument.
2017-09-29 09:46:23 +02:00
Jan Nieuwenhuizen 87ad259dba
base: Show feedback when build has finished.
* src/cuirass/base.scm (build-packages): Print some feedback when derivations
have been built.
2017-09-17 21:53:12 +02:00
Jan Nieuwenhuizen 88363faa83
base: Make working copy writable.
* src/cuirass/base.scm (copy-repository-cache): Make working copy writable.
Fixes guix .po build errors.
2017-09-17 21:47:28 +02:00
Mathieu Othacehe e550cb6a9a
cuirass: Store new information in database to prepare new HTTP API
integration.

* bin/evaluate.in (fill-job): New procedure.
(main): Use it to fill informations (nix-name, system) that will later be
added to database.
* doc/cuirass.texi (Database)[Derivation]: Add system and nix_name fields.
(Database)[Builds]: Add id, status, timestamp, starttime and stoptime
fields. Remove output field.
(Database)[Outputs]: New table describing the build outputs.
* src/cuirass/base.scm (build-packages): Add new fields to build object before
adding it to database.
* src/cuirass/database.scm (db-get-build, db-get-builds): New procedures to get
a build by id from database and a list of builds using filter parameters
respectively.
* src/schema.sql (Outputs) : New table.
(Derivations): Add system and nix_name columns.
(Builds): Remove output column and add id, status, timestamp, starttime and
stoptime columns.
2017-09-08 21:00:57 +02:00
Ricardo Wurmus cf96567db7
base: Set certificate location.
* src/cuirass/base.scm (process-specs): Set certificate location to the value
in GIT_SSL_CAINFO or SSL_CERT_DIR.
2017-08-26 13:57:26 +02:00
Mathieu Othacehe 6f85bc04f3
cuirass: Fix Guile current-processor-count deprecation warnings.
When current-processor-count is used without (ice-9 threads) being used, Guile
complains with the following warning:

Import (ice-9 threads) to have access to `current-processor-count'.

* src/cuirass/base.scm: Use (ice-9 threads).
2017-08-02 15:34:54 +02:00
Mathieu Othacehe a919c25328
base: Report git errors.
* src/cuirass/base.scm (report-git-error): New procedure.
(with-git-error-handling): New macro.
(process-specs): Use with-git-error-handling to catch and report git errors.
* build-aux/guix.scm (package)[inputs]: Add guile-git.
* configure.ac: Check for (git) module. Also check that (git) exports
git-error-message procedure.
2017-07-31 15:46:50 +02:00
Mathieu Othacehe c6ee3d9b1a
base: Report evaluation error.
* src/cuirass/base.scm (&evaluation-error): New condition type.
(evaluate): Report an &evaluation-error if eof-object? is true on
data read from port. Otherwise, suppose that data are correct and keep things
going.
(process-specs): Catch &evaluation-error, report the error in the log and keep
going.
2017-07-30 12:35:56 +02:00
Mathieu Othacehe efcef52883
cuirass: Add fallback parameter.
* src/cuirass/base.scm (%fallback?): New exported parameter.
(process-specs)[set-build-options]: Pass fallback parameter.
* bin/cuirass.in (%options): Add fallback.
(main): Set %fallback? parameter.
(show-help): Update.
2017-07-12 16:28:41 +02:00
Mathieu Othacehe 56ac3e24ac
base: Fix time-monotonic Guile issue.
* src/cuirass/base.scm: Replace time-monotonic with time-tai with
  Guile 2.2, to avoid wrong evaluation durations.
2017-07-12 16:28:41 +02:00
Mathieu Othacehe d7dc7cb92c
cuirass: Stop λ/lambda mixing.
* bin/cuirass.in: Replace λ by lambda.
* bin/evaluate.in: Ditto.
* build-aux/guix.scm: Ditto.
* examples/gnu-system.scm: Ditto.
* examples/guix-track-git.scm: Ditto.
* src/cuirass.scm: Ditto.
* src/cuirass/base.scm: Ditto.
* src/cuirass/database.scm: Ditto.
* src/cuirass/ui.scm: Ditto.
* src/cuirass/utils.scm: Remove λ* macro.
2017-07-06 10:03:16 +02:00
Mathieu Othacehe 1b79b7bf6e
base: Use (guix git) module.
* src/cuirass/base.scm (copy-repository-cache) : New procedure.
(fetch-repository): Use latest-repository-commit to fetch git
repository instead of raw git system commands.
(process-specs): Use fetch-repository to get a store directory
containing the repository described in SPEC, add copy it to cache with
"copy-repository-cache".
* configure.ac: Check (guix git) module presence.
2017-07-05 13:52:18 +02:00
Mathieu Othacehe f301378d94
utils: Remove useless procedures.
* src/cuirass/utils.scm (mkdir-p, make-user-module,
  call-with-temporary-directory, with-directory-excursion): Remove because
  already defined in guix.
* tests/utils (with-directory-excursion): Remove associated test.
* src/cuirass/base.scm: Use (guix build utils) to provide procedure removed
  from (cuirass utils).
* bin/evaluate.in: Ditto.
* bin/cuirass.in: Use "make-user-module" provided by (guix ui).
2017-07-01 18:47:18 +02:00
Ludovic Courtès 7f8029d33c base: Send build output to the bit bucket.
Fixes a regression introduced in
a42cf16fec whereby build logs would go the
Cuirass' stderr.

* src/cuirass/base.scm (build-packages): Parameterize
'current-build-output-port' to a void output port.
2017-06-04 22:13:16 +02:00
Ludovic Courtès a42cf16fec
base: Provide 'build-derivations' with the full list of derivations.
This improves parallelism when 'max-jobs' is large.

* src/cuirass/base.scm (build-packages): Rewrite to pass the complete
list of derivations to 'build-derivations' at once.  Handle multiple outputs.
* src/schema.sql (Builds): Make "output" part of the primary key.

Co-authored-by: Mathieu Lirzin <mthl@gnu.org>
2017-02-24 19:33:41 +01:00
Ludovic Courtès 8c811abb31
base: Remove unnecessary 'file-exists?' call.
* src/cuirass/base.scm (fetch-repository): Remove 'file-exists?' call
before 'mkdir-p'.
2017-02-24 19:32:22 +01:00
Ludovic Courtès 61f8f75e93
base: Do not stop on the first build failure.
* src/cuirass/base.scm (process-specs): Systematically call
'set-build-options'.  Pass #:keep-going? #t.
2017-02-24 19:32:22 +01:00
Mathieu Othacehe aebad5184d
base: Handle multi-directories in load-path.
* src/cuirass/base.scm (set-guix-package-path!): Parse colon separated
directories in load-path.

Co-authored-by: Mathieu Lirzin <mthl@gnu.org>
2017-02-06 12:47:36 +01:00
Mathieu Othacehe abd52046d5
base: Handle 'git clone' errors correctly.
Fixes https://notabug.org/mthl/cuirass/issues/1.

* src/cuirass/base.scm (fetch-repository): Return #f when 'git clone' fails.
(process-specs): Test if commit is not #f before using its value.

Signed-off-by: Mathieu Lirzin <mthl@gnu.org>
2017-01-29 17:28:38 +01:00
Mathieu Othacehe 5127c6797c
cuirass: Add "--load-path" option.
* bin/cuirass.in (%options): Add "--load-path" and "-L" command line options.
(show-help): Adapt.
* src/cuirass/base.scm (%guix-package-path): New parameter.
(set-guix-package-path!): New procedure.
(evaluate): Call "evaluate" script with '%guix-package-path'.
* bin/evaluate.in (main): Match 'guix-package-path' command line argument and
handle it.

Signed-off-by: Mathieu Lirzin <mthl@gnu.org>
2017-01-29 17:19:20 +01:00
Mathieu Lirzin 05eba838ea
base: Create the parent directories of '%package-cachedir'.
* src/cuirass/base.scm (fetch-repository): Use 'mkdir-p' instead of 'mkdir'
for 'cachedirectory'.
2016-12-01 20:59:43 +01:00
Mathieu Lirzin 5898e6f8f8
base: Use inner definitions instead of big anonymous procedures.
* src/cuirass/base.scm (build-packages, process-specs): Use an inner
definition instead of a big anonymous procedure.
2016-11-17 01:19:05 +01:00
Jan Nieuwenhuizen 686e31c590
base: Handle build failure.
* src/cuirass/base.scm (build-packages): Catch build failures, write
error log and update database.

Signed-off-by: Mathieu Lirzin <mthl@gnu.org>
2016-09-23 16:53:40 +02:00
Jan Nieuwenhuizen 5ef0701f54
base: Support tracking of a Guix package's git.
* src/schema.sql (Specifications): Add no_compile_p column.
* src/cuirass/database.scm (db-add-specification)
(db-get-specifications): Handle #:no-compile? property.
* tests/database.scm (example-spec): Adapt.
* src/cuirass/base.scm (process-specs): Skip compilation if #:no-compile?.

Signed-off-by: Mathieu Lirzin <mthl@gnu.org>
2016-09-23 16:50:36 +02:00
Jan Nieuwenhuizen fca42b010e
cuirass: Optionally support using of substitutes.
* bin/cuirass.in (options): Add --use-substitutes.
(show-help): Idem.
(main): Set %use-substitutes?.

Signed-off-by: Mathieu Lirzin <mthl@gnu.org>
2016-09-23 16:16:29 +02:00
Mathieu Lirzin ac4512897c
schema: Evaluations: Add 'revision' column.
* src/schema.sql (Evaluations): Add 'revision' column.
* src/cuirass/database.scm (db-add-evaluation): Adapt.
All callers changed.
2016-07-30 23:07:19 +02:00
Mathieu Lirzin 24bfb61e8e
schema: Builds: Add 'evaluation' column.
* src/schema.sql (Builds): Add 'evaluation' column.
* src/cuirass/database.scm (db-add-build): Adapt.
* src/cuirass/base.scm (build-packages): Likewise.
2016-07-27 14:17:10 +02:00
Mathieu Lirzin 4f82aeab16
cuirass: Move procedures to (cuirass base) module.
* bin/cuirass.in (fetch-repository, compile, evaluate, build-packages)
(process-specs): Move to ...
src/cuirass/base.scm: ... here.
2016-07-27 14:17:10 +02:00
Mathieu Lirzin efb249b056
evaluate: Use (cuirass ...) modules.
This avoids code duplication.
2016-07-25 02:37:06 +02:00
Mathieu Lirzin cf7e290dc2
maint: Update file headers. 2016-07-25 02:12:41 +02:00
Mathieu Lirzin 89b1f89cfc
Move '%program-name' to (cuirass ui) module. 2016-07-25 02:12:37 +02:00
Mathieu Lirzin efe96ced25 base: Remove unneeded 'guix-variable'. 2016-07-13 23:30:59 +02:00
Mathieu Lirzin 13db5aa618 λ all the things! 2016-07-02 15:49:34 +02:00
Mathieu Lirzin 7ae6ce0690 Add %package-cachedir parameter. 2016-07-02 15:34:40 +02:00
Mathieu Lirzin 2bace10106 Add (cuirass utils) module.
Move 'with-directory-excursion' here.
2016-07-02 03:13:29 +02:00
Mathieu Lirzin a62624301b base: Add %program-name parameter object. 2016-07-01 16:00:14 +02:00
Mathieu Lirzin 9d5fda76bb
Initial commit. 2016-05-29 19:53:17 +02:00