Skip to content
This repository was archived by the owner on May 18, 2021. It is now read-only.

WIP: Update all cookbooks if Berksfile, Cheffile, etc. have changed #51

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions resolver/berkshelf/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,8 @@ func (r Resolver) Resolve(dst string) error {
func (r Resolver) Name() string {
return "Berkshelf"
}

// InputFiles returns a list of files Berkshelf uses as input.
func (r Resolver) InputFiles() []string {
return []string{"Berksfile", "Berksfile.lock"}
}
5 changes: 5 additions & 0 deletions resolver/dir/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,8 @@ func (r Resolver) Resolve(dst string) error {
func (r Resolver) Name() string {
return "Directory"
}

// InputFiles returns a list of files the directory resolver uses as input.
func (r Resolver) InputFiles() []string {
return []string{}
}
5 changes: 5 additions & 0 deletions resolver/librarian/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,8 @@ func (r Resolver) Resolve(dst string) error {
func (r Resolver) Name() string {
return "Librarian-Chef"
}

// InputFiles returns a list of files Librarian-Chef uses as input.
func (r Resolver) InputFiles() []string {
return []string{"Cheffile", "Cheffile.lock"}
}
33 changes: 21 additions & 12 deletions resolver/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
type Resolver interface {
Resolve(dst string) error
Name() string
InputFiles() []string
}

func findResolverByName(name string) (Resolver, error) {
Expand All @@ -41,23 +42,26 @@ func findResolver(name, dst string) (Resolver, error) {
return findResolverByName(name)
}

cb, _ := cookbook.NewCookbook(".")
tsFile := path.Join(dst, "action_resolve")
ts, _ := util.ReadTimestampFile(tsFile)

// If the current folder is a cookbook and its dependencies have
// already been resolved, only update this cookbook with rsync.
// TODO: improve this check by comparing timestamps etc.
if cb.Name != "" && util.FileExist(dst) {
return dir.Resolver{}, nil
}

if util.FileExist("Berksfile") {
return berkshelf.Resolver{}, nil
for _, name := range berkshelf.InputFiles {
mt, err := util.FileModTime(name)
if err == nil && mt >= ts {
log.Debugf("%s was updated, using Berkshelf\n", name)
return berkshelf.Resolver{}, nil
}
}

if util.FileExist("Cheffile") {
return librarian.Resolver{}, nil
for _, name := range librarian.InputFiles {
mt, err := util.FileModTime(name)
if err == nil && mt >= ts {
log.Debugf("%s was updated, using Librarian\n", name)
return librarian.Resolver{}, nil
}
}

cb, _ := cookbook.NewCookbook(".")
if cb.Name != "" {
return dir.Resolver{}, nil
}
Expand Down Expand Up @@ -102,6 +106,11 @@ func Resolve(name, dst string) error {
return err
}

tsFile := path.Join(dst, "action_resolve")
if err := util.WriteTimestampFile(tsFile); err != nil {
return err
}

log.Info("Stripping non-cookbook files")
return stripCookbooks(dst)

Expand Down
27 changes: 27 additions & 0 deletions util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import (
"io/ioutil"
"os"
"path/filepath"
"strconv"
"strings"
"time"
)

// FileExist reports whether a file or directory exists.
Expand Down Expand Up @@ -57,3 +59,28 @@ func InTestDir(f func()) {
defer os.RemoveAll(testDir)
InDir(testDir, f)
}

// WriteTimestampFile writes the current time as Unix timestamp to a file.
func WriteTimestampFile(filename string) error {
ts := strconv.FormatInt(time.Now().Unix(), 10)
return ioutil.WriteFile(filename, []byte(ts), 0644)
}

// ReadTimestampFile reads the Unix timestamp from a file created with
// WriteTimestampFile.
func ReadTimestampFile(filename string) (int64, error) {
data, err := ioutil.ReadFile(filename)
if err != nil {
return 0, err
}
return strconv.ParseInt(string(data), 10, 64)
}

// FileModTime returns a file's modification time as Unix timestamp.
func FileModTime(filename string) (int64, error) {
info, err := os.Stat(filename)
if err != nil {
return 0, err
}
return info.ModTime().Unix(), nil
}
13 changes: 13 additions & 0 deletions util/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"path/filepath"
"strings"
"testing"
"time"

. "github.com/mlafeldt/chef-runner/util"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -76,3 +77,15 @@ func TestInTestDir(t *testing.T) {
assert.Equal(t, wd, wd2)
assert.False(t, FileExist(testDir))
}

func TestWriteAndReadTimestampFile(t *testing.T) {
tsFile := "some-timestamp"
defer os.Remove(tsFile)

err := WriteTimestampFile(tsFile)
assert.NoError(t, err)

ts, err := ReadTimestampFile(tsFile)
assert.NoError(t, err)
assert.True(t, ts >= time.Now().Unix())
}