@@ -21,10 +21,12 @@ import (
21
21
22
22
"github.com/fatih/color"
23
23
"github.com/gofrs/flock"
24
+ "github.com/ldez/grignotin/goenv"
24
25
"github.com/spf13/cobra"
25
26
"github.com/spf13/pflag"
26
27
"github.com/spf13/viper"
27
28
"go.uber.org/automaxprocs/maxprocs"
29
+ "golang.org/x/mod/sumdb/dirhash"
28
30
"gopkg.in/yaml.v3"
29
31
30
32
"github.com/golangci/golangci-lint/v2/internal/cache"
@@ -216,7 +218,7 @@ func (c *runCommand) preRunE(_ *cobra.Command, args []string) error {
216
218
217
219
c .contextBuilder = lint .NewContextBuilder (c .cfg , pkgLoader , pkgCache , guard )
218
220
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 {
220
222
return fmt .Errorf ("failed to init hash salt: %w" , err )
221
223
}
222
224
@@ -618,7 +620,7 @@ func formatMemory(memBytes uint64) string {
618
620
619
621
// Related to cache.
620
622
621
- func initHashSalt (version string , cfg * config.Config ) error {
623
+ func initHashSalt (logger logutils. Log , version string , cfg * config.Config ) error {
622
624
binSalt , err := computeBinarySalt (version )
623
625
if err != nil {
624
626
return fmt .Errorf ("failed to calculate binary salt: %w" , err )
@@ -629,9 +631,18 @@ func initHashSalt(version string, cfg *config.Config) error {
629
631
return fmt .Errorf ("failed to calculate config salt: %w" , err )
630
632
}
631
633
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
+
632
640
b := bytes .NewBuffer (binSalt )
633
641
b .Write (configSalt )
642
+ b .WriteString (goModSalt )
643
+
634
644
cache .SetSalt (b )
645
+
635
646
return nil
636
647
}
637
648
@@ -648,15 +659,19 @@ func computeBinarySalt(version string) ([]byte, error) {
648
659
if err != nil {
649
660
return nil , err
650
661
}
662
+
651
663
f , err := os .Open (p )
652
664
if err != nil {
653
665
return nil , err
654
666
}
667
+
655
668
defer f .Close ()
669
+
656
670
h := sha256 .New ()
657
671
if _ , err := io .Copy (h , f ); err != nil {
658
672
return nil , err
659
673
}
674
+
660
675
return h .Sum (nil ), nil
661
676
}
662
677
@@ -678,5 +693,29 @@ func computeConfigSalt(cfg *config.Config) ([]byte, error) {
678
693
if _ , err := h .Write (configData .Bytes ()); err != nil {
679
694
return nil , err
680
695
}
696
+
681
697
return h .Sum (nil ), nil
682
698
}
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