ref: 5e97cf3020284859ddaba528801329a54cf95847
parent: 3a412543f617cf9fa460061aa5a33db43675c9f9
author: Safonov Nikita <[email protected]>
date: Fri Sep 25 20:39:46 EDT 2015
Add force flag If flag is passed the site will be created inside non-empty folder only if there are no existent folders or config with the same name hugo creates. Resolves: #1163
--- a/commands/new.go
+++ b/commands/new.go
@@ -20,6 +20,7 @@
"strings"
"time"
+ "errors"
"github.com/spf13/cobra"
"github.com/spf13/hugo/create"
"github.com/spf13/hugo/helpers"
@@ -37,6 +38,7 @@
func init() {
newSiteCmd.Flags().StringVarP(&configFormat, "format", "f", "toml", "config & frontmatter format")
+ newSiteCmd.Flags().Bool("force", false, "Init inside non-empty directory")
newCmd.Flags().StringVarP(&configFormat, "format", "f", "toml", "frontmatter format")
newCmd.Flags().StringVarP(&contentType, "kind", "k", "", "Content type to create")
newCmd.AddCommand(newSiteCmd)
@@ -104,6 +106,45 @@
}
}
+func doNewSite(basepath string, force bool) error {
+ dirs := []string{
+ filepath.Join(basepath, "layouts"),
+ filepath.Join(basepath, "content"),
+ filepath.Join(basepath, "archetypes"),
+ filepath.Join(basepath, "static"),
+ filepath.Join(basepath, "data"),
+ }
+
+ if exists, _ := helpers.Exists(basepath, hugofs.SourceFs); exists {
+ if isDir, _ := helpers.IsDir(basepath, hugofs.SourceFs); !isDir {
+ return errors.New(basepath + " already exists but not a directory")
+ }
+
+ isEmpty, _ := helpers.IsEmpty(basepath, hugofs.SourceFs)
+
+ switch {
+ case !isEmpty && !force:
+ return errors.New(basepath + " already exists")
+
+ case !isEmpty && force:
+ all := append(dirs, filepath.Join(basepath, "config."+configFormat))
+ for _, path := range all {
+ if exists, _ := helpers.Exists(path, hugofs.SourceFs); exists {
+ return errors.New(path + " already exists")
+ }
+ }
+ }
+ }
+
+ for _, dir := range dirs {
+ hugofs.SourceFs.MkdirAll(dir, 0777)
+ }
+
+ createConfig(basepath, configFormat)
+
+ return nil
+}
+
// NewSite creates a new hugo site and initializes a structured Hugo directory.
func NewSite(cmd *cobra.Command, args []string) {
if len(args) < 1 {
@@ -117,22 +158,10 @@
jww.FATAL.Fatalln(err)
}
- if x, _ := helpers.Exists(createpath, hugofs.SourceFs); x {
- y, _ := helpers.IsDir(createpath, hugofs.SourceFs)
- if z, _ := helpers.IsEmpty(createpath, hugofs.SourceFs); y && z {
- jww.INFO.Println(createpath, "already exists and is empty")
- } else {
- jww.FATAL.Fatalln(createpath, "already exists and is not empty")
- }
+ forceNew, _ := cmd.Flags().GetBool("force")
+ if err := doNewSite(createpath, forceNew); err != nil {
+ jww.FATAL.Fatalln(err)
}
-
- mkdir(createpath, "layouts")
- mkdir(createpath, "content")
- mkdir(createpath, "archetypes")
- mkdir(createpath, "static")
- mkdir(createpath, "data")
-
- createConfig(createpath, configFormat)
}
// NewTheme creates a new Hugo theme.
--- a/commands/new_test.go
+++ b/commands/new_test.go
@@ -1,9 +1,12 @@
package commands
import (
+ "github.com/spf13/afero"
+ "github.com/spf13/hugo/hugofs"
"github.com/stretchr/testify/assert"
"path/filepath"
"testing"
+ "os"
)
// Issue #1133
@@ -11,4 +14,66 @@
p, s := newContentPathSection("/post/new.md")
assert.Equal(t, filepath.FromSlash("/post/new.md"), p)
assert.Equal(t, "post", s)
+}
+
+func checkNewSiteInited(basepath string, t *testing.T) {
+ paths := []string{
+ filepath.Join(basepath, "layouts"),
+ filepath.Join(basepath, "content"),
+ filepath.Join(basepath, "archetypes"),
+ filepath.Join(basepath, "static"),
+ filepath.Join(basepath, "data"),
+ filepath.Join(basepath, "config.toml"),
+ }
+
+ for _, path := range paths {
+ _, err := hugofs.SourceFs.Stat(path)
+ assert.Nil(t, err)
+ }
+}
+
+func TestDoNewSite(t *testing.T) {
+ basepath := filepath.Join(os.TempDir(), "blog")
+ hugofs.SourceFs = new(afero.MemMapFs)
+ err := doNewSite(basepath, false)
+ assert.Nil(t, err)
+
+ checkNewSiteInited(basepath, t)
+}
+
+func TestDoNewSite_error_base_exists(t *testing.T) {
+ basepath := filepath.Join(os.TempDir(), "blog")
+ hugofs.SourceFs = new(afero.MemMapFs)
+ hugofs.SourceFs.MkdirAll(basepath, 777)
+ err := doNewSite(basepath, false)
+ assert.NotNil(t, err)
+}
+
+func TestDoNewSite_force_empty_dir(t *testing.T) {
+ basepath := filepath.Join(os.TempDir(), "blog")
+ hugofs.SourceFs = new(afero.MemMapFs)
+ hugofs.SourceFs.MkdirAll(basepath, 777)
+ err := doNewSite(basepath, true)
+ assert.Nil(t, err)
+
+ checkNewSiteInited(basepath, t)
+}
+
+func TestDoNewSite_error_force_dir_inside_exists(t *testing.T) {
+ basepath := filepath.Join(os.TempDir(), "blog")
+ contentPath := filepath.Join(basepath, "content")
+ hugofs.SourceFs = new(afero.MemMapFs)
+ hugofs.SourceFs.MkdirAll(contentPath, 777)
+ err := doNewSite(basepath, true)
+ assert.NotNil(t, err)
+}
+
+func TestDoNewSite_error_force_config_inside_exists(t *testing.T) {
+ basepath := filepath.Join(os.TempDir(), "blog")
+ configPath := filepath.Join(basepath, "config.toml")
+ hugofs.SourceFs = new(afero.MemMapFs)
+ hugofs.SourceFs.MkdirAll(basepath, 777)
+ hugofs.SourceFs.Create(configPath)
+ err := doNewSite(basepath, true)
+ assert.NotNil(t, err)
}