This repository has been archived by the owner on Jan 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 126
/
CacheServerTransactionExporter.cs
139 lines (114 loc) · 4.21 KB
/
CacheServerTransactionExporter.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
public class CacheServerTransactionExporter : MonoBehaviour
{
private const string TYPE_ASSET = "a";
private const string TYPE_INFO = "i";
private const string TYPE_RESOURCE = "r";
[Serializable]
public class CacheServerTransactionData : ISerializationCallbackReceiver
{
public string projectRoot;
public Transaction[] transactions;
private readonly List<Transaction> m_transactionList;
public CacheServerTransactionData(int size)
{
projectRoot = Directory.GetParent(Application.dataPath).FullName;
m_transactionList = new List<Transaction>(size);
}
public void AddItem(string assetPath)
{
if (Directory.Exists(assetPath)) return;
if (!File.Exists(assetPath)) return;
var guid = AssetDatabase.AssetPathToGUID(assetPath);
var hash = AssetDatabase.GetAssetDependencyHash(assetPath);
var libPath =
new[] { projectRoot, "Library", "metadata", guid.Substring(0, 2), guid }
.Aggregate(string.Empty, Path.Combine);
if (!File.Exists(libPath))
{
Debug.Log("Cannot find Library representation for GUID " + guid);
return;
}
var files = new List<Transaction.FileInfo>
{
new Transaction.FileInfo(TYPE_ASSET, libPath, ToUnixTime(File.GetLastWriteTime(libPath)))
};
var infoLibPath = libPath + ".info";
if (File.Exists(infoLibPath))
{
files.Add(new Transaction.FileInfo(TYPE_INFO, infoLibPath, ToUnixTime(File.GetLastWriteTime(infoLibPath))));
}
var resLibPath = libPath + ".resource";
if (File.Exists(resLibPath))
{
files.Add(new Transaction.FileInfo(TYPE_RESOURCE, resLibPath, ToUnixTime(File.GetLastWriteTime(resLibPath))));
}
m_transactionList.Add(new Transaction(assetPath, guid, hash, files.ToArray()));
}
public void OnBeforeSerialize()
{
transactions = m_transactionList.ToArray();
}
public void OnAfterDeserialize()
{
// No op
}
}
[Serializable]
public struct Transaction
{
[Serializable]
public struct FileInfo
{
public string type;
public string path;
public long ts;
public FileInfo(string type, string path, long ts)
{
this.type = type;
this.path = path;
this.ts = ts;
}
}
public string assetPath;
public string guid;
public string hash;
public FileInfo[] files;
public Transaction(string assetPath, string guid, Hash128 hash, FileInfo[] files)
{
this.assetPath = assetPath;
this.guid = guid;
this.hash = hash.ToString();
this.files = files;
}
}
public static void ExportTransactions(string exportPath)
{
var assetPaths = AssetDatabase.GetAllAssetPaths();
var data = new CacheServerTransactionData(assetPaths.Length);
foreach (var path in assetPaths)
data.AddItem(path);
using (var stream = File.CreateText(exportPath))
stream.Write(EditorJsonUtility.ToJson(data, true));
}
[MenuItem("Cache Server Utilities/Export Transactions")]
public static void ExportTransactionsMenuItem()
{
var path = EditorUtility.SaveFilePanel(
"Save Import Data",
Directory.GetCurrentDirectory(),
"CacheServerTransactions_" + EditorUserBuildSettings.activeBuildTarget, "json");
if (path.Length != 0)
ExportTransactions(path);
}
public static long ToUnixTime(DateTime date)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return Convert.ToInt64((date.ToUniversalTime() - epoch).TotalSeconds);
}
}