Customizing the environment

The type returned by the Process constructor also implements the ProcessConfiguration trait, adding three methods that can be used to customize the working environment of the process to be started:

Working directory

The in method can be used to customize the working directory:

import io.github.vigoo.prox.path._

val dir = home / "tmp"
// dir: java.nio.file.Path = /home/runner/tmp
val proc1 = Process("ls") in dir 
// proc1: Process.ProcessImpl = ProcessImpl(
//   command = "ls",
//   arguments = List(),
//   workingDirectory = Some(value = /home/runner/tmp),
//   environmentVariables = Map(),
//   removedEnvironmentVariables = Set(),
//   outputRedirection = StdOut(),
//   runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@2eb4bf64,
//   errorRedirection = StdOut(),
//   runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@497fbb3f,
//   inputRedirection = StdIn()
// )

Not that dir has the type java.nio.file.Path, and the home / tmp syntax is just a thin syntax extension to produce such values.

Adding environment variables

The with method can be used to add environment variables to the process in the following way:

val proc2 = Process("echo", List("$TEST")) `with` ("TEST" -> "Hello world")
// proc2: Process.ProcessImpl = ProcessImpl(
//   command = "echo",
//   arguments = List("$TEST"),
//   workingDirectory = None,
//   environmentVariables = Map("TEST" -> "Hello world"),
//   removedEnvironmentVariables = Set(),
//   outputRedirection = StdOut(),
//   runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@5171baaf,
//   errorRedirection = StdOut(),
//   runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1d4e323c,
//   inputRedirection = StdIn()
// )

Removing environment variables

The subprocess inherits the parent process environment, so it may be necessary to remove some already defined environment variables with the without method:

val proc3 = Process("echo" , List("$PATH")) `without` "PATH"
// proc3: Process.ProcessImpl = ProcessImpl(
//   command = "echo",
//   arguments = List("$PATH"),
//   workingDirectory = None,
//   environmentVariables = Map(),
//   removedEnvironmentVariables = Set("PATH"),
//   outputRedirection = StdOut(),
//   runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@7cbb3028,
//   errorRedirection = StdOut(),
//   runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@3e7b00a1,
//   inputRedirection = StdIn()
// )

Writing reusable functions

Because these methods are part of the ProcessConfiguration capability, writing reusable functions require us to define a polymorphic function that requires this capability:

import java.nio.file.Path

def withHome[P <: ProcessLike with ProcessLikeConfiguration](home: Path, proc: P): P#Self = 
  proc `with` ("HOME" -> home.toString)

Then we can use it on any kind of process or process group (read about redirection to understand why there are multiple concrete process types):

val proc4 = Process("echo", List("$HOME"))
// proc4: Process.ProcessImpl = ProcessImpl(
//   command = "echo",
//   arguments = List("$HOME"),
//   workingDirectory = None,
//   environmentVariables = Map(),
//   removedEnvironmentVariables = Set(),
//   outputRedirection = StdOut(),
//   runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@62037103,
//   errorRedirection = StdOut(),
//   runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@e3070ad,
//   inputRedirection = StdIn()
// )
val proc5 = withHome(home, proc4)
// proc5: Process.ProcessImpl#Self = ProcessImpl(
//   command = "echo",
//   arguments = List("$HOME"),
//   workingDirectory = None,
//   environmentVariables = Map("HOME" -> "/home/runner"),
//   removedEnvironmentVariables = Set(),
//   outputRedirection = StdOut(),
//   runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@62037103,
//   errorRedirection = StdOut(),
//   runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@e3070ad,
//   inputRedirection = StdIn()
// )

val group1 = Process("grep", List("ERROR")) | Process("sort")
// group1: ProcessGroup.ProcessGroupImpl = ProcessGroupImpl(
//   firstProcess = ProcessImplO(
//     command = "grep",
//     arguments = List("ERROR"),
//     workingDirectory = None,
//     environmentVariables = Map(),
//     removedEnvironmentVariables = Set(),
//     outputRedirection = OutputStreamThroughPipe(
//       pipe = io.github.vigoo.prox.ProxFS2$$Lambda$10722/0x00000008026f6840@2baf2b33,
//       runner = io.github.vigoo.prox.SyntaxModule$ProcessPiping$$Lambda$10723/0x00000008026f4840@4db758ef,
//       chunkSize = 8192
//     ),
//     runOutputStream = io.github.vigoo.prox.ProcessModule$Process$ProcessImpl$$Lambda$10724/0x00000008026f7840@3445b333,
//     errorRedirection = StdOut(),
//     runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@39fd180e,
//     inputRedirection = StdIn()
//   ),
//   innerProcesses = List(),
//   lastProcess = ProcessImpl(
//     command = "sort",
//     arguments = List(),
//     workingDirectory = None,
//     environmentVariables = Map(),
//     removedEnvironmentVariables = Set(),
//     outputRedirection = StdOut(),
//     runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
//     errorRedirection = StdOut(),
//     runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
//     inputRedirection = StdIn()
//   ),
//   originalProcesses = List(
//     ProcessImpl(
//       command = "sort",
//       arguments = List(),
//       workingDirectory = None,
//       environmentVariables = Map(),
//       removedEnvironmentVariables = Set(),
//       outputRedirection = StdOut(),
//       runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
//       errorRedirection = StdOut(),
//       runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// ...
val group2 = withHome(home, group1)
// group2: ProcessGroup.ProcessGroupImpl#Self = ProcessGroupImpl(
//   firstProcess = ProcessImplO(
//     command = "grep",
//     arguments = List("ERROR"),
//     workingDirectory = None,
//     environmentVariables = Map("HOME" -> "/home/runner"),
//     removedEnvironmentVariables = Set(),
//     outputRedirection = OutputStreamThroughPipe(
//       pipe = io.github.vigoo.prox.ProxFS2$$Lambda$10722/0x00000008026f6840@2baf2b33,
//       runner = io.github.vigoo.prox.SyntaxModule$ProcessPiping$$Lambda$10723/0x00000008026f4840@4db758ef,
//       chunkSize = 8192
//     ),
//     runOutputStream = io.github.vigoo.prox.ProcessModule$Process$ProcessImpl$$Lambda$10724/0x00000008026f7840@3445b333,
//     errorRedirection = StdOut(),
//     runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@39fd180e,
//     inputRedirection = StdIn()
//   ),
//   innerProcesses = List(),
//   lastProcess = ProcessImpl(
//     command = "sort",
//     arguments = List(),
//     workingDirectory = None,
//     environmentVariables = Map("HOME" -> "/home/runner"),
//     removedEnvironmentVariables = Set(),
//     outputRedirection = StdOut(),
//     runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
//     errorRedirection = StdOut(),
//     runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
//     inputRedirection = StdIn()
//   ),
//   originalProcesses = List(
//     ProcessImpl(
//       command = "sort",
//       arguments = List(),
//       workingDirectory = None,
//       environmentVariables = Map(),
//       removedEnvironmentVariables = Set(),
//       outputRedirection = StdOut(),
//       runOutputStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10720/0x00000008026f7040@6b595ab1,
//       errorRedirection = StdOut(),
//       runErrorStream = io.github.vigoo.prox.ProcessModule$Process$$$Lambda$10721/0x0000000802701040@1cde0715,
// ...