1*105f6285SAndroid Build Coastguard Worker// Copyright 2022 The Android Open Source Project 2*105f6285SAndroid Build Coastguard Worker// 3*105f6285SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*105f6285SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*105f6285SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*105f6285SAndroid Build Coastguard Worker// 7*105f6285SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*105f6285SAndroid Build Coastguard Worker// 9*105f6285SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*105f6285SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*105f6285SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*105f6285SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*105f6285SAndroid Build Coastguard Worker// limitations under the License. 14*105f6285SAndroid Build Coastguard Worker 15*105f6285SAndroid Build Coastguard Workerpackage main 16*105f6285SAndroid Build Coastguard Worker 17*105f6285SAndroid Build Coastguard Workerimport ( 18*105f6285SAndroid Build Coastguard Worker "context" 19*105f6285SAndroid Build Coastguard Worker "fmt" 20*105f6285SAndroid Build Coastguard Worker "io" 21*105f6285SAndroid Build Coastguard Worker "log" 22*105f6285SAndroid Build Coastguard Worker 23*105f6285SAndroid Build Coastguard Worker "tools/treble/build/report/report" 24*105f6285SAndroid Build Coastguard Worker) 25*105f6285SAndroid Build Coastguard Worker 26*105f6285SAndroid Build Coastguard Workertype pathsReport struct { 27*105f6285SAndroid Build Coastguard Worker build_target string // Target used to filter build request 28*105f6285SAndroid Build Coastguard Worker single bool // Get single path 29*105f6285SAndroid Build Coastguard Worker} 30*105f6285SAndroid Build Coastguard Worker 31*105f6285SAndroid Build Coastguard Workerfunc (p pathsReport) Run(ctx context.Context, rtx *report.Context, rsp *response) error { 32*105f6285SAndroid Build Coastguard Worker 33*105f6285SAndroid Build Coastguard Worker log.Printf("Resolving paths for %s (single : %v)\n", rsp.Inputs, p.single) 34*105f6285SAndroid Build Coastguard Worker rsp.Paths = report.RunPaths(ctx, rtx, p.build_target, p.single, rsp.Inputs) 35*105f6285SAndroid Build Coastguard Worker 36*105f6285SAndroid Build Coastguard Worker // The path is returned in an array in the form [build_target, path_stop1,...,path_stopN,source_file] 37*105f6285SAndroid Build Coastguard Worker // Choose the closest build target (path_stopN) to the source file to build to reduce the amount that 38*105f6285SAndroid Build Coastguard Worker // is built. 39*105f6285SAndroid Build Coastguard Worker const buildPathIndex = 2 40*105f6285SAndroid Build Coastguard Worker build_targets := make(map[string]bool) 41*105f6285SAndroid Build Coastguard Worker for _, path := range rsp.Paths { 42*105f6285SAndroid Build Coastguard Worker // Default to build closest build target 43*105f6285SAndroid Build Coastguard Worker if len(path.Paths) > buildPathIndex { 44*105f6285SAndroid Build Coastguard Worker build_targets[path.Paths[len(path.Paths)-buildPathIndex]] = true 45*105f6285SAndroid Build Coastguard Worker } 46*105f6285SAndroid Build Coastguard Worker } 47*105f6285SAndroid Build Coastguard Worker for b := range build_targets { 48*105f6285SAndroid Build Coastguard Worker rsp.Targets = append(rsp.Targets, b) 49*105f6285SAndroid Build Coastguard Worker } 50*105f6285SAndroid Build Coastguard Worker 51*105f6285SAndroid Build Coastguard Worker return nil 52*105f6285SAndroid Build Coastguard Worker} 53*105f6285SAndroid Build Coastguard Worker 54*105f6285SAndroid Build Coastguard Workerfunc (h *pathsReport) PrintText(w io.Writer, rsp *response, verbose bool) { 55*105f6285SAndroid Build Coastguard Worker if len(rsp.Paths) > 0 { 56*105f6285SAndroid Build Coastguard Worker fmt.Fprintln(w, " Paths") 57*105f6285SAndroid Build Coastguard Worker for _, p := range rsp.Paths { 58*105f6285SAndroid Build Coastguard Worker // Provide path from target to dependency with the 59*105f6285SAndroid Build Coastguard Worker // path length, since target and dependency are in the 60*105f6285SAndroid Build Coastguard Worker // path subtract them out from length 61*105f6285SAndroid Build Coastguard Worker fmt.Fprintf(w, " %s..(%d)..%-s\n", p.Target, len(p.Paths)-2, p.Dependency) 62*105f6285SAndroid Build Coastguard Worker } 63*105f6285SAndroid Build Coastguard Worker } 64*105f6285SAndroid Build Coastguard Worker} 65