Skip to content

Commit c1d38a4

Browse files
committed
Update dest only if changed
1 parent edeb53e commit c1d38a4

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

docker-gen.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"bytes"
45
"encoding/json"
56
"flag"
67
"fmt"
@@ -122,7 +123,7 @@ func usage() {
122123
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] <template> [<dest>]")
123124
}
124125

125-
func generateFile(config Config, containers []*RuntimeContainer) {
126+
func generateFile(config Config, containers []*RuntimeContainer) bool {
126127
templatePath := config.Template
127128
tmpl, err := template.New(filepath.Base(templatePath)).Funcs(template.FuncMap{
128129
"contains": contains,
@@ -149,24 +150,40 @@ func generateFile(config Config, containers []*RuntimeContainer) {
149150
dest, err = ioutil.TempFile("", "docker-gen")
150151
defer dest.Close()
151152
if err != nil {
152-
fmt.Println("unable to create temp file: %s\n", err)
153+
fmt.Printf("unable to create temp file: %s\n", err)
153154
os.Exit(1)
154155
}
155156
}
156157

157-
err = tmpl.ExecuteTemplate(dest, filepath.Base(templatePath), containers)
158+
var buf bytes.Buffer
159+
multiwriter := io.MultiWriter(dest, &buf)
160+
err = tmpl.ExecuteTemplate(multiwriter, filepath.Base(templatePath), containers)
158161
if err != nil {
159162
fmt.Printf("template error: %s\n", err)
160163
}
161164

162165
if config.Dest != "" {
163-
err = os.Rename(dest.Name(), config.Dest)
164-
if err != nil {
165-
fmt.Println("unable to create dest file %s: %s\n", config.Dest, err)
166-
os.Exit(1)
166+
167+
contents := []byte{}
168+
if _, err := os.Stat(config.Dest); err == nil {
169+
contents, err = ioutil.ReadFile(config.Dest)
170+
if err != nil {
171+
fmt.Printf("unable to compare current file contents: %s: %s\n", config.Dest, err)
172+
os.Exit(1)
173+
}
167174
}
168-
}
169175

176+
if bytes.Compare(contents, buf.Bytes()) != 0 {
177+
err = os.Rename(dest.Name(), config.Dest)
178+
if err != nil {
179+
fmt.Printf("unable to create dest file %s: %s\n", config.Dest, err)
180+
os.Exit(1)
181+
}
182+
return true
183+
}
184+
return false
185+
}
186+
return true
170187
}
171188

172189
func newConn() (*httputil.ClientConn, error) {
@@ -274,8 +291,11 @@ func generateFromContainers(client *docker.Client) {
274291
}
275292

276293
for _, config := range configs.Config {
277-
generateFile(config, containers)
278-
runNotifyCmd(config)
294+
changed := generateFile(config, containers)
295+
if changed {
296+
runNotifyCmd(config)
297+
}
298+
279299
}
280300

281301
}

0 commit comments

Comments
 (0)