Skip to content

Commit d495524

Browse files
committed
Make sure batch/bash scripts are platform-aware. Make bash default for unit platforms
1 parent 7a1270f commit d495524

File tree

6 files changed

+222
-83
lines changed

6 files changed

+222
-83
lines changed

src/LocalAppVeyor.Engine/Configuration/Reader/Internal/Model/InternalScriptLine.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using YamlDotNet.Serialization;
1+
using LocalAppVeyor.Engine.Internal;
2+
using YamlDotNet.Serialization;
23

34
namespace LocalAppVeyor.Engine.Configuration.Reader.Internal.Model
45
{
@@ -15,6 +16,14 @@ internal class InternalScriptLine
1516

1617
public static implicit operator InternalScriptLine(string scriptLine)
1718
{
19+
if (Platform.IsUnix)
20+
{
21+
return new InternalScriptLine
22+
{
23+
Bash = scriptLine
24+
};
25+
}
26+
1827
return new InternalScriptLine
1928
{
2029
Batch = scriptLine
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.IO;
2+
3+
namespace LocalAppVeyor.Engine.Internal
4+
{
5+
public static class Platform
6+
{
7+
public static bool IsWindow { get; }
8+
9+
public static bool IsUnix { get; }
10+
11+
static Platform()
12+
{
13+
IsUnix = Path.DirectorySeparatorChar == '/';
14+
IsWindow = !IsUnix;
15+
}
16+
}
17+
}

src/LocalAppVeyor.Engine/Internal/Steps/ScriptBlockExecuterStep.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ public bool Execute(ExecutionContext executionContext)
3232
continue;
3333
}
3434

35+
if (scriptLine.ScriptType == ScriptType.Bash && Platform.IsWindow)
36+
{
37+
executionContext.Outputter.Write("Script line skipped - Bash (sh) scripts cannot be executed in Windows platforms.");
38+
continue;
39+
}
40+
41+
if (scriptLine.ScriptType == ScriptType.Batch && Platform.IsUnix)
42+
{
43+
executionContext.Outputter.Write("Script line skipped - Batch (cmd) scripts cannot be executed in Unix platforms.");
44+
continue;
45+
}
46+
3547
var status = true;
3648

3749
switch (scriptLine.ScriptType)
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using LocalAppVeyor.Engine.Configuration;
2+
using LocalAppVeyor.Engine.Configuration.Reader;
3+
using LocalAppVeyor.Engine.UnitTests.TestUtilities;
4+
using Xunit;
5+
6+
namespace LocalAppVeyor.Engine.UnitTests.Configuration
7+
{
8+
public partial class BuildScriptTests
9+
{
10+
[UnixOnlyFact]
11+
public void Unix_ShouldReadBuildScriptAsAScriptBlockWithMultipleDifferentTypeScripts()
12+
{
13+
const string yaml = @"
14+
build_script:
15+
# by default, all script lines are interpreted as bash
16+
- echo This is bash
17+
# to run script as a PowerShell command prepend it with ps:
18+
- ps: Write-Host 'This is PowerShell'
19+
# bash commands start from cmd:
20+
- cmd: echo This is bash again
21+
- cmd: set MY_VAR=12345
22+
";
23+
24+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
25+
26+
Assert.Equal(4, conf.BuildScript.Count);
27+
Assert.Equal("echo This is bash", conf.BuildScript[0].Script);
28+
Assert.Equal(ScriptType.Bash, conf.BuildScript[0].ScriptType);
29+
Assert.Equal("Write-Host 'This is PowerShell'", conf.BuildScript[1].Script);
30+
Assert.Equal(ScriptType.PowerShell, conf.BuildScript[1].ScriptType);
31+
Assert.Equal("echo This is bash again", conf.BuildScript[2].Script);
32+
Assert.Equal(ScriptType.Batch, conf.BuildScript[2].ScriptType);
33+
Assert.Equal("set MY_VAR=12345", conf.BuildScript[3].Script);
34+
Assert.Equal(ScriptType.Batch, conf.BuildScript[3].ScriptType);
35+
}
36+
37+
[UnixOnlyFact]
38+
public void Unix_ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts()
39+
{
40+
const string yaml = @"
41+
build_script:
42+
- |-
43+
echo --------------------------------------------------------------------------------
44+
echo Build tinyformat
45+
mkdir build
46+
cd build
47+
cmake -G ""%COMPILER%"" ..
48+
cmake --build . --config %CONFIGURATION%
49+
";
50+
51+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
52+
53+
Assert.Single(conf.BuildScript);
54+
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
55+
"echo Build tinyformat\n" +
56+
"mkdir build\n" +
57+
"cd build\n" +
58+
"cmake -G \"%COMPILER%\" ..\n" +
59+
"cmake --build . --config %CONFIGURATION%",
60+
conf.BuildScript[0].Script);
61+
Assert.Equal(ScriptType.Bash, conf.BuildScript[0].ScriptType);
62+
}
63+
64+
[UnixOnlyFact]
65+
public void Unix_ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts_AlternativeBlockStyle()
66+
{
67+
const string yaml = @"
68+
build_script:
69+
- cmd: |-
70+
echo --------------------------------------------------------------------------------
71+
echo Build tinyformat
72+
mkdir build
73+
cd build
74+
cmake -G ""%COMPILER%"" ..
75+
cmake --build . --config %CONFIGURATION%
76+
";
77+
78+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
79+
80+
Assert.Single(conf.BuildScript);
81+
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
82+
"echo Build tinyformat\n" +
83+
"mkdir build\n" +
84+
"cd build\n" +
85+
"cmake -G \"%COMPILER%\" ..\n" +
86+
"cmake --build . --config %CONFIGURATION%",
87+
conf.BuildScript[0].Script);
88+
Assert.Equal(ScriptType.Bash, conf.BuildScript[0].ScriptType);
89+
}
90+
}
91+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using LocalAppVeyor.Engine.Configuration;
2+
using LocalAppVeyor.Engine.Configuration.Reader;
3+
using LocalAppVeyor.Engine.UnitTests.TestUtilities;
4+
using Xunit;
5+
6+
namespace LocalAppVeyor.Engine.UnitTests.Configuration
7+
{
8+
public partial class BuildScriptTests
9+
{
10+
[WindowsOnlyFact]
11+
public void Windows_ShouldReadBuildScriptAsAScriptBlockWithMultipleDifferentTypeScripts()
12+
{
13+
const string yaml = @"
14+
build_script:
15+
# by default, all script lines are interpreted as batch
16+
- echo This is batch
17+
# to run script as a PowerShell command prepend it with ps:
18+
- ps: Write-Host 'This is PowerShell'
19+
# batch commands start from cmd:
20+
- cmd: echo This is batch again
21+
- cmd: set MY_VAR=12345
22+
";
23+
24+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
25+
26+
Assert.Equal(4, conf.BuildScript.Count);
27+
Assert.Equal("echo This is batch", conf.BuildScript[0].Script);
28+
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
29+
Assert.Equal("Write-Host 'This is PowerShell'", conf.BuildScript[1].Script);
30+
Assert.Equal(ScriptType.PowerShell, conf.BuildScript[1].ScriptType);
31+
Assert.Equal("echo This is batch again", conf.BuildScript[2].Script);
32+
Assert.Equal(ScriptType.Batch, conf.BuildScript[2].ScriptType);
33+
Assert.Equal("set MY_VAR=12345", conf.BuildScript[3].Script);
34+
Assert.Equal(ScriptType.Batch, conf.BuildScript[3].ScriptType);
35+
}
36+
37+
[WindowsOnlyFact]
38+
public void Windows_ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts()
39+
{
40+
const string yaml = @"
41+
build_script:
42+
- |-
43+
echo --------------------------------------------------------------------------------
44+
echo Build tinyformat
45+
mkdir build
46+
cd build
47+
cmake -G ""%COMPILER%"" ..
48+
cmake --build . --config %CONFIGURATION%
49+
";
50+
51+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
52+
53+
Assert.Single(conf.BuildScript);
54+
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
55+
"echo Build tinyformat\n" +
56+
"mkdir build\n" +
57+
"cd build\n" +
58+
"cmake -G \"%COMPILER%\" ..\n" +
59+
"cmake --build . --config %CONFIGURATION%",
60+
conf.BuildScript[0].Script);
61+
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
62+
}
63+
64+
[WindowsOnlyFact]
65+
public void Windows_ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts_AlternativeBlockStyle()
66+
{
67+
const string yaml = @"
68+
build_script:
69+
- cmd: |-
70+
echo --------------------------------------------------------------------------------
71+
echo Build tinyformat
72+
mkdir build
73+
cd build
74+
cmake -G ""%COMPILER%"" ..
75+
cmake --build . --config %CONFIGURATION%
76+
";
77+
78+
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
79+
80+
Assert.Single(conf.BuildScript);
81+
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
82+
"echo Build tinyformat\n" +
83+
"mkdir build\n" +
84+
"cd build\n" +
85+
"cmake -G \"%COMPILER%\" ..\n" +
86+
"cmake --build . --config %CONFIGURATION%",
87+
conf.BuildScript[0].Script);
88+
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
89+
}
90+
}
91+
}

