aboutsummaryrefslogtreecommitdiffhomepage
path: root/deploy
diff options
context:
space:
mode:
authorJohn Weldon <[email protected]>2020-05-13 16:20:52 -0700
committerBjørn Erik Pedersen <[email protected]>2020-05-14 09:56:53 +0200
commit558c09305e2be16953238c6c0e828f62b950e4f5 (patch)
tree820d81f85123a82ec28ff67779a321a492184496 /deploy
parentb69a36140f42ec99ffa2d1e029b8b86ecf8ff929 (diff)
downloadhugo-558c09305e2be16953238c6c0e828f62b950e4f5.tar.gz
hugo-558c09305e2be16953238c6c0e828f62b950e4f5.zip
deploy: Do not suppress .well-known/ directory
Deployments ignore directories with a leading `.`, but should not ignore certain well known 'hidden' directories like `.well-known/` Fixes #6691
Diffstat (limited to 'deploy')
-rw-r--r--deploy/deploy.go20
-rw-r--r--deploy/deploy_test.go59
2 files changed, 78 insertions, 1 deletions
diff --git a/deploy/deploy.go b/deploy/deploy.go
index c7a4510c2..9a38072a7 100644
--- a/deploy/deploy.go
+++ b/deploy/deploy.go
@@ -440,6 +440,21 @@ func (lf *localFile) MD5() []byte {
return lf.md5
}
+// knownHiddenDirectory checks if the specified name is a well known
+// hidden directory.
+func knownHiddenDirectory(name string) bool {
+ var knownDirectories = []string{
+ ".well-known",
+ }
+
+ for _, dir := range knownDirectories {
+ if name == dir {
+ return true
+ }
+ }
+ return false
+}
+
// walkLocal walks the source directory and returns a flat list of files,
// using localFile.SlashPath as the map keys.
func walkLocal(fs afero.Fs, matchers []*matcher, include, exclude glob.Glob) (map[string]*localFile, error) {
@@ -451,7 +466,10 @@ func walkLocal(fs afero.Fs, matchers []*matcher, include, exclude glob.Glob) (ma
if info.IsDir() {
// Skip hidden directories.
if path != "" && strings.HasPrefix(info.Name(), ".") {
- return filepath.SkipDir
+ // Except for specific hidden directories
+ if !knownHiddenDirectory(info.Name()) {
+ return filepath.SkipDir
+ }
}
return nil
}
diff --git a/deploy/deploy_test.go b/deploy/deploy_test.go
index 6ada0cf8e..0ca1b3fac 100644
--- a/deploy/deploy_test.go
+++ b/deploy/deploy_test.go
@@ -207,6 +207,65 @@ func TestFindDiffs(t *testing.T) {
}
}
+func TestWalkLocal(t *testing.T) {
+ tests := map[string]struct {
+ Given []string
+ Expect []string
+ }{
+ "Empty": {
+ Given: []string{},
+ Expect: []string{},
+ },
+ "Normal": {
+ Given: []string{"file.txt", "normal_dir/file.txt"},
+ Expect: []string{"file.txt", "normal_dir/file.txt"},
+ },
+ "Hidden": {
+ Given: []string{"file.txt", ".hidden_dir/file.txt", "normal_dir/file.txt"},
+ Expect: []string{"file.txt", "normal_dir/file.txt"},
+ },
+ "Well Known": {
+ Given: []string{"file.txt", ".hidden_dir/file.txt", ".well-known/file.txt"},
+ Expect: []string{"file.txt", ".well-known/file.txt"},
+ },
+ }
+
+ for desc, tc := range tests {
+ t.Run(desc, func(t *testing.T) {
+ fs := afero.NewMemMapFs()
+ for _, name := range tc.Given {
+ dir, _ := path.Split(name)
+ if dir != "" {
+ if err := fs.MkdirAll(dir, 0755); err != nil {
+ t.Fatal(err)
+ }
+ }
+ if fd, err := fs.Create(name); err != nil {
+ t.Fatal(err)
+ } else {
+ fd.Close()
+ }
+ }
+ if got, err := walkLocal(fs, nil, nil, nil); err != nil {
+ t.Fatal(err)
+ } else {
+ expect := map[string]interface{}{}
+ for _, path := range tc.Expect {
+ if _, ok := got[path]; !ok {
+ t.Errorf("expected %q in results, but was not found", path)
+ }
+ expect[path] = nil
+ }
+ for path := range got {
+ if _, ok := expect[path]; !ok {
+ t.Errorf("got %q in results unexpectedly", path)
+ }
+ }
+ }
+ })
+ }
+}
+
func TestLocalFile(t *testing.T) {
const (
content = "hello world!"