Skip to content

Commit

Permalink
Future-proof keystore.Has by returning an error as well
Browse files Browse the repository at this point in the history
License: MIT
Signed-off-by: Michael Muré <batolettre@gmail.com>
  • Loading branch information
MichaelMure committed May 8, 2017
1 parent c0a04a0 commit 7e91da2
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 12 deletions.
14 changes: 11 additions & 3 deletions core/commands/keystore.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,13 +260,21 @@ var keyRenameCmd = &cmds.Command{

overwrite := false
force, _, _ := res.Request().Option("f").Bool()
if force && ks.Has(newName) {
overwrite = true
err := ks.Delete(newName)
if force {
exist, err := ks.Has(newName)
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}

if exist {
overwrite = true
err := ks.Delete(newName)
if err != nil {
res.SetError(err, cmds.ErrNormal)
return
}
}
}

err = ks.Put(newName, oldKey)
Expand Down
14 changes: 11 additions & 3 deletions keystore/keystore.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
)

type Keystore interface {
Has(string) bool
Has(string) (bool, error)
Put(string, ci.PrivKey) error
Get(string) (ci.PrivKey, error)
Delete(string) error
Expand Down Expand Up @@ -55,12 +55,20 @@ func NewFSKeystore(dir string) (*FSKeystore, error) {
return &FSKeystore{dir}, nil
}

func (ks *FSKeystore) Has(name string) bool {
func (ks *FSKeystore) Has(name string) (bool, error) {
kp := filepath.Join(ks.dir, name)

_, err := os.Stat(kp)

return err == nil
if os.IsNotExist(err) {
return false, nil
}

if err != nil {
return false, err
}

return true, nil
}

func (ks *FSKeystore) Put(name string, k ci.PrivKey) error {
Expand Down
12 changes: 10 additions & 2 deletions keystore/keystore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,21 @@ func TestKeystoreBasics(t *testing.T) {
t.Fatal(err)
}

if !ks.Has("foo") {
exist, err := ks.Has("foo")
if !exist {
t.Fatal("should know it has a key named foo")
}
if err != nil {
t.Fatal(err)
}

if ks.Has("nonexistingkey") {
exist, err = ks.Has("nonexistingkey")
if exist {
t.Fatal("should know it doesn't have a key named nonexistingkey")
}
if err != nil {
t.Fatal(err)
}

if err := ks.Delete("bar"); err != nil {
t.Fatal(err)
Expand Down
4 changes: 2 additions & 2 deletions keystore/memkeystore.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ func NewMemKeystore() *MemKeystore {
return &MemKeystore{make(map[string]ci.PrivKey)}
}

func (mk *MemKeystore) Has(name string) bool {
func (mk *MemKeystore) Has(name string) (bool, error) {
_, ok := mk.keys[name]
return ok
return ok, nil
}

func (mk *MemKeystore) Put(name string, k ci.PrivKey) error {
Expand Down
12 changes: 10 additions & 2 deletions keystore/memkeystore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,21 @@ func TestMemKeyStoreBasics(t *testing.T) {
t.Fatal("should not be able to overwrite key")
}

if !ks.Has("foo") {
exist, err := ks.Has("foo")
if !exist {
t.Fatal("should know it has a key named foo")
}
if err != nil {
t.Fatal(err)
}

if ks.Has("nonexistingkey") {
exist, err = ks.Has("nonexistingkey")
if exist {
t.Fatal("should know it doesn't have a key named nonexistingkey")
}
if err != nil {
t.Fatal(err)
}

if err := ks.Delete("bar"); err != nil {
t.Fatal(err)
Expand Down

0 comments on commit 7e91da2

Please sign in to comment.