Skip to content

Commit d89b51e

Browse files
author
Federico Fissore
committed
Source files were recursively collected despite target library was layout was
FLAT. Fixes #41 Signed-off-by: Federico Fissore <[email protected]>
1 parent 8c1b2d8 commit d89b51e

18 files changed

+182
-30
lines changed

Diff for: src/arduino.cc/builder/add_additional_entries_to_context.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func (s *AddAdditionalEntriesToContext) Run(context map[string]interface{}) erro
8282

8383
sourceFiles := &types.UniqueStringQueue{}
8484
context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE] = sourceFiles
85-
foldersWithSources := &types.UniqueStringQueue{}
85+
foldersWithSources := &types.UniqueSourceFolderQueue{}
8686
context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE] = foldersWithSources
8787

8888
context[constants.CTX_LIBRARY_RESOLUTION_RESULTS] = make(map[string]types.LibraryResolutionResult)

Diff for: src/arduino.cc/builder/collect_all_source_files_from_folders_with_sources.go

+38-5
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,27 @@ import (
3434
"arduino.cc/builder/gohasissues"
3535
"arduino.cc/builder/types"
3636
"arduino.cc/builder/utils"
37+
"io/ioutil"
38+
"os"
39+
"path/filepath"
40+
"strings"
3741
)
3842

3943
type CollectAllSourceFilesFromFoldersWithSources struct{}
4044

4145
func (s *CollectAllSourceFilesFromFoldersWithSources) Run(context map[string]interface{}) error {
42-
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueStringQueue)
46+
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueSourceFolderQueue)
4347
sourceFiles := context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE].(*types.UniqueStringQueue)
4448

4549
filePaths := []string{}
4650
for !foldersWithSources.Empty() {
47-
checkExtensionFunc := func(ext string) bool {
48-
return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext]
51+
sourceFolder := foldersWithSources.Pop().(types.SourceFolder)
52+
var err error
53+
if sourceFolder.Recurse {
54+
err = collectByWalk(&filePaths, sourceFolder.Folder)
55+
} else {
56+
err = collectByReadDir(&filePaths, sourceFolder.Folder)
4957
}
50-
walkFunc := utils.CollectAllReadableFiles(&filePaths, checkExtensionFunc)
51-
err := gohasissues.Walk(foldersWithSources.Pop().(string), walkFunc)
5258
if err != nil {
5359
return utils.WrapError(err)
5460
}
@@ -60,3 +66,30 @@ func (s *CollectAllSourceFilesFromFoldersWithSources) Run(context map[string]int
6066

6167
return nil
6268
}
69+
70+
func collectByWalk(filePaths *[]string, folder string) error {
71+
checkExtensionFunc := func(ext string) bool {
72+
return ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext]
73+
}
74+
walkFunc := utils.CollectAllReadableFiles(filePaths, checkExtensionFunc)
75+
err := gohasissues.Walk(folder, walkFunc)
76+
return utils.WrapError(err)
77+
}
78+
79+
func collectByReadDir(filePaths *[]string, folder string) error {
80+
if _, err := os.Stat(folder); err != nil && os.IsNotExist(err) {
81+
return nil
82+
}
83+
84+
files, err := ioutil.ReadDir(folder)
85+
if err != nil {
86+
return utils.WrapError(err)
87+
}
88+
for _, file := range files {
89+
ext := strings.ToLower(filepath.Ext(file.Name()))
90+
if ADDITIONAL_FILE_VALID_EXTENSIONS_NO_HEADERS[ext] {
91+
*filePaths = append(*filePaths, filepath.Join(folder, file.Name()))
92+
}
93+
}
94+
return nil
95+
}

Diff for: src/arduino.cc/builder/container_find_includes.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,14 @@ func (s *ContainerFindIncludes) Run(context map[string]interface{}) error {
6262
}
6363
}
6464

65-
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueStringQueue)
66-
foldersWithSources.Push(context[constants.CTX_SKETCH_BUILD_PATH])
65+
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueSourceFolderQueue)
66+
foldersWithSources.Push(types.SourceFolder{Folder: context[constants.CTX_SKETCH_BUILD_PATH].(string), Recurse: true})
6767
if utils.MapHas(context, constants.CTX_IMPORTED_LIBRARIES) {
6868
for _, library := range context[constants.CTX_IMPORTED_LIBRARIES].([]*types.Library) {
69-
foldersWithSources.Push(library.SrcFolder)
69+
sourceFolders := utils.LibraryToSourceFolder(library)
70+
for _, sourceFolder := range sourceFolders {
71+
foldersWithSources.Push(sourceFolder)
72+
}
7073
}
7174
}
7275

