Skip to content

Commit c56843a

Browse files
authored
fix: Project commands now work from paths containing glob characters (#1810)
1 parent 3882b19 commit c56843a

2 files changed

Lines changed: 29 additions & 9 deletions

File tree

cli/dispatcher/internal/dispatcher/dispatcher_pin.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,16 @@ func dispatcherPinCandidatePaths(projectRoot string) []dispatcherPinCandidatePat
5353
{Path: filepath.Join(projectRoot, "Packages", "src", dispatcherPackagePinFileName)},
5454
{Path: filepath.Join(projectRoot, "Packages", dispatcherUnityPackageName, dispatcherPackagePinFileName)},
5555
}
56-
packageCachePattern := filepath.Join(
57-
projectRoot,
58-
"Library",
59-
"PackageCache",
60-
dispatcherUnityPackageName+"@*",
61-
dispatcherPackagePinFileName)
62-
matches, err := filepath.Glob(packageCachePattern)
56+
packageCacheDirectory := filepath.Join(projectRoot, "Library", "PackageCache")
57+
entries, err := os.ReadDir(packageCacheDirectory)
6358
if err == nil {
64-
for _, match := range matches {
65-
paths = append(paths, dispatcherPinCandidatePath{Path: match})
59+
packageDirectoryPrefix := dispatcherUnityPackageName + "@"
60+
for _, entry := range entries {
61+
if !entry.IsDir() || !strings.HasPrefix(entry.Name(), packageDirectoryPrefix) {
62+
continue
63+
}
64+
pinPath := filepath.Join(packageCacheDirectory, entry.Name(), dispatcherPackagePinFileName)
65+
paths = append(paths, dispatcherPinCandidatePath{Path: pinPath})
6666
}
6767
}
6868
return paths

cli/dispatcher/internal/dispatcher/dispatcher_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,26 @@ func TestLoadDispatcherPinSkipsInvalidPackageCandidate(t *testing.T) {
852852
}
853853
}
854854

855+
func TestLoadDispatcherPinFindsPackageCachePinWithBracketedProjectPath(t *testing.T) {
856+
// Verifies PackageCache pin discovery treats glob metacharacters in the project path literally.
857+
projectRoot := filepath.Join(t.TempDir(), "project[legacy]")
858+
for _, directory := range []string{"Assets", "ProjectSettings"} {
859+
if err := os.MkdirAll(filepath.Join(projectRoot, directory), 0o755); err != nil {
860+
t.Fatalf("failed to create Unity project directory: %v", err)
861+
}
862+
}
863+
cachePackageRoot := filepath.Join(projectRoot, "Library", "PackageCache", dispatcherUnityPackageName+"@3.0.0-beta.57")
864+
writeDispatcherPinFile(t, filepath.Join(cachePackageRoot, dispatcherPackagePinFileName), "3.0.0-beta.57")
865+
866+
pin, err := loadDispatcherPin(projectRoot)
867+
if err != nil {
868+
t.Fatalf("loadDispatcherPin failed: %v", err)
869+
}
870+
if pin.ProjectRunnerVersion != "3.0.0-beta.57" {
871+
t.Fatalf("projectRunnerVersion mismatch: %s", pin.ProjectRunnerVersion)
872+
}
873+
}
874+
855875
func TestLoadDispatcherPinNormalizesVersionPrefixes(t *testing.T) {
856876
// Verifies v-prefixed pin versions are normalized before semantic-version validation.
857877
projectRoot := createDispatcherUnityProject(t)

0 commit comments

Comments
 (0)