ref: c1b5a48f4e3d91b38156006e5362bf2b545818db
parent: 00d04774f0d9789262557af6a6465d8b6271839d
author: Anthony Fok <foka@debian.org>
date: Wed Dec 2 18:51:48 EST 2015
Add sanity checks for `hugo import jekyll` Also add `--force` flag copied from `hugo new site`. Fixes #1625
--- a/commands/import_jekyll.go
+++ b/commands/import_jekyll.go
@@ -57,6 +57,10 @@
RunE: importFromJekyll,
}
+func init() {+ importJekyllCmd.Flags().Bool("force", false, "Allow import into non-empty target directory")+}
+
func importFromJekyll(cmd *cobra.Command, args []string) error {jww.SetLogThreshold(jww.LevelTrace)
jww.SetStdoutThreshold(jww.LevelWarn)
@@ -75,9 +79,17 @@
return newUserError("Path error:", args[1])}
- createSiteFromJekyll(jekyllRoot, targetDir)
-
jww.INFO.Println("Import Jekyll from:", jekyllRoot, "to:", targetDir)+
+ if strings.HasPrefix(targetDir, jekyllRoot) {+ return newUserError("Target path should not be inside the Jekyll root, aborting.")+ }
+
+ forceImport, _ := cmd.Flags().GetBool("force")+ if err := createSiteFromJekyll(jekyllRoot, targetDir, forceImport); err != nil {+ return newUserError(err)
+ }
+
fmt.Println("Importing...")fileCount := 0
@@ -117,16 +129,50 @@
if err != nil {return err
} else {- fmt.Println("Congratulations!", fileCount, "posts imported!")- fmt.Println("Now, start Hugo by yourself: \n" ++ fmt.Println("Congratulations!", fileCount, "post(s) imported!")+ fmt.Println("Now, start Hugo by yourself:\n" +"$ git clone https://github.com/spf13/herring-cove.git " + args[1] + "/themes/herring-cove")
- fmt.Println("$ cd " + args[1] + "\n$ hugo server -w --theme=herring-cove")+ fmt.Println("$ cd " + args[1] + "\n$ hugo server --theme=herring-cove")}
return nil
}
-func createSiteFromJekyll(jekyllRoot, targetDir string) {+// TODO: Consider calling doNewSite() instead?
+func createSiteFromJekyll(jekyllRoot, targetDir string, force bool) error {+ fs := hugofs.SourceFs
+ if exists, _ := helpers.Exists(targetDir, fs); exists {+ if isDir, _ := helpers.IsDir(targetDir, fs); !isDir {+ return errors.New("Target path \"" + targetDir + "\" already exists but not a directory")+ }
+
+ isEmpty, _ := helpers.IsEmpty(targetDir, fs)
+
+ if !isEmpty && !force {+ return errors.New("Target path \"" + targetDir + "\" already exists and is not empty")+ }
+ }
+
+ jekyllConfig := loadJekyllConfig(jekyllRoot)
+
+ // Crude test to make sure at least one of _drafts/ and _posts/ exists
+ // and is not empty.
+ hasPostsOrDrafts := false
+ postsDir := filepath.Join(jekyllRoot, "_posts")
+ draftsDir := filepath.Join(jekyllRoot, "_drafts")
+ for _, d := range []string{postsDir, draftsDir} {+ if exists, _ := helpers.Exists(d, fs); exists {+ if isDir, _ := helpers.IsDir(d, fs); isDir {+ if isEmpty, _ := helpers.IsEmpty(d, fs); !isEmpty {+ hasPostsOrDrafts = true
+ }
+ }
+ }
+ }
+ if !hasPostsOrDrafts {+ return errors.New("Your Jekyll root contains neither posts nor drafts, aborting.")+ }
+
mkdir(targetDir, "layouts")
mkdir(targetDir, "content")
mkdir(targetDir, "archetypes")
@@ -134,10 +180,11 @@
mkdir(targetDir, "data")
mkdir(targetDir, "themes")
- jekyllConfig := loadJekyllConfig(jekyllRoot)
createConfigFromJekyll(targetDir, "yaml", jekyllConfig)
copyJekyllFilesAndFolders(jekyllRoot, filepath.Join(targetDir, "static"))
+
+ return nil
}
func loadJekyllConfig(jekyllRoot string) map[string]interface{} {@@ -147,6 +194,7 @@
exists, err := helpers.Exists(path, fs)
if err != nil || !exists {+ jww.WARN.Println("_config.yaml not found: Is the specified Jekyll root correct?")return nil
}
--
⑨