Diff for: src/arduino.cc/builder/includes_to_include_folders.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,15 @@ func (s *IncludesToIncludeFolders) Run(context map[string]interface{}) error {
6262
return utils.WrapError(err)
6363
}
6464

65-
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueStringQueue)
65+
foldersWithSources := context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueSourceFolderQueue)
6666

6767
for _, newlyImportedLibrary := range newlyImportedLibraries {
6868
if !sliceContainsLibrary(importedLibraries, newlyImportedLibrary) {
6969
importedLibraries = append(importedLibraries, newlyImportedLibrary)
70-
foldersWithSources.Push(newlyImportedLibrary.SrcFolder)
70+
sourceFolders := utils.LibraryToSourceFolder(newlyImportedLibrary)
71+
for _, sourceFolder := range sourceFolders {
72+
foldersWithSources.Push(sourceFolder)
73+
}
7174
}
7275
}
7376

Diff for: src/arduino.cc/builder/test/add_additional_entries_to_context_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func TestAddAdditionalEntriesToContextNoBuildPath(t *testing.T) {
5555
require.NotNil(t, context[constants.CTX_LIBRARY_DISCOVERY_RECURSION_DEPTH])
5656

5757
require.True(t, context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE].(*types.UniqueStringQueue).Empty())
58-
require.True(t, context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueStringQueue).Empty())
58+
require.True(t, context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueSourceFolderQueue).Empty())
5959

6060
require.Equal(t, 0, len(context[constants.CTX_LIBRARY_RESOLUTION_RESULTS].(map[string]types.LibraryResolutionResult)))
6161
}
@@ -79,7 +79,7 @@ func TestAddAdditionalEntriesToContextWithBuildPath(t *testing.T) {
7979
require.NotNil(t, context[constants.CTX_LIBRARY_DISCOVERY_RECURSION_DEPTH])
8080

8181
require.True(t, context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE].(*types.UniqueStringQueue).Empty())
82-
require.True(t, context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueStringQueue).Empty())
82+
require.True(t, context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE].(*types.UniqueSourceFolderQueue).Empty())
8383

8484
require.Equal(t, 0, len(context[constants.CTX_LIBRARY_RESOLUTION_RESULTS].(map[string]types.LibraryResolutionResult)))
8585
}

Diff for: src/arduino.cc/builder/test/builder_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,24 @@ func TestBuilderSketchWithBackup(t *testing.T) {
292292
err := command.Run(context)
293293
NoError(t, err)
294294
}
295+
296+
func TestBuilderSketchWithOldLib(t *testing.T) {
297+
DownloadCoresAndToolsAndLibraries(t)
298+
299+
context := make(map[string]interface{})
300+
301+
buildPath := SetupBuildPath(t, context)
302+
defer os.RemoveAll(buildPath)
303+
304+
context[constants.CTX_HARDWARE_FOLDERS] = []string{filepath.Join("..", "hardware"), "hardware", "downloaded_hardware"}
305+
context[constants.CTX_TOOLS_FOLDERS] = []string{"downloaded_tools"}
306+
context[constants.CTX_FQBN] = "arduino:avr:uno"
307+
context[constants.CTX_SKETCH_LOCATION] = filepath.Join("sketch_with_old_lib", "sketch.ino")
308+
context[constants.CTX_BUILT_IN_LIBRARIES_FOLDERS] = []string{"downloaded_libraries"}
309+
context[constants.CTX_OTHER_LIBRARIES_FOLDERS] = []string{"libraries"}
310+
context[constants.CTX_BUILD_PROPERTIES_RUNTIME_IDE_VERSION] = "10600"
311+
312+
command := builder.Builder{}
313+
err := command.Run(context)
314+
NoError(t, err)
315+
}

Diff for: src/arduino.cc/builder/test/collect_all_source_files_from_folders_with_sources_test.go

+34-4
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ func TestCollectAllSourceFilesFromFoldersWithSources(t *testing.T) {
4444

4545
sourceFiles := &types.UniqueStringQueue{}
4646
context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE] = sourceFiles
47-
foldersWithSources := &types.UniqueStringQueue{}
48-
foldersWithSources.Push(Abs(t, "sketch_with_config"))
47+
foldersWithSources := &types.UniqueSourceFolderQueue{}
48+
foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, "sketch_with_config"), Recurse: true})
4949
context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE] = foldersWithSources
5050

