feat(context): centralize RepoContext API for git operations (#1102)

Centralizes repository context resolution via RepoContext API, fixing bugs where git commands run in the wrong repo when BEADS_DIR points elsewhere or in worktree scenarios.
This commit is contained in:
Peter Chanthamynavong
2026-01-15 07:55:08 -08:00
committed by GitHub
parent 159114563b
commit 0a48519561
33 changed files with 3211 additions and 327 deletions

View File

@@ -1,15 +1,29 @@
package compact
import (
"os/exec"
"context"
"strings"
"github.com/steveyegge/beads/internal/beads"
)
var gitExec = func(name string, args ...string) ([]byte, error) {
return exec.Command(name, args...).Output()
// gitExec is a function hook for executing git commands.
// In production, it uses RepoContext. In tests, it can be swapped for mocking.
var gitExec = defaultGitExec
// defaultGitExec uses RepoContext to execute git commands in the beads repository.
func defaultGitExec(name string, args ...string) ([]byte, error) {
// name is always "git" when called from GetCurrentCommitHash
rc, err := beads.GetRepoContext()
if err != nil {
return nil, err
}
cmd := rc.GitCmd(context.Background(), args...)
return cmd.Output()
}
// GetCurrentCommitHash returns the current git HEAD commit hash.
// GetCurrentCommitHash returns the current git HEAD commit hash for the beads repository.
// Returns empty string if not in a git repository or if git command fails.
func GetCurrentCommitHash() string {
output, err := gitExec("git", "rev-parse", "HEAD")