Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Packer/Extensions/ContentExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public static string LogToDebug(this string message)
/// <returns></returns>
public static string ComputeMD5(this Stream stream)
{
stream.Seek(0, SeekOrigin.Begin); // 确保文件流的位置被重置
stream.Position = 0; // 确保文件流的位置被重置
return Convert.ToHexString(MD5.Create().ComputeHash(stream));
}
}
Expand Down
16 changes: 16 additions & 0 deletions src/Packer/Extensions/FileInfoExtension.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Packer.Extensions;

internal static class FileInfoExtension
{
public static string ReadAllText(this FileInfo file)
{
using var stream = file.OpenText();
var text = stream.ReadToEnd();
return text;
}
}
18 changes: 9 additions & 9 deletions src/Packer/Helpers/ConfigHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ public static class ConfigHelpers
{
var configFile = directory.GetFiles("local-config.json").FirstOrDefault();

if (configFile is null) return null;
if (configFile is null)
return null;

configFile.FullName.LogToDebug("读取文件:{0}");

using var reader = configFile.OpenText();

return JsonSerializer.Deserialize<FloatingConfig>(
reader.ReadToEnd().LogToDebug(),
configFile.ReadAllText().LogToDebug(),
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
}

Expand All @@ -48,10 +48,11 @@ public static async Task<Config> RetrieveConfig(string configTemplate, string ve

Log.Information("配置位置:{0}", configPath);

var content = await File.ReadAllBytesAsync(configPath);
return JsonSerializer.Deserialize<Config>(
await using var content = File.OpenRead(configPath);

return (await JsonSerializer.DeserializeAsync<Config>(
content,
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!;
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }))!;
}

/// <summary>
Expand All @@ -72,9 +73,8 @@ public static List<PackerPolicy> RetrievePolicy(DirectoryInfo directory)

file.FullName.LogToDebug("读取文件:{0}");

using var reader = file.OpenText();
var result = JsonSerializer.Deserialize<List<PackerPolicy>>(
reader.ReadToEnd().LogToDebug(),
file.ReadAllText().LogToDebug(),
new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Expand Down
4 changes: 2 additions & 2 deletions src/Packer/Models/Config.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,9 @@ public class FloatingConfig
InclusionDomains = InclusionDomains.Concat(other.InclusionDomains).Distinct(),
InclusionPaths = InclusionPaths.Concat(other.InclusionPaths).Distinct(),
CharacterReplacement = CharacterReplacement.Concat(other.CharacterReplacement).DistinctBy(_ => _.Key)
.ToDictionary(_ => _.Key, _ => _.Value),
.ToDictionary(),
DestinationReplacement = DestinationReplacement.Concat(other.DestinationReplacement).DistinctBy(_ => _.Key)
.ToDictionary(_ => _.Key, _ => _.Value)
.ToDictionary()
};


Expand Down
2 changes: 1 addition & 1 deletion src/Packer/Models/IResourceFileProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public IResourceFileProvider ReplaceContent(string searchPattern, string replace
/// </summary>
/// <param name="archive"></param>
/// <exception cref="InvalidOperationException">资源包中已有同名文件</exception>
public Task WriteToArchive(ZipArchive archive);
public Task WriteToArchiveAsync(ZipArchive archive);

/// <summary>
/// 目标在资源包中的相对位置,从根目录算起
Expand Down
15 changes: 7 additions & 8 deletions src/Packer/Models/Providers/CompositionHelper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using Packer.Extensions;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
Expand All @@ -16,10 +17,9 @@ public static partial class LangMappingHelper
/// </summary>
/// <param name="file">组合文件</param>
public static LangMappingProvider CreateFromComposition(FileInfo file)
{
using var reader = file.OpenText();
{
var data = JsonSerializer.Deserialize<CompositionData>(
reader.ReadToEnd(),
file.ReadAllText(),
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
return new LangMappingProvider(
new LangDictionaryWrapper(CompositionHelper.CreateRawDictionary(data)),
Expand All @@ -34,10 +34,9 @@ public static partial class JsonMappingHelper
/// </summary>
/// <param name="file">组合文件</param>
public static JsonMappingProvider CreateFromComposition(FileInfo file)
{
using var reader = file.OpenText();
{
var data = JsonSerializer.Deserialize<CompositionData>(
reader.ReadToEnd(),
file.ReadAllText(),
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
return new JsonMappingProvider(
JsonDictionaryWrapper.Create(CompositionHelper.CreateRawDictionary(data)),
Expand Down Expand Up @@ -67,7 +66,7 @@ internal static IEnumerable<KeyValuePair<IEnumerable<TOuter>, IEnumerable<TInner
seed: new[] { KeyValuePair.Create(Enumerable.Empty<TOuter>(), Enumerable.Empty<TInner>()) }
as IEnumerable<KeyValuePair<IEnumerable<TOuter>, IEnumerable<TInner>>>, // 这都需要手写...
(accumulate, next) => from incomingPair in next
join existingGroup in accumulate on true equals true
from existingGroup in accumulate
select KeyValuePair.Create(
existingGroup.Key.Append(incomingPair.Key),
existingGroup.Value.Append(incomingPair.Value)));
Expand Down
2 changes: 1 addition & 1 deletion src/Packer/Models/Providers/McMetaProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public override IResourceFileProvider ReplaceContent(string searchPattern, strin
public override IResourceFileProvider ReplaceDestination(string searchPattern, string replacement)
=> this;
/// <inheritdoc/>
public override async Task WriteToArchive(ZipArchive archive)
public override async Task WriteToArchiveAsync(ZipArchive archive)
{
var destination = Destination.NormalizePath();
Log.Debug("[McMetaProvider]写入路径 {0}", destination);
Expand Down
2 changes: 1 addition & 1 deletion src/Packer/Models/Providers/RawFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public IResourceFileProvider ReplaceDestination(string searchPattern, string rep
RegexOptions.Singleline));

/// <inheritdoc/>
public async Task WriteToArchive(ZipArchive archive)
public async Task WriteToArchiveAsync(ZipArchive archive)
{
var destination = Destination.NormalizePath();
Log.Debug("[RawFile]写入路径 {0}", destination);
Expand Down
23 changes: 10 additions & 13 deletions src/Packer/Models/Providers/TermMappingProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,14 +84,13 @@ public ITermDictionary<JsonNode> ReplaceContent(string searchPattern, string rep
var result = new Dictionary<string, JsonNode>();
foreach (var (key, value) in this)
{
if (value is JsonValue jsonValue
&& jsonValue.TryGetValue<string>(out var stringValue))
if (value.GetValueKind() == JsonValueKind.String)
{
var replaced = Regex.Replace(stringValue,
var replaced = Regex.Replace(value.GetValue<string>(),
searchPattern,
replacement,
RegexOptions.Singleline);
result.Add(key, JsonValue.Create(replaced)!); // 我猜不会null罢
result.Add(key, JsonValue.Create(replaced)); // 我猜不会null罢
continue;
}
result.Add(key, value);
Expand All @@ -101,12 +100,8 @@ public ITermDictionary<JsonNode> ReplaceContent(string searchPattern, string rep

public static ITermDictionary<JsonNode> Create(IDictionary<string, string> nominalMapping)
{
var query = from pair in nominalMapping
let key = pair.Key
let value = pair.Value
let node = JsonValue.Create(value)!
select (key, node);
var transformed = query.ToDictionary(_ => _.key, _ => _.node as JsonNode);
var transformed = nominalMapping
.ToDictionary(p => p.Key, p => JsonValue.Create(p.Value) as JsonNode);
return new JsonDictionaryWrapper(transformed);
}
}
Expand Down Expand Up @@ -145,7 +140,8 @@ public TermMappingProvider(ITermDictionary<TValue> map, string destination)
/// <inheritdoc/>
public IResourceFileProvider ApplyTo(IResourceFileProvider? baseProvider, ApplyOptions options)
{
if (baseProvider is null) return this;
if (baseProvider is null)
return this;

if (baseProvider is not TermMappingProvider<TValue> baseMapping)
throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider<TValue>)}.",
Expand Down Expand Up @@ -190,7 +186,7 @@ public IResourceFileProvider ReplaceDestination(string searchPattern, string rep
RegexOptions.Singleline));

/// <inheritdoc/>
public async Task WriteToArchive(ZipArchive archive)
public async Task WriteToArchiveAsync(ZipArchive archive)
{
var destination = Destination.NormalizePath();
Log.Debug("[TermMappingProvider`1]写入路径 {0}", destination);
Expand Down Expand Up @@ -287,7 +283,8 @@ internal static Dictionary<string, string> DeserializeFromLang(string content)
var splitPosition = line.IndexOf('=');

// https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/pull/3272/files#r1461545452
if (splitPosition == -1) continue;
if (splitPosition == -1)
continue;

var key = line[..splitPosition];
var value = splitPosition + 1 < line.Length
Expand Down
18 changes: 15 additions & 3 deletions src/Packer/Models/Providers/TextFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ public static TextFile Create(FileInfo file, string destination)
return new TextFile(content, destination);
}

/// <summary>
/// 从给定的<see cref="FileInfo"/>构造提供器
/// </summary>
/// <param name="path">读取源</param>
/// <param name="destination">目标地址</param>
public static TextFile Create(string path, string destination)
{
return new TextFile(File.ReadAllText(path), destination);
}

/// <summary>
/// 从给定的<see cref="FileInfo"/>模板和参数构造提供器
/// </summary>
Expand Down Expand Up @@ -67,9 +77,11 @@ public TextFile(string content, string destination)
/// <inheritdoc/>
public virtual IResourceFileProvider ApplyTo(IResourceFileProvider? baseProvider, ApplyOptions options)
{
if (baseProvider is null) return this;
if (baseProvider is null)
return this;

if (!options.Append) return baseProvider;
if (!options.Append)
return baseProvider;

if (baseProvider is not TextFile baseTextFile)
throw new ArgumentException($"Argument not an instance of {typeof(TextFile)}.",
Expand All @@ -94,7 +106,7 @@ public virtual IResourceFileProvider ReplaceDestination(string searchPattern, st
replacement,
RegexOptions.Singleline));
/// <inheritdoc/>
public virtual async Task WriteToArchive(ZipArchive archive)
public virtual async Task WriteToArchiveAsync(ZipArchive archive)
{
var destination = Destination.NormalizePath();
Log.Debug("[TextFile]写入路径 {0}", destination);
Expand Down
14 changes: 8 additions & 6 deletions src/Packer/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public static async Task Main(string version, bool increment = false)
// ./projects/assets/<projectSlug>...
from modDirectory in new DirectoryInfo("./projects/assets").EnumerateDirectories()
let modIdentifier = modDirectory.Name
where targetModIdentifiers.Count() == 0 // 未提供列表,全部打包
where !targetModIdentifiers.Any() // 未提供列表,全部打包
|| targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项
// .../<version>
let versionedDirectory = modDirectory.GetDirectories(config.Base.Version).FirstOrDefault(defaultValue: null)
Expand All @@ -43,7 +43,7 @@ where versionedDirectory is not null
from namespaceDirectory in versionedDirectory.EnumerateDirectories()
let namespaceName = namespaceDirectory.Name
where !config.Base.ExclusionNamespaces.Contains(namespaceName) // 没有被明确排除
where namespaceName.ValidateNamespace() // 不是非法名称
&& namespaceName.ValidateNamespace() // 不是非法名称
// .../*
from provider in namespaceDirectory.EnumerateProviders(config)
group provider by provider.Destination into destinationGroup
Expand All @@ -67,7 +67,7 @@ select config.Floating.DestinationReplacement // 全局路

IEnumerable<IResourceFileProvider> initialFiles = [
new RawFile(new FileInfo("./projects/templates/pack.png"), "pack.png"),
TextFile.Create(new FileInfo("./projects/templates/LICENSE"), "LICENSE"),
TextFile.Create("./projects/templates/LICENSE", "LICENSE"),
TextFile.CreateFromTemplate(new FileInfo(config.Base.ReadmeTemplate),
"README.txt",
config.Base.ReadmeParameters),
Expand All @@ -80,9 +80,11 @@ select config.Floating.DestinationReplacement // 全局路
await using var stream = File.Create(packName);

using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true))
{
await Task.WhenAll(from provider in query.Concat(initialFiles)
select provider.WriteToArchive(archive));
{
foreach (var item in query.Concat(initialFiles))
{
await item.WriteToArchiveAsync(archive);
}
}

Log.Information("对版本 {0} 的打包结束。", version);
Expand Down
14 changes: 6 additions & 8 deletions src/Uploader/Program.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using Renci.SshNet;
using Renci.SshNet;
using Serilog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Threading.Tasks;
using Octokit;

Expand Down Expand Up @@ -130,13 +129,12 @@ async static Task UpdateAutobuildAssets(GitHubClient client, IEnumerable<(string
await client.Repository.Release.Edit(repoId, release.Id, desc);
Log.Information("<Autobuild> 更新 Release 简介:时间 {0}", timestamp);

var assets = release.Assets;
var lookup = assets.Select(_ => (_.Name, _)).ToDictionary();
var lookup = release.Assets.ToDictionary(r => r.Name, r => r);
foreach (var (name, file) in files)
{
using var fileStream = file.OpenRead();

if (lookup.TryGetValue(name, out ReleaseAsset? asset))
if (lookup.TryGetValue(name, out ReleaseAsset? asset))
{
await client.Repository.Release.DeleteAsset(repoId, asset.Id);
Log.Information("<Autobuild> 删除旧文件:{0}", name);
Expand All @@ -153,7 +151,7 @@ async static Task UpdateAutobuildAssets(GitHubClient client, IEnumerable<(string
timeout: null);
await client.Repository.Release.UploadAsset(release, newAsset);
Log.Information("<Autobuild> 上传文件:{0}", name);

}
}

Expand All @@ -168,9 +166,9 @@ public static string RegulateFileName(this string fileName)
string CapitalizeGroup(string[] texts) => string.Join('-', texts.Select(_ => Capitalize(_)));

// 将一段文本的首字母大写,其余不动
string Capitalize(string text) => string.Join("",
string Capitalize(string text)=>string.Concat(
text[0..1].ToUpper(),
text[1..]);
}
}
}
}
Loading