Record save file paths in manifest. Support regex pathing in upload

save-path-regex
Pat Hartl 2023-11-30 18:25:37 -06:00
parent eb73885991
commit 7c22aaa139
3 changed files with 57 additions and 27 deletions

View File

@ -13,6 +13,7 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using YamlDotNet.Serialization; using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NamingConventions;
@ -163,31 +164,42 @@ namespace LANCommander.SDK
#region Add files from defined paths #region Add files from defined paths
foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File")) foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File"))
{ {
var localPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory)); IEnumerable<string> localPaths;
if (Directory.Exists(localPath)) if (savePath.IsRegex)
{ {
AddDirectoryToZip(archive, localPath, localPath, savePath.Id); var regex = new Regex(Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory)));
localPaths = Directory.GetFiles(installDirectory, "*", SearchOption.AllDirectories)
.Where(p => regex.IsMatch(p))
.ToList();
} }
else if (File.Exists(localPath)) else
{ localPaths = new string[] { savePath.Path };
archive.AddEntry(Path.Combine(savePath.Id.ToString(), savePath.Path.Replace("{InstallDir}/", "")), localPath);
}
}
#endregion
#region Add files from defined paths var entries = new List<SavePathEntry>();
foreach (var savePath in manifest.SavePaths.Where(sp => sp.Type == "File"))
{
var localPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', '\\').Replace("{InstallDir}", installDirectory));
if (Directory.Exists(localPath)) foreach (var localPath in localPaths)
{ {
AddDirectoryToZip(archive, localPath, localPath, savePath.Id); var actualPath = Environment.ExpandEnvironmentVariables(savePath.Path.Replace('/', Path.DirectorySeparatorChar).Replace("{InstallDir}", installDirectory));
} var relativePath = actualPath.Replace(installDirectory + Path.DirectorySeparatorChar, "");
else if (File.Exists(localPath))
{ if (Directory.Exists(actualPath))
archive.AddEntry(Path.Combine(savePath.Id.ToString(), savePath.Path.Replace("{InstallDir}/", "")), localPath); {
AddDirectoryToZip(archive, relativePath, actualPath, savePath.Id);
}
else if (File.Exists(actualPath))
{
archive.AddEntry(Path.Combine(savePath.Id.ToString(), relativePath), actualPath);
}
entries.Add(new SavePathEntry
{
ArchivePath = relativePath,
ActualPath = actualPath.Replace(installDirectory, "{InstallDir}")
});
savePath.Entries = entries;
} }
} }
#endregion #endregion
@ -225,7 +237,11 @@ namespace LANCommander.SDK
} }
#endregion #endregion
archive.AddEntry("_manifest.yml", ManifestHelper.GetPath(installDirectory)); var tempManifest = Path.GetTempFileName();
File.WriteAllText(tempManifest, ManifestHelper.Serialize(manifest));
archive.AddEntry("_manifest.yml", tempManifest);
using (var ms = new MemoryStream()) using (var ms = new MemoryStream())
{ {

View File

@ -43,13 +43,7 @@ namespace LANCommander.SDK.Helpers
Logger?.LogTrace("Attempting to write manifest to path {Destination}", destination); Logger?.LogTrace("Attempting to write manifest to path {Destination}", destination);
var serializer = new SerializerBuilder() var yaml = Serialize(manifest);
.WithNamingConvention(new PascalCaseNamingConvention())
.Build();
Logger?.LogTrace("Serializing manifest");
var yaml = serializer.Serialize(manifest);
Logger?.LogTrace("Writing manifest file"); Logger?.LogTrace("Writing manifest file");
@ -58,6 +52,19 @@ namespace LANCommander.SDK.Helpers
return destination; return destination;
} }
public static string Serialize(GameManifest manifest)
{
var serializer = new SerializerBuilder()
.WithNamingConvention(new PascalCaseNamingConvention())
.Build();
Logger?.LogTrace("Serializing manifest");
var yaml = serializer.Serialize(manifest);
return yaml;
}
public static string GetPath(string installDirectory) public static string GetPath(string installDirectory)
{ {
return Path.Combine(installDirectory, ManifestFilename); return Path.Combine(installDirectory, ManifestFilename);

View File

@ -48,5 +48,12 @@ namespace LANCommander.SDK
public string Type { get; set; } public string Type { get; set; }
public string Path { get; set; } public string Path { get; set; }
public bool IsRegex { get; set; } public bool IsRegex { get; set; }
public IEnumerable<SavePathEntry> Entries { get; set; }
}
public class SavePathEntry
{
public string ArchivePath { get; set; }
public string ActualPath { get; set; }
} }
} }