1*9e965d6fSRomain Jobredeaux// Copyright 2018 The Bazel Authors. All rights reserved. 2*9e965d6fSRomain Jobredeaux// 3*9e965d6fSRomain Jobredeaux// Licensed under the Apache License, Version 2.0 (the "License"); 4*9e965d6fSRomain Jobredeaux// you may not use this file except in compliance with the License. 5*9e965d6fSRomain Jobredeaux// You may obtain a copy of the License at 6*9e965d6fSRomain Jobredeaux// 7*9e965d6fSRomain Jobredeaux// http://www.apache.org/licenses/LICENSE-2.0 8*9e965d6fSRomain Jobredeaux// 9*9e965d6fSRomain Jobredeaux// Unless required by applicable law or agreed to in writing, software 10*9e965d6fSRomain Jobredeaux// distributed under the License is distributed on an "AS IS" BASIS, 11*9e965d6fSRomain Jobredeaux// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e965d6fSRomain Jobredeaux// See the License for the specific language governing permissions and 13*9e965d6fSRomain Jobredeaux// limitations under the License. 14*9e965d6fSRomain Jobredeaux 15*9e965d6fSRomain Jobredeaux// Package walk provides an utility function to walk a directory tree collecting and deduping files. 16*9e965d6fSRomain Jobredeauxpackage walk 17*9e965d6fSRomain Jobredeaux 18*9e965d6fSRomain Jobredeauximport ( 19*9e965d6fSRomain Jobredeaux "fmt" 20*9e965d6fSRomain Jobredeaux "os" 21*9e965d6fSRomain Jobredeaux "path/filepath" 22*9e965d6fSRomain Jobredeaux) 23*9e965d6fSRomain Jobredeaux 24*9e965d6fSRomain Jobredeaux// Files traverses a list of paths and returns a list of all the seen files. 25*9e965d6fSRomain Jobredeauxfunc Files(paths []string) ([]string, error) { 26*9e965d6fSRomain Jobredeaux var files []string 27*9e965d6fSRomain Jobredeaux seen := make(map[string]bool) 28*9e965d6fSRomain Jobredeaux visitFunc := func(path string, info os.FileInfo, err error) error { 29*9e965d6fSRomain Jobredeaux if err != nil { 30*9e965d6fSRomain Jobredeaux return err 31*9e965d6fSRomain Jobredeaux } 32*9e965d6fSRomain Jobredeaux if seen[path] { 33*9e965d6fSRomain Jobredeaux return nil 34*9e965d6fSRomain Jobredeaux } 35*9e965d6fSRomain Jobredeaux seen[path] = true 36*9e965d6fSRomain Jobredeaux switch fType := info.Mode(); { 37*9e965d6fSRomain Jobredeaux case fType.IsDir(): 38*9e965d6fSRomain Jobredeaux // Do nothing. 39*9e965d6fSRomain Jobredeaux default: 40*9e965d6fSRomain Jobredeaux files = append(files, path) 41*9e965d6fSRomain Jobredeaux } 42*9e965d6fSRomain Jobredeaux return nil 43*9e965d6fSRomain Jobredeaux } 44*9e965d6fSRomain Jobredeaux for _, p := range paths { 45*9e965d6fSRomain Jobredeaux err := filepath.Walk(p, visitFunc) 46*9e965d6fSRomain Jobredeaux if err != nil { 47*9e965d6fSRomain Jobredeaux return nil, fmt.Errorf("got error while walking %s got: %v", p, err) 48*9e965d6fSRomain Jobredeaux } 49*9e965d6fSRomain Jobredeaux } 50*9e965d6fSRomain Jobredeaux return files, nil 51*9e965d6fSRomain Jobredeaux} 52