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 }