@@ -37,13 +37,13 @@ func GenerateForPrintEnv(ctx context.Context, devbox devboxer) error {
37
37
outPath := genPath (devbox )
38
38
39
39
// Preserving shell.nix to avoid breaking old-style .envrc users
40
- err = writeFromTemplate (outPath , plan , "shell.nix" , "shell.nix" )
40
+ _ , err = writeFromTemplate (outPath , plan , "shell.nix" , "shell.nix" )
41
41
if err != nil {
42
42
return errors .WithStack (err )
43
43
}
44
44
45
45
// Gitignore file is added to the .devbox directory
46
- err = writeFromTemplate (filepath .Join (devbox .ProjectDir (), ".devbox" ), plan , ".gitignore" , ".gitignore" )
46
+ _ , err = writeFromTemplate (filepath .Join (devbox .ProjectDir (), ".devbox" ), plan , ".gitignore" , ".gitignore" )
47
47
if err != nil {
48
48
return errors .WithStack (err )
49
49
}
70
70
tmplBuf bytes.Buffer
71
71
)
72
72
73
- func writeFromTemplate (path string , plan any , tmplName , generatedName string ) error {
73
+ func writeFromTemplate (path string , plan any , tmplName , generatedName string ) ( changed bool , err error ) {
74
74
tmplKey := tmplName + ".tmpl"
75
75
tmpl := tmplCache [tmplKey ]
76
76
if tmpl == nil {
@@ -81,64 +81,64 @@ func writeFromTemplate(path string, plan any, tmplName, generatedName string) er
81
81
glob := "tmpl/" + tmplKey
82
82
tmpl , err = tmpl .ParseFS (tmplFS , glob )
83
83
if err != nil {
84
- return redact .Errorf ("parse embedded tmplFS glob %q: %v" , redact .Safe (glob ), redact .Safe (err ))
84
+ return false , redact .Errorf ("parse embedded tmplFS glob %q: %v" , redact .Safe (glob ), redact .Safe (err ))
85
85
}
86
86
tmplCache [tmplKey ] = tmpl
87
87
}
88
88
tmplBuf .Reset ()
89
89
if err := tmpl .Execute (& tmplBuf , plan ); err != nil {
90
- return redact .Errorf ("execute template %s: %v" , redact .Safe (tmplKey ), err )
90
+ return false , redact .Errorf ("execute template %s: %v" , redact .Safe (tmplKey ), err )
91
91
}
92
92
93
93
// In some circumstances, Nix looks at the mod time of a file when
94
94
// caching, so we only want to update the file if something has
95
95
// changed. Blindly overwriting the file could invalidate Nix's cache
96
96
// every time, slowing down evaluation considerably.
97
- err : = overwriteFileIfChanged (filepath .Join (path , generatedName ), tmplBuf .Bytes (), 0o644 )
97
+ changed , err = overwriteFileIfChanged (filepath .Join (path , generatedName ), tmplBuf .Bytes (), 0o644 )
98
98
if err != nil {
99
- return redact .Errorf ("write %s to file: %v" , redact .Safe (tmplName ), err )
99
+ return changed , redact .Errorf ("write %s to file: %v" , redact .Safe (tmplName ), err )
100
100
}
101
- return nil
101
+ return changed , nil
102
102
}
103
103
104
104
// overwriteFileIfChanged checks that the contents of f == data, and overwrites
105
105
// f if they differ. It also ensures that f's permissions are set to perm.
106
- func overwriteFileIfChanged (path string , data []byte , perm os.FileMode ) error {
106
+ func overwriteFileIfChanged (path string , data []byte , perm os.FileMode ) ( changed bool , err error ) {
107
107
flag := os .O_RDWR | os .O_CREATE
108
108
file , err := os .OpenFile (path , flag , perm )
109
109
if errors .Is (err , os .ErrNotExist ) {
110
110
if err := os .MkdirAll (filepath .Dir (path ), 0o700 ); err != nil {
111
- return err
111
+ return false , err
112
112
}
113
113
114
114
// Definitely a new file if we had to make the directory.
115
- return os .WriteFile (path , data , perm )
115
+ return true , os .WriteFile (path , data , perm )
116
116
}
117
117
if err != nil {
118
- return err
118
+ return false , err
119
119
}
120
120
defer file .Close ()
121
121
122
122
fi , err := file .Stat ()
123
123
if err != nil || fi .Mode ().Perm () != perm {
124
124
if err := file .Chmod (perm ); err != nil {
125
- return err
125
+ return false , err
126
126
}
127
127
}
128
128
129
129
// Fast path - check if the lengths differ.
130
130
if err == nil && fi .Size () != int64 (len (data )) {
131
- return overwriteFile (file , data , 0 )
131
+ return true , overwriteFile (file , data , 0 )
132
132
}
133
133
134
134
r := bufio .NewReader (file )
135
135
for offset := range data {
136
136
b , err := r .ReadByte ()
137
137
if err != nil || b != data [offset ] {
138
- return overwriteFile (file , data , offset )
138
+ return true , overwriteFile (file , data , offset )
139
139
}
140
140
}
141
- return nil
141
+ return false , nil
142
142
}
143
143
144
144
// overwriteFile truncates f to len(data) and writes data[offset:] beginning at
@@ -168,5 +168,9 @@ var templateFuncs = template.FuncMap{
168
168
169
169
func makeFlakeFile (d devboxer , plan * flakePlan ) error {
170
170
flakeDir := FlakePath (d )
171
- return writeFromTemplate (flakeDir , plan , "flake.nix" , "flake.nix" )
171
+ changed , err := writeFromTemplate (flakeDir , plan , "flake.nix" , "flake.nix" )
172
+ if changed {
173
+ _ = os .Remove (filepath .Join (flakeDir , "flake.lock" ))
174
+ }
175
+ return err
172
176
}
0 commit comments