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