Fix typecheck issues and some initial wrapcheck cases

copilot-swe-agent[bot] and caarlos0 created

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

Change summary

pkg/sshutils/utils.go          |  6 ++++
pkg/storage/local.go           | 37 +++++++++++++++++++++++++++--------
pkg/ui/components/code/code.go |  2 
3 files changed, 34 insertions(+), 11 deletions(-)

Detailed changes

pkg/sshutils/utils.go 🔗

@@ -3,6 +3,7 @@ package sshutils
 import (
 	"bytes"
 	"context"
+	"fmt"
 
 	"github.com/charmbracelet/ssh"
 	gossh "golang.org/x/crypto/ssh"
@@ -11,7 +12,10 @@ import (
 // ParseAuthorizedKey parses an authorized key string into a public key.
 func ParseAuthorizedKey(ak string) (gossh.PublicKey, string, error) {
 	pk, c, _, _, err := gossh.ParseAuthorizedKey([]byte(ak))
-	return pk, c, err
+	if err != nil {
+		return nil, "", fmt.Errorf("failed to parse authorized key: %w", err)
+	}
+	return pk, c, nil
 }
 
 // MarshalAuthorizedKey marshals a public key into an authorized key string.

pkg/storage/local.go 🔗

@@ -2,6 +2,7 @@ package storage
 
 import (
 	"errors"
+	"fmt"
 	"io"
 	"io/fs"
 	"os"
@@ -25,34 +26,49 @@ func NewLocalStorage(root string) *LocalStorage {
 // Delete implements Storage.
 func (l *LocalStorage) Delete(name string) error {
 	name = l.fixPath(name)
-	return os.Remove(name)
+	if err := os.Remove(name); err != nil {
+		return fmt.Errorf("failed to remove file %s: %w", name, err)
+	}
+	return nil
 }
 
 // Open implements Storage.
 func (l *LocalStorage) Open(name string) (Object, error) {
 	name = l.fixPath(name)
-	return os.Open(name)
+	f, err := os.Open(name)
+	if err != nil {
+		return nil, fmt.Errorf("failed to open file %s: %w", name, err)
+	}
+	return f, nil
 }
 
 // Stat implements Storage.
 func (l *LocalStorage) Stat(name string) (fs.FileInfo, error) {
 	name = l.fixPath(name)
-	return os.Stat(name)
+	info, err := os.Stat(name)
+	if err != nil {
+		return nil, fmt.Errorf("failed to stat file %s: %w", name, err)
+	}
+	return info, nil
 }
 
 // Put implements Storage.
 func (l *LocalStorage) Put(name string, r io.Reader) (int64, error) {
 	name = l.fixPath(name)
 	if err := os.MkdirAll(filepath.Dir(name), os.ModePerm); err != nil {
-		return 0, err
+		return 0, fmt.Errorf("failed to create directory for %s: %w", name, err)
 	}
 
 	f, err := os.Create(name)
 	if err != nil {
-		return 0, err
+		return 0, fmt.Errorf("failed to create file %s: %w", name, err)
 	}
 	defer f.Close()
-	return io.Copy(f, r)
+	n, err := io.Copy(f, r)
+	if err != nil {
+		return n, fmt.Errorf("failed to copy data to file %s: %w", name, err)
+	}
+	return n, nil
 }
 
 // Exists implements Storage.
@@ -65,7 +81,7 @@ func (l *LocalStorage) Exists(name string) (bool, error) {
 	if errors.Is(err, fs.ErrNotExist) {
 		return false, nil
 	}
-	return false, err
+	return false, fmt.Errorf("failed to check existence of file %s: %w", name, err)
 }
 
 // Rename implements Storage.
@@ -73,10 +89,13 @@ func (l *LocalStorage) Rename(oldName, newName string) error {
 	oldName = l.fixPath(oldName)
 	newName = l.fixPath(newName)
 	if err := os.MkdirAll(filepath.Dir(newName), os.ModePerm); err != nil {
-		return err
+		return fmt.Errorf("failed to create directory for %s: %w", newName, err)
 	}
 
-	return os.Rename(oldName, newName)
+	if err := os.Rename(oldName, newName); err != nil {
+		return fmt.Errorf("failed to rename %s to %s: %w", oldName, newName, err)
+	}
+	return nil
 }
 
 // Replace all slashes with the OS-specific separator.

pkg/ui/components/code/code.go 🔗

@@ -113,7 +113,7 @@ func (r *Code) Init() tea.Cmd {
 
 	if r.sidenote != "" {
 		lines := strings.Split(r.sidenote, "\n")
-		sideNoteWidth := int(math.Ceil(float64(r.Model.Width()) * r.SideNotePercent))
+		sideNoteWidth := int(math.Ceil(float64(r.Viewport.Width()) * r.SideNotePercent))
 		for i, l := range lines {
 			lines[i] = common.TruncateString(l, sideNoteWidth)
 		}