Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion internal/commands/ostest/routing.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ type FlowConfig struct {
Unmanaged bool
TargetPackage string
AllProjects bool
FileFlag string
}

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

experimentalFlagSet := cfg.GetBool(configuration.FLAG_EXPERIMENTAL)
experimentalUvSupport := experimentalFlagSet && cfg.GetBool(constants.EnableExperimentalUvSupportEnvVar)
Expand Down Expand Up @@ -204,6 +206,7 @@ func ParseFlowConfig(cfg configuration.Configuration) (*FlowConfig, error) {
Unmanaged: unmanaged,
TargetPackage: targetPackage,
AllProjects: allProjects,
FileFlag: fileFlag,
}, nil
}

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

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

hasNewFeatures := fc.RiskScoreTest || fc.Reachability || fc.SBOM != "" || fc.ReachabilityFilter != "" || uvSupportWithLockFile
useLegacy := fc.ForceLegacyTest || fc.RequiresLegacy || !hasNewFeatures
Expand Down
1 change: 1 addition & 0 deletions internal/commands/ostest/workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ func TestOSWorkflow_FlagCombinations(t *testing.T) {
tempDir := util.CreateTempDirWithUvLock(t)
config.Set(configuration.INPUT_DIRECTORY, []string{tempDir})
config.Set(configuration.FLAG_EXPERIMENTAL, true)
config.Set(flags.FlagFile, "")
config.Set(constants.EnableExperimentalUvSupportEnvVar, true)
mockEngine.EXPECT().
InvokeWithConfig(common.DepGraphWorkflowID, gomock.Any()).
Expand Down
5 changes: 3 additions & 2 deletions internal/common/depgraph.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ func GetDepGraph(ictx workflow.InvocationContext, inputDir string) ([]RawDepGrap

depGraphConfig := config.Clone()
experimentalFlagSet := config.GetBool(configuration.FLAG_EXPERIMENTAL)
allProjectsFlagSet := config.GetBool(flags.FlagAllProjects)
allProjects := config.GetBool(flags.FlagAllProjects)
fileFlag := config.GetString(flags.FlagFile)
experimentalUvSupportEnabled := experimentalFlagSet && config.GetBool(constants.EnableExperimentalUvSupportEnvVar)
uvLockExists := util.HasUvLockFile(inputDir, allProjectsFlagSet, logger)
uvLockExists := util.HasUvLockFile(inputDir, fileFlag, allProjects, logger)

if experimentalUvSupportEnabled && uvLockExists {
logger.Info().Msg("Experimental uv support enabled and uv.lock found, using SBOM resolution in depgraph workflow")
Expand Down
27 changes: 19 additions & 8 deletions internal/util/uv.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,30 @@ var ExcludedUVLockFileDirs = map[string]bool{
".build": true,
}

// HasUvLockFile checks if the specified directory contains a uv.lock file.
// HasUvLockFile checks if the specified directory contains a uv.lock file or the target file if provided.
// If allProjects is true, the function will check if the directory contains a uv.lock file recursively.
// Otherwise, it will only check if the directory contains a uv.lock file.
func HasUvLockFile(dir string, allProjects bool, logger *zerolog.Logger) bool {
func HasUvLockFile(dir, targetFile string, allProjects bool, logger *zerolog.Logger) bool {
if allProjects {
return HasUvLockFileRecursive(dir, logger)
}
return HasUvLockFileSingle(dir, logger)
return HasUvLockFileSingle(dir, targetFile, logger)
}

// HasUvLockFileSingle checks if the specified directory contains a uv.lock file.
func HasUvLockFileSingle(dir string, logger *zerolog.Logger) bool {
uvLockPath := filepath.Join(dir, constants.UvLockFileName)
// HasUvLockFileSingle checks if the specified directory contains a uv.lock file or the target file if provided.
// If targetFile is an absolute path, it will be used directly; otherwise, it will be joined with dir.
func HasUvLockFileSingle(dir, targetFile string, logger *zerolog.Logger) bool {
var uvLockPath string
if targetFile != "" {
if filepath.IsAbs(targetFile) {
uvLockPath = targetFile
} else {
uvLockPath = filepath.Join(dir, targetFile)
}
} else {
uvLockPath = filepath.Join(dir, constants.UvLockFileName)
}

_, err := os.Stat(uvLockPath)
if err == nil {
return true
Expand Down Expand Up @@ -95,9 +106,9 @@ func HasUvLockFileRecursive(dir string, logger *zerolog.Logger) bool {
}

// HasUvLockFileInAnyDir checks if any of the input directories contains a uv.lock file.
func HasUvLockFileInAnyDir(inputDirs []string, allProjects bool, logger *zerolog.Logger) bool {
func HasUvLockFileInAnyDir(inputDirs []string, targetFile string, allProjects bool, logger *zerolog.Logger) bool {
for _, inputDir := range inputDirs {
if HasUvLockFile(inputDir, allProjects, logger) {
if HasUvLockFile(inputDir, targetFile, allProjects, logger) {
return true
}
}
Expand Down
55 changes: 43 additions & 12 deletions internal/util/uv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func TestHasUvLockFile(t *testing.T) {
tmpDir := t.TempDir()
createUvLockFile(t, tmpDir, "project1")

result := util.HasUvLockFile(tmpDir, false, &nopLogger)
result := util.HasUvLockFile(tmpDir, "", false, &nopLogger)
assert.False(t, result)
})

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

result := util.HasUvLockFile(tmpDir, true, &nopLogger)
result := util.HasUvLockFile(tmpDir, "", true, &nopLogger)
assert.True(t, result)
})
}
Expand All @@ -48,23 +48,54 @@ func TestHasUvLockFileSingle(t *testing.T) {
tmpDir := t.TempDir()
createUvLockFile(t, tmpDir)

result := util.HasUvLockFileSingle(tmpDir, &nopLogger)
result := util.HasUvLockFileSingle(tmpDir, "", &nopLogger)
assert.True(t, result)
})

t.Run("returns true when uv.lock exists with target file", func(t *testing.T) {
t.Parallel()

tmpDir := t.TempDir()
createUvLockFile(t, tmpDir)

result := util.HasUvLockFileSingle(tmpDir, "uv.lock", &nopLogger)
assert.True(t, result)
})

t.Run("returns true when uv.lock exists with target file in subdirectory", func(t *testing.T) {
t.Parallel()

tmpDir := t.TempDir()
createUvLockFile(t, tmpDir, "subdir")

result := util.HasUvLockFileSingle(tmpDir, "subdir/uv.lock", &nopLogger)
assert.True(t, result)
})

t.Run("returns true when uv.lock exists with target file in subdirectory and giving absolute path", func(t *testing.T) {
t.Parallel()

tmpDir := t.TempDir()
createUvLockFile(t, tmpDir, "subdir")
absolutePath := filepath.Join(tmpDir, "subdir", constants.UvLockFileName)

result := util.HasUvLockFileSingle(tmpDir, absolutePath, &nopLogger)
assert.True(t, result)
})

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

result := util.HasUvLockFileSingle(dir, &nopLogger)
result := util.HasUvLockFileSingle(dir, "", &nopLogger)
assert.False(t, result)
})

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

result := util.HasUvLockFileSingle(dir, &nopLogger)
result := util.HasUvLockFileSingle(dir, "", &nopLogger)
assert.False(t, result)
})

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

result := util.HasUvLockFileSingle(dir, nil)
result := util.HasUvLockFileSingle(dir, "", nil)
assert.True(t, result)
})
}
Expand Down Expand Up @@ -155,7 +186,7 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
err := os.WriteFile(uvLockPath, []byte("# test"), 0o600)
require.NoError(t, err)

result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
assert.True(t, result)
})

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

result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
assert.True(t, result)
})

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

result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
assert.True(t, result)
})

Expand All @@ -194,14 +225,14 @@ func TestHasUvLockFileInAnyDir(t *testing.T) {
dir1 := t.TempDir()
dir2 := t.TempDir()

result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{dir1, dir2}, "", false, &nopLogger)
assert.False(t, result)
})

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

result := util.HasUvLockFileInAnyDir([]string{}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{}, "", false, &nopLogger)
assert.False(t, result)
})

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

result := util.HasUvLockFileInAnyDir([]string{nonExistentDir, dir1}, false, &nopLogger)
result := util.HasUvLockFileInAnyDir([]string{nonExistentDir, dir1}, "", false, &nopLogger)
assert.True(t, result)
})
}
Expand Down