blob: 245fb169d9394e09b01371dafe0370429c4e6f66 [file] [log] [blame]
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
"regexp"
"strings"
)
func notFoundErr(t string, sel string, candidates []string) error {
var part1, part2 string
if sel == "" {
part1 = "not specified"
} else {
part1 = fmt.Sprintf("not found: %s", sel)
}
if len(candidates) == 0 {
part2 = "None available."
} else {
part2 = fmt.Sprintf("Candidates: %s", strings.Join(candidates, ", "))
}
return fmt.Errorf("%s %s. %s", t, part1, part2)
}
func selectBenchmark(perfz *Perfz, name string) (*Benchmark, error) {
var bench *Benchmark
var ok bool
candidates := []string{}
for k, _ := range perfz.Benchmarks {
candidates = append(candidates, k)
}
if name != "" {
bench, ok = perfz.Benchmarks[name]
} else if len(candidates) == 1 {
bench, ok = perfz.Benchmarks[candidates[0]], true
}
if !ok {
return nil, notFoundErr("Benchmark", name, candidates)
} else {
return bench, nil
}
}
func selectLink(perfz *Perfz, selector string, pattern *regexp.Regexp) (bench *Benchmark, link *Link, err error) {
components := strings.Split(selector, ":")
var benchmarkSel string
if len(components) >= 1 {
benchmarkSel = components[0]
}
var linkSel string
if len(components) >= 2 {
linkSel = components[1]
}
// Select
bench, err = selectBenchmark(perfz, benchmarkSel)
if err != nil {
return nil, nil, err
}
// Select link
ok := false
candidates := []string{}
for k, _ := range bench.Links {
if pattern == nil || pattern.MatchString(k) {
candidates = append(candidates, k)
}
}
if linkSel != "" {
link, ok = bench.Links[linkSel]
} else if len(candidates) == 1 {
link, ok = bench.Links[candidates[0]], true
}
if !ok {
return bench, nil, notFoundErr("Link", linkSel, candidates)
}
return bench, link, nil
}
func writeAllFn(fn string, fun func(io.Writer) error) error {
var writer io.Writer
if fn == "" {
writer = ioutil.Discard
} else if fn == "-" {
writer = os.Stdout
} else {
f, err := os.OpenFile(fn, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, os.FileMode(0644))
if err != nil {
return err
}
defer f.Close()
writer = f
}
return fun(writer)
}