diff --git a/commands/static_syncer.go b/commands/static_syncer.go index 6103fe71c..ab7cc4fe2 100644 --- a/commands/static_syncer.go +++ b/commands/static_syncer.go @@ -80,6 +80,7 @@ func (s *staticSyncer) syncsStaticEvents(staticEvents []fsnotify.Event) error { fromPath := ev.Name relPath := sourceFs.MakePathRelative(fromPath) + if relPath == "" { // Not member of this virtual host. continue diff --git a/hugofs/rootmapping_fs_test.go b/hugofs/rootmapping_fs_test.go index b3c491f17..0b3f251f2 100644 --- a/hugofs/rootmapping_fs_test.go +++ b/hugofs/rootmapping_fs_test.go @@ -283,6 +283,10 @@ func TestRootMappingFsMountOverlap(t *testing.T) { 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) { diff --git a/hugolib/filesystems/basefs.go b/hugolib/filesystems/basefs.go index 2d8f54d65..2a1f994b2 100644 --- a/hugolib/filesystems/basefs.go +++ b/hugolib/filesystems/basefs.go @@ -239,8 +239,14 @@ func (s SourceFilesystems) MakeStaticPathRelative(filename string) string { // 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) } } diff --git a/hugolib/filesystems/basefs_test.go b/hugolib/filesystems/basefs_test.go index 3b4e4cd16..62f968684 100644 --- a/hugolib/filesystems/basefs_test.go +++ b/hugolib/filesystems/basefs_test.go @@ -355,6 +355,45 @@ func TestStaticFsMultiHost(t *testing.T) { 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)