// Copyright 2018 The BoringSSL Authors
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

//go:build ignore

// check_filenames.go checks that filenames are unique. Some of our consumers do
// not support multiple files with the same name in the same build target, even
// if they are in different directories.
package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

func isSourceFile(in string) bool {
	return strings.HasSuffix(in, ".c") || strings.HasSuffix(in, ".cc")
}

func main() {
	var roots = []string{
		"crypto",
		filepath.Join("third_party", "fiat"),
		"ssl",
	}

	names := make(map[string]string)
	var foundCollisions bool
	for _, root := range roots {
		err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
			if err != nil {
				return err
			}
			if info.IsDir() {
				return nil
			}
			name := strings.ToLower(info.Name()) // Windows and macOS are case-insensitive.
			if isSourceFile(name) {
				if oldPath, ok := names[name]; ok {
					fmt.Printf("Filename collision found: %s and %s\n", path, oldPath)
					foundCollisions = true
				} else {
					names[name] = path
				}
			}
			return nil
		})
		if err != nil {
			fmt.Printf("Error traversing %s: %s\n", root, err)
			os.Exit(1)
		}
	}
	if foundCollisions {
		os.Exit(1)
	}
}
