Allow argument chaining.

Example to extract test.gma into test and afterwards overwriting test.gma using files in test2:
  gmadsharp extract test.gma test create test2 test.gma
lua-bytecode
Icedream 2014-12-11 03:39:31 +01:00
parent ca52705a04
commit d7661343bb
1 changed files with 120 additions and 109 deletions

View File

@ -2,6 +2,7 @@
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using GarrysMod.AddonCreator.Addon;
namespace GarrysMod.AddonCreator
@ -10,128 +11,138 @@ namespace GarrysMod.AddonCreator
{
private static void Main(string[] args)
{
switch (args.Length == 0 ? "" : args[0])
while (args.Any())
{
case "create":
switch (args.Length == 0 ? "" : args[0])
{
if (args.Length < 3)
case "create":
{
goto default;
}
var folder = new DirectoryInfo(args[1]);
var output = args[2];
var addon = new AddonFile();
if (!folder.Exists)
{
Console.Error.WriteLine(
"ERROR: Input folder needs to exist and needs to contain appropriate data.");
return;
}
// recursively add files
foreach (var file in folder.EnumerateFiles("*", SearchOption.AllDirectories))
{
var relpath =
MakeRelativePath(folder.FullName, file.FullName).Replace(Path.DirectorySeparatorChar, '/');
Console.WriteLine("Adding: {0}", relpath);
addon.Files.Add(relpath, new PhysicalAddonFileInfo(file.FullName));
}
// create addon
Console.WriteLine("Exporting addon...");
addon.Export(output);
Console.WriteLine("Done.");
break;
}
case "extract":
{
if (args.Length < 3)
{
goto default;
}
var gma = args[1];
var folder = new DirectoryInfo(args[2]);
if (!File.Exists(gma))
{
Console.Error.WriteLine("ERROR: Input GMA file needs to exist.");
return;
}
var addon = new AddonFile();
try
{
addon.Import(gma);
}
catch (Exception err)
{
Console.Error.WriteLine("ERROR: Input GMA file could not be read - {0}", err.Message);
#if DEBUG
Debugger.Break();
#endif
return;
}
Console.WriteLine("## Addon information ##");
Console.WriteLine(addon.Title);
Console.WriteLine("\tVersion {0}", addon.Version);
Console.WriteLine("\tby {0}", addon.Author);
Console.WriteLine();
Console.WriteLine(addon.Description);
Console.WriteLine();
// extract files
foreach (var file in addon.Files)
{
var relpath = file.Key;
var targetFile =
new FileInfo(Path.Combine(folder.FullName, relpath.Replace('/', Path.DirectorySeparatorChar)));
Console.WriteLine("Extracting: {0}", relpath);
// create directory
var dir = targetFile.Directory;
if (dir == null)
continue; // I still need to think about the weird logic here
dir.Create();
// create file
using (var fs = targetFile.Create())
if (args.Length < 3)
{
var buffer = file.Value.GetContents();
goto default;
}
// long-compatible copy algorithm
for (long i = 0; i < buffer.LongLength; i += int.MaxValue)
var folder = new DirectoryInfo(args[1]);
var output = args[2];
var addon = new AddonFile();
if (!folder.Exists)
{
Console.Error.WriteLine(
"ERROR: Input folder needs to exist and needs to contain appropriate data.");
return;
}
// recursively add files
foreach (var file in folder.EnumerateFiles("*", SearchOption.AllDirectories))
{
var relpath =
MakeRelativePath(folder.FullName, file.FullName)
.Replace(Path.DirectorySeparatorChar, '/');
addon.Files.Add(relpath, new PhysicalAddonFileInfo(file.FullName));
}
// create addon
Console.WriteLine("Exporting addon...");
addon.Export(output);
Console.WriteLine("Done.");
args = args.Skip(3).ToArray();
break;
}
case "extract":
{
if (args.Length < 3)
{
goto default;
}
var gma = args[1];
var folder = new DirectoryInfo(args[2]);
if (!File.Exists(gma))
{
Console.Error.WriteLine("ERROR: Input GMA file needs to exist.");
return;
}
var addon = new AddonFile();
try
{
addon.Import(gma);
}
catch (Exception err)
{
Console.Error.WriteLine("ERROR: Input GMA file could not be read - {0}", err.Message);
#if DEBUG
Debugger.Break();
#endif
return;
}
Console.WriteLine("## Addon information ##");
Console.WriteLine(addon.Title);
Console.WriteLine("\tVersion {0}", addon.Version);
Console.WriteLine("\tby {0}", addon.Author);
Console.WriteLine();
Console.WriteLine(addon.Description);
Console.WriteLine();
// extract files
foreach (var file in addon.Files)
{
var relpath = file.Key;
var targetFile =
new FileInfo(Path.Combine(folder.FullName,
relpath.Replace('/', Path.DirectorySeparatorChar)));
Console.WriteLine("Extracting: {0}", relpath);
// create directory
var dir = targetFile.Directory;
if (dir == null)
continue; // I still need to think about the weird logic here
dir.Create();
// create file
using (var fs = targetFile.Create())
{
var toWrite = (int) Math.Min(int.MaxValue, buffer.LongLength - i);
var toWriteBuf = buffer.AsEnumerable();
for (long j = 0; j < i; j += int.MaxValue)
var buffer = file.Value.GetContents();
// long-compatible copy algorithm
for (long i = 0; i < buffer.LongLength; i += int.MaxValue)
{
toWriteBuf = toWriteBuf.Skip(int.MaxValue);
var toWrite = (int) Math.Min(int.MaxValue, buffer.LongLength - i);
var toWriteBuf = buffer.AsEnumerable();
for (long j = 0; j < i; j += int.MaxValue)
{
toWriteBuf = toWriteBuf.Skip(int.MaxValue);
}
fs.Write(toWriteBuf.ToArray(), 0, toWrite);
}
fs.Write(toWriteBuf.ToArray(), 0, toWrite);
fs.Flush();
}
}
Console.WriteLine("Done.");
args = args.Skip(3).ToArray();
break;
}
Console.WriteLine("Done.");
break;
default:
Console.WriteLine("Usage: {0} <command> <arguments>", Process.GetCurrentProcess().ProcessName);
Console.WriteLine();
Console.WriteLine("Commands:");
Console.WriteLine("\t{0}\t{1}", "extract", "Extracts a GMA file and shows information about it.");
Console.WriteLine("\t\tArguments: Input GMA file path, output folder path");
Console.WriteLine("\t{0}\t{1}", "create", "Creates a GMA file.");
Console.WriteLine("\t\tArguments: Input folder path, output GMA file path");
Console.WriteLine();
return;
}
default:
Console.WriteLine("Usage: {0} <command> <arguments>", Process.GetCurrentProcess().ProcessName);
Console.WriteLine();
Console.WriteLine("Commands:");
Console.WriteLine("\t{0}\t{1}", "extract", "Extracts a GMA file and shows information about it.");
Console.WriteLine("\t\tArguments: Input GMA file path, output folder path");
Console.WriteLine("\t{0}\t{1}", "create", "Creates a GMA file.");
Console.WriteLine("\t\tArguments: Input folder path, output GMA file path");
Console.WriteLine();
break;
}
}