Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
4 changes: 3 additions & 1 deletion pkg/dependency/parser/dotnet/core_deps/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package core_deps

import (
"context"
"maps"
"slices"
"sort"
"strings"
Expand Down Expand Up @@ -104,7 +105,8 @@ func (p *Parser) collectPackages(depsFile dotNetDependencies, targetLibs map[str
var projectNameVer string
pkgs := make(map[string]ftypes.Package, len(depsFile.Libraries))

for nameVer, lib := range depsFile.Libraries {
for _, nameVer := range slices.Sorted(maps.Keys(depsFile.Libraries)) {
lib := depsFile.Libraries[nameVer]
name, version, ok := strings.Cut(nameVer, "/")
if !ok {
// Invalid name
Expand Down
17 changes: 17 additions & 0 deletions pkg/dependency/parser/dotnet/core_deps/parse_test.go
Comment thread
jetersen marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,20 @@ func TestParse(t *testing.T) {
})
}
}

func TestCollectPackagesDeterministicRoot(t *testing.T) {
depsFile := dotNetDependencies{
Libraries: map[string]dotNetLibrary{
"Zebra/1.0.0": {Type: "project"},
"Mango/1.0.0": {Type: "project"},
"Alpha/1.0.0": {Type: "project"},
},
}

// The lexicographically first project library must win regardless of
// map iteration order.
pkgs, root := NewParser().collectPackages(depsFile, nil, false)

assert.Equal(t, "Alpha/1.0.0", root)
assert.Equal(t, ftypes.RelationshipRoot, pkgs[root].Relationship)
}
Loading