/
logging_mutator.go
112 lines (101 loc) · 2.76 KB
/
logging_mutator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package chezmoi
import (
"fmt"
"io"
"os"
"github.com/pmezard/go-difflib/difflib"
)
// A LoggingMutator wraps an Mutator and logs all of the actions it executes
// and any errors.
type LoggingMutator struct {
m Mutator
w io.Writer
}
// NewLoggingMutator returns a new LoggingMutator.
func NewLoggingMutator(w io.Writer, m Mutator) *LoggingMutator {
return &LoggingMutator{
m: m,
w: w,
}
}
// Chmod implements Mutator.Chmod.
func (m *LoggingMutator) Chmod(name string, mode os.FileMode) error {
action := fmt.Sprintf("chmod %o %s", mode, name)
err := m.m.Chmod(name, mode)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}
// Mkdir implements Mutator.Mkdir.
func (m *LoggingMutator) Mkdir(name string, perm os.FileMode) error {
action := fmt.Sprintf("mkdir -m %o %s", perm, name)
err := m.m.Mkdir(name, perm)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}
// RemoveAll implements Mutator.RemoveAll.
func (m *LoggingMutator) RemoveAll(name string) error {
action := fmt.Sprintf("rm -rf %s", name)
err := m.m.RemoveAll(name)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}
// Rename implements Mutator.Rename.
func (m *LoggingMutator) Rename(oldpath, newpath string) error {
action := fmt.Sprintf("mv %s %s", oldpath, newpath)
err := m.m.Rename(oldpath, newpath)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}
// Stat implements Mutator.Stat.
func (m *LoggingMutator) Stat(name string) (os.FileInfo, error) {
return m.m.Stat(name)
}
// WriteFile implements Mutator.WriteFile.
func (m *LoggingMutator) WriteFile(name string, data []byte, perm os.FileMode, currData []byte) error {
action := fmt.Sprintf("install -m %o /dev/null %s", perm, name)
err := m.m.WriteFile(name, data, perm, currData)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
unifiedDiff := difflib.UnifiedDiff{
A: difflib.SplitLines(string(currData)),
B: difflib.SplitLines(string(data)),
FromFile: name,
ToFile: name,
Context: 3,
Eol: "\n",
}
if err := difflib.WriteUnifiedDiff(m.w, unifiedDiff); err != nil {
return err
}
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}
// WriteSymlink implements Mutator.WriteSymlink.
func (m *LoggingMutator) WriteSymlink(oldname, newname string) error {
action := fmt.Sprintf("ln -sf %s %s", oldname, newname)
err := m.m.WriteSymlink(oldname, newname)
if err == nil {
_, _ = fmt.Fprintln(m.w, action)
} else {
_, _ = fmt.Fprintf(m.w, "%s: %v\n", action, err)
}
return err
}