project-laktiu:fix warning in docker when homedir not present

BUG=b/180931041
TEST=manual validation and presubmit
RELEASE_NOTE=fixed warning in docker when homedir not present


Change-Id: Ic9e29ffe02ef2e36e1a2ac4dfc9e0fd9534570dc
Reviewed-on: https://cos-review.googlesource.com/c/cos/overlays/board-overlays/+/13030
Reviewed-by: Roy Yang <royyang@google.com>
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
diff --git a/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2-r3.ebuild b/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2-r4.ebuild
similarity index 100%
rename from project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2-r3.ebuild
rename to project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2-r4.ebuild
diff --git a/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2.ebuild b/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2.ebuild
index 85a4ebd..45e761a 100644
--- a/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2.ebuild
+++ b/project-lakitu/app-emulation/docker-cli/docker-cli-20.10.2.ebuild
@@ -23,6 +23,13 @@
 
 S="${WORKDIR}/${P}/src/${EGO_PN}"
 
+
+PATCHES=(
+	# b/180931041 - patch from upstream
+	# can be removed after 20.10.4 docker version update
+	"${FILESDIR}"/docker-20.10.2-prevent-warning-if-home-is-not-set.patch
+)
+
 src_prepare() {
 	default
 	sed -i 's@dockerd\?\.exe@@g' contrib/completion/bash/docker || die
diff --git a/project-lakitu/app-emulation/docker-cli/files/docker-20.10.2-prevent-warning-if-home-is-not-set.patch b/project-lakitu/app-emulation/docker-cli/files/docker-20.10.2-prevent-warning-if-home-is-not-set.patch
new file mode 100644
index 0000000..400f149
--- /dev/null
+++ b/project-lakitu/app-emulation/docker-cli/files/docker-20.10.2-prevent-warning-if-home-is-not-set.patch
@@ -0,0 +1,116 @@
+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)