Skip to content

Commit 7450439

Browse files
committed
refactor(lib): simplify verifyChecksum control flow with early returns
- Extract calculateFileChecksum helper for SHA256 file hashing - Extract fetchReleaseDetails helper for GitHub API calls - Extract verifyDigest helper for checksum comparison logic - Flatten nested conditionals using early return pattern - Improve error messages with consistent formatting
1 parent adda3e4 commit 7450439

1 file changed

Lines changed: 44 additions & 29 deletions

File tree

lib/fetch.go

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -206,61 +206,51 @@ type GitHubReleaseDetail struct {
206206
Assets []GitHubAsset `json:"assets"`
207207
}
208208

209-
func verifyChecksum(file, release, tarballName string) error {
210-
// Calculate file checksum
211-
f, err := os.Open(file)
209+
// calculateFileChecksum computes the SHA256 checksum of a file.
210+
func calculateFileChecksum(path string) (string, error) {
211+
f, err := os.Open(path)
212212
if err != nil {
213-
return err
213+
return "", err
214214
}
215215
defer f.Close()
216216

217217
h := sha256.New()
218218
if _, err := io.Copy(h, f); err != nil {
219-
return err
219+
return "", err
220220
}
221-
actualChecksum := hex.EncodeToString(h.Sum(nil))
221+
return hex.EncodeToString(h.Sum(nil)), nil
222+
}
222223

223-
// Fetch the release details to get the digest
224+
// fetchReleaseDetails retrieves asset metadata from GitHub API for a release.
225+
func fetchReleaseDetails(release string) (*GitHubReleaseDetail, error) {
224226
apiURL := fmt.Sprintf("https://api.github.com/repos/linuxmatters/ffmpeg-statigo/releases/tags/%s", release)
225227

226228
req, err := http.NewRequest("GET", apiURL, nil)
227229
if err != nil {
228-
return err
230+
return nil, err
229231
}
230232
req.Header.Set("User-Agent", "ffmpeg-statigo")
231233

232234
resp, err := http.DefaultClient.Do(req)
233235
if err != nil {
234-
return err
236+
return nil, err
235237
}
236238
defer resp.Body.Close()
237239

238240
if resp.StatusCode != 200 {
239-
// If we can't verify, warn but don't fail (might be rate limited)
240241
fmt.Fprintf(os.Stderr, "WARNING: Could not fetch release details for checksum verification (status %d)\n", resp.StatusCode)
241-
return nil
242-
}
243-
244-
var releaseDetail GitHubReleaseDetail
245-
if err := json.NewDecoder(resp.Body).Decode(&releaseDetail); err != nil {
246-
return err
247-
}
248-
249-
// Find our tarball asset and get its digest
250-
var assetDigest string
251-
for _, asset := range releaseDetail.Assets {
252-
if asset.Name == tarballName {
253-
assetDigest = asset.Digest
254-
break
255-
}
242+
return nil, nil // Warn but don't fail (might be rate limited)
256243
}
257244

258-
if assetDigest == "" {
259-
// Fallback to SHA256SUMS file if digest not available (older releases)
260-
return verifyChecksumFromFile(releaseDetail.Assets, actualChecksum, tarballName)
245+
var detail GitHubReleaseDetail
246+
if err := json.NewDecoder(resp.Body).Decode(&detail); err != nil {
247+
return nil, err
261248
}
249+
return &detail, nil
250+
}
262251

263-
// GitHub provides digests in "sha256:..." format
252+
// verifyDigest validates a checksum against a GitHub asset digest (sha256:... format).
253+
func verifyDigest(actualChecksum, assetDigest string) error {
264254
if !strings.HasPrefix(assetDigest, "sha256:") {
265255
return fmt.Errorf("unexpected digest format: %s", assetDigest)
266256
}
@@ -274,6 +264,31 @@ func verifyChecksum(file, release, tarballName string) error {
274264
return nil
275265
}
276266

267+
func verifyChecksum(file, release, tarballName string) error {
268+
actualChecksum, err := calculateFileChecksum(file)
269+
if err != nil {
270+
return err
271+
}
272+
273+
releaseDetail, err := fetchReleaseDetails(release)
274+
if err != nil {
275+
return err
276+
}
277+
if releaseDetail == nil {
278+
return nil // API unavailable, warning already printed
279+
}
280+
281+
// Find our tarball asset's digest
282+
for _, asset := range releaseDetail.Assets {
283+
if asset.Name == tarballName && asset.Digest != "" {
284+
return verifyDigest(actualChecksum, asset.Digest)
285+
}
286+
}
287+
288+
// Fallback to SHA256SUMS file for older releases without digest metadata
289+
return verifyChecksumFromFile(releaseDetail.Assets, actualChecksum, tarballName)
290+
}
291+
277292
func verifyChecksumFromFile(assets []GitHubAsset, actualChecksum, tarballName string) error {
278293
// Find and download SHA256SUMS file (fallback for older releases)
279294
var sha256sumsURL string

0 commit comments

Comments
 (0)