shithub: hugo

Download patch

ref: a291f3c5d94a7911f552bf607fef869e312ae3b7
parent: 277425badac8a3397e6c6b4964f4480d71452f16
author: Fabiano Frizzo <[email protected]>
date: Fri Dec 4 06:17:48 EST 2015

Copy only the static files changed

Update on the watcher copy static to copy only the
changed files and add an flag forceSyncStatic to
copy all statics always a static is changed

See #1644 #1559

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -28,6 +28,8 @@
 
 	"github.com/spf13/hugo/parser"
 
+	"regexp"
+
 	"github.com/spf13/cobra"
 	"github.com/spf13/fsync"
 	"github.com/spf13/hugo/helpers"
@@ -40,7 +42,6 @@
 	"github.com/spf13/nitro"
 	"github.com/spf13/viper"
 	"gopkg.in/fsnotify.v1"
-	"regexp"
 )
 
 // userError is an error used to signal different error situations in command handling.
@@ -111,7 +112,7 @@
 var hugoCmdV *cobra.Command
 
 // Flags that are to be added to commands.
-var BuildWatch, IgnoreCache, Draft, Future, UglyURLs, CanonifyURLs, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap, PluralizeListTitles, PreserveTaxonomyNames, NoTimes bool
+var BuildWatch, IgnoreCache, Draft, Future, UglyURLs, CanonifyURLs, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap, PluralizeListTitles, PreserveTaxonomyNames, NoTimes, ForceSync bool
 var Source, CacheDir, Destination, Theme, BaseURL, CfgFile, LogFile, Editor string
 
 // Execute adds all child commands to the root command HugoCmd and sets flags appropriately.
@@ -171,7 +172,7 @@
 	cmd.Flags().BoolVar(&nitro.AnalysisOn, "stepAnalysis", false, "display memory and timing of different steps of the program")
 	cmd.Flags().BoolVar(&PluralizeListTitles, "pluralizeListTitles", true, "Pluralize titles in lists using inflect")
 	cmd.Flags().BoolVar(&PreserveTaxonomyNames, "preserveTaxonomyNames", false, `Preserve taxonomy names as written ("Gérard Depardieu" vs "gerard-depardieu")`)
-
+	cmd.Flags().BoolVarP(&ForceSync, "forceSyncStatic", "", false, "Copy all files when static is changed.")
 	// For bash-completion
 	validConfigFilenames := []string{"json", "js", "yaml", "yml", "toml", "tml"}
 	cmd.Flags().SetAnnotation("config", cobra.BashCompFilenameExt, validConfigFilenames)
@@ -229,6 +230,7 @@
 	viper.SetDefault("DisableLiveReload", false)
 	viper.SetDefault("PluralizeListTitles", true)
 	viper.SetDefault("PreserveTaxonomyNames", false)
+	viper.SetDefault("ForceSyncStatic", false)
 	viper.SetDefault("FootnoteAnchorPrefix", "")
 	viper.SetDefault("FootnoteReturnLinkContents", "")
 	viper.SetDefault("NewContentEditor", "")
@@ -297,6 +299,9 @@
 		if cmdV.Flags().Lookup("preserveTaxonomyNames").Changed {
 			viper.Set("PreserveTaxonomyNames", PreserveTaxonomyNames)
 		}
+		if cmdV.Flags().Lookup("forceSyncStatic").Changed {
+			viper.Set("ForceSyncStatic", ForceSync)
+		}
 		if cmdV.Flags().Lookup("editor").Changed {
 			viper.Set("NewContentEditor", Editor)
 		}
@@ -422,11 +427,11 @@
 }
 
 func copyStatic() error {
-	publishDir := helpers.AbsPathify(viper.GetString("PublishDir")) + "/"
+	publishDir := helpers.AbsPathify(viper.GetString("PublishDir")) + helpers.FilePathSeparator
 
 	// If root, remove the second '/'
 	if publishDir == "//" {
-		publishDir = "/"
+		publishDir = helpers.FilePathSeparator
 	}
 
 	syncer := fsync.NewSyncer()
@@ -446,7 +451,7 @@
 	}
 
 	// Copy the site's own static directory
-	staticDir := helpers.AbsPathify(viper.GetString("StaticDir")) + "/"
+	staticDir := helpers.AbsPathify(viper.GetString("StaticDir")) + helpers.FilePathSeparator
 	if _, err := os.Stat(staticDir); err == nil {
 		jww.INFO.Println("syncing from", staticDir, "to", publishDir)
 		return syncer.Sync(publishDir, staticDir)
@@ -606,11 +611,40 @@
 				}
 
 				if staticChanged {
-					jww.FEEDBACK.Printf("Static file changed, syncing\n\n")
-					err := copyStatic()
-					if err != nil {
-						fmt.Println(err)
-						utils.StopOnErr(err, fmt.Sprintf("Error copying static files to %s", helpers.AbsPathify(viper.GetString("PublishDir"))))
+					jww.FEEDBACK.Printf("Static file changed, syncing\n")
+					if viper.GetBool("ForceSyncStatic") {
+						jww.FEEDBACK.Printf("Syncing all static files\n")
+						err := copyStatic()
+						if err != nil {
+							fmt.Println(err)
+							utils.StopOnErr(err, fmt.Sprintf("Error copying static files to %s", helpers.AbsPathify(viper.GetString("PublishDir"))))
+						}
+					} else {
+
+						syncer := fsync.NewSyncer()
+						syncer.NoTimes = viper.GetBool("notimes")
+						syncer.SrcFs = hugofs.SourceFs
+						syncer.DestFs = hugofs.DestinationFS
+
+						publishDir := helpers.AbsPathify(viper.GetString("PublishDir")) + helpers.FilePathSeparator
+
+						if publishDir == "//" || publishDir == helpers.FilePathSeparator {
+							publishDir = ""
+						}
+
+						for path := range staticFilesChanged {
+							staticPath := filepath.Join(helpers.AbsPathify(viper.GetString("StaticDir")), path)
+							jww.FEEDBACK.Printf("Syncing file '%s'\n", staticPath)
+
+							if _, err := os.Stat(staticPath); err == nil {
+								publishPath := filepath.Join(publishDir, path)
+								jww.INFO.Println("syncing from", staticPath, "to", publishPath)
+								err := syncer.Sync(publishPath, staticPath)
+								if err != nil {
+									jww.FEEDBACK.Printf("Error on syncing file '%s'\n", staticPath)
+								}
+							}
+						}
 					}
 
 					if !BuildWatch && !viper.GetBool("DisableLiveReload") {