diff --git a/pkg/skaffold/build/tag/git_commit.go b/pkg/skaffold/build/tag/git_commit.go index 5a0553e1e36..bace4336057 100644 --- a/pkg/skaffold/build/tag/git_commit.go +++ b/pkg/skaffold/build/tag/git_commit.go @@ -21,8 +21,6 @@ import ( "crypto/sha256" "encoding/hex" "fmt" - "io" - "os" "os/exec" "path/filepath" "sort" @@ -152,7 +150,8 @@ func commitOrTag(currentTag string, tags []string, opts *Options) string { return fmt.Sprintf("%s:%s", opts.ImageName, currentTag) } -// The file state is dirty. To generate a unique suffix, let's hash all the modified files. +// The file state is dirty. To generate a unique suffix, let's hash the diffs +// of all modified files. // We add a -dirty-unique-id suffix to work well with local iterations. func dirtyTag(root string, opts *Options, currentTag string, lines []string) (string, error) { h := sha256.New() @@ -162,25 +161,23 @@ func dirtyTag(root string, opts *Options, currentTag string, lines []string) (st } if _, err := h.Write([]byte(statusLine)); err != nil { - return "", errors.Wrap(err, "adding deleted file to diff") + return "", errors.Wrap(err, "adding status line to hash") } + // If the file has been deleted, there's no diff to generate. if strings.HasPrefix(statusLine, "D") { continue } - changedPath := strings.Trim(statusLine[2:], " ") - f, err := os.Open(filepath.Join(root, changedPath)) + changedPath := filepath.Join(root, strings.Trim(statusLine[2:], " ")) + diff, err := runGit(root, "diff", changedPath) if err != nil { return "", errors.Wrap(err, "reading diff") } - if _, err := io.Copy(h, f); err != nil { - f.Close() - return "", errors.Wrap(err, "reading diff") + if _, err := h.Write([]byte(diff)); err != nil { + return "", errors.Wrap(err, "adding diff to hash") } - - f.Close() } sha := h.Sum(nil) diff --git a/pkg/skaffold/build/tag/git_commit_test.go b/pkg/skaffold/build/tag/git_commit_test.go index fd9fa4f6767..713d59ef6e9 100644 --- a/pkg/skaffold/build/tag/git_commit_test.go +++ b/pkg/skaffold/build/tag/git_commit_test.go @@ -80,7 +80,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { opts: &Options{ ImageName: "test", }, - expectedName: "test:eefe1b9-dirty-af8de1fde8be4367", + expectedName: "test:eefe1b9-dirty-8b8c4dad90faa822", createGitRepo: func(dir string) { gitInit(t, dir). write("source.go", []byte("code")). @@ -95,7 +95,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { ImageName: "test", Digest: "sha256:12345abcde", }, - expectedName: "test:eefe1b9-dirty-af8de1fde8be4367", + expectedName: "test:eefe1b9-dirty-8b8c4dad90faa822", createGitRepo: func(dir string) { gitInit(t, dir). write("source.go", []byte("code")). @@ -110,7 +110,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { opts: &Options{ ImageName: "test", }, - expectedName: "test:eefe1b9-dirty-bfe9b4566c9d3fec", + expectedName: "test:eefe1b9-dirty-e0bc2923501f63b7", createGitRepo: func(dir string) { gitInit(t, dir). write("source.go", []byte("code")). @@ -154,7 +154,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { opts: &Options{ ImageName: "test", }, - expectedName: "test:eefe1b9-dirty-9c858d88cc0bf792", + expectedName: "test:eefe1b9-dirty-c9417af5dc664b60", createGitRepo: func(dir string) { gitInit(t, dir). write("source.go", []byte("code")). @@ -168,7 +168,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { opts: &Options{ ImageName: "test", }, - expectedName: "test:eefe1b9-dirty-6534adc17ccd1cf4", // Must be <> each time a new name is used + expectedName: "test:eefe1b9-dirty-91fd2028ff0a5cf3", // Must be <> each time a new name is used createGitRepo: func(dir string) { gitInit(t, dir). write("source.go", []byte("code")). @@ -195,7 +195,7 @@ func TestGitCommit_GenerateFullyQualifiedImageName(t *testing.T) { opts: &Options{ ImageName: "test", }, - expectedName: "test:a7b32a6-dirty-83715cdc64e43ee9", + expectedName: "test:a7b32a6-dirty-2dfb095d0f4830ad", createGitRepo: func(dir string) { gitInit(t, dir). mkdir("sub/sub").