Skip to content

Commit b47d883

Browse files
Add Delete command to gRPC (#2212)
* Add DeleteRequest and DeleteResponse to gRPC * Add Delete command to settings * Add TestDelete to settings_test.go * Remove temporary directory when TestWrite ends * Refactor `config delete` command using gRPC function call
1 parent 64d019d commit b47d883

File tree

8 files changed

+289
-77
lines changed

8 files changed

+289
-77
lines changed

commands/daemon/settings.go

+33
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,36 @@ func (s *SettingsService) Write(ctx context.Context, req *rpc.WriteRequest) (*rp
144144
}
145145
return &rpc.WriteResponse{}, nil
146146
}
147+
148+
// Delete removes a key from the config file
149+
func (s *SettingsService) Delete(ctx context.Context, req *rpc.DeleteRequest) (*rpc.DeleteResponse, error) {
150+
toDelete := req.GetKey()
151+
152+
// Check if settings key actually existing, we don't use Viper.InConfig()
153+
// since that doesn't check for keys formatted like daemon.port or those set
154+
// with Viper.Set(). This way we check for all existing settings for sure.
155+
keyExists := false
156+
keys := []string{}
157+
for _, k := range configuration.Settings.AllKeys() {
158+
if !strings.HasPrefix(k, toDelete) {
159+
keys = append(keys, k)
160+
continue
161+
}
162+
keyExists = true
163+
}
164+
165+
if !keyExists {
166+
return nil, errors.New(tr("key not found in settings"))
167+
}
168+
169+
// Override current settings to delete the key
170+
updatedSettings := configuration.Init("")
171+
for _, k := range keys {
172+
updatedSettings.Set(k, configuration.Settings.Get(k))
173+
}
174+
configPath := configuration.Settings.ConfigFileUsed()
175+
updatedSettings.SetConfigFile(configPath)
176+
configuration.Settings = updatedSettings
177+
178+
return &rpc.DeleteResponse{}, nil
179+
}

commands/daemon/settings_test.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,9 @@ func TestWrite(t *testing.T) {
142142
require.NoError(t, err)
143143

144144
tempDir := paths.TempDir()
145-
testFolder, _ := tempDir.MkTempDir("testdata")
145+
testFolder, err := tempDir.MkTempDir("testdata")
146+
require.NoError(t, err)
147+
defer testFolder.RemoveAll()
146148

147149
// Verifies config files doesn't exist
148150
configFile := testFolder.Join("arduino-cli.yml")
@@ -157,3 +159,18 @@ func TestWrite(t *testing.T) {
157159
// We don't verify the content since we expect config library, Viper, to work
158160
require.True(t, configFile.Exist())
159161
}
162+
163+
func TestDelete(t *testing.T) {
164+
_, err := svc.Delete(context.Background(), &rpc.DeleteRequest{
165+
Key: "doesnotexist",
166+
})
167+
require.Error(t, err)
168+
169+
_, err = svc.Delete(context.Background(), &rpc.DeleteRequest{
170+
Key: "network",
171+
})
172+
require.NoError(t, err)
173+
174+
_, err = svc.GetValue(context.Background(), &rpc.GetValueRequest{Key: "network"})
175+
require.Error(t, err)
176+
}

commands/daemon/testdata/arduino-cli.yml

+3
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ logging:
1414
file: ""
1515
format: text
1616
level: info
17+
18+
network:
19+
proxy: "123"

internal/cli/config/delete.go

+9-22
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ package config
1717

1818
import (
1919
"os"
20-
"strings"
2120

21+
"github.com/arduino/arduino-cli/commands/daemon"
2222
"github.com/arduino/arduino-cli/configuration"
2323
"github.com/arduino/arduino-cli/internal/cli/feedback"
24+
"github.com/arduino/arduino-cli/rpc/cc/arduino/cli/settings/v1"
2425
"github.com/sirupsen/logrus"
2526
"github.com/spf13/cobra"
26-
"github.com/spf13/viper"
2727
)
2828

2929
func initDeleteCommand() *cobra.Command {
@@ -47,26 +47,13 @@ func runDeleteCommand(cmd *cobra.Command, args []string) {
4747
logrus.Info("Executing `arduino-cli config delete`")
4848
toDelete := args[0]
4949

50-
keys := []string{}
51-
exists := false
52-
for _, v := range configuration.Settings.AllKeys() {
53-
if !strings.HasPrefix(v, toDelete) {
54-
keys = append(keys, v)
55-
continue
56-
}
57-
exists = true
50+
svc := daemon.SettingsService{}
51+
_, err := svc.Delete(cmd.Context(), &settings.DeleteRequest{Key: toDelete})
52+
if err != nil {
53+
feedback.Fatal(tr("Cannot delete the key %[1]s: %[2]v", toDelete, err), feedback.ErrGeneric)
5854
}
59-
60-
if !exists {
61-
feedback.Fatal(tr("Settings key doesn't exist"), feedback.ErrGeneric)
62-
}
63-
64-
updatedSettings := viper.New()
65-
for _, k := range keys {
66-
updatedSettings.Set(k, configuration.Settings.Get(k))
67-
}
68-
69-
if err := updatedSettings.WriteConfigAs(configuration.Settings.ConfigFileUsed()); err != nil {
70-
feedback.Fatal(tr("Can't write config file: %v", err), feedback.ErrGeneric)
55+
_, err = svc.Write(cmd.Context(), &settings.WriteRequest{FilePath: configuration.Settings.ConfigFileUsed()})
56+
if err != nil {
57+
feedback.Fatal(tr("Cannot write the file %[1]s: %[2]v", configuration.Settings.ConfigFileUsed(), err), feedback.ErrGeneric)
7158
}
7259
}

internal/integrationtest/config/config_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ func TestAddRemoveSetDeleteOnUnexistingKey(t *testing.T) {
302302

303303
_, stderr, err = cli.Run("config", "delete", "some.key", "--config-file", "arduino-cli.yaml")
304304
require.Error(t, err)
305-
require.Contains(t, string(stderr), "Settings key doesn't exist")
305+
require.Contains(t, string(stderr), "Cannot delete the key some.key: key not found in settings\n")
306306
}
307307

308308
func TestAddSingleArgument(t *testing.T) {

rpc/cc/arduino/cli/settings/v1/settings.pb.go

+175-52
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rpc/cc/arduino/cli/settings/v1/settings.proto

+11-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ service SettingsService {
3636

3737
// Writes to file settings currently stored in memory
3838
rpc Write(WriteRequest) returns (WriteResponse);
39+
40+
// Deletes an entry and rewrites the file settings
41+
rpc Delete(DeleteRequest) returns (DeleteResponse);
3942
}
4043

4144
message GetAllResponse {
@@ -78,4 +81,11 @@ message WriteRequest {
7881
string file_path = 1;
7982
}
8083

81-
message WriteResponse {}
84+
message WriteResponse {}
85+
86+
message DeleteRequest {
87+
// The key of the setting to delete.
88+
string key = 1;
89+
}
90+
91+
message DeleteResponse {}

rpc/cc/arduino/cli/settings/v1/settings_grpc.pb.go

+39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)