From 585f62cad44c5780cd690f67d1ef0b4596f690ca Mon Sep 17 00:00:00 2001
From: Cristian Maglie <c.maglie@arduino.cc>
Date: Mon, 28 Sep 2020 16:04:04 +0200
Subject: [PATCH 1/2] Do not overwrite full headers list with declared
 'includes' in library.properties

Otherwise the automatic library discovery would be affected.

Fix #960
---
 arduino/libraries/libraries.go | 11 ++++++++++-
 arduino/libraries/loader.go    |  2 +-
 commands/lib/list.go           |  7 +------
 3 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/arduino/libraries/libraries.go b/arduino/libraries/libraries.go
index 4403fa2ce50..da154d23e2d 100644
--- a/arduino/libraries/libraries.go
+++ b/arduino/libraries/libraries.go
@@ -73,6 +73,7 @@ type Library struct {
 	License                string
 	Properties             *properties.Map
 	Examples               paths.PathList
+	declaredHeaders        []string
 	sourceHeaders          []string
 }
 
@@ -157,7 +158,15 @@ func (library *Library) LocationPriorityFor(platformRelease, refPlatformRelease
 	return 0
 }
 
-// SourceHeaders returns the C++ headers in the library.
+// DeclaredHeaders returns the C++ headers that the library declares in library.properties
+func (library *Library) DeclaredHeaders() []string {
+	if library.declaredHeaders == nil {
+		library.declaredHeaders = []string{}
+	}
+	return library.declaredHeaders
+}
+
+// SourceHeaders returns all the C++ headers in the library even if not declared in library.properties
 func (library *Library) SourceHeaders() ([]string, error) {
 	if library.sourceHeaders == nil {
 		cppHeaders, err := library.SourceDir.ReadDir()
diff --git a/arduino/libraries/loader.go b/arduino/libraries/loader.go
index 912fc312606..8e8462536e4 100644
--- a/arduino/libraries/loader.go
+++ b/arduino/libraries/loader.go
@@ -101,7 +101,7 @@ func makeNewLibrary(libraryDir *paths.Path, location LibraryLocation) (*Library,
 	}
 
 	if includes := libProperties.Get("includes"); includes != "" {
-		library.sourceHeaders = commaSeparatedToList(includes)
+		library.declaredHeaders = commaSeparatedToList(includes)
 	}
 
 	if err := addExamples(library); err != nil {
diff --git a/commands/lib/list.go b/commands/lib/list.go
index beecf6bbab3..e34ea5e07c4 100644
--- a/commands/lib/list.go
+++ b/commands/lib/list.go
@@ -146,11 +146,6 @@ func GetOutputLibrary(lib *libraries.Library) (*rpc.Library, error) {
 		cntplat = lib.ContainerPlatform.String()
 	}
 
-	libHeaders, err := lib.SourceHeaders()
-	if err != nil {
-		return nil, errors.Errorf("getting library headers: %s", err)
-	}
-
 	return &rpc.Library{
 		Name:              lib.Name,
 		Author:            lib.Author,
@@ -175,7 +170,7 @@ func GetOutputLibrary(lib *libraries.Library) (*rpc.Library, error) {
 		Version:           lib.Version.String(),
 		License:           lib.License,
 		Examples:          lib.Examples.AsStrings(),
-		ProvidesIncludes:  libHeaders,
+		ProvidesIncludes:  lib.DeclaredHeaders(),
 	}, nil
 }
 

From c59f3446d08d2145cb40286f0b522a80f3518a65 Mon Sep 17 00:00:00 2001
From: Cristian Maglie <c.maglie@arduino.cc>
Date: Mon, 28 Sep 2020 18:06:29 +0200
Subject: [PATCH 2/2] fixed tests for 'provides_includes'

---
 test/test_lib.py | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/test/test_lib.py b/test/test_lib.py
index e7c0a5e5d91..e4335f2ebc5 100644
--- a/test/test_lib.py
+++ b/test/test_lib.py
@@ -56,21 +56,18 @@ def test_list(run_command):
     assert 1 == len(data)
     # be sure data contains the available version
     assert "" != data[0]["release"]["version"]
-    # be sure data contains the correct provides_includes field
-    assert "ArduinoJson.h" == data[0]["library"]["provides_includes"][0]
-    assert "ArduinoJson.hpp" == data[0]["library"]["provides_includes"][1]
 
     # Install something we can list without provides_includes field given in library.properties
-    result = run_command("lib install Braccio@2.0.4")
+    result = run_command("lib install Arduino_APDS9960@1.0.3")
     assert result.ok
     # Look at the JSON output
-    result = run_command("lib list Braccio --format json")
+    result = run_command("lib list Arduino_APDS9960 --format json")
     assert result.ok
     assert "" == result.stderr
     data = json.loads(result.stdout)
     assert 1 == len(data)
     # be sure data contains the correct provides_includes field
-    assert "Braccio.h" == data[0]["library"]["provides_includes"][0]
+    assert "Arduino_APDS9960.h" == data[0]["library"]["provides_includes"][0]
 
 
 def test_install(run_command):