Skip to content

Commit

Permalink
fix: sort checksum lines by filename
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabriel F Cipriano authored and caarlos0 committed Oct 30, 2023
1 parent 1a5d3ff commit cf008d3
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 1 deletion.
12 changes: 11 additions & 1 deletion internal/pipe/checksums/checksums.go
Expand Up @@ -136,7 +136,7 @@ func refresh(ctx *context.Context, filepath string) error {
defer file.Close()

// sort to ensure the signature is deterministic downstream
sort.Strings(sumLines)
sort.Sort(ByFilename(sumLines))
_, err = file.WriteString(strings.Join(sumLines, ""))
return err
}
Expand All @@ -155,3 +155,13 @@ func checksums(algorithm string, a *artifact.Artifact) (string, error) {

return fmt.Sprintf("%v %v\n", sha, a.Name), nil
}

// ByFilename implements sort.Interface for []string based on
// the filename of a checksum line ("{checksum} {filename}\n")
type ByFilename []string

func (s ByFilename) Len() int { return len(s) }
func (s ByFilename) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ByFilename) Less(i, j int) bool {
return strings.Split(s[i], " ")[1] < strings.Split(s[j], " ")[1]
}
49 changes: 49 additions & 0 deletions internal/pipe/checksums/checksums_test.go
Expand Up @@ -246,6 +246,55 @@ func TestDefaultSet(t *testing.T) {
require.Equal(t, "checksums.txt", ctx.Config.Checksum.NameTemplate)
}

func TestPipeChecksumsSortByFilename(t *testing.T) {
const binary = "binary"
const checksums = "checksums.txt"
const filePaths = "./testdata/order/*.txt"

folder := t.TempDir()
file := filepath.Join(folder, binary)
require.NoError(t, os.WriteFile(file, []byte("some string"), 0o644))

ctx := testctx.NewWithCfg(
config.Project{
Dist: folder,
ProjectName: binary,
Checksum: config.Checksum{
Algorithm: "sha256",
NameTemplate: "checksums.txt",
ExtraFiles: []config.ExtraFile{
{Glob: filePaths},
},
},
},
)

ctx.Artifacts.Add(&artifact.Artifact{
Name: binary,
Path: file,
Type: artifact.UploadableBinary,
})

require.NoError(t, Pipe{}.Run(ctx))

bts, err := os.ReadFile(filepath.Join(folder, checksums))
require.NoError(t, err)

lines := strings.Split(string(bts), "\n")

wantLinesOrder := []string{
"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb a.txt",
"3b64db95cb55c763391c707108489ae18b4112d783300de38e033b4c98c3deaf b.txt",
"61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc binary",
"64daa44ad493ff28a96effab6e77f1732a3d97d83241581b37dbd70a7a4900fe c.txt",
"5bf8aa57fc5a6bc547decf1cc6db63f10deb55a3c6c5df497d631fb3d95e1abf d.txt",
}

for i, want := range wantLinesOrder {
require.Equal(t, want, lines[i])
}
}

func TestPipeCheckSumsWithExtraFiles(t *testing.T) {
const binary = "binary"
const checksums = "checksums.txt"
Expand Down
1 change: 1 addition & 0 deletions internal/pipe/checksums/testdata/order/a.txt
@@ -0,0 +1 @@
a
1 change: 1 addition & 0 deletions internal/pipe/checksums/testdata/order/b.txt
@@ -0,0 +1 @@
bb
1 change: 1 addition & 0 deletions internal/pipe/checksums/testdata/order/c.txt
@@ -0,0 +1 @@
ccc
1 change: 1 addition & 0 deletions internal/pipe/checksums/testdata/order/d.txt
@@ -0,0 +1 @@
dddd

0 comments on commit cf008d3

Please sign in to comment.