# HG changeset patch
# User Florent Aide <florent.aide@gmail.com>
# Date 1652972736 -7200
#      Thu May 19 17:05:36 2022 +0200
# Node ID 1895c0e0876a7fa8f05a64ffaf205dba4e35ca98
# Parent  8ff5f76c62697593eb7185dba78ebfa821213956
tooling: added a linter and fix its complaints

diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -1,6 +1,7 @@
 syntax: glob
 
 build
+tools/bin
 
 .idea
 *.swp
diff --git a/Taskfile.yml b/Taskfile.yml
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -12,11 +12,16 @@
 vars:
   VERSION: 1.0.0
   OUTPUT: "build/beaver"
+  GOLANGCI_LINT_VERSION: v1.44.0
+  GOLANGCI_LINT_BASE: tools/bin/golangci-lint
+  GOLANGCI_LINT_BIN: "{{.GOLANGCI_LINT_BASE}}-{{.GOLANGCI_LINT_VERSION}}"
+  GOLANGCI_LINT_ARGS:
 
 tasks:
   default:
     cmds:
     - task: build
+
   build:
     desc: build golang project
     cmds:
@@ -28,3 +33,20 @@
         main.go
     generates:
     - "{{.OUTPUT}}"
+
+  fetch-golangci-lint:
+    desc: fetch golangci-lint tool
+    cmds:
+      - mkdir -p tools/bin
+      - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b tools/bin {{.GOLANGCI_LINT_VERSION}}
+      - mv {{.GOLANGCI_LINT_BASE}} {{.GOLANGCI_LINT_BIN}}
+    status:
+      - test -x {{.GOLANGCI_LINT_BIN}}
+    generates:
+      - "{{.GOLANGCI_LINT_BIN}}"
+
+  lint:
+    desc: lint our golang code to make sure we catch as much errors as possible
+    deps: [fetch-golangci-lint]
+    cmds:
+      - "{{.GOLANGCI_LINT_BIN}} run {{.GOLANGCI_LINT_ARGS}}"
diff --git a/cmd/build.go b/cmd/build.go
--- a/cmd/build.go
+++ b/cmd/build.go
@@ -1,8 +1,8 @@
 package cmd
 
 import (
+	"fmt"
 	"os"
-	"fmt"
 
 	"orus.io/cloudcrane/beaver/runner"
 )
@@ -35,7 +35,11 @@
 		return fmt.Errorf("failed to create temp dir: %w", err)
 	}
 	if !cmd.Args.DryRun {
-		defer os.RemoveAll(tmpDir)
+		defer func() {
+			if err := os.RemoveAll(tmpDir); err != nil {
+				Logger.Err(err).Str("tempdir", tmpDir).Msg("failed to remove temp dir")
+			}
+		}()
 	}
 
 	if err := config.Initialize(tmpDir); err != nil {
diff --git a/runner/cmd_test.go b/runner/cmd_test.go
--- a/runner/cmd_test.go
+++ b/runner/cmd_test.go
@@ -3,6 +3,7 @@
 import (
 	"fmt"
 	"io/ioutil"
+	"os"
 	"path/filepath"
 	"testing"
 
@@ -31,7 +32,10 @@
 	absConfigDir, err := filepath.Abs("fixtures/")
 	require.NoError(t, err)
 	c := NewCmdConfig(tl.Logger(), absConfigDir, testNS, false)
-	require.NoError(t, c.Initialize())
+	tmpDir, err := os.MkdirTemp(os.TempDir(), "beaver-")
+	require.NoError(t, err)
+	defer assert.NoError(t, os.RemoveAll(tmpDir))
+	require.NoError(t, c.Initialize(tmpDir))
 
 	t.Run("helmCharts", func(t *testing.T) {
 		pgHelmChart, ok := c.Spec.Charts["postgres"]
diff --git a/runner/config_test.go b/runner/config_test.go
--- a/runner/config_test.go
+++ b/runner/config_test.go
@@ -1,6 +1,7 @@
 package runner
 
 import (
+	"os"
 	"path/filepath"
 	"testing"
 
@@ -26,10 +27,12 @@
 	absConfigDir, err := filepath.Abs("fixtures/")
 	require.NoError(t, err)
 	c := NewCmdConfig(tl.Logger(), absConfigDir, testNS, false)
-	require.NoError(t, c.Initialize())
+	tmpDir, err := os.MkdirTemp(os.TempDir(), "beaver-")
+	require.NoError(t, err)
+	defer assert.NoError(t, os.RemoveAll(tmpDir))
+	require.NoError(t, c.Initialize(tmpDir))
 
-	args, err := c.Spec.Ytt.BuildArgs(testNS, []string{"/tmp/postgres.1234.yaml", "/tmp/odoo.5678.yaml"})
-	require.NoError(t, err)
+	args := c.Spec.Ytt.BuildArgs(testNS, []string{"/tmp/postgres.1234.yaml", "/tmp/odoo.5678.yaml"})
 	assert.Equal(
 		t,
 		args,
diff --git a/runner/main.go b/runner/main.go
--- a/runner/main.go
+++ b/runner/main.go
@@ -23,7 +23,7 @@
 func (r *Runner) Build(tmpDir string) error {
 	// create helm commands
 	// create ytt chart commands
-	var cmds map[string]*cmd.Cmd
+	cmds := make(map[string]*cmd.Cmd)
 	for name, chart := range r.config.Spec.Charts {
 		args, err := chart.BuildArgs(name, r.config.Namespace)
 		if err != nil {