| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package tools
- import (
- "context"
- "log/slog"
- "os/exec"
- "path/filepath"
- "strings"
- "sync"
- "github.com/charmbracelet/crush/internal/log"
- )
- var getRg = sync.OnceValue(func() string {
- path, err := exec.LookPath("rg")
- if err != nil {
- if log.Initialized() {
- slog.Warn("Ripgrep (rg) not found in $PATH. Some grep features might be limited or slower.")
- }
- return ""
- }
- return path
- })
- func getRgCmd(ctx context.Context, globPattern string) *exec.Cmd {
- name := getRg()
- if name == "" {
- return nil
- }
- args := []string{"--files", "-L", "--null"}
- if globPattern != "" {
- if !filepath.IsAbs(globPattern) && !strings.HasPrefix(globPattern, "/") {
- globPattern = "/" + globPattern
- }
- args = append(args, "--glob", globPattern)
- }
- return exec.CommandContext(ctx, name, args...)
- }
- func getRgSearchCmd(ctx context.Context, pattern, path, include string) *exec.Cmd {
- name := getRg()
- if name == "" {
- return nil
- }
- // Use -n to show line numbers, -0 for null separation to handle Windows paths
- args := []string{"--json", "-H", "-n", "-0", pattern}
- if include != "" {
- args = append(args, "--glob", include)
- }
- args = append(args, path)
- return exec.CommandContext(ctx, name, args...)
- }
|