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.gmalua-bytecode
parent
ca52705a04
commit
d7661343bb
|
@ -2,6 +2,7 @@
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using GarrysMod.AddonCreator.Addon;
|
using GarrysMod.AddonCreator.Addon;
|
||||||
|
|
||||||
namespace GarrysMod.AddonCreator
|
namespace GarrysMod.AddonCreator
|
||||||
|
@ -10,128 +11,138 @@ namespace GarrysMod.AddonCreator
|
||||||
{
|
{
|
||||||
private static void Main(string[] args)
|
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;
|
if (args.Length < 3)
|
||||||
}
|
|
||||||
|
|
||||||
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())
|
|
||||||
{
|
{
|
||||||
var buffer = file.Value.GetContents();
|
goto default;
|
||||||
|
}
|
||||||
|
|
||||||
// long-compatible copy algorithm
|
var folder = new DirectoryInfo(args[1]);
|
||||||
for (long i = 0; i < buffer.LongLength; i += int.MaxValue)
|
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 buffer = file.Value.GetContents();
|
||||||
var toWriteBuf = buffer.AsEnumerable();
|
|
||||||
for (long j = 0; j < i; j += int.MaxValue)
|
// 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.");
|
default:
|
||||||
break;
|
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue