From a8f5f26447c0f2f954d085bbe55b3b38952b0a3d Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Wed, 16 Dec 2015 14:28:39 +0100 Subject: [PATCH] Don't fail if multiple core version are found use the latest one based on semver a dependency was added (github.com/blang/semver), hopefully we'll use it somwhere else since it's really useful --- src/arduino.cc/builder/constants/constants.go | 1 + src/arduino.cc/builder/hardware_loader.go | 13 ++++++++---- src/arduino.cc/builder/utils/utils.go | 21 +++++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/arduino.cc/builder/constants/constants.go b/src/arduino.cc/builder/constants/constants.go index d80d232c..f25fd477 100644 --- a/src/arduino.cc/builder/constants/constants.go +++ b/src/arduino.cc/builder/constants/constants.go @@ -213,6 +213,7 @@ const MSG_CANT_FIND_SKETCH_IN_PATH = "Unable to find {0} in {1}" const MSG_INVALID_QUOTING = "Invalid quoting: no closing [{0}] char found." const MSG_LIB_LEGACY = "(legacy)" const MSG_LIBRARIES_MULTIPLE_LIBS_FOUND_FOR = "Multiple libraries were found for \"{0}\"" +const MSG_CORES_MULTIPLE_CORES_FOUND_FOR = "Multiple versions of {0} core were found, using {1}" const MSG_LIBRARIES_NOT_USED = " Not used: {0}" const MSG_LIBRARIES_USED = " Used: {0}" const MSG_LIBRARY_CAN_USE_SRC_AND_UTILITY_FOLDERS = "Library can't use both 'src' and 'utility' folders. Double check {0}" diff --git a/src/arduino.cc/builder/hardware_loader.go b/src/arduino.cc/builder/hardware_loader.go index 87428166..f6bd8125 100644 --- a/src/arduino.cc/builder/hardware_loader.go +++ b/src/arduino.cc/builder/hardware_loader.go @@ -84,7 +84,7 @@ func (s *HardwareLoader) Run(context map[string]interface{}) error { } targetPackage := getOrCreatePackage(packages, packageId) - err = loadPackage(targetPackage, subfolderPath, logger) + err = loadPackage(targetPackage, subfolderPath, logger, context) if err != nil { return utils.WrapError(err) } @@ -110,7 +110,7 @@ func getOrCreatePackage(packages *types.Packages, packageId string) *types.Packa return &targetPackage } -func loadPackage(targetPackage *types.Package, folder string, logger i18n.Logger) error { +func loadPackage(targetPackage *types.Package, folder string, logger i18n.Logger, context map[string]interface{}) error { packagePlatformTxt, err := props.SafeLoad(filepath.Join(folder, constants.FILE_PLATFORM_TXT), logger) if err != nil { return utils.WrapError(err) @@ -131,9 +131,14 @@ func loadPackage(targetPackage *types.Package, folder string, logger i18n.Logger _, err := os.Stat(filepath.Join(subfolderPath, constants.FILE_BOARDS_TXT)) if err != nil && os.IsNotExist(err) { - theOnlySubfolder, err := utils.TheOnlySubfolderOf(subfolderPath) + theOnlySubfolder, err := utils.TheBestSubfolderOf(subfolderPath) if err != nil { - return utils.WrapError(err) + if theOnlySubfolder != constants.EMPTY_STRING { + logger := context[constants.CTX_LOGGER].(i18n.Logger) + logger.Fprintln(os.Stdout, constants.LOG_LEVEL_WARN, constants.MSG_CORES_MULTIPLE_CORES_FOUND_FOR, platformId, err.Error()) + } else { + return utils.WrapError(err) + } } if theOnlySubfolder != constants.EMPTY_STRING { diff --git a/src/arduino.cc/builder/utils/utils.go b/src/arduino.cc/builder/utils/utils.go index 100598d3..31940eba 100644 --- a/src/arduino.cc/builder/utils/utils.go +++ b/src/arduino.cc/builder/utils/utils.go @@ -36,6 +36,7 @@ import ( "arduino.cc/builder/types" "crypto/md5" "encoding/hex" + "github.com/blang/semver" "github.com/go-errors/errors" "io/ioutil" "os" @@ -358,17 +359,29 @@ func ReadFileToRows(file string) ([]string, error) { return strings.Split(txt, "\n"), nil } -func TheOnlySubfolderOf(folder string) (string, error) { +func TheBestSubfolderOf(folder string) (string, error) { subfolders, err := ReadDirFiltered(folder, FilterDirs) if err != nil { return constants.EMPTY_STRING, WrapError(err) } - if len(subfolders) != 1 { + if len(subfolders) > 0 { + latest, _ := semver.Make(subfolders[0].Name()) + latest_index := 0 + for i, _ := range subfolders { + test, _ := semver.Make(subfolders[i].Name()) + if test.GT(latest) { + latest = test + latest_index = i + } + } + if len(subfolders) > 1 { + err = errors.New(subfolders[latest_index].Name()) + } + return subfolders[latest_index].Name(), err + } else { return constants.EMPTY_STRING, nil } - - return subfolders[0].Name(), nil } func FilterOutFoldersByNames(folders []os.FileInfo, names ...string) []os.FileInfo {