]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go, embed: exclude .* and _* from embedded directory trees
authorRuss Cox <rsc@golang.org>
Wed, 2 Dec 2020 20:09:12 +0000 (15:09 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 4 Dec 2020 13:50:44 +0000 (13:50 +0000)
Discussion on #42328 led to a decision to exclude files matching
.* and _* from embedded directory results when embedding an
entire directory tree.

This CL implements that new behavior.

Fixes #42328.

Change-Id: I6188994e96348b3449c7d9d3d0d181cfbf2d4db1
Reviewed-on: https://go-review.googlesource.com/c/go/+/275092
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/internal/load/pkg.go
src/embed/embed.go
src/embed/internal/embedtest/embed_test.go
src/embed/internal/embedtest/testdata/.hidden/.more/tip.txt [new file with mode: 0644]
src/embed/internal/embedtest/testdata/.hidden/_more/tip.txt [new file with mode: 0644]
src/embed/internal/embedtest/testdata/.hidden/fortune.txt [new file with mode: 0644]
src/embed/internal/embedtest/testdata/.hidden/more/tip.txt [new file with mode: 0644]
src/embed/internal/embedtest/testdata/_hidden/fortune.txt [new file with mode: 0644]

index 30ca33b663340f379194bbe1fb23ec80d8e539b6..cbc683da2b8a778165a240c86dd8c2ecad3a42c1 100644 (file)
@@ -1998,6 +1998,16 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri
                                                return err
                                        }
                                        rel := filepath.ToSlash(path[len(p.Dir)+1:])
+                                       name := info.Name()
+                                       if path != file && (isBadEmbedName(name) || name[0] == '.' || name[0] == '_') {
+                                               // Ignore bad names, assuming they won't go into modules.
+                                               // Also avoid hidden files that user may not know about.
+                                               // See golang.org/issue/42328.
+                                               if info.IsDir() {
+                                                       return fs.SkipDir
+                                               }
+                                               return nil
+                                       }
                                        if info.IsDir() {
                                                if _, err := fsys.Stat(filepath.Join(path, "go.mod")); err == nil {
                                                        return filepath.SkipDir
@@ -2007,10 +2017,6 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri
                                        if !info.Mode().IsRegular() {
                                                return nil
                                        }
-                                       if isBadEmbedName(info.Name()) {
-                                               // Ignore bad names, assuming they won't go into modules.
-                                               return nil
-                                       }
                                        count++
                                        if have[rel] != pid {
                                                have[rel] = pid
@@ -2050,6 +2056,9 @@ func validEmbedPattern(pattern string) bool {
 // as existing for embedding.
 func isBadEmbedName(name string) bool {
        switch name {
+       // Empty string should be impossible but make it bad.
+       case "":
+               return true
        // Version control directories won't be present in module.
        case ".bzr", ".hg", ".git", ".svn":
                return true
index b22975cc3ace525a5d42286218960c27c3c6b421..29e0adf1a63d1ddf6fbe165f98b3aa059346125d 100644 (file)
 // as Go double-quoted or back-quoted string literals.
 //
 // If a pattern names a directory, all files in the subtree rooted at that directory are
-// embedded (recursively), so the variable in the above example is equivalent to:
+// embedded (recursively), except that files with names beginning with ‘.’ or ‘_’
+// are excluded. So the variable in the above example is almost equivalent to:
 //
 //     // content is our static web server content.
 //     //go:embed image template html/index.html
 //     var content embed.FS
 //
+// The difference is that ‘image/*’ embeds ‘image/.tempfile’ while ‘image’ does not.
+//
 // The //go:embed directive can be used with both exported and unexported variables,
 // depending on whether the package wants to make the data available to other packages.
 // Similarly, it can be used with both global and function-local variables,
index c82ca9fed2f9d0dee03620281ed7967349d9076b..b1707a4c04b981508aa63256da5e24e8c740646e 100644 (file)
@@ -101,3 +101,24 @@ func TestDir(t *testing.T) {
        testDir(t, all, "testdata/i/j", "k/")
        testDir(t, all, "testdata/i/j/k", "k8s.txt")
 }
+
+func TestHidden(t *testing.T) {
+       //go:embed testdata
+       var dir embed.FS
+
+       //go:embed testdata/*
+       var star embed.FS
+
+       t.Logf("//go:embed testdata")
+
+       testDir(t, dir, "testdata",
+               "ascii.txt", "glass.txt", "hello.txt", "i/", "ken.txt")
+
+       t.Logf("//go:embed testdata/*")
+
+       testDir(t, star, "testdata",
+               ".hidden/", "_hidden/", "ascii.txt", "glass.txt", "hello.txt", "i/", "ken.txt")
+
+       testDir(t, star, "testdata/.hidden",
+               "fortune.txt", "more/") // but not .more or _more
+}
diff --git a/src/embed/internal/embedtest/testdata/.hidden/.more/tip.txt b/src/embed/internal/embedtest/testdata/.hidden/.more/tip.txt
new file mode 100644 (file)
index 0000000..71b9c69
--- /dev/null
@@ -0,0 +1 @@
+#define struct union /* Great space saver */
diff --git a/src/embed/internal/embedtest/testdata/.hidden/_more/tip.txt b/src/embed/internal/embedtest/testdata/.hidden/_more/tip.txt
new file mode 100644 (file)
index 0000000..71b9c69
--- /dev/null
@@ -0,0 +1 @@
+#define struct union /* Great space saver */
diff --git a/src/embed/internal/embedtest/testdata/.hidden/fortune.txt b/src/embed/internal/embedtest/testdata/.hidden/fortune.txt
new file mode 100644 (file)
index 0000000..31f2013
--- /dev/null
@@ -0,0 +1,2 @@
+WARNING: terminal is not fully functional
+ -  (press RETURN)
diff --git a/src/embed/internal/embedtest/testdata/.hidden/more/tip.txt b/src/embed/internal/embedtest/testdata/.hidden/more/tip.txt
new file mode 100644 (file)
index 0000000..71b9c69
--- /dev/null
@@ -0,0 +1 @@
+#define struct union /* Great space saver */
diff --git a/src/embed/internal/embedtest/testdata/_hidden/fortune.txt b/src/embed/internal/embedtest/testdata/_hidden/fortune.txt
new file mode 100644 (file)
index 0000000..31f2013
--- /dev/null
@@ -0,0 +1,2 @@
+WARNING: terminal is not fully functional
+ -  (press RETURN)