Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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");
                }
            }
        }