shithub: hugo

Download patch

ref: 166a394a2fef6f2990e264cc8dfb722af2cc6a67
parent: 824395204680496d528684587a1f2977394aff3d
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Fri Aug 9 04:09:15 EDT 2019

Fix static sync issue with virtual mounts

Fixes #6165

--- a/commands/static_syncer.go
+++ b/commands/static_syncer.go
@@ -80,6 +80,7 @@
 			fromPath := ev.Name
 
 			relPath := sourceFs.MakePathRelative(fromPath)
+
 			if relPath == "" {
 				// Not member of this virtual host.
 				continue
--- a/hugofs/rootmapping_fs_test.go
+++ b/hugofs/rootmapping_fs_test.go
@@ -283,6 +283,10 @@
 	assert.Equal([]string{"b.txt", "c"}, getDirnames("static/b"))
 	assert.Equal([]string{"c.txt"}, getDirnames("static/b/c"))
 
+	fi, err := rfs.Stat(filepath.FromSlash("static/b/b.txt"))
+	assert.NoError(err)
+	assert.Equal("b.txt", fi.Name())
+
 }
 
 func TestRootMappingFsOs(t *testing.T) {
--- a/hugolib/filesystems/basefs.go
+++ b/hugolib/filesystems/basefs.go
@@ -239,8 +239,14 @@
 // It will return an empty string if the filename is not a member of this filesystem.
 func (d *SourceFilesystem) MakePathRelative(filename string) string {
 	for _, dir := range d.Dirs {
-		currentPath := dir.(hugofs.FileMetaInfo).Meta().Filename()
+		meta := dir.(hugofs.FileMetaInfo).Meta()
+		currentPath := meta.Filename()
+
 		if strings.HasPrefix(filename, currentPath) {
+			if path := meta.Path(); path != "" {
+				currentPath = strings.TrimRight(strings.TrimSuffix(currentPath, path), filePathSeparator)
+			}
+
 			return strings.TrimPrefix(filename, currentPath)
 		}
 	}
--- a/hugolib/filesystems/basefs_test.go
+++ b/hugolib/filesystems/basefs_test.go
@@ -355,6 +355,45 @@
 	checkFileContent(noFs, "f2.txt", assert, "Hugo Themes Still Rocks!")
 }
 
+func TestMakePathRelative(t *testing.T) {
+	assert := require.New(t)
+	v := createConfig()
+	fs := hugofs.NewMem(v)
+	workDir := "mywork"
+	v.Set("workingDir", workDir)
+
+	assert.NoError(fs.Source.MkdirAll(filepath.Join(workDir, "dist"), 0777))
+	assert.NoError(fs.Source.MkdirAll(filepath.Join(workDir, "static"), 0777))
+
+	moduleCfg := map[string]interface{}{
+		"mounts": []interface{}{
+			map[string]interface{}{
+				"source": "dist",
+				"target": "static/dist",
+			},
+			map[string]interface{}{
+				"source": "static",
+				"target": "static",
+			},
+		},
+	}
+
+	v.Set("module", moduleCfg)
+
+	assert.NoError(initConfig(fs.Source, v))
+
+	p, err := paths.New(fs, v)
+	assert.NoError(err)
+	bfs, err := NewBase(p, nil)
+	assert.NoError(err)
+
+	sfs := bfs.Static[""]
+	assert.NotNil(sfs)
+
+	assert.Equal(filepath.FromSlash("/foo.txt"), sfs.MakePathRelative(filepath.Join(workDir, "static", "foo.txt")))
+	assert.Equal(filepath.FromSlash("/dist/foo.txt"), sfs.MakePathRelative(filepath.Join(workDir, "dist", "foo.txt")))
+}
+
 func checkFileCount(fs afero.Fs, dirname string, assert *require.Assertions, expected int) {
 	count, fnames, err := countFileaAndGetFilenames(fs, dirname)
 	assert.NoError(err, fnames)