Skip to content

Commit 775cc83

Browse files
authored
Merge pull request #41 from kluctl/fix-modtimes
feat: Allow to call BuildAndWriteFilesList on non-copied embedded dirs
2 parents eca23a9 + bfa52d5 commit 775cc83

File tree

3 files changed

+41
-29
lines changed

3 files changed

+41
-29
lines changed

embed_util/embedded_files.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"io/fs"
1010
"os"
1111
"path/filepath"
12-
"time"
1312
)
1413

1514
type EmbeddedFiles struct {
@@ -129,7 +128,7 @@ func (e *EmbeddedFiles) copyEmbeddedFilesToTmp(embedFs fs.FS, fl *fileList) erro
129128
if resolvedFle.Mode.Type() == existingSt.Mode().Type() {
130129
if resolvedFle.Mode.IsDir() {
131130
continue
132-
} else if existingSt.Size() == resolvedFle.Size && existingSt.ModTime().Unix() == resolvedFle.ModTime {
131+
} else if existingSt.Size() == resolvedFle.Size {
133132
// unchanged
134133
continue
135134
}
@@ -177,12 +176,6 @@ func (e *EmbeddedFiles) copyEmbeddedFilesToTmp(embedFs fs.FS, fl *fileList) erro
177176
if err != nil {
178177
return err
179178
}
180-
if !resolvedFle.Mode.IsDir() {
181-
err = os.Chtimes(path, time.Time{}, time.Unix(resolvedFle.ModTime, 0))
182-
if err != nil {
183-
return err
184-
}
185-
}
186179
}
187180

188181
return nil

embed_util/file_list.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ type fileList struct {
2020
type fileListEntry struct {
2121
Name string `json:"name"`
2222
Size int64 `json:"size"`
23-
ModTime int64 `json:"modTime"`
2423
Mode fs.FileMode `json:"perm"`
2524
Symlink string `json:"symlink,omitempty"`
2625
Compressed bool `json:"compressed,omitempty"`
@@ -44,15 +43,14 @@ func buildFileListFromDir(dir string) (*fileList, error) {
4443
return err
4544
}
4645

47-
if relPath == "." {
46+
if relPath == "." || relPath == "files.json" {
4847
return nil
4948
}
5049

5150
fle := fileListEntry{
52-
Name: relPath,
53-
Size: info.Size(),
54-
ModTime: info.ModTime().Unix(),
55-
Mode: info.Mode(),
51+
Name: relPath,
52+
Size: info.Size(),
53+
Mode: info.Mode(),
5654
}
5755

5856
if info.Mode().Type() == fs.ModeSymlink {
@@ -84,7 +82,7 @@ func buildFileListFromFs(embedFs fs.FS) (*fileList, error) {
8482
var fl fileList
8583

8684
err := fs.WalkDir(embedFs, ".", func(path string, d fs.DirEntry, err error) error {
87-
if path == "." {
85+
if path == "." || path == "files.json" {
8886
return nil
8987
}
9088

@@ -94,17 +92,15 @@ func buildFileListFromFs(embedFs fs.FS) (*fileList, error) {
9492
}
9593

9694
fle := fileListEntry{
97-
Name: path,
98-
Size: info.Size(),
99-
ModTime: info.ModTime().Unix(),
100-
Mode: info.Mode() | 0o600,
95+
Name: path,
96+
Size: info.Size(),
97+
Mode: info.Mode() | 0o600,
10198
}
10299

103100
if info.Mode().Type() == fs.ModeSymlink {
104101
return fmt.Errorf("symlink not supported in buildFileListFromFs")
105102
} else if info.Mode().IsDir() {
106103
fle.Size = 0
107-
fle.ModTime = 0
108104
}
109105

110106
fl.Files = append(fl.Files, fle)

embed_util/packer.go

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,33 @@ func CopyForEmbed(out string, dir string) error {
2727
return err
2828
}
2929

30+
return doWriteFilesList(out, fl)
31+
}
32+
33+
func BuildAndWriteFilesList(dir string) error {
34+
fl, err := buildFileListFromDir(dir)
35+
if err != nil {
36+
return err
37+
}
38+
return doWriteFilesList(dir, fl)
39+
}
40+
41+
func doWriteFilesList(dir string, fl *fileList) error {
42+
var err error
43+
fl.ContentHash, err = calcContentHash(dir, fl)
44+
if err != nil {
45+
return err
46+
}
3047
b, err := json.MarshalIndent(fl, "", " ")
3148
if err != nil {
3249
return err
3350
}
3451

35-
err = os.WriteFile(filepath.Join(out, "files.json"), b, 0o644)
36-
return err
52+
err = os.WriteFile(filepath.Join(dir, "files.json"), b, 0o644)
53+
if err != nil {
54+
return err
55+
}
56+
return nil
3757
}
3858

3959
func WriteEmbedGoFile(targetDir string, goOs string, goArch string) error {
@@ -128,43 +148,46 @@ func copyFiles(out string, dir string, fl *fileList) error {
128148
return err
129149
}
130150

151+
return nil
152+
}
153+
154+
func calcContentHash(dir string, fl *fileList) (string, error) {
131155
hash := sha256.New()
132156
for _, fle := range fl.Files {
133157
path := filepath.Join(dir, fle.Name)
134158
st, err := os.Lstat(path)
135159
if err != nil {
136-
return err
160+
return "", err
137161
}
138162
if st.Mode().Type() == os.ModeSymlink {
139163
sl, err := os.Readlink(path)
140164
if err != nil {
141-
return err
165+
return "", err
142166
}
143167
_ = binary.Write(hash, binary.LittleEndian, "symlink")
144168
_ = binary.Write(hash, binary.LittleEndian, sl)
145169
} else if st.Mode().IsDir() {
146170
err = os.MkdirAll(path, fle.Mode.Perm())
147171
if err != nil {
148-
return err
172+
return "", err
149173
}
150174
_ = binary.Write(hash, binary.LittleEndian, "dir")
151175
_ = binary.Write(hash, binary.LittleEndian, fle.Name)
152176
} else if st.Mode().IsRegular() {
153-
outPath := filepath.Join(out, fle.Name)
177+
outPath := filepath.Join(dir, fle.Name)
154178
if fle.Compressed {
155179
outPath += ".gz"
156180
}
157181

158182
data, err := os.ReadFile(outPath)
159183
if err != nil {
160-
return err
184+
return "", err
161185
}
162186

163187
_ = binary.Write(hash, binary.LittleEndian, "regular")
164188
_ = binary.Write(hash, binary.LittleEndian, fle.Name)
165189
_ = binary.Write(hash, binary.LittleEndian, data)
166190
}
167191
}
168-
fl.ContentHash = hex.EncodeToString(hash.Sum(nil))
169-
return nil
192+
return hex.EncodeToString(hash.Sum(nil)), nil
170193
}

0 commit comments

Comments
 (0)