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:
Matt Nadareski
2020-06-10 22:37:19 -07:00
committed by GitHub
parent f01e47444c
commit 4ad77d6be6
75 changed files with 6945 additions and 7249 deletions

View File

@@ -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();