124 lines
3.4 KiB
Go
124 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"github.com/charmbracelet/bubbles/progress"
|
|
"github.com/charmbracelet/bubbles/spinner"
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
type specialSoftwareModel struct {
|
|
items []string
|
|
index int
|
|
spinner spinner.Model
|
|
progress progress.Model
|
|
done bool
|
|
sudoPassword string
|
|
}
|
|
|
|
func newSpecialSoftwareModel(sudoPassword string) specialSoftwareModel {
|
|
items := []string{"oh-my-posh", "oh-my-zsh"}
|
|
|
|
p := progress.New(
|
|
progress.WithDefaultGradient(),
|
|
progress.WithWidth(40),
|
|
progress.WithoutPercentage(),
|
|
)
|
|
s := spinner.New()
|
|
s.Style = lipgloss.NewStyle().Foreground(lipgloss.Color("63"))
|
|
|
|
return specialSoftwareModel{
|
|
items: items,
|
|
spinner: s,
|
|
progress: p,
|
|
sudoPassword: sudoPassword,
|
|
}
|
|
}
|
|
|
|
func (m specialSoftwareModel) Init() tea.Cmd {
|
|
return tea.Batch(m.installItemCmd(m.items[m.index]), m.spinner.Tick)
|
|
}
|
|
|
|
func (m specialSoftwareModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|
switch msg := msg.(type) {
|
|
case tea.KeyMsg:
|
|
switch msg.String() {
|
|
case "ctrl+c", "esc", "q":
|
|
return m, tea.Quit
|
|
}
|
|
case installedItemMsg:
|
|
if m.index >= len(m.items)-1 {
|
|
m.done = true
|
|
return m, tea.Quit
|
|
}
|
|
|
|
m.index++
|
|
progressCmd := m.progress.SetPercent(float64(m.index) / float64(len(m.items)))
|
|
|
|
return m, tea.Batch(
|
|
progressCmd,
|
|
tea.Printf("%s %s", checkMark, m.items[m.index-1]),
|
|
m.installItemCmd(m.items[m.index]),
|
|
)
|
|
case spinner.TickMsg:
|
|
var cmd tea.Cmd
|
|
m.spinner, cmd = m.spinner.Update(msg)
|
|
return m, cmd
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
func (m specialSoftwareModel) View() string {
|
|
if m.done {
|
|
return doneStyle.Render("Spezielle Software Installation abgeschlossen!\n")
|
|
}
|
|
|
|
spin := m.spinner.View() + " "
|
|
prog := m.progress.View()
|
|
info := fmt.Sprintf("Installiere %s", m.items[m.index])
|
|
|
|
return spin + info + " " + prog
|
|
}
|
|
|
|
func (m specialSoftwareModel) installItemCmd(item string) tea.Cmd {
|
|
return func() tea.Msg {
|
|
switch item {
|
|
case "oh-my-posh":
|
|
if _, err := exec.LookPath("oh-my-posh"); err == nil {
|
|
return installedItemMsg(item)
|
|
}
|
|
err := executeShellCommand("curl -s https://ohmyposh.dev/install.sh | bash -s", "")
|
|
if err != nil {
|
|
log.Printf("Fehler bei der Installation von oh-my-posh: %v\n", err)
|
|
}
|
|
case "oh-my-zsh":
|
|
if _, err := os.Stat(os.Getenv("HOME") + "/.oh-my-zsh"); !os.IsNotExist(err) {
|
|
return installedItemMsg(item)
|
|
}
|
|
err := executeShellCommand(`sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"`, "")
|
|
if err != nil {
|
|
log.Printf("Fehler bei der Installation von Oh My Zsh: %v\n", err)
|
|
}
|
|
|
|
plugins := []string{
|
|
"git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions",
|
|
"git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting",
|
|
"git clone https://github.com/zdharma-continuum/fast-syntax-highlighting.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting",
|
|
"git clone --depth 1 -- https://github.com/marlonrichert/zsh-autocomplete.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autocomplete",
|
|
}
|
|
|
|
for _, plugin := range plugins {
|
|
err := executeShellCommand(plugin, "")
|
|
if err != nil {
|
|
log.Printf("Fehler bei der Installation des Plugins: %v\n", err)
|
|
}
|
|
}
|
|
}
|
|
return installedItemMsg(item)
|
|
}
|
|
}
|