Skip to content

Commit

Permalink
Fix handling of content files with "." in them
Browse files Browse the repository at this point in the history
As in, more dots than just to separate the extension and any language indicator.

Fixes #4559
  • Loading branch information
bep committed Apr 7, 2018
1 parent 623c9af commit 2817e84
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 5 deletions.
3 changes: 1 addition & 2 deletions hugofs/language_fs.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,10 +292,9 @@ func (fs *LanguageFs) newLanguageFileInfo(filename string, fi os.FileInfo) (*Lan

if fs.languages[fileLang] {
lang = fileLang
baseNameNoExt = strings.TrimSuffix(baseNameNoExt, fileLangExt)
}

baseNameNoExt = strings.TrimSuffix(baseNameNoExt, fileLangExt)

// This connects the filename to the filesystem, not the language.
virtualName = baseNameNoExt + "." + lang + ext

Expand Down
44 changes: 44 additions & 0 deletions hugofs/language_fs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,47 @@ func TestLanguagFs(t *testing.T) {
assert.Equal("page.md", lfi.RealName())

}

// Issue 4559
func TestFilenamesHandling(t *testing.T) {
languages := map[string]bool{
"sv": true,
}
base := filepath.FromSlash("/my/base")
assert := require.New(t)
m := afero.NewMemMapFs()
bfs := afero.NewBasePathFs(m, base)
lfs := NewLanguageFs("sv", languages, bfs)
assert.NotNil(lfs)
assert.Equal("sv", lfs.Lang())

for _, test := range []struct {
filename string
check func(fi *LanguageFileInfo)
}{
{"tc-lib-color/class-Com.Tecnick.Color.Css", func(fi *LanguageFileInfo) {
assert.Equal("class-Com.Tecnick.Color", fi.TranslationBaseName())
assert.Equal(filepath.FromSlash("/my/base"), fi.BaseDir())
assert.Equal(filepath.FromSlash("tc-lib-color/class-Com.Tecnick.Color.Css"), fi.Path())
assert.Equal("class-Com.Tecnick.Color.Css", fi.RealName())
assert.Equal(filepath.FromSlash("/my/base/tc-lib-color/class-Com.Tecnick.Color.Css"), fi.Filename())
}},
{"tc-lib-color/class-Com.Tecnick.Color.sv.Css", func(fi *LanguageFileInfo) {
assert.Equal("class-Com.Tecnick.Color", fi.TranslationBaseName())
assert.Equal("class-Com.Tecnick.Color.sv.Css", fi.RealName())
assert.Equal(filepath.FromSlash("/my/base/tc-lib-color/class-Com.Tecnick.Color.sv.Css"), fi.Filename())
}},
} {
err := afero.WriteFile(lfs, filepath.FromSlash(test.filename), []byte("abc"), 0777)
assert.NoError(err)
fi, err := lfs.Stat(filepath.FromSlash(test.filename))
assert.NoError(err)

lfi, ok := fi.(*LanguageFileInfo)
assert.True(ok)
assert.Equal("sv", lfi.Lang())
test.check(lfi)

}

}
5 changes: 2 additions & 3 deletions source/fileInfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,9 +204,8 @@ func (sp *SourceSpec) NewFileInfo(baseDir, filename string, isLeafBundle bool, f
// This is usyally provided by the filesystem. But this FileInfo is also
// created in a standalone context when doing "hugo new". This is
// an approximate implementation, which is "good enough" in that case.
translationBaseName = strings.TrimSuffix(baseName, ext)
fileLangExt := filepath.Ext(translationBaseName)
translationBaseName = strings.TrimSuffix(translationBaseName, fileLangExt)
fileLangExt := filepath.Ext(baseName)
translationBaseName = strings.TrimSuffix(baseName, fileLangExt)
}

f := &FileInfo{
Expand Down
7 changes: 7 additions & 0 deletions source/fileInfo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ func TestFileInfo(t *testing.T) {
assert.Equal("b", f.Section())

}},
{filepath.FromSlash("/a/"), filepath.FromSlash("/a/b/page.en.MD"), func(f *FileInfo) {
assert.Equal("b", f.Section())
assert.Equal(filepath.FromSlash("b/page.en.MD"), f.Path())
assert.Equal(filepath.FromSlash("page"), f.TranslationBaseName())
assert.Equal(filepath.FromSlash("page.en"), f.BaseFileName())

}},
} {
f := s.NewFileInfo(this.base, this.filename, false, nil)
this.assert(f)
Expand Down

0 comments on commit 2817e84

Please sign in to comment.