Skip to content

feat: library folder name priority promotion for -main suffix #2233

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jul 4, 2023
4 changes: 3 additions & 1 deletion arduino/libraries/librariesresolver/cpp.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,10 @@ func ComputePriority(lib *libraries.Library, header, arch string) int {
}

if name == header && dirName == header {
priority += 600
priority += 700
} else if name == header || dirName == header {
priority += 600
} else if name == header+"-main" || dirName == header+"-main" {
priority += 500
} else if name == header+"-master" || dirName == header+"-master" {
priority += 400
Expand Down
36 changes: 20 additions & 16 deletions arduino/libraries/librariesresolver/cpp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ import (
)

var l1 = &libraries.Library{Name: "Calculus Lib", Location: libraries.User}
var l2 = &libraries.Library{Name: "Calculus Lib-master", Location: libraries.User}
var l3 = &libraries.Library{Name: "Calculus Lib Improved", Location: libraries.User}
var l4 = &libraries.Library{Name: "Another Calculus Lib", Location: libraries.User}
var l5 = &libraries.Library{Name: "Yet Another Calculus Lib Improved", Location: libraries.User}
var l6 = &libraries.Library{Name: "Calculus Unified Lib", Location: libraries.User}
var l7 = &libraries.Library{Name: "AnotherLib", Location: libraries.User}
var l2 = &libraries.Library{Name: "Calculus Lib-main", Location: libraries.User}
var l3 = &libraries.Library{Name: "Calculus Lib-master", Location: libraries.User}
var l4 = &libraries.Library{Name: "Calculus Lib Improved", Location: libraries.User}
var l5 = &libraries.Library{Name: "Another Calculus Lib", Location: libraries.User}
var l6 = &libraries.Library{Name: "Yet Another Calculus Lib Improved", Location: libraries.User}
var l7 = &libraries.Library{Name: "Calculus Unified Lib", Location: libraries.User}
var l8 = &libraries.Library{Name: "AnotherLib", Location: libraries.User}
var bundleServo = &libraries.Library{Name: "Servo", Location: libraries.IDEBuiltIn, Architectures: []string{"avr", "sam", "samd"}}

func runResolver(include string, arch string, libs ...*libraries.Library) *libraries.Library {
Expand Down Expand Up @@ -91,14 +92,14 @@ func TestArchitecturePriority(t *testing.T) {

func TestClosestMatchWithTotallyDifferentNames(t *testing.T) {
libraryList := libraries.List{}
libraryList.Add(l5)
libraryList.Add(l6)
libraryList.Add(l7)
libraryList.Add(l8)
resolver := NewCppResolver()
resolver.headers["XYZ.h"] = libraryList
res := resolver.ResolveFor("XYZ.h", "xyz")
require.NotNil(t, res)
require.Equal(t, l7, res, "selected library")
require.Equal(t, l8, res, "selected library")
}

func TestCppHeaderPriority(t *testing.T) {
Expand All @@ -109,12 +110,14 @@ func TestCppHeaderPriority(t *testing.T) {
r5 := ComputePriority(l5, "calculus_lib.h", "avr")
r6 := ComputePriority(l6, "calculus_lib.h", "avr")
r7 := ComputePriority(l7, "calculus_lib.h", "avr")
r8 := ComputePriority(l8, "calculus_lib.h", "avr")
require.True(t, r1 > r2)
require.True(t, r2 > r3)
require.True(t, r3 > r4)
require.True(t, r4 > r5)
require.True(t, r5 > r6)
require.True(t, r6 == r7)
require.True(t, r6 > r7)
require.True(t, r7 == r8)
}

func TestCppHeaderResolverWithNilResult(t *testing.T) {
Expand All @@ -135,13 +138,14 @@ func TestCppHeaderResolver(t *testing.T) {
resolver.headers[header] = librarylist
return resolver.ResolveFor(header, "avr").Name
}
require.Equal(t, "Calculus Lib", resolve("calculus_lib.h", l1, l2, l3, l4, l5, l6, l7))
require.Equal(t, "Calculus Lib-master", resolve("calculus_lib.h", l2, l3, l4, l5, l6, l7))
require.Equal(t, "Calculus Lib Improved", resolve("calculus_lib.h", l3, l4, l5, l6, l7))
require.Equal(t, "Another Calculus Lib", resolve("calculus_lib.h", l4, l5, l6, l7))
require.Equal(t, "Yet Another Calculus Lib Improved", resolve("calculus_lib.h", l5, l6, l7))
require.Equal(t, "Calculus Unified Lib", resolve("calculus_lib.h", l6, l7))
require.Equal(t, "Calculus Unified Lib", resolve("calculus_lib.h", l7, l6))
require.Equal(t, "Calculus Lib", resolve("calculus_lib.h", l1, l2, l3, l4, l5, l6, l7, l8))
require.Equal(t, "Calculus Lib-main", resolve("calculus_lib.h", l2, l3, l4, l5, l6, l7, l8))
require.Equal(t, "Calculus Lib-master", resolve("calculus_lib.h", l3, l4, l5, l6, l7, l8))
require.Equal(t, "Calculus Lib Improved", resolve("calculus_lib.h", l4, l5, l6, l7, l8))
require.Equal(t, "Another Calculus Lib", resolve("calculus_lib.h", l5, l6, l7, l8))
require.Equal(t, "Yet Another Calculus Lib Improved", resolve("calculus_lib.h", l6, l7, l8))
require.Equal(t, "Calculus Unified Lib", resolve("calculus_lib.h", l7, l8))
require.Equal(t, "Calculus Unified Lib", resolve("calculus_lib.h", l8, l7))
}

func TestCppHeaderResolverWithLibrariesInStrangeDirectoryNames(t *testing.T) {
Expand Down
2 changes: 2 additions & 0 deletions docs/sketch-build-process.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ The "library name priority" is determined as follows (in order of highest to low
| Rule | Example for `Arduino_Low_Power.h` |
| ------------------------------------------------------------------------- | --------------------------------- |
| The library name matches the include 100% | `Arduino Low Power` |
| The library name matches the include 100%, except with a `-main` suffix | `Arduino Low Power-main` |
| The library name matches the include 100%, except with a `-master` suffix | `Arduino Low Power-master` |
| The library name has a matching prefix | `Arduino Low Power Whatever` |
| The library name has a matching suffix | `Awesome Arduino Low Power` |
Expand All @@ -113,6 +114,7 @@ The "folder name priority" is determined as follows (in order of highest to lowe
| Rule | Example for `Servo.h` |
| ------------------------------------------------------------------------ | --------------------------- |
| The folder name matches the include 100% | `Servo` |
| The folder name matches the include 100%, except with a `-main` suffix | `Servo-main` |
| The folder name matches the include 100%, except with a `-master` suffix | `Servo-master` |
| The folder name has a matching prefix | `ServoWhatever` |
| The folder name has a matching suffix | `AwesomeServo` |
Expand Down