Commit a2327ba

bryfry <bryon@fryer.io>
2025-08-09 13:46:08
nvim
1 parent 9653e7d
internal/golang/golang.go
@@ -48,18 +48,18 @@ func Install() error {
 
 	err := bashrcd()
 	if err != nil {
-		return fmt.Errorf("failed to install bashrc.d env helper: %w", err)
+		return fmt.Errorf("installing bashrc.d env helper: %w", err)
 	}
 
 	goDir := filepath.Join(installDir, "go")
 	err = os.RemoveAll(goDir)
 	if err != nil {
-		return fmt.Errorf("failed to cleanup old install: %w", err)
+		return fmt.Errorf("cleaning up old install: %w", err)
 	}
 
 	gr, err := gzip.NewReader(bytes.NewReader(goSrc))
 	if err != nil {
-		return fmt.Errorf("failed to setup gzip reader: %w", err)
+		return fmt.Errorf("setting up gzip reader: %w", err)
 	}
 	tr := tar.NewReader(gr)
 
internal/nvim/nvim-linux-x86_64.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02b808a3ee8fc30161e07fe3c3edfb24b28bd0295323ac5dbdd8ec7012cac67d
+size 10941468
internal/nvim/nvim.go
@@ -0,0 +1,125 @@
+package nvim
+
+import (
+	_ "embed"
+	"text/template"
+
+	"archive/tar"
+	"bytes"
+	"compress/gzip"
+	"errors"
+	"fmt"
+	"io"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+//go:embed nvim-linux-x86_64.tar.gz
+var nvimSrc []byte
+
+func bashrcd() error {
+	homeDir := os.Getenv("HOME")
+	installDir := filepath.Join(homeDir, ".local")
+	rcPath := filepath.Join(homeDir, ".bashrc.d", "nvim.sh")
+
+	const tmpl = `#!/bin/bash
+export PATH=$PATH:{{ .InstallDir }}/bin
+`
+
+	t, err := template.New("pathRC").Parse(tmpl)
+	if err != nil {
+		return err
+	}
+	f, err := os.Create(rcPath)
+	if err != nil {
+		return err
+	}
+	err = t.Execute(f, struct{ InstallDir string }{InstallDir: installDir})
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func Install() error {
+	homeDir := os.Getenv("HOME")
+	installDir := filepath.Join(homeDir, ".local")
+
+	err := bashrcd()
+	if err != nil {
+		err := fmt.Errorf("installing bashrc.d env helper: %w", err)
+		return err
+	}
+
+	nvimShareDir := filepath.Join(installDir, "share/nvim")
+	nvimLibDir := filepath.Join(installDir, "lib/nvim")
+	nvimBin := filepath.Join(installDir, "bin/nvim")
+	for _, path := range []string{nvimShareDir, nvimLibDir, nvimBin} {
+		err = os.RemoveAll(path)
+		if err != nil {
+			return fmt.Errorf("cleaning up old install path=%q: %w", path, err)
+		}
+	}
+
+	gr, err := gzip.NewReader(bytes.NewReader(nvimSrc))
+	if err != nil {
+		return fmt.Errorf("setting up gzip reader: %w", err)
+	}
+	tr := tar.NewReader(gr)
+
+	for {
+		header, err := tr.Next()
+		if err != nil {
+			if errors.Is(err, io.EOF) {
+				break
+			}
+			return err
+		}
+		mode := os.FileMode(header.Mode)
+
+		target := filepath.Join(installDir, header.Name)
+
+		// Strip the first component (nvim-linux-x86_64/)
+		parts := strings.Split(header.Name, "/")
+		if len(parts) > 0 {
+			parts = parts[1:]
+			if len(parts) == 0 {
+				continue
+			}
+			target = filepath.Join(append([]string{installDir}, parts...)...)
+		}
+
+		switch header.Typeflag {
+		case tar.TypeDir:
+			err = os.MkdirAll(target, mode)
+			if err != nil {
+				return err
+			}
+
+		case tar.TypeReg:
+			// Ensure parent directory exists
+			dir := filepath.Dir(target)
+			err = os.MkdirAll(dir, 0755)
+			if err != nil {
+				return err
+			}
+
+			flag := os.O_CREATE | os.O_WRONLY | os.O_TRUNC
+			f, err := os.OpenFile(target, flag, mode)
+			if err != nil {
+				return err
+			}
+			_, err = io.Copy(f, tr)
+			if err != nil {
+				return err
+			}
+			err = f.Close()
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	return nil
+}
.gitignore
@@ -0,0 +1,1 @@
+bindle
main.go
@@ -10,6 +10,7 @@ import (
 
 	"github.com/bryfry/bindle/internal/extractor"
 	"github.com/bryfry/bindle/internal/golang"
+	"github.com/bryfry/bindle/internal/nvim"
 )
 
 //go:embed home/**
@@ -41,4 +42,10 @@ func main() {
 		fmt.Println(err)
 		return // fmt.Errorf("config deploy failed: %w", path, err)
 	}
+
+	err = nvim.Install()
+	if err != nil {
+		fmt.Println(err)
+		return // fmt.Errorf("config deploy failed: %w", path, err)
+	}
 }