Skip to content

Update the contract of command line tools #283

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 7, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,9 @@
import picocli.CommandLine.Parameters;

import java.io.IOException;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -108,8 +106,8 @@ private BuildValidationData fetchBuildScanData(int index, URL buildScanUrl, Cust
"",
null,
Collections.emptyMap(),
Duration.ZERO,
BigDecimal.ZERO);
null,
null);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.math.BigDecimal;
import java.time.Duration;
import java.util.Arrays;
import java.util.Locale;
import java.util.function.Function;
import java.util.stream.Stream;

Expand All @@ -31,11 +30,12 @@ public enum Fields {
EXECUTED_CACHEABLE_DURATION("Executed cacheable duration", d -> totalDuration(d, "executed_cacheable")),
EXECUTED_NOT_CACHEABLE("Executed not cacheable", d -> totalTasks(d, "executed_not_cacheable")),
EXECUTED_NOT_CACHEABLE_DURATION("Executed not cacheable duration", d -> totalDuration(d, "executed_not_cacheable")),
EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> String.valueOf(d.getEffectiveTaskExecutionDuration().toMillis())),
SERIALIZATION_FACTOR("Serialization factor", d -> formatBigDecimal(d.getSerializationFactor())),
EXECUTED_CACHEABLE_DURATION_MILLISECONDS("Executed cacheable duration milliseconds", d -> totalDurationMillis(d, "executed_cacheable")),
EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> formatDuration(d.getEffectiveTaskExecutionDuration())),
SERIALIZATION_FACTOR("Serialization factor", d -> toStringSafely(d.getSerializationFactor())),
;

private static final String NO_VALUE = "";

public final String label;
public final Function<BuildValidationData, String> value;

Expand All @@ -49,65 +49,33 @@ public static Stream<Fields> ordered() {
}

private static String toStringSafely(Object object) {
if (object == null) {
return "";
}
return object.toString();
return object == null ? NO_VALUE : object.toString();
}

private static String toStringSafely(BigDecimal value) {
return value == null ? NO_VALUE : value.toPlainString();
}

private static String totalTasks(BuildValidationData data, String avoidanceOutcome) {
if (data.getTasksByAvoidanceOutcome().containsKey(avoidanceOutcome)) {
return data.getTasksByAvoidanceOutcome().get(avoidanceOutcome).totalTasks().toString();
}
return "";
return summaryTotal(data, avoidanceOutcome, t -> String.valueOf(t.totalTasks()));
}

private static String totalAvoidanceSavings(BuildValidationData data, String avoidanceOutcome) {
return formatDuration(
data.getTasksByAvoidanceOutcome()
.getOrDefault(avoidanceOutcome, TaskExecutionSummary.ZERO)
.totalAvoidanceSavings()
);
return summaryTotal(data, avoidanceOutcome, t -> formatDuration(t.totalAvoidanceSavings()));
}

private static String totalDuration(BuildValidationData data, String avoidanceOutcome) {
return formatDuration(
data.getTasksByAvoidanceOutcome()
.getOrDefault(avoidanceOutcome, TaskExecutionSummary.ZERO)
.totalDuration()
);
}

private static String totalDurationMillis(BuildValidationData data, String avoidanceOutcome) {
return String.valueOf(
data.getTasksByAvoidanceOutcome()
.getOrDefault(avoidanceOutcome, TaskExecutionSummary.ZERO)
.totalDuration()
.toMillis()
);
return summaryTotal(data, avoidanceOutcome, t -> formatDuration(t.totalDuration()));
}

private static String formatDuration(Duration duration) {
long hours = duration.toHours();
long minutes = duration.minusHours(hours).toMinutes();
double seconds = duration.minusHours(hours).minusMinutes(minutes).toMillis() / 1000d;

StringBuilder s = new StringBuilder();
if (hours != 0) {
s.append(hours + "h ");
}
if (minutes != 0) {
s.append(minutes + "m ");
private static String summaryTotal(BuildValidationData data, String avoidanceOutcome, Function<TaskExecutionSummary, String> toString) {
if (data.getTasksByAvoidanceOutcome().containsKey(avoidanceOutcome)) {
return toString.apply(data.getTasksByAvoidanceOutcome().get(avoidanceOutcome));
}
s.append(String.format(Locale.ROOT, "%.3fs", seconds));

return s.toString().trim();
return NO_VALUE;
}

private static String formatBigDecimal(BigDecimal value) {
if (value.compareTo(BigDecimal.ZERO) == 0) {
return "";
}
return value.toPlainString();
private static String formatDuration(Duration duration) {
return duration == null ? NO_VALUE : String.valueOf(duration.toMillis());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,6 @@ public String getRootProjectName() {
return rootProjectName;
}

public boolean isRootProjectNameFound() {
return isFound(rootProjectName);
}

public String getBuildScanId() {
return buildScanId;
}
Expand Down Expand Up @@ -104,26 +100,14 @@ public List<String> getRequestedTasks() {
return requestedTasks;
}

public boolean isRequestedTasksFound() {
return !requestedTasks.isEmpty();
}

public String getBuildOutcome() {
return buildOutcome;
}

public boolean isBuildOutcomeFound() {
return isFound(buildOutcome);
}

public URL getRemoteBuildCacheUrl() {
return remoteBuildCacheUrl;
}

public boolean isRemoteBuildCacheUrlFound() {
return remoteBuildCacheUrl != null;
}

public String getRemoteBuildCacheShard() {
if (remoteBuildCacheUrl == null) {
return "";
Expand Down
5 changes: 0 additions & 5 deletions components/scripts/gradle/01-validate-incremental-building.sh
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,6 @@ fetch_build_cache_metrics() {
fi
}

# Overrides info.sh#print_performance_metrics
print_performance_metrics() {
print_performance_characteristics
}

# Overrides info.sh#print_performance_characteristics
print_performance_characteristics() {
print_performance_characteristics_header
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,6 @@ fetch_build_cache_metrics() {
fi
}

# Overrides info.sh#print_performance_metrics
print_performance_metrics() {
print_performance_characteristics
}

print_quick_links() {
info "Investigation Quick Links"
info "-------------------------"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,6 @@ fetch_build_cache_metrics() {
fi
}

# Overrides info.sh#print_performance_metrics
print_performance_metrics() {
print_performance_characteristics
}

print_quick_links() {
info "Investigation Quick Links"
info "-------------------------"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,6 @@ print_experiment_specific_summary_info() {
summary_row "Custom value mapping file:" "${mapping_file:-<none>}"
}

# Overrides info.sh#print_performance_metrics
print_performance_metrics() {
print_performance_characteristics
}

print_quick_links() {
info "Investigation Quick Links"
info "-------------------------"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,6 @@ print_experiment_specific_summary_info() {
summary_row "Custom value mapping file:" "${mapping_file:-<none>}"
}

# Overrides info.sh#print_performance_metrics
print_performance_metrics() {
print_performance_characteristics
}

print_quick_links() {
info "Investigation Quick Links"
info "-------------------------"
Expand Down
18 changes: 4 additions & 14 deletions components/scripts/lib/build-scan-parse.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ executed_not_cacheable_duration=()
# Build duration metrics
effective_task_execution_duration=()
serialization_factors=()
executed_cacheable_duration_milliseconds=()

parse_build_scan_csv() {
# This isn't the most robust way to read a CSV,
Expand All @@ -47,7 +46,7 @@ parse_build_scan_csv() {
idx=0

# shellcheck disable=SC2034 # not all scripts use all of the fetched data
while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21 field_22; do
while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21; do
if [[ "$header_row_read" == "false" ]]; then
header_row_read=true
continue;
Expand Down Expand Up @@ -78,18 +77,9 @@ parse_build_scan_csv() {
executed_not_cacheable_num_tasks[idx]="${field_18}"
executed_not_cacheable_duration[idx]="${field_19}"

# Conditional because build-scan-support-tool does not yet support these fields
if [[ -n "$field_20" ]]; then
effective_task_execution_duration[idx]="${field_20}"
fi

if [[ -n "$field_21" ]]; then
serialization_factors[idx]="${field_21}"
fi

if [[ -n "$field_22" ]]; then
executed_cacheable_duration_milliseconds[idx]="${field_22}"
fi
# Build duration metrics
effective_task_execution_duration[idx]="${field_20}"
serialization_factors[idx]="${field_21}"

((idx++))
done <<< "${build_scan_csv}"
Expand Down
Loading