From d3d3649a68cb1fa589fdd987a6690dbd5d671f0d Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sun, 17 Sep 2017 15:35:20 -0700 Subject: Initial code commit --- .../RefreshBundleGeneratedFile.cs | 132 +++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/WixToolset.BuildTasks/RefreshBundleGeneratedFile.cs (limited to 'src/WixToolset.BuildTasks/RefreshBundleGeneratedFile.cs') diff --git a/src/WixToolset.BuildTasks/RefreshBundleGeneratedFile.cs b/src/WixToolset.BuildTasks/RefreshBundleGeneratedFile.cs new file mode 100644 index 00000000..5445e0cd --- /dev/null +++ b/src/WixToolset.BuildTasks/RefreshBundleGeneratedFile.cs @@ -0,0 +1,132 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.BuildTasks +{ + using System; + using System.Collections; + using System.Globalization; + using System.IO; + using System.Text.RegularExpressions; + using System.Xml; + using Microsoft.Build.Framework; + using Microsoft.Build.Utilities; + + /// + /// This task refreshes the generated file for bundle projects. + /// + public class RefreshBundleGeneratedFile : Task + { + private static readonly Regex AddPrefix = new Regex(@"^[^a-zA-Z_]", RegexOptions.Compiled); + private static readonly Regex IllegalIdentifierCharacters = new Regex(@"[^A-Za-z0-9_\.]|\.{2,}", RegexOptions.Compiled); // non 'words' and assorted valid characters + + private ITaskItem[] generatedFiles; + private ITaskItem[] projectReferencePaths; + + /// + /// The list of files to generate. + /// + [Required] + public ITaskItem[] GeneratedFiles + { + get { return this.generatedFiles; } + set { this.generatedFiles = value; } + } + + /// + /// All the project references in the project. + /// + [Required] + public ITaskItem[] ProjectReferencePaths + { + get { return this.projectReferencePaths; } + set { this.projectReferencePaths = value; } + } + + /// + /// Gets a complete list of external cabs referenced by the given installer database file. + /// + /// True upon completion of the task execution. + public override bool Execute() + { + ArrayList payloadGroupRefs = new ArrayList(); + ArrayList packageGroupRefs = new ArrayList(); + for (int i = 0; i < this.ProjectReferencePaths.Length; i++) + { + ITaskItem item = this.ProjectReferencePaths[i]; + + if (!String.IsNullOrEmpty(item.GetMetadata(Common.DoNotHarvest))) + { + continue; + } + + string projectPath = CreateProjectReferenceDefineConstants.GetProjectPath(this.ProjectReferencePaths, i); + string projectName = Path.GetFileNameWithoutExtension(projectPath); + string referenceName = Common.GetIdentifierFromName(CreateProjectReferenceDefineConstants.GetReferenceName(item, projectName)); + + string[] pogs = item.GetMetadata("RefProjectOutputGroups").Split(';'); + foreach (string pog in pogs) + { + if (!String.IsNullOrEmpty(pog)) + { + // TODO: Add payload group references and package group references once heat is generating them + ////payloadGroupRefs.Add(String.Format(CultureInfo.InvariantCulture, "{0}.{1}", referenceName, pog)); + packageGroupRefs.Add(String.Format(CultureInfo.InvariantCulture, "{0}.{1}", referenceName, pog)); + } + } + } + + XmlDocument doc = new XmlDocument(); + + XmlProcessingInstruction head = doc.CreateProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); + doc.AppendChild(head); + + XmlElement rootElement = doc.CreateElement("Wix"); + rootElement.SetAttribute("xmlns", "http://wixtoolset.org/schemas/v4/wxs"); + doc.AppendChild(rootElement); + + XmlElement fragment = doc.CreateElement("Fragment"); + rootElement.AppendChild(fragment); + + XmlElement payloadGroup = doc.CreateElement("PayloadGroup"); + payloadGroup.SetAttribute("Id", "Bundle.Generated.Payloads"); + fragment.AppendChild(payloadGroup); + + XmlElement packageGroup = doc.CreateElement("PackageGroup"); + packageGroup.SetAttribute("Id", "Bundle.Generated.Packages"); + fragment.AppendChild(packageGroup); + + foreach (string payloadGroupRef in payloadGroupRefs) + { + XmlElement payloadGroupRefElement = doc.CreateElement("PayloadGroupRef"); + payloadGroupRefElement.SetAttribute("Id", payloadGroupRef); + payloadGroup.AppendChild(payloadGroupRefElement); + } + + foreach (string packageGroupRef in packageGroupRefs) + { + XmlElement packageGroupRefElement = doc.CreateElement("PackageGroupRef"); + packageGroupRefElement.SetAttribute("Id", packageGroupRef); + packageGroup.AppendChild(packageGroupRefElement); + } + + foreach (ITaskItem item in this.GeneratedFiles) + { + string fullPath = item.GetMetadata("FullPath"); + + payloadGroup.SetAttribute("Id", Path.GetFileNameWithoutExtension(fullPath) + ".Payloads"); + packageGroup.SetAttribute("Id", Path.GetFileNameWithoutExtension(fullPath) + ".Packages"); + try + { + doc.Save(fullPath); + } + catch (Exception e) + { + // e.Message will be something like: "Access to the path 'fullPath' is denied." + this.Log.LogMessage(MessageImportance.High, "Unable to save generated file to '{0}'. {1}", fullPath, e.Message); + } + } + + return true; + } + } +} -- cgit v1.2.3-55-g6feb