Skip to content

Commit 4ce4bda

Browse files
committed
Respect RequireCLI option for explicit manager selection
detectExplicit was hardcoding requireCLI=true, ignoring the DetectOptions.RequireCLI field. This caused failures when callers only needed template-based operations (like path lookup) that don't require the CLI binary to be installed.
1 parent 2e6ea6d commit 4ce4bda

2 files changed

Lines changed: 57 additions & 3 deletions

File tree

detector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func (d *Detector) sortDefinitions() {
5252

5353
func (d *Detector) Detect(dir string, opts DetectOptions) (Manager, error) {
5454
if opts.Manager != "" {
55-
return d.detectExplicit(dir, opts.Manager)
55+
return d.detectExplicit(dir, opts.Manager, opts.RequireCLI)
5656
}
5757

5858
files, err := os.ReadDir(dir)
@@ -100,10 +100,10 @@ func (d *Detector) Detect(dir string, opts DetectOptions) (Manager, error) {
100100
return nil, ErrNoManifest{Dir: dir}
101101
}
102102

103-
func (d *Detector) detectExplicit(dir, managerName string) (Manager, error) {
103+
func (d *Detector) detectExplicit(dir, managerName string, requireCLI bool) (Manager, error) {
104104
for _, def := range d.definitions {
105105
if def.Name == managerName {
106-
return d.buildManager(def, dir, nil, true)
106+
return d.buildManager(def, dir, nil, requireCLI)
107107
}
108108
}
109109
return nil, ErrNoManifest{Dir: dir}

detector_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package managers
2+
3+
import (
4+
"testing"
5+
6+
"github.com/git-pkgs/managers/definitions"
7+
)
8+
9+
func TestDetectExplicit_RequireCLI(t *testing.T) {
10+
translator := NewTranslator()
11+
runner := NewMockRunner()
12+
detector := NewDetector(translator, runner)
13+
14+
def := &definitions.Definition{
15+
Name: "fakepkg",
16+
Binary: "binary-that-does-not-exist",
17+
}
18+
detector.Register(def)
19+
20+
t.Run("require CLI fails when binary missing", func(t *testing.T) {
21+
_, err := detector.Detect("/tmp", DetectOptions{
22+
Manager: "fakepkg",
23+
RequireCLI: true,
24+
})
25+
if err == nil {
26+
t.Fatal("expected error when binary not found")
27+
}
28+
var cliErr ErrCLINotFound
29+
if !isErrCLINotFound(err, &cliErr) {
30+
t.Fatalf("expected ErrCLINotFound, got: %v", err)
31+
}
32+
})
33+
34+
t.Run("no CLI required succeeds without binary", func(t *testing.T) {
35+
mgr, err := detector.Detect("/tmp", DetectOptions{
36+
Manager: "fakepkg",
37+
RequireCLI: false,
38+
})
39+
if err != nil {
40+
t.Fatalf("unexpected error: %v", err)
41+
}
42+
if mgr == nil {
43+
t.Fatal("expected manager, got nil")
44+
}
45+
})
46+
}
47+
48+
func isErrCLINotFound(err error, target *ErrCLINotFound) bool {
49+
e, ok := err.(ErrCLINotFound)
50+
if ok {
51+
*target = e
52+
}
53+
return ok
54+
}

0 commit comments

Comments
 (0)