forked from sourcegraph/srclib
-
Notifications
You must be signed in to change notification settings - Fork 1
/
rule.go
64 lines (53 loc) · 1.67 KB
/
rule.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package grapher
import (
"fmt"
"path/filepath"
"sourcegraph.com/sourcegraph/makex"
"sourcegraph.com/sourcegraph/srclib"
"sourcegraph.com/sourcegraph/srclib/buildstore"
"sourcegraph.com/sourcegraph/srclib/config"
"sourcegraph.com/sourcegraph/srclib/plan"
"sourcegraph.com/sourcegraph/srclib/toolchain"
"sourcegraph.com/sourcegraph/srclib/unit"
)
const graphOp = "graph"
func init() {
plan.RegisterRuleMaker(graphOp, makeGraphRules)
buildstore.RegisterDataType("graph", &Output{})
}
func makeGraphRules(c *config.Tree, dataDir string, existing []makex.Rule, opt plan.Options) ([]makex.Rule, error) {
const op = graphOp
var rules []makex.Rule
for _, u := range c.SourceUnits {
toolRef := u.Ops[op]
if toolRef == nil {
choice, err := toolchain.ChooseTool(graphOp, u.Type)
if err != nil {
return nil, err
}
toolRef = choice
}
rules = append(rules, &GraphUnitRule{dataDir, u, toolRef, opt})
}
return rules, nil
}
type GraphUnitRule struct {
dataDir string
Unit *unit.SourceUnit
Tool *srclib.ToolRef
opt plan.Options
}
func (r *GraphUnitRule) Target() string {
return filepath.Join(r.dataDir, plan.SourceUnitDataFilename(&Output{}, r.Unit))
}
func (r *GraphUnitRule) Prereqs() []string {
ps := []string{filepath.Join(r.dataDir, plan.SourceUnitDataFilename(unit.SourceUnit{}, r.Unit))}
ps = append(ps, r.Unit.Files...)
return ps
}
func (r *GraphUnitRule) Recipes() []string {
return []string{
fmt.Sprintf("src tool %s %q %q < $< | src internal normalize-graph-data --unit-type %q --dir . 1> $@", r.opt.ToolchainExecOpt, r.Tool.Toolchain, r.Tool.Subcmd, r.Unit.Type),
}
}
func (r *GraphUnitRule) SourceUnit() *unit.SourceUnit { return r.Unit }