Skip to content

Commit a5fed71

Browse files
committed
Refine config path handling and reuse shared helpers
1 parent f96e20f commit a5fed71

File tree

8 files changed

+102
-169
lines changed

8 files changed

+102
-169
lines changed

cmd/build_results.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,6 @@ func BuildResultsWithDocCheckSkip(
3939
httpClientConfig utils.HTTPClientConfig,
4040
ignoredItems model.IgnoredItems) (*model.RuleResultSet, *motor.RuleSetExecutionResult, error) {
4141

42-
resolvedHTTPConfig := httpClientConfig
43-
var err error
44-
if resolvedHTTPConfig.CertFile, err = ResolveConfigPath(httpClientConfig.CertFile); err != nil {
45-
return nil, nil, fmt.Errorf("failed to resolve cert file path: %w", err)
46-
}
47-
48-
if resolvedHTTPConfig.KeyFile, err = ResolveConfigPath(httpClientConfig.KeyFile); err != nil {
49-
return nil, nil, fmt.Errorf("failed to resolve key file path: %w", err)
50-
}
51-
52-
if resolvedHTTPConfig.CAFile, err = ResolveConfigPath(httpClientConfig.CAFile); err != nil {
53-
return nil, nil, fmt.Errorf("failed to resolve CA file path: %w", err)
54-
}
55-
56-
httpClientConfig = resolvedHTTPConfig
57-
5842
// read spec and parse
5943
defaultRuleSets := rulesets.BuildDefaultRuleSets()
6044

cmd/dashboard.go

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"fmt"
99
"log/slog"
1010
"net/http"
11-
"os"
1211
"time"
1312

1413
"github.com/charmbracelet/lipgloss/v2"
@@ -123,38 +122,18 @@ func GetDashboardCommand() *cobra.Command {
123122
}
124123
}
125124

126-
if rulesetFlag != "" {
127-
resolvedRulesetPath, resolveErr := ResolveConfigPath(rulesetFlag)
128-
if resolveErr != nil {
129-
if !silent {
130-
message := fmt.Sprintf("Unable to resolve ruleset path '%s': %s", rulesetFlag, resolveErr.Error())
131-
style := createResultBoxStyle(color.RGBRed, color.RGBDarkRed)
132-
messageStyle := lipgloss.NewStyle().Padding(1, 1)
133-
fmt.Println(style.Render(messageStyle.Render(message)))
134-
}
135-
return resolveErr
136-
}
137-
138-
httpCertPath, certErr := ResolveConfigPath(certFile)
139-
if certErr != nil {
140-
return fmt.Errorf("failed to resolve cert file path: %w", certErr)
141-
}
142-
httpKeyPath, keyErr := ResolveConfigPath(keyFile)
143-
if keyErr != nil {
144-
return fmt.Errorf("failed to resolve key file path: %w", keyErr)
145-
}
146-
httpCAPath, caErr := ResolveConfigPath(caFile)
147-
if caErr != nil {
148-
return fmt.Errorf("failed to resolve CA file path: %w", caErr)
149-
}
150-
151-
httpConfig := utils.HTTPClientConfig{
152-
CertFile: httpCertPath,
153-
KeyFile: httpKeyPath,
154-
CAFile: httpCAPath,
155-
Insecure: insecure,
156-
}
125+
tempLintFlags := &LintFlags{
126+
CertFile: certFile,
127+
KeyFile: keyFile,
128+
CAFile: caFile,
129+
Insecure: insecure,
130+
}
131+
httpConfig, err := GetHTTPClientConfig(tempLintFlags)
132+
if err != nil {
133+
return fmt.Errorf("failed to resolve TLS configuration: %w", err)
134+
}
157135

136+
if rulesetFlag != "" {
158137
var httpClient *http.Client
159138
if utils.ShouldUseCustomHTTPClient(httpConfig) {
160139
var clientErr error
@@ -165,10 +144,10 @@ func GetDashboardCommand() *cobra.Command {
165144
}
166145

167146
var rsErr error
168-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(resolvedRulesetPath, defaultRuleSets, remoteFlag, httpClient)
147+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag, httpClient)
169148
if rsErr != nil {
170149
if !silent {
171-
message := fmt.Sprintf("Unable to load ruleset '%s': %s", resolvedRulesetPath, rsErr.Error())
150+
message := fmt.Sprintf("Unable to load ruleset '%s': %s", rulesetFlag, rsErr.Error())
172151
style := createResultBoxStyle(color.RGBRed, color.RGBDarkRed)
173152
messageStyle := lipgloss.NewStyle().Padding(1, 1)
174153
fmt.Println(style.Render(messageStyle.Render(message)))

cmd/html_report.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,19 @@ func GetHTMLReportCommand() *cobra.Command {
119119
return fmt.Errorf("failed to resolve base path: %w", baseErr)
120120
}
121121

122+
httpFlags := &LintFlags{
123+
CertFile: certFile,
124+
KeyFile: keyFile,
125+
CAFile: caFile,
126+
Insecure: insecure,
127+
}
128+
httpClientConfig, cfgErr := GetHTTPClientConfig(httpFlags)
129+
if cfgErr != nil {
130+
return fmt.Errorf("failed to resolve TLS configuration: %w", cfgErr)
131+
}
132+
122133
resultSet, ruleset, err = BuildResultsWithDocCheckSkip(false, hardModeFlag, rulesetFlag, specBytes, customFunctions,
123-
resolvedBase, remoteFlag, skipCheckFlag, time.Duration(timeoutFlag)*time.Second, utils.HTTPClientConfig{
124-
CertFile: certFile,
125-
KeyFile: keyFile,
126-
CAFile: caFile,
127-
Insecure: insecure,
128-
}, ignoredItems)
134+
resolvedBase, remoteFlag, skipCheckFlag, time.Duration(timeoutFlag)*time.Second, httpClientConfig, ignoredItems)
129135
if err != nil {
130136
tui.RenderError(err)
131137
return err

cmd/language_server.go

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111

1212
languageserver "github.com/daveshanley/vacuum/language-server"
1313
"github.com/daveshanley/vacuum/logging"
14-
"github.com/daveshanley/vacuum/model"
1514
"github.com/daveshanley/vacuum/rulesets"
1615
"github.com/daveshanley/vacuum/utils"
1716
"github.com/spf13/cobra"
@@ -62,35 +61,28 @@ IDE and start linting your OpenAPI documents in real-time.`,
6261
}
6362
}
6463

65-
if rulesetFlag != "" {
66-
remoteFlag, _ := cmd.Flags().GetBool("remote")
64+
var httpClientConfig utils.HTTPClientConfig
65+
certFile, _ := cmd.Flags().GetString("cert-file")
66+
keyFile, _ := cmd.Flags().GetString("key-file")
67+
caFile, _ := cmd.Flags().GetString("ca-file")
68+
insecure, _ := cmd.Flags().GetBool("insecure")
69+
70+
lintFlags := &LintFlags{
71+
CertFile: certFile,
72+
KeyFile: keyFile,
73+
CAFile: caFile,
74+
Insecure: insecure,
75+
}
6776

68-
// Certificate/TLS configuration for language server
69-
certFile, _ := cmd.Flags().GetString("cert-file")
70-
keyFile, _ := cmd.Flags().GetString("key-file")
71-
caFile, _ := cmd.Flags().GetString("ca-file")
72-
insecure, _ := cmd.Flags().GetBool("insecure")
77+
httpConfig, cfgErr := GetHTTPClientConfig(lintFlags)
78+
if cfgErr != nil {
79+
return fmt.Errorf("failed to resolve TLS configuration: %w", cfgErr)
80+
}
81+
httpClientConfig = httpConfig
7382

83+
if rulesetFlag != "" {
7484
// Create HTTP client for remote ruleset downloads if needed
7585
var httpClient *http.Client
76-
resolvedCertFile, err := ResolveConfigPath(certFile)
77-
if err != nil {
78-
return fmt.Errorf("failed to resolve cert file path: %w", err)
79-
}
80-
resolvedKeyFile, err := ResolveConfigPath(keyFile)
81-
if err != nil {
82-
return fmt.Errorf("failed to resolve key file path: %w", err)
83-
}
84-
resolvedCAFile, err := ResolveConfigPath(caFile)
85-
if err != nil {
86-
return fmt.Errorf("failed to resolve CA file path: %w", err)
87-
}
88-
httpClientConfig := utils.HTTPClientConfig{
89-
CertFile: resolvedCertFile,
90-
KeyFile: resolvedKeyFile,
91-
CAFile: resolvedCAFile,
92-
Insecure: insecure,
93-
}
9486
if utils.ShouldUseCustomHTTPClient(httpClientConfig) {
9587
var clientErr error
9688
httpClient, clientErr = utils.CreateCustomHTTPClient(httpClientConfig)
@@ -99,13 +91,8 @@ IDE and start linting your OpenAPI documents in real-time.`,
9991
}
10092
}
10193

102-
resolvedRulesetPath, resolveErr := ResolveConfigPath(rulesetFlag)
103-
if resolveErr != nil {
104-
return resolveErr
105-
}
106-
10794
var rsErr error
108-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(resolvedRulesetPath, defaultRuleSets, remoteFlag, httpClient)
95+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag, httpClient)
10996
if rsErr != nil {
11097
return rsErr
11198
}
@@ -129,6 +116,7 @@ IDE and start linting your OpenAPI documents in real-time.`,
129116
Logger: logger,
130117
ExtensionRefs: extensionRefsFlag,
131118
IgnoredResults: ignoredItems,
119+
HTTPClientConfig: httpClientConfig,
132120
}
133121

134122
return languageserver.NewServer(GetVersion(), &lfr).Run()

cmd/lint_shared.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ func LoadIgnoreFile(ignoreFile string, silent, pipeline, noStyle bool) (model.Ig
192192
return ignoredItems, nil
193193
}
194194

195+
originalPath := ignoreFile
195196
resolvedPath, err := ResolveConfigPath(ignoreFile)
196197
if err != nil {
197198
if !silent {
@@ -203,11 +204,23 @@ func LoadIgnoreFile(ignoreFile string, silent, pipeline, noStyle bool) (model.Ig
203204

204205
raw, err := os.ReadFile(resolvedPath)
205206
if err != nil {
206-
if !silent {
207-
fmt.Printf("%sError: Failed to read ignore file '%s': %v%s\n\n",
208-
color.ASCIIRed, resolvedPath, err, color.ASCIIReset)
207+
if !os.IsNotExist(err) || originalPath == resolvedPath {
208+
if !silent {
209+
fmt.Printf("%sError: Failed to read ignore file '%s': %v%s\n\n",
210+
color.ASCIIRed, resolvedPath, err, color.ASCIIReset)
211+
}
212+
return ignoredItems, fmt.Errorf("failed to read ignore file: %w", err)
213+
}
214+
// fallback to original path if resolution-based path not found
215+
raw, err = os.ReadFile(originalPath)
216+
if err != nil {
217+
if !silent {
218+
fmt.Printf("%sError: Failed to read ignore file '%s': %v%s\n\n",
219+
color.ASCIIRed, originalPath, err, color.ASCIIReset)
220+
}
221+
return ignoredItems, fmt.Errorf("failed to read ignore file: %w", err)
209222
}
210-
return ignoredItems, fmt.Errorf("failed to read ignore file: %w", err)
223+
resolvedPath = originalPath
211224
}
212225

213226
err = yaml.Unmarshal(raw, &ignoredItems)
@@ -266,35 +279,28 @@ func LoadRulesetWithConfig(flags *LintFlags, logger *slog.Logger) (*rulesets.Rul
266279
}
267280

268281
if flags.RulesetFlag != "" {
269-
resolvedRulesetPath, err := ResolveConfigPath(flags.RulesetFlag)
270-
if err != nil {
271-
fmt.Printf("\033[31mUnable to resolve ruleset path '%s': %s\033[0m\n",
272-
flags.RulesetFlag, err.Error())
273-
return nil, err
274-
}
275-
276282
httpClient, err := CreateHTTPClientFromFlags(flags)
277283
if err != nil {
278284
return nil, err
279285
}
280286

281287
var rsErr error
282288
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(
283-
resolvedRulesetPath, defaultRuleSets, flags.RemoteFlag, httpClient)
289+
flags.RulesetFlag, defaultRuleSets, flags.RemoteFlag, httpClient)
284290
if rsErr != nil {
285291
fmt.Printf("\033[31mUnable to load ruleset '%s': %s\033[0m\n",
286-
resolvedRulesetPath, rsErr.Error())
292+
flags.RulesetFlag, rsErr.Error())
287293
return nil, rsErr
288294
}
289295

290296
if !flags.SilentFlag && !flags.PipelineOutput {
291297
if flags.NoStyleFlag {
292298
fmt.Printf(" using ruleset '%s' (containing %d rules)\n",
293-
resolvedRulesetPath, len(selectedRS.Rules))
299+
flags.RulesetFlag, len(selectedRS.Rules))
294300
} else {
295301
fmt.Printf(" %susing ruleset %s'%s'%s %s(containing %s%d%s rules)%s\n",
296302
color.ASCIIGrey,
297-
color.ASCIIBold+color.ASCIIItalic, resolvedRulesetPath, color.ASCIIReset+color.ASCIIGrey,
303+
color.ASCIIBold+color.ASCIIItalic, flags.RulesetFlag, color.ASCIIReset+color.ASCIIGrey,
298304
color.ASCIIGrey,
299305
color.ASCIIBold+color.ASCIIItalic, len(selectedRS.Rules), color.ASCIIReset+color.ASCIIGrey,
300306
color.ASCIIReset)

cmd/root.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ func GetRootCommand() *cobra.Command {
143143
}
144144

145145
func useConfigFile(cmd *cobra.Command) error {
146+
configDirectory = ""
146147
useEnvironmentConfiguration()
147148
var err error
148149
if len(configFile) != 0 {
@@ -250,7 +251,11 @@ func expandUserPath(pathValue string) (string, error) {
250251
// setConfigDirectoryFromViper captures the directory of the currently loaded configuration file, if any.
251252
func setConfigDirectoryFromViper() {
252253
if used := viper.ConfigFileUsed(); used != "" {
253-
configDirectory = filepath.Dir(used)
254+
if absPath, err := filepath.Abs(used); err == nil {
255+
configDirectory = filepath.Dir(absPath)
256+
} else {
257+
configDirectory = filepath.Dir(used)
258+
}
254259
}
255260
}
256261

@@ -276,14 +281,14 @@ func ResolveConfigPath(raw string) (string, error) {
276281
return filepath.Clean(expanded), nil
277282
}
278283

279-
baseDir := configDirectory
280-
if baseDir == "" {
281-
cwd, err := os.Getwd()
282-
if err != nil {
283-
return "", fmt.Errorf("unable to resolve working directory: %w", err)
284-
}
285-
baseDir = cwd
284+
if configDirectory != "" && !strings.HasPrefix(expanded, ".") {
285+
return filepath.Clean(filepath.Join(configDirectory, expanded)), nil
286+
}
287+
288+
cwd, err := os.Getwd()
289+
if err != nil {
290+
return "", fmt.Errorf("unable to resolve working directory: %w", err)
286291
}
287292

288-
return filepath.Clean(filepath.Join(baseDir, expanded)), nil
293+
return filepath.Clean(filepath.Join(cwd, expanded)), nil
289294
}

cmd/spectral_report.go

Lines changed: 11 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,16 @@ func GetSpectralReportCommand() *cobra.Command {
8484
caFile, _ := cmd.Flags().GetString("ca-file")
8585
insecure, _ := cmd.Flags().GetBool("insecure")
8686

87-
resolvedCertFile, err := ResolveConfigPath(certFile)
88-
if err != nil {
89-
return fmt.Errorf("failed to resolve cert file path: %w", err)
90-
}
91-
92-
resolvedKeyFile, err := ResolveConfigPath(keyFile)
93-
if err != nil {
94-
return fmt.Errorf("failed to resolve key file path: %w", err)
95-
}
96-
97-
resolvedCAFile, err := ResolveConfigPath(caFile)
98-
if err != nil {
99-
return fmt.Errorf("failed to resolve CA file path: %w", err)
87+
lintFlags := &LintFlags{
88+
CertFile: certFile,
89+
KeyFile: keyFile,
90+
CAFile: caFile,
91+
Insecure: insecure,
10092
}
10193

102-
httpClientConfig := utils.HTTPClientConfig{
103-
CertFile: resolvedCertFile,
104-
KeyFile: resolvedKeyFile,
105-
CAFile: resolvedCAFile,
106-
Insecure: insecure,
94+
httpClientConfig, cfgErr := GetHTTPClientConfig(lintFlags)
95+
if cfgErr != nil {
96+
return fmt.Errorf("failed to resolve TLS configuration: %w", cfgErr)
10797
}
10898

10999
reportOutput := "vacuum-spectral-report.json"
@@ -180,15 +170,10 @@ func GetSpectralReportCommand() *cobra.Command {
180170
}
181171
}
182172

183-
resolvedRulesetPath, resolveErr := ResolveConfigPath(rulesetFlag)
184-
if resolveErr != nil {
185-
return resolveErr
186-
}
187-
188173
var rsErr error
189-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(resolvedRulesetPath, defaultRuleSets, remoteFlag, httpClient)
174+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag, httpClient)
190175
if rsErr != nil {
191-
tui.RenderErrorString("Unable to load ruleset '%s': %s", resolvedRulesetPath, rsErr.Error())
176+
tui.RenderErrorString("Unable to load ruleset '%s': %s", rulesetFlag, rsErr.Error())
192177
return rsErr
193178
}
194179

@@ -273,9 +258,7 @@ func GetSpectralReportCommand() *cobra.Command {
273258
return nil
274259
}
275260

276-
err := os.WriteFile(reportOutput, data, 0664)
277-
278-
if err != nil {
261+
if err = os.WriteFile(reportOutput, data, 0664); err != nil {
279262
tui.RenderErrorString("Unable to write report file: '%s': %s", reportOutput, err.Error())
280263
return err
281264
}

0 commit comments

Comments
 (0)