Skip to content

Commit 417390b

Browse files
Merge pull request #88 from petabridge/dev
v0.2.0 Release
2 parents 19e1788 + 72b393c commit 417390b

24 files changed

+572
-48
lines changed

RELEASE_NOTES.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
#### 0.1.7 September 09 2019 ####
2-
Bugfix release for Incrementalist v0.1.6
1+
#### 0.2.0 October 28 2019 ####
2+
Feature release: Incrementalist v0.2.0
33

4-
Fixed [Bug: in multi-targeted projects, only one "project" contains the dependency graph.](https://github.com/petabridge/Incrementalist/issues/63). This will make it easier for Incrementalist to detect changes that occur inside multi-targeted projects.
4+
* [Added .NET Core 3.0 global tool support](https://github.com/petabridge/Incrementalist/issues/70)
5+
* [Added F# project support](https://github.com/petabridge/Incrementalist/issues/69)
6+
* [Bugfix: Need to be able to detect changes in `.props` files referenced by projects](https://github.com/petabridge/Incrementalist/issues/68)
7+
* [Added configurable timeout to commandline options](https://github.com/petabridge/Incrementalist/pull/86)

build-system/windows-release.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ variables:
1414
- group: signingSecrets #create this group with SECRET variables `signingUsername` and `signingPassword`
1515
- group: nugetKeys #create this group with SECRET variables `nugetKey`
1616
- name: githubConnectionName
17-
value: Petabridge
17+
value: PbReleaseNotes
1818
- name: projectName
1919
value: Incrementalist
2020
- name: githubRepositoryName
@@ -35,4 +35,4 @@ steps:
3535
title: '$(projectName) v$(Build.SourceBranchName)'
3636
releaseNotesFile: 'RELEASE_NOTES.md'
3737
assets: |
38-
bin\nuget\*.nupkg
38+
bin\nuget\*.nupkg

build.fsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ Target "IntegrationTests" <| fun _ ->
122122

123123
let runSingleProject project =
124124

125-
let folderOnlyArgs = sprintf "run --project %s -c %s --no-build -- -b dev -l -f %s" project configuration (outputTests @@ "incrementalist-affected-folders.txt")
126-
let slnArgs = sprintf "run --project %s -c %s --no-build -- -b dev -f %s" project configuration (outputTests @@ "incrementalist-affected-files.txt")
125+
let folderOnlyArgs = sprintf "run --project %s -c %s --framework netcoreapp3.0 --no-build -- -b dev -l -f %s" project configuration (outputTests @@ "incrementalist-affected-folders.txt")
126+
let slnArgs = sprintf "run --project %s -c %s --framework netcoreapp3.0 -- -b dev -f %s" project configuration (outputTests @@ "incrementalist-affected-files.txt")
127127

128128
let execWithArgs args =
129129
let result = ExecProcess(fun info ->

build.ps1

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ Param(
3131

3232
$FakeVersion = "4.61.2"
3333
$DotNetChannel = "LTS";
34-
$DotNetVersion = "2.1.500";
35-
$DotNetInstallerUri = "https://raw.githubusercontent.com/dotnet/cli/v$DotNetVersion/scripts/obtain/dotnet-install.ps1";
34+
$DotNetVersion = "3.0.100";
35+
$DotNetInstallerUri = "https://dot.net/v1/dotnet-install.ps1";
3636
$NugetVersion = "4.1.0";
3737
$NugetUrl = "https://dist.nuget.org/win-x86-commandline/v$NugetVersion/nuget.exe"
38-
$ProtobufVersion = "3.4.0"
38+
$ProtobufVersion = "3.9.2"
3939
$DocfxVersion = "2.40.5"
4040

4141
# Make sure tools folder exists
@@ -87,6 +87,7 @@ if($FoundDotNetCliVersion -ne $DotNetVersion) {
8787
$env:PATH = "$InstallPath;$env:PATH"
8888
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
8989
$env:DOTNET_CLI_TELEMETRY_OPTOUT=1
90+
$env:DOTNET_ROOT=$InstallPath
9091
}
9192

9293
###########################################################################
@@ -128,6 +129,22 @@ if (!(Test-Path $DocfxExePath)) {
128129
}
129130
}
130131

132+
133+
###########################################################################
134+
# Google.Protobuf.Tools
135+
###########################################################################
136+
137+
# Make sure Google.Protobuf.Tools has been installed.
138+
$ProtobufExePath = Join-Path $ToolPath "Google.Protobuf.Tools/tools/windows_x64/protoc.exe"
139+
if (!(Test-Path $ProtobufExePath)) {
140+
Write-Host "Installing Google.Protobuf.Tools..."
141+
Invoke-Expression "&`"$NugetPath`" install Google.Protobuf.Tools -ExcludeVersion -Version $ProtobufVersion -OutputDirectory `"$ToolPath`"" | Out-Null;
142+
if ($LASTEXITCODE -ne 0) {
143+
Throw "An error occured while restoring Google.Protobuf.Tools from NuGet."
144+
}
145+
}
146+
147+
131148
###########################################################################
132149
# SignTool
133150
###########################################################################
@@ -256,8 +273,8 @@ exit $LASTEXITCODE
256273
# +jrFfrNWxRlmVcfE+ZBH8bLJinzYGNChgg7IMIIOxAYKKwYBBAGCNwMDATGCDrQw
257274
# gg6wBgkqhkiG9w0BBwKggg6hMIIOnQIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqG
258275
# SIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQg
259-
# yVw1M/glzmvyYENKoVDAlG2PPFDPhYSmm6N4s9jIPD0CEDlse+eGBA4upExwL3x7
260-
# DG4YDzIwMTkwMzA3MTk0MjQ4WqCCC7swggaCMIIFaqADAgECAhAJwPxGyARCE7VZ
276+
# yVw1M/glzmvyYENKoVDAlG2PPFDPhYSmm6N4s9jIPD0CEGcCUCnVFW/SW5WYFvGQ
277+
# UdEYDzIwMTkwMzE1MTYwMDU3WqCCC7swggaCMIIFaqADAgECAhAJwPxGyARCE7VZ
261278
# i68oT05BMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxE
262279
# aWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMT
263280
# KERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwHhcNMTcw
@@ -324,13 +341,13 @@ exit $LASTEXITCODE
324341
# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdp
325342
# Q2VydCBTSEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBAhAJwPxGyARCE7VZ
326343
# i68oT05BMA0GCWCGSAFlAwQCAQUAoIGYMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B
327-
# CRABBDAcBgkqhkiG9w0BCQUxDxcNMTkwMzA3MTk0MjQ4WjArBgsqhkiG9w0BCRAC
344+
# CRABBDAcBgkqhkiG9w0BCQUxDxcNMTkwMzE1MTYwMDU3WjArBgsqhkiG9w0BCRAC
328345
# DDEcMBowGDAWBBRAAZFHXJiJHeuhBK9HCRtettTLyzAvBgkqhkiG9w0BCQQxIgQg
329-
# THJaw67Mv8gSdYbuiJzceMQu2BnXQMbGHfTk35ilTHkwDQYJKoZIhvcNAQEBBQAE
330-
# ggEAD6QiEmVV5ZSFeaSHvujQ33RCMbndiy71RsysBVsJqOLp9uC0XXutmwjqa7q/
331-
# aOXOFNSTZAOGBeDVrObLe1eyVGO2ZdeA1WqTZC56dTo447OGSOacYd2x6S0UGPR8
332-
# jkDDYDIWKWhtNERUXiw4R+xGWRfUElwSn+vIT6izyV/4IgiEgoINe4/nQ3y9Asbc
333-
# oY8bE8uBhfimwgzpsqj6YTHCJxSrPnloqeHJYQmBn+1RcJ06lNiY8eppAZGo+zQQ
334-
# CMtoxnhrX3J9A/+41e6y1TX7YCLFV+bznmgVQz0cUqoEvB5TemogV2NwOTgnYvz0
335-
# SfejbelpMrP5PYsNcJePyRpdsQ==
346+
# jLu5eXUI0j43Sq/ZJ76+UJmWF/2Amb+YAcVtGZhRJKowDQYJKoZIhvcNAQEBBQAE
347+
# ggEAQBQNwdmatbURcWuntIUvk18FZGGLRA3bT0kNXN0pwwwopQlr4G6WbL8C8oSw
348+
# 0KUbWa3VonUYHemc6ZYgSOaa07X9dMoEWdgf9Jy7LDFZQCYBkI7034x0ujyTAZ6U
349+
# KtqQupuRPdLAsCb67KB6DR6lIuP1hj1yolPb9uyqEsH1JJqusTiirZvO1UvNVtHU
350+
# ljscye8j2SiO8UNLhYHL1me43S4NmqgLkaDvIE8lVx8GtyFyGRdFZYTzAufXTR9H
351+
# HK8lsD0ekQiOpaAIw/MfhEgTej1Z3L686Z0xwBVyH988UA9lVbXdDZWS3odGd2CT
352+
# /JdEUFIMzW5J8N+QntZ/Fjua/A==
336353
# SIG # End signature block

build.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ NUGET_EXE=$TOOLS_DIR/nuget.exe
1111
NUGET_URL=https://dist.nuget.org/win-x86-commandline/v4.0.0/nuget.exe
1212
FAKE_VERSION=4.61.2
1313
FAKE_EXE=$TOOLS_DIR/FAKE/tools/FAKE.exe
14-
DOTNET_VERSION=2.1.500
15-
DOTNET_INSTALLER_URL=https://raw.githubusercontent.com/dotnet/cli/v$DOTNET_VERSION/scripts/obtain/dotnet-install.sh
14+
DOTNET_VERSION=3.0.100
15+
DOTNET_INSTALLER_URL=https://dot.net/v1/dotnet-install.sh
1616
DOTNET_CHANNEL=LTS;
1717
DOCFX_VERSION=2.40.5
1818
DOCFX_EXE=$TOOLS_DIR/docfx.console/tools/docfx.exe
@@ -129,4 +129,4 @@ export FrameworkPathOverride=/usr/lib/mono/4.5/
129129
###########################################################################
130130

131131
# Start Fake
132-
exec mono "$FAKE_EXE" build.fsx "${SCRIPT_ARGUMENTS[@]}" --verbosity=$VERBOSITY --configuration=$CONFIGURATION --target=$TARGET $DRYRUN
132+
exec mono "$FAKE_EXE" build.fsx "${SCRIPT_ARGUMENTS[@]}" --verbosity=$VERBOSITY --configuration=$CONFIGURATION --target=$TARGET $DRYRUN

src/Incrementalist.Cmd/Commands/LoadSolutionCmd.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,20 @@ protected override async Task<Solution> ProcessImpl(Task<string> previousTask)
4242
$"solution filename. Instead returned {slnObject}");
4343
var slnName = slnObject;
4444
Contract.Assert(File.Exists(slnName), $"Expected to find {slnName} on the file system, but couldn't.");
45+
46+
// Log any solution loading issues
47+
_workspace.WorkspaceFailed += (sender, args) =>
48+
{
49+
var message = $"Issue during solution loading: {sender}: {args.Diagnostic.Message}";
50+
var logLevel = args.Diagnostic.Kind == WorkspaceDiagnosticKind.Failure ? LogLevel.Error : LogLevel.Warning;
51+
52+
Logger.Log(logLevel, message);
53+
};
4554

55+
// Roslyn does not support FSharp projects, but .fsproj has same structure as .csproj files,
56+
// so can treat them as a known project type to support diff tracking
57+
_workspace.AssociateFileExtensionWithLanguage("fsproj", LanguageNames.CSharp);
58+
4659
return await _workspace.OpenSolutionAsync(slnName, _progress, CancellationToken);
4760
}
4861
}

src/Incrementalist.Cmd/Incrementalist.Cmd.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
<ToolCommandName>incrementalist</ToolCommandName>
55
<PackAsTool>true</PackAsTool>
66
<OutputType>Exe</OutputType>
7-
<TargetFramework>netcoreapp2.1</TargetFramework>
7+
<TargetFrameworks>netcoreapp2.1;netcoreapp3.0;</TargetFrameworks>
88
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
99
<LangVersion>7.1</LangVersion>
1010
<Description>.NET Core global tool for determining how to run incremental builds based on the current Git diff.</Description>
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14-
<PackageReference Include="CommandLineParser" Version="2.5.0" />
15-
<PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
16-
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.0.0" />
14+
<PackageReference Include="CommandLineParser" Version="2.6.0" />
15+
<PackageReference Include="Microsoft.Build.Locator" Version="1.2.6" />
16+
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="$(RoslynVersion)" />
1717
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
1818
</ItemGroup>
1919

src/Incrementalist.Cmd/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ private static async Task<int> RunIncrementalist(SlnOptions options)
130130

131131
private static async Task AnalyzeFolderDiff(SlnOptions options, DirectoryInfo workingFolder, ILogger logger)
132132
{
133-
var settings = new BuildSettings(options.GitBranch, options.SolutionFilePath, workingFolder.FullName);
133+
var settings = new BuildSettings(options.GitBranch, options.SolutionFilePath, workingFolder.FullName, TimeSpan.FromMinutes(options.TimeoutMinutes));
134134
var emitTask = new EmitAffectedFoldersTask(settings, logger);
135135
var affectedFiles = (await emitTask.Run());
136136

@@ -155,7 +155,7 @@ private static async Task AnaylzeSolutionDIff(SlnOptions options, DirectoryInfo
155155
private static async Task ProcessSln(SlnOptions options, string sln, DirectoryInfo workingFolder,
156156
MSBuildWorkspace msBuild, ILogger logger)
157157
{
158-
var settings = new BuildSettings(options.GitBranch, sln, workingFolder.FullName);
158+
var settings = new BuildSettings(options.GitBranch, sln, workingFolder.FullName, TimeSpan.FromMinutes(options.TimeoutMinutes));
159159
var emitTask = new EmitDependencyGraphTask(settings, msBuild, logger);
160160
var affectedFiles = (await emitTask.Run()).ToList();
161161

src/Incrementalist.Cmd/SlnOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
// </copyright>
55
// -----------------------------------------------------------------------
66

7+
using System;
8+
using System.Diagnostics;
9+
using System.Runtime.InteropServices.ComTypes;
710
using CommandLine;
811

912
namespace Incrementalist.Cmd
@@ -31,5 +34,8 @@ public sealed class SlnOptions
3134
Default = false,
3235
HelpText = "Prints out extensive debug logs during operation.")]
3336
public bool Verbose { get; set; }
37+
38+
[Option('t', "timeout", Default = 2, HelpText = "Specifies the load timeout for the solution in whole minutes. Defaults to 2 minutes.")]
39+
public int TimeoutMinutes { get; set; }
3440
}
3541
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using FluentAssertions;
7+
using Incrementalist.Cmd.Commands;
8+
using Incrementalist.ProjectSystem;
9+
using Incrementalist.ProjectSystem.Cmds;
10+
using Incrementalist.Tests.Helpers;
11+
using Microsoft.Build.Locator;
12+
using Microsoft.CodeAnalysis;
13+
using Microsoft.CodeAnalysis.MSBuild;
14+
using Xunit;
15+
using Xunit.Abstractions;
16+
17+
namespace Incrementalist.Tests.Dependencies
18+
{
19+
public class FSharpProjectsTrackingSpecs : IDisposable
20+
{
21+
private readonly ITestOutputHelper _outputHelper;
22+
public DisposableRepository Repository { get; }
23+
24+
public FSharpProjectsTrackingSpecs(ITestOutputHelper outputHelper)
25+
{
26+
_outputHelper = outputHelper;
27+
Repository = new DisposableRepository();
28+
}
29+
30+
public void Dispose()
31+
{
32+
Repository?.Dispose();
33+
}
34+
35+
[Fact]
36+
public async Task FSharpProjectDiff_should_be_tracked()
37+
{
38+
var sample = ProjectSampleGenerator.GetFSharpSolutionSample("FSharpSolution.sln");
39+
var solutionFullPath = sample.SolutionFile.GetFullPath(Repository.BasePath);
40+
var fsharpProjectFullPath = sample.FSharpProjectFile.GetFullPath(Repository.BasePath);
41+
var csharpProjectFullPath = sample.CSharpProjectFile.GetFullPath(Repository.BasePath);
42+
43+
Repository
44+
.WriteFile(sample.SolutionFile)
45+
.WriteFile(sample.CSharpProjectFile)
46+
.WriteFile(sample.FSharpProjectFile)
47+
.Commit("Created new solution with fsharp and csharp projects")
48+
.CreateBranch("foo")
49+
.CheckoutBranch("foo")
50+
.WriteFile(sample.CSharpProjectFile.Name, sample.CSharpProjectFile.Content + " ")
51+
.WriteFile(sample.FSharpProjectFile.Name, sample.FSharpProjectFile.Content + " ")
52+
.Commit("Updated both project files");
53+
54+
var logger = new TestOutputLogger(_outputHelper);
55+
var settings = new BuildSettings("master", solutionFullPath, Repository.BasePath);
56+
var workspace = SetupMsBuildWorkspace();
57+
var emitTask = new EmitDependencyGraphTask(settings, workspace, logger);
58+
var affectedFiles = (await emitTask.Run()).ToList();
59+
60+
affectedFiles.Select(f => f.Key).Should().HaveCount(2).And.Subject.Should().BeEquivalentTo(fsharpProjectFullPath, csharpProjectFullPath);
61+
}
62+
63+
private static MSBuildWorkspace SetupMsBuildWorkspace()
64+
{
65+
// Locate and register the default instance of MSBuild installed on this machine.
66+
MSBuildLocator.RegisterDefaults();
67+
68+
return MSBuildWorkspace.Create();
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)