diff --git a/src/coverlet.console/Program.cs b/src/coverlet.console/Program.cs index e33746c01..d8a9ed9ac 100644 --- a/src/coverlet.console/Program.cs +++ b/src/coverlet.console/Program.cs @@ -50,7 +50,7 @@ static int Main(string[] args) if (!target.HasValue()) throw new CommandParsingException(app, "Target must be specified."); - Coverage coverage = new Coverage(module.Value, includeFilters.Values.ToArray(), includeDirectories.Values.ToArray(), excludeFilters.Values.ToArray(), excludedSourceFiles.Values.ToArray(), excludeAttributes.Values.ToArray(), singleHit.HasValue(), mergeWith.Value(), useSourceLink.HasValue(), logger); + Coverage coverage = new Coverage(module.Value, includeFilters.Values.ToArray(), includeDirectories.Values.ToArray(), excludeFilters.Values.ToArray(), excludedSourceFiles.Values.ToArray(), excludeAttributes.Values.ToArray(), singleHit.HasValue(), mergeWith.Value(), useSourceLink.HasValue(), logger, Guid.NewGuid().ToString()); coverage.PrepareModules(); Process process = new Process(); diff --git a/src/coverlet.core/Coverage.cs b/src/coverlet.core/Coverage.cs index 2c701f14f..8f98f7ae9 100644 --- a/src/coverlet.core/Coverage.cs +++ b/src/coverlet.core/Coverage.cs @@ -41,7 +41,8 @@ public Coverage(string module, bool singleHit, string mergeWith, bool useSourceLink, - ILogger logger) + ILogger logger, + string identifier) { _module = module; _includeFilters = includeFilters; @@ -53,8 +54,8 @@ public Coverage(string module, _mergeWith = mergeWith; _useSourceLink = useSourceLink; _logger = logger; + _identifier = identifier; - _identifier = Guid.NewGuid().ToString(); _results = new List(); } diff --git a/src/coverlet.msbuild.tasks/CoverageResultTask.cs b/src/coverlet.msbuild.tasks/CoverageResultTask.cs index 4fe1c323c..1054ffe92 100644 --- a/src/coverlet.msbuild.tasks/CoverageResultTask.cs +++ b/src/coverlet.msbuild.tasks/CoverageResultTask.cs @@ -13,6 +13,7 @@ namespace Coverlet.MSbuild.Tasks { public class CoverageResultTask : Task { + private string _identifier; private string _output; private string _format; private double _threshold; @@ -20,6 +21,13 @@ public class CoverageResultTask : Task private string _thresholdStat; private MSBuildLogger _logger; + [Required] + public string Identifier + { + get { return _identifier; } + set { _identifier = value; } + } + [Required] public string Output { @@ -66,7 +74,7 @@ public override bool Execute() { Console.WriteLine("\nCalculating coverage result..."); - var coverage = InstrumentationTask.Coverage; + var coverage = InstrumentationTask.Coverage[Identifier]; var result = coverage.GetCoverageResult(); var directory = Path.GetDirectoryName(_output); diff --git a/src/coverlet.msbuild.tasks/InstrumentationTask.cs b/src/coverlet.msbuild.tasks/InstrumentationTask.cs index 7392eed24..7d083d619 100644 --- a/src/coverlet.msbuild.tasks/InstrumentationTask.cs +++ b/src/coverlet.msbuild.tasks/InstrumentationTask.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Immutable; using Coverlet.Core; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; @@ -7,7 +8,7 @@ namespace Coverlet.MSbuild.Tasks { public class InstrumentationTask : Task { - private static Coverage _coverage; + private static ImmutableDictionary _coverage; private string _path; private string _include; private string _includeDirectory; @@ -19,7 +20,7 @@ public class InstrumentationTask : Task private bool _useSourceLink; private readonly MSBuildLogger _logger; - internal static Coverage Coverage + internal static ImmutableDictionary Coverage { get { return _coverage; } } @@ -31,6 +32,13 @@ public string Path set { _path = value; } } + [Required] + public string Identifier + { + get; + set; + } + public string Include { get { return _include; } @@ -94,8 +102,10 @@ public override bool Execute() var excludedSourceFiles = _excludeByFile?.Split(','); var excludeAttributes = _excludeByAttribute?.Split(','); - _coverage = new Coverage(_path, includeFilters, includeDirectories, excludeFilters, excludedSourceFiles, excludeAttributes, _singleHit, _mergeWith, _useSourceLink, _logger); - _coverage.PrepareModules(); + var coverage = new Coverage(_path, includeFilters, includeDirectories, excludeFilters, excludedSourceFiles, excludeAttributes, _singleHit, _mergeWith, _useSourceLink, _logger, Identifier); + coverage.PrepareModules(); + + ImmutableInterlocked.AddOrUpdate(ref _coverage, Identifier, coverage, (_1, _2) => coverage); } catch (Exception ex) { diff --git a/src/coverlet.msbuild.tasks/coverlet.msbuild.props b/src/coverlet.msbuild.tasks/coverlet.msbuild.props index 75ad624f3..0e6584733 100644 --- a/src/coverlet.msbuild.tasks/coverlet.msbuild.props +++ b/src/coverlet.msbuild.tasks/coverlet.msbuild.props @@ -1,6 +1,7 @@ false + $([System.Guid]::NewGuid()) diff --git a/src/coverlet.msbuild.tasks/coverlet.msbuild.targets b/src/coverlet.msbuild.tasks/coverlet.msbuild.targets index ce241c331..a662567ca 100644 --- a/src/coverlet.msbuild.tasks/coverlet.msbuild.targets +++ b/src/coverlet.msbuild.tasks/coverlet.msbuild.targets @@ -7,6 +7,7 @@ (), Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), false, string.Empty, false, new Mock().Object); + var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), false, string.Empty, false, new Mock().Object, Guid.NewGuid().ToString()); coverage.PrepareModules(); var result = coverage.GetCoverageResult();