Files
Fishing2/Assets/Scripts/NBC/Asset/Editor/Utils/HistoryUtil.cs
2025-05-10 12:49:47 +08:00

345 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace NBC.Asset.Editor
{
public static class HistoryUtil
{
public static void CopyToStreamingAssets(this VersionHistoryData versionHistory)
{
if (versionHistory == null) return;
try
{
var streamingAssetsPath = $"{Application.streamingAssetsPath}/";
if (Directory.Exists(streamingAssetsPath))
Directory.Delete(streamingAssetsPath, true);
Directory.CreateDirectory(streamingAssetsPath);
versionHistory.CopyToFolder(streamingAssetsPath);
AssetDatabase.Refresh();
}
catch (Exception e)
{
Debug.LogError("copy version is null");
}
}
public static void CopyToFolder(this VersionHistoryData versionHistory, string folderPath)
{
if (!Directory.Exists(folderPath))
{
Debug.LogError("copy errorFolder not exists");
return;
}
var versionData = versionHistory.VersionData;
var versionPackageName = versionData.NameHash;
var filePath = BuildSettings.GetBuildPath(versionPackageName);
EditUtil.CopyToFolder(filePath, folderPath + versionPackageName);
// Const.GetStreamingPath(versionPackageName));
foreach (var package in versionHistory.Packages)
{
foreach (var bundle in package.Bundles)
{
//Const.GetStreamingPath(bundleNameAddHash)
var bundleNameAddHash = Util.NameAddHash(bundle.Name, bundle.Hash);
EditUtil.CopyToFolder(BuildSettings.GetBuildPath(bundleNameAddHash),
folderPath + bundleNameAddHash);
}
}
Util.WriteJson(versionData, folderPath + "version.json"); //Const.GetStreamingPath("version.json"));
}
public static void ShowLastBuildInfo()
{
var last = GetLastBuildCompareVersion();
var simpleData = last.SimpleChangeData;
var addCount = simpleData.PackageAddBundle.Values.Sum(v => v.Count);
var changeCount = simpleData.PackageChangeBundle.Values.Sum(v => v.Count);
var removeCount = simpleData.PackageRemoveBundle.Values.Sum(v => v.Count);
var tips = string.Format(Language.BuildSuccessTips, Util.GetFriendlySize(simpleData.DownloadSize), addCount,
changeCount,
removeCount);
Debug.Log(tips);
EditorUtility.DisplayDialog(Language.Tips, tips, Language.Confirm);
}
/// <summary>
/// 获取最后一次构建和上次构建变化内容
/// </summary>
/// <returns></returns>
public static VersionChangeData GetLastBuildCompareVersion()
{
var versions = GetHistoryVersions();
VersionHistoryData newHistoryData = null;
VersionHistoryData oldHistoryData = null;
if (versions != null)
{
if (versions.Count > 0)
{
newHistoryData = versions[0];
}
if (versions.Count > 1)
{
oldHistoryData = versions[1];
}
}
return CompareVersion(newHistoryData, oldHistoryData);
}
/// <summary>
/// 比较版本相差内容
/// </summary>
/// <param name="newHistoryData">更新的版本</param>
/// <param name="oldHistoryData">更老的版本</param>
public static VersionChangeData CompareVersion(VersionHistoryData newHistoryData,
VersionHistoryData oldHistoryData)
{
List<BundleData> oldBundles = new List<BundleData>();
if (oldHistoryData != null)
{
foreach (var package in oldHistoryData.Packages)
{
foreach (var bundle in package.Bundles)
{
oldBundles.Add(bundle);
}
}
}
List<BundleData> newBundles = new List<BundleData>();
if (newHistoryData != null)
{
foreach (var package in newHistoryData.Packages)
{
foreach (var bundle in package.Bundles)
{
newBundles.Add(bundle);
}
}
}
VersionChangeData ret = new VersionChangeData();
//查找新增和修改的bundle
foreach (var bundle in newBundles)
{
var old = oldBundles.Find(b => b.Name == bundle.Name);
if (old != null)
{
if (old.Hash != bundle.Hash || old.Size != bundle.Size)
{
ret.Change(bundle, VersionChangeData.TypeEnum.Change);
}
}
else
{
ret.Change(bundle, VersionChangeData.TypeEnum.Add);
}
}
//查找删除的bundle
foreach (var bundle in oldBundles)
{
var old = newBundles.Find(b => b.Name == bundle.Name);
if (old == null)
{
ret.Change(bundle, VersionChangeData.TypeEnum.Remove);
}
}
ret.Processing();
ret.NewVersionName = newHistoryData?.ShowName;
ret.OldVersionName = oldHistoryData?.ShowName;
return ret;
}
/// <summary>
/// 获取最后一个历史记录
/// </summary>
/// <returns></returns>
public static VersionHistoryData GetLastVersionHistory()
{
var history = GetHistoryVersions();
if (history != null && history.Count > 0)
{
return history[0];
}
return null;
}
/// <summary>
/// 获取所有历史记录
/// </summary>
public static List<VersionHistoryData> GetHistoryVersions()
{
var platformPath = BuildSettings.PlatformPath;
List<VersionHistoryData> ret = new List<VersionHistoryData>();
DirectoryInfo root = new DirectoryInfo(platformPath);
if (root.Exists)
{
FileInfo[] files = root.GetFiles();
List<string> filePaths = new List<string>();
foreach (var file in files)
{
if (file.Exists)
{
var ext = Path.GetExtension(file.FullName);
var fileName = Path.GetFileName(file.FullName);
if (ext.ToLower() == ".json" && fileName.StartsWith("version"))
{
filePaths.Add(file.FullName);
}
}
}
filePaths.Sort((a, b) =>
{
var fName1 = Path.GetFileNameWithoutExtension(a);
var fName2 = Path.GetFileNameWithoutExtension(b);
var index1 = fName1.Replace("version_", "");
var index2 = fName2.Replace("version_", "");
int.TryParse(index1, out var i1);
int.TryParse(index2, out var i2);
return i1 - i2;
});
filePaths.Reverse();
foreach (var file in filePaths)
{
var json = File.ReadAllText(file);
var versionName = Path.GetFileName(file);
versionName = versionName.Replace(Path.GetExtension(file), "");
var version = JsonUtility.FromJson<VersionData>(json);
if (version == null) continue;
var historyData = new VersionHistoryData();
historyData.VersionData = version;
var showTime = Util.TimestampToTime(version.BuildTime);
historyData.FileName = Path.GetFileName(file);
historyData.ShowName = versionName + "_" + showTime.ToString("yyyy-MM-dd HH:mm:ss");
var fileName = version.NameHash;
var packages = Util.ReadJson<VersionPackageData>(BuildSettings.GetBuildPath(fileName));
if (packages != null)
{
foreach (var packageData in packages.Packages)
{
foreach (var bundle in packageData.Bundles)
{
bundle.PackageName = packageData.Name;
}
historyData.Packages.Add(packageData);
}
}
ret.Add(historyData);
}
}
return ret;
}
/// <summary>
/// 删除某个历史版本记录
/// </summary>
public static void DeleteHistoryVersions(string versionFileName)
{
VersionHistoryData needDeleteVersion = null;
//所有bundle使用次数
Dictionary<string, int> useDic = new Dictionary<string, int>();
var versions = GetHistoryVersions();
foreach (var version in versions)
{
if (version.FileName == versionFileName)
{
needDeleteVersion = version;
}
var fileName = version.VersionData.NameHash;
UseDic(useDic, fileName);
foreach (var p in version.Packages)
{
foreach (var bundle in p.Bundles)
{
var name = bundle.NameHash;
if (useDic.ContainsKey(name))
{
useDic[name]++;
}
else
{
useDic[name] = 1;
}
}
}
}
if (needDeleteVersion != null)
{
List<string> canDeleteBundle = new List<string>();
foreach (var p in needDeleteVersion.Packages)
{
foreach (var bundle in p.Bundles)
{
var name = bundle.NameHash;
if (useDic.TryGetValue(name, out var count))
{
if (count <= 1) canDeleteBundle.Add(name);
}
else
{
canDeleteBundle.Add(name);
}
}
}
var platformPath = BuildSettings.PlatformPath;
DeleteFile($"{platformPath}/{versionFileName}");
var fileName = needDeleteVersion.VersionData.NameHash;
if (useDic.TryGetValue(fileName, out var c))
{
if (c <= 1)
{
DeleteFile($"{platformPath}/{fileName}");
}
}
foreach (var bundleName in canDeleteBundle)
{
DeleteFile($"{platformPath}/{bundleName}");
}
}
}
private static void UseDic(Dictionary<string, int> dic, string name)
{
if (dic.ContainsKey(name))
{
dic[name]++;
}
else
{
dic[name] = 1;
}
}
private static void DeleteFile(string filePath)
{
if (File.Exists(filePath))
{
File.Delete(filePath);
Debug.Log($"Delete File Path:{filePath}");
}
}
}
}