| // Copyright (c) 2018, Google Inc. | 
 | // | 
 | // 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) | 
 | 	} | 
 | } |