Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/ScriptCs.Core/ScriptCs.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
<Compile Include="ScriptExecutor.cs" />
<Compile Include="ScriptServices.cs" />
<Compile Include="SessionState.cs" />
<Compile Include="ShebangLineProcessor.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="UsingLineProcessor.cs" />
</ItemGroup>
Expand Down
21 changes: 21 additions & 0 deletions src/ScriptCs.Core/ShebangLineProcessor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using ScriptCs.Contracts;

namespace ScriptCs
{
public interface IShebangLineProcessor : ILineProcessor
{
}

public class ShebangLineProcessor : DirectiveLineProcessor, IShebangLineProcessor
{
protected override string DirectiveName
{
get { return "!/usr/bin/env"; }
}

protected override bool ProcessLine(IFileParser parser, FileParserContext context, string line)
{
return true;
}
}
}
6 changes: 5 additions & 1 deletion src/ScriptCs.Hosting/ScriptServicesRegistration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ protected void RegisterLineProcessors(ContainerBuilder builder)
.FirstOrDefault(x => typeof(IReferenceLineProcessor).IsAssignableFrom(x))
?? typeof(ReferenceLineProcessor);

var processorArray = new[] { loadProcessorType, usingProcessorType, referenceProcessorType }
var shebangProcessorType = processorList
.FirstOrDefault(x => typeof(IShebangLineProcessor).IsAssignableFrom(x))
?? typeof(ShebangLineProcessor);

var processorArray = new[] { loadProcessorType, usingProcessorType, referenceProcessorType, shebangProcessorType }
.Union(processorList).ToArray();

builder.RegisterTypes(processorArray).As<ILineProcessor>();
Expand Down
3 changes: 3 additions & 0 deletions src/ScriptCs/ScriptCs.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Include="scriptcs">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Content Include="..\..\common\Icon.ico">
Expand Down
6 changes: 6 additions & 0 deletions src/ScriptCs/scriptcs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
## Make sure to chmod +x this file!

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

mono "$DIR/scriptcs.exe" $@
26 changes: 24 additions & 2 deletions test/ScriptCs.Core.Tests/FileProcessorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class ProcessFileMethod
{
private List<string> _file1 = new List<string>
{
@"#!/usr/bin/env scriptcs",
@"#load ""script2.csx""",
@"#load ""script4.csx"";",
"using System;",
Expand Down Expand Up @@ -184,6 +185,24 @@ public void ShouldNotIncludeReferencesInCode()
result.Code.ShouldNotContain("#r");
}

[Fact]
public void ShouldNotIncludeShebangsInCode()
{
var file1 = new List<string>
{
@"#!/usr/bin/env scriptcs",
"using System;",
@"Console.WriteLine(""Hi!"");"
};

_fileSystem.Setup(x => x.ReadFileLines(It.Is<string>(f => f == "script1.csx"))).Returns(file1.ToArray());

var processor = GetFilePreProcessor();
var result = processor.ProcessFile("script1.csx");

result.Code.ShouldNotContain("#!/usr/bin/env");
}

[Fact]
public void ShouldNotLoadSameFileTwice()
{
Expand Down Expand Up @@ -502,7 +521,8 @@ private IFilePreProcessor GetFilePreProcessor()
{
new UsingLineProcessor(),
new ReferenceLineProcessor(_fileSystem.Object),
new LoadLineProcessor(_fileSystem.Object)
new LoadLineProcessor(_fileSystem.Object),
new ShebangLineProcessor()
};

return new FilePreProcessor(_fileSystem.Object, Mock.Of<ILog>(), lineProcessors);
Expand Down Expand Up @@ -565,7 +585,8 @@ private IFilePreProcessor GetFilePreProcessor()
{
new UsingLineProcessor(),
new ReferenceLineProcessor(_fileSystem.Object),
new LoadLineProcessor(_fileSystem.Object)
new LoadLineProcessor(_fileSystem.Object),
new ShebangLineProcessor()
};

return new FilePreProcessor(_fileSystem.Object, Mock.Of<ILog>(), lineProcessors);
Expand Down Expand Up @@ -622,6 +643,7 @@ private IFilePreProcessor GetFilePreProcessor(ILineProcessor customDirectiveProc
new UsingLineProcessor(),
new ReferenceLineProcessor(_fileSystem.Object),
loadLineProcessor,
new ShebangLineProcessor(),
customDirectiveProcessor
};

Expand Down
1 change: 1 addition & 0 deletions test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
<Compile Include="ScriptHostTests.cs" />
<Compile Include="ScriptPackResolverTests.cs" />
<Compile Include="ScriptPackSessionTests.cs" />
<Compile Include="ShebangLineProcessorTests.cs" />
<Compile Include="UsingLineProcessorTests.cs" />
</ItemGroup>
<ItemGroup>
Expand Down
38 changes: 38 additions & 0 deletions test/ScriptCs.Core.Tests/ShebangLineProcessorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Should;
using Xunit.Extensions;
using ScriptCs.Contracts;

namespace ScriptCs.Tests
{
public class ShebangLineProcessorTests
{
public class TheProcessLineMethod
{
[Theory, ScriptCsAutoData]
public void ShouldReturnTrueOnShebangLine(IFileParser parser, ShebangLineProcessor processor)
{
// Arrange
const string Line = @"#!/usr/bin/env scriptcs";

// Act
var result = processor.ProcessLine(parser, new FileParserContext(), Line, true);

// Assert
result.ShouldBeTrue();
}

[Theory, ScriptCsAutoData]
public void ShouldReturnFalseOtherwise(IFileParser parser, ShebangLineProcessor processor)
{
// Arrange
const string Line = @"var x = new Test();";

// Act
var result = processor.ProcessLine(parser, new FileParserContext(), Line, true);

// Assert
result.ShouldBeFalse();
}
}
}
}
1 change: 1 addition & 0 deletions test/ScriptCs.Hosting.Tests/RuntimeServicesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ public void ShouldRegisterTheDefaultLineProcessors()
processors.Where(p => p is IUsingLineProcessor).ShouldNotBeEmpty();
processors.Where(p => p is IReferenceLineProcessor).ShouldNotBeEmpty();
processors.Where(p => p is ILoadLineProcessor).ShouldNotBeEmpty();
processors.Where(p => p is IShebangLineProcessor).ShouldNotBeEmpty();
}

[Fact]
Expand Down