diff --git a/source/Baseclass.Contrib.Nuget.Output.targets b/source/Baseclass.Contrib.Nuget.Output.targets new file mode 100644 index 0000000..efe8e99 --- /dev/null +++ b/source/Baseclass.Contrib.Nuget.Output.targets @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(PipelineCollectFilesPhaseDependsOn); + CollectNugetPackageFiles; + + + + + + + + bin\%(RecursiveDir)%(Filename)%(Extension) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (); // packaged used by the project + try + { + foreach (var packageConfig in PackageConfigs) + { + var path = packageConfig.GetMetadata("FullPath"); + var xml = new XmlDocument(); + xml.LoadXml(File.ReadAllText(path)); + var deps = xml.GetElementsByTagName("package"); + foreach (XmlNode dep in deps) + { + if (dep.Attributes == null) + { + continue; + } + var id = dep.Attributes.GetNamedItem("id").Value; + if ("Baseclass.Contrib.Nuget.Output".Equals(id)) + { + continue; + } + var version = dep.Attributes.GetNamedItem("version").Value; + var s = string.Format("{0}.{1}", id, version); + usedPackages.Add(s); + } + } + } + catch (Exception e) + { + Log.LogError("Failed to load package files: {0}", e.Message); + return false; + } + + var usedNugetPackages = new List(); // list of nuget packages used by the project + try + { + foreach (var nugetPackage in NugetPackages) + { + var path = nugetPackage.GetMetadata("FullPath"); + var parts = path.Split(Path.DirectorySeparatorChar); + usedNugetPackages.AddRange(from part in parts where usedPackages.Contains(part) select nugetPackage); + } + } + catch (Exception e) + { + Log.LogError("Failed to filter nuget specs: {0}", e.Message); + return false; + } + + var result = new List(); // list of nuget packages used by the project that depends on Baseclass.Contrib.Nuget.Output + foreach (var nugetPackage in usedNugetPackages) + { + var path = nugetPackage.GetMetadata("FullPath"); + var nupkgpath = Path.GetDirectoryName(path); + + 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())); + + // 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. + Mutex mut = new Mutex(false, "UnzipNuSpec"); + try + { + mut.WaitOne(); + + if (!File.Exists(nugetSpec)) + { + // unpack the nuget spec file from the package + try + { + using (var outputstream = new FileStream(nugetSpec, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) + { + using (var nspecstream = nuspec.GetStream()) + { + nspecstream.CopyTo(outputstream); + } + } + } + catch (IOException) + { + if (!File.Exists(nugetSpec)) + { + throw; + } + } + } + } + finally + { + mut.ReleaseMutex(); + } + + var xml = new XmlDocument(); + xml.LoadXml(File.ReadAllText(nugetSpec)); + var deps = xml.GetElementsByTagName("dependency"); + foreach (XmlNode dep in deps) + { + if (dep.Attributes == null) + { + continue; + } + var id = dep.Attributes.GetNamedItem("id").Value; + if ("Baseclass.Contrib.Nuget.Output".Equals(id)) + { + result.Add(new TaskItem(nugetPackage)); + break; + } + } + } + } + Result = result.ToArray(); + return true; + ]]> + + + + diff --git a/source/WindowsFormsApplication1/Engine/Lua_Interp.cs b/source/WindowsFormsApplication1/Engine/Lua_Interp.cs index bb76c77..4192acf 100644 --- a/source/WindowsFormsApplication1/Engine/Lua_Interp.cs +++ b/source/WindowsFormsApplication1/Engine/Lua_Interp.cs @@ -156,7 +156,7 @@ public void RegisterCore() { mod(func + $"(\"{API.OpenGUIDs[win]}\")"); }; - }); + }); mod.on_window_titlebar_redraw += new Action((desktop, func) => { desktop.TitlebarReset += (win) =>