Files
swift-nio/dev/alloc-limits-from-test-output
George Barnett 100b1f4ff9 Print alloc-limits-from-test-output usage when no args (#3041)
Motivation:

The alloc-limits-from-test-output doesn't print usage if you don't pass
in a format arg, it just sits and waits for stdin.

Modifications:

Print usage if running interactively

Result:

Easier to get usage
2025-01-07 10:36:03 +00:00

111 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is part of the SwiftNIO open source project
##
## Copyright (c) 2021 Apple Inc. and the SwiftNIO project authors
## Licensed under Apache License v2.0
##
## See LICENSE.txt for license information
## See CONTRIBUTORS.txt for the list of SwiftNIO project authors
##
## SPDX-License-Identifier: Apache-2.0
##
##===----------------------------------------------------------------------===##
# This script allows you to consume any Jenkins/alloc counter run output and
# convert it into the right for for the docker-compose script.
set -eu
mode_flag=${1---docker-compose}
function usage() {
echo >&1 "Usage: $0 [--docker-compose|--export|--json]"
echo >&1
echo >&1 "Example:"
echo >&1 " # copy the output from the Jenkins CI into your clipboard, then"
echo >&1 " pbpaste | $0 --docker-compose"
}
function die() {
echo >&2 "ERROR: $*"
exit 1
}
case "$mode_flag" in
--docker-compose)
mode=docker
;;
--export)
mode="export"
;;
--json)
mode=json
;;
*)
usage
exit 1
;;
esac
# stdin is coming from a terminal, i.e. nothing is being piped in.
if [[ -t 0 ]]; then
usage
exit 1
fi
function allow_slack() {
raw="$1"
if [[ ! "$raw" =~ ^[0-9]+$ ]]; then
die "not a malloc count: '$raw'"
fi
if [[ "$raw" -lt 1000 ]]; then
echo "$raw"
return
fi
allocs=$raw
while true; do
allocs=$(( allocs + 1 ))
if [[ "$allocs" =~ [0-9]+00$ || "$allocs" =~ [0-9]+50$ ]]; then
echo "$allocs"
return
fi
done
}
json_blob="{"
lines=$(grep -e "total number of mallocs" -e ".total_allocations" -e "export MAX_ALLOCS_ALLOWED_" | \
sed -e "s/: total number of mallocs: /=/g" \
-e "s/.total_allocations: /=/g" \
-e "s/info: /test_/g" \
-e "s/export MAX_ALLOCS_ALLOWED_/test_/g" | \
grep -Eo 'test_[a-zA-Z0-9_-]+=[0-9]+' | sort | uniq)
while read -r info; do
test_name=$(echo "$info" | sed "s/test_//g" | cut -d= -f1 )
allocs=$(allow_slack "$(echo "$info" | cut -d= -f2 | sed "s/ //g")")
case "$mode" in
docker)
echo " - MAX_ALLOCS_ALLOWED_$test_name=$allocs"
;;
export)
echo "export MAX_ALLOCS_ALLOWED_$test_name=$allocs"
;;
json)
json_blob="${json_blob}"$'\n'" \"$test_name\": $allocs,"
;;
*)
die "Unexpected mode: $mode"
;;
esac
done <<< "$lines"
if [[ "$mode" == "json" ]]; then
json_blob=$(sed '$ s/,$//g' <<< "$json_blob")
json_blob+=$'\n'"}"
echo "$json_blob"
fi