mf4
1package golang
2
3import (
4 _ "embed"
5 "text/template"
6
7 "archive/tar"
8 "bytes"
9 "compress/gzip"
10 "errors"
11 "fmt"
12 "io"
13 "os"
14 "path/filepath"
15)
16
17//go:embed go1.*.linux-amd64.tar.gz
18var goSrc []byte
19
20func bashrcd() error {
21 // TODO: installDir
22 homeDir := os.Getenv("HOME")
23 installDir := filepath.Join(homeDir, ".local")
24 rcPath := filepath.Join(homeDir, ".bashrc.d", "go.sh")
25
26 const tmpl = `#!/bin/bash
27export PATH=$PATH:{{ .InstallDir }}/go/bin
28`
29
30 t, err := template.New("pathRC").Parse(tmpl)
31 if err != nil {
32 return err
33 }
34 f, err := os.Create(rcPath)
35 if err != nil {
36 return err
37 }
38 err = t.Execute(f, struct{ InstallDir string }{InstallDir: installDir})
39 if err != nil {
40 return err
41 }
42 return nil
43}
44
45func Install() error {
46 // TODO: installDir
47 homeDir := os.Getenv("HOME")
48 installDir := filepath.Join(homeDir, ".local")
49
50 err := bashrcd()
51 if err != nil {
52 return fmt.Errorf("failed to install bashrc.d env helper: %w", err)
53 }
54
55 err = os.RemoveAll(installDir)
56 if err != nil {
57 return fmt.Errorf("failed to cleanup old install: %w", err)
58 }
59
60 gr, err := gzip.NewReader(bytes.NewReader(goSrc))
61 if err != nil {
62 return fmt.Errorf("failed to setup gzip reader: %w", err)
63 }
64 tr := tar.NewReader(gr)
65
66 for {
67 header, err := tr.Next()
68 if err != nil {
69 if errors.Is(err, io.EOF) {
70 break
71 }
72 return err
73 }
74 mode := os.FileMode(header.Mode)
75
76 target := filepath.Join(installDir, header.Name)
77 switch header.Typeflag {
78 case tar.TypeDir:
79 err = os.MkdirAll(target, mode)
80 if err != nil {
81 return err
82 }
83
84 case tar.TypeReg:
85 flag := os.O_CREATE | os.O_WRONLY | os.O_TRUNC
86 f, err := os.OpenFile(target, flag, mode)
87 if err != nil {
88 return err
89 }
90 _, err = io.Copy(f, tr)
91 if err != nil {
92 return err
93 }
94 err = f.Close()
95 if err != nil {
96 return err
97 }
98 }
99 }
100
101 return nil
102}