public override void Run() { var items = new List <WorkItem>(); foreach (var(file, relPath) in PatchTask.EnumerateSrcFiles(patchedDir)) { if (File.GetLastWriteTime(file) < cutoff.Get()) { continue; } if (!File.Exists(Path.Combine(baseDir, relPath))) { items.Add(new WorkItem("Copying: " + relPath, () => Copy(file, Path.Combine(patchDir, relPath)))); } else if (IsDiffable(relPath)) { items.Add(new WorkItem("Diffing: " + relPath, () => Diff(relPath))); } } ExecuteParallel(items); taskInterface.SetStatus("Deleting Unnecessary Patches"); foreach (var(file, relPath) in EnumerateFiles(patchDir)) { var targetPath = relPath.EndsWith(".patch") ? relPath.Substring(0, relPath.Length - 6) : relPath; if (!File.Exists(Path.Combine(patchedDir, targetPath))) { DeleteFile(file); } } DeleteEmptyDirs(patchDir); taskInterface.SetStatus("Nothing Removed Files"); var removedFiles = PatchTask.EnumerateSrcFiles(baseDir) .Where(f => !File.Exists(Path.Combine(patchedDir, f.relPath))) .Select(f => f.relPath) .ToArray(); var removedFileList = Path.Combine(patchDir, RemovedFileList); if (removedFiles.Length > 0) { File.WriteAllLines(removedFileList, removedFiles); } else { DeleteFile(removedFileList); } cutoff.Set(DateTime.Now); }
public static bool SelectTerrariaDialog() { while (true) { var dialog = new OpenFileDialog { InitialDirectory = Path.GetFullPath(Directory.Exists(SteamDir.Get()) ? SteamDir.Get() : Program.baseDir), Filter = "Terraria|Terraria.exe", Title = "Select Terraria.exe" }; if (dialog.ShowDialog() != DialogResult.OK) { return(false); } string err = null; if (Path.GetFileName(dialog.FileName) != "Terraria.exe") { err = "File must be named Terraria.exe"; } else if (!File.Exists(Path.Combine(Path.GetDirectoryName(dialog.FileName), "TerrariaServer.exe"))) { err = "TerrariaServer.exe does not exist in the same directory"; } if (err != null) { if (MessageBox.Show(err, "Invalid Selection", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Cancel) { return(false); } } else { SteamDir.Set(Path.GetDirectoryName(dialog.FileName)); return(true); } } }
public override void Run() { var patchFiles = new HashSet <string>( Directory.EnumerateFiles(FullPatchDir, "*", SearchOption.AllDirectories) .Select(file => RelPath(FullPatchDir, file))); var oldFiles = new HashSet <string>( Directory.EnumerateFiles(FullBaseDir, "*", SearchOption.AllDirectories) .Select(file => RelPath(FullBaseDir, file)) .Where(relPath => !relPath.EndsWith(".patch") && !excluded.Any(relPath.StartsWith))); var items = new List <WorkItem>(); foreach (var file in Directory.EnumerateFiles(FullSrcDir, "*", SearchOption.AllDirectories)) { var relPath = RelPath(FullSrcDir, file); oldFiles.Remove(relPath); if (!extensions.Any(relPath.EndsWith)) { continue; } patchFiles.Remove(relPath); patchFiles.Remove(relPath + ".patch"); if (excluded.Any(relPath.StartsWith) || File.GetLastWriteTime(file) < cutoff.Get()) { continue; } items.Add(File.Exists(Path.Combine(FullBaseDir, relPath)) ? new WorkItem("Creating Diff: " + relPath, () => Diff(relPath)) : new WorkItem("Copying: " + relPath, () => Copy(file, Path.Combine(FullPatchDir, relPath)))); } ExecuteParallel(items); taskInterface.SetStatus("Deleting Unnessesary Patches"); foreach (var file in patchFiles) { File.Delete(Path.Combine(FullPatchDir, file)); } taskInterface.SetStatus("Noting Removed Files"); var removedFileList = Path.Combine(FullPatchDir, RemovedFileList); if (oldFiles.Count > 0) { File.WriteAllText(removedFileList, string.Join("\r\n", oldFiles)); } else if (File.Exists(removedFileList)) { File.Delete(removedFileList); } cutoff.Set(DateTime.Now); }
public override void Run() { taskInterface.SetStatus("Deleting Old Src"); if (Directory.Exists(FullSrcDir)) { Directory.Delete(FullSrcDir, true); } var resolver = new EmbeddedAssemblyResolver(); var readParams = new ReaderParameters() { AssemblyResolver = resolver }; taskInterface.CancellationToken().ThrowIfCancellationRequested(); taskInterface.SetStatus("Loading Terraria.exe"); clientModule = ModuleDefinition.ReadModule(TerrariaPath, readParams); taskInterface.CancellationToken().ThrowIfCancellationRequested(); taskInterface.SetStatus("Loading TerrariaServer.exe"); serverModule = ModuleDefinition.ReadModule(TerrariaServerPath, readParams); resolver.baseModule = clientModule; VersionCheck(clientModule.Assembly); VersionCheck(serverModule.Assembly); var options = new DecompilationOptions { FullDecompilation = true, CancellationToken = taskInterface.CancellationToken(), SaveAsProjectDirectory = FullSrcDir }; var clientSources = GetCodeFiles(clientModule, options).ToList(); var serverSources = GetCodeFiles(serverModule, options).ToList(); var clientResources = GetResourceFiles(clientModule, options).ToList(); var serverResources = GetResourceFiles(serverModule, options).ToList(); var sources = CombineFiles(clientSources, serverSources, src => src.Key); var resources = CombineFiles(clientResources, serverResources, res => res.Item1); var items = new List <WorkItem>(); items.AddRange(sources.Select(src => new WorkItem( "Decompiling: " + src.Key, () => DecompileSourceFile(src, options)))); items.AddRange(resources.Select(res => new WorkItem( "Extracting: " + res.Item1, () => ExtractResource(res, options)))); items.Add(new WorkItem("Writing Assembly Info", () => WriteAssemblyInfo(clientModule, options))); items.Add(new WorkItem("Writing Terraria" + lang.ProjectFileExtension, () => WriteProjectFile(clientModule, clientGuid, clientSources, clientResources, options))); items.Add(new WorkItem("Writing TerrariaServer" + lang.ProjectFileExtension, () => WriteProjectFile(serverModule, serverGuid, serverSources, serverResources, options))); items.Add(new WorkItem("Writing Terraria" + lang.ProjectFileExtension + ".user", () => WriteProjectUserFile(clientModule, SteamDir.Get(), options))); items.Add(new WorkItem("Writing TerrariaServer" + lang.ProjectFileExtension + ".user", () => WriteProjectUserFile(serverModule, SteamDir.Get(), options))); ExecuteParallel(items, maxDegree: SingleDecompileThread.Get() ? 1 : 0); }
public override void Run() { List <string> patchesFiles = new List <string>(); // (Directory.EnumerateFiles(FullPatchDir, "*", SearchOption.AllDirectories)); foreach (var file in Directory.EnumerateFiles(FullPatchDir, "*", SearchOption.AllDirectories)) { patchesFiles.Add(RelPath(FullPatchDir, file)); } //if (Directory.Exists(FullPatchDir)) // Directory.Delete(FullPatchDir, true); var files = Directory.EnumerateFiles(FullSrcDir, "*", SearchOption.AllDirectories).Where(f => extensions.Any(f.EndsWith)); var items = new List <WorkItem>(); foreach (var file in files) { var relPath = RelPath(FullSrcDir, file); patchesFiles.Remove(relPath); patchesFiles.Remove(relPath + ".patch"); if (excluded.Any(relPath.StartsWith)) { continue; } //bool skip = false; if ((stepNumber == 0 && (File.GetLastWriteTime(file) < MergedDiffCutoff.Get())) || (stepNumber == 1 && (File.GetLastWriteTime(file) < TerrariaDiffCutoff.Get())) || (stepNumber == 2 && (File.GetLastWriteTime(file) < tModLoaderDiffCutoff.Get()))) { continue; } //skip = true; //if (!skip) items.Add(File.Exists(Path.Combine(FullBaseDir, relPath)) ? new WorkItem("Creating Diff: " + relPath, () => Diff(relPath)) : new WorkItem("Copying: " + relPath, () => Copy(file, Path.Combine(FullPatchDir, relPath)))); } ExecuteParallel(items); taskInterface.SetStatus("Deleting Unnessesary Patches"); foreach (string file in patchesFiles) { File.Delete(file); } switch (stepNumber) { case 0: MergedDiffCutoff.Set(DateTime.Now); break; case 1: TerrariaDiffCutoff.Set(DateTime.Now); break; case 2: tModLoaderDiffCutoff.Set(DateTime.Now); break; } }