| From: varsha teratipally <teratipally@google.com> |
| Date: Tue, 22 Feb 2021 00:07:25 +0000 |
| Subject:Cherry-pick of an upstream patch |
| |
| From d513e46bfc8d692343a08bd88639910c5c6db54d Mon Sep 17 00:00:00 2001 |
| From: Sebastiaan van Stijn <github@gone.nl> |
| 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 <github@gone.nl> |
| (cherry picked from commit c85a37dbb472c39bc88cf707fce83fed7a644fed) |
| Signed-off-by: Sebastiaan van Stijn <github@gone.nl> |
| --- |
| 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) |