diff options
| author | MichaelTheShifter <[email protected]> | 2016-07-06 13:13:15 -0400 |
|---|---|---|
| committer | MichaelTheShifter <[email protected]> | 2016-07-06 13:13:15 -0400 |
| commit | b20c17f5a45b229edcefb66815ec602ade7dd84b (patch) | |
| tree | 5a4a4712ef902eb648a2eeac86b0440b9bed318e | |
| parent | 62b4af3c2b4cf2b61fbb1626be5b3927b43f0f5b (diff) | |
| download | shiftos-c-_theultimatehacker-b20c17f5a45b229edcefb66815ec602ade7dd84b.tar.gz shiftos-c-_theultimatehacker-b20c17f5a45b229edcefb66815ec602ade7dd84b.tar.bz2 shiftos-c-_theultimatehacker-b20c17f5a45b229edcefb66815ec602ade7dd84b.zip | |
Fix AppVeyor builds
| -rw-r--r-- | source/Baseclass.Contrib.Nuget.Output.targets | 227 | ||||
| -rw-r--r-- | source/WindowsFormsApplication1/Engine/Lua_Interp.cs | 2 |
2 files changed, 228 insertions, 1 deletions
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 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + + <!-- ============================================================ --> + <!-- Build targets --> + <!-- ============================================================ --> + <!-- + Is run once after build, checks if the project's nuget package's .nuspec depends on Baseclass.Contrib.Nuget.Output and copies everything which is in the + output folder to the builds OutDir. + --> + <Target Name="CopyToOutput" AfterTargets="Compile" DependsOnTargets="CollectNugetOutputFiles"> + <Copy SourceFiles="@(NugetOutputFiles)" DestinationFiles="@(NugetOutputFiles->'$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)')" /> + </Target> + + <!-- + Is run once after clean, delete all files that match files collected by the CollectNugetOutputFiles task. + --> + <Target Name="CleanOutput" AfterTargets="Clean" DependsOnTargets="CollectNugetOutputFiles"> + <Delete Files="@(NugetOutputFiles->'$(OutDir)\%(RecursiveDir)%(Filename)%(Extension)')" /> + </Target> + + <!-- + Is run once per file which has been deleted by the CleanOutput target, if the containing folder is empty it gets deleted. + --> + <Target Name="CleanEmptyFolder" Inputs="@(NugetOutputFiles)" Outputs="%(Identity).Dummy" AfterTargets="CleanOutput"> + <ItemGroup> + <EmptyCheck Include="$(OutDir)%(NugetOutputFiles.RecursiveDir)**\*.*" /> + </ItemGroup> + + <RemoveDir Condition="'@(EmptyCheck)' == '' And '%(NugetOutputFiles.RecursiveDir)' != ''" Directories="$(OutDir)%(NugetOutputFiles.RecursiveDir)" /> + </Target> + + <!-- ============================================================ --> + <!-- Web publication targets --> + <!-- ============================================================ --> + + <PropertyGroup> + <PipelineCollectFilesPhaseDependsOn> + $(PipelineCollectFilesPhaseDependsOn); + CollectNugetPackageFiles; + </PipelineCollectFilesPhaseDependsOn> + </PropertyGroup> + + <!-- + Is run once during the PipelineCollectFilesPhase to fill FilesForPackagingFromProject with the files from NugetOutputFiles + --> + <Target Name="CollectNugetPackageFiles" DependsOnTargets="CollectNugetOutputFiles"> + <ItemGroup> + <FilesForPackagingFromProject Include="@(NugetOutputFiles)" > + <DestinationRelativePath>bin\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> + </FilesForPackagingFromProject> + </ItemGroup> + </Target> + + <!-- ============================================================ --> + <!-- Common targets --> + <!-- ============================================================ --> + + <ItemGroup> + <NupkgFiles Include="$(MSBuildThisFileDirectory)\..\..\..\*\*.nupkg"/> + </ItemGroup> + + <ItemGroup> + <PackageFiles Include="$(MSBuildProjectDirectory)\packages.config"/> + </ItemGroup> + + <!-- + Is run once to compute the NugetOutputFiles item from the NuGet dependencies of the project + --> + <Target Name="CollectNugetOutputFiles"> + <Message Text="Collecting NuGet output files for $(MSBuildProjectName):" /> + + <PackageFilter PackageConfigs="@(PackageFiles)" NugetPackages="@(NupkgFiles)"> + <Output ItemName="FilteredNugetPackages" TaskParameter="Result" /> + </PackageFilter> + + <Message Text="@(FilteredNugetPackages->'%(RecursiveDir)%(Filename)%(Extension)', '%0D%0A')" /> + <Message Text="Total filtered packages : @(FilteredNugetPackages->Count())" /> + + <ItemGroup> + <NugetOutputFiles Include="%(FilteredNugetPackages.RootDir)%(FilteredNugetPackages.Directory)\output\**\*.*" /> + </ItemGroup> + + <Message Text="@(NugetOutputFiles->'%(RecursiveDir)%(Filename)%(Extension)', '%0D%0A')" /> + <Message Text="Total files collected : @(NugetOutputFiles->Count())" /> + </Target> + + <!-- + Filter the NugetPackages list to only include nuget packages referenced in the PackageConfigs list which depend on Baseclass.Contrib.Nuget.Output + --> + <UsingTask TaskName="PackageFilter" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"> + <ParameterGroup> + <PackageConfigs ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> + <NugetPackages ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> + <Result ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" /> + </ParameterGroup> + <Task> + <Reference Include="System.Xml"/> + <Reference Include="System.Xml.Linq"/> + <Reference Include="WindowsBase" /> + <Using Namespace="System" /> + <Using Namespace="System.Collections.Generic" /> + <Using Namespace="System.IO" /> + <Using Namespace="System.IO.Packaging" /> + <Using Namespace="System.Linq" /> + <Using Namespace="System.Threading" /> + <Using Namespace="System.Xml" /> + <Code Type="Fragment" Language="cs"> + <![CDATA[ + var usedPackages = new HashSet<string>(); // 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<ITaskItem>(); // 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<ITaskItem>(); // 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; + ]]> + </Code> + </Task> + </UsingTask> +</Project> 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 @@ namespace ShiftOS { mod(func + $"(\"{API.OpenGUIDs[win]}\")"); }; - }); + }); mod.on_window_titlebar_redraw += new Action<ShiftOSDesktop, string>((desktop, func) => { desktop.TitlebarReset += (win) => |
