Ben Woodcroft <[email protected]> writes:

> From 3d23171d88b9f38c90efa469f6519b52b15a1d01 Mon Sep 17 00:00:00 2001
> From: Ben Woodcroft <[email protected]>
> Date: Wed, 30 Dec 2015 10:27:33 +1000
> Subject: [PATCH] build: ruby: Remove cached gem after install.

> The .gem file stored in GEM_HOME after install is both redundant and an
> archive that stores timestamped files which makes builds non-deterministic. So
> delete it after 'gem install'.

Good idea!  I don’t know if the existence of the cached gem is checked
for by any Ruby tools (bundler or the like).  Is there some
documentation about this cache?

> -    (zero? (apply system* "gem" "install" (first-matching-file "\\.gem$")
> -                  "--local" "--ignore-dependencies"
> -                  ;; Executables should go into /bin, not /lib/ruby/gems.
> -                  "--bindir" (string-append out "/bin")
> -                  gem-flags))))
> +    (apply system* "gem" "install" gem-name
> +           "--local" "--ignore-dependencies"
> +           ;; Executables should go into /bin, not /lib/ruby/gems.
> +           "--bindir" (string-append out "/bin")
> +           gem-flags)
> +    ;; Remove the cached gem file as this is unnecessary and contains
> +    ;; timestamped files rendering builds not reproducible.
> +    (delete-file (string-append gem-home "/cache/" gem-name))
> +    #t))

I’d prefer to keep ‘(zero? ...)’ and only delete the file when the
‘system*’ call above succeeded.  It would be nice if we could propagate
any bad return value from ‘system*’ to the end of the procedure.

Maybe something like this:

  (and (zero? (apply system* ...))
       (begin (delete-file ...) #t))

It’s a bit clunky but the return value would still be #f if ‘system*’
fails.  What do you think?

~~ Ricardo


Reply via email to