Subject: bug#44760: [PATCH 01/15] serialization: 'fold-archive' notifies about directory processing completion.

From: Ludovic Courtès <[email-masked]>
Date: Fri, 11 Dec 2020 16:09:11 +0100

* guix/serialization.scm (fold-archive): Call PROC with a
'directory-complete tag when done with a directory.
(restore-file): Handle it.
* guix/scripts/archive.scm (list-contents): Likewise.
* guix/scripts/challenge.scm (archive-contents): Likewise.
* tests/nar.scm ("write-file-tree + fold-archive"): Adjust accordingly.
---
 guix/scripts/archive.scm   | 2 ++
 guix/scripts/challenge.scm | 1 +
 guix/serialization.scm     | 5 ++++-
 tests/nar.scm              | 6 ++++--
 4 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/guix/scripts/archive.scm b/guix/scripts/archive.scm
index c04baf9784..1f73fff711 100644
--- a/guix/scripts/archive.scm
+++ b/guix/scripts/archive.scm
@@ -347,6 +347,8 @@ output port."
                   (match type
                     ('directory
                      (format #t "D ~a~%" file))
+                    ('directory-complete
+                     #t)
                     ('symlink
                      (format #t "S ~a -> ~a~%" file content))
                     ((or 'regular 'executable)
diff --git a/guix/scripts/challenge.scm b/guix/scripts/challenge.scm
index 39bd2c1c0f..d0a456ac1d 100644
--- a/guix/scripts/challenge.scm
+++ b/guix/scripts/challenge.scm
@@ -210,6 +210,7 @@ taken since we do not import the archives."
                         (cons `(,file ,type ,(port-sha256* port size))
                               result))))
                     ('directory result)
+                    ('directory-complete result)
                     ('symlink
                      (cons `(,file ,type ,contents) result))))
                 '()
diff --git a/guix/serialization.scm b/guix/serialization.scm
index 836ad06caf..cc56134ef4 100644
--- a/guix/serialization.scm
+++ b/guix/serialization.scm
@@ -444,7 +444,8 @@ depends on TYPE."
                                            (file file)
                                            (token x))))))
                      (loop (read-string port) result)))))
-               (")" result)                       ;done with DIR
+               (")"                               ;done with DIR
+                (proc file 'directory-complete #f result))
                (x
                 (raise
                  (condition
@@ -463,6 +464,8 @@ Restore it as FILE."
                   (match type
                     ('directory
                      (mkdir file))
+                    ('directory-complete
+                     #t)
                     ('symlink
                      (symlink content file))
                     ((or 'regular 'executable)
diff --git a/tests/nar.scm b/tests/nar.scm
index aeff3d3330..b542ebd47c 100644
--- a/tests/nar.scm
+++ b/tests/nar.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <[email-masked]>
+;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -218,8 +218,10 @@
   '(("R" directory #f)
     ("R/dir" directory #f)
     ("R/dir/exe" executable "1234")
+    ("R/dir" directory-complete #f)
     ("R/foo" regular "abcdefg")
-    ("R/lnk" symlink "foo"))
+    ("R/lnk" symlink "foo")
+    ("R" directory-complete #f))
 
   (let ()
     (define-values (port get-bytevector)
-- 
2.29.2