in pkg/release/release.go [359:467]
func WriteChecksums(rootPath string) error {
logrus.Info("Writing artifact hashes to SHA256SUMS/SHA512SUMS files")
createSHASums := func(hasher hash.Hash) (string, error) {
fileName := fmt.Sprintf("SHA%dSUMS", hasher.Size()*8)
files := []string{}
if err := filepath.Walk(rootPath,
func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
sha, err := rhash.ForFile(path, hasher)
if err != nil {
return errors.Wrap(err, "get hash from file")
}
files = append(files, fmt.Sprintf("%s %s", sha, path))
return nil
},
); err != nil {
return "", errors.Wrapf(err, "traversing root path %s", rootPath)
}
file, err := os.Create(fileName)
if err != nil {
return "", errors.Wrapf(err, "create file %s", fileName)
}
if _, err := file.WriteString(strings.Join(files, "\n")); err != nil {
return "", errors.Wrapf(err, "write to file %s", fileName)
}
return file.Name(), nil
}
// Write the release checksum files.
// We checksum everything except our checksum files, which we do next.
sha256SumsFile, err := createSHASums(sha256.New())
if err != nil {
return errors.Wrap(err, "create SHA256 sums")
}
sha512SumsFile, err := createSHASums(sha512.New())
if err != nil {
return errors.Wrap(err, "create SHA512 sums")
}
// After all the checksum files are generated, move them into the bucket
// staging area
moveFile := func(file string) error {
if err := util.CopyFileLocal(
file, filepath.Join(rootPath, file), true,
); err != nil {
return errors.Wrapf(err, "move %s sums file to %s", file, rootPath)
}
if err := os.RemoveAll(file); err != nil {
return errors.Wrapf(err, "remove file %s", file)
}
return nil
}
if err := moveFile(sha256SumsFile); err != nil {
return errors.Wrap(err, "move SHA256 sums")
}
if err := moveFile(sha512SumsFile); err != nil {
return errors.Wrap(err, "move SHA512 sums")
}
logrus.Infof("Hashing files in %s", rootPath)
writeSHAFile := func(fileName string, hasher hash.Hash) error {
sha, err := rhash.ForFile(fileName, hasher)
if err != nil {
return errors.Wrap(err, "get hash from file")
}
shaFileName := fmt.Sprintf("%s.sha%d", fileName, hasher.Size()*8)
return errors.Wrapf(
os.WriteFile(shaFileName, []byte(sha), os.FileMode(0o644)),
"write SHA to file %s", shaFileName,
)
}
if err := filepath.Walk(rootPath,
func(path string, file os.FileInfo, err error) error {
if err != nil {
return err
}
if file.IsDir() {
return nil
}
if err := writeSHAFile(path, sha256.New()); err != nil {
return errors.Wrapf(err, "write %s.sha256", file.Name())
}
if err := writeSHAFile(path, sha512.New()); err != nil {
return errors.Wrapf(err, "write %s.sha512", file.Name())
}
return nil
},
); err != nil {
return errors.Wrapf(err, "traversing root path %s", rootPath)
}
return nil
}