Skip to content

Commit f7b5bed

Browse files
committed
Add two utility functions to FileUtils
GetRelativePathFromAssetsOrPackagesFolder() - Get the relative path from a path under "Assets" or "Packages" folder. CreateFolder() - Create the folder at given path, including its ancestor folders. Also adjust GetPackageDirectoryType(), IsUnderPackageDirectory(), and GetPackageDirectory() to have more consistent results. Change-Id: Ieb326658ccf57d891a731e2f97ca837eca044095
1 parent a8bba03 commit f7b5bed

File tree

2 files changed

+193
-6
lines changed

2 files changed

+193
-6
lines changed

source/VersionHandlerImpl/src/FileUtils.cs

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ internal class FileUtils {
4444
/// Regex to match packages folder like "Packages/com.company.pkg"
4545
/// </summary>
4646
private static Regex PACKAGES_ASSETDB_PATH_REGEX =
47-
new Regex(@"^(Packages[/\\][^/\\]+)([/\\].*)?$");
47+
new Regex(@"^(Packages[/\\][^/\\]+)[/\\](.*)?$");
4848

4949
/// <summary>
5050
/// Regex to match packages folder like "Library/PackageCache/com.company.pkg"
5151
/// </summary>
5252
private static Regex PACKAGES_PHYSICAL_PATH_REGEX =
53-
new Regex(@"^(Library[/\\]PackageCache[/\\])([^/\\]+)(@[^/\\]+)([/\\].*)?$");
53+
new Regex(@"^(Library[/\\]PackageCache[/\\])([^/\\]+)(@[^/\\]+)[/\\](.*)?$");
5454

5555
/// <summary>
5656
/// Returns the project directory (e.g contains the Assets folder).
@@ -463,6 +463,37 @@ public static string GetPackageDirectory(
463463
return packageDir;
464464
}
465465

466+
/// <summary>
467+
/// Get the relative path from a path under "Assets" or "Packages" folder.
468+
/// </summary>
469+
/// <param name="path">Path to the file/directory.</param>
470+
/// <param name="basePath">Return the base path under project folder such as "Assets",
471+
/// "Packages/package-id" or "Library/ProjectCache/package-id@version". Empty string
472+
/// if the path is under neither of them.</param>
473+
/// <param name="relativePath">Return relative path from "Assets", "Packages/package-id"
474+
/// or "Library/ProjectCache/package-id@version". Return path if it is under neither of
475+
/// them.</param>
476+
/// <returns>True if the path is under Assets or Package folder. False otherwise.</returns>
477+
public static bool GetRelativePathFromAssetsOrPackagesFolder(
478+
string path, out string basePath, out string relativePath){
479+
if (IsUnderDirectory(path, ASSETS_FOLDER)) {
480+
basePath = ASSETS_FOLDER;
481+
relativePath = path.Length >= (basePath.Length + 1) ?
482+
path.Substring(basePath.Length + 1) : "";
483+
return true;
484+
} else if (IsUnderPackageDirectory(path)) {
485+
basePath = GetPackageDirectory(path);
486+
relativePath = path.Length >= (basePath.Length + 1) ?
487+
path.Substring(basePath.Length + 1) : "";
488+
return true;
489+
}
490+
491+
// No under Assets folder or Packages folder.
492+
basePath = "";
493+
relativePath = path;
494+
return false;
495+
}
496+
466497
/// <summary>
467498
/// Result of RemoveAssets().
468499
/// </summary>
@@ -581,5 +612,22 @@ public static RemoveAssetsResult RemoveAssets(IEnumerable<string> filenames,
581612
}
582613
return result;
583614
}
584-
}
615+
616+
/// <summary>
617+
/// Recursively create all parent folders given a path.
618+
/// </summary>
619+
/// <param name="path">Path to the file/directory that needs checking.</param>
620+
/// <returns>True if all folders are created successfully.</returns>
621+
public static bool CreateFolder(string path) {
622+
if (AssetDatabase.IsValidFolder(path)) {
623+
return true;
624+
}
625+
DirectoryInfo di = new DirectoryInfo(path);
626+
var parentFolder = Path.GetDirectoryName(path);
627+
if (!CreateFolder(parentFolder)) {
628+
return false;
629+
}
630+
return !String.IsNullOrEmpty(AssetDatabase.CreateFolder(parentFolder, di.Name));
631+
}
632+
}
585633
}

