fileutils: copy all files inside a testdata folder
diff --git a/fileutils/fileutils.go b/fileutils/fileutils.go
index a4033ba..af05ae9 100644
--- a/fileutils/fileutils.go
+++ b/fileutils/fileutils.go
@@ -29,22 +29,7 @@
 			return err
 		}
 
-		// https://golang.org/cmd/go/#hdr-Description_of_package_lists
 		name := filepath.Base(path)
-		if strings.HasPrefix(name, ".") ||
-			(strings.HasPrefix(name, "_") && name != "_testdata") ||
-			(!tests && name == "_testdata") ||
-			(!tests && name == "testdata") ||
-			(!tests && strings.HasSuffix(name, "_test.go")) {
-			if info.IsDir() {
-				return filepath.SkipDir
-			}
-			return nil
-		}
-
-		if info.IsDir() {
-			return nil
-		}
 
 		relevantFile := false
 		for _, ext := range goFileTypes {
@@ -53,7 +38,45 @@
 				break
 			}
 		}
-		if !relevantFile {
+
+		testdata := false
+		for _, n := range strings.Split(filepath.Dir(path), string(filepath.Separator)) {
+			if n == "testdata" || n == "_testdata" {
+				testdata = true
+			}
+		}
+
+		skip := false
+		switch {
+		// Include all files in a testdata folder
+		case tests && testdata:
+			skip = false
+
+		// https://golang.org/cmd/go/#hdr-Description_of_package_lists
+		case strings.HasPrefix(name, "."):
+			skip = true
+		case strings.HasPrefix(name, "_") && name != "_testdata":
+			skip = true
+
+		case !tests && name == "_testdata" && info.IsDir():
+			skip = true
+		case !tests && name == "testdata" && info.IsDir():
+			skip = true
+		case !tests && strings.HasSuffix(name, "_test.go") && !info.IsDir():
+			skip = true
+
+		case !relevantFile && !info.IsDir():
+			skip = true
+		}
+
+		if skip {
+			if info.IsDir() {
+				return filepath.SkipDir
+			}
+			return nil
+		}
+
+		if info.IsDir() {
 			return nil
 		}
 
diff --git a/fileutils/fileutils_test.go b/fileutils/fileutils_test.go
index 24b1af2..69bb60a 100644
--- a/fileutils/fileutils_test.go
+++ b/fileutils/fileutils_test.go
@@ -15,7 +15,7 @@
 	dst := mktemp(t)
 	defer RemoveAll(dst)
 	src := filepath.Join("_testdata", "copyfile")
-	if err := Copypath(dst, src); err != nil {
+	if err := Copypath(dst, src, true); err != nil {
 		t.Fatalf("copypath(%s, %s): %v", dst, src, err)
 	}
 	res, err := os.Readlink(filepath.Join(dst, "a", "rick"))