func addLicense()

in hack/boilerplate.go [51:97]


func addLicense(path string, d fs.DirEntry, err error) error {
	if !strings.HasSuffix(path, ".go") {
		return nil
	}

	srcFile, err := os.Open(path)
	if err != nil {
		return fmt.Errorf("opening %s, %w", srcFile.Name(), err)
	}
	defer srcFile.Close()
	buf := make([]byte, len(apacheLicense)+50)
	_, err = srcFile.Read(buf)
	if err != nil {
		return fmt.Errorf("reading  %s, %w", srcFile.Name(), err)
	}
	if bytes.Index(buf, []byte(`http://www.apache.org/licenses/LICENSE-2.0`)) != -1 {
		return nil
	}
	log.Println("adding license to", path)

	tmp, err := os.CreateTemp("", "")
	if err != nil {
		return fmt.Errorf("creating temp file, %w", err)
	}
	defer os.Remove(tmp.Name())
	defer tmp.Close()

	// write the license to the file
	fmt.Fprint(tmp, apacheLicense)
	if _, err := srcFile.Seek(0, io.SeekStart); err != nil {
		return fmt.Errorf("seeking, %w", err)
	}

	// followed by the source file contents
	_, err = io.Copy(tmp, srcFile)
	if err != nil {
		return fmt.Errorf("creating source, %w", err)
	}

	if err := os.Remove(path); err != nil {
		return fmt.Errorf("removing %s, %w", path, err)
	}
	if err := os.Rename(tmp.Name(), path); err != nil {
		return fmt.Errorf("moving %s => %s, %w", tmp.Name(), path, err)
	}
	return nil
}