Skip to content

Commit d81f5cb

Browse files
authored
refactor: remove unused exported symbols from internal packages (#33)
1 parent d555da3 commit d81f5cb

File tree

9 files changed

+10
-324
lines changed

9 files changed

+10
-324
lines changed

internal/brew/brew.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -176,38 +176,6 @@ func UninstallCask(packages []string, dryRun bool) error {
176176
return nil
177177
}
178178

179-
// GetInstalledLeaves returns top-level formulae (not dependencies) as a set.
180-
// This matches what `brew leaves` reports and is consistent with snapshot captures.
181-
func GetInstalledLeaves() (map[string]bool, error) {
182-
output, err := currentRunner().Output("leaves")
183-
if err != nil {
184-
return nil, fmt.Errorf("brew leaves: %w", err)
185-
}
186-
187-
leaves := make(map[string]bool)
188-
for _, name := range strings.Split(strings.TrimSpace(string(output)), "\n") {
189-
if name != "" {
190-
leaves[name] = true
191-
}
192-
}
193-
return leaves, nil
194-
}
195-
196-
func GetInstalledTaps() ([]string, error) {
197-
output, err := currentRunner().Output("tap")
198-
if err != nil {
199-
return nil, fmt.Errorf("brew tap: %w", err)
200-
}
201-
var taps []string
202-
for _, line := range strings.Split(strings.TrimSpace(string(output)), "\n") {
203-
line = strings.TrimSpace(line)
204-
if line != "" {
205-
taps = append(taps, line)
206-
}
207-
}
208-
return taps, nil
209-
}
210-
211179
func Untap(taps []string, dryRun bool) error {
212180
if len(taps) == 0 {
213181
return nil

internal/brew/brew_extra_test.go

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -8,92 +8,6 @@ import (
88
"github.com/stretchr/testify/require"
99
)
1010

11-
// ---------------------------------------------------------------------------
12-
// GetInstalledLeaves
13-
// ---------------------------------------------------------------------------
14-
15-
func TestGetInstalledLeaves_ParsesOutput(t *testing.T) {
16-
withFakeBrew(t, func(args []string) ([]byte, error) {
17-
if len(args) == 1 && args[0] == "leaves" {
18-
return []byte("git\ncurl\nripgrep\n"), nil
19-
}
20-
return nil, nil
21-
})
22-
23-
leaves, err := GetInstalledLeaves()
24-
require.NoError(t, err)
25-
assert.True(t, leaves["git"])
26-
assert.True(t, leaves["curl"])
27-
assert.True(t, leaves["ripgrep"])
28-
assert.Len(t, leaves, 3)
29-
}
30-
31-
func TestGetInstalledLeaves_EmptyOutput(t *testing.T) {
32-
withFakeBrew(t, func(args []string) ([]byte, error) {
33-
if len(args) == 1 && args[0] == "leaves" {
34-
return []byte("\n"), nil
35-
}
36-
return nil, nil
37-
})
38-
39-
leaves, err := GetInstalledLeaves()
40-
require.NoError(t, err)
41-
assert.Empty(t, leaves)
42-
}
43-
44-
func TestGetInstalledLeaves_RunnerError(t *testing.T) {
45-
withFakeBrew(t, func(args []string) ([]byte, error) {
46-
return nil, errors.New("brew not found")
47-
})
48-
49-
_, err := GetInstalledLeaves()
50-
require.Error(t, err)
51-
assert.Contains(t, err.Error(), "brew leaves")
52-
}
53-
54-
// ---------------------------------------------------------------------------
55-
// GetInstalledTaps
56-
// ---------------------------------------------------------------------------
57-
58-
func TestGetInstalledTaps_ParsesOutput(t *testing.T) {
59-
withFakeBrew(t, func(args []string) ([]byte, error) {
60-
if len(args) == 1 && args[0] == "tap" {
61-
return []byte("homebrew/cask\nhashicorp/tap\nopenbootdotdev/tap\n"), nil
62-
}
63-
return nil, nil
64-
})
65-
66-
taps, err := GetInstalledTaps()
67-
require.NoError(t, err)
68-
require.Len(t, taps, 3)
69-
assert.Equal(t, "homebrew/cask", taps[0])
70-
assert.Equal(t, "hashicorp/tap", taps[1])
71-
assert.Equal(t, "openbootdotdev/tap", taps[2])
72-
}
73-
74-
func TestGetInstalledTaps_EmptyOutput(t *testing.T) {
75-
withFakeBrew(t, func(args []string) ([]byte, error) {
76-
if len(args) == 1 && args[0] == "tap" {
77-
return []byte(""), nil
78-
}
79-
return nil, nil
80-
})
81-
82-
taps, err := GetInstalledTaps()
83-
require.NoError(t, err)
84-
assert.Empty(t, taps)
85-
}
86-
87-
func TestGetInstalledTaps_RunnerError(t *testing.T) {
88-
withFakeBrew(t, func(args []string) ([]byte, error) {
89-
return nil, errors.New("exit status 1")
90-
})
91-
92-
_, err := GetInstalledTaps()
93-
require.Error(t, err)
94-
assert.Contains(t, err.Error(), "brew tap")
95-
}
96-
9711
// ---------------------------------------------------------------------------
9812
// Untap
9913
// ---------------------------------------------------------------------------

internal/npm/npm.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var nodeVersionOutput = func() ([]byte, error) {
2121
return exec.Command("node", "--version").Output()
2222
}
2323

24-
func GetNodeVersion() (int, error) {
24+
func getNodeVersion() (int, error) {
2525
output, err := nodeVersionOutput()
2626
if err != nil {
2727
return 0, err
@@ -142,7 +142,7 @@ func Install(packages []string, dryRun bool) error {
142142
// warnIfNodeVersionTooLow prints a warning when packages that require Node.js
143143
// v22+ are requested but the installed version is older.
144144
func warnIfNodeVersionTooLow(packages []string) {
145-
nodeVersion, err := GetNodeVersion()
145+
nodeVersion, err := getNodeVersion()
146146
if err != nil || nodeVersion <= 0 {
147147
return
148148
}

internal/npm/npm_command_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestGetNodeVersion_ParsesVersion(t *testing.T) {
5252
t.Cleanup(func() { nodeVersionOutput = orig })
5353
nodeVersionOutput = func() ([]byte, error) { return []byte("v22.1.0\n"), nil }
5454

55-
version, err := GetNodeVersion()
55+
version, err := getNodeVersion()
5656
require.NoError(t, err)
5757
assert.Equal(t, 22, version)
5858
}

internal/npm/npm_extra_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
// ---------------------------------------------------------------------------
14-
// GetNodeVersion — error paths
14+
// getNodeVersion — error paths
1515
// ---------------------------------------------------------------------------
1616

1717
func TestGetNodeVersion_ExecError(t *testing.T) {
@@ -21,7 +21,7 @@ func TestGetNodeVersion_ExecError(t *testing.T) {
2121
return nil, errors.New("node not found")
2222
}
2323

24-
_, err := GetNodeVersion()
24+
_, err := getNodeVersion()
2525
require.Error(t, err)
2626
}
2727

@@ -32,7 +32,7 @@ func TestGetNodeVersion_InvalidFormat(t *testing.T) {
3232
return []byte("not-a-version\n"), nil
3333
}
3434

35-
_, err := GetNodeVersion()
35+
_, err := getNodeVersion()
3636
require.Error(t, err)
3737
}
3838

@@ -43,7 +43,7 @@ func TestGetNodeVersion_EmptyOutput(t *testing.T) {
4343
return []byte(""), nil
4444
}
4545

46-
_, err := GetNodeVersion()
46+
_, err := getNodeVersion()
4747
require.Error(t, err)
4848
}
4949

@@ -340,15 +340,15 @@ func TestGetInstalledPackages_EmptyOutput(t *testing.T) {
340340
}
341341

342342
// ---------------------------------------------------------------------------
343-
// GetNodeVersion — major-only version string edge case
343+
// getNodeVersion — major-only version string edge case
344344
// ---------------------------------------------------------------------------
345345

346346
func TestGetNodeVersion_MajorOnly(t *testing.T) {
347347
orig := nodeVersionOutput
348348
t.Cleanup(func() { nodeVersionOutput = orig })
349349
nodeVersionOutput = func() ([]byte, error) { return []byte("v20\n"), nil }
350350

351-
ver, err := GetNodeVersion()
351+
ver, err := getNodeVersion()
352352
require.NoError(t, err)
353353
assert.Equal(t, 20, ver)
354354
}

internal/npm/npm_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func TestGetNodeVersion(t *testing.T) {
100100
if !IsAvailable() {
101101
t.Skip("node not available")
102102
}
103-
ver, err := GetNodeVersion()
103+
ver, err := getNodeVersion()
104104
assert.NoError(t, err)
105105
assert.Greater(t, ver, 0)
106106
}

internal/system/system.go

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
package system
22

33
import (
4-
"crypto/sha256"
5-
"encoding/hex"
64
"fmt"
7-
"io"
8-
"net/http"
95
"os"
106
"os/exec"
11-
"runtime"
127
"strings"
13-
14-
"github.com/openbootdotdev/openboot/internal/httputil"
158
)
169

1710
func HomeDir() (string, error) {
@@ -22,32 +15,6 @@ func HomeDir() (string, error) {
2215
return home, nil
2316
}
2417

25-
func Architecture() string {
26-
return runtime.GOARCH
27-
}
28-
29-
func HomebrewPrefix() string {
30-
if Architecture() == "arm64" {
31-
return "/opt/homebrew"
32-
}
33-
return "/usr/local"
34-
}
35-
36-
func IsHomebrewInstalled() bool {
37-
_, err := exec.LookPath("brew")
38-
return err == nil
39-
}
40-
41-
func IsXcodeCliInstalled() bool {
42-
cmd := exec.Command("xcode-select", "-p")
43-
return cmd.Run() == nil
44-
}
45-
46-
func IsGumInstalled() bool {
47-
_, err := exec.LookPath("gum")
48-
return err == nil
49-
}
50-
5118
func RunCommand(name string, args ...string) error {
5219
cmd := exec.Command(name, args...) //nolint:gosec // intentional generic runner; callers are responsible for validating name and args
5320
cmd.Stdout = os.Stdout
@@ -70,77 +37,6 @@ func RunCommandOutput(name string, args ...string) (string, error) {
7037
return strings.TrimSpace(string(output)), err
7138
}
7239

73-
// knownBrewInstallHash is the SHA256 of the Homebrew install script pinned on
74-
// 2026-04-19 (Homebrew/install HEAD as of that date). Update this constant
75-
// whenever the installer script changes upstream by running:
76-
//
77-
// curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | sha256sum
78-
const knownBrewInstallHash = "dfd5145fe2aa5956a600e35848765273f5798ce6def01bd08ecec088a1268d91"
79-
80-
const brewInstallURL = "https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh"
81-
82-
// brewHTTPClient is a var so tests can inject a mock transport.
83-
var brewHTTPClient *http.Client = http.DefaultClient
84-
85-
func InstallHomebrew() error {
86-
// Download the installer via httputil.Do so rate-limit handling is applied.
87-
req, err := http.NewRequest(http.MethodGet, brewInstallURL, nil)
88-
if err != nil {
89-
return fmt.Errorf("create homebrew install request: %w", err)
90-
}
91-
resp, err := httputil.Do(brewHTTPClient, req)
92-
if err != nil {
93-
return fmt.Errorf("download homebrew install script: %w", err)
94-
}
95-
defer resp.Body.Close()
96-
97-
if resp.StatusCode != http.StatusOK {
98-
return fmt.Errorf("download homebrew install script: unexpected status %d", resp.StatusCode)
99-
}
100-
101-
scriptBytes, err := io.ReadAll(resp.Body)
102-
if err != nil {
103-
return fmt.Errorf("read homebrew install script: %w", err)
104-
}
105-
106-
// Verify SHA256 before executing anything.
107-
sum := sha256.Sum256(scriptBytes)
108-
got := hex.EncodeToString(sum[:])
109-
if got != knownBrewInstallHash {
110-
return fmt.Errorf("homebrew installer SHA256 mismatch: refusing to execute")
111-
}
112-
113-
// Write verified script to a temp file, execute, then clean up.
114-
tmpFile, err := os.CreateTemp("", "homebrew-install-*.sh")
115-
if err != nil {
116-
return fmt.Errorf("create temp file for homebrew install: %w", err)
117-
}
118-
defer os.Remove(tmpFile.Name())
119-
120-
if _, err := tmpFile.Write(scriptBytes); err != nil {
121-
tmpFile.Close() //nolint:gosec,errcheck // error-path cleanup; original write error takes precedence
122-
return fmt.Errorf("write homebrew install script: %w", err)
123-
}
124-
if err := tmpFile.Close(); err != nil {
125-
return fmt.Errorf("close homebrew install script: %w", err)
126-
}
127-
128-
if err := os.Chmod(tmpFile.Name(), 0700); err != nil { //nolint:gosec // install script must be executable
129-
return fmt.Errorf("chmod homebrew install script: %w", err)
130-
}
131-
132-
tty, opened := OpenTTY()
133-
if opened {
134-
defer tty.Close() //nolint:errcheck // best-effort TTY cleanup
135-
}
136-
137-
cmd := exec.Command(tmpFile.Name()) //nolint:gosec // script content is SHA256-verified before execution
138-
cmd.Stdout = os.Stdout
139-
cmd.Stderr = os.Stderr
140-
cmd.Stdin = tty
141-
return cmd.Run()
142-
}
143-
14440
func GetGitConfig(key string) string {
14541
// Try global first (most common)
14642
output, err := RunCommandSilent("git", "config", "--global", key)

0 commit comments

Comments
 (0)