@@ -21,10 +21,12 @@ import (
2121
2222 "github.com/fatih/color"
2323 "github.com/gofrs/flock"
24+ "github.com/ldez/grignotin/goenv"
2425 "github.com/spf13/cobra"
2526 "github.com/spf13/pflag"
2627 "github.com/spf13/viper"
2728 "go.uber.org/automaxprocs/maxprocs"
29+ "golang.org/x/mod/sumdb/dirhash"
2830 "gopkg.in/yaml.v3"
2931
3032 "github.com/golangci/golangci-lint/v2/internal/cache"
@@ -216,7 +218,7 @@ func (c *runCommand) preRunE(_ *cobra.Command, args []string) error {
216218
217219 c .contextBuilder = lint .NewContextBuilder (c .cfg , pkgLoader , pkgCache , guard )
218220
219- if err = initHashSalt (c .buildInfo .Version , c .cfg ); err != nil {
221+ if err = initHashSalt (c .log . Child ( logutils . DebugKeyGoModSalt ), c . buildInfo .Version , c .cfg ); err != nil {
220222 return fmt .Errorf ("failed to init hash salt: %w" , err )
221223 }
222224
@@ -618,7 +620,7 @@ func formatMemory(memBytes uint64) string {
618620
619621// Related to cache.
620622
621- func initHashSalt (version string , cfg * config.Config ) error {
623+ func initHashSalt (logger logutils. Log , version string , cfg * config.Config ) error {
622624 binSalt , err := computeBinarySalt (version )
623625 if err != nil {
624626 return fmt .Errorf ("failed to calculate binary salt: %w" , err )
@@ -629,9 +631,18 @@ func initHashSalt(version string, cfg *config.Config) error {
629631 return fmt .Errorf ("failed to calculate config salt: %w" , err )
630632 }
631633
634+ goModSalt , err := computeGoModSalt ()
635+ if err != nil {
636+ // NOTE: missing go.mod must be ignored.
637+ logger .Warnf ("Failed to calculate go.mod salt: %v" , err )
638+ }
639+
632640 b := bytes .NewBuffer (binSalt )
633641 b .Write (configSalt )
642+ b .WriteString (goModSalt )
643+
634644 cache .SetSalt (b )
645+
635646 return nil
636647}
637648
@@ -648,15 +659,19 @@ func computeBinarySalt(version string) ([]byte, error) {
648659 if err != nil {
649660 return nil , err
650661 }
662+
651663 f , err := os .Open (p )
652664 if err != nil {
653665 return nil , err
654666 }
667+
655668 defer f .Close ()
669+
656670 h := sha256 .New ()
657671 if _ , err := io .Copy (h , f ); err != nil {
658672 return nil , err
659673 }
674+
660675 return h .Sum (nil ), nil
661676}
662677
@@ -678,5 +693,29 @@ func computeConfigSalt(cfg *config.Config) ([]byte, error) {
678693 if _ , err := h .Write (configData .Bytes ()); err != nil {
679694 return nil , err
680695 }
696+
681697 return h .Sum (nil ), nil
682698}
699+
700+ func computeGoModSalt () (string , error ) {
701+ values , err := goenv .Get (context .Background (), goenv .GOMOD )
702+ if err != nil {
703+ return "" , fmt .Errorf ("failed to get goenv: %w" , err )
704+ }
705+
706+ goModPath := filepath .Clean (values [goenv .GOMOD ])
707+
708+ data , err := os .ReadFile (goModPath )
709+ if err != nil {
710+ return "" , fmt .Errorf ("failed to read go.mod: %w" , err )
711+ }
712+
713+ sum , err := dirhash .Hash1 ([]string {goModPath }, func (string ) (io.ReadCloser , error ) {
714+ return io .NopCloser (bytes .NewReader (data )), nil
715+ })
716+ if err != nil {
717+ return "" , fmt .Errorf ("failed to compute go.sum: %w" , err )
718+ }
719+
720+ return sum , nil
721+ }
0 commit comments