mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
hugolib, commands: Improve live-reload on directory structure changes
This issue is more visible now that we support nested sections. This commit makes operations like pasting new content folders or deleting content folders during server watch just work. Fixes #3570
This commit is contained in:
parent
b39689393c
commit
fe901b8119
4 changed files with 39 additions and 8 deletions
|
@ -829,6 +829,11 @@ func (c *commandeer) newWatcher(port int) error {
|
||||||
if err := watcher.Add(path); err != nil {
|
if err := watcher.Add(path); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else if !c.isStatic(path) {
|
||||||
|
// Hugo's rebuilding logic is entirely file based. When you drop a new folder into
|
||||||
|
// /content on OSX, the above logic will handle future watching of those files,
|
||||||
|
// but the initial CREATE is lost.
|
||||||
|
dynamicEvents = append(dynamicEvents, fsnotify.Event{Name: path, Op: fsnotify.Create})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -841,9 +846,7 @@ func (c *commandeer) newWatcher(port int) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isstatic := strings.HasPrefix(ev.Name, c.PathSpec().GetStaticDirPath()) || (len(c.PathSpec().GetThemesDirPath()) > 0 && strings.HasPrefix(ev.Name, c.PathSpec().GetThemesDirPath()))
|
if c.isStatic(ev.Name) {
|
||||||
|
|
||||||
if isstatic {
|
|
||||||
staticEvents = append(staticEvents, ev)
|
staticEvents = append(staticEvents, ev)
|
||||||
} else {
|
} else {
|
||||||
dynamicEvents = append(dynamicEvents, ev)
|
dynamicEvents = append(dynamicEvents, ev)
|
||||||
|
@ -999,6 +1002,10 @@ func (c *commandeer) newWatcher(port int) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *commandeer) isStatic(path string) bool {
|
||||||
|
return strings.HasPrefix(path, c.PathSpec().GetStaticDirPath()) || (len(c.PathSpec().GetThemesDirPath()) > 0 && strings.HasPrefix(path, c.PathSpec().GetThemesDirPath()))
|
||||||
|
}
|
||||||
|
|
||||||
// isThemeVsHugoVersionMismatch returns whether the current Hugo version is
|
// isThemeVsHugoVersionMismatch returns whether the current Hugo version is
|
||||||
// less than the theme's min_version.
|
// less than the theme's min_version.
|
||||||
func (c *commandeer) isThemeVsHugoVersionMismatch() (mismatch bool, requiredMinVersion string) {
|
func (c *commandeer) isThemeVsHugoVersionMismatch() (mismatch bool, requiredMinVersion string) {
|
||||||
|
|
|
@ -322,6 +322,18 @@ func (ps Pages) FindPagePosByFilePath(inPath string) int {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ps Pages) FindPagePosByFilePathPrefix(prefix string) int {
|
||||||
|
if prefix == "" {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
for i, x := range ps {
|
||||||
|
if strings.HasPrefix(x.Source.Path(), prefix) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
// FindPagePos Given a page, it will find the position in Pages
|
// FindPagePos Given a page, it will find the position in Pages
|
||||||
// will return -1 if not found
|
// will return -1 if not found
|
||||||
func (ps Pages) FindPagePos(page *Page) int {
|
func (ps Pages) FindPagePos(page *Page) int {
|
||||||
|
|
|
@ -137,6 +137,18 @@ func (c *PageCollections) addPage(page *Page) {
|
||||||
c.rawAllPages = append(c.rawAllPages, page)
|
c.rawAllPages = append(c.rawAllPages, page)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When we get a REMOVE event we're not always getting all the individual files,
|
||||||
|
// so we need to remove all below a given path.
|
||||||
|
func (c *PageCollections) removePageByPathPrefix(path string) {
|
||||||
|
for {
|
||||||
|
i := c.rawAllPages.FindPagePosByFilePathPrefix(path)
|
||||||
|
if i == -1 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
c.rawAllPages = append(c.rawAllPages[:i], c.rawAllPages[i+1:]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (c *PageCollections) removePageByPath(path string) {
|
func (c *PageCollections) removePageByPath(path string) {
|
||||||
if i := c.rawAllPages.FindPagePosByFilePath(path); i >= 0 {
|
if i := c.rawAllPages.FindPagePosByFilePath(path); i >= 0 {
|
||||||
c.rawAllPages = append(c.rawAllPages[:i], c.rawAllPages[i+1:]...)
|
c.rawAllPages = append(c.rawAllPages[:i], c.rawAllPages[i+1:]...)
|
||||||
|
|
|
@ -667,11 +667,11 @@ func (s *Site) reProcess(events []fsnotify.Event) (whatChanged, error) {
|
||||||
seen[ev] = true
|
seen[ev] = true
|
||||||
|
|
||||||
if s.isContentDirEvent(ev) {
|
if s.isContentDirEvent(ev) {
|
||||||
logger.Println("Source changed", ev.Name)
|
logger.Println("Source changed", ev)
|
||||||
sourceChanged = append(sourceChanged, ev)
|
sourceChanged = append(sourceChanged, ev)
|
||||||
}
|
}
|
||||||
if s.isLayoutDirEvent(ev) {
|
if s.isLayoutDirEvent(ev) {
|
||||||
logger.Println("Template changed", ev.Name)
|
logger.Println("Template changed", ev)
|
||||||
tmplChanged = append(tmplChanged, ev)
|
tmplChanged = append(tmplChanged, ev)
|
||||||
|
|
||||||
if strings.Contains(ev.Name, "shortcodes") {
|
if strings.Contains(ev.Name, "shortcodes") {
|
||||||
|
@ -682,11 +682,11 @@ func (s *Site) reProcess(events []fsnotify.Event) (whatChanged, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if s.isDataDirEvent(ev) {
|
if s.isDataDirEvent(ev) {
|
||||||
logger.Println("Data changed", ev.Name)
|
logger.Println("Data changed", ev)
|
||||||
dataChanged = append(dataChanged, ev)
|
dataChanged = append(dataChanged, ev)
|
||||||
}
|
}
|
||||||
if s.isI18nEvent(ev) {
|
if s.isI18nEvent(ev) {
|
||||||
logger.Println("i18n changed", ev.Name)
|
logger.Println("i18n changed", ev)
|
||||||
i18nChanged = append(dataChanged, ev)
|
i18nChanged = append(dataChanged, ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -761,7 +761,7 @@ func (s *Site) reProcess(events []fsnotify.Event) (whatChanged, error) {
|
||||||
if ev.Op&fsnotify.Remove == fsnotify.Remove {
|
if ev.Op&fsnotify.Remove == fsnotify.Remove {
|
||||||
//remove the file & a create will follow
|
//remove the file & a create will follow
|
||||||
path, _ := helpers.GetRelativePath(ev.Name, s.getContentDir(ev.Name))
|
path, _ := helpers.GetRelativePath(ev.Name, s.getContentDir(ev.Name))
|
||||||
s.removePageByPath(path)
|
s.removePageByPathPrefix(path)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue