func makeJSONTarget(graph *core.BuildGraph, target *core.BuildTarget) JSONTarget { t := JSONTarget{} for in := range core.IterSources(graph, target) { t.Inputs = append(t.Inputs, in.Src) } for _, out := range target.Outputs() { t.Outputs = append(t.Outputs, path.Join(target.Label.PackageName, out)) } for _, src := range target.AllSourcePaths(graph) { t.Sources = append(t.Sources, src) } for _, dep := range target.Dependencies() { t.Deps = append(t.Deps, dep.Label.String()) } for data := range core.IterRuntimeFiles(graph, target, false) { t.Data = append(t.Data, data.Src) } t.Labels = target.Labels t.Requires = target.Requires rawHash := append(build.RuleHash(target, true, false), core.State.Hashes.Config...) t.Hash = base64.RawStdEncoding.EncodeToString(rawHash) t.Test = target.IsTest t.Binary = target.IsBinary t.TestOnly = target.TestOnly return t }
func prepareTestDir(graph *core.BuildGraph, target *core.BuildTarget) error { if err := os.RemoveAll(target.TestDir()); err != nil { return err } if err := os.MkdirAll(target.TestDir(), core.DirPermissions); err != nil { return err } for out := range core.IterRuntimeFiles(graph, target, true) { if err := core.PrepareSourcePair(out); err != nil { return err } } return nil }
// RuntimeHash returns the target hash, source hash, config hash & runtime file hash, // all rolled into one. Essentially this is one hash needed to determine if the runtime // state is consistent. func RuntimeHash(state *core.BuildState, target *core.BuildTarget) ([]byte, error) { hash := append(RuleHash(target, true, false), RuleHash(target, true, true)...) hash = append(hash, state.Hashes.Config...) sh, err := sourceHash(state.Graph, target) if err != nil { return nil, err } h := sha1.New() h.Write(sh) for source := range core.IterRuntimeFiles(state.Graph, target, true) { result, err := pathHash(source.Src, false) if err != nil { return result, err } h.Write(result) } return append(hash, h.Sum(nil)...), nil }