5151
commands := []types.Command{
@@ -71,8 +71,8 @@ func TestCollectAllSourceFilesFromFoldersWithSourcesOfLibrary(t *testing.T) {
7171

7272
sourceFiles := &types.UniqueStringQueue{}
7373
context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE] = sourceFiles
74-
foldersWithSources := &types.UniqueStringQueue{}
75-
foldersWithSources.Push(Abs(t, filepath.Join("downloaded_libraries", "Bridge")))
74+
foldersWithSources := &types.UniqueSourceFolderQueue{}
75+
foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("downloaded_libraries", "Bridge")), Recurse: true})
7676
context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE] = foldersWithSources
7777

7878
commands := []types.Command{
@@ -100,3 +100,33 @@ func TestCollectAllSourceFilesFromFoldersWithSourcesOfLibrary(t *testing.T) {
100100
require.Equal(t, Abs(t, filepath.Join("downloaded_libraries", "Bridge", "src", "Process.cpp")), sourceFiles.Pop())
101101
require.Equal(t, 0, len(*sourceFiles))
102102
}
103+
104+
func TestCollectAllSourceFilesFromFoldersWithSourcesOfOldLibrary(t *testing.T) {
105+
context := make(map[string]interface{})
106+
107+
sourceFiles := &types.UniqueStringQueue{}
108+
context[constants.CTX_COLLECTED_SOURCE_FILES_QUEUE] = sourceFiles
109+
foldersWithSources := &types.UniqueSourceFolderQueue{}
110+
foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs")), Recurse: false})
111+
foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "utility")), Recurse: false})
112+
foldersWithSources.Push(types.SourceFolder{Folder: Abs(t, "non existent folder"), Recurse: false})
113+
context[constants.CTX_FOLDERS_WITH_SOURCES_QUEUE] = foldersWithSources
114+
115+
commands := []types.Command{
116+
&builder.SetupHumanLoggerIfMissing{},
117+
&builder.CollectAllSourceFilesFromFoldersWithSources{},
118+
}
119+
120+
for _, command := range commands {
121+
err := command.Run(context)
122+
NoError(t, err)
123+
}
124+
125+
require.Equal(t, 2, len(*sourceFiles))
126+
require.Equal(t, 0, len(*foldersWithSources))
127+
sort.Strings(*sourceFiles)
128+
129+
require.Equal(t, Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "ShouldNotRecurseWithOldLibs.cpp")), sourceFiles.Pop())
130+
require.Equal(t, Abs(t, filepath.Join("libraries", "ShouldNotRecurseWithOldLibs", "utility", "utils.cpp")), sourceFiles.Pop())
131+
require.Equal(t, 0, len(*sourceFiles))
132+
}

Diff for: src/arduino.cc/builder/test/libraries/ShouldNotRecurseWithOldLibs/ShouldNotRecurseWithOldLibs.cpp

Whitespace-only changes.

Diff for: src/arduino.cc/builder/test/libraries/ShouldNotRecurseWithOldLibs/ShouldNotRecurseWithOldLibs.h

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#error "This file is never supposed to be compiled"

Diff for: src/arduino.cc/builder/test/libraries/ShouldNotRecurseWithOldLibs/utility/utils.cpp

Whitespace-only changes.

Diff for: src/arduino.cc/builder/test/libraries/ShouldNotRecurseWithOldLibs/utility/utils.h

Whitespace-only changes.

