Skip to content

Commit a1baefc

Browse files
committed
Installing a Platform saves a json file with all its info
1 parent 88e0ad6 commit a1baefc

File tree

2 files changed

+259
-0
lines changed

2 files changed

+259
-0
lines changed

arduino/cores/packagemanager/install_uninstall.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@
1616
package packagemanager
1717

1818
import (
19+
"encoding/json"
1920
"fmt"
2021
"runtime"
22+
"strconv"
2123

2224
"github.com/arduino/arduino-cli/arduino/cores"
25+
"github.com/arduino/arduino-cli/arduino/cores/packageindex"
2326
"github.com/arduino/arduino-cli/executils"
2427
"github.com/pkg/errors"
2528
)
@@ -39,6 +42,92 @@ func (pm *PackageManager) InstallPlatform(platformRelease *cores.PlatformRelease
3942
} else {
4043
return err
4144
}
45+
if err := pm.cacheInstalledJSON(platformRelease); err != nil {
46+
return errors.Errorf("creating installed.json in %s: %s", platformRelease.InstallDir, err)
47+
}
48+
return nil
49+
}
50+
51+
func platformReleaseToIndex(pr *cores.PlatformRelease) packageindex.IndexPlatformRelease {
52+
boards := []packageindex.IndexBoard{}
53+
for name := range pr.Boards {
54+
boards = append(boards, packageindex.IndexBoard{
55+
Name: name,
56+
})
57+
}
58+
59+
tools := []packageindex.IndexToolDependency{}
60+
for _, t := range pr.Dependencies {
61+
tools = append(tools, packageindex.IndexToolDependency{
62+
Packager: t.ToolPackager,
63+
Name: t.ToolName,
64+
Version: t.ToolVersion,
65+
})
66+
}
67+
return packageindex.IndexPlatformRelease{
68+
Name: pr.Platform.Name,
69+
Architecture: pr.Platform.Architecture,
70+
Version: pr.Version,
71+
Category: pr.Platform.Category,
72+
URL: pr.Resource.URL,
73+
ArchiveFileName: pr.Resource.ArchiveFileName,
74+
Checksum: pr.Resource.Checksum,
75+
Size: json.Number(strconv.FormatInt(pr.Resource.Size, 10)),
76+
Boards: boards,
77+
Help: packageindex.IndexHelp{Online: pr.Help.Online},
78+
ToolDependencies: tools,
79+
}
80+
}
81+
82+
func packageToolsToIndex(tools map[string]*cores.Tool) []*packageindex.IndexToolRelease {
83+
ret := []*packageindex.IndexToolRelease{}
84+
for name, tool := range tools {
85+
for _, toolRelease := range tool.Releases {
86+
flavours := []packageindex.IndexToolReleaseFlavour{}
87+
for _, flavour := range toolRelease.Flavors {
88+
flavours = append(flavours, packageindex.IndexToolReleaseFlavour{
89+
OS: flavour.OS,
90+
URL: flavour.Resource.URL,
91+
ArchiveFileName: flavour.Resource.ArchiveFileName,
92+
Size: json.Number(strconv.FormatInt(flavour.Resource.Size, 10)),
93+
Checksum: flavour.Resource.Checksum,
94+
})
95+
}
96+
ret = append(ret, &packageindex.IndexToolRelease{
97+
Name: name,
98+
Version: toolRelease.Version,
99+
Systems: flavours,
100+
})
101+
}
102+
}
103+
return ret
104+
}
105+
106+
func (pm *PackageManager) cacheInstalledJSON(platformRelease *cores.PlatformRelease) error {
107+
indexPlatformRelease := platformReleaseToIndex(platformRelease)
108+
indexPackageToolReleases := packageToolsToIndex(platformRelease.Platform.Package.Tools)
109+
110+
index := packageindex.Index{
111+
IsTrusted: platformRelease.IsTrusted,
112+
Packages: []*packageindex.IndexPackage{
113+
{
114+
Name: platformRelease.Platform.Package.Name,
115+
Maintainer: platformRelease.Platform.Package.Maintainer,
116+
WebsiteURL: platformRelease.Platform.Package.WebsiteURL,
117+
URL: platformRelease.Platform.Package.URL,
118+
Email: platformRelease.Platform.Package.Email,
119+
Platforms: []*packageindex.IndexPlatformRelease{&indexPlatformRelease},
120+
Tools: indexPackageToolReleases,
121+
Help: packageindex.IndexHelp{Online: platformRelease.Platform.Package.Help.Online},
122+
},
123+
},
124+
}
125+
platformJSON, err := json.MarshalIndent(index, "", " ")
126+
if err != nil {
127+
return err
128+
}
129+
installedJSON := platformRelease.InstallDir.Join("installed.json")
130+
installedJSON.WriteFile(platformJSON)
42131
return nil
43132
}
44133

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
package packagemanager_test
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
"github.com/arduino/arduino-cli/arduino/cores/packageindex"
8+
"github.com/arduino/arduino-cli/arduino/cores/packagemanager"
9+
"github.com/arduino/arduino-cli/cli/output"
10+
"github.com/arduino/arduino-cli/commands"
11+
"github.com/arduino/go-paths-helper"
12+
"github.com/stretchr/testify/require"
13+
semver "go.bug.st/relaxed-semver"
14+
)
15+
16+
func TestInstallPlatform(t *testing.T) {
17+
dataDir := paths.New("testdata", "data_dir_1")
18+
packageDir := paths.TempDir().Join("test", "packages")
19+
downloadDir := paths.TempDir().Join("test", "staging")
20+
tmpDir := paths.TempDir().Join("test", "tmp")
21+
packageDir.MkdirAll()
22+
downloadDir.MkdirAll()
23+
tmpDir.MkdirAll()
24+
defer paths.TempDir().Join("test").RemoveAll()
25+
26+
pm := packagemanager.NewPackageManager(dataDir, packageDir, downloadDir, tmpDir)
27+
pm.LoadPackageIndexFromFile(dataDir.Join("package_index.json"))
28+
29+
platformRelease, tools, err := pm.FindPlatformReleaseDependencies(&packagemanager.PlatformReference{
30+
Package: "arduino",
31+
PlatformArchitecture: "avr",
32+
PlatformVersion: semver.MustParse("1.6.23"),
33+
})
34+
require.NotNil(t, platformRelease)
35+
require.NotNil(t, tools)
36+
require.Nil(t, err)
37+
38+
downloaderConfig, err := commands.GetDownloaderConfig()
39+
require.NotNil(t, downloaderConfig)
40+
require.Nil(t, err)
41+
downloader, err := pm.DownloadPlatformRelease(platformRelease, downloaderConfig)
42+
require.NotNil(t, downloader)
43+
require.Nil(t, err)
44+
err = commands.Download(downloader, platformRelease.String(), output.NewNullDownloadProgressCB())
45+
require.Nil(t, err)
46+
47+
err = pm.InstallPlatform(platformRelease)
48+
require.Nil(t, err)
49+
50+
destDir := packageDir.Join("arduino", "hardware", "avr", "1.6.23")
51+
require.True(t, destDir.IsDir())
52+
53+
installedJSON := destDir.Join("installed.json")
54+
require.True(t, installedJSON.Exist())
55+
56+
bt, err := installedJSON.ReadFile()
57+
require.Nil(t, err)
58+
59+
index := &packageindex.Index{}
60+
err = json.Unmarshal(bt, index)
61+
require.Nil(t, err)
62+
63+
require.Equal(t, 1, len(index.Packages))
64+
indexPackage := index.Packages[0]
65+
require.Equal(t, "arduino", indexPackage.Name)
66+
require.Equal(t, "Arduino", indexPackage.Maintainer)
67+
require.Equal(t, "http://www.arduino.cc/", indexPackage.WebsiteURL)
68+
require.Equal(t, "packages@arduino.cc", indexPackage.Email)
69+
require.Equal(t, 1, len(indexPackage.Platforms))
70+
require.Equal(t, "http://www.arduino.cc/en/Reference/HomePage", indexPackage.Help.Online)
71+
72+
indexPackageTools := indexPackage.Tools
73+
require.Equal(t, 44, len(indexPackageTools))
74+
// Just check one to verifies it's actually correct
75+
require.Contains(t, indexPackageTools, &packageindex.IndexToolRelease{
76+
Name: "arm-none-eabi-gcc",
77+
Version: semver.ParseRelaxed("4.8.3-2014q1"),
78+
Systems: []packageindex.IndexToolReleaseFlavour{
79+
{
80+
OS: "arm-linux-gnueabihf",
81+
URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2",
82+
ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-arm.tar.bz2",
83+
Size: "44423906",
84+
Checksum: "SHA-256:ebe96b34c4f434667cab0187b881ed585e7c7eb990fe6b69be3c81ec7e11e845",
85+
},
86+
{
87+
OS: "i686-mingw32",
88+
URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz",
89+
ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-windows.tar.gz",
90+
Size: "84537449",
91+
Checksum: "SHA-256:fd8c111c861144f932728e00abd3f7d1107e186eb9cd6083a54c7236ea78b7c2",
92+
},
93+
{
94+
OS: "x86_64-apple-darwin",
95+
URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz",
96+
ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-mac.tar.gz",
97+
Size: "52518522",
98+
Checksum: "SHA-256:3598acf21600f17a8e4a4e8e193dc422b894dc09384759b270b2ece5facb59c2",
99+
},
100+
{
101+
OS: "x86_64-pc-linux-gnu",
102+
URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz",
103+
ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-linux64.tar.gz",
104+
Size: "51395093",
105+
Checksum: "SHA-256:d23f6626148396d6ec42a5b4d928955a703e0757829195fa71a939e5b86eecf6",
106+
},
107+
{
108+
OS: "i686-pc-linux-gnu",
109+
URL: "http://downloads.arduino.cc/gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz",
110+
ArchiveFileName: "gcc-arm-none-eabi-4.8.3-2014q1-linux32.tar.gz",
111+
Size: "51029223",
112+
Checksum: "SHA-256:ba1994235f69c526c564f65343f22ddbc9822b2ea8c5ee07dd79d89f6ace2498",
113+
},
114+
}})
115+
116+
indexPlatformRelease := indexPackage.Platforms[0]
117+
require.Equal(t, "Arduino AVR Boards", indexPlatformRelease.Name)
118+
require.Equal(t, "avr", indexPlatformRelease.Architecture)
119+
require.Equal(t, "1.6.23", indexPlatformRelease.Version.String())
120+
require.Equal(t, "Arduino", indexPlatformRelease.Category)
121+
require.Equal(t, "http://www.arduino.cc/en/Reference/HomePage", indexPlatformRelease.Help.Online)
122+
require.Equal(t, "http://downloads.arduino.cc/cores/avr-1.6.23.tar.bz2", indexPlatformRelease.URL)
123+
require.Equal(t, "avr-1.6.23.tar.bz2", indexPlatformRelease.ArchiveFileName)
124+
require.Equal(t, "SHA-256:18618d7f256f26cd77c35f4c888d5d1b2334f07925094fdc99ac3188722284aa", indexPlatformRelease.Checksum)
125+
require.Equal(t, json.Number("5001988"), indexPlatformRelease.Size)
126+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Yún"})
127+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino/Genuino Uno"})
128+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Uno WiFi"})
129+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Diecimila"})
130+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Nano"})
131+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino/Genuino Mega"})
132+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino MegaADK"})
133+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Leonardo"})
134+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Leonardo Ethernet"})
135+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino/Genuino Micro"})
136+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Esplora"})
137+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Mini"})
138+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Ethernet"})
139+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Fio"})
140+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino BT"})
141+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino LilyPadUSB"})
142+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Lilypad"})
143+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Pro"})
144+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino ATMegaNG"})
145+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Robot Control"})
146+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Robot Motor"})
147+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Gemma"})
148+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Adafruit Circuit Playground"})
149+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Yún Mini"})
150+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Arduino Industrial 101"})
151+
require.Contains(t, indexPlatformRelease.Boards, packageindex.IndexBoard{Name: "Linino One"})
152+
require.Contains(t, indexPlatformRelease.ToolDependencies,
153+
packageindex.IndexToolDependency{
154+
Packager: "arduino",
155+
Name: "avr-gcc",
156+
Version: semver.ParseRelaxed("5.4.0-atmel3.6.1-arduino2"),
157+
})
158+
require.Contains(t, indexPlatformRelease.ToolDependencies,
159+
packageindex.IndexToolDependency{
160+
Packager: "arduino",
161+
Name: "avrdude",
162+
Version: semver.ParseRelaxed("6.3.0-arduino14"),
163+
})
164+
require.Contains(t, indexPlatformRelease.ToolDependencies,
165+
packageindex.IndexToolDependency{
166+
Packager: "arduino",
167+
Name: "arduinoOTA",
168+
Version: semver.ParseRelaxed("1.2.1"),
169+
})
170+
}

0 commit comments

Comments
 (0)