Catch both old uppercase 5-char hash and newer lowercase 5-char hash when migrating to new hash

This commit is contained in:
SnowySailor 2026-06-15 12:59:49 +09:00
parent acac8f7bbb
commit 3574d03aac

View file

@ -39,9 +39,13 @@ internal partial class ExportAssetDownloader(string workingDirPath, bool reuse)
// Check for a file cached by the legacy naming scheme (5-char hash) and rename it
// to the new naming scheme to preserve backwards compatibility with existing exports
// This will catch both the 5-char lowercase hash and the 5-char uppercase hash variants
if (reuse)
{
var legacyFilePath = Path.Combine(workingDirPath, GetLegacyFileNameFromUrl(url));
var legacyFileNames = GetLegacyFileNamesFromUrl(url);
foreach (var legacyFileName in legacyFileNames)
{
var legacyFilePath = Path.Combine(workingDirPath, legacyFileName);
if (File.Exists(legacyFilePath))
{
// Overwrite in case the destination file was created concurrently between our
@ -58,6 +62,7 @@ internal partial class ExportAssetDownloader(string workingDirPath, bool reuse)
}
}
}
}
Directory.CreateDirectory(workingDirPath);
@ -137,13 +142,23 @@ internal partial class ExportAssetDownloader
);
// Legacy naming used a 5-char hash, kept for backwards compatibility with existing exports
private static string GetLegacyFileNameFromUrl(string url) =>
private static string[] GetLegacyFileNamesFromUrl(string url)
{
var hashData = SHA256.HashData(Encoding.UTF8.GetBytes(NormalizeUrl(url)));
return
[
// Lowercase variant (introduced in 2.46.1)
GetFileNameFromUrl(
url,
SHA256
.HashData(Encoding.UTF8.GetBytes(NormalizeUrl(url)))
.Pipe(Convert.ToHexStringLower)
// 5 chars = 20 bits, reaches 1% collision probability at ~145 files
.Truncate(5)
);
Convert.ToHexStringLower(hashData).Truncate(5)
),
// Uppercase variant (original)
GetFileNameFromUrl(
url,
Convert.ToHexString(hashData).Truncate(5)
)
];
}
}