]> Cypherpunks.ru repositories - goredo.git/blob - sources.go
98f77ce36c6f58b048880dcf07badbb8164b73e3
[goredo.git] / sources.go
1 /*
2 goredo -- djb's redo implementation on pure Go
3 Copyright (C) 2020-2024 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         "errors"
22         "io/fs"
23 )
24
25 func sourcesWalker(
26         tgts []*Tgt,
27         seen map[string]struct{},
28         seenDeps map[string]struct{},
29         srcs map[string]*Tgt,
30 ) error {
31         for _, tgt := range tgts {
32                 if _, ok := seenDeps[tgt.rel]; ok {
33                         continue
34                 }
35                 seenDeps[tgt.rel] = struct{}{}
36                 dep, err := depRead(tgt)
37                 if err != nil {
38                         if errors.Is(err, fs.ErrNotExist) {
39                                 continue
40                         }
41                         return ErrLine(err)
42                 }
43                 for _, ifchange := range dep.ifchanges {
44                         if _, ok := seen[ifchange.tgt.rel]; ok {
45                                 continue
46                         }
47                         seen[ifchange.tgt.rel] = struct{}{}
48                         if isSrc(ifchange.tgt) {
49                                 srcs[ifchange.tgt.rel] = ifchange.tgt
50                         } else if ifchange.tgt.rel != tgt.rel {
51                                 if err := sourcesWalker(
52                                         []*Tgt{ifchange.tgt},
53                                         seen, seenDeps, srcs,
54                                 ); err != nil {
55                                         return err
56                                 }
57                         }
58                 }
59         }
60         return nil
61 }