Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita92e371

Browse files
committed
stabilize hashes
1 parentacdc8df commita92e371

File tree

2 files changed

+39
-32
lines changed

2 files changed

+39
-32
lines changed

‎provisioner/terraform/modules.go

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"os"
1010
"path/filepath"
1111
"strings"
12+
"time"
1213

1314
"golang.org/x/xerrors"
1415

@@ -94,33 +95,28 @@ func GetModulesArchive(root fs.FS) ([]byte, error) {
9495
continue
9596
}
9697

97-
err:=fs.WalkDir(root,it.Dir,func(filePathstring,info fs.DirEntry,errerror)error {
98+
err:=fs.WalkDir(root,it.Dir,func(filePathstring,d fs.DirEntry,errerror)error {
9899
iferr!=nil {
99100
returnxerrors.Errorf("failed to create modules archive: %w",err)
100101
}
101-
fileType:=info.Type()
102-
if!fileType.IsRegular()&&!fileType.IsDir() {
102+
fileMode:=d.Type()
103+
if!fileMode.IsRegular()&&!fileMode.IsDir() {
103104
returnnil
104105
}
105-
fileInfo,err:=info.Info()
106+
fileInfo,err:=d.Info()
106107
iferr!=nil {
107108
returnxerrors.Errorf("failed to archive module file %q: %w",filePath,err)
108109
}
109-
header,err:=tar.FileInfoHeader(fileInfo,"")
110+
header,err:=fileHeader(filePath,fileMode,fileInfo)
110111
iferr!=nil {
111112
returnxerrors.Errorf("failed to archive module file %q: %w",filePath,err)
112113
}
113-
header.Name=filePath
114-
iffileType.IsDir() {
115-
header.Name+="/"
116-
}
117-
118114
err=w.WriteHeader(header)
119115
iferr!=nil {
120116
returnxerrors.Errorf("failed to add module file %q to archive: %w",filePath,err)
121117
}
122118

123-
if!fileType.IsRegular() {
119+
if!fileMode.IsRegular() {
124120
returnnil
125121
}
126122
empty=false
@@ -140,13 +136,7 @@ func GetModulesArchive(root fs.FS) ([]byte, error) {
140136
}
141137
}
142138

143-
err=w.WriteHeader(&tar.Header{
144-
Name:".terraform/modules/modules.json",
145-
Size:int64(len(modulesFileContent)),
146-
Mode:0o644,
147-
Uid:1000,
148-
Gid:1000,
149-
})
139+
err=w.WriteHeader(defaultFileHeader(".terraform/modules/modules.json",len(modulesFileContent)))
150140
iferr!=nil {
151141
returnnil,xerrors.Errorf("failed to write modules.json to archive: %w",err)
152142
}
@@ -163,3 +153,33 @@ func GetModulesArchive(root fs.FS) ([]byte, error) {
163153
}
164154
returnb.Bytes(),nil
165155
}
156+
157+
funcfileHeader(filePathstring,fileMode fs.FileMode,fileInfo fs.FileInfo) (*tar.Header,error) {
158+
header,err:=tar.FileInfoHeader(fileInfo,"")
159+
iferr!=nil {
160+
returnnil,xerrors.Errorf("failed to archive module file %q: %w",filePath,err)
161+
}
162+
header.Name=filePath
163+
iffileMode.IsDir() {
164+
header.Name+="/"
165+
}
166+
// Erase a bunch of metadata that we don't need so that we get more consistent
167+
// hashes from the resulting archive.
168+
header.AccessTime= time.Time{}
169+
header.ChangeTime= time.Time{}
170+
header.ModTime= time.Time{}
171+
header.Uname=""
172+
header.Gname=""
173+
174+
returnheader,nil
175+
}
176+
177+
funcdefaultFileHeader(filePathstring,lengthint)*tar.Header {
178+
return&tar.Header{
179+
Name:filePath,
180+
Size:int64(length),
181+
Mode:0o644,
182+
Uid:1000,
183+
Gid:1000,
184+
}
185+
}

‎provisioner/terraform/modules_internal_test.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package terraform
22

33
import (
4-
"archive/tar"
54
"bytes"
65
"crypto/sha256"
76
"encoding/hex"
8-
"errors"
9-
"fmt"
10-
"io"
117
"io/fs"
128
"os"
139
"path/filepath"
@@ -58,20 +54,11 @@ func TestGetModulesArchive(t *testing.T) {
5854
_,err=fs.ReadFile(tarfs,".terraform/modules/stuff_that_should_not_be_included/nothing.txt")
5955
require.Error(t,err)
6056

61-
r:=tar.NewReader(bytes.NewBuffer(archive))
62-
for {
63-
h,err:=r.Next()
64-
iferrors.Is(err,io.EOF) {
65-
break
66-
}
67-
fmt.Printf("- %v (%v) [%v:%v] %#v\n",h.Name,h.Size,h.Uid,h.Gid,h)
68-
}
69-
7057
// It should always be byte-identical to optimize storage
7158
hashBytes:=sha256.Sum256(archive)
7259
hash:=hex.EncodeToString(hashBytes[:])
7360
ifruntime.GOOS!="windows" {
74-
require.Equal(t,"b956016b8ddc50a0fe107f5f0e1d6a21e936df828e484be456969329dae0afe0",hash)
61+
require.Equal(t,"8491a8ab368f00a7eb0e927a957a3b0e4bf5df322c5b330d7b92b8b043a3d1d9",hash)
7562
}else {
7663
require.Equal(t,"c219943913051e4637527cd03ae2b7303f6945005a262cdd420f9c2af490d572",hash)
7764
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp