129 lines
3.1 KiB
Go
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
|
|
}
|