@cryptotaxi247 / kubo / commits / 7e91da206

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)