tests/LocalAppVeyor.Engine.UnitTests/Configuration/BuildScriptTests.cs

Lines changed: 1 addition & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -4,89 +4,8 @@
44

55
namespace LocalAppVeyor.Engine.UnitTests.Configuration
66
{
7-
public class BuildScriptTests
7+
public partial class BuildScriptTests
88
{
9-
[Fact]
10-
public void ShouldReadBuildScriptAsAScriptBlockWithMultipleDifferentTypeScripts()
11-
{
12-
const string yaml = @"
13-
build_script:
14-
# by default, all script lines are interpreted as batch
15-
- echo This is batch
16-
# to run script as a PowerShell command prepend it with ps:
17-
- ps: Write-Host 'This is PowerShell'
18-
# batch commands start from cmd:
19-
- cmd: echo This is batch again
20-
- cmd: set MY_VAR=12345
21-
";
22-
23-
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
24-
25-
Assert.Equal(4, conf.BuildScript.Count);
26-
Assert.Equal("echo This is batch", conf.BuildScript[0].Script);
27-
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
28-
Assert.Equal("Write-Host 'This is PowerShell'", conf.BuildScript[1].Script);
29-
Assert.Equal(ScriptType.PowerShell, conf.BuildScript[1].ScriptType);
30-
Assert.Equal("echo This is batch again", conf.BuildScript[2].Script);
31-
Assert.Equal(ScriptType.Batch, conf.BuildScript[2].ScriptType);
32-
Assert.Equal("set MY_VAR=12345", conf.BuildScript[3].Script);
33-
Assert.Equal(ScriptType.Batch, conf.BuildScript[3].ScriptType);
34-
}
35-
36-
[Fact]
37-
public void ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts()
38-
{
39-
const string yaml = @"
40-
build_script:
41-
- |-
42-
echo --------------------------------------------------------------------------------
43-
echo Build tinyformat
44-
mkdir build
45-
cd build
46-
cmake -G ""%COMPILER%"" ..
47-
cmake --build . --config %CONFIGURATION%
48-
";
49-
50-
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
51-
52-
Assert.Single(conf.BuildScript);
53-
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
54-
"echo Build tinyformat\n" +
55-
"mkdir build\n" +
56-
"cd build\n" +
57-
"cmake -G \"%COMPILER%\" ..\n" +
58-
"cmake --build . --config %CONFIGURATION%",
59-
conf.BuildScript[0].Script);
60-
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
61-
}
62-
63-
[Fact]
64-
public void ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts_AlternativeBlockStyle()
65-
{
66-
const string yaml = @"
67-
build_script:
68-
- cmd: |-
69-
echo --------------------------------------------------------------------------------
70-
echo Build tinyformat
71-
mkdir build
72-
cd build
73-
cmake -G ""%COMPILER%"" ..
74-
cmake --build . --config %CONFIGURATION%
75-
";
76-
77-
var conf = new BuildConfigurationYamlStringReader(yaml).GetBuildConfiguration();
78-
79-
Assert.Single(conf.BuildScript);
80-
Assert.Equal("echo --------------------------------------------------------------------------------\n" +
81-
"echo Build tinyformat\n" +
82-
"mkdir build\n" +
83-
"cd build\n" +
84-
"cmake -G \"%COMPILER%\" ..\n" +
85-
"cmake --build . --config %CONFIGURATION%",
86-
conf.BuildScript[0].Script);
87-
Assert.Equal(ScriptType.Batch, conf.BuildScript[0].ScriptType);
88-
}
89-
909
[Fact]
9110
public void ShouldReadBuildScriptAsAScriptBlockWithSplittedLinesScripts_AlternativeBlockStylePowershell()
9211
{

0 commit comments

Comments
 (0)