@@ -5,26 +5,24 @@ import (
55 "fmt"
66 "os"
77 "path/filepath"
8+ "strings"
89
910 "github.com/golangci/golangci-lint/pkg/fsutils"
1011 "github.com/golangci/golangci-lint/pkg/logutils"
11- "github.com/spf13/pflag"
1212 "github.com/spf13/viper"
1313)
1414
15- type FlagSetInit func (fs * pflag.FlagSet , cfg * Config )
16-
1715type FileReader struct {
18- log logutils.Log
19- cfg * Config
20- flagSetInit FlagSetInit
16+ log logutils.Log
17+ cfg * Config
18+ commandLineCfg * Config
2119}
2220
23- func NewFileReader (toCfg * Config , log logutils.Log , flagSetInit FlagSetInit ) * FileReader {
21+ func NewFileReader (toCfg , commandLineCfg * Config , log logutils.Log ) * FileReader {
2422 return & FileReader {
25- log : log ,
26- cfg : toCfg ,
27- flagSetInit : flagSetInit ,
23+ log : log ,
24+ cfg : toCfg ,
25+ commandLineCfg : commandLineCfg ,
2826 }
2927}
3028
@@ -33,9 +31,9 @@ func (r *FileReader) Read() error {
3331 // 1. to access "config" option here.
3432 // 2. to give config less priority than command line.
3533
36- configFile , restArgs , err := r .parseConfigOption ()
34+ configFile , err := r .parseConfigOption ()
3735 if err != nil {
38- if err == errConfigDisabled || err == pflag . ErrHelp {
36+ if err == errConfigDisabled {
3937 return nil
4038 }
4139
@@ -45,7 +43,7 @@ func (r *FileReader) Read() error {
4543 if configFile != "" {
4644 viper .SetConfigFile (configFile )
4745 } else {
48- r .setupConfigFileSearch (restArgs )
46+ r .setupConfigFileSearch ()
4947 }
5048
5149 return r .parseConfig ()
@@ -108,7 +106,9 @@ func (r *FileReader) validateConfig() error {
108106 return nil
109107}
110108
111- func (r * FileReader ) setupConfigFileSearch (args []string ) {
109+ func getFirstPathArg () string {
110+ args := os .Args
111+
112112 // skip all args ([golangci-lint, run/linters]) before files/dirs list
113113 for len (args ) != 0 {
114114 if args [0 ] == "run" {
@@ -121,10 +121,18 @@ func (r *FileReader) setupConfigFileSearch(args []string) {
121121
122122 // find first file/dir arg
123123 firstArg := "./..."
124- if len (args ) != 0 {
125- firstArg = args [0 ]
124+ for _ , arg := range args {
125+ if ! strings .HasPrefix (arg , "-" ) {
126+ firstArg = arg
127+ break
128+ }
126129 }
127130
131+ return firstArg
132+ }
133+
134+ func (r * FileReader ) setupConfigFileSearch () {
135+ firstArg := getFirstPathArg ()
128136 absStartPath , err := filepath .Abs (firstArg )
129137 if err != nil {
130138 r .log .Warnf ("Can't make abs path for %q: %s" , firstArg , err )
@@ -159,34 +167,20 @@ func (r *FileReader) setupConfigFileSearch(args []string) {
159167
160168var errConfigDisabled = errors .New ("config is disabled by --no-config" )
161169
162- func (r * FileReader ) parseConfigOption () (string , []string , error ) {
163- // We use another pflag.FlagSet here to not set `changed` flag
164- // on cmd.Flags() options. Otherwise string slice options will be duplicated.
165- fs := pflag .NewFlagSet ("config flag set" , pflag .ContinueOnError )
166-
167- var cfg Config
168- r .flagSetInit (fs , & cfg )
169-
170- fs .Usage = func () {} // otherwise help text will be printed twice
171- if err := fs .Parse (os .Args ); err != nil {
172- if err == pflag .ErrHelp {
173- return "" , nil , err
174- }
175-
176- return "" , nil , fmt .Errorf ("can't parse args: %s" , err )
170+ func (r * FileReader ) parseConfigOption () (string , error ) {
171+ cfg := r .commandLineCfg
172+ if cfg == nil {
173+ return "" , nil
177174 }
178175
179- // for `-v` to work until running of preRun function
180- logutils .SetupVerboseLog (r .log , cfg .Run .IsVerbose )
181-
182176 configFile := cfg .Run .Config
183177 if cfg .Run .NoConfig && configFile != "" {
184- return "" , nil , fmt .Errorf ("can't combine option --config and --no-config" )
178+ return "" , fmt .Errorf ("can't combine option --config and --no-config" )
185179 }
186180
187181 if cfg .Run .NoConfig {
188- return "" , nil , errConfigDisabled
182+ return "" , errConfigDisabled
189183 }
190184
191- return configFile , fs . Args (), nil
185+ return configFile , nil
192186}
0 commit comments