Skip to content

Commit bf7c1e7

Browse files
committed
fix: support uv lock target files in subfolders
1 parent 6d63a31 commit bf7c1e7

File tree

5 files changed

+54
-23
lines changed

5 files changed

+54
-23
lines changed

internal/commands/ostest/routing.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ type FlowConfig struct {
133133
Unmanaged bool
134134
TargetPackage string
135135
AllProjects bool
136+
FileFlag string
136137
}
137138

138139
func doesPathExist(path string) (bool, error) {
@@ -161,6 +162,7 @@ func ParseFlowConfig(cfg configuration.Configuration) (*FlowConfig, error) {
161162
reachabilityFilter := cfg.GetString(flags.FlagReachabilityFilter)
162163
unmanaged := cfg.GetBool(flags.FlagUnmanaged)
163164
allProjects := cfg.GetBool(flags.FlagAllProjects)
165+
fileFlag := cfg.GetString(flags.FlagFile)
164166

165167
experimentalFlagSet := cfg.GetBool(configuration.FLAG_EXPERIMENTAL)
166168
experimentalUvSupport := experimentalFlagSet && cfg.GetBool(constants.EnableExperimentalUvSupportEnvVar)
@@ -204,6 +206,7 @@ func ParseFlowConfig(cfg configuration.Configuration) (*FlowConfig, error) {
204206
Unmanaged: unmanaged,
205207
TargetPackage: targetPackage,
206208
AllProjects: allProjects,
209+
FileFlag: fileFlag,
207210
}, nil
208211
}
209212

@@ -217,7 +220,7 @@ func ShouldUseLegacyFlow(ctx context.Context, fc *FlowConfig, inputDirs []string
217220
}
218221

219222
// Check if UV support should trigger, only if env var is set and uv.lock exists.
220-
uvSupportWithLockFile := fc.ExperimentalUvSupport && util.HasUvLockFileInAnyDir(inputDirs, fc.AllProjects, logger)
223+
uvSupportWithLockFile := fc.ExperimentalUvSupport && util.HasUvLockFileInAnyDir(inputDirs, fc.FileFlag, fc.AllProjects, logger)
221224

222225
hasNewFeatures := fc.RiskScoreTest || fc.Reachability || fc.SBOM != "" || fc.ReachabilityFilter != "" || uvSupportWithLockFile
223226
useLegacy := fc.ForceLegacyTest || fc.RequiresLegacy || !hasNewFeatures

internal/commands/ostest/workflow_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,7 @@ func TestOSWorkflow_FlagCombinations(t *testing.T) {
652652
tempDir := util.CreateTempDirWithUvLock(t)
653653
config.Set(configuration.INPUT_DIRECTORY, []string{tempDir})
654654
config.Set(configuration.FLAG_EXPERIMENTAL, true)
655+
config.Set(flags.FlagFile, "")
655656
config.Set(constants.EnableExperimentalUvSupportEnvVar, true)
656657
mockEngine.EXPECT().
657658
InvokeWithConfig(common.DepGraphWorkflowID, gomock.Any()).

internal/common/depgraph.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ func GetDepGraph(ictx workflow.InvocationContext, inputDir string) ([]RawDepGrap
4444

4545
depGraphConfig := config.Clone()
4646
experimentalFlagSet := config.GetBool(configuration.FLAG_EXPERIMENTAL)
47-
allProjectsFlagSet := config.GetBool(flags.FlagAllProjects)
47+
allProjects := config.GetBool(flags.FlagAllProjects)
48+
fileFlag := config.GetString(flags.FlagFile)
4849
experimentalUvSupportEnabled := experimentalFlagSet && config.GetBool(constants.EnableExperimentalUvSupportEnvVar)
49-
uvLockExists := util.HasUvLockFile(inputDir, allProjectsFlagSet, logger)
50+
uvLockExists := util.HasUvLockFile(inputDir, fileFlag, allProjects, logger)
5051

5152
if experimentalUvSupportEnabled && uvLockExists {
5253
logger.Info().Msg("Experimental uv support enabled and uv.lock found, using SBOM resolution in depgraph workflow")

internal/util/uv.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@ var ExcludedUVLockFileDirs = map[string]bool{
1919
".build": true,
2020
}
2121

22-
// HasUvLockFile checks if the specified directory contains a uv.lock file.
22+
// HasUvLockFile checks if the specified directory contains a uv.lock file or the target file if provided.
2323
// If allProjects is true, the function will check if the directory contains a uv.lock file recursively.
2424
// Otherwise, it will only check if the directory contains a uv.lock file.
25-
func HasUvLockFile(dir string, allProjects bool, logger *zerolog.Logger) bool {
25+
func HasUvLockFile(dir, targetFile string, allProjects bool, logger *zerolog.Logger) bool {
2626
if allProjects {
2727
return HasUvLockFileRecursive(dir, logger)
2828
}
29-
return HasUvLockFileSingle(dir, logger)
29+
return HasUvLockFileSingle(dir, targetFile, logger)
3030
}
3131

32-
// HasUvLockFileSingle checks if the specified directory contains a uv.lock file.
33-
func HasUvLockFileSingle(dir string, logger *zerolog.Logger) bool {
34-
uvLockPath := filepath.Join(dir, constants.UvLockFileName)
32+
// HasUvLockFileSingle checks if the specified directory contains a uv.lock file or the target file if provided.
33+
func HasUvLockFileSingle(dir, targetFile string, logger *zerolog.Logger) bool {
34+
var uvLockPath string
35+
if targetFile != "" {
36+
uvLockPath = filepath.Join(dir, targetFile)
37+
} else {
38+
uvLockPath = filepath.Join(dir, constants.UvLockFileName)
39+
}
40+
3541
_, err := os.Stat(uvLockPath)
3642
if err == nil {
3743
return true
@@ -95,9 +101,9 @@ func HasUvLockFileRecursive(dir string, logger *zerolog.Logger) bool {
95101
}
96102

97103
// HasUvLockFileInAnyDir checks if any of the input directories contains a uv.lock file.
98-
func HasUvLockFileInAnyDir(inputDirs []string, allProjects bool, logger *zerolog.Logger) bool {
104+
func HasUvLockFileInAnyDir(inputDirs []string, targetFile string, allProjects bool, logger *zerolog.Logger) bool {
99105
for _, inputDir := range inputDirs {
100-
if HasUvLockFile(inputDir, allProjects, logger) {
106+
if HasUvLockFile(inputDir, targetFile, allProjects, logger) {
101107
return true
102108
}
103109
}

internal/util/uv_test.go

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestHasUvLockFile(t *testing.T) {
2323
tmpDir := t.TempDir()
2424
createUvLockFile(t, tmpDir, "project1")
2525

26-
result := util.HasUvLockFile(tmpDir, false, &nopLogger)
26+
result := util.HasUvLockFile(tmpDir, "", false, &nopLogger)
2727
assert.False(t, result)
2828
})
2929

@@ -33,7 +33,7 @@ func TestHasUvLockFile(t *testing.T) {
3333
tmpDir := t.TempDir()
3434
createUvLockFile(t, tmpDir, "project1")
3535

36-
result := util.HasUvLockFile(tmpDir, true, &nopLogger)
36+
result := util.HasUvLockFile(tmpDir, "", true, &nopLogger)
3737
assert.True(t, result)
3838
})
3939
}
@@ -48,23 +48,43 @@ func TestHasUvLockFileSingle(t *testing.T) {
4848
tmpDir := t.TempDir()
4949
createUvLockFile(t, tmpDir)
5050

51-
result := util.HasUvLockFileSingle(tmpDir, &nopLogger)
51+
result := util.HasUvLockFileSingle(tmpDir, "", &nopLogger)
52+
assert.True(t, result)
53+
})
54+
55+
t.Run("returns true when uv.lock exists with target file", func(t *testing.T) {
56+
t.Parallel()
57+
58+
tmpDir := t.TempDir()
59+
createUvLockFile(t, tmpDir)
60+
61+
result := util.HasUvLockFileSingle(tmpDir, "uv.lock", &nopLogger)
62+
assert.True(t, result)
63+
})
64+
65+
t.Run("returns true when uv.lock exists with target file in subdirectory", func(t *testing.T) {
66+
t.Parallel()
67+
68+
tmpDir := t.TempDir()
69+
createUvLockFile(t, tmpDir, "subdir")
70+
71+
result := util.HasUvLockFileSingle(tmpDir, "subdir/uv.lock", &nopLogger)
5272
assert.True(t, result)
5373
})
5474

5575
t.Run("returns false when uv.lock does not exist", func(t *testing.T) {
5676
t.Parallel()
5777
dir := t.TempDir()
5878

59-
result := util.HasUvLockFileSingle(dir, &nopLogger)
79+
result := util.HasUvLockFileSingle(dir, "", &nopLogger)
6080
assert.False(t, result)
6181
})
6282

6383
t.Run("returns false when directory does not exist", func(t *testing.T) {
6484
t.Parallel()
6585
dir := filepath.Join(t.TempDir(), "nonexistent")
6686

67-
result := util.HasUvLockFileSingle(dir, &nopLogger)
87+
result := util.HasUvLockFileSingle(dir, "", &nopLogger)
6888
assert.False(t, result)
6989
})
7090

@@ -75,7 +95,7 @@ func TestHasUvLockFileSingle(t *testing.T) {
7595
err := os.WriteFile(uvLockPath, []byte("# test"), 0o600)
7696
require.NoError(t, err)
7797

78-
result := util.HasUvLockFileSingle(dir, nil)
98+
result := util.HasUvLockFileSingle(dir, "", nil)
7999
assert.True(t, result)
80100
})
81101
}
@@ -155,7 +175,7 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
155175
err := os.WriteFile(uvLockPath, []byte("# test"), 0o600)
156176
require.NoError(t, err)
157177

158-
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
178+
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
159179
assert.True(t, result)
160180
})
161181

@@ -168,7 +188,7 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
168188
err := os.WriteFile(uvLockPath, []byte("# test"), 0o600)
169189
require.NoError(t, err)
170190

171-
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
191+
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
172192
assert.True(t, result)
173193
})
174194

@@ -185,7 +205,7 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
185205
err = os.WriteFile(uvLockPath2, []byte("# test"), 0o600)
186206
require.NoError(t, err)
187207

188-
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
208+
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
189209
assert.True(t, result)
190210
})
191211

@@ -194,14 +214,14 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
194214
dir1 := t.TempDir()
195215
dir2 := t.TempDir()
196216

197-
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
217+
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
198218
assert.False(t, result)
199219
})
200220

201221
t.Run("returns false for empty directory list", func(t *testing.T) {
202222
t.Parallel()
203223

204-
result := util.HasUvLockFileInAnyDir([]string{}, false, &nopLogger)
224+
result := util.HasUvLockFileInAnyDir([]string{}, "", false, &nopLogger)
205225
assert.False(t, result)
206226
})
207227

@@ -214,7 +234,7 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
214234
err := os.WriteFile(uvLockPath, []byte("# test"), 0o600)
215235
require.NoError(t, err)
216236

217-
result := util.HasUvLockFileInAnyDir([]string{nonExistentDir, dir1}, false, &nopLogger)
237+
result := util.HasUvLockFileInAnyDir([]string{nonExistentDir, dir1}, "", false, &nopLogger)
218238
assert.True(t, result)
219239
})
220240
}

0 commit comments

Comments
 (0)