mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
Cleanup and overhaul (#21)
* Syntax cleanup * More minor cleanup, use Linq * Fix broken features by using correct values * Feature flags the same * Features are modular * No AlphaFS, more .NET versions * Fix appveyor * Put back identifiers, for some reason * String interpolation, modernization * Better use of GetField * XmlTextWriter to remove possible issues * Fix header for OpenMSX
This commit is contained in:
@@ -1,17 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using SabreTools.Library.Data;
|
||||
using SabreTools.Library.Help;
|
||||
using SabreTools.Library.Tools;
|
||||
|
||||
#if MONO
|
||||
using System.IO;
|
||||
#else
|
||||
using Alphaleonis.Win32.Filesystem;
|
||||
#endif
|
||||
|
||||
namespace RombaSharp
|
||||
{
|
||||
/// <summary>
|
||||
@@ -43,8 +36,8 @@ namespace RombaSharp
|
||||
private static int _port; // Web server port
|
||||
|
||||
// Other private variables
|
||||
private static string _config = "config.xml";
|
||||
private static string _dbSchema = "rombasharp";
|
||||
private const string _config = "config.xml";
|
||||
private const string _dbSchema = "rombasharp";
|
||||
private static string _connectionString;
|
||||
private static Help _help;
|
||||
|
||||
@@ -96,289 +89,80 @@ namespace RombaSharp
|
||||
return;
|
||||
}
|
||||
|
||||
// User flags
|
||||
bool copy = false,
|
||||
fixdatOnly = false,
|
||||
logOnly = false,
|
||||
noDb = false,
|
||||
onlyNeeded = false,
|
||||
skipInitialScan = false,
|
||||
useGolangZip = false;
|
||||
|
||||
// User inputs
|
||||
string backup = "",
|
||||
description = "",
|
||||
missingSha1s = "",
|
||||
name = "",
|
||||
newdat = "",
|
||||
old = "",
|
||||
outdat = "",
|
||||
resume = "",
|
||||
source = "";
|
||||
int include7Zips = 1,
|
||||
includeGZips = 1,
|
||||
includeZips = 1,
|
||||
subworkers = 0,
|
||||
workers = 0;
|
||||
long size = -1;
|
||||
List<string> dats = new List<string>();
|
||||
List<string> depot = new List<string>();
|
||||
List<string> inputs = new List<string>();
|
||||
|
||||
// Get the first argument as a feature flag
|
||||
string feature = args[0];
|
||||
string featureName = args[0];
|
||||
|
||||
// Verify that the flag is valid
|
||||
if (!_help.TopLevelFlag(feature))
|
||||
if (!_help.TopLevelFlag(featureName))
|
||||
{
|
||||
Globals.Logger.User("'{0}' is not valid feature flag", feature);
|
||||
_help.OutputIndividualFeature(feature);
|
||||
Globals.Logger.User($"'{featureName}' is not valid feature flag");
|
||||
_help.OutputIndividualFeature(featureName);
|
||||
Globals.Logger.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now get the proper name for the feature
|
||||
feature = _help.GetFeatureName(feature);
|
||||
// Get the proper name for the feature
|
||||
featureName = _help.GetFeatureName(featureName);
|
||||
|
||||
// Get the associated feature
|
||||
RombaSharpFeature feature = _help[featureName] as RombaSharpFeature;
|
||||
|
||||
// If we had the help feature first
|
||||
if (feature == "Help")
|
||||
if (featureName == HelpFeature.Value || featureName == DetailedHelpFeature.Value)
|
||||
{
|
||||
// If we had something else after help
|
||||
if (args.Length > 1)
|
||||
{
|
||||
_help.OutputIndividualFeature(args[1]);
|
||||
Globals.Logger.Close();
|
||||
return;
|
||||
}
|
||||
// Otherwise, show generic help
|
||||
else
|
||||
{
|
||||
_help.OutputGenericHelp();
|
||||
Globals.Logger.Close();
|
||||
return;
|
||||
}
|
||||
feature.ProcessArgs(args, _help);
|
||||
Globals.Logger.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now verify that all other flags are valid
|
||||
for (int i = 1; i < args.Length; i++)
|
||||
if (!feature.ProcessArgs(args, _help))
|
||||
{
|
||||
// Verify that the current flag is proper for the feature
|
||||
if (!_help[feature].ValidateInput(args[i]))
|
||||
{
|
||||
// Everything else is treated as a generic input
|
||||
inputs.Add(args[i]);
|
||||
}
|
||||
Globals.Logger.Close();
|
||||
return;
|
||||
}
|
||||
|
||||
// Now loop through all inputs
|
||||
// Now process the current feature
|
||||
Dictionary<string, Feature> features = _help.GetEnabledFeatures();
|
||||
foreach (KeyValuePair<string, Feature> feat in features)
|
||||
switch (featureName)
|
||||
{
|
||||
// Check all of the flag names and translate to arguments
|
||||
switch (feat.Key)
|
||||
{
|
||||
#region User Flags
|
||||
|
||||
case "copy":
|
||||
copy = true;
|
||||
break;
|
||||
case "fixdatOnly":
|
||||
fixdatOnly = true;
|
||||
break;
|
||||
case "log-only":
|
||||
logOnly = true;
|
||||
break;
|
||||
case "no-db":
|
||||
noDb = true;
|
||||
break;
|
||||
case "only-needed":
|
||||
onlyNeeded = true;
|
||||
break;
|
||||
case "skip-initial-scan":
|
||||
skipInitialScan = true;
|
||||
break;
|
||||
case "use-golang-zip":
|
||||
useGolangZip = true;
|
||||
break;
|
||||
|
||||
#endregion
|
||||
|
||||
#region User Int32 Inputs
|
||||
|
||||
case "include-7zips":
|
||||
include7Zips = (int)feat.Value.GetValue() == Int32.MinValue ? (int)feat.Value.GetValue() : 0;
|
||||
break;
|
||||
case "include-gzips":
|
||||
includeGZips = (int)feat.Value.GetValue() == Int32.MinValue ? (int)feat.Value.GetValue() : 0;
|
||||
break;
|
||||
case "include-zips":
|
||||
includeZips = (int)feat.Value.GetValue() == Int32.MinValue ? (int)feat.Value.GetValue() : 0;
|
||||
break;
|
||||
case "subworkers":
|
||||
subworkers = (int)feat.Value.GetValue() == Int32.MinValue ? (int)feat.Value.GetValue() : _cores;
|
||||
break;
|
||||
case "workers":
|
||||
workers = (int)feat.Value.GetValue() == Int32.MinValue ? (int)feat.Value.GetValue() : _cores;
|
||||
break;
|
||||
|
||||
#endregion
|
||||
|
||||
#region User Int64 Inputs
|
||||
|
||||
case "size":
|
||||
size = (long)feat.Value.GetValue() == Int64.MinValue ? (long)feat.Value.GetValue() : 0;
|
||||
break;
|
||||
|
||||
#endregion
|
||||
|
||||
#region User List<string> Inputs
|
||||
|
||||
case "dats":
|
||||
dats.AddRange((List<string>)feat.Value.GetValue());
|
||||
break;
|
||||
case "depot":
|
||||
depot.AddRange((List<string>)feat.Value.GetValue());
|
||||
break;
|
||||
|
||||
#endregion
|
||||
|
||||
#region User String Inputs
|
||||
|
||||
case "backup":
|
||||
backup = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "description":
|
||||
description = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "missingSha1s":
|
||||
missingSha1s = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "name":
|
||||
name = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "new":
|
||||
newdat = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "old":
|
||||
old = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "out":
|
||||
outdat = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "resume":
|
||||
resume = (string)feat.Value.GetValue();
|
||||
break;
|
||||
case "source":
|
||||
source = (string)feat.Value.GetValue();
|
||||
break;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
// Now take care of each mode in succesion
|
||||
switch(feature)
|
||||
{
|
||||
case "Help":
|
||||
case DetailedHelpFeature.Value:
|
||||
case HelpFeature.Value:
|
||||
case ScriptFeature.Value:
|
||||
// No-op as this should be caught
|
||||
break;
|
||||
// Adds ROM files from the specified directories to the ROM archive
|
||||
case "Archive":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitArchive(inputs, onlyNeeded, resume, includeZips, workers, includeGZips, include7Zips, skipInitialScan, useGolangZip, noDb);
|
||||
|
||||
// Require input verification
|
||||
case ArchiveFeature.Value:
|
||||
case BuildFeature.Value:
|
||||
case DatStatsFeature.Value:
|
||||
case FixdatFeature.Value:
|
||||
case ImportFeature.Value:
|
||||
case LookupFeature.Value:
|
||||
case MergeFeature.Value:
|
||||
case MissFeature.Value:
|
||||
case RescanDepotsFeature.Value:
|
||||
VerifyInputs(feature.Inputs, featureName);
|
||||
feature.ProcessFeatures(features);
|
||||
break;
|
||||
// For each specified DAT file it creates the torrentzip files
|
||||
case "Build":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitBuild(inputs, outdat, fixdatOnly, copy, workers, subworkers);
|
||||
break;
|
||||
// Cancels current long-running job
|
||||
case "Cancel":
|
||||
InitCancel();
|
||||
break;
|
||||
// Prints dat stats
|
||||
case "DatStats":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitDatStats(inputs);
|
||||
break;
|
||||
// Prints db stats
|
||||
case "DbStats":
|
||||
InitDbStats();
|
||||
break;
|
||||
// Creates a DAT file with those entries that are in -new DAT
|
||||
case "Diffdat":
|
||||
InitDiffDat(outdat, old, newdat, name, description);
|
||||
break;
|
||||
// Creates a DAT file for the specified input directory and saves it to the -out filename
|
||||
case "Dir2Dat":
|
||||
InitDir2Dat(outdat, source, name, description);
|
||||
break;
|
||||
// Creates a DAT file with those entries that are in -new DAT
|
||||
case "EDiffdat":
|
||||
InitEDiffDat(outdat, old, newdat);
|
||||
break;
|
||||
// Exports db to export.csv
|
||||
case "Export":
|
||||
InitExport();
|
||||
break;
|
||||
// For each specified DAT file it creates a fix DAT
|
||||
case "Fixdat":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitFixdat(inputs, outdat, fixdatOnly, workers, subworkers);
|
||||
break;
|
||||
// Import a database from a formatted CSV file
|
||||
case "Import":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitImport(inputs);
|
||||
break;
|
||||
// For each specified hash it looks up any available information
|
||||
case "Lookup":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitLookup(inputs, size, outdat);
|
||||
break;
|
||||
// Prints memory stats
|
||||
case "Memstats":
|
||||
InitMemstats();
|
||||
break;
|
||||
// Merges depot
|
||||
case "Merge":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitMerge(inputs, onlyNeeded, resume, workers, skipInitialScan);
|
||||
break;
|
||||
// Create miss and have file
|
||||
case "Miss":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitMiss(inputs);
|
||||
break;
|
||||
// Shows progress of the currently running command
|
||||
case "Progress":
|
||||
InitProgress();
|
||||
break;
|
||||
// Moves DAT index entries for orphaned DATs
|
||||
case "Purge Backup":
|
||||
InitPurgeBackup(backup, workers, depot, dats, logOnly);
|
||||
break;
|
||||
// Deletes DAT index entries for orphaned DATs
|
||||
case "Purge Delete":
|
||||
InitPurgeDelete(workers, depot, dats, logOnly);
|
||||
break;
|
||||
// Refreshes the DAT index from the files in the DAT master directory tree
|
||||
case "Refresh DATs":
|
||||
InitRefreshDats(workers, missingSha1s);
|
||||
break;
|
||||
// Rescan a specific depot
|
||||
case "Rescan Depots":
|
||||
VerifyInputs(inputs, feature);
|
||||
InitRescanDepots(inputs);
|
||||
break;
|
||||
// Gracefully shuts down server
|
||||
case "Shutdown":
|
||||
InitShutdown();
|
||||
break;
|
||||
// Prints version
|
||||
case "Version":
|
||||
InitVersion();
|
||||
|
||||
// Requires no input verification
|
||||
case CancelFeature.Value:
|
||||
case DbStatsFeature.Value:
|
||||
case DiffdatFeature.Value:
|
||||
case Dir2DatFeature.Value:
|
||||
case EDiffdatFeature.Value:
|
||||
case ExportFeature.Value:
|
||||
case MemstatsFeature.Value:
|
||||
case ProgressFeature.Value:
|
||||
case PurgeBackupFeature.Value:
|
||||
case PurgeDeleteFeature.Value:
|
||||
case RefreshDatsFeature.Value:
|
||||
case ShutdownFeature.Value:
|
||||
case VersionFeature.Value:
|
||||
feature.ProcessFeatures(features);
|
||||
break;
|
||||
|
||||
// If nothing is set, show the help
|
||||
default:
|
||||
_help.OutputGenericHelp();
|
||||
|
||||
Reference in New Issue
Block a user