From 9b14107f2d686a5554bc174856f345d8daaff22d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Sun, 24 May 2015 17:22:43 +0200
Subject: [PATCH] ui: Add 'copy-file' replacement with better error reporting.

* guix/ui.scm (copy-file): New procedure.
---
 guix/ui.scm | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/guix/ui.scm b/guix/ui.scm
index 9bab7c51dd7..372733c2430 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -246,6 +246,23 @@ (define symlink
                  (append args (list link))
                  errno))))))
 
+(set! copy-file
+  ;; Note: here we use 'set!', not #:replace, because UIs typically use
+  ;; 'copy-recursively', which doesn't use (guix ui).
+  (let ((real-copy-file (@ (guile) copy-file)))
+    (lambda (source target)
+      "This is a 'copy-file' replacement that provides proper error reporting."
+      (catch 'system-error
+        (lambda ()
+          (real-copy-file source target))
+        (lambda (key proc fmt args errno)
+          ;; Augment the FMT and ARGS with information about TARGET (this
+          ;; information is missing as of Guile 2.0.11, making the exception
+          ;; uninformative.)
+          (apply throw key proc "~A: ~S"
+                 (list (strerror (car errno)) target)
+                 (list errno)))))))
+
 (define (string->number* str)
   "Like `string->number', but error out with an error message on failure."
   (or (string->number str)
-- 
GitLab