From 8df7d9ed4b3bb5ea9460ecc9c43d13affa7a5a62 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 10 Jun 2021 16:00:49 +0200 Subject: [PATCH 1/5] Remove code duplication in LoadIndex --- indexes/firmwareindex/firmwareindex.go | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/indexes/firmwareindex/firmwareindex.go b/indexes/firmwareindex/firmwareindex.go index 73acc5f0..e57ecbed 100644 --- a/indexes/firmwareindex/firmwareindex.go +++ b/indexes/firmwareindex/firmwareindex.go @@ -74,12 +74,7 @@ type IndexLoaderSketch struct { // LoadIndex reads a module_firmware_index.json from a file and returns the corresponding Index structure. func LoadIndex(jsonIndexFile *paths.Path) (*Index, error) { - buff, err := jsonIndexFile.ReadFile() - if err != nil { - return nil, err - } - var index Index - err = json.Unmarshal(buff, &index.Boards) + index, err := LoadIndexNoSign(jsonIndexFile) if err != nil { return nil, err } @@ -93,20 +88,21 @@ func LoadIndex(jsonIndexFile *paths.Path) (*Index, error) { if err != nil { return nil, err } + trusted, _, err := security.VerifySignature(jsonIndexFile, jsonSignatureFile, key) if err != nil { logrus. WithField("index", jsonIndexFile). WithField("signatureFile", jsonSignatureFile). WithError(err).Infof("Checking signature") - } else { - logrus. - WithField("index", jsonIndexFile). - WithField("signatureFile", jsonSignatureFile). - WithField("trusted", trusted).Infof("Checking signature") - index.IsTrusted = trusted + return nil, err } - return &index, nil + logrus. + WithField("index", jsonIndexFile). + WithField("signatureFile", jsonSignatureFile). + WithField("trusted", trusted).Infof("Checking signature") + index.IsTrusted = trusted + return index, nil } // LoadIndexNoSign reads a module_firmware_index.json from a file and returns the corresponding Index structure. From 0fb584b00bf25c0b17d27203939f746253961e23 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 10 Jun 2021 16:03:47 +0200 Subject: [PATCH 2/5] Using semver.RelaxedVersion for struct field --- cli/firmware/list.go | 9 +++++---- indexes/download/download.go | 2 +- indexes/firmwareindex/firmwareindex.go | 17 +++++++++-------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/cli/firmware/list.go b/cli/firmware/list.go index 365ba1b7..1d8ad2de 100644 --- a/cli/firmware/list.go +++ b/cli/firmware/list.go @@ -26,6 +26,7 @@ import ( "github.com/arduino/arduino-cli/cli/feedback" "github.com/arduino/arduino-cli/table" "github.com/spf13/cobra" + semver "go.bug.st/relaxed-semver" ) func newListCommand() *cobra.Command { @@ -46,10 +47,10 @@ func newListCommand() *cobra.Command { } type FirmwareResult struct { - BoardName string `json:"board_name"` - BoardFQBN string `json:"board_fqbn"` - Module string `json:"module"` - FirmwareVersion string `json:"firmware_version"` + BoardName string `json:"board_name"` + BoardFQBN string `json:"board_fqbn"` + Module string `json:"module"` + FirmwareVersion *semver.RelaxedVersion `json:"firmware_version"` Latest bool } diff --git a/indexes/download/download.go b/indexes/download/download.go index ed95859b..fe3957a1 100644 --- a/indexes/download/download.go +++ b/indexes/download/download.go @@ -77,7 +77,7 @@ func DownloadFirmware(firmware *firmwareindex.IndexFirmware) (*paths.Path, error firmwarePath := globals.FwUploaderPath.Join( "firmwares", firmware.Module, - firmware.Version, + firmware.Version.String(), path.Base(firmware.URL)) firmwarePath.Parent().MkdirAll() if err := firmwarePath.WriteFile(nil); err != nil { diff --git a/indexes/firmwareindex/firmwareindex.go b/indexes/firmwareindex/firmwareindex.go index e57ecbed..68ef6d64 100644 --- a/indexes/firmwareindex/firmwareindex.go +++ b/indexes/firmwareindex/firmwareindex.go @@ -58,11 +58,11 @@ type IndexUploaderCommand struct { // IndexFirmware represents a single Firmware version from module_firmware_index.json file. type IndexFirmware struct { - Version string `json:"version,required"` // `*semver.Version` but with SARA version is giving problems - URL string `json:"url,required"` - Checksum string `json:"checksum,required"` - Size json.Number `json:"size,required"` - Module string `json:"module,required"` + Version *semver.RelaxedVersion `json:"version,required"` + URL string `json:"url,required"` + Checksum string `json:"checksum,required"` + Size json.Number `json:"size,required"` + Module string `json:"module,required"` } // IndexLoaderSketch represents the sketch used to upload the new firmware on a board. @@ -137,8 +137,8 @@ func (i *Index) GetLatestFirmwareURL(fqbn string) (string, error) { var latestVersion *semver.RelaxedVersion var latestFirmwareURL string for _, firmware := range board.Firmwares { - version := semver.ParseRelaxed(firmware.Version) - if latestVersion == nil || version.GreaterThan(latestVersion) { // TODO check the condition + version := firmware.Version + if latestVersion == nil || version.GreaterThan(latestVersion) { latestVersion = version latestFirmwareURL = firmware.URL } @@ -152,11 +152,12 @@ func (i *Index) GetLatestFirmwareURL(fqbn string) (string, error) { // GetFirmwareURL will take the fqbn of the required board and the version of the firmware as parameters. // It will return the URL of the required firmware -func (i *Index) GetFirmwareURL(fqbn, version string) (string, error) { +func (i *Index) GetFirmwareURL(fqbn, v string) (string, error) { board := i.GetBoard(fqbn) if board == nil { return "", fmt.Errorf("invalid FQBN: %s", fqbn) } + version := semver.ParseRelaxed(v) for _, firmware := range board.Firmwares { if firmware.Version == version { return firmware.URL, nil From 2761d961266c657254fe4bdffaebd9fd91375079 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 10 Jun 2021 16:10:07 +0200 Subject: [PATCH 3/5] Latest firmware for each board is determined at load time --- indexes/firmwareindex/firmwareindex.go | 35 +++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/indexes/firmwareindex/firmwareindex.go b/indexes/firmwareindex/firmwareindex.go index 68ef6d64..5ec26a17 100644 --- a/indexes/firmwareindex/firmwareindex.go +++ b/indexes/firmwareindex/firmwareindex.go @@ -48,6 +48,7 @@ type IndexBoard struct { UploadTouch bool `json:"upload.use_1200bps_touch"` UploadWait bool `json:"upload.wait_for_upload_port"` UploaderCommand *IndexUploaderCommand `json:"uploader.command,required"` + Latest *IndexFirmware `json:"-"` } type IndexUploaderCommand struct { @@ -119,6 +120,19 @@ func LoadIndexNoSign(jsonIndexFile *paths.Path) (*Index, error) { index.IsTrusted = true + // Determine latest firmware for each board + for _, board := range index.Boards { + if board.Module == "SARA" { + // TODO implement?? by defualt you have to specify the version + continue + } + for _, firmware := range board.Firmwares { + if board.Latest == nil || firmware.Version.GreaterThan(board.Latest.Version) { + board.Latest = firmware + } + } + } + return &index, nil } @@ -129,25 +143,12 @@ func (i *Index) GetLatestFirmwareURL(fqbn string) (string, error) { if board == nil { return "", fmt.Errorf("invalid FQBN: %s", fqbn) } - if board.Module == "SARA" { // TODO togliere sara, lo assumo giá nel comando - // TODO implement?? by defualt you have to specify the version - return "", fmt.Errorf("not implemented for SARA module") - } - var latestVersion *semver.RelaxedVersion - var latestFirmwareURL string - for _, firmware := range board.Firmwares { - version := firmware.Version - if latestVersion == nil || version.GreaterThan(latestVersion) { - latestVersion = version - latestFirmwareURL = firmware.URL - } - } - if latestVersion != nil { - return latestFirmwareURL, nil - } else { + if board.Latest == nil { return "", fmt.Errorf("cannot find latest version") } + + return board.Latest.URL, nil } // GetFirmwareURL will take the fqbn of the required board and the version of the firmware as parameters. @@ -163,7 +164,7 @@ func (i *Index) GetFirmwareURL(fqbn, v string) (string, error) { return firmware.URL, nil } } - return "", fmt.Errorf("invalid version: %s", version) + return "", fmt.Errorf("version not found: %s", version) } // GetLoaderSketchURL will take the board's fqbn and return the url of the loader sketch From dad444bf220aed82f5bb260afa6bcb22ce24a3a9 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 10 Jun 2021 16:10:47 +0200 Subject: [PATCH 4/5] Implemented latest field in 'firmware list' --- cli/firmware/list.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/firmware/list.go b/cli/firmware/list.go index 1d8ad2de..e835f809 100644 --- a/cli/firmware/list.go +++ b/cli/firmware/list.go @@ -71,6 +71,7 @@ func list(fqbn string) { BoardFQBN: board.Fqbn, Module: board.Module, FirmwareVersion: firmware.Version, + Latest: board.Latest == firmware, }) } } @@ -84,9 +85,13 @@ func (f FirmwareListResult) String() string { return "No firmwares available." } t := table.New() - t.SetHeader("Board", "FQBN", "Module", "Version") + t.SetHeader("Board", "FQBN", "Module", "", "Version") for _, fw := range f { - t.AddRow(fw.BoardName, fw.BoardFQBN, fw.Module, fw.FirmwareVersion) + latest := "" + if fw.Latest { + latest = "✔" + } + t.AddRow(fw.BoardName, fw.BoardFQBN, fw.Module, latest, fw.FirmwareVersion) } return t.Render() } From 5f1d387ec71332c700cd8ca2800a6373487764cd Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 10 Jun 2021 16:40:24 +0200 Subject: [PATCH 5/5] Fixed tests oppps --- indexes/firmwareindex/firmwareindex.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indexes/firmwareindex/firmwareindex.go b/indexes/firmwareindex/firmwareindex.go index 5ec26a17..c071957b 100644 --- a/indexes/firmwareindex/firmwareindex.go +++ b/indexes/firmwareindex/firmwareindex.go @@ -160,7 +160,7 @@ func (i *Index) GetFirmwareURL(fqbn, v string) (string, error) { } version := semver.ParseRelaxed(v) for _, firmware := range board.Firmwares { - if firmware.Version == version { + if firmware.Version.Equal(version) { return firmware.URL, nil } }