blob: 400f149319e2b071bb2013669609825a85e22580 [file] [log] [blame]
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)