@@ -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.
@@ -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.
@@ -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)
}