-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathinstaller.go
More file actions
111 lines (92 loc) · 2.57 KB
/
Copy pathinstaller.go
File metadata and controls
111 lines (92 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package main
import (
"builder/installer"
"flag"
"fmt"
"os"
"path/filepath"
"regexp"
"github.com/roemer/gover"
)
//////////
// Configuration
//////////
var versionRegex *regexp.Regexp = regexp.MustCompile(`(?m)^v(?P<raw>(\d+)\.(\d+)\.(\d+))$`)
//////////
// Main
//////////
func main() {
if err := runMain(); err != nil {
fmt.Printf("Error: %v\n", err)
os.Exit(1)
}
}
func runMain() error {
// Handle the flags
version := flag.String("version", "latest", "")
downloadUrl := flag.String("downloadUrl", "", "")
flag.Parse()
// Load settings from an external file
if err := installer.LoadOverrides(); err != nil {
return err
}
// Apply override logic for URLs
installer.HandleGitHubOverride(downloadUrl, "anthropics/claude-code", "claude-code-download-url")
// Create and process the feature
feature := installer.NewFeature("claude-code", false,
&claudeCodeComponent{
ComponentBase: installer.NewComponentBase("claude-code", *version),
DownloadUrl: *downloadUrl,
})
return feature.Process()
}
//////////
// Implementation
//////////
type claudeCodeComponent struct {
*installer.ComponentBase
DownloadUrl string
}
func (c *claudeCodeComponent) GetAllVersions() ([]*gover.Version, error) {
tags, err := installer.Tools.GitHub.GetTags("anthropics", "claude-code")
if err != nil {
return nil, err
}
return installer.Tools.Versioning.ParseVersionsFromList(tags, versionRegex, true)
}
func (c *claudeCodeComponent) InstallVersion(version *gover.Version) error {
archPart, err := installer.Tools.System.MapArchitecture(map[string]string{
installer.AMD64: "x64",
installer.ARM64: "arm64",
})
if err != nil {
return err
}
// Use musl variant for Alpine (musl libc)
var fileName string
if installer.Tools.System.OsInfo().IsAlpine() {
fileName = fmt.Sprintf("claude-linux-%s-musl.tar.gz", archPart)
} else {
fileName = fmt.Sprintf("claude-linux-%s.tar.gz", archPart)
}
// Download the file from GitHub releases
downloadUrl, err := installer.Tools.Http.BuildUrl(c.DownloadUrl, "v"+version.Raw, fileName)
if err != nil {
return err
}
if err := installer.Tools.Download.ToFile(downloadUrl, fileName, "claude-code"); err != nil {
return err
}
defer os.Remove(fileName)
// Extract to a temp directory
tempDir, err := os.MkdirTemp("", "claude-code-extract")
if err != nil {
return err
}
defer os.RemoveAll(tempDir)
if err := installer.Tools.Compression.ExtractTarGz(fileName, tempDir, false); err != nil {
return err
}
// Install the binary
return installer.Tools.System.InstallBinaryToUsrLocalBin(filepath.Join(tempDir, "claude"), "claude")
}