From d513e46bfc8d692343a08bd88639910c5c6db54d Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 18 Jan 2021 14:46:52 +0100 Subject: [PATCH] cli/config: prevent warning if HOME is not set commit c2626a8270924d0cec54477fc506174cd31dc560 replaced the use of github.com/docker/docker/pkg/homedir with Golang's os.UserHomeDir(). This change was partially reverted in 7a279af43de6650d2f36c41f9d926db7be3b3567 to account for situations where `$HOME` is not set. In situations where no configuration file is present in `~/.config/`, the CLI falls back to looking for the (deprecated) `~/.dockercfg` configuration file, which was still using `os.UserHomeDir()`, which produces an error/warning if `$HOME` is not set. This patch introduces a helper function and a global variable to get the user's home-directory. The global variable is used to prevent repeatedly looking up the user's information (which, depending on the setup can be a costly operation). Signed-off-by: Sebastiaan van Stijn (cherry picked from commit c85a37dbb472c39bc88cf707fce83fed7a644fed) Signed-off-by: Sebastiaan van Stijn --- cli/config/config.go | 22 ++++++++++++++++------ cli/config/config_test.go | 4 ++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/cli/config/config.go b/cli/config/config.go index 703fa30f48..98147e270a 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -26,15 +26,29 @@ const ( var ( initConfigDir sync.Once configDir string + homeDir string ) +// resetHomeDir is used in testing to resets the "homeDir" package variable to +// force re-lookup of the home directory between tests. +func resetHomeDir() { + homeDir = "" +} + +func getHomeDir() string { + if homeDir == "" { + homeDir = homedir.Get() + } + return homeDir +} + func setConfigDir() { if configDir != "" { return } configDir = os.Getenv("DOCKER_CONFIG") if configDir == "" { - configDir = filepath.Join(homedir.Get(), configFileDir) + configDir = filepath.Join(getHomeDir(), configFileDir) } } @@ -109,11 +123,7 @@ func Load(configDir string) (*configfile.ConfigFile, error) { } // Can't find latest config file so check for the old one - home, err := os.UserHomeDir() - if err != nil { - return configFile, errors.Wrap(err, oldConfigfile) - } - filename = filepath.Join(home, oldConfigfile) + filename = filepath.Join(getHomeDir(), oldConfigfile) if file, err := os.Open(filename); err == nil { defer file.Close() if err := configFile.LegacyLoadFromReader(file); err != nil { diff --git a/cli/config/config_test.go b/cli/config/config_test.go index a861d4da1e..c7787bb5d1 100644 --- a/cli/config/config_test.go +++ b/cli/config/config_test.go @@ -115,6 +115,7 @@ password`: "Invalid Auth config file", email`: "Invalid auth configuration file", } + resetHomeDir() tmpHome, err := ioutil.TempDir("", "config-test") assert.NilError(t, err) defer os.RemoveAll(tmpHome) @@ -131,6 +132,7 @@ email`: "Invalid auth configuration file", } func TestOldValidAuth(t *testing.T) { + resetHomeDir() tmpHome, err := ioutil.TempDir("", "config-test") assert.NilError(t, err) defer os.RemoveAll(tmpHome) @@ -165,6 +167,7 @@ func TestOldValidAuth(t *testing.T) { } func TestOldJSONInvalid(t *testing.T) { + resetHomeDir() tmpHome, err := ioutil.TempDir("", "config-test") assert.NilError(t, err) defer os.RemoveAll(tmpHome) @@ -184,6 +187,7 @@ func TestOldJSONInvalid(t *testing.T) { } func TestOldJSON(t *testing.T) { + resetHomeDir() tmpHome, err := ioutil.TempDir("", "config-test") assert.NilError(t, err) defer os.RemoveAll(tmpHome)