Skip to content

Commit 1dbcca7

Browse files
Bikappacmaglie
authored and
Akos Kitta
committed
fix: discovery cleanup and watchers continuity upon core install (arduino#2062)
Co-authored-by: Cristian Maglie <[email protected]>
1 parent 073b2a1 commit 1dbcca7

File tree

4 files changed

+45
-24
lines changed

4 files changed

+45
-24
lines changed

Diff for: arduino/cores/packagemanager/package_manager.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,25 @@ func (pmb *Builder) BuildIntoExistingPackageManager(target *PackageManager) {
9898
target.tempDir = pmb.tempDir
9999
target.packagesCustomGlobalProperties = pmb.packagesCustomGlobalProperties
100100
target.profile = pmb.profile
101-
target.discoveryManager = pmb.discoveryManager
101+
target.discoveryManager.Clear()
102+
target.discoveryManager.AddAllDiscoveriesFrom(pmb.discoveryManager)
102103
target.userAgent = pmb.userAgent
103104
}
104105

105106
// Build builds a new PackageManager.
106107
func (pmb *Builder) Build() *PackageManager {
107-
res := &PackageManager{}
108-
pmb.BuildIntoExistingPackageManager(res)
109-
return res
108+
return &PackageManager{
109+
log: pmb.log,
110+
packages: pmb.packages,
111+
IndexDir: pmb.IndexDir,
112+
PackagesDir: pmb.PackagesDir,
113+
DownloadDir: pmb.DownloadDir,
114+
tempDir: pmb.tempDir,
115+
packagesCustomGlobalProperties: pmb.packagesCustomGlobalProperties,
116+
profile: pmb.profile,
117+
discoveryManager: pmb.discoveryManager,
118+
userAgent: pmb.userAgent,
119+
}
110120
}
111121

112122
// NewBuilder creates a Builder with the same configuration

Diff for: arduino/cores/packagemanager/package_manager_test.go

+20-18
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// Arduino software without disclosing the source code of your own applications.
1414
// To purchase a commercial license, send an email to [email protected].
1515

16-
package packagemanager_test
16+
package packagemanager
1717

1818
import (
1919
"fmt"
@@ -24,7 +24,6 @@ import (
2424
"testing"
2525

2626
"github.com/arduino/arduino-cli/arduino/cores"
27-
"github.com/arduino/arduino-cli/arduino/cores/packagemanager"
2827
"github.com/arduino/arduino-cli/configuration"
2928
"github.com/arduino/go-paths-helper"
3029
"github.com/arduino/go-properties-orderedmap"
@@ -39,7 +38,7 @@ var dataDir1 = paths.New("testdata", "data_dir_1")
3938
var extraHardware = paths.New("testdata", "extra_hardware")
4039

4140
func TestFindBoardWithFQBN(t *testing.T) {
42-
pmb := packagemanager.NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
41+
pmb := NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
4342
pmb.LoadHardwareFromDirectory(customHardware)
4443
pm := pmb.Build()
4544
pme, release := pm.NewExplorer()
@@ -57,7 +56,7 @@ func TestFindBoardWithFQBN(t *testing.T) {
5756

5857
func TestResolveFQBN(t *testing.T) {
5958
// Pass nil, since these paths are only used for installing
60-
pmb := packagemanager.NewBuilder(nil, nil, nil, nil, "test")
59+
pmb := NewBuilder(nil, nil, nil, nil, "test")
6160
// Hardware from main packages directory
6261
pmb.LoadHardwareFromDirectory(dataDir1.Join("packages"))
6362
// This contains the arduino:avr core
@@ -181,7 +180,7 @@ func TestResolveFQBN(t *testing.T) {
181180
}
182181

183182
func TestBoardOptionsFunctions(t *testing.T) {
184-
pmb := packagemanager.NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
183+
pmb := NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
185184
pmb.LoadHardwareFromDirectory(customHardware)
186185
pm := pmb.Build()
187186
pme, release := pm.NewExplorer()
@@ -221,13 +220,13 @@ func TestBoardOptionsFunctions(t *testing.T) {
221220
}
222221

223222
func TestBoardOrdering(t *testing.T) {
224-
pmb := packagemanager.NewBuilder(dataDir1, dataDir1.Join("packages"), nil, nil, "")
223+
pmb := NewBuilder(dataDir1, dataDir1.Join("packages"), nil, nil, "")
225224
_ = pmb.LoadHardwareFromDirectories(paths.NewPathList(dataDir1.Join("packages").String()))
226225
pm := pmb.Build()
227226
pme, release := pm.NewExplorer()
228227
defer release()
229228

230-
pl := pme.FindPlatform(&packagemanager.PlatformReference{
229+
pl := pme.FindPlatform(&PlatformReference{
231230
Package: "arduino",
232231
PlatformArchitecture: "avr",
233232
})
@@ -273,7 +272,7 @@ func TestBoardOrdering(t *testing.T) {
273272
func TestFindToolsRequiredForBoard(t *testing.T) {
274273
os.Setenv("ARDUINO_DATA_DIR", dataDir1.String())
275274
configuration.Settings = configuration.Init("")
276-
pmb := packagemanager.NewBuilder(
275+
pmb := NewBuilder(
277276
dataDir1,
278277
configuration.PackagesDir(configuration.Settings),
279278
configuration.DownloadsDir(configuration.Settings),
@@ -314,7 +313,7 @@ func TestFindToolsRequiredForBoard(t *testing.T) {
314313
})
315314
require.NotNil(t, esptool0413)
316315

317-
testPlatform := pme.FindPlatformRelease(&packagemanager.PlatformReference{
316+
testPlatform := pme.FindPlatformRelease(&PlatformReference{
318317
Package: "test",
319318
PlatformArchitecture: "avr",
320319
PlatformVersion: semver.MustParse("1.1.0")})
@@ -407,7 +406,7 @@ func TestFindToolsRequiredForBoard(t *testing.T) {
407406
}
408407

409408
func TestIdentifyBoard(t *testing.T) {
410-
pmb := packagemanager.NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
409+
pmb := NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
411410
pmb.LoadHardwareFromDirectory(customHardware)
412411
pm := pmb.Build()
413412
pme, release := pm.NewExplorer()
@@ -434,12 +433,12 @@ func TestIdentifyBoard(t *testing.T) {
434433

435434
func TestPackageManagerClear(t *testing.T) {
436435
// Create a PackageManager and load the harware
437-
pmb := packagemanager.NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
436+
pmb := NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
438437
pmb.LoadHardwareFromDirectory(customHardware)
439438
pm := pmb.Build()
440439

441440
// Creates another PackageManager but don't load the hardware
442-
emptyPmb := packagemanager.NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
441+
emptyPmb := NewBuilder(customHardware, customHardware, customHardware, customHardware, "test")
443442
emptyPm := emptyPmb.Build()
444443

445444
// Verifies they're not equal
@@ -448,15 +447,18 @@ func TestPackageManagerClear(t *testing.T) {
448447
// Clear the first PackageManager that contains loaded hardware
449448
emptyPmb.BuildIntoExistingPackageManager(pm)
450449

451-
// Verifies both PackageManagers are now equal
450+
// the discovery manager is maintained
451+
require.NotEqual(t, pm.discoveryManager, emptyPm.discoveryManager)
452+
// Verifies all other fields are assigned to target
453+
pm.discoveryManager = emptyPm.discoveryManager
452454
require.Equal(t, pm, emptyPm)
453455
}
454456

455457
func TestFindToolsRequiredFromPlatformRelease(t *testing.T) {
456458
// Create all the necessary data to load discoveries
457459
fakePath := paths.New("fake-path")
458460

459-
pmb := packagemanager.NewBuilder(fakePath, fakePath, fakePath, fakePath, "test")
461+
pmb := NewBuilder(fakePath, fakePath, fakePath, fakePath, "test")
460462
pack := pmb.GetOrCreatePackage("arduino")
461463

462464
{
@@ -559,13 +561,13 @@ func TestFindToolsRequiredFromPlatformRelease(t *testing.T) {
559561
}
560562

561563
func TestFindPlatformReleaseDependencies(t *testing.T) {
562-
pmb := packagemanager.NewBuilder(nil, nil, nil, nil, "test")
564+
pmb := NewBuilder(nil, nil, nil, nil, "test")
563565
pmb.LoadPackageIndexFromFile(paths.New("testdata", "package_tooltest_index.json"))
564566
pm := pmb.Build()
565567
pme, release := pm.NewExplorer()
566568
defer release()
567569

568-
pl, tools, err := pme.FindPlatformReleaseDependencies(&packagemanager.PlatformReference{Package: "test", PlatformArchitecture: "avr"})
570+
pl, tools, err := pme.FindPlatformReleaseDependencies(&PlatformReference{Package: "test", PlatformArchitecture: "avr"})
569571
require.NoError(t, err)
570572
require.NotNil(t, pl)
571573
require.Len(t, tools, 3)
@@ -574,7 +576,7 @@ func TestFindPlatformReleaseDependencies(t *testing.T) {
574576

575577
func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {
576578
// Pass nil, since these paths are only used for installing
577-
pmb := packagemanager.NewBuilder(nil, nil, nil, nil, "test")
579+
pmb := NewBuilder(nil, nil, nil, nil, "test")
578580
// Hardware from main packages directory
579581
pmb.LoadHardwareFromDirectory(dataDir1.Join("packages"))
580582
pm := pmb.Build()
@@ -643,7 +645,7 @@ func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {
643645
}
644646

645647
func TestRunPostInstall(t *testing.T) {
646-
pmb := packagemanager.NewBuilder(nil, nil, nil, nil, "test")
648+
pmb := NewBuilder(nil, nil, nil, nil, "test")
647649
pm := pmb.Build()
648650
pme, release := pm.NewExplorer()
649651
defer release()

Diff for: arduino/discovery/discovery.go

+1
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ func (disc *PluggableDiscovery) Quit() {
381381
if _, err := disc.waitMessage(time.Second * 5); err != nil {
382382
logrus.Errorf("Quitting discovery %s: %s", disc.id, err)
383383
}
384+
disc.stopSync()
384385
disc.killProcess()
385386
}
386387

Diff for: arduino/discovery/discoverymanager/discoverymanager.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,13 @@ func (dm *DiscoveryManager) startDiscovery(d *discovery.PluggableDiscovery) (dis
194194
return fmt.Errorf("%s: %s", tr("starting discovery %s", d.GetID()), err)
195195
}
196196

197-
go func() {
197+
go func(d *discovery.PluggableDiscovery) {
198198
// Transfer all incoming events from this discovery to the feed channel
199199
for ev := range eventCh {
200200
dm.feed <- ev
201201
}
202-
}()
202+
logrus.Infof("Discovery event channel closed %s. Exiting goroutine.", d.GetID())
203+
}(d)
203204
return nil
204205
}
205206

@@ -276,3 +277,10 @@ func (dm *DiscoveryManager) List() []*discovery.Port {
276277
}
277278
return res
278279
}
280+
281+
// AddAllDiscoveriesFrom transfers discoveries from src to the receiver
282+
func (dm *DiscoveryManager) AddAllDiscoveriesFrom(src *DiscoveryManager) {
283+
for _, d := range src.discoveries {
284+
dm.Add(d)
285+
}
286+
}

0 commit comments

Comments
 (0)