This repository has been archived on 2025-03-15. You can view files and clone it, but cannot push or open issues or pull requests.
hui/internal/ui/new.go
2024-07-31 19:10:32 +02:00

129 lines
3.1 KiB
Go

package ui
import (
"fmt"
"log"
"os/exec"
"path/filepath"
"sort"
"github.com/go-git/go-git/v5"
"github.com/gotk3/gotk3/glib"
"varia.zone/hui/internal/bldr"
"varia.zone/hui/internal/conf"
"varia.zone/hui/internal/model"
)
// hugoNewSite creates a new Hugo site.
func hugoNewSite(m *model.Model, siteName string) error {
newSiteDir := conf.NewSiteDir(m.User.HomeDir, siteName)
hugoBinPath := conf.HugoBinPath(m.User.HomeDir)
cmd := exec.Command(hugoBinPath, "new", "site", newSiteDir)
if err := cmd.Run(); err != nil {
return fmt.Errorf("unable to create new site: %s", err)
}
// TODO(d1): allow users to choose a default theme
if _, err := git.PlainClone(filepath.Join(newSiteDir, "themes", "nostyleplease"), false, &git.CloneOptions{
URL: "https://github.com/g-hanwen/hugo-theme-nostyleplease",
}); err != nil {
return fmt.Errorf("unable to clone 'nostyleplease' theme: %s", err)
}
return nil
}
// ShowNewSiteDialog shows the new site dialog.
func ShowNewSiteDialog(m *model.Model) error {
dialog, err := bldr.GetDialog(m.Builder, conf.NewSiteDialog)
if err != nil {
return err
}
dialog.Show()
return nil
}
// HideNewSiteDialog hides the new site dialog.
func HideNewSiteDialog(m *model.Model) error {
dialog, err := bldr.GetDialog(m.Builder, conf.NewSiteDialog)
if err != nil {
return err
}
dialog.Hide()
return nil
}
// CreateNewSite handles the creation of a new site.
func CreateNewSite(m *model.Model) error {
if err := HideNewSiteDialog(m); err != nil {
return fmt.Errorf("CreateNewSite: %s", err)
}
entry, err := bldr.GetEntry(m.Builder, conf.NewSiteNameEntry)
if err != nil {
return fmt.Errorf("CreateNewSite: %s", err)
}
siteName, err := entry.GetText()
if err != nil {
return fmt.Errorf("CreateNewSite: %s", err)
}
msg := fmt.Sprintf("Creating new site '%s'...", siteName)
if err := SwitchStackPage(m, conf.BusyStackPage, msg); err != nil {
return fmt.Errorf("CreateNewSite: %s", err)
}
go func() {
if err := hugoNewSite(m, siteName); err != nil {
glib.IdleAdd(func() bool {
if err := ShowErrDialog(m, err); err != nil {
log.Fatal(fmt.Errorf("CreateNewSite: unable to show error dialog: %s", err))
}
return false
})
}
glib.IdleAdd(func() bool {
m.CurrentSite = siteName
if err := SetHeaderBarSubtitle(m, m.CurrentSite); err != nil {
if err := ShowErrDialog(m, err); err != nil {
log.Fatal(fmt.Errorf("CreateNewSite: unable to show error dialog: %s", err))
}
}
m.SiteNames = append(m.SiteNames, siteName)
sort.Strings(m.SiteNames)
if err := PopulateOpenSiteMenu(m); err != nil {
if err := ShowErrDialog(m, err); err != nil {
log.Fatal(fmt.Errorf("CreateNewSite: unable to show error dialog: %s", err))
}
}
if err := SwitchStackPage(m, conf.ContentStackPage); err != nil {
if err := ShowErrDialog(m, err); err != nil {
log.Fatal(fmt.Errorf("CreateNewSite: unable to show error dialog: %s", err))
}
}
if err := ShowContentButtons(m); err != nil {
if err := ShowErrDialog(m, err); err != nil {
log.Fatal(fmt.Errorf("CreateNewSite: unable to show error dialog: %s", err))
}
}
return false
})
}()
return nil
}