Skip to content

Commit

Permalink
impl
Browse files Browse the repository at this point in the history
  • Loading branch information
mob-sakai committed May 16, 2019
0 parents commit 96d1155
Show file tree
Hide file tree
Showing 23 changed files with 1,789 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
* -text

*.cs text eol=lf diff=csharp
*.shader text eol=lf
*.cginc text eol=lf
*.hlsl text eol=lf
*.compute text eol=lf

*.meta text eol=lf
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Windows
Thumbs.db
Desktop.ini
/*.csproj
/*.sln

# macOS
.DS_Store

# Vim
*.swp

# Unity
/Logs
/Library
/Temp
.vs
obj
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Changelog

\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
7 changes: 7 additions & 0 deletions CHANGELOG.md.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions Editor.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions Editor/Coffee.GitDependencyResolver.asmdef
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "Coffee.GitDependencyResolver",
"references": [],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": false,
"defineConstraints": []
}
7 changes: 7 additions & 0 deletions Editor/Coffee.GitDependencyResolver.asmdef.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

114 changes: 114 additions & 0 deletions Editor/GitDependencyResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Coffee.PackageManager
{
[InitializeOnLoad]
public static class GitDependencyResolver
{
static GitDependencyResolver ()
{
EditorApplication.projectChanged += StartResolve;
StartResolve ();
}

/// <summary>
/// Uninstall unused packages (for auto-installed packages)
/// </summary>
static void UninstallUnusedPackages ()
{
bool check = true;
while (check)
{
check = false;

// Collect all dependencies.
var allDependencies = Directory.GetDirectories ("./Library/PackageCache")
.Concat (Directory.GetDirectories ("./Packages"))
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
.Where (x => x != null) // Skip null
.SelectMany (x => x.dependencies) // Get all dependencies
.ToArray ();

// Collect unused pakages.
var unusedPackages = Directory.GetDirectories ("./Packages")
.Where (x => Path.GetFileName (x).StartsWith (".")) // Directory name starts with '.'. This is 'auto-installed package'
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
.Where (x => x != null) // Skip null
.Where (x => allDependencies.All (y => y.name != x.name)) // No depended from other packages
.ToArray ();

// Uninstall unused packages and re-check.
foreach (var p in unusedPackages)
{
check = true;
Debug.LogFormat ("[Resolver] Uninstall unused package: {0} from {1}", p.name, p.path);
FileUtil.DeleteFileOrDirectory (p.path);
}
}
}


static void StartResolve ()
{
// Uninstall unused packages (for auto-installed packages)
UninstallUnusedPackages ();

// Collect all installed pakages.
var installedPackages = Directory.GetDirectories ("./Library/PackageCache")
.Concat (Directory.GetDirectories ("./Packages"))
.Select (PackageMeta.FromPackageDir) // Convert to PackageMeta
.Where (x => x != null) // Skip null
.ToArray ();

// Collect all dependencies.
var dependencies = installedPackages
.SelectMany (x => x.dependencies) // Get all dependencies
.Where (x => !string.IsNullOrEmpty (x.path)); // path (url) is available

List<PackageMeta> requestedPackages = new List<PackageMeta> ();

// Check all dependencies.
foreach (var dependency in dependencies)
{
// Is the depended package installed already?
bool isInstalled = installedPackages
.Concat (requestedPackages)
.Any (x => dependency.name == x.name && dependency.version <= x.version);

// Install the depended package later.
if (!isInstalled)
{
Debug.LogFormat ("[Resolver] A dependency package is requested: {0}", dependency.name);
requestedPackages.RemoveAll (x => dependency.name == x.name);
requestedPackages.Add (dependency);
}
}

// No packages is requested to install.
if (requestedPackages.Count == 0)
return;

// Install all requested packages.
for (int i = 0; i < requestedPackages.Count; i++)
{
PackageMeta meta = requestedPackages [i];
EditorUtility.DisplayProgressBar ("Add Package", "Cloning: " + meta.name, i / (float)requestedPackages.Count);
Debug.LogFormat ("[Resolver] A package is cloning: {0}", meta.name);
bool success = GitUtils.ClonePackage (meta);
if (!success)
{
Debug.LogFormat ("[Resolver] Failed to clone: {0}", meta.name);
break;
}
}

// Recompile the packages
EditorUtility.ClearProgressBar ();
EditorApplication.delayCall += AssetDatabase.Refresh;
}
}
}
11 changes: 11 additions & 0 deletions Editor/GitDependencyResolver.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 96d1155

Please sign in to comment.