--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package copyright
+
+import (
+ "bytes"
+ "internal/testenv"
+ "io"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+var copyright = []byte("Copyright")
+
+var permitted = [][]byte{
+ []byte("// Code generated by "),
+ []byte("// Code generated from "),
+ []byte("// Created by cgo -cdefs"),
+ []byte("// DO NOT EDIT\n// generated by:"),
+ []byte("// Empty assembly file"),
+ []byte("// Generated using cgo"),
+ []byte("// Original source:\n//\thttp://www.zorinaq.com/papers/md5-amd64.html"), // public domain crypto/md5
+ []byte("// created by cgo -cdefs"),
+ []byte("// go run mkasm.go"),
+ []byte("// mkerrors"),
+ []byte("// mksys"),
+ []byte("// run\n// Code generated by"), // cmd/compile/internal/test/constFold_test.go
+}
+
+func TestCopyright(t *testing.T) {
+ buf := make([]byte, 2048)
+ filepath.WalkDir(filepath.Join(testenv.GOROOT(t), "src"), func(path string, d fs.DirEntry, err error) error {
+ if d.Name() == "testdata" || d.Name() == "vendor" {
+ return filepath.SkipDir
+ }
+ switch filepath.Ext(d.Name()) {
+ default:
+ return nil
+ case ".s", ".go":
+ // check
+ }
+
+ f, err := os.Open(path)
+ if err != nil {
+ t.Error(err)
+ return nil
+ }
+ n, err := f.Read(buf)
+ if err != nil && err != io.EOF {
+ t.Error(err)
+ return nil
+ }
+ b := buf[:n]
+ if bytes.Contains(b, copyright) {
+ return nil
+ }
+ for _, ok := range permitted {
+ if bytes.HasPrefix(b, ok) {
+ return nil
+ }
+ }
+ t.Errorf("%s: missing copyright notice", path)
+ return nil
+ })
+}