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) } }