diff --git a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs
index dd4f33b..317c23b 100644
--- a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs
+++ b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs
@@ -68,44 +68,45 @@ public bool TryGetUsedPackagesDependendingOnNugetOutput(out ITaskItem[] packages
using (var archive = Package.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var nuspec = archive.GetParts().Single(part => part.Uri.ToString().EndsWith(".nuspec"));
- var nugetSpec = Path.Combine(nupkgpath, Path.GetFileName(nuspec.Uri.ToString()));
+ var nuspecFilename = Path.GetFileName(nuspec.Uri.ToString());
+ var nugetSpec = Path.Combine(nupkgpath, nuspecFilename);
// use a mutex to ensure that only one process unzip the nuspec
// and that one process do not start reading it due to its existence while another one is still writing it.
- if (!File.Exists(nugetSpec))
+ var mut = new Mutex(false, nuspecFilename);
+ var xml = new XmlDocument();
+ try
{
- var mut = new Mutex(false, "UnzipNuSpec");
- try
- {
- mut.WaitOne();
+ mut.WaitOne();
- if (!File.Exists(nugetSpec))
- try
+ if (!File.Exists(nugetSpec))
+ {
+ try
+ {
+ using (
+ var outputstream = new FileStream(nugetSpec, FileMode.Create,
+ FileAccess.ReadWrite, FileShare.None))
{
- using (
- var outputstream = new FileStream(nugetSpec, FileMode.Create,
- FileAccess.ReadWrite, FileShare.None))
+ using (var nspecstream = nuspec.GetStream())
{
- using (var nspecstream = nuspec.GetStream())
- {
- nspecstream.CopyTo(outputstream);
- }
+ nspecstream.CopyTo(outputstream);
}
}
- catch (IOException)
- {
- if (!File.Exists(nugetSpec))
- throw;
- }
- }
- finally
- {
- mut.ReleaseMutex();
+ }
+ catch (IOException)
+ {
+ if (!File.Exists(nugetSpec))
+ throw;
+ }
}
- }
- var xml = new XmlDocument();
- xml.LoadXml(File.ReadAllText(nugetSpec));
+ xml.Load(nugetSpec);
+ }
+ finally
+ {
+ mut.ReleaseMutex();
+ }
+
var deps = xml.GetElementsByTagName("dependency");
foreach (XmlNode dep in deps)
{
diff --git a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec
index b1318df..e6a8eb6 100644
--- a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec
+++ b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec
@@ -10,8 +10,8 @@
http://www.baseclass.ch/Contrib/Nuget
false
Treats the "output" folder in an dependend nuget package as an additional special folder and copies it's content to the build folder
- - Added support for paket
-- Added support for repository path configuration
+ - Fix concurrency issue regression
+- Reduce scope of the mutex to optimize parallel compilations
Nuget Targets Copy Output build package convention