guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: guix: inferior: Fix the behaviour of open-inferior #:error-port.


From: guix-commits
Subject: 01/02: guix: inferior: Fix the behaviour of open-inferior #:error-port.
Date: Fri, 8 Jul 2022 08:54:05 -0400 (EDT)

cbaines pushed a commit to branch master
in repository guix.

commit b4c4a6acb1204ee53e95744236ee89985db32f91
Author: Christopher Baines <mail@cbaines.net>
AuthorDate: Sat Jun 25 18:14:07 2022 +0100

    guix: inferior: Fix the behaviour of open-inferior #:error-port.
    
    I'm looking at this as the Guix Data Service uses this behaviour to record 
and
    display logs from inferior processes.
    
    * guix/inferior.scm (open-bidirectional-pipe): Call dup2 for file descriptor
    2, passing either the file number for the current error port, or a file
    descriptor for /dev/null.
    * tests/inferior.scm ("#:error-port stderr", "#:error-port pipe"): Add two 
new
    tests that cover some of the #:error-port behaviour.
---
 guix/inferior.scm  | 12 +++++++++---
 tests/inferior.scm | 39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/guix/inferior.scm b/guix/inferior.scm
index 54200b75e4..20a86bbfda 100644
--- a/guix/inferior.scm
+++ b/guix/inferior.scm
@@ -156,12 +156,18 @@ custom binary port)."
             (close-port parent)
             (close-fdes 0)
             (close-fdes 1)
+            (close-fdes 2)
             (dup2 (fileno child) 0)
             (dup2 (fileno child) 1)
             ;; Mimic 'open-pipe*'.
-            (unless (file-port? (current-error-port))
-              (close-fdes 2)
-              (dup2 (open-fdes "/dev/null" O_WRONLY) 2))
+            (if (file-port? (current-error-port))
+                (let ((error-port-fileno
+                       (fileno (current-error-port))))
+                  (unless (eq? error-port-fileno 2)
+                    (dup2 error-port-fileno
+                          2)))
+                (dup2 (open-fdes "/dev/null" O_WRONLY)
+                      2))
             (apply execlp command command args))
           (lambda ()
             (primitive-_exit 127))))
diff --git a/tests/inferior.scm b/tests/inferior.scm
index 56b2fcb7bc..963d405e33 100644
--- a/tests/inferior.scm
+++ b/tests/inferior.scm
@@ -30,7 +30,8 @@
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-34)
   #:use-module (srfi srfi-64)
-  #:use-module (ice-9 match))
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 rdelim))
 
 (define %top-srcdir
   (dirname (search-path %load-path "guix.scm")))
@@ -315,4 +316,40 @@
     (close-inferior inferior)
     (map manifest-entry->list (manifest-entries manifest))))
 
+(test-equal "#:error-port stderr"
+  42
+  ;; There's a special case in open-bidirectional-pipe for
+  ;; (current-error-port) being stderr, so this test just checks that
+  ;; open-inferior doesn't raise an exception
+  (let ((inferior (open-inferior %top-builddir
+                                 #:command "scripts/guix"
+                                 #:error-port (current-error-port))))
+    (and (inferior? inferior)
+         (inferior-eval '(display "test" (current-error-port)) inferior)
+         (let ((result (inferior-eval '(apply * '(6 7)) inferior)))
+           (close-inferior inferior)
+           result))))
+
+(test-equal "#:error-port pipe"
+  "42"
+  (match (pipe)
+    ((port-to-read-from . port-to-write-to)
+
+     (setvbuf port-to-read-from 'line)
+     (setvbuf port-to-write-to 'line)
+
+     (let ((inferior (open-inferior %top-builddir
+                                    #:command "scripts/guix"
+                                    #:error-port port-to-write-to)))
+       (and (inferior? inferior)
+            (begin
+              (inferior-eval '(display "42\n" (current-error-port)) inferior)
+
+              (let loop ((line (read-line port-to-read-from)))
+                (if (string=? line "42")
+                    (begin
+                      (close-inferior inferior)
+                      line)
+                    (loop (read-line port-to-read-from))))))))))
+
 (test-end "inferior")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]