]> Cypherpunks.ru repositories - goredo.git/blob - targets.go
Up to date recfile
[goredo.git] / targets.go
1 /*
2 goredo -- djb's redo implementation on pure Go
3 Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 package main
19
20 import (
21         "io"
22         "os"
23         "path"
24         "path/filepath"
25         "strings"
26 )
27
28 func targetsWalker(root string) ([]string, error) {
29         root, err := filepath.Abs(root)
30         if err != nil {
31                 panic(err)
32         }
33         dir, err := os.Open(root)
34         if err != nil {
35                 return nil, err
36         }
37         defer dir.Close()
38         tgts := make([]string, 0, 1<<10)
39         for {
40                 fis, err := dir.Readdir(1 << 10)
41                 if err != nil {
42                         if err == io.EOF {
43                                 break
44                         }
45                         return tgts, err
46                 }
47                 for _, fi := range fis {
48                         if !fi.IsDir() {
49                                 continue
50                         }
51                         pth := path.Join(root, fi.Name())
52                         if fi.Name() == RedoDir {
53                                 redoDir, err := os.Open(pth)
54                                 if err != nil {
55                                         return tgts, err
56                                 }
57                                 redoFis, err := redoDir.Readdir(0)
58                                 if err != nil {
59                                         return tgts, err
60                                 }
61                                 for _, redoFi := range redoFis {
62                                         name := redoFi.Name()
63                                         if strings.HasSuffix(name, DepSuffix) {
64                                                 name = cwdMustRel(root, name)
65                                                 tgts = append(tgts, name[:len(name)-len(DepSuffix)])
66                                         }
67                                 }
68                                 redoDir.Close()
69                         } else {
70                                 subTgts, err := targetsWalker(pth)
71                                 tgts = append(tgts, subTgts...)
72                                 if err != nil {
73                                         return tgts, err
74                                 }
75                         }
76                 }
77         }
78         return tgts, dir.Close()
79 }