Subject: [bug#71527] [PATCH 01/20] gnu: rebar3: Make rebar3 escriptize reproducible.

From: Igor Goryachev <[email-masked]>
Date: Thu, 13 Jun 2024 09:17:38 +0300

* gnu/packages/erlang.scm (rebar3): Make rebar3 escriptize reproducible.

Change-Id: Id5897566f870afe62a97154becc752025a1b323e
---
 gnu/packages/erlang.scm | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/gnu/packages/erlang.scm b/gnu/packages/erlang.scm
index c53cb72c2e..975e989055 100644
--- a/gnu/packages/erlang.scm
+++ b/gnu/packages/erlang.scm
@@ -10,6 +10,7 @@
 ;;; Copyright © 2022 jgart <[email-masked]>
 ;;; Copyright © 2023 wrobell <[email-masked]>
 ;;; Copyright © 2023 Tim Johann <[email-masked]>
+;;; Copyright © 2024 Igor Goryachev <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -638,6 +639,29 @@ (define-public rebar3
                     "eunit_formatters" "getopt" "hex_core" "erlware_commons"
                     "parse_trans" "relx" "ssl_verify_fun" "providers"))))
          (delete 'configure)
+         ;; By default rebar3 produces escripts with embedded ZIP archives
+         ;; with files with current timestamps which is not suitable for
+         ;; reproducible builds. We fix it by setting predefined timestamps.
+         (add-before 'build 'make-escriptize-reproducible
+           (lambda _
+             (let ((escriptize "src/rebar_prv_escriptize.erl"))
+               (substitute* escriptize
+                 (("\\[dir_entries\\(filename:dirname\\(Filename1\\)\\),")
+                  (string-append "FilePath = filename:join(Dir, Filename),"
+                                 "{ok, FileInfo0} = file:read_file_info(FilePath),"
+                                 "DateTime = {{1970, 1, 1}, {0, 0, 1}},"
+                                 "FileInfo = FileInfo0#file_info{mtime = DateTime},"
+                                 "[dir_entries(filename:dirname(Filename1)),")))
+               (substitute* escriptize
+                 (((string-append
+                    "\\{Filename1, file_contents\\(filename:join\\(Dir, "
+                    "Filename\\)\\)\\}\\]."))
+                  "{Filename1, file_contents(FilePath), FileInfo}]."))
+               (substitute* escriptize
+                 (((string-append "\\[\\{FName,FBin\\} \\|\\| \\{FName,FBin\\} <- "
+                                  "Files, FBin =/= <<>>\\]\\."))
+                  (string-append "[{FName,FBin,FInfo} || {FName,FBin,FInfo} <- "
+                                 "Files, FBin =/= <<>>]."))))))
          (replace 'build
            (lambda _
              (setenv "HOME" (getcwd))
-- 
2.45.1