Diff for: src/arduino.cc/builder/test/libraries_loader_test.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func TestLoadLibrariesAVR(t *testing.T) {
6969
require.Equal(t, Abs(t, filepath.Join("libraries")), librariesFolders[2])
7070

7171
libraries := context[constants.CTX_LIBRARIES].([]*types.Library)
72-
require.Equal(t, 15, len(libraries))
72+
require.Equal(t, 16, len(libraries))
7373

7474
sort.Sort(ByLibraryName(libraries))
7575

@@ -117,6 +117,8 @@ func TestLoadLibrariesAVR(t *testing.T) {
117117
idx++
118118
require.Equal(t, "SPI", libraries[idx].Name)
119119
idx++
120+
require.Equal(t, "ShouldNotRecurseWithOldLibs", libraries[idx].Name)
121+
idx++
120122
require.Equal(t, "SoftwareSerial", libraries[idx].Name)
121123
idx++
122124
require.Equal(t, "USBHost", libraries[idx].Name)
@@ -171,7 +173,7 @@ func TestLoadLibrariesSAM(t *testing.T) {
171173
require.Equal(t, Abs(t, filepath.Join("libraries")), librariesFolders[2])
172174

173175
libraries := context[constants.CTX_LIBRARIES].([]*types.Library)
174-
require.Equal(t, 13, len(libraries))
176+
require.Equal(t, 14, len(libraries))
175177

176178
sort.Sort(ByLibraryName(libraries))
177179

@@ -198,6 +200,8 @@ func TestLoadLibrariesSAM(t *testing.T) {
198200
idx++
199201
require.Equal(t, "SPI", libraries[idx].Name)
200202
idx++
203+
require.Equal(t, "ShouldNotRecurseWithOldLibs", libraries[idx].Name)
204+
idx++
201205
require.Equal(t, "USBHost", libraries[idx].Name)
202206
idx++
203207
require.Equal(t, "Wire", libraries[idx].Name)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#include "ShouldNotRecurseWithOldLibs.h"
2+
3+
void setup() {
4+
5+
}
6+
7+
void loop() {
8+
9+
}

Diff for: src/arduino.cc/builder/types/accessories.go

+34-11
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,48 @@ package types
3131

3232
type UniqueStringQueue []string
3333

34-
func (h UniqueStringQueue) Len() int { return len(h) }
35-
func (h UniqueStringQueue) Less(i, j int) bool { return false }
36-
func (h UniqueStringQueue) Swap(i, j int) { panic("Who called me?!?") }
34+
func (queue UniqueStringQueue) Len() int { return len(queue) }
35+
func (queue UniqueStringQueue) Less(i, j int) bool { return false }
36+
func (queue UniqueStringQueue) Swap(i, j int) { panic("Who called me?!?") }
3737

38-
func (h *UniqueStringQueue) Push(x interface{}) {
39-
if !sliceContains(*h, x.(string)) {
40-
*h = append(*h, x.(string))
38+
func (queue *UniqueStringQueue) Push(value string) {
39+
if !sliceContains(*queue, value) {
40+
*queue = append(*queue, value)
4141
}
4242
}
4343

44-
func (h *UniqueStringQueue) Pop() interface{} {
45-
old := *h
44+
func (queue *UniqueStringQueue) Pop() interface{} {
45+
old := *queue
4646
x := old[0]
47-
*h = old[1:]
47+
*queue = old[1:]
4848
return x
4949
}
5050

51-
func (h *UniqueStringQueue) Empty() bool {
52-
return h.Len() == 0
51+
func (queue *UniqueStringQueue) Empty() bool {
52+
return queue.Len() == 0
53+
}
54+
55+
type UniqueSourceFolderQueue []SourceFolder
56+
57+
func (queue UniqueSourceFolderQueue) Len() int { return len(queue) }
58+
func (queue UniqueSourceFolderQueue) Less(i, j int) bool { return false }
59+
func (queue UniqueSourceFolderQueue) Swap(i, j int) { panic("Who called me?!?") }
60+
61+
func (queue *UniqueSourceFolderQueue) Push(value SourceFolder) {
62+
if !sliceContainsSourceFolder(*queue, value) {
63+
*queue = append(*queue, value)
64+
}
65+
}
66+
67+
func (queue *UniqueSourceFolderQueue) Pop() interface{} {
68+
old := *queue
69+
x := old[0]
70+
*queue = old[1:]
71+
return x
72+
}
73+
74+
func (queue *UniqueSourceFolderQueue) Empty() bool {
75+
return queue.Len() == 0
5376
}
5477

5578
type LibraryResolutionResult struct {

Diff for: src/arduino.cc/builder/types/types.go

+5
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,8 @@ type Prototype struct {
156156
Prototype string
157157
Fields map[string]string
158158
}
159+
160+
type SourceFolder struct {
161+
Folder string
162+
Recurse bool
163+
}

Diff for: src/arduino.cc/builder/types/utils.go

+9
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,12 @@ func sliceContains(slice []string, target string) bool {
3838
}
3939
return false
4040
}
41+
42+
func sliceContainsSourceFolder(slice []SourceFolder, target SourceFolder) bool {
43+
for _, elem := range slice {
44+
if elem.Folder == target.Folder {
45+
return true
46+
}
47+
}
48+
return false
49+
}

Diff for: src/arduino.cc/builder/utils/utils.go

+11
Original file line numberDiff line numberDiff line change
@@ -415,3 +415,14 @@ func AppendIfNotPresent(target []string, elements ...string) []string {
415415
}
416416
return target
417417
}
418+
419+
func LibraryToSourceFolder(library *types.Library) []types.SourceFolder {
420+
sourceFolders := []types.SourceFolder{}
421+
recurse := library.Layout == types.LIBRARY_RECURSIVE
422+
sourceFolders = append(sourceFolders, types.SourceFolder{Folder: library.SrcFolder, Recurse: recurse})
423+
if library.Layout == types.LIBRARY_FLAT {
424+
utility := filepath.Join(library.SrcFolder, constants.LIBRARY_FOLDER_UTILITY)
425+
sourceFolders = append(sourceFolders, types.SourceFolder{Folder: utility, Recurse: false})
426+
}
427+
return sourceFolders
428+
}

0 commit comments

Comments
 (0)