source/VersionHandlerImpl/unit_tests/src/FileUtilsTest.cs

Lines changed: 142 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public void GetPackageDirectoryType() {
8181
Assert.That(FileUtils.GetPackageDirectoryType("Packages/"),
8282
Is.EqualTo(FileUtils.PackageDirectoryType.None));
8383
Assert.That(FileUtils.GetPackageDirectoryType("Packages/com.company.pkg"),
84+
Is.EqualTo(FileUtils.PackageDirectoryType.None));
85+
Assert.That(FileUtils.GetPackageDirectoryType("Packages/com.company.pkg/"),
8486
Is.EqualTo(FileUtils.PackageDirectoryType.AssetDatabasePath));
8587
Assert.That(FileUtils.GetPackageDirectoryType("Packages/com.company.pkg/Foo"),
8688
Is.EqualTo(FileUtils.PackageDirectoryType.AssetDatabasePath));
@@ -94,7 +96,7 @@ public void GetPackageDirectoryType() {
9496
Is.EqualTo(FileUtils.PackageDirectoryType.None));
9597
Assert.That(FileUtils.GetPackageDirectoryType(
9698
"Library/PackageCache/[email protected]"),
97-
Is.EqualTo(FileUtils.PackageDirectoryType.PhysicalPath));
99+
Is.EqualTo(FileUtils.PackageDirectoryType.None));
98100
Assert.That(FileUtils.GetPackageDirectoryType(
99101
"Library/PackageCache/[email protected]/Foo"),
100102
Is.EqualTo(FileUtils.PackageDirectoryType.PhysicalPath));
@@ -117,7 +119,7 @@ public void IsUnderPackageDirectory() {
117119
Assert.That(FileUtils.IsUnderPackageDirectory("Packages/"),
118120
Is.EqualTo(false));
119121
Assert.That(FileUtils.IsUnderPackageDirectory("Packages/com.company.pkg"),
120-
Is.EqualTo(true));
122+
Is.EqualTo(false));
121123
Assert.That(FileUtils.IsUnderPackageDirectory("Packages/com.company.pkg/Foo"),
122124
Is.EqualTo(true));
123125
Assert.That(FileUtils.IsUnderPackageDirectory("Packages/com.company.pkg/Foo/Bar"),
@@ -130,7 +132,7 @@ public void IsUnderPackageDirectory() {
130132
Is.EqualTo(false));
131133
Assert.That(FileUtils.IsUnderPackageDirectory(
132134
"Library/PackageCache/[email protected]"),
133-
Is.EqualTo(true));
135+
Is.EqualTo(false));
134136
Assert.That(FileUtils.IsUnderPackageDirectory(
135137
"Library/PackageCache/[email protected]/Foo"),
136138
Is.EqualTo(true));
@@ -152,12 +154,17 @@ public void GetPackageDirectory() {
152154
Assert.That(FileUtils.GetPackageDirectory("Packages"), Is.EqualTo(""));
153155
Assert.That(FileUtils.GetPackageDirectory("Packages/"), Is.EqualTo(""));
154156
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg"),
157+
Is.EqualTo(""));
158+
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg/"),
155159
Is.EqualTo(expectedAssetDBPath));
156160
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg/Foo"),
157161
Is.EqualTo(expectedAssetDBPath));
158162
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg/Foo/Bar"),
159163
Is.EqualTo(expectedAssetDBPath));
160164
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg",
165+
FileUtils.PackageDirectoryType.AssetDatabasePath),
166+
Is.EqualTo(""));
167+
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg/",
161168
FileUtils.PackageDirectoryType.AssetDatabasePath),
162169
Is.EqualTo(expectedAssetDBPath));
163170
Assert.That(FileUtils.GetPackageDirectory("Packages/com.company.pkg/Foo",
@@ -185,6 +192,9 @@ public void GetPackageDirectory() {
185192
Is.EqualTo(""));
186193
Assert.That(FileUtils.GetPackageDirectory(
187194
"Library/PackageCache/[email protected]"),
195+
Is.EqualTo(""));
196+
Assert.That(FileUtils.GetPackageDirectory(
197+
"Library/PackageCache/[email protected]/"),
188198
Is.EqualTo(expectedActualPath));
189199
Assert.That(FileUtils.GetPackageDirectory(
190200
"Library/PackageCache/[email protected]/Foo"),
@@ -195,6 +205,10 @@ public void GetPackageDirectory() {
195205
Assert.That(FileUtils.GetPackageDirectory(
196206
"Library/PackageCache/[email protected]",
197207
FileUtils.PackageDirectoryType.AssetDatabasePath),
208+
Is.EqualTo(""));
209+
Assert.That(FileUtils.GetPackageDirectory(
210+
"Library/PackageCache/[email protected]/",
211+
FileUtils.PackageDirectoryType.AssetDatabasePath),
198212
Is.EqualTo(expectedAssetDBPath));
199213
Assert.That(FileUtils.GetPackageDirectory(
200214
"Library/PackageCache/[email protected]/Foo",
@@ -207,6 +221,10 @@ public void GetPackageDirectory() {
207221
Assert.That(FileUtils.GetPackageDirectory(
208222
"Library/PackageCache/[email protected]",
209223
FileUtils.PackageDirectoryType.PhysicalPath),
224+
Is.EqualTo(""));
225+
Assert.That(FileUtils.GetPackageDirectory(
226+
"Library/PackageCache/[email protected]/",
227+
FileUtils.PackageDirectoryType.PhysicalPath),
210228
Is.EqualTo(expectedActualPath));
211229
Assert.That(FileUtils.GetPackageDirectory(
212230
"Library/PackageCache/[email protected]/Foo",
@@ -218,5 +236,126 @@ public void GetPackageDirectory() {
218236
Is.EqualTo(expectedActualPath));
219237

220238
}
239+
240+
/// <summary>
241+
/// Test FileUtils.GetRelativePathFromAssetsOrPackagesFolder()
242+
/// </summary>
243+
[Test]
244+
public void GetRelativePathFromAssetsOrPackagesFolder() {
245+
string basePath;
246+
string relativePath;
247+
bool result;
248+
249+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
250+
"Assets", out basePath, out relativePath);
251+
Assert.That(result, Is.EqualTo(false));
252+
Assert.That(basePath, Is.EqualTo(""));
253+
Assert.That(relativePath, Is.EqualTo("Assets"));
254+
255+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
256+
"Assets/", out basePath, out relativePath);
257+
Assert.That(result, Is.EqualTo(true));
258+
Assert.That(basePath, Is.EqualTo("Assets"));
259+
Assert.That(relativePath, Is.EqualTo(""));
260+
261+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
262+
"Assets/Foo", out basePath, out relativePath);
263+
Assert.That(result, Is.EqualTo(true));
264+
Assert.That(basePath, Is.EqualTo("Assets"));
265+
Assert.That(relativePath, Is.EqualTo("Foo"));
266+
267+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
268+
"Assets/Foo/", out basePath, out relativePath);
269+
Assert.That(result, Is.EqualTo(true));
270+
Assert.That(basePath, Is.EqualTo("Assets"));
271+
Assert.That(relativePath, Is.EqualTo("Foo/"));
272+
273+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
274+
"Assets/Foo/Bar", out basePath, out relativePath);
275+
Assert.That(result, Is.EqualTo(true));
276+
Assert.That(basePath, Is.EqualTo("Assets"));
277+
Assert.That(relativePath, Is.EqualTo("Foo/Bar"));
278+
279+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
280+
"Packages/com.company.pkg", out basePath, out relativePath);
281+
Assert.That(result, Is.EqualTo(false));
282+
Assert.That(basePath, Is.EqualTo(""));
283+
Assert.That(relativePath, Is.EqualTo("Packages/com.company.pkg"));
284+
285+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
286+
"Packages/com.company.pkg/", out basePath, out relativePath);
287+
Assert.That(result, Is.EqualTo(true));
288+
Assert.That(basePath, Is.EqualTo("Packages/com.company.pkg"));
289+
Assert.That(relativePath, Is.EqualTo(""));
290+
291+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
292+
"Packages/com.company.pkg/Foo", out basePath, out relativePath);
293+
Assert.That(result, Is.EqualTo(true));
294+
Assert.That(basePath, Is.EqualTo("Packages/com.company.pkg"));
295+
Assert.That(relativePath, Is.EqualTo("Foo"));
296+
297+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
298+
"Packages/com.company.pkg/Foo/", out basePath, out relativePath);
299+
Assert.That(result, Is.EqualTo(true));
300+
Assert.That(basePath, Is.EqualTo("Packages/com.company.pkg"));
301+
Assert.That(relativePath, Is.EqualTo("Foo/"));
302+
303+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
304+
"Packages/com.company.pkg/Foo/Bar", out basePath, out relativePath);
305+
Assert.That(result, Is.EqualTo(true));
306+
Assert.That(basePath, Is.EqualTo("Packages/com.company.pkg"));
307+
Assert.That(relativePath, Is.EqualTo("Foo/Bar"));
308+
309+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
310+
"Library/PackageCache/[email protected]", out basePath, out relativePath);
311+
Assert.That(result, Is.EqualTo(false));
312+
Assert.That(basePath, Is.EqualTo(""));
313+
Assert.That(relativePath, Is.EqualTo("Library/PackageCache/[email protected]"));
314+
315+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
316+
"Library/PackageCache/[email protected]/", out basePath, out relativePath);
317+
Assert.That(result, Is.EqualTo(true));
318+
Assert.That(basePath, Is.EqualTo("Library/PackageCache/[email protected]"));
319+
Assert.That(relativePath, Is.EqualTo(""));
320+
321+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
322+
"Library/PackageCache/[email protected]/Foo",
323+
out basePath, out relativePath);
324+
Assert.That(result, Is.EqualTo(true));
325+
Assert.That(basePath, Is.EqualTo("Library/PackageCache/[email protected]"));
326+
Assert.That(relativePath, Is.EqualTo("Foo"));
327+
328+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
329+
"Library/PackageCache/[email protected]/Foo/",
330+
out basePath, out relativePath);
331+
Assert.That(result, Is.EqualTo(true));
332+
Assert.That(basePath, Is.EqualTo("Library/PackageCache/[email protected]"));
333+
Assert.That(relativePath, Is.EqualTo("Foo/"));
334+
335+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
336+
"Library/PackageCache/[email protected]/Foo/Bar",
337+
out basePath, out relativePath);
338+
Assert.That(result, Is.EqualTo(true));
339+
Assert.That(basePath, Is.EqualTo("Library/PackageCache/[email protected]"));
340+
Assert.That(relativePath, Is.EqualTo("Foo/Bar"));
341+
342+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
343+
"/Foo", out basePath, out relativePath);
344+
Assert.That(result, Is.EqualTo(false));
345+
Assert.That(basePath, Is.EqualTo(""));
346+
Assert.That(relativePath, Is.EqualTo("/Foo"));
347+
348+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
349+
"Foo", out basePath, out relativePath);
350+
Assert.That(result, Is.EqualTo(false));
351+
Assert.That(basePath, Is.EqualTo(""));
352+
Assert.That(relativePath, Is.EqualTo("Foo"));
353+
354+
result = FileUtils.GetRelativePathFromAssetsOrPackagesFolder(
355+
"Foo/Bar", out basePath, out relativePath);
356+
Assert.That(result, Is.EqualTo(false));
357+
Assert.That(basePath, Is.EqualTo(""));
358+
Assert.That(relativePath, Is.EqualTo("Foo/Bar"));
359+
}
221360
}
222361
}

0 commit comments

Comments
 (0)