1*8fb009dcSAndroid Build Coastguard Worker// Copyright (c) 2018, Google Inc. 2*8fb009dcSAndroid Build Coastguard Worker// 3*8fb009dcSAndroid Build Coastguard Worker// Permission to use, copy, modify, and/or distribute this software for any 4*8fb009dcSAndroid Build Coastguard Worker// purpose with or without fee is hereby granted, provided that the above 5*8fb009dcSAndroid Build Coastguard Worker// copyright notice and this permission notice appear in all copies. 6*8fb009dcSAndroid Build Coastguard Worker// 7*8fb009dcSAndroid Build Coastguard Worker// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8*8fb009dcSAndroid Build Coastguard Worker// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9*8fb009dcSAndroid Build Coastguard Worker// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10*8fb009dcSAndroid Build Coastguard Worker// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11*8fb009dcSAndroid Build Coastguard Worker// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12*8fb009dcSAndroid Build Coastguard Worker// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13*8fb009dcSAndroid Build Coastguard Worker// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14*8fb009dcSAndroid Build Coastguard Worker 15*8fb009dcSAndroid Build Coastguard Worker//go:build ignore 16*8fb009dcSAndroid Build Coastguard Worker 17*8fb009dcSAndroid Build Coastguard Worker// check_filenames.go checks that filenames are unique. Some of our consumers do 18*8fb009dcSAndroid Build Coastguard Worker// not support multiple files with the same name in the same build target, even 19*8fb009dcSAndroid Build Coastguard Worker// if they are in different directories. 20*8fb009dcSAndroid Build Coastguard Workerpackage main 21*8fb009dcSAndroid Build Coastguard Worker 22*8fb009dcSAndroid Build Coastguard Workerimport ( 23*8fb009dcSAndroid Build Coastguard Worker "fmt" 24*8fb009dcSAndroid Build Coastguard Worker "os" 25*8fb009dcSAndroid Build Coastguard Worker "path/filepath" 26*8fb009dcSAndroid Build Coastguard Worker "strings" 27*8fb009dcSAndroid Build Coastguard Worker) 28*8fb009dcSAndroid Build Coastguard Worker 29*8fb009dcSAndroid Build Coastguard Workerfunc isSourceFile(in string) bool { 30*8fb009dcSAndroid Build Coastguard Worker return strings.HasSuffix(in, ".c") || strings.HasSuffix(in, ".cc") 31*8fb009dcSAndroid Build Coastguard Worker} 32*8fb009dcSAndroid Build Coastguard Worker 33*8fb009dcSAndroid Build Coastguard Workerfunc main() { 34*8fb009dcSAndroid Build Coastguard Worker var roots = []string{ 35*8fb009dcSAndroid Build Coastguard Worker "crypto", 36*8fb009dcSAndroid Build Coastguard Worker filepath.Join("third_party", "fiat"), 37*8fb009dcSAndroid Build Coastguard Worker "ssl", 38*8fb009dcSAndroid Build Coastguard Worker } 39*8fb009dcSAndroid Build Coastguard Worker 40*8fb009dcSAndroid Build Coastguard Worker names := make(map[string]string) 41*8fb009dcSAndroid Build Coastguard Worker var foundCollisions bool 42*8fb009dcSAndroid Build Coastguard Worker for _, root := range roots { 43*8fb009dcSAndroid Build Coastguard Worker err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { 44*8fb009dcSAndroid Build Coastguard Worker if err != nil { 45*8fb009dcSAndroid Build Coastguard Worker return err 46*8fb009dcSAndroid Build Coastguard Worker } 47*8fb009dcSAndroid Build Coastguard Worker if info.IsDir() { 48*8fb009dcSAndroid Build Coastguard Worker return nil 49*8fb009dcSAndroid Build Coastguard Worker } 50*8fb009dcSAndroid Build Coastguard Worker name := strings.ToLower(info.Name()) // Windows and macOS are case-insensitive. 51*8fb009dcSAndroid Build Coastguard Worker if isSourceFile(name) { 52*8fb009dcSAndroid Build Coastguard Worker if oldPath, ok := names[name]; ok { 53*8fb009dcSAndroid Build Coastguard Worker fmt.Printf("Filename collision found: %s and %s\n", path, oldPath) 54*8fb009dcSAndroid Build Coastguard Worker foundCollisions = true 55*8fb009dcSAndroid Build Coastguard Worker } else { 56*8fb009dcSAndroid Build Coastguard Worker names[name] = path 57*8fb009dcSAndroid Build Coastguard Worker } 58*8fb009dcSAndroid Build Coastguard Worker } 59*8fb009dcSAndroid Build Coastguard Worker return nil 60*8fb009dcSAndroid Build Coastguard Worker }) 61*8fb009dcSAndroid Build Coastguard Worker if err != nil { 62*8fb009dcSAndroid Build Coastguard Worker fmt.Printf("Error traversing %s: %s\n", root, err) 63*8fb009dcSAndroid Build Coastguard Worker os.Exit(1) 64*8fb009dcSAndroid Build Coastguard Worker } 65*8fb009dcSAndroid Build Coastguard Worker } 66*8fb009dcSAndroid Build Coastguard Worker if foundCollisions { 67*8fb009dcSAndroid Build Coastguard Worker os.Exit(1) 68*8fb009dcSAndroid Build Coastguard Worker } 69*8fb009dcSAndroid Build Coastguard Worker} 70