shithub: hugo

Download patch

ref: d08e4c87a72f57a836722700900690857a4225cb
parent: b0b4b821651c7fa2866816ced0c1a1a52ca094ed
author: Steve Francia <[email protected]>
date: Tue Jan 26 09:12:18 EST 2016

Rewrite commentary on static event handling

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -507,32 +507,6 @@
 		return err
 	}
 	return nil
-//
-//	themeDir, err := helpers.GetThemeStaticDirPath()
-//	if err != nil {
-//		jww.WARN.Println(err)
-//	}
-//
-//	staticDir := helpers.GetStaticDirPath() + helpers.FilePathSeparator
-//	if _, err := os.Stat(staticDir); os.IsNotExist(err) {
-//		jww.WARN.Println("Unable to find Static Directory:", staticDir)
-//	}
-//
-//	// Copy the theme's static directory
-//	if themeDir != "" {
-//		jww.INFO.Println("syncing from", themeDir, "to", publishDir)
-//		utils.CheckErr(syncer.Sync(publishDir, themeDir), fmt.Sprintf("Error copying static files of theme to %s", publishDir))
-//	}
-//
-//	// Copy the site's own static directory
-//	staticDir := helpers.GetStaticDirPath() + helpers.FilePathSeparator
-//	if _, err := os.Stat(staticDir); err == nil {
-//		jww.INFO.Println("syncing from", staticDir, "to", publishDir)
-//		return syncer.Sync(publishDir, staticDir)
-//	} else if os.IsNotExist(err) {
-//		jww.WARN.Println("Unable to find Static Directory:", staticDir)
-//	}
-//	return nil
 }
 
 // getDirList provides NewWatcher() with a list of directories to watch for changes.
@@ -653,8 +627,8 @@
 			case evs := <-watcher.Events:
 				jww.INFO.Println("Recieved System Events:", evs)
 
-				staticEvents := []fsnotify.Event{} //ev make(map[string]bool)
-				dynamicEvents := []fsnotify.Event{} //make(map[string]bool)
+				staticEvents := []fsnotify.Event{}
+				dynamicEvents := []fsnotify.Event{}
 
 				for _, ev := range evs {
 					ext := filepath.Ext(ev.Name)
@@ -700,7 +674,6 @@
 
 					if isstatic {
 						staticEvents = append(staticEvents, ev)
-//						}
 					} else {
 						dynamicEvents = append(dynamicEvents, ev)
 					}
@@ -715,7 +688,6 @@
 					}
 
 					jww.FEEDBACK.Println("\n Static file changes detected")
-					jww.FEEDBACK.Println("syncing to", publishDir)
 					const layout = "2006-01-02 15:04 -0700"
 					fmt.Println(time.Now().Format(layout))
 
@@ -744,17 +716,17 @@
 							// into one we can't accurately remove a file not in one of the source directories.
 							// If a file is in the local static dir and also in the theme static dir and we remove
 							// it from one of those locations we expect it to still exist in the destination
-							// If a file is generated by the content over a static file we expect it to remain as well.
-							// Because we are never certain if the file was overwritten by the content generation
-							// We can't effectively remove anything.
 							//
-							// This leads to two approaches:
-							// 1. Not overwrite anything
-							// 2. Assume these cases are rare and overwrite anyway. If things get out of sync
-							// a clean sync will be needed.
-							// There is an alternative which is quite heavy. We would have to track every single file
-							// placed into the publishedPath and which pipeline put it there.
-							// We have chosen to take the 2nd approach
+							// If Hugo generates a file (from the content dir) over a static file
+							// the content generated file should take precedence.
+							//
+							// Because we are now watching and handling individual events it is possible that a static
+							// event that occupies the same path as a content generated file will take precedence
+							// until a regeneration of the content takes places.
+							//
+							// Hugo assumes that these cases are very rare and will permit this bad behavior
+							// The alternative is to track every single file and which pipeline rendered it
+							// and then to handle conflict resolution on every event.
 							fmt.Println(ev)
 
 							fromPath := ev.Name
@@ -765,13 +737,17 @@
 								fmt.Println(err)
 								continue
 							}
-							fmt.Println("relpath", relPath)
 
-
-							// if remove or rename ignore.. as in leave the old file in the publishDir
+							// Remove || rename is harder and will require an assumption.
+							// Hugo takes the following approach:
+							// If the static file exists in any of the static source directories after this event
+							// Hugo will re-sync it.
+							// If it does not exist in all of the static directories Hugo will remove it.
+							//
+							// This assumes that Hugo has not generated content on top of a static file and then removed
+							// the source of that static file. In this case Hugo will incorrectly remove that file
+							// from the published directory.
 							if ev.Op&fsnotify.Rename == fsnotify.Rename || ev.Op&fsnotify.Remove == fsnotify.Remove {
-								// What about the case where a file in the theme is moved so the local static file can
-								// take it's place.
 								if _, err := staticSourceFs.Stat(relPath); os.IsNotExist(err) {
 									// If file doesn't exist in any static dir, remove it
 									toRemove :=filepath.Join(publishDir, relPath)
@@ -788,19 +764,9 @@
 								continue
 							}
 
-//							if strings.HasPrefix(fromPath, staticDir) {
-//								publishPath = filepath.Join(publishDir, strings.TrimPrefix(fromPath, staticDir))
-//							} else if strings.HasPrefix(relPath, themeStaticDir) {
-//								publishPath = filepath.Join(publishDir, strings.TrimPrefix(fromPath, themeStaticDir))
-//							}
+							// For all other event operations Hugo will sync static.
 							jww.FEEDBACK.Println("Syncing", relPath, "to", publishDir)
 							syncer.Sync(filepath.Join(publishDir, relPath), relPath)
-
-
-//							jww.INFO.Println("syncing from ", fromPath, " to ", publishPath)
-//							if er := syncer.Sync(publishPath, fromPath); er != nil {
-//								jww.ERROR.Printf("Error on syncing file '%s'\n %s\n", relPath, er)
-//							}
 						}
 					}
 
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -105,12 +105,6 @@
 }
 
 type Pages []*Page
-//
-//func (ps Pages) Replace(page *Page) {
-//	if i := ps.FindPagePos(page); i >= 0 {
-//		ps[i] = page
-//	}
-//}
 
 func (ps Pages) FindPagePosByFilePath(inPath string) int {
 	for i, x := range ps {
@@ -131,16 +125,6 @@
 	}
 	return -1
 }
-
-// FindPage Given a page, it will return the page in Pages
-// will return nil if not found
-//func (ps Pages) FindPage(page *Page) *Page {
-//	if i := ps.FindPagePos(page); i >= 0 {
-//		return ps[i]
-//	}
-//
-//	return nil
-//}
 
 func (p *Page) Plain() string {
 	p.initPlain()