Skip to content

Commit 2f8cf55

Browse files
committed
#368: Added DoNotFailOnExitCodes to allow tolerating specific non-zero exit codes
1 parent 267b4cb commit 2f8cf55

4 files changed

Lines changed: 39 additions & 1 deletion

File tree

src/FlubuCore.WebApi.Tests/FlubuCore.WebApi.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<ItemGroup>
3030
<ProjectReference Include="..\FlubuCore.WebApi.Client\FlubuCore.WebApi.Client.csproj" />
3131
<ProjectReference Include="..\FlubuCore.WebApi.Model\FlubuCore.WebApi.Model.csproj" />
32+
<ProjectReference Include="..\FlubuCore.WebApi\FlubuCore.WebApi.csproj" />
3233
</ItemGroup>
3334

3435
<ItemGroup>

src/FlubuCore/Tasks/Process/ExternalProcessTaskBase.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public abstract class ExternalProcessTaskBase<TResult, TTask> : TaskBase<TResult
1919

2020
private char _additionalOptionKeyValueSeperator;
2121

22+
private int[] _doNotFailOnExitCodes;
23+
2224
private IRunProgramTask _task;
2325

2426
protected ExternalProcessTaskBase()
@@ -242,6 +244,18 @@ public TTask CaptureErrorOutput()
242244
return this as TTask;
243245
}
244246

247+
/// <summary>
248+
/// Specifies non-zero exit codes that should not cause the task to fail.
249+
/// By default any non-zero exit code fails the task.
250+
/// </summary>
251+
/// <param name="exitCodes">Exit codes that indicate success.</param>
252+
/// <returns></returns>
253+
public TTask DoNotFailOnExitCodes(params int[] exitCodes)
254+
{
255+
_doNotFailOnExitCodes = exitCodes;
256+
return this as TTask;
257+
}
258+
245259
public TTask ChangeDefaultAdditionalOptionPrefix(string newPrefix)
246260
{
247261
AdditionalOptionPrefix = newPrefix;
@@ -292,6 +306,9 @@ protected override TResult DoExecute(ITaskContextInternal context)
292306
_task.WithArguments(arg.arg, arg.maskArg);
293307
}
294308

309+
if (_doNotFailOnExitCodes != null)
310+
_task.DoNotFailOnExitCodes(_doNotFailOnExitCodes);
311+
295312
var result = _task
296313
.ChangeDefaultAdditionalOptionPrefix(AdditionalOptionPrefix)
297314
.AddPrefixToAdditionalOptionKey(_prefixToAdditionalOptionKeyFunc)

src/FlubuCore/Tasks/Process/IRunProgramTask.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,5 +71,13 @@ public interface IRunProgramTask : ITaskOfT<int, IRunProgramTask>, IExternalProc
7171
IRunProgramTask ChangeAdditionalOptionKeyValueSeperator(char newSeperator);
7272

7373
IRunProgramTask AddPrefixToAdditionalOptionKey(Func<string, string> action);
74+
75+
/// <summary>
76+
/// Specifies non-zero exit codes that should not cause the task to fail.
77+
/// By default any non-zero exit code fails the task.
78+
/// </summary>
79+
/// <param name="exitCodes">Exit codes that indicate success.</param>
80+
/// <returns></returns>
81+
IRunProgramTask DoNotFailOnExitCodes(params int[] exitCodes);
7482
}
7583
}

src/FlubuCore/Tasks/Process/RunProgramTask.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class RunProgramTask : TaskBase<int, IRunProgramTask>, IRunProgramTask
4040

4141
private Func<string, string> _addPrefixToAdditionalOptionKey = null;
4242

43+
private HashSet<int> _doNotFailOnExitCodes = null;
44+
4345
/// <inheritdoc />
4446
public RunProgramTask(ICommandFactory commandFactory, string programToExecute)
4547
{
@@ -200,6 +202,14 @@ public IRunProgramTask AddPrefixToAdditionalOptionKey(Func<string, string> actio
200202
return this;
201203
}
202204

205+
/// <inheritdoc />
206+
public IRunProgramTask DoNotFailOnExitCodes(params int[] exitCodes)
207+
{
208+
_doNotFailOnExitCodes = new HashSet<int>(exitCodes);
209+
_doNotFailOnExitCodes.Add(0);
210+
return this;
211+
}
212+
203213
public IRunProgramTask Executable(string executableFullFilePath)
204214
{
205215
_programToExecute = executableFullFilePath;
@@ -281,7 +291,9 @@ protected override int DoExecute(ITaskContextInternal context)
281291
int res = command.Execute()
282292
.ExitCode;
283293

284-
if (!DoNotFail && res != 0)
294+
bool isSuccess = _doNotFailOnExitCodes != null ? _doNotFailOnExitCodes.Contains(res) : res == 0;
295+
296+
if (!DoNotFail && !isSuccess)
285297
context.Fail($"External program {cmd} failed with {res}.", res);
286298

287299
return res;

0 commit comments

Comments
 (0)