From d5b0ad8b467ea07ea80cb340dcef032987dd3d1a Mon Sep 17 00:00:00 2001 From: Patrick Norton Date: Thu, 1 Jan 2026 09:04:27 -0500 Subject: [PATCH] guix: build: utils: Add delete-all-but. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * guix/build/utils.scm (delete-all-but): New variable. Change-Id: I15e1d632a97236b8d18cec3be993c81e138dff04 Reviewed-by: Maxim Cournoyer Reviewed-by: Cayetano Santos Reviewed-by: Gabriel Wicki Signed-off-by: Nguyễn Gia Phong --- guix/build/utils.scm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/guix/build/utils.scm b/guix/build/utils.scm index 19203dc36a7..3702608dfd5 100644 --- a/guix/build/utils.scm +++ b/guix/build/utils.scm @@ -78,6 +78,7 @@ make-file-writable copy-recursively delete-file-recursively + delete-all-but file-name-predicate find-files false-if-file-not-found @@ -523,6 +524,14 @@ errors." ;; Don't follow symlinks. lstat))) +(define (delete-all-but directory . preserve) + "Delete DIRECTORY recursively except for the files in PRESERVE immediately +found under it." + (with-directory-excursion directory + (let* ((pred (negate (cut member <> (cons* "." ".." preserve)))) + (items (scandir "." pred))) + (for-each (cut delete-file-recursively <>) items)))) + (define (file-name-predicate regexp) "Return a predicate that returns true when passed a file name whose base name matches REGEXP."