Future-proof keystore.Has by returning an error as well
License: MIT Signed-off-by: Michael Muré <batolettre@gmail.com>
Michael Muré committed
May 8, 2017 at 17:00 UTC
7e91da20673f97cac2ff0729402d678751f5cae3
5 files changed
+44
-12
core/commands/keystore.go
+11
-3
@@ -260,13 +260,21 @@ var keyRenameCmd = &cmds.Command{
260
261
overwrite := false
262
force, _, _ := res.Request().Option("f").Bool()
263
- if force && ks.Has(newName) {
264
- overwrite = true
265
- err := ks.Delete(newName)
263
+ if force {
264
+ exist, err := ks.Has(newName)
265
if err != nil {
266
res.SetError(err, cmds.ErrNormal)
267
return
268
}
269
+
270
+ if exist {
271
+ overwrite = true
272
+ err := ks.Delete(newName)
273
+ if err != nil {
274
+ res.SetError(err, cmds.ErrNormal)
275
+ return
276
+ }
277
+ }
278
}
279
280
err = ks.Put(newName, oldKey)
keystore/keystore.go
+11
-3
@@ -11,7 +11,7 @@ import (
11
)
12
13
type Keystore interface {
14
- Has(string) bool
14
+ Has(string) (bool, error)
15
Put(string, ci.PrivKey) error
16
Get(string) (ci.PrivKey, error)
17
Delete(string) error
@@ -55,12 +55,20 @@ func NewFSKeystore(dir string) (*FSKeystore, error) {
55
return &FSKeystore{dir}, nil
56
}
57
58
-func (ks *FSKeystore) Has(name string) bool {
58
+func (ks *FSKeystore) Has(name string) (bool, error) {
59
kp := filepath.Join(ks.dir, name)
60
61
_, err := os.Stat(kp)
62
63
- return err == nil
63
+ if os.IsNotExist(err) {
64
+ return false, nil
65
+ }
66
+
67
+ if err != nil {
68
+ return false, err
69
+ }
70
+
71
+ return true, nil
72
}
73
74
func (ks *FSKeystore) Put(name string, k ci.PrivKey) error {
keystore/keystore_test.go
+10
-2
@@ -82,13 +82,21 @@ func TestKeystoreBasics(t *testing.T) {
82
t.Fatal(err)
83
}
84
85
- if !ks.Has("foo") {
85
+ exist, err := ks.Has("foo")
86
+ if !exist {
87
t.Fatal("should know it has a key named foo")
88
}
89
+ if err != nil {
90
+ t.Fatal(err)
91
+ }
92
89
- if ks.Has("nonexistingkey") {
93
+ exist, err = ks.Has("nonexistingkey")
94
+ if exist {
95
t.Fatal("should know it doesn't have a key named nonexistingkey")
96
}
97
+ if err != nil {
98
+ t.Fatal(err)
99
+ }
100
101
if err := ks.Delete("bar"); err != nil {
102
t.Fatal(err)
keystore/memkeystore.go
+2
-2
@@ -10,9 +10,9 @@ func NewMemKeystore() *MemKeystore {
10
return &MemKeystore{make(map[string]ci.PrivKey)}
11
}
12
13
-func (mk *MemKeystore) Has(name string) bool {
13
+func (mk *MemKeystore) Has(name string) (bool, error) {
14
_, ok := mk.keys[name]
15
- return ok
15
+ return ok, nil
16
}
17
18
func (mk *MemKeystore) Put(name string, k ci.PrivKey) error {
keystore/memkeystore_test.go
+10
-2
@@ -47,13 +47,21 @@ func TestMemKeyStoreBasics(t *testing.T) {
47
t.Fatal("should not be able to overwrite key")
48
}
49
50
- if !ks.Has("foo") {
50
+ exist, err := ks.Has("foo")
51
+ if !exist {
52
t.Fatal("should know it has a key named foo")
53
}
54
+ if err != nil {
55
+ t.Fatal(err)
56
+ }
57
54
- if ks.Has("nonexistingkey") {
58
+ exist, err = ks.Has("nonexistingkey")
59
+ if exist {
60
t.Fatal("should know it doesn't have a key named nonexistingkey")
61
}
62
+ if err != nil {
63
+ t.Fatal(err)
64
+ }
65
66
if err := ks.Delete("bar"); err != nil {
67
t.Fatal(err)