@@ -270,10 +270,11 @@ func releaseExists(ghRepo, tag string) bool {
270270}
271271
272272type releaseAsset struct {
273- Name string `json:"name"`
274- OS string `json:"os"`
275- Arch string `json:"arch"`
276- URL string `json:"url"`
273+ Name string `json:"name"`
274+ OS string `json:"os"`
275+ Arch string `json:"arch"`
276+ URL string `json:"url"`
277+ SHA256 string `json:"sha256,omitempty"`
277278}
278279
279280// releaseDownloads returns the platform release-asset list for a tag, in the
@@ -294,17 +295,49 @@ func releaseDownloads(ghRepo, tag string) ([]releaseAsset, error) {
294295 if err := json .Unmarshal (out , & resp ); err != nil {
295296 return nil , err
296297 }
298+ checksums , _ := releaseChecksums (ghRepo , tag )
297299 var assets []releaseAsset
298300 for _ , a := range resp .Assets {
299301 goos , goarch , ok := releaseAssetPlatform (a .Name )
300302 if ! ok {
301303 continue
302304 }
303- assets = append (assets , releaseAsset {Name : a .Name , OS : goos , Arch : goarch , URL : a .URL })
305+ assets = append (assets , releaseAsset {
306+ Name : a .Name ,
307+ OS : goos ,
308+ Arch : goarch ,
309+ URL : a .URL ,
310+ SHA256 : checksums [a .Name ],
311+ })
304312 }
305313 return assets , nil
306314}
307315
316+ func releaseChecksums (ghRepo , tag string ) (map [string ]string , error ) {
317+ cmd := exec .Command ("gh" , "release" , "download" , tag , "--repo" , ghRepo , "--pattern" , "checksums.txt" , "--output" , "-" ) // #nosec G204 -- ghRepo+tag from trusted manifest
318+ out , err := cmd .Output ()
319+ if err != nil {
320+ return nil , err
321+ }
322+ return parseReleaseChecksums (string (out )), nil
323+ }
324+
325+ func parseReleaseChecksums (text string ) map [string ]string {
326+ checksums := make (map [string ]string )
327+ for _ , line := range strings .Split (text , "\n " ) {
328+ fields := strings .Fields (line )
329+ if len (fields ) < 2 {
330+ continue
331+ }
332+ sha , err := NormalizeSHA256Hex (fields [0 ])
333+ if err != nil {
334+ continue
335+ }
336+ checksums [filepath .Base (fields [len (fields )- 1 ])] = sha
337+ }
338+ return checksums
339+ }
340+
308341func releaseAssetPlatform (assetName string ) (string , string , bool ) {
309342 nameNoExt := strings .TrimSuffix (assetName , ".tar.gz" )
310343 nameNoExt = strings .TrimSuffix (nameNoExt , ".tgz" )
@@ -511,18 +544,22 @@ func versionGT(newVer, oldVer string) bool {
511544}
512545
513546func applyFix (manifestPath string , raw map [string ]any , ghRepo , targetTag , targetVersion string ) error {
514- downloads , _ := releaseDownloads (ghRepo , targetTag )
547+ downloads , _ := registrySyncReleaseDownloads (ghRepo , targetTag )
515548 if len (downloads ) == 0 {
516549 raw ["version" ] = targetVersion
517550 } else {
518551 raw ["version" ] = targetVersion
519552 dlAny := make ([]any , 0 , len (downloads ))
520553 for _ , dl := range downloads {
521- dlAny = append ( dlAny , map [string ]any {
554+ entry := map [string ]any {
522555 "os" : dl .OS ,
523556 "arch" : dl .Arch ,
524557 "url" : dl .URL ,
525- })
558+ }
559+ if dl .SHA256 != "" {
560+ entry ["sha256" ] = dl .SHA256
561+ }
562+ dlAny = append (dlAny , entry )
526563 }
527564 raw ["downloads" ] = dlAny
528565 }
0 commit comments