private static void DcsRevert(ElevatedProcessResponsePipe response, string outputRoot, IEnumerable <string> patchFolders) { PatchList patches = LoadPatches(patchFolders); if (!InstallationLocation.TryLoadLocation(outputRoot, true, out InstallationLocation location)) { ReportBadLocation(response, outputRoot); return; } PatchDestination dcs = new PatchDestination(location); HashSet <string> patchExclusions = PatchInstallation.LoadPatchExclusions(); IList <StatusReportItem> results = patches.Revert(dcs, patchExclusions).ToList(); response.SendReport(results); }
private static void EditInstallation(string dcsRootPath, string jsonDirPath) { if (jsonDirPath == null) { if (!FileSystem.TryFindNearestDirectory("Tools\\ToolsCommon\\Data\\Viewports", out jsonDirPath)) { jsonDirPath = FileSystem.FindNearestDirectory("Data\\Viewports"); } } // open DCS installation location if (!InstallationLocation.TryLoadLocation(dcsRootPath, true, out InstallationLocation dcs)) { throw new Exception($"failed to open DCS installation at {dcsRootPath}"); } // pick JSON file from the given ones based on version number string exactName = $"ViewportTemplates_{PatchVersion.SortableString(dcs.Version)}.json"; string versionedJsonPath = ""; foreach (string candidate in Directory.EnumerateFiles(jsonDirPath, "ViewportTemplates_*.json", SearchOption.AllDirectories)) { string candidateName = Path.GetFileName(candidate); if (string.Compare(candidateName, exactName, StringComparison.InvariantCulture) > 0) { continue; } // applies if (string.Compare(candidateName, versionedJsonPath, StringComparison.InvariantCulture) > 0) { // new best match versionedJsonPath = candidate; } } string json = File.ReadAllText(Path.Combine(jsonDirPath, "ViewportTemplates.json")); List <ViewportTemplate> templates = JsonConvert.DeserializeObject <ViewportTemplate[]>(json).ToList(); if (versionedJsonPath == "") { ConfigManager.LogManager.LogInfo($"no ViewportTemplates_*.json file found that is applicable to selected DCS version {dcs.Version}"); } else { // read version specific changes and replace any entries by ModuleId string changesText = File.ReadAllText(versionedJsonPath); List <ViewportTemplate> changes = JsonConvert.DeserializeObject <ViewportTemplate[]>(changesText).ToList(); templates = templates.GroupJoin(changes, t => t.TemplateName, c => c.TemplateName, (original, applicableChanges) => applicableChanges.FirstOrDefault() ?? original).ToList(); } // get DCS location from the Helios utility that manages DCS install locations (have to use Profile Editor to configure it, either running dev build or start with --documents HeliosDev) string documentPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "HeliosDev"); if (!Directory.Exists(documentPath)) { documentPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Helios"); } HeliosInit.Initialize(documentPath, "EditViewports.log", LogLevel.Debug); ConfigManager.LogManager.LogInfo($"Editing viewport in DCS distribution {dcs.Path} of Version {dcs.Version}"); ConfigManager.LogManager.LogInfo($"Selected ViewportTemplates file {versionedJsonPath}"); PatchDestination destination = new PatchDestination(dcs); EditFilesInDestination(templates, destination); HeliosInit.OnShutdown(); }
private static void EditFilesInDestination(List <ViewportTemplate> templates, PatchDestination destination) { if (!destination.TryLock()) { throw new Exception($"cannot acquire lock on {destination.LongDescription} to edit viewports"); } try { foreach (ViewportTemplate template in templates) { foreach (Viewport viewport in template.Viewports.Where(v => v.IsValid)) { if (null == viewport.RelativeInitFilePath) { ConfigManager.LogManager.LogDebug($"viewport {viewport.ViewportName} has no file path; ignoring"); continue; } if (!destination.TryGetSource(viewport.RelativeInitFilePath, out string source)) { ConfigManager.LogManager.LogDebug( $"'{viewport.RelativeInitFilePath}' does not exist in target destination; ignoring patch"); continue; } string patched = EditCode(template, viewport, source); if (source == patched) { ConfigManager.LogManager.LogDebug($"'{viewport.RelativeInitFilePath}' is unchanged"); continue; } ConfigManager.LogManager.LogDebug($"----------------------- {viewport.RelativeInitFilePath} ---------------------"); ConfigManager.LogManager.LogDebug(patched); ConfigManager.LogManager.LogDebug($"======================= {viewport.RelativeInitFilePath} ====================="); if (!destination.TryWritePatched(viewport.RelativeInitFilePath, patched)) { throw new Exception( $"'{viewport.RelativeInitFilePath}' could not be written to target destination after edit"); } } } } finally { if (!destination.TryUnlock()) { Debug.Fail($"cannot release lock on {destination.LongDescription} after editing viewports"); } } }