Skip to content
This repository was archived by the owner on Mar 27, 2024. It is now read-only.

Commit 4e6ac73

Browse files
authored
Merge pull request #274 from vsoch/enh/custom-cache
Adding custom cache envar and command line argument
2 parents e700f76 + 92e4e0a commit 4e6ac73

File tree

2 files changed

+97
-6
lines changed

2 files changed

+97
-6
lines changed

cmd/root.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
pkgutil "github.com/GoogleContainerTools/container-diff/pkg/util"
2929
"github.com/GoogleContainerTools/container-diff/util"
3030
homedir "github.com/mitchellh/go-homedir"
31+
"github.com/pkg/errors"
3132
"github.com/sirupsen/logrus"
3233
"github.com/spf13/cobra"
3334
"github.com/spf13/pflag"
@@ -39,9 +40,12 @@ var save bool
3940
var types diffTypes
4041
var noCache bool
4142

43+
var cacheDir string
4244
var LogLevel string
4345
var format string
4446

47+
const containerDiffEnvCacheDir = "CONTAINER_DIFF_CACHEDIR"
48+
4549
type validatefxn func(args []string) error
4650

4751
var RootCmd = &cobra.Command{
@@ -129,20 +133,31 @@ func getImage(imageName string) (pkgutil.Image, error) {
129133
var cachePath string
130134
var err error
131135
if !noCache {
132-
cachePath, err = cacheDir(imageName)
136+
cachePath, err = getCacheDir(imageName)
133137
if err != nil {
134138
return pkgutil.Image{}, err
135139
}
136140
}
137141
return pkgutil.GetImage(imageName, includeLayers(), cachePath)
138142
}
139143

140-
func cacheDir(imageName string) (string, error) {
141-
dir, err := homedir.Dir()
142-
if err != nil {
143-
return "", err
144+
func getCacheDir(imageName string) (string, error) {
145+
// First preference for cache is set at command line
146+
if cacheDir == "" {
147+
// second preference is environment
148+
cacheDir = os.Getenv(containerDiffEnvCacheDir)
144149
}
145-
rootDir := filepath.Join(dir, ".container-diff", "cache")
150+
151+
// Third preference (default) is set at $HOME
152+
if cacheDir == "" {
153+
dir, err := homedir.Dir()
154+
if err != nil {
155+
return "", errors.Wrap(err, "retrieving home dir")
156+
} else {
157+
cacheDir = dir
158+
}
159+
}
160+
rootDir := filepath.Join(cacheDir, ".container-diff", "cache")
146161
imageName = strings.Replace(imageName, string(os.PathSeparator), "", -1)
147162
return filepath.Join(rootDir, filepath.Clean(imageName)), nil
148163
}
@@ -185,4 +200,6 @@ func addSharedFlags(cmd *cobra.Command) {
185200
cmd.Flags().BoolVarP(&save, "save", "s", false, "Set this flag to save rather than remove the final image filesystems on exit.")
186201
cmd.Flags().BoolVarP(&util.SortSize, "order", "o", false, "Set this flag to sort any file/package results by descending size. Otherwise, they will be sorted by name.")
187202
cmd.Flags().BoolVarP(&noCache, "no-cache", "n", false, "Set this to force retrieval of image filesystem on each run.")
203+
cmd.Flags().StringVarP(&cacheDir, "cache-dir", "c", "", "cache directory base to create .container-diff (default is $HOME).")
204+
188205
}

cmd/root_test.go

+74
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,81 @@ limitations under the License.
1616

1717
package cmd
1818

19+
import (
20+
"os"
21+
"path"
22+
"path/filepath"
23+
"testing"
24+
25+
homedir "github.com/mitchellh/go-homedir"
26+
)
27+
1928
type testpair struct {
2029
input []string
2130
shouldError bool
2231
}
32+
33+
func TestCacheDir(t *testing.T) {
34+
homeDir, err := homedir.Dir()
35+
if err != nil {
36+
t.Errorf("error getting home dir: %s", err.Error())
37+
}
38+
tests := []struct {
39+
name string
40+
cliFlag string
41+
envVar string
42+
expectedDir string
43+
imageName string
44+
}{
45+
{
46+
name: "default cache is at $HOME",
47+
cliFlag: "",
48+
envVar: "",
49+
expectedDir: filepath.Join(homeDir, ".container-diff", "cache"),
50+
imageName: "pancakes",
51+
},
52+
{
53+
name: "setting cache via --cache-dir",
54+
cliFlag: "/tmp",
55+
envVar: "",
56+
expectedDir: "/tmp/.container-diff/cache",
57+
imageName: "pancakes",
58+
},
59+
{
60+
name: "setting cache via CONTAINER_DIFF_CACHEDIR",
61+
cliFlag: "",
62+
envVar: "/tmp",
63+
expectedDir: "/tmp/.container-diff/cache",
64+
imageName: "pancakes",
65+
},
66+
{
67+
name: "command line --cache-dir takes preference to CONTAINER_DIFF_CACHEDIR",
68+
cliFlag: "/tmp",
69+
envVar: "/opt",
70+
expectedDir: "/tmp/.container-diff/cache",
71+
imageName: "pancakes",
72+
},
73+
}
74+
75+
for _, tt := range tests {
76+
t.Run(tt.name, func(t *testing.T) {
77+
// set any environment variables
78+
if tt.envVar != "" {
79+
os.Setenv("CONTAINER_DIFF_CACHEDIR", tt.envVar)
80+
}
81+
// Set global flag for cache based on --cache-dir
82+
cacheDir = tt.cliFlag
83+
84+
// call getCacheDir and make sure return is equal to expected
85+
actualDir, err := getCacheDir(tt.imageName)
86+
if err != nil {
87+
t.Errorf("Error getting cache dir %s: %s", tt.name, err.Error())
88+
}
89+
90+
if path.Dir(actualDir) != tt.expectedDir {
91+
t.Errorf("%s\nexpected: %v\ngot: %v", tt.name, tt.expectedDir, actualDir)
92+
}
93+
},
94+
)
95+
}
96+
}

0 commit comments

Comments
 (0)