feat: wrap ErrNoConfigEntry to report missing key

Steve Moyer created

Resolves #935.

Change summary

commands/webui.go                  | 3 ++-
entities/identity/identity_user.go | 4 ++--
repository/config.go               | 6 +++---
repository/config_mem.go           | 2 +-
repository/config_testing.go       | 4 ++--
repository/gogit.go                | 3 ++-
repository/gogit_config.go         | 8 ++++----
7 files changed, 16 insertions(+), 14 deletions(-)

Detailed changes

commands/webui.go 🔗

@@ -2,6 +2,7 @@ package commands
 
 import (
 	"context"
+	"errors"
 	"fmt"
 	"io"
 	"log"
@@ -162,7 +163,7 @@ func runWebUI(env *execenv.Env, opts webUIOptions) error {
 	env.Out.Println("Press Ctrl+c to quit")
 
 	configOpen, err := env.Repo.AnyConfig().ReadBool(webUIOpenConfigKey)
-	if err == repository.ErrNoConfigEntry {
+	if errors.Is(err, repository.ErrNoConfigEntry) {
 		// default to true
 		configOpen = true
 	} else if err != nil {

entities/identity/identity_user.go 🔗

@@ -36,7 +36,7 @@ func GetUserIdentity(repo repository.Repo) (*Identity, error) {
 
 func GetUserIdentityId(repo repository.Repo) (entity.Id, error) {
 	val, err := repo.LocalConfig().ReadString(identityConfigKey)
-	if err == repository.ErrNoConfigEntry {
+	if errors.Is(err, repository.ErrNoConfigEntry) {
 		return entity.UnsetId, ErrNoIdentitySet
 	}
 	if err == repository.ErrMultipleConfigEntry {
@@ -58,7 +58,7 @@ func GetUserIdentityId(repo repository.Repo) (entity.Id, error) {
 // IsUserIdentitySet say if the user has set his identity
 func IsUserIdentitySet(repo repository.Repo) (bool, error) {
 	_, err := repo.LocalConfig().ReadString(identityConfigKey)
-	if err == repository.ErrNoConfigEntry {
+	if errors.Is(err, repository.ErrNoConfigEntry) {
 		return false, nil
 	}
 	if err != nil {

repository/config.go 🔗

@@ -96,7 +96,7 @@ func (m *mergedConfig) ReadBool(key string) (bool, error) {
 	if err == nil {
 		return v, nil
 	}
-	if err != ErrNoConfigEntry && err != ErrMultipleConfigEntry {
+	if !errors.Is(err, ErrNoConfigEntry) && err != ErrMultipleConfigEntry {
 		return false, err
 	}
 	return m.global.ReadBool(key)
@@ -107,7 +107,7 @@ func (m *mergedConfig) ReadString(key string) (string, error) {
 	if err == nil {
 		return val, nil
 	}
-	if err != ErrNoConfigEntry && err != ErrMultipleConfigEntry {
+	if !errors.Is(err, ErrNoConfigEntry) && err != ErrMultipleConfigEntry {
 		return "", err
 	}
 	return m.global.ReadString(key)
@@ -118,7 +118,7 @@ func (m *mergedConfig) ReadTimestamp(key string) (time.Time, error) {
 	if err == nil {
 		return val, nil
 	}
-	if err != ErrNoConfigEntry && err != ErrMultipleConfigEntry {
+	if !errors.Is(err, ErrNoConfigEntry) && err != ErrMultipleConfigEntry {
 		return time.Time{}, err
 	}
 	return m.global.ReadTimestamp(key)

repository/config_mem.go 🔗

@@ -49,7 +49,7 @@ func (mc *MemConfig) ReadString(key string) (string, error) {
 	key = normalizeKey(key)
 	val, ok := mc.config[key]
 	if !ok {
-		return "", ErrNoConfigEntry
+		return "", fmt.Errorf("%w: missing key %s", ErrNoConfigEntry, key)
 	}
 
 	return val, nil

repository/config_testing.go 🔗

@@ -53,7 +53,7 @@ func testConfig(t *testing.T, config Config) {
 	}, configs)
 
 	_, err = config.ReadBool("section.true")
-	require.Equal(t, ErrNoConfigEntry, err)
+	require.ErrorIs(t, err, ErrNoConfigEntry)
 
 	err = config.RemoveAll("section.nonexistingkey")
 	require.Error(t, err)
@@ -62,7 +62,7 @@ func testConfig(t *testing.T, config Config) {
 	require.NoError(t, err)
 
 	_, err = config.ReadString("section.key")
-	require.Equal(t, ErrNoConfigEntry, err)
+	require.ErrorIs(t, err, ErrNoConfigEntry)
 
 	err = config.RemoveAll("nonexistingsection")
 	require.Error(t, err)

repository/gogit.go 🔗

@@ -2,6 +2,7 @@ package repository
 
 import (
 	"bytes"
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"os"
@@ -270,7 +271,7 @@ func (repo *GoGitRepo) GetCoreEditor() (string, error) {
 	if err == nil && val != "" {
 		return val, nil
 	}
-	if err != nil && err != ErrNoConfigEntry {
+	if err != nil && !errors.Is(err, ErrNoConfigEntry) {
 		return "", err
 	}
 

repository/gogit_config.go 🔗

@@ -119,7 +119,7 @@ func (cr *goGitConfigReader) ReadString(key string) (string, error) {
 
 	sectionName := split[0]
 	if !cfg.Raw.HasSection(sectionName) {
-		return "", ErrNoConfigEntry
+		return "", fmt.Errorf("%w: missing key %s", ErrNoConfigEntry, key)
 	}
 	section := cfg.Raw.Section(sectionName)
 
@@ -127,7 +127,7 @@ func (cr *goGitConfigReader) ReadString(key string) (string, error) {
 	case len(split) == 2:
 		optionName := split[1]
 		if !section.HasOption(optionName) {
-			return "", ErrNoConfigEntry
+			return "", fmt.Errorf("%w: missing key %s", ErrNoConfigEntry, key)
 		}
 		if len(section.OptionAll(optionName)) > 1 {
 			return "", ErrMultipleConfigEntry
@@ -137,11 +137,11 @@ func (cr *goGitConfigReader) ReadString(key string) (string, error) {
 		subsectionName := strings.Join(split[1:len(split)-1], ".")
 		optionName := split[len(split)-1]
 		if !section.HasSubsection(subsectionName) {
-			return "", ErrNoConfigEntry
+			return "", fmt.Errorf("%w: missing key %s", ErrNoConfigEntry, key)
 		}
 		subsection := section.Subsection(subsectionName)
 		if !subsection.HasOption(optionName) {
-			return "", ErrNoConfigEntry
+			return "", fmt.Errorf("%w: missing key %s", ErrNoConfigEntry, key)
 		}
 		if len(subsection.OptionAll(optionName)) > 1 {
 			return "", ErrMultipleConfigEntry