Fix exhaustive switch cases, errcheck, and nolintlint issues

copilot-swe-agent[bot] and caarlos0 created

Co-authored-by: caarlos0 <245435+caarlos0@users.noreply.github.com>

Change summary

.golangci.yml                          | 43 ++++++++++++++++++++++++++++
cmd/soft/browse/browse.go              |  2 +
pkg/config/config.go                   |  2 
pkg/daemon/daemon.go                   |  8 +++-
pkg/ui/components/selector/selector.go |  2 +
pkg/ui/components/tabs/tabs.go         |  2 +
pkg/ui/pages/repo/repo.go              |  2 +
pkg/web/git.go                         |  2 
pkg/web/git_lfs.go                     |  8 ++--
9 files changed, 63 insertions(+), 8 deletions(-)

Detailed changes

.golangci.yml 🔗

@@ -0,0 +1,43 @@
+run:
+  tests: false
+linters:
+  enable:
+    - bodyclose
+    - exhaustive
+    - goconst
+    - godot
+    - gomoddirectives
+    - goprintffuncname
+    - gosec
+    - misspell
+    - nakedret
+    - nestif
+    - nilerr
+    - noctx
+    - nolintlint
+    - prealloc
+    - revive
+    - rowserrcheck
+    - sqlclosecheck
+    - tparallel
+    - unconvert
+    - unparam
+    - whitespace
+    - wrapcheck
+  exclusions:
+    rules:
+      - text: '(slog|log)\.\w+'
+        linters:
+          - noctx
+    generated: lax
+    presets:
+      - common-false-positives
+issues:
+  max-issues-per-linter: 0
+  max-same-issues: 0
+formatters:
+  enable:
+    - gofumpt
+    - goimports
+  exclusions:
+    generated: lax

cmd/soft/browse/browse.go 🔗

@@ -177,6 +177,8 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			case m.common.Zone.Get("footer").InBounds(msg):
 				cmds = append(cmds, footer.ToggleFooterCmd)
 			}
+		default:
+			// Handle other mouse buttons
 		}
 	case footer.ToggleFooterMsg:
 		m.footer.SetShowAll(!m.footer.ShowAll())

pkg/config/config.go 🔗

@@ -231,7 +231,7 @@ func parseFile(cfg *Config, path string) error {
 		return err
 	}
 
-	defer f.Close() //nolint: errcheck
+	defer f.Close()
 	if err := yaml.NewDecoder(f).Decode(cfg); err != nil {
 		return fmt.Errorf("decode config: %w", err)
 	}

pkg/daemon/daemon.go 🔗

@@ -139,7 +139,9 @@ func (d *GitDaemon) Serve(listener net.Listener) error {
 }
 
 func (d *GitDaemon) fatal(c net.Conn, err error) {
-	git.WritePktlineErr(c, err) 
+	if writeErr := git.WritePktlineErr(c, err); writeErr != nil {
+		d.logger.Debugf("git: error writing pktline: %v", writeErr)
+	}
 	if err := c.Close(); err != nil {
 		d.logger.Debugf("git: error closing connection: %v", err)
 	}
@@ -321,7 +323,9 @@ func (d *GitDaemon) handleClient(conn net.Conn) {
 // Close closes the underlying listener.
 func (d *GitDaemon) Close() error {
 	err := d.closeListener()
-	d.conns.CloseAll() 
+	if closeErr := d.conns.CloseAll(); closeErr != nil {
+		d.logger.Debugf("git: error closing connections: %v", closeErr)
+	}
 	return err
 }
 

pkg/ui/components/selector/selector.go 🔗

@@ -251,6 +251,8 @@ func (s *Selector) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 					break
 				}
 			}
+		default:
+			// Handle other mouse buttons
 		}
 	case tea.KeyPressMsg:
 		filterState := s.FilterState()

pkg/ui/components/tabs/tabs.go 🔗

@@ -72,6 +72,8 @@ func (t *Tabs) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 					cmds = append(cmds, t.activeTabCmd)
 				}
 			}
+		default:
+			// Handle other mouse buttons
 		}
 	case SelectTabMsg:
 		tab := int(msg)

pkg/ui/pages/repo/repo.go 🔗

@@ -197,6 +197,8 @@ func (r *Repo) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 				case r.common.Zone.Get("repo-main").InBounds(msg):
 					cmds = append(cmds, goBackCmd)
 				}
+			default:
+				// Handle other mouse buttons
 			}
 		}
 		switch msg := msg.(type) {

pkg/web/git.go 🔗

@@ -436,7 +436,7 @@ func serviceRpc(w http.ResponseWriter, r *http.Request) {
 			renderInternalServerError(w, r)
 			return
 		}
-		defer reader.Close() //nolint: errcheck
+		defer reader.Close()
 	}
 
 	cmd.Stdin = reader

pkg/web/git_lfs.go 🔗

@@ -41,7 +41,7 @@ func serviceLfsBatch(w http.ResponseWriter, r *http.Request) {
 	}
 
 	var batchRequest lfs.BatchRequest
-	defer r.Body.Close() //nolint: errcheck
+	defer r.Body.Close()
 	if err := json.NewDecoder(r.Body).Decode(&batchRequest); err != nil {
 		logger.Errorf("error decoding json: %s", err)
 		renderJSON(w, http.StatusUnprocessableEntity, lfs.ErrorResponse{
@@ -282,7 +282,7 @@ func serviceLfsBasicDownload(w http.ResponseWriter, r *http.Request) {
 
 	w.Header().Set("Content-Type", "application/octet-stream")
 	w.Header().Set("Content-Length", strconv.FormatInt(obj.Size, 10))
-	defer f.Close() //nolint: errcheck
+	defer f.Close()
 	if _, err := io.Copy(w, f); err != nil {
 		logger.Error("error copying object to response", "oid", oid, "err", err)
 		renderJSON(w, http.StatusInternalServerError, lfs.ErrorResponse{
@@ -313,7 +313,7 @@ func serviceLfsBasicUpload(w http.ResponseWriter, r *http.Request) {
 	strg := storage.NewLocalStorage(filepath.Join(cfg.DataPath, "lfs", repoID))
 	name := mux.Vars(r)["repo"]
 
-	defer r.Body.Close() //nolint: errcheck
+	defer r.Body.Close()
 	repo, err := be.Repository(ctx, name)
 	if err != nil {
 		renderJSON(w, http.StatusNotFound, lfs.ErrorResponse{
@@ -385,7 +385,7 @@ func serviceLfsBasicVerify(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	defer r.Body.Close() //nolint: errcheck
+	defer r.Body.Close()
 	if err := json.NewDecoder(r.Body).Decode(&pointer); err != nil {
 		logger.Error("error decoding json", "err", err)
 		renderJSON(w, http.StatusBadRequest, lfs.ErrorResponse{