mf4
Raw Download raw file
  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}