Handle self rename operations gracefully
authorSteve Francia <steve.francia@gmail.com>
Mon, 25 Jan 2016 19:40:44 +0000 (14:40 -0500)
committerSteve Francia <steve.francia@gmail.com>
Tue, 26 Jan 2016 19:33:08 +0000 (14:33 -0500)
commands/hugo.go
hugolib/site.go

index b186057c839bbc67492f758a70d715e59b1976ef..89a2f7ed5c5c12ff2537e45d3316467d68dd9675 100644 (file)
@@ -483,6 +483,7 @@ func copyStatic() error {
                publishDir = helpers.FilePathSeparator
        }
 
+       // Includes both theme/static & /static
        staticSourceFs := getStaticSourceFs()
 
        if staticSourceFs == nil {
@@ -499,8 +500,12 @@ func copyStatic() error {
        syncer.Delete = true
        jww.INFO.Println("syncing static files to", publishDir)
 
-       // because we are using a baseFs (to get the union right). Sync from the root
-       syncer.Sync(publishDir, helpers.FilePathSeparator)
+       // because we are using a baseFs (to get the union right).
+       // set sync src to root
+       err := syncer.Sync(publishDir, helpers.FilePathSeparator)
+       if err != nil {
+               return err
+       }
        return nil
 //
 //     themeDir, err := helpers.GetThemeStaticDirPath()
@@ -718,7 +723,6 @@ func NewWatcher(port int) error {
                                                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 {
index 1d1f1cc1b5356a1108ae02e1a77156d5617b8b05..6c66aa8378abcd5a3e792a34c031494d0fba6b78 100644 (file)
@@ -44,6 +44,7 @@ import (
        "github.com/spf13/nitro"
        "github.com/spf13/viper"
        "gopkg.in/fsnotify.v1"
+       "github.com/spf13/afero"
 )
 
 var _ = transform.AbsURL
@@ -500,13 +501,26 @@ func (s *Site) ReBuild(events []fsnotify.Event) error {
                go converterCollator(s, convertResults, errs)
 
                for _, ev := range sourceChanged {
-                       if ev.Op&fsnotify.Rename == fsnotify.Rename || ev.Op&fsnotify.Remove == fsnotify.Remove {
+
+                       if  ev.Op&fsnotify.Remove == fsnotify.Remove {
                                //remove the file & a create will follow
                                path, _ := helpers.GetRelativePath(ev.Name, s.absContentDir())
                                s.RemovePageByPath(path)
                                continue
                        }
 
+                       // Some editors (Vim) sometimes issue only a Rename operation when writing an existing file
+                       // Sometimes a rename operation means that file has been renamed other times it means
+                       // it's been updated
+                       if ev.Op&fsnotify.Rename == fsnotify.Rename {
+                               // If the file is still on disk, it's only been updated, if it's not, it's been moved
+                               if ex, err := afero.Exists(hugofs.SourceFs, ev.Name); !ex || err != nil {
+                                       path, _ := helpers.GetRelativePath(ev.Name, s.absContentDir())
+                                       s.RemovePageByPath(path)
+                                       continue
+                               }
+                       }
+
                        file, err := s.ReReadFile(ev.Name)
                        if err != nil {
                                errs <- err