Skip to content

Commit ea19948

Browse files
committed
create-fw-bundle: Allow removing fw parts
`create-fw-bundle part:-` will remove part "part" from the bundle, if present
1 parent 7ad8d9d commit ea19948

File tree

5 files changed

+39
-21
lines changed

5 files changed

+39
-21
lines changed

cli/create_fw_bundle/create_fw_bundle.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
flag "github.com/spf13/pflag"
3232
"github.com/youmark/pkcs8"
3333
"golang.org/x/crypto/ssh/terminal"
34+
glog "k8s.io/klog/v2"
3435

3536
moscommon "github.com/mongoose-os/mos/cli/common"
3637
"github.com/mongoose-os/mos/cli/dev"
@@ -88,11 +89,14 @@ func CreateFWBundle(ctx context.Context, devConn dev.DevConn) error {
8889
}
8990
if len(flag.Args()) > 1 {
9091
for _, ps := range flag.Args()[1:] {
91-
p, err := fwbundle.PartFromString(ps)
92-
if err != nil {
92+
pn, p, err := fwbundle.PartFromString(ps)
93+
switch {
94+
case err != nil:
9395
return errors.Annotatef(err, "%s", ps)
94-
}
95-
if strings.HasSuffix(p.Src, ".hex") {
96+
case p == nil:
97+
err = fwb.RemovePart(pn)
98+
glog.Infof("Removing partition %s: %v", pn, err)
99+
case strings.HasSuffix(p.Src, ".hex"):
96100
hpp, err := fwbundle.PartsFromHexFile(p.Src, p.Name, 255, 512)
97101
if err != nil {
98102
return errors.Annotatef(err, "%s", ps)
@@ -111,7 +115,7 @@ func CreateFWBundle(ctx context.Context, devConn dev.DevConn) error {
111115
p1.SetData(data)
112116
fwb.AddPart(&p1)
113117
}
114-
} else {
118+
default:
115119
p.SetDataProvider(func(name, src string) ([]byte, error) {
116120
srcAbs := src
117121
if !filepath.IsAbs(src) && *flags.SrcDir != "" {

common/fwbundle/fw_bundle.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ import (
2626
"time"
2727

2828
"github.com/juju/errors"
29-
"github.com/mongoose-os/mos/cli/ourutil"
3029
glog "k8s.io/klog/v2"
30+
31+
"github.com/mongoose-os/mos/cli/ourutil"
3132
)
3233

3334
const (
@@ -67,6 +68,14 @@ func (fwb *FirmwareBundle) AddPart(p *FirmwarePart) error {
6768
return nil
6869
}
6970

71+
func (fwb *FirmwareBundle) RemovePart(name string) error {
72+
if _, ok := fwb.FirmwareManifest.Parts[name]; !ok {
73+
return errors.New("not found")
74+
}
75+
delete(fwb.FirmwareManifest.Parts, name)
76+
return nil
77+
}
78+
7079
type partsByAddr []*FirmwarePart
7180

7281
func (pp partsByAddr) Len() int { return len(pp) }

common/fwbundle/fw_part.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@ type firmwarePart struct {
6565

6666
type DataProvider func(name, src string) ([]byte, error)
6767

68-
func PartFromString(ps string) (*FirmwarePart, error) {
68+
func PartFromString(ps string) (string, *FirmwarePart, error) {
6969
np := strings.SplitN(ps, ":", 2)
7070
if len(np) < 2 {
71-
return nil, errors.Errorf("invalid part spec '%s', must be 'name:prop=value,...'", ps)
71+
return "", nil, errors.Errorf("invalid part spec '%s', must be 'name:prop=value,...'", ps)
72+
}
73+
if np[1] == "-" {
74+
return np[0], nil, nil
7275
}
7376
// Create attrs JSON and re-parse it.
7477
m := make(map[string]interface{})
@@ -78,7 +81,7 @@ func PartFromString(ps string) (*FirmwarePart, error) {
7881
}
7982
kv := strings.SplitN(prop, "=", 2)
8083
if len(kv) < 2 {
81-
return nil, errors.Errorf("invalid property spec '%s', must be 'prop=value'", prop)
84+
return "", nil, errors.Errorf("invalid property spec '%s', must be 'prop=value'", prop)
8285
}
8386
k := kv[0]
8487
v := kv[1]
@@ -104,10 +107,10 @@ func PartFromString(ps string) (*FirmwarePart, error) {
104107
mb, _ := json.Marshal(&m)
105108
var p FirmwarePart
106109
if err := json.Unmarshal(mb, &p); err != nil {
107-
return nil, err
110+
return "", nil, err
108111
}
109112
p.Name = np[0]
110-
return &p, nil
113+
return p.Name, &p, nil
111114
}
112115

113116
func computeSHA1(data []byte) string {

common/fwbundle/fw_part_test.go

+11-10
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ package fwbundle
1818

1919
import (
2020
"fmt"
21-
"reflect"
2221
"testing"
2322

2423
"github.com/juju/errors"
24+
"github.com/stretchr/testify/assert"
25+
"github.com/stretchr/testify/require"
2526
)
2627

2728
func TestPartFromString(t *testing.T) {
@@ -33,6 +34,7 @@ func TestPartFromString(t *testing.T) {
3334
}{
3435
{s: ``, fail: true},
3536
{s: `foo:`, p: &FirmwarePart{Name: "foo"}},
37+
{s: `foo:-`, p: nil},
3638
{s: `foo:type`, fail: true},
3739
{s: `foo:type=bar`, p: &FirmwarePart{Name: "foo", Type: "bar"}},
3840
{s: `foo:type="bar"`, p: &FirmwarePart{Name: "foo", Type: "bar"}},
@@ -49,17 +51,16 @@ func TestPartFromString(t *testing.T) {
4951
attrs: map[string]interface{}{"update": false},
5052
}},
5153
}
52-
for i, c := range cases {
53-
p, err := PartFromString(c.s)
54+
for _, c := range cases {
55+
pn, p, err := PartFromString(c.s)
5456
if c.fail {
55-
if err == nil {
56-
t.Fatalf("%d: %s: expected failure, got %#v", i, c.s, p)
57-
}
57+
assert.Errorf(t, err, "case %s, ret %+v", c.s, p)
58+
assert.Nilf(t, p, "case %s", c.s)
5859
} else {
59-
if err != nil {
60-
t.Fatalf("%d: %s: got error %s", i, c.s, err)
61-
} else if !reflect.DeepEqual(p, c.p) {
62-
t.Fatalf("%d: %s: expected \n%#v\n, got\n%#v", i, c.s, c.p, p)
60+
require.NoError(t, err, "case %s, ret %+v", c.s, p)
61+
assert.Equalf(t, c.p, p, "case %s", c.s)
62+
if c.p != nil {
63+
assert.Equalf(t, p.Name, pn, "case %s", c.s)
6364
}
6465
}
6566
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ require (
3636
github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c
3737
github.com/smartystreets/goconvey v1.6.4 // indirect
3838
github.com/spf13/pflag v1.0.5
39+
github.com/stretchr/testify v1.7.0
3940
github.com/xanzy/ssh-agent v0.3.1 // indirect
4041
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a
4142
goji.io v2.0.0+incompatible

0 commit comments

Comments
 (0)