-
Notifications
You must be signed in to change notification settings - Fork 5
/
Pack.cs
70 lines (57 loc) · 2.18 KB
/
Pack.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO.Compression;
using System.Text;
using Microsoft.Build.Framework;
namespace Memoria.MSBuild;
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
public sealed class Pack : ITask
{
public IBuildEngine BuildEngine { get; set; } = null!;
public ITaskHost HostObject { get; set; } = null!;
[Required] public String PublishDirectory { get; set; } = null!;
[Required] public String Configuration { get; set; } = null!;
public bool Execute()
{
// if (!Debugger.IsAttached)
// Debugger.Launch();
Stopwatch sw = Stopwatch.StartNew();
using (ZipArchive zip = CreateZipArchive())
{
foreach (String filePath in EnumerateFilesToPack())
{
String entryName = Path.GetFileName(filePath);
if (IsNotCurrentConfigurationFile(entryName))
continue;
PackFile(zip, filePath, entryName);
}
}
sw.Stop();
BuildEngine.LogMessageEvent(new BuildMessageEventArgs($"{Configuration} packed in {sw.Elapsed}", null, nameof(Pack), MessageImportance.High));
return true;
}
private ZipArchive CreateZipArchive()
{
String zipName = $"{Configuration}_v{DateTime.Now:yyyy.MM.dd}.zip";
String zipPath = Path.Combine(PublishDirectory, zipName);
ZipArchive zip = ZipFile.Open(zipPath, ZipArchiveMode.Create, Encoding.UTF8);
return zip;
}
private IEnumerable<String> EnumerateFilesToPack()
{
return Directory.EnumerateFiles(PublishDirectory, "*.dll");
}
private Boolean IsNotCurrentConfigurationFile(String fileName)
{
return fileName.StartsWith("Memoria.") && !fileName.EndsWith($"{Configuration}.dll");
}
private static void PackFile(ZipArchive zip, String filePath, String entryName)
{
using (FileStream input = File.OpenRead(filePath))
{
ZipArchiveEntry entry = zip.CreateEntry($"BepInEx/plugins/{entryName}", CompressionLevel.Optimal);
using (Stream output = entry.Open())
input.CopyTo(output);
}
}
}