From 4309bc8668d38e461b1b1533404c84fa0033532d Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Sat, 16 May 2026 12:25:15 +0200 Subject: [PATCH 1/3] chore: update csproj to have consistent settings --- src/process.dummy.app/Geekeey.Process.Dummy.App.csproj | 3 ++- src/process/Geekeey.Process.csproj | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/process.dummy.app/Geekeey.Process.Dummy.App.csproj b/src/process.dummy.app/Geekeey.Process.Dummy.App.csproj index a8234c4..f9df4fa 100644 --- a/src/process.dummy.app/Geekeey.Process.Dummy.App.csproj +++ b/src/process.dummy.app/Geekeey.Process.Dummy.App.csproj @@ -13,4 +13,5 @@ - + + \ No newline at end of file diff --git a/src/process/Geekeey.Process.csproj b/src/process/Geekeey.Process.csproj index ef1e89d..3866467 100644 --- a/src/process/Geekeey.Process.csproj +++ b/src/process/Geekeey.Process.csproj @@ -13,7 +13,7 @@ - + -- 2.52.0 From dc607c2653a9428dd51bb3d3874bb9945d82ec0d Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Sat, 16 May 2026 12:25:28 +0200 Subject: [PATCH 2/3] chore: update package-readme.md --- src/process/package-readme.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/process/package-readme.md b/src/process/package-readme.md index dbb26d9..9172486 100644 --- a/src/process/package-readme.md +++ b/src/process/package-readme.md @@ -1,9 +1,29 @@ Process is a library for interacting with external command-line interfaces. It provides a convenient model for launching processes, redirecting input and output streams, awaiting completion, handling cancellation, and more. -## Usage +## Features -### Execute a command and capturing its output: +- **Input and Output redirection:** flexible piping model, that allows to redirect the process's streams. +- **Immutability:** The `Command` object is immutable, ensuring thread safely and allowing sharing of a base + configuration. + +## Getting Started + +### Install the NuGet package: + +```shell +dotnet add package Geekeey.Request +``` + +You may need to add our NuGet feed to your nuget.config this can be done by running the following command: + +```shell +dotnet nuget add source -n geekeey https://code.geekeey.de/api/packages/geekeey/nuget/index.json +``` + +### Usage + +#### Execute a command and capturing its output: ```csharp public static async Task Main() @@ -16,7 +36,7 @@ public static async Task Main() } ``` -### Execute a command and redirect its output to another command: +#### Execute a command and redirect its output to another command: ```csharp public static Task Main() @@ -27,7 +47,7 @@ public static Task Main() } ``` -### Execute a command with cancellation support: +#### Execute a command with cancellation support: ```csharp public static async Task Main() @@ -48,4 +68,4 @@ public static async Task Main() var result = await app; return 0; } -``` \ No newline at end of file +``` -- 2.52.0 From a6f1140b1f114184a82bf1742d3c3096f1a4424c Mon Sep 17 00:00:00 2001 From: Louis Seubert Date: Sat, 16 May 2026 12:25:38 +0200 Subject: [PATCH 3/3] chore: update insert_final_newline setting --- .editorconfig | 2 +- src/process.dummy.app/Output.cs | 2 +- src/process.dummy.app/OutputTarget.cs | 2 +- src/process.dummy.app/Program.cs | 2 +- src/process.dummy.app/_commands/EchoCommand.cs | 2 +- src/process.dummy.app/_commands/EchoStdinCommand.cs | 2 +- src/process.dummy.app/_commands/EnvironmentCommand.cs | 2 +- src/process.dummy.app/_commands/ExitCommand.cs | 2 +- src/process.dummy.app/_commands/GenerateBlobCommand.cs | 2 +- src/process.dummy.app/_commands/GenerateClobCommand.cs | 2 +- src/process.dummy.app/_commands/LengthCommand.cs | 2 +- src/process.dummy.app/_commands/SleepCommand.cs | 2 +- src/process.dummy.app/_commands/WorkingDirectoryCommand.cs | 2 +- src/process.tests/CancellationTests.cs | 2 +- src/process.tests/CommandTests.cs | 2 +- src/process.tests/ExecuteTests.cs | 2 +- src/process.tests/LineBreakTests.cs | 2 +- src/process.tests/PathResolutionTests.cs | 2 +- src/process.tests/PipingTests.cs | 2 +- src/process.tests/ValidationTests.cs | 2 +- src/process.tests/_fixture/PlatformAttribute.cs | 2 +- src/process.tests/_fixture/ProcessTree.cs | 2 +- src/process.tests/_fixture/TestEnvironment.cs | 2 +- src/process.tests/_fixture/TestTempDirectory.cs | 2 +- src/process/ArgumentsBuilder.cs | 2 +- src/process/Buffered/BufferedCommandExtensions.cs | 2 +- src/process/Buffered/BufferedCommandResult.cs | 2 +- src/process/Command.Builder.cs | 2 +- src/process/Command.Execute.cs | 2 +- src/process/Command.Piping.cs | 2 +- src/process/Command.cs | 2 +- src/process/CommandExecutionException.cs | 2 +- src/process/CommandResult.cs | 2 +- src/process/CommandTask.cs | 2 +- src/process/EnvironmentVariablesBuilder.cs | 2 +- src/process/MemoryBufferStream.cs | 2 +- src/process/PipeSource.cs | 2 +- src/process/PipeTarget.cs | 2 +- src/process/Process.Posix.cs | 2 +- src/process/Process.Windows.cs | 2 +- src/process/Process.cs | 2 +- src/process/ValidationMode.cs | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.editorconfig b/.editorconfig index ed9d022..19e73ae 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ indent_style = tab indent_size = 4 tab_width = 4 end_of_line = lf -insert_final_newline = false +insert_final_newline = true trim_trailing_whitespace = true max_line_length = 120 diff --git a/src/process.dummy.app/Output.cs b/src/process.dummy.app/Output.cs index 554cafa..04fe036 100644 --- a/src/process.dummy.app/Output.cs +++ b/src/process.dummy.app/Output.cs @@ -22,4 +22,4 @@ internal sealed class Output : IDisposable Stderr.Dispose(); Stdin.Dispose(); } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/OutputTarget.cs b/src/process.dummy.app/OutputTarget.cs index 35c7ddf..279a8f0 100644 --- a/src/process.dummy.app/OutputTarget.cs +++ b/src/process.dummy.app/OutputTarget.cs @@ -23,4 +23,4 @@ internal static class OutputTargetExtensions yield return output.Stderr; } } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/Program.cs b/src/process.dummy.app/Program.cs index b207174..bd73c06 100644 --- a/src/process.dummy.app/Program.cs +++ b/src/process.dummy.app/Program.cs @@ -49,4 +49,4 @@ public static class Program cts.Cancel(); } } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/EchoCommand.cs b/src/process.dummy.app/_commands/EchoCommand.cs index a6ea50a..3b7371a 100644 --- a/src/process.dummy.app/_commands/EchoCommand.cs +++ b/src/process.dummy.app/_commands/EchoCommand.cs @@ -28,4 +28,4 @@ internal sealed class EchoCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/EchoStdinCommand.cs b/src/process.dummy.app/_commands/EchoStdinCommand.cs index f9ea769..6162829 100644 --- a/src/process.dummy.app/_commands/EchoStdinCommand.cs +++ b/src/process.dummy.app/_commands/EchoStdinCommand.cs @@ -43,4 +43,4 @@ internal sealed class EchoStdinCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/EnvironmentCommand.cs b/src/process.dummy.app/_commands/EnvironmentCommand.cs index 031cc42..b7a2bb1 100644 --- a/src/process.dummy.app/_commands/EnvironmentCommand.cs +++ b/src/process.dummy.app/_commands/EnvironmentCommand.cs @@ -31,4 +31,4 @@ internal sealed class EnvironmentCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/ExitCommand.cs b/src/process.dummy.app/_commands/ExitCommand.cs index 60f5fd0..e7129d4 100644 --- a/src/process.dummy.app/_commands/ExitCommand.cs +++ b/src/process.dummy.app/_commands/ExitCommand.cs @@ -20,4 +20,4 @@ internal sealed class ExitCommand : Command await output.Stderr.WriteLineAsync($"Exit code set to {code}"); return code; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/GenerateBlobCommand.cs b/src/process.dummy.app/_commands/GenerateBlobCommand.cs index b078a27..03b0066 100644 --- a/src/process.dummy.app/_commands/GenerateBlobCommand.cs +++ b/src/process.dummy.app/_commands/GenerateBlobCommand.cs @@ -43,4 +43,4 @@ internal sealed class GenerateBlobCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/GenerateClobCommand.cs b/src/process.dummy.app/_commands/GenerateClobCommand.cs index 066a538..9ca6c8e 100644 --- a/src/process.dummy.app/_commands/GenerateClobCommand.cs +++ b/src/process.dummy.app/_commands/GenerateClobCommand.cs @@ -44,4 +44,4 @@ internal sealed class GenerateClobCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/LengthCommand.cs b/src/process.dummy.app/_commands/LengthCommand.cs index c3e883f..702058b 100644 --- a/src/process.dummy.app/_commands/LengthCommand.cs +++ b/src/process.dummy.app/_commands/LengthCommand.cs @@ -42,4 +42,4 @@ internal sealed class LengthCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/SleepCommand.cs b/src/process.dummy.app/_commands/SleepCommand.cs index 0c4448b..68a0e58 100644 --- a/src/process.dummy.app/_commands/SleepCommand.cs +++ b/src/process.dummy.app/_commands/SleepCommand.cs @@ -34,4 +34,4 @@ internal sealed class SleepCommand : Command await output.Stdout.FlushAsync(CancellationToken.None); return 0; } -} \ No newline at end of file +} diff --git a/src/process.dummy.app/_commands/WorkingDirectoryCommand.cs b/src/process.dummy.app/_commands/WorkingDirectoryCommand.cs index 1e65131..6c08eb3 100644 --- a/src/process.dummy.app/_commands/WorkingDirectoryCommand.cs +++ b/src/process.dummy.app/_commands/WorkingDirectoryCommand.cs @@ -24,4 +24,4 @@ internal sealed class WorkingDirectoryCommand : Command return 0; } -} \ No newline at end of file +} diff --git a/src/process.tests/CancellationTests.cs b/src/process.tests/CancellationTests.cs index 9bba19a..a663831 100644 --- a/src/process.tests/CancellationTests.cs +++ b/src/process.tests/CancellationTests.cs @@ -178,4 +178,4 @@ internal sealed class CancellationTests await Assert.That(stdout.ToString()).Contains("Done."); } } -} \ No newline at end of file +} diff --git a/src/process.tests/CommandTests.cs b/src/process.tests/CommandTests.cs index 29693f3..0fea02e 100644 --- a/src/process.tests/CommandTests.cs +++ b/src/process.tests/CommandTests.cs @@ -270,4 +270,4 @@ internal sealed class CommandTests await Assert.That(cmd.StandardErrorPipe).IsNotEqualTo(pipeTarget); } } -} \ No newline at end of file +} diff --git a/src/process.tests/ExecuteTests.cs b/src/process.tests/ExecuteTests.cs index 88614d2..b0743ad 100644 --- a/src/process.tests/ExecuteTests.cs +++ b/src/process.tests/ExecuteTests.cs @@ -136,4 +136,4 @@ internal sealed class ExecuteTests await Assert.That(lines).Contains("keep"); await Assert.That(lines).Contains("overwritten"); } -} \ No newline at end of file +} diff --git a/src/process.tests/LineBreakTests.cs b/src/process.tests/LineBreakTests.cs index efe5c19..da864e2 100644 --- a/src/process.tests/LineBreakTests.cs +++ b/src/process.tests/LineBreakTests.cs @@ -78,4 +78,4 @@ internal sealed class LineBreakTests // Assert await Assert.That(stdOutLines).IsEquivalentTo(["Foo", "", "Bar", "", "Baz"]); } -} \ No newline at end of file +} diff --git a/src/process.tests/PathResolutionTests.cs b/src/process.tests/PathResolutionTests.cs index c2014db..f5a0fbe 100644 --- a/src/process.tests/PathResolutionTests.cs +++ b/src/process.tests/PathResolutionTests.cs @@ -47,4 +47,4 @@ internal sealed class PathResolutionTests await Assert.That(result.StandardOutput.Trim()).IsEqualTo("hi"); } } -} \ No newline at end of file +} diff --git a/src/process.tests/PipingTests.cs b/src/process.tests/PipingTests.cs index b24884c..a184743 100644 --- a/src/process.tests/PipingTests.cs +++ b/src/process.tests/PipingTests.cs @@ -533,4 +533,4 @@ internal sealed class PipingTests await Assert.That(stream3.ToArray()).IsEquivalentTo(stream4.ToArray()); } } -} \ No newline at end of file +} diff --git a/src/process.tests/ValidationTests.cs b/src/process.tests/ValidationTests.cs index c42ffc4..9f14080 100644 --- a/src/process.tests/ValidationTests.cs +++ b/src/process.tests/ValidationTests.cs @@ -55,4 +55,4 @@ internal sealed class ValidationTests await Assert.That(result.IsSuccess).IsFalse(); } } -} \ No newline at end of file +} diff --git a/src/process.tests/_fixture/PlatformAttribute.cs b/src/process.tests/_fixture/PlatformAttribute.cs index 3a1f7d0..8c323e6 100644 --- a/src/process.tests/_fixture/PlatformAttribute.cs +++ b/src/process.tests/_fixture/PlatformAttribute.cs @@ -32,4 +32,4 @@ internal sealed class PlatformAttribute : SkipAttribute { return Task.FromResult(!_os.Any(OperatingSystem.IsOSPlatform)); } -} \ No newline at end of file +} diff --git a/src/process.tests/_fixture/ProcessTree.cs b/src/process.tests/_fixture/ProcessTree.cs index cee0528..c4f2a05 100644 --- a/src/process.tests/_fixture/ProcessTree.cs +++ b/src/process.tests/_fixture/ProcessTree.cs @@ -18,4 +18,4 @@ internal static class ProcessTree return true; } } -} \ No newline at end of file +} diff --git a/src/process.tests/_fixture/TestEnvironment.cs b/src/process.tests/_fixture/TestEnvironment.cs index f68c2ad..0df1d3d 100644 --- a/src/process.tests/_fixture/TestEnvironment.cs +++ b/src/process.tests/_fixture/TestEnvironment.cs @@ -29,4 +29,4 @@ internal sealed class TestEnvironment : IDisposable { _action(); } -} \ No newline at end of file +} diff --git a/src/process.tests/_fixture/TestTempDirectory.cs b/src/process.tests/_fixture/TestTempDirectory.cs index 44f6c27..95947d0 100644 --- a/src/process.tests/_fixture/TestTempDirectory.cs +++ b/src/process.tests/_fixture/TestTempDirectory.cs @@ -31,4 +31,4 @@ internal sealed class TestTempDirectory : IDisposable } catch (DirectoryNotFoundException) { } } -} \ No newline at end of file +} diff --git a/src/process/ArgumentsBuilder.cs b/src/process/ArgumentsBuilder.cs index 50c3623..4d4fa48 100644 --- a/src/process/ArgumentsBuilder.cs +++ b/src/process/ArgumentsBuilder.cs @@ -150,4 +150,4 @@ public partial class ArgumentsBuilder return buffer.ToString(); } -} \ No newline at end of file +} diff --git a/src/process/Buffered/BufferedCommandExtensions.cs b/src/process/Buffered/BufferedCommandExtensions.cs index 33b899d..6f79f05 100644 --- a/src/process/Buffered/BufferedCommandExtensions.cs +++ b/src/process/Buffered/BufferedCommandExtensions.cs @@ -88,4 +88,4 @@ public static class BufferedCommandExtensions return command.ExecuteBufferedAsync(Console.OutputEncoding, cancellationToken); } } -} \ No newline at end of file +} diff --git a/src/process/Buffered/BufferedCommandResult.cs b/src/process/Buffered/BufferedCommandResult.cs index 4d90700..f94e1f6 100644 --- a/src/process/Buffered/BufferedCommandResult.cs +++ b/src/process/Buffered/BufferedCommandResult.cs @@ -48,4 +48,4 @@ public partial class BufferedCommandResult { return result.StandardOutput; } -} \ No newline at end of file +} diff --git a/src/process/Command.Builder.cs b/src/process/Command.Builder.cs index 9e98631..f183887 100644 --- a/src/process/Command.Builder.cs +++ b/src/process/Command.Builder.cs @@ -126,4 +126,4 @@ public sealed partial class Command return new Command(TargetFilePath, Arguments, WorkingDirPath, Environment, Validation, StandardInputPipe, StandardOutputPipe, target); } -} \ No newline at end of file +} diff --git a/src/process/Command.Execute.cs b/src/process/Command.Execute.cs index 826b210..df140aa 100644 --- a/src/process/Command.Execute.cs +++ b/src/process/Command.Execute.cs @@ -228,4 +228,4 @@ public sealed partial class Command } } } -} \ No newline at end of file +} diff --git a/src/process/Command.Piping.cs b/src/process/Command.Piping.cs index 438dfea..b1a14f2 100644 --- a/src/process/Command.Piping.cs +++ b/src/process/Command.Piping.cs @@ -196,4 +196,4 @@ public sealed partial class Command { return PipeSource.FromCommand(source) | target; } -} \ No newline at end of file +} diff --git a/src/process/Command.cs b/src/process/Command.cs index ad6c0d8..71d437f 100644 --- a/src/process/Command.cs +++ b/src/process/Command.cs @@ -81,4 +81,4 @@ public sealed partial class Command { return $"{TargetFilePath} {Arguments}"; } -} \ No newline at end of file +} diff --git a/src/process/CommandExecutionException.cs b/src/process/CommandExecutionException.cs index 5615efb..ce4843a 100644 --- a/src/process/CommandExecutionException.cs +++ b/src/process/CommandExecutionException.cs @@ -27,4 +27,4 @@ public class CommandExecutionException : Exception /// Exit code returned by the process. /// public int ExitCode { get; } -} \ No newline at end of file +} diff --git a/src/process/CommandResult.cs b/src/process/CommandResult.cs index 433e62e..cd7d1c7 100644 --- a/src/process/CommandResult.cs +++ b/src/process/CommandResult.cs @@ -61,4 +61,4 @@ public partial class CommandResult { return result.IsSuccess; } -} \ No newline at end of file +} diff --git a/src/process/CommandTask.cs b/src/process/CommandTask.cs index c5a22e9..a6c3f5c 100644 --- a/src/process/CommandTask.cs +++ b/src/process/CommandTask.cs @@ -91,4 +91,4 @@ public sealed partial class CommandTask { return commandTask.Task; } -} \ No newline at end of file +} diff --git a/src/process/EnvironmentVariablesBuilder.cs b/src/process/EnvironmentVariablesBuilder.cs index 6bc95f2..0dd3add 100644 --- a/src/process/EnvironmentVariablesBuilder.cs +++ b/src/process/EnvironmentVariablesBuilder.cs @@ -47,4 +47,4 @@ public sealed class EnvironmentVariablesBuilder { return new Dictionary(_vars, _vars.Comparer); } -} \ No newline at end of file +} diff --git a/src/process/MemoryBufferStream.cs b/src/process/MemoryBufferStream.cs index 342fb0d..66f7e79 100644 --- a/src/process/MemoryBufferStream.cs +++ b/src/process/MemoryBufferStream.cs @@ -131,4 +131,4 @@ internal sealed class MemoryBufferStream : Stream { throw new NotSupportedException(); } -} \ No newline at end of file +} diff --git a/src/process/PipeSource.cs b/src/process/PipeSource.cs index d19fba8..ed221c5 100644 --- a/src/process/PipeSource.cs +++ b/src/process/PipeSource.cs @@ -121,4 +121,4 @@ public abstract partial class PipeSource return Create(async (destination, cancellationToken) => await command.WithStandardOutputPipe(PipeTarget.ToStream(destination)).ExecuteAsync(cancellationToken)); } -} \ No newline at end of file +} diff --git a/src/process/PipeTarget.cs b/src/process/PipeTarget.cs index eb68f51..37b6813 100644 --- a/src/process/PipeTarget.cs +++ b/src/process/PipeTarget.cs @@ -311,4 +311,4 @@ public partial class PipeTarget } } } -} \ No newline at end of file +} diff --git a/src/process/Process.Posix.cs b/src/process/Process.Posix.cs index 816aa34..95c2b28 100644 --- a/src/process/Process.Posix.cs +++ b/src/process/Process.Posix.cs @@ -43,4 +43,4 @@ internal sealed partial class Process SIGALRM = 14, SIGTERM = 15, } -} \ No newline at end of file +} diff --git a/src/process/Process.Windows.cs b/src/process/Process.Windows.cs index 3013b44..236ea29 100644 --- a/src/process/Process.Windows.cs +++ b/src/process/Process.Windows.cs @@ -30,4 +30,4 @@ internal sealed partial class Process CTRL_LOGOFF_EVENT = 5, // SIGHUP CTRL_SHUTDOWN_EVENT = 6, // SIGTERM } -} \ No newline at end of file +} diff --git a/src/process/Process.cs b/src/process/Process.cs index a6256c1..6cf9b77 100644 --- a/src/process/Process.cs +++ b/src/process/Process.cs @@ -178,4 +178,4 @@ internal sealed partial class Process : IDisposable { _process.Dispose(); } -} \ No newline at end of file +} diff --git a/src/process/ValidationMode.cs b/src/process/ValidationMode.cs index 869f2e1..bfba466 100644 --- a/src/process/ValidationMode.cs +++ b/src/process/ValidationMode.cs @@ -18,4 +18,4 @@ public enum ValidationMode /// Ensure that the command returned a zero exit code. /// ZeroExitCode = 0b1, -} \ No newline at end of file +} -- 2.52.0