Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pkg/code-manager/code_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ func (c *realCodeManager) VerbosePrint(msg string, args ...interface{}) {
// SetLogger sets the logger for this CodeManager instance.
func (c *realCodeManager) SetLogger(logger logger.Logger) {
c.deps.Logger = logger
// Also set logger on status manager for verbose output
if c.deps.StatusManager != nil {
c.deps.StatusManager.SetLogger(logger)
}
}

// getConfig gets the configuration from the ConfigManager with fallback.
Expand Down
13 changes: 13 additions & 0 deletions pkg/status/mocks/status.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 7 additions & 4 deletions pkg/status/remove_workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package status

import (
"fmt"
"log"
)

// RemoveWorkspace removes a workspace entry from the status file.
Expand All @@ -13,8 +12,10 @@ func (s *realManager) RemoveWorkspace(workspaceName string) error {
return fmt.Errorf("failed to load status: %w", err)
}

log.Printf(" [RemoveWorkspace] After load: status.Repositories[github.com/octocat/Hello-World].Worktrees = %v",
status.Repositories["github.com/octocat/Hello-World"].Worktrees)
if s.logger != nil {
s.logger.Logf(" [RemoveWorkspace] After load: status.Repositories[github.com/octocat/Hello-World].Worktrees = %v",
status.Repositories["github.com/octocat/Hello-World"].Worktrees)
}

// Check if workspace exists
if _, exists := status.Workspaces[workspaceName]; !exists {
Expand All @@ -29,7 +30,9 @@ func (s *realManager) RemoveWorkspace(workspaceName string) error {
return fmt.Errorf("failed to save status: %w", err)
}

log.Printf(" [RemoveWorkspace] After save: status saved successfully")
if s.logger != nil {
s.logger.Logf(" [RemoveWorkspace] After save: status saved successfully")
}

// Update internal workspaces map
s.computeWorkspacesMap(status.Workspaces)
Expand Down
84 changes: 58 additions & 26 deletions pkg/status/remove_worktree.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,86 @@ package status

import (
"fmt"
"log"
)

// RemoveWorktree removes a worktree entry from the status file.
func (s *realManager) RemoveWorktree(repoURL, branch string) error {
// Load current status
status, err := s.loadStatus()
if err != nil {
return fmt.Errorf("failed to load status: %w", err)
}

// Check if repository exists
repo, err := s.validateRepository(status, repoURL)
if err != nil {
return err
}

s.logRemoveWorktreeBefore(repo.Worktrees)

if err := s.deleteWorktreeFromRepo(&repo, branch); err != nil {
return fmt.Errorf("%w for repository %s branch %s", err, repoURL, branch)
}

s.logRemoveWorktreeAfter(repo.Worktrees, repoURL, status)

status.Repositories[repoURL] = repo

if err := s.saveStatus(status); err != nil {
return fmt.Errorf("failed to save status: %w", err)
}

s.logRemoveWorktreeSave()

return nil
}

// validateRepository checks if the repository exists in the status.
func (s *realManager) validateRepository(status *Status, repoURL string) (Repository, error) {
repo, exists := status.Repositories[repoURL]
if !exists {
return fmt.Errorf("%w: %s", ErrRepositoryNotFound, repoURL)
return Repository{}, fmt.Errorf("%w: %s", ErrRepositoryNotFound, repoURL)
}
return repo, nil
}

log.Printf(" [RemoveWorktree] Before deletion: repo.Worktrees = %v", repo.Worktrees)

// Find and remove the worktree entry
found := false
// deleteWorktreeFromRepo finds and deletes the worktree entry from the repository.
func (s *realManager) deleteWorktreeFromRepo(repo *Repository, branch string) error {
for worktreeKey, worktree := range repo.Worktrees {
if worktree.Branch == branch {
log.Printf(" [RemoveWorktree] Deleting worktree with key: %s, branch: %s", worktreeKey, branch)
s.logRemoveWorktreeDelete(worktreeKey, branch)
delete(repo.Worktrees, worktreeKey)
found = true
break
return nil
}
}
return ErrWorktreeNotFound
}

if !found {
return fmt.Errorf("%w for repository %s branch %s", ErrWorktreeNotFound, repoURL, branch)
// logRemoveWorktreeBefore logs the worktrees before deletion.
func (s *realManager) logRemoveWorktreeBefore(worktrees map[string]WorktreeInfo) {
if s.logger != nil {
s.logger.Logf(" [RemoveWorktree] Before deletion: repo.Worktrees = %v", worktrees)
}
}

log.Printf(" [RemoveWorktree] After deletion: repo.Worktrees = %v", repo.Worktrees)

// Update repository
status.Repositories[repoURL] = repo

log.Printf(" [RemoveWorktree] After update: status.Repositories[%s].Worktrees = %v",
repoURL, status.Repositories[repoURL].Worktrees)

// Save updated status
if err := s.saveStatus(status); err != nil {
return fmt.Errorf("failed to save status: %w", err)
// logRemoveWorktreeDelete logs the deletion of a worktree.
func (s *realManager) logRemoveWorktreeDelete(worktreeKey, branch string) {
if s.logger != nil {
s.logger.Logf(" [RemoveWorktree] Deleting worktree with key: %s, branch: %s", worktreeKey, branch)
}
}

log.Printf(" [RemoveWorktree] After save: status saved successfully")
// logRemoveWorktreeAfter logs the worktrees after deletion.
func (s *realManager) logRemoveWorktreeAfter(worktrees map[string]WorktreeInfo, repoURL string, status *Status) {
if s.logger != nil {
s.logger.Logf(" [RemoveWorktree] After deletion: repo.Worktrees = %v", worktrees)
s.logger.Logf(" [RemoveWorktree] After update: status.Repositories[%s].Worktrees = %v",
repoURL, status.Repositories[repoURL].Worktrees)
}
}

return nil
// logRemoveWorktreeSave logs after saving the status.
func (s *realManager) logRemoveWorktreeSave() {
if s.logger != nil {
s.logger.Logf(" [RemoveWorktree] After save: status saved successfully")
}
}
21 changes: 16 additions & 5 deletions pkg/status/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/lerenn/code-manager/pkg/config"
"github.com/lerenn/code-manager/pkg/fs"
"github.com/lerenn/code-manager/pkg/issue"
"github.com/lerenn/code-manager/pkg/logger"
"gopkg.in/yaml.v3"
)

Expand Down Expand Up @@ -83,12 +84,15 @@ type Manager interface {
UpdateWorkspace(workspaceName string, workspace Workspace) error
// ListWorkspaces lists all workspaces in the status file.
ListWorkspaces() (map[string]Workspace, error)
// SetLogger sets the logger for verbose output.
SetLogger(logger logger.Logger)
}

type realManager struct {
fs fs.FS
config config.Config
workspaces map[string]map[string][]WorktreeInfo // workspace -> branch -> worktrees
logger logger.Logger
}

// NewManager creates a new Status Manager instance.
Expand Down Expand Up @@ -237,11 +241,13 @@ func (s *realManager) saveStatus(status *Status) error {
return fmt.Errorf("failed to marshal status: %w", err)
}

// Log what we're about to save
var debugStatus Status
_ = yaml.Unmarshal(data, &debugStatus)
if repo, exists := debugStatus.Repositories["github.com/octocat/Hello-World"]; exists {
fmt.Printf(" [saveStatus] About to write: github.com/octocat/Hello-World.Worktrees = %v\n", repo.Worktrees)
// Log what we're about to save (verbose mode only)
if s.logger != nil {
var debugStatus Status
_ = yaml.Unmarshal(data, &debugStatus)
if repo, exists := debugStatus.Repositories["github.com/octocat/Hello-World"]; exists {
s.logger.Logf(" [saveStatus] About to write: github.com/octocat/Hello-World.Worktrees = %v", repo.Worktrees)
}
}

// Write status file atomically
Expand All @@ -254,3 +260,8 @@ func (s *realManager) saveStatus(status *Status) error {

return nil
}

// SetLogger sets the logger for verbose output.
func (s *realManager) SetLogger(logger logger.Logger) {
s.logger = logger
}
11 changes: 7 additions & 4 deletions pkg/status/update_workspace.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package status

import (
"fmt"
"log"
)

// UpdateWorkspace updates an existing workspace entry in the status file.
Expand All @@ -13,8 +12,10 @@ func (s *realManager) UpdateWorkspace(workspaceName string, workspace Workspace)
return fmt.Errorf("failed to load status: %w", err)
}

log.Printf(" [UpdateWorkspace] After load: status.Repositories[github.com/octocat/Hello-World].Worktrees = %v",
status.Repositories["github.com/octocat/Hello-World"].Worktrees)
if s.logger != nil {
s.logger.Logf(" [UpdateWorkspace] After load: status.Repositories[github.com/octocat/Hello-World].Worktrees = %v",
status.Repositories["github.com/octocat/Hello-World"].Worktrees)
}

// Check if workspace exists
if _, exists := status.Workspaces[workspaceName]; !exists {
Expand All @@ -29,7 +30,9 @@ func (s *realManager) UpdateWorkspace(workspaceName string, workspace Workspace)
return fmt.Errorf("failed to save status: %w", err)
}

log.Printf(" [UpdateWorkspace] After save: status saved successfully")
if s.logger != nil {
s.logger.Logf(" [UpdateWorkspace] After save: status saved successfully")
}

// Update internal workspaces map
s.computeWorkspacesMap(status.Workspaces)
Expand Down