Skip to content

Commit 96d1155

Browse files
author
mob-sakai
committed
impl
0 parents  commit 96d1155

23 files changed

+1789
-0
lines changed

.gitattributes

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
* -text
2+
3+
*.cs text eol=lf diff=csharp
4+
*.shader text eol=lf
5+
*.cginc text eol=lf
6+
*.hlsl text eol=lf
7+
*.compute text eol=lf
8+
9+
*.meta text eol=lf

.gitignore

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Windows
2+
Thumbs.db
3+
Desktop.ini
4+
/*.csproj
5+
/*.sln
6+
7+
# macOS
8+
.DS_Store
9+
10+
# Vim
11+
*.swp
12+
13+
# Unity
14+
/Logs
15+
/Library
16+
/Temp
17+
.vs
18+
obj

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Changelog
2+
3+
\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*

CHANGELOG.md.meta

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor.meta

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"name": "Coffee.GitDependencyResolver",
3+
"references": [],
4+
"optionalUnityReferences": [],
5+
"includePlatforms": [
6+
"Editor"
7+
],
8+
"excludePlatforms": [],
9+
"allowUnsafeCode": false,
10+
"overrideReferences": false,
11+
"precompiledReferences": [],
12+
"autoReferenced": false,
13+
"defineConstraints": []
14+
}

Editor/Coffee.GitDependencyResolver.asmdef.meta

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Editor/GitDependencyResolver.cs

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
4+
using UnityEditor;
5+
using UnityEngine;
6+
7+
namespace Coffee.PackageManager
8+
{
9+
[InitializeOnLoad]
10+
public static class GitDependencyResolver
11+
{
12+
static GitDependencyResolver ()
13+
{
14+
EditorApplication.projectChanged += StartResolve;
15+
StartResolve ();
16+
}
17+
18+
/// <summary>
19+
/// Uninstall unused packages (for auto-installed packages)
20+
/// </summary>
21+
static void UninstallUnusedPackages ()
22+
{
23+
bool check = true;
24+
while (check)
25+
{
26+
check = false;
27+
28+
// Collect all dependencies.
29+
var allDependencies = Directory.GetDirectories ("./Library/PackageCache")
30+
.Concat (Directory.GetDirectories ("./Packages"))
31+
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
32+
.Where (x => x != null) // Skip null
33+
.SelectMany (x => x.dependencies) // Get all dependencies
34+
.ToArray ();
35+
36+
// Collect unused pakages.
37+
var unusedPackages = Directory.GetDirectories ("./Packages")
38+
.Where (x => Path.GetFileName (x).StartsWith (".")) // Directory name starts with '.'. This is 'auto-installed package'
39+
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
40+
.Where (x => x != null) // Skip null
41+
.Where (x => allDependencies.All (y => y.name != x.name)) // No depended from other packages
42+
.ToArray ();
43+
44+
// Uninstall unused packages and re-check.
45+
foreach (var p in unusedPackages)
46+
{
47+
check = true;
48+
Debug.LogFormat ("[Resolver] Uninstall unused package: {0} from {1}", p.name, p.path);
49+
FileUtil.DeleteFileOrDirectory (p.path);
50+
}
51+
}
52+
}
53+
54+
55+
static void StartResolve ()
56+
{
57+
// Uninstall unused packages (for auto-installed packages)
58+
UninstallUnusedPackages ();
59+
60+
// Collect all installed pakages.
61+
var installedPackages = Directory.GetDirectories ("./Library/PackageCache")
62+
.Concat (Directory.GetDirectories ("./Packages"))
63+
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
64+
.Where (x => x != null) // Skip null
65+
.ToArray ();
66+
67+
// Collect all dependencies.
68+
var dependencies = installedPackages
69+
.SelectMany (x => x.dependencies) // Get all dependencies
70+
.Where (x => !string.IsNullOrEmpty (x.path)); // path (url) is available
71+
72+
List<PackageMeta> requestedPackages = new List<PackageMeta> ();
73+
74+
// Check all dependencies.
75+
foreach (var dependency in dependencies)
76+
{
77+
// Is the depended package installed already?
78+
bool isInstalled = installedPackages
79+
.Concat (requestedPackages)
80+
.Any (x => dependency.name == x.name && dependency.version <= x.version);
81+
82+
// Install the depended package later.
83+
if (!isInstalled)
84+
{
85+
Debug.LogFormat ("[Resolver] A dependency package is requested: {0}", dependency.name);
86+
requestedPackages.RemoveAll (x => dependency.name == x.name);
87+
requestedPackages.Add (dependency);
88+
}
89+
}
90+
91+
// No packages is requested to install.
92+
if (requestedPackages.Count == 0)
93+
return;
94+
95+
// Install all requested packages.
96+
for (int i = 0; i < requestedPackages.Count; i++)
97+
{
98+
PackageMeta meta = requestedPackages [i];
99+
EditorUtility.DisplayProgressBar ("Add Package", "Cloning: " + meta.name, i / (float)requestedPackages.Count);
100+
Debug.LogFormat ("[Resolver] A package is cloning: {0}", meta.name);
101+
bool success = GitUtils.ClonePackage (meta);
102+
if (!success)
103+
{
104+
Debug.LogFormat ("[Resolver] Failed to clone: {0}", meta.name);
105+
break;
106+
}
107+
}
108+
109+
// Recompile the packages
110+
EditorUtility.ClearProgressBar ();
111+
EditorApplication.delayCall += AssetDatabase.Refresh;
112+
}
113+
}
114+
}

Editor/GitDependencyResolver.cs.meta

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)