Skip to content

Commit 0550a0e

Browse files
committed
cmd/vulnreport: only write files if they would be modified
Before writing YAML/OSV/CVE files, check if their contents would be modified. The main benefit of this is that we now only print out the written filename if its contents change, which is helpful for determining the impact of batch operations. Change-Id: Ieae133a1697d98b99cb40dda56826a5c46f40487 Reviewed-on: https://go-review.googlesource.com/c/vulndb/+/599179 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Damien Neil <[email protected]>
1 parent 6d0cca3 commit 0550a0e

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

cmd/vulnreport/run_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,14 @@ func newInMemoryWFS() *memWFS {
4545
return &memWFS{written: make(map[string][]byte)}
4646
}
4747

48-
func (m *memWFS) WriteFile(fname string, b []byte) error {
48+
var _ wfs = &memWFS{}
49+
50+
func (m *memWFS) WriteFile(fname string, b []byte) (bool, error) {
51+
if bytes.Equal(m.written[fname], b) {
52+
return false, nil
53+
}
4954
m.written[fname] = b
50-
return nil
55+
return true, nil
5156
}
5257
func testFilename(t *testing.T) string {
5358
return filepath.Join("testdata", t.Name()+".txtar")

cmd/vulnreport/writer.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ func (f *fileWriter) write(r *yamlReport) error {
2828
if err := r.Encode(w); err != nil {
2929
return err
3030
}
31-
if err := f.WriteFile(r.Filename, w.Bytes()); err != nil {
31+
modified, err := f.WriteFile(r.Filename, w.Bytes())
32+
if err != nil {
3233
return err
3334
}
34-
return ok(r.Filename)
35+
return ok(r.Filename, modified)
3536
}
3637

3738
func (f *fileWriter) writeOSV(r *yamlReport) error {
@@ -71,24 +72,33 @@ func writeJSON(wfs wfs, fname string, v any) error {
7172
if err != nil {
7273
return err
7374
}
74-
if err := wfs.WriteFile(fname, j); err != nil {
75+
modified, err := wfs.WriteFile(fname, j)
76+
if err != nil {
7577
return err
7678
}
77-
return ok(fname)
79+
return ok(fname, modified)
7880
}
7981

80-
func ok(fname string) error {
81-
log.Out(filepath.ToSlash(fname))
82+
func ok(fname string, modified bool) error {
83+
if modified {
84+
log.Out(filepath.ToSlash(fname))
85+
}
8286
return nil
8387
}
8488

8589
// a simple representation of a writeable file system
8690
type wfs interface {
87-
WriteFile(string, []byte) error
91+
WriteFile(string, []byte) (bool, error)
8892
}
8993

9094
type defaultWFS struct{}
9195

92-
func (defaultWFS) WriteFile(filename string, b []byte) error {
93-
return os.WriteFile(filename, b, 0644)
96+
var _ wfs = &defaultWFS{}
97+
98+
func (defaultWFS) WriteFile(filename string, b []byte) (bool, error) {
99+
// writing the file would not change its contents
100+
if existing, err := os.ReadFile(filename); err == nil && bytes.Equal(existing, b) {
101+
return false, nil
102+
}
103+
return true, os.WriteFile(filename, b, 0644)
94104
}

0 commit comments

Comments
 (0)