From 27d7c34689506e0028a002b20ae763b463e35134 Mon Sep 17 00:00:00 2001 From: Harisudarsan Date: Tue, 29 Apr 2025 14:11:13 +0530 Subject: [PATCH] Fix lint Signed-off-by: Harisudarsan --- .golangci.yml | 19 +++++++++---- cmd/query.go | 7 +++-- cmd/tail.go | 7 ++++- main.go | 11 ++++++-- pkg/config/config.go | 9 +++++- pkg/helm/helm.go | 21 ++++++++++---- pkg/http/http.go | 2 ++ pkg/installer/installer.go | 24 +++++++++++----- pkg/iterator/iterator.go | 1 + pkg/iterator/iterator_test.go | 44 ++++++++++++++++++++++------- pkg/model/defaultprofile/profile.go | 2 +- pkg/model/query.go | 6 +++- pkg/model/role/role.go | 2 +- pkg/model/savedQueries.go | 14 +++++++-- pkg/model/timerange.go | 2 +- 15 files changed, 128 insertions(+), 43 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 47e7816..4031a1f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,20 +1,29 @@ +version: 2 + linters: disable-all: true + settings: + errcheck: + exclude-functions: + - io/ioutil.ReadFile + - io.Copy(*bytes.Buffer) + - io.Copy(os.Stdout) + - (io.Closer).Close enable: - - typecheck - - goimports - misspell - govet - - revive + # - revive - ineffassign - gomodguard - - gofmt - unused + - nilnesserr linters-settings: golint: min-confidence: 0 - + govet: + enable: + - typecheck misspell: locale: US diff --git a/cmd/query.go b/cmd/query.go index 49afd93..2514289 100644 --- a/cmd/query.go +++ b/cmd/query.go @@ -143,10 +143,11 @@ func fetchData(client *internalHTTP.HTTPClient, query string, startTime, endTime } encodedResponse, _ := json.MarshalIndent(jsonResponse, "", " ") fmt.Println(string(encodedResponse)) - } else { - io.Copy(os.Stdout, resp.Body) + + return nil } - return nil + _, err = io.Copy(os.Stdout, resp.Body) + return err } // Returns start and end time for query in RFC3339 format diff --git a/cmd/tail.go b/cmd/tail.go index 6ccde73..297d15a 100644 --- a/cmd/tail.go +++ b/cmd/tail.go @@ -86,8 +86,13 @@ func tail(profile config.Profile, stream string) error { if err != nil { return err } + var buf bytes.Buffer - array.RecordToJSON(record, &buf) + err = array.RecordToJSON(record, &buf) + if err != nil { + return err + } + fmt.Println(buf.String()) } } diff --git a/main.go b/main.go index 26ecd0b..075a2f5 100644 --- a/main.go +++ b/main.go @@ -58,8 +58,8 @@ var cli = &cobra.Command{ PersistentPreRunE: analytics.CheckAndCreateULID, RunE: func(command *cobra.Command, _ []string) error { if p, _ := command.Flags().GetBool(versionFlag); p { - pb.PrintVersion(Version, Commit) - return nil + err := pb.PrintVersion(Version, Commit) + return err } return errors.New("no command or flag supplied") }, @@ -303,7 +303,12 @@ func main() { // Set as command pb.VersionCmd.Run = func(_ *cobra.Command, _ []string) { - pb.PrintVersion(Version, Commit) + + err := pb.PrintVersion(Version, Commit) + if err != nil { + fmt.Printf("failed to write to file %v\n", err) + os.Exit(1) + } } cli.AddCommand(pb.VersionCmd) diff --git a/pkg/config/config.go b/pkg/config/config.go index c57a9cc..3dc361b 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -54,6 +54,7 @@ type Profile struct { Password string `json:"password,omitempty"` } +// GrpcAddr gives the grpc address of the parseable server func (p *Profile) GrpcAddr(port string) string { urlv, _ := url.Parse(p.URL) return net.JoinHostPort(urlv.Hostname(), port) @@ -77,7 +78,12 @@ func WriteConfigToFile(config *Config) error { fmt.Println("Error creating the file:", err) return err } - defer file.Close() + + defer func() { + if err := file.Close(); err != nil { + fmt.Printf("Error while closing file: %v \n", err) + } + }() // Write the data into the file _, err = file.Write(tomlData) if err != nil { @@ -107,6 +113,7 @@ func ReadConfigFromFile() (config *Config, err error) { return config, nil } +// GetProfile retrurns the parseable profile by reading the config func GetProfile() (Profile, error) { conf, err := ReadConfigFromFile() if os.IsNotExist(err) { diff --git a/pkg/helm/helm.go b/pkg/helm/helm.go index ea52248..ad5e02c 100644 --- a/pkg/helm/helm.go +++ b/pkg/helm/helm.go @@ -94,12 +94,14 @@ func Apply(h Helm, verbose bool) error { settings.SetNamespace(h.Namespace) settings.EnvVars() // Add repository - repoAdd(h) - + err := repoAdd(h) + if err != nil { + return err + } // RepoUpdate() // Locate chart path - cp, err := client.ChartPathOptions.LocateChart(fmt.Sprintf("%s/%s", h.RepoName, h.ChartName), settings) + cp, err := client.LocateChart(fmt.Sprintf("%s/%s", h.RepoName, h.ChartName), settings) if err != nil { return err } @@ -159,7 +161,11 @@ func repoAdd(h Helm) error { locked, err := fileLock.TryLockContext(lockCtx, time.Second) if err == nil && locked { - defer fileLock.Unlock() + defer func() { + if err := fileLock.Unlock(); err != nil { + fmt.Printf("Error while unlocking file %v", err) + } + }() } if err != nil { @@ -313,12 +319,15 @@ func Upgrade(h Helm) error { settings.SetNamespace(h.Namespace) settings.EnvVars() // Add repository - repoAdd(h) + err := repoAdd(h) + if err != nil { + return err + } // RepoUpdate() // Locate chart path - cp, err := client.ChartPathOptions.LocateChart(fmt.Sprintf("%s/%s", h.RepoName, h.ChartName), settings) + cp, err := client.LocateChart(fmt.Sprintf("%s/%s", h.RepoName, h.ChartName), settings) if err != nil { return err } diff --git a/pkg/http/http.go b/pkg/http/http.go index 340d1b1..9039da2 100644 --- a/pkg/http/http.go +++ b/pkg/http/http.go @@ -24,11 +24,13 @@ import ( "time" ) +// HTTPClient can be used to make HTTP requests in an idiomatic way type HTTPClient struct { Client http.Client Profile *config.Profile } +// DefaultClient creates a HTTPClient with default parameters func DefaultClient(profile *config.Profile) HTTPClient { return HTTPClient{ Client: http.Client{ diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index c7c32df..edbb056 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -272,13 +272,14 @@ func promptNamespaceAndCredentials() (*ParseableInfo, error) { // applyParseableSecret creates and applies the Kubernetes secret func applyParseableSecret(ps *ParseableInfo, store ObjectStore, objectStoreConfig ObjectStoreConfig) error { var secretManifest string - if store == LocalStore { + switch store { + case LocalStore: secretManifest = getParseableSecretLocal(ps) - } else if store == S3Store { + case S3Store: secretManifest = getParseableSecretS3(ps, objectStoreConfig) - } else if store == BlobStore { + case BlobStore: secretManifest = getParseableSecretBlob(ps, objectStoreConfig) - } else if store == GcsStore { + case GcsStore: secretManifest = getParseableSecretGcs(ps, objectStoreConfig) } @@ -867,7 +868,10 @@ func startPortForward(namespace, serviceName, remotePort, localPort string, verb for i := 0; i < retries; i++ { conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%s", localPort)) if err == nil { - conn.Close() // Connection successful, break out of the loop + err := conn.Close() // Connection successful, break out of the loop + if err != nil { + return err + } fmt.Println(common.Green + "Port-forwarding successfully established!") time.Sleep(5 * time.Second) // some delay return nil @@ -876,7 +880,10 @@ func startPortForward(namespace, serviceName, remotePort, localPort string, verb } // If we reach here, port-forwarding failed - cmd.Process.Kill() // Stop the kubectl process + err := cmd.Process.Kill() // Stop the kubectl process + if err != nil { + return err + } return fmt.Errorf(common.Red+"failed to establish port-forward connection to localhost:%s", localPort) } @@ -893,7 +900,10 @@ func openBrowser(url string) { fmt.Printf("Please open the following URL manually: %s\n", url) return } - cmd.Start() + err := cmd.Start() + if err != nil { + log.Fatalf("could not be be able to start the command %v", err) + } } func updateInstallerConfigMap(entry common.InstallerEntry) error { diff --git a/pkg/iterator/iterator.go b/pkg/iterator/iterator.go index b22915e..249547f 100644 --- a/pkg/iterator/iterator.go +++ b/pkg/iterator/iterator.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +// Package iterator provides functions for iterating queries package iterator import ( diff --git a/pkg/iterator/iterator_test.go b/pkg/iterator/iterator_test.go index 0293d28..396c6d8 100644 --- a/pkg/iterator/iterator_test.go +++ b/pkg/iterator/iterator_test.go @@ -89,7 +89,7 @@ func TestIteratorConstruct(t *testing.T) { iter := NewQueryIterator(scenario.StartTime(), scenario.EndTime(), true, scenario.QueryRunnerFunc(), scenario.HasDataFunc()) currentWindow := iter.windows[0] - if !(currentWindow.time == scenario.StartTime()) { + if currentWindow.time != scenario.StartTime() { t.Fatalf("window time does not match start, expected %s, actual %s", scenario.StartTime().String(), currentWindow.time.String()) } } @@ -98,7 +98,10 @@ func TestIteratorAscending(t *testing.T) { scenario := DefaultTestScenario() iter := NewQueryIterator(scenario.StartTime(), scenario.EndTime(), true, scenario.QueryRunnerFunc(), scenario.HasDataFunc()) - iter.Next() + _, err := iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -115,7 +118,10 @@ func TestIteratorAscending(t *testing.T) { t.Fatalf("Iter is not ready when it should be") } - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -124,7 +130,10 @@ func TestIteratorAscending(t *testing.T) { currentWindow = iter.windows[iter.index] checkCurrentWindowIndex("02 Jan 06 15:07 +0000", currentWindow, t) - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -133,7 +142,10 @@ func TestIteratorAscending(t *testing.T) { currentWindow = iter.windows[iter.index] checkCurrentWindowIndex("02 Jan 06 15:09 +0000", currentWindow, t) - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -151,7 +163,10 @@ func TestIteratorDescending(t *testing.T) { scenario := DefaultTestScenario() iter := NewQueryIterator(scenario.StartTime(), scenario.EndTime(), false, scenario.QueryRunnerFunc(), scenario.HasDataFunc()) - iter.Next() + _, err := iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -168,7 +183,10 @@ func TestIteratorDescending(t *testing.T) { t.Fatalf("Iter is not ready when it should be") } - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -177,7 +195,10 @@ func TestIteratorDescending(t *testing.T) { currentWindow = iter.windows[iter.index] checkCurrentWindowIndex("02 Jan 06 15:09 +0000", currentWindow, t) - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -186,7 +207,10 @@ func TestIteratorDescending(t *testing.T) { currentWindow = iter.windows[iter.index] checkCurrentWindowIndex("02 Jan 06 15:07 +0000", currentWindow, t) - iter.Next() + _, err = iter.Next() + if err != nil { + t.Fatalf("error while iterating %v", err) + } // busy loop waiting for iter to be ready for !iter.Ready() { continue @@ -202,7 +226,7 @@ func TestIteratorDescending(t *testing.T) { func checkCurrentWindowIndex(expectedValue string, currentWindow MinuteCheckPoint, t *testing.T) { expectedTime, _ := time.Parse(time.RFC822Z, expectedValue) - if !(currentWindow.time == expectedTime) { + if currentWindow.time != expectedTime { t.Fatalf("window time does not match start, expected %s, actual %s", expectedTime.String(), currentWindow.time.String()) } } diff --git a/pkg/model/defaultprofile/profile.go b/pkg/model/defaultprofile/profile.go index 9077054..e94d931 100644 --- a/pkg/model/defaultprofile/profile.go +++ b/pkg/model/defaultprofile/profile.go @@ -79,7 +79,7 @@ func (d itemDelegate) Render(w io.Writer, m list.Model, index int, listItem list render = focusedOuterStyle.Render(render) } - fmt.Fprint(w, render) + _, _ = fmt.Fprint(w, render) } // Model for profile selection command diff --git a/pkg/model/query.go b/pkg/model/query.go index 5a25444..92d4042 100644 --- a/pkg/model/query.go +++ b/pkg/model/query.go @@ -552,7 +552,11 @@ func fetchData(client *http.Client, profile *config.Profile, query string, start } err = json.NewDecoder(resp.Body).Decode(&data) - defer resp.Body.Close() + defer func() { + if err := resp.Body.Close(); err != nil { + fmt.Printf("failed to close the response body %v\n", err) + } + }() if err != nil { return } diff --git a/pkg/model/role/role.go b/pkg/model/role/role.go index 05783f1..3deba96 100644 --- a/pkg/model/role/role.go +++ b/pkg/model/role/role.go @@ -65,7 +65,7 @@ func (m *Model) Valid() bool { case "admin", "editor", "none": return true case "writer", "reader", "ingestor": - return !(strings.Contains(m.Stream.Value(), " ") || m.Stream.Value() == "") + return !strings.Contains(m.Stream.Value(), " ") && m.Stream.Value() != "" } return true } diff --git a/pkg/model/savedQueries.go b/pkg/model/savedQueries.go index b3a5c4b..c7dc149 100644 --- a/pkg/model/savedQueries.go +++ b/pkg/model/savedQueries.go @@ -122,7 +122,7 @@ func (d itemDelegate) Render(w io.Writer, m list.Model, index int, listItem list } } - fmt.Fprint(w, fn(tr(i.title)+"\n"+qr(i.desc)+"\n"+str)) + _, _ = fmt.Fprint(w, fn(tr(i.title)+"\n"+qr(i.desc)+"\n"+str)) } // Implement itemDelegate ShortHelp to show only relevant bindings. @@ -321,7 +321,11 @@ func fetchFilters(client *http.Client, profile *config.Profile) []list.Item { fmt.Println("Error making request:", err) return nil } - defer resp.Body.Close() + defer func() { + if err := resp.Body.Close(); err != nil { + fmt.Printf("failed to close the response body %v\n", err) + } + }() body, err := io.ReadAll(resp.Body) if err != nil { @@ -389,7 +393,11 @@ func RunQuery(client *http.Client, profile *config.Profile, query string, startT if err != nil { return "", err } - defer resp.Body.Close() + defer func() { + if err := resp.Body.Close(); err != nil { + fmt.Printf("failed to close the response body %v\n", err) + } + }() if resp.StatusCode == http.StatusOK { var jsonResponse []map[string]interface{} diff --git a/pkg/model/timerange.go b/pkg/model/timerange.go index 2a394fb..8f0dbbc 100644 --- a/pkg/model/timerange.go +++ b/pkg/model/timerange.go @@ -80,7 +80,7 @@ func (d timeDurationItemDelegate) Render(w io.Writer, m list.Model, index int, l } } - fmt.Fprint(w, fn(i.repr)) + _, _ = fmt.Fprint(w, fn(i.repr)) } // NewTimeRangeModel creates new range model