// Copyright 2017 The Bazel Authors. All rights reserved.
//
// 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 com.google.devtools.build.benchmark;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.devtools.common.options.Options;
import com.google.devtools.common.options.OptionsParsingException;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.util.JsonFormat;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;
import java.util.logging.Level;
import java.util.logging.Logger;
/** Main class for running benchmark. */
public class Main {
private static final Logger logger = Logger.getLogger(Main.class.getName());
public static void main(String[] args) {
BenchmarkOptions opt = null;
try {
opt = parseArgs(args);
} catch (Exception e) {
if (!e.getMessage().isEmpty()) {
logger.log(Level.SEVERE, e.getMessage());
}
System.exit(1);
}
// Prepare paths
File workspace = new File(opt.workspace);
if (workspace.isFile()) {
logger.log(Level.SEVERE, "Workspace directory is an existing file: " + opt.workspace);
System.exit(1);
}
if (!workspace.exists() && !workspace.mkdirs()) {
logger.log(Level.SEVERE, "Failed to create workspace directory: " + opt.workspace);
System.exit(1);
}
File outputFile = new File(opt.output);
if (outputFile.exists()) {
logger.log(Level.SEVERE, "Output file already exists: " + opt.output);
System.exit(1);
}
BuildGroupRunner runner = new BuildGroupRunner(workspace.toPath());
BuildGroupResult result = null;
try {
result = runner.run(opt);
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage());
System.exit(1);
}
// Store data
try {
Writer writer = Files.newBufferedWriter(outputFile.toPath(), UTF_8);
JsonFormat.printer().appendTo(result, writer);
writer.flush();
} catch (InvalidProtocolBufferException e) {
logger.log(Level.SEVERE, "Invalid protobuf: " + e.getMessage());
System.exit(1);
} catch (IOException e) {
logger.log(Level.SEVERE, "Failed to write to output file: " + e.getMessage());
System.exit(1);
}
}
public static BenchmarkOptions parseArgs(String[] args) throws OptionsParsingException {
BenchmarkOptions opt = Options.parse(BenchmarkOptions.class, args).getOptions();
// Missing options
if (opt.workspace.isEmpty() || opt.output.isEmpty()) {
System.err.println(Options.getUsage(BenchmarkOptions.class));
throw new IllegalArgumentException("Argument --workspace and --output should not be empty.");
}
// Should use exact one argument between from/to, after/before and versions
int emptyNum = booleanToInt(opt.versionFilter == null)
+ booleanToInt(opt.dateFilter == null)
+ booleanToInt(opt.versions.isEmpty());
if (emptyNum != 2) {
System.err.println(Options.getUsage(BenchmarkOptions.class));
throw new IllegalArgumentException("Please use exact one type of version filter at a time.");
}
return opt;
}
private static int booleanToInt(boolean b) {
return b ? 1 : 0;
}
}