private static void RestoreManifest(Application app) { try { string manifest = null; if (!app.TryGetParam("manifest", out manifest)) { Console.Error.WriteLine("--manifest is required."); Environment.Exit(1); } Console.WriteLine($"Looking for cached version of {Path.GetFileName(manifest)}..."); var cachedFilePath = Path.GetFullPath(Path.Combine("cache", Path.GetFileName(manifest))); if (!File.Exists(cachedFilePath)) { Console.Error.WriteLine("\tThis manifest has not been cahced."); Environment.Exit(4); } Console.WriteLine("\tFound cached file"); Console.WriteLine("Restoring cached file..."); File.Copy(cachedFilePath, manifest, true); Console.WriteLine("\tRestored cached file"); Console.WriteLine("Removing cached file..."); File.Delete(cachedFilePath); Console.WriteLine("\tCached file removed"); Console.WriteLine("\nFinished!"); } catch (Exception e) { Console.Error.WriteLine($"{e.Message}\n{e.StackTrace}"); Environment.Exit(3); } }
private static void UpdateManifest(Application app) { try { string manifest = null; if (!app.TryGetParam("manifest", out manifest)) { Console.Error.WriteLine("--manifest is required."); Environment.Exit(1); } string config = null; if (!app.TryGetParam("config", out config)) { Console.Error.WriteLine("--config is required."); Environment.Exit(1); } string temp; bool forceCache = app.TryGetParam("forceCache", out temp); if (!File.Exists(manifest)) { Console.Error.WriteLine("Manifest file can not be found."); Environment.Exit(2); } if (!File.Exists(config)) { Console.Error.WriteLine("Config file can not be found."); Environment.Exit(2); } XDocument manifestDocument, configDocument; Console.WriteLine("Reading manifest file..."); using (XmlTextReader manifestReader = new XmlTextReader(manifest)) manifestDocument = XDocument.Load(manifestReader); Console.WriteLine("\tFinished reading manifest file"); Console.WriteLine("Reading config file..."); using (XmlTextReader configReader = new XmlTextReader(config)) configDocument = XDocument.Load(configReader); Console.WriteLine("\tFinished reading config file"); Console.WriteLine("Storing cahced version of manifest..."); if (!Directory.Exists("cache")) Directory.CreateDirectory("cache"); var cachedFilePath = Path.GetFullPath(Path.Combine("cache", Path.GetFileName(manifest))); try { File.Copy(manifest, cachedFilePath, forceCache); } catch { Console.WriteLine("\tA cached version already exists. To force new cache use --forceCache"); } if (!File.Exists(cachedFilePath)) { Console.Error.WriteLine("\tCaching manifest failed."); Environment.Exit(4); } Console.WriteLine("\tManifest cached"); Console.WriteLine("Merging config into manifest..."); var addElements = configDocument.Descendants().Where(e => e.Attribute(XName.Get("add", "http://schemas.omax.com/xml-merge")) != null); foreach (var element in addElements.ToArray()) { var addAttr = element.Attribute(XName.Get("add", "http://schemas.omax.com/xml-merge")); addAttr.Remove(); if (addAttr?.Value == "IfNotExist") { var conditionAttr = element.Attribute(XName.Get("condition", "http://schemas.omax.com/xml-merge")); conditionAttr.Remove(); string conditionValue = conditionAttr.Value[0] == '!' ? conditionAttr.Value.Substring(1) : conditionAttr.Value; bool negate = conditionAttr.Value[0] == '!'; var conditionElement = element.Descendants().Where(e => e.Attribute(XName.Get("newCondition", "http://schemas.omax.com/xml-merge"))?.Value == conditionValue).FirstOrDefault(); if (conditionElement == null) throw new Exception($"Could not find condition {conditionValue} in child elements."); conditionElement.Attribute(XName.Get("newCondition", "http://schemas.omax.com/xml-merge")).Remove(); bool shouldAdd = manifestDocument.Descendants(element.Name).Descendants(conditionElement.Name).Any(e => XNode.DeepEquals(e, conditionElement)); if (negate) shouldAdd = !shouldAdd; if (shouldAdd) { var e = manifestDocument.Descendants(element.Parent.Name).FirstOrDefault(); e.Add(element); } else { Console.WriteLine($"\tWarning: Did not merge element {element.Name}"); } } } Console.WriteLine("\tMerged manifest and config"); Console.WriteLine("Writing newly created merged manifest..."); manifestDocument.Save(manifest, SaveOptions.OmitDuplicateNamespaces); Console.WriteLine("\tFinished writing new manifest"); Console.WriteLine("\nFinished!"); } catch (Exception e) { Console.Error.WriteLine($"{e.Message}\n{e.StackTrace}"); Environment.Exit(3); } }