From b76099ba7ad60c6e697d876b83088e4607c5dff8 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 26 Oct 2016 14:41:37 -0700 Subject: [PATCH] [SabreTools, README.1ST] Hook up and document level split --- SabreTools.Helper/Data/Build.cs | 4 +++ SabreTools.Helper/README.1ST | 12 ++++++--- SabreTools/Partials/SabreTools_Inits.cs | 35 +++++++++++++++++++++++++ SabreTools/SabreTools.cs | 15 +++++++++-- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/SabreTools.Helper/Data/Build.cs b/SabreTools.Helper/Data/Build.cs index f21e6116..d1f92017 100644 --- a/SabreTools.Helper/Data/Build.cs +++ b/SabreTools.Helper/Data/Build.cs @@ -200,6 +200,10 @@ namespace SabreTools.Helper.Data helptext.Add(" -hs, --hash-split Split a DAT or folder by best-available hashes"); helptext.Add(" -out= Output directory"); + // Level/SuperDAT Split + helptext.Add(" -ls, --lvl-split Split a SuperDAT or folder by internal path"); + helptext.Add(" -out= Output directory"); + // Sort helptext.Add(" -ss, --sort Sort input files by a set of DATs"); helptext.Add(" -dat= Input DAT to rebuild against"); diff --git a/SabreTools.Helper/README.1ST b/SabreTools.Helper/README.1ST index a5e447c1..99bcda6d 100644 --- a/SabreTools.Helper/README.1ST +++ b/SabreTools.Helper/README.1ST @@ -336,9 +336,15 @@ Options: This sets an output folder to be used when the files are created. If a path is not defined, the application directory is used instead. - -input= Set an input string - This should only be used if one of the inputs starts with a flag or another already - defined input. + -ls, --lvl-split Split a SuperDAT or folder by lowest available level + For a DAT, or set of DATs, allow for splitting based on the lowest available level + of game name. That is, if a game name is top/mid/last, then it will create + an output DAT for the parent directory "mid" in a folder called "top" with a game + called "last". + + -out= Set the name of the output directory + This sets an output folder to be used when the files are created. If a path + is not defined, the application directory is used instead. -ss, --sort Sort input files by a set of DATs This feature allows the user to quickly rebuild based on a supplied DAT file(s). By diff --git a/SabreTools/Partials/SabreTools_Inits.cs b/SabreTools/Partials/SabreTools_Inits.cs index f5062e85..f2689e74 100644 --- a/SabreTools/Partials/SabreTools_Inits.cs +++ b/SabreTools/Partials/SabreTools_Inits.cs @@ -244,6 +244,41 @@ namespace SabreTools } } + /// + /// Wrap splitting a SuperDAT by lowest available level + /// + /// List of inputs to be used + /// Output directory for the split files + private static void InitLevelSplit(List inputs, string outDir) + { + // Loop over the input files + foreach (string input in inputs) + { + if (File.Exists(input)) + { + DatFile datFile = new DatFile(); + datFile.Parse(Path.GetFullPath(input), 0, 0, _logger, softlist: true); + datFile.SplitByLevel(outDir, Path.GetDirectoryName(input), _logger); + } + else if (Directory.Exists(input)) + { + foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories)) + { + DatFile datFile = new DatFile(); + datFile.Parse(Path.GetFullPath(file), 0, 0, _logger, softlist: true); + datFile.SplitByLevel(outDir, (input.EndsWith(Path.DirectorySeparatorChar.ToString()) ? input : input + Path.DirectorySeparatorChar), _logger); + } + } + else + { + _logger.Error(input + " is not a valid file or folder!"); + Console.WriteLine(); + Build.Help("SabreTools"); + return; + } + } + } + /// /// Wrap sorting files using an input DAT /// diff --git a/SabreTools/SabreTools.cs b/SabreTools/SabreTools.cs index 75b7edef..e8f34cc9 100644 --- a/SabreTools/SabreTools.cs +++ b/SabreTools/SabreTools.cs @@ -56,6 +56,7 @@ namespace SabreTools sort = false, // SimpleSort splitByExt = false, splitByHash = false, + splitByLevel = false, splitByType = false, stats = false, update = false, @@ -169,6 +170,10 @@ namespace SabreTools case "--hash-split": splitByHash = true; break; + case "-ls": + case "--lvl-split": + splitByLevel = true; + break; case "-ss": case "--sort": sort = true; @@ -903,7 +908,7 @@ namespace SabreTools } // If more than one switch is enabled, show the help screen - if (!(datFromDir ^ headerer ^ sort ^ splitByExt ^ splitByHash ^ splitByType ^ stats ^ update ^ verify)) + if (!(datFromDir ^ headerer ^ sort ^ splitByExt ^ splitByHash ^ splitByLevel ^ splitByType ^ stats ^ update ^ verify)) { _logger.Error("Only one feature switch is allowed at a time"); Build.Help("SabreTools"); @@ -913,7 +918,7 @@ namespace SabreTools // If a switch that requires a filename is set and no file is, show the help screen if (inputs.Count == 0 - && (datFromDir || headerer || splitByExt || splitByHash || splitByType || stats || update)) + && (datFromDir || headerer || splitByExt || splitByHash || splitByLevel || splitByType || stats || update)) { _logger.Error("This feature requires at least one input"); Build.Help("SabreTools"); @@ -977,6 +982,12 @@ namespace SabreTools InitHashSplit(inputs, outDir); } + // Split a SuperDAT by lowest available level + else if (splitByLevel) + { + InitLevelSplit(inputs, outDir); + } + // Split a DAT by item type else if (splitByType) {