Hi Guix! I started looking into this problem and unfortunately it looks like it might be more complicated than I thought.
My initial thought was having two progress-reporters and selecting on based on a simple conditional if current-error-port was a tty or not. This would be in guix/scripts/substitute. Unfortunately, this might be a bit more challenging. Unlike the other scripts, guix/scripts/substitute is invoked by the daemon directly. Furthermore, it isn't passed a file descriptor to the invokers stderr. Instead, it goes through the build daemon. See nix/libstore/local-store.cc:LocalStore::getLineFromSubstituter. >From my testing calling istty? on that error port always returns #f, ergo the "simple" progress-reporter is always used and we lose the interactive progress bars. Testing this is also a pain as well because it involves changing the build daemon. In my experience the easiest way is: 1. Change the commit field for the guix package in package-management.scm to the commit you want to check 2. Update the url field for the guix package to "file:///path/to/guix/clone" 3. Forcefully disable authentication in guix/build-system/channel.scm 4. Generate an installer image via $ ./pre-inst-env guix system image gnu/system/install.scm --image-type=iso9660, then boot from that image and observe the output. So, that leaves two options that I can see: 1. The daemon stops capturing stderr from the substituter and merely passes it the daemon's stderr. 1. Challenging to get right and this may have unforseen consequences. Two processes writing freely to the same output at once is a bad idea. 2. The daemon has a isatty? check and sets a flag for the build agent which is passed along to scripts/substitute. -- Take it easy, Richard Sent Making my computer weirder one commit at a time.