unplugged-system/packages/modules/Bluetooth/tools/bt-api-plumber/bt-api-plumber-9000.sh

560 lines
21 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
YELLOW="\033[1;33m"
NOCOLOR="\033[0m"
BLUE="\033[1;34m"
RED="\033[1;91m"
# TODO(optedoblivion): Check for 'git' and 'clang' binary
function check_environment {
if [[ -z "${ANDROID_BUILD_TOP}" ]] || [[ -z "${ANDROID_HOST_OUT}" ]] ; then
echo -e "${RED}ANDROID_BUILD_TOP${NOCOLOR} or ${RED}ANDROID_HOST_OUT${NOCOLOR} is not set for host run"
echo -e "Navigate to android root and run:"
echo -e "${YELLOW}"
echo -e ". build/envsetup.sh"
echo -e "lunch <fish>"
echo -e "${NOCOLOR}"
echo
exit 1
fi
}
QUOTES=(
"It's a-me, Martino!"
"Hello!"
"Wahoo!"
"Oh yeah!"
"Martino time!"
"Lucky!"
"Hui hew! Just what I needed!"
"Spin! Hammer! Fire! Jump!"
"Yiiiiiipeee!"
"Yeah, ha ha ha!"
"Waha!"
"Let's-a go!"
"Here we go!"
"Yes! I'm the winner!"
"Luigi!"
"Way to go!"
"Here I go!"
"Mama Mia!"
)
VERBOSE=false
# Controller
CONTROLLER=false
CONTROLLER_FILES=(
"system/gd/hci/controller.h"
"system/gd/hci/controller.cc"
"system/gd/hci/controller.cc"
"system/gd/hci/controller_mock.h"
"system/gd/hci/controller_test.cc"
)
CONTROLLER_FIND_PATTERNS=(
" LeRand(LeRandCallback cb);"
"Controller::impl::le_rand_cb<LeRandCompleteView>, cb));"
"impl::le_rand, cb);"
" (LeRandCallback cb));"
" le_rand_set.get_future().wait();"
)
CONTROLLER_CODE_TEMPLATES=(
" virtual void :CamelApiName:();"
" }\\\n\\\n void :snake_api_name:() {\\\n \\\\\/\\\\\/TODO(WHOAMI): Implement HCI Call"
"}\\\n\\\nvoid Controller:::CamelApiName:() {\\\n CallOn(impl_.get(), \\\\\&impl:::snake_api_name:);"
" MOCK_METHOD(void, :CamelApiName:, ());"
"}\\\n\\\nTEST_F(ControllerTest, :CamelApiName:Test) {\\\n controller->:CamelApiName:();"
)
CONTROLLER_REPLACEMENT_PATTERNS=(
"FIRST\n\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
)
# Controller shim
CONTROLLER_SHIM=false
CONTROLLER_SHIM_FILES=(
"system/device/include/controller.h"
"system/main/shim/controller.cc"
"system/main/shim/controller.cc"
"system/test/mock/mock_device_controller.cc"
"system/test/mock/mock_device_controller.cc"
)
CONTROLLER_SHIM_FIND_PATTERNS=(
" (\*le_rand)(LeRandCallback);"
" bluetooth::shim::GetController()->LeRand(cb);"
" controller_le_rand,"
" le_rand(LeRandCallback cb) { return BTM_SUCCESS; }"
" le_rand,"
)
CONTROLLER_SHIM_CODE_TEMPLATES=(
" uint8_t (*:snake_api_name:)(void);"
" return BTM_SUCCESS;\\\n}\\\n\\\nstatic uint8_t controller_:snake_api_name:() {\\\n bluetooth::shim::GetController()->:CamelApiName:();"
" .:snake_api_name: = controller_:snake_api_name:"
"tBTM_STATUS :snake_api_name:() { return BTM_SUCCESS; }"
" :snake_api_name:,"
)
CONTROLLER_SHIM_REPLACEMENT_PATTERNS=(
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
)
## Files length must match templates and replacement pattern lengths!
# BTM
BTM_SHIM=false
BTM_SHIM_FILES=(
"system/main/shim/btm_api.h"
"system/main/shim/btm_api.cc"
"system/test/mock/mock_main_shim_btm_api.cc"
)
BTM_SHIM_FIND_PATTERNS=(
"TM_STATUS BTM_LeRand(LeRandCallback);"
"ontroller_get_interface()->le_rand(cb);"
" bluetooth::shim::BTM_LeRand(LeRandCallback cb) {"
)
BTM_SHIM_CODE_TEMPLATES=(
"\\\\\/*******************************************************************************\\\n *\\\n * Function BTM_:CamelApiName:\\\n *\\\n * Description :API_DESCRIPTION:\\\n *\\\n * Parameters\\\n *\\\n *******************************************************************************\\\\\/\\\ntBTM_STATUS BTM_:CamelApiName:(void);"
" return BTM_SUCCESS;\\\n}\\\n\\\ntBTM_STATUS bluetooth::shim::BTM_:CamelApiName:() {\\\n \\\\\/\\\\\/PLUMB: controller_get_interface()->:snake_api_name:();"
" inc_func_call_count(__func__);\\\n return BTM_SUCCESS;\\\n}\\\n\\\ntBTM_STATUS bluetooth::shim::BTM_:CamelApiName:() {"
)
BTM_SHIM_REPLACEMENT_PATTERNS=(
"FIRST\n\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
)
# BTA
BTA=false
BTA_FILES=(
# External BTA API
"system/bta/include/bta_api.h"
"system/bta/dm/bta_dm_api.cc"
# internal BTA API
"system/bta/dm/bta_dm_int.h"
"system/bta/dm/bta_dm_act.cc"
)
BTA_FIND_PATTERNS=(
"extern void BTA_DmLeRand(LeRandCallback cb);"
"do_in_main_thread(FROM_HERE, base::Bind(bta_dm_le_rand, cb));"
"extern void bta_dm_le_rand(LeRandCallback cb);"
"ooth::shim::BTM_LeRand(cb);"
)
BTA_CODE_TEMPLATES=(
"\\\\\/*******************************************************************************\\\n *\\\n * Function BTA_Dm:CamelApiName:\\\n *\\\n * Description :API_DESCRIPTION:\\\n *\\\n * Parameters\\\n *\\\n *******************************************************************************\\\\\/\\\nextern void BTA_Dm:CamelApiName:();"
"}\\\n\\\nvoid BTA_Dm:CamelApiName:() {\\\n APPL_TRACE_API(\"BTA_Dm:CamelApiName:\");\\\n do_in_main_thread(FROM_HERE, base::Bind(bta_dm_:snake_api_name:));"
"extern void bta_dm_:snake_api_name:();"
"}\\\n\\\n\\\\\/*******************************************************************************\\\n *\\\n * Function BTA_Dm:CamelApiName:\\\n *\\\n * Description :API_DESCRIPTION:\\\n *\\\n * Parameters\\\n *\\\n *******************************************************************************\\\\\/\\\nvoid bta_dm_:snake_api_name:() {\\\n \\\\\/\\\\\/PLUMB: bluetooth::shim::BTM_:CamelApiName:();"
)
BTA_REPLACEMENT_PATTERNS=(
"FIRST\n\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
)
# BTIF
BTIF=false
BTIF_FILES=(
# BTIF DM Layer
"system/btif/include/btif_dm.h"
"system/btif/src/btif_dm.cc"
# BTIF Layer
"system/include/hardware/bluetooth.h"
"system/btif/src/bluetooth.cc"
"system/btif/src/bluetooth.cc"
"system/service/hal/fake_bluetooth_interface.cc"
# Yes double it for two replacements
"system/test/mock/mock_bluetooth_interface.cc"
"system/test/mock/mock_bluetooth_interface.cc"
)
BTIF_FIND_PATTERNS=(
# BTIF DM Layer
"oid btif_dm_le_rand(LeRandCallback callback);"
"_dm_le_rand(callback);"
# BTIF Layer
"} bt_interface_t;"
" void dump("
" le_rand,"
" le_rand "
"EXPORT_SYMBOL"
" le_rand,"
)
BTIF_CODE_TEMPLATES=(
# BTIF DM Layer
" void btif_dm_:snake_api_name:();"
"}\\\n\\\nvoid btif_dm_:snake_api_name:() {\\\n \\\\\/\\\\\/PLUMB: BTA_Dm:CamelApiName:();"
# BTIF Layer
" \\\n\\\\\/**\\\n *\\\n * :API_DESCRIPTION:\\\n *\\\n *\\\\\/\\\nint (*:snake_api_name:)();"
" int :snake_api_name:() {\\\n if(!interface_ready()) return BT_STATUS_NOT_READY;\\\n do_in_main_thread(FROM_HERE, base::BindOnce(btif_dm_:snake_api_name:));\\\n return BT_STATUS_SUCCESS;\\\n}\\\n\\\nstatic"
"\ \ \ \ :snake_api_name:,"
"*\\\\\/\\\n\ \ \ \ nullptr, \\\\\/* :snake_api_name: "
"static int :snake_api_name:() { return 0; }\\\n\\\nE"
"\ \ \ \ :snake_api_name:,"
)
BTIF_REPLACEMENT_PATTERNS=(
# BTIF DM Layer
"FIRST\nSECOND"
"FIRST\nSECOND"
# BTIF Layer
"SECOND\nFIRST"
"SECONDFIRST"
"FIRST\nSECOND"
"FIRSTSECOND"
"SECONDFIRST"
"FIRST\nSECOND"
)
# Topshim
TOPSHIM=false
TOPSHIM_FILES=(
# Topshim API
"system/gd/rust/topshim/src/btif.rs"
"system/gd/rust/topshim/facade/src/adapter_service.rs"
# Topshim Test API
"system/blueberry/facade/topshim/facade.proto"
"system/blueberry/tests/gd/rust/topshim/facade/automation_helper.py"
)
TOPSHIM_FIND_PATTERNS=(
# Topshim API
" le_rand)"
".le_rand();"
# Topshim Test API
" LeRand(google.protobuf.Empty) returns (google.protobuf.Empty) {}"
" self.adapter_stub.LeRand(empty_proto.Empty())"
)
TOPSHIM_CODE_TEMPLATES=(
# Topshim API
" }\\\n\\\n pub fn :snake_api_name:(\\\\\&self) -> i32 {\\\n ccall!(self, :snake_api_name:)"
" ctx.spawn(async move {\\\n sink.success(Empty::default()).await.unwrap();\\\n })\\\n }\\\n\\\n fn :snake_api_name:(\\\\\&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<Empty>) {\\\n self.btif_intf.lock().unwrap().:snake_api_name:();"
# Topshim Test API
" rpc :CamelApiName:(google.protobuf.Empty) returns (google.protobuf.Empty) {}"
" async def :snake_api_name:(self):\\\n await self.adapter_stub.:CamelApiName:(empty_proto.Empty())"
)
TOPSHIM_REPLACEMENT_PATTERNS=(
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\nSECOND"
"FIRST\n\nSECOND"
)
function help_menu {
echo
echo -e "${YELLOW}Help menu${NOCOLOR}"
echo -e "==================================="
echo -e "${BLUE} --controller${NOCOLOR}"
echo -e " Adds plumbing for the GD Controller Layer for the API."
echo -e " This includes test file changes required to build."
echo -e "${BLUE} --controller-shim${NOCOLOR}"
echo -e " Adds plumbing for the GD Controller Shim Layer for the API."
echo -e " This includes test file changes required to build."
echo -e " Will autoplumb to ONLY the GD controller if --controller flag is set. (as opposed to legacy controller btu_hcif)"
echo -e "${BLUE} --btm${NOCOLOR}"
echo -e " Adds plumbing for the BTM Shim Layer for the given API."
echo -e " Will autoplumb to ONLY the controller shim if --controller-shim flag is set. vs directly to legacy btu_hcif"
echo -e "${BLUE} --bta${NOCOLOR}"
echo -e " Adds plumbing for the BTA Layer for the given API."
echo -e " Will autoplumb to BTM if --btm set."
echo -e "${BLUE} --btif${NOCOLOR}"
echo -e " Adds plumbing for the BTIF Layer for the API."
echo -e " This currently includes JNI as it is a requirement for Android to build."
echo -e " Will autoplumb to BTA if --bta set."
echo -e "${BLUE} --topshim${NOCOLOR}"
echo -e " Adds plumbing for the topshim to BTIF Layer for the API."
echo -e " This will also include testing APIs callable from python tests."
echo -e " Will autoplumb to BTIF if --btif set."
echo -e "${BLUE} --verbose${NOCOLOR}"
echo -e " Prints verbose logging."
echo
echo -e "Usage: $0 [--controller|--controller-shim|--btm|--bta|--btif|--topshim] [CamelCaseApiName] [snake_case_api_name] (description)"
echo -e " ${YELLOW}e.g."
echo -e " $0 --controller --btm ClearEventMask clear_event_mask \"Clear out the event mask\""
echo -e " $0 --controller --btm --bta --btif --topshim ClearEventMaskclear_event_mask \"Clear out the event mask\" ${NOCOLOR}"
echo
}
## Start parsing arguments here
POSITIONAL=()
function parse_options {
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--verbose)
VERBOSE=true
shift
;;
--help)
help_menu
shift
exit 0
;;
--controller)
CONTROLLER=true
shift
;;
--controller-shim)
CONTROLLER_SHIM=true
shift
;;
--btm)
# Actually we skip BTM here and just use the BTM Shim
BTM_SHIM=true
shift
;;
--bta)
BTA=true
shift
;;
--btif)
BTIF=true
shift
;;
--topshim)
TOPSHIM=true
shift
;;
--*)
echo "$0: unrecognized argument: '$1'"
echo "Try '$0 --help' for more information"
exit 1
shift
;;
*)
POSITIONAL+=("${1}")
shift
;;
esac
done
set -- "${POSITIONAL[@]}"
}
function show_mario {
MSG="$(mario_message)I'm plumbing the '${1}'"
echo
echo -e "${RED} ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⣤⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⡾⣻⣿⣿⣿⣿⣯⣍⠛⠻⢷⣦⣀⠀⠀⠀⠀⠀⠀⠀ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠟⢁⣾⠟⠋⣁⣀⣤⡉⠻⣷⡀⠀⠙⢿⣷⣄⠀⠀⠀⠀⠀ "
echo -e "${NOCOLOR}⠀⠀⠀⠀⠀⠀⠀⢀⡀${RED}⠀⠀⠀⠀⠀⠀⣰⣿⠏⠀⠀⢸⣿⠀⠼⢋⣉⣈⡳⢀⣿⠃⠀⠀⠀⠙⣿⣦⡀⠀⠀⠀ "
echo -e "${NOCOLOR}⠀⠀⠀⠀⠀⠀⢰⡿⠿⣷⡀⠀${RED}⠀⠀⣼⣿⠃⠀⠀⣀⣤⡿⠟⠛⠋⠉⠉⠙⢛⣻⠶⣦⣄⡀⠀⠘⣿⣷⡀⠀⠀ "
echo -e "${NOCOLOR}⢠⣾⠟⠳⣦⣄⢸⡇⠀⠈⣷⡀${RED}⠀⣼⣿⡏⢀⣤⡾${NOCOLOR}⢋⣵⠿⠻⢿⠋⠉⠉⢻⠟⠛⠻⣦⣝${RED}⠻⣷⣄⠸⣿⣿${NOCOLOR} ( ${MSG} )"
echo -e "⠘⣧⠀⠀⠀⠙⢿⣿⠀⠀⢸⣷${RED}⠀⣿⣿⣧⣾⣏${NOCOLOR}⡴⠛⢡⠖⢛⣲⣅⠀⠀⣴⣋⡉⠳⡄⠈⠳${RED}⢬⣿⣿⣿⡿${NOCOLOR} O"
echo -e "⠀⠘⠷⣤⣀⣀⣀⣽⡶⠛⠛⠛⢷⣿⣿⣿⣿⣏⠀⠀⡏⢰⡿⢿⣿⠀⠀⣿⠻⣿⠀⡷⠀⣠⣾⣿⡿⠛⠷⣦⠀ o"
echo -e "⠀⠀⢀⣾⠟⠉⠙⣿⣤⣄⠀⢀⣾⠉⠀⢹⣿⣿⣷⠀⠹⡘⣷⠾⠛⠋⠉⠛⠻⢿⡴⢃⣄⣻⣿⣿⣷⠀⠀⢹⡇ ."
echo -e "⠀⠀⢸⡇⠈⠉⠛⢦⣿⡏⠀⢸⣧⠀⠈⠻⣿⡿⢣⣾⣦⣽⠃⠀⠀⠀⠀⠀⠀⠀⣷⣾⣿⡇⠉⢿⡇⠀⢀⣼⠇ "
echo -e "⠀⠀⠘⣷⡠⣄⣀⣼⠇⠀⠀⠀⠻⣷⣤⣀⣸⡇⠀⠹⣿⣿⣦⣀⠀⠀⠀⠀⢀⣴⣿⣿⡟⠀⠀⢸⣷⣾⡿⠃⠀ "
echo -e "⠀⠀⠀⠈⠻⢦⣍⣀⣀⣀⡄⠀⣰⣿⡿⠿⢿⣇⠀⠀⠉⠛⠻⣿⣿⡷⠾⣿⣿⡿⠉⠁⠀⠀⢀⣾⠋⠁⠀⠀⠀ "
echo -e "⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠿⢿⣿⣇⠀⠀⠈⢿⣧⣄⠀⠀⠀⢹⣷⣶⣶⣾⣿⡇⠀⠀⣀⣴⡿⣧⣄⡀⠀⠀⠀ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⡀⠀⠀⠙⢿⣿⣶⣤⡀⠻⢤⣀⡤⠞⢀⣴⣿⣿⠟⢷⡀⠙⠻⣦⣄⠀ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣦⠀⢠⡟⠁⠙⢻⣿⠷⠶⣶⠶⠾⠛⠙⣿⠇⠀⠀⢻⡄⠀⠀⠙⢷⡀ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⡀⣿⠁⣤⣤⡄⢻⡶⠶⠛⠛⠛⠛⠛⣿⢠⣾⣷⣆⢻⡀⠀⠀⠈⣷ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⢸⣿⣿⣿⡈⢿⡀⠀⠀⠀⠀⠀⡿⢸⣿⣿⣿⢸⡇⠀⠀⠀⡟ "
echo -e "⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠈⠉⠉⠉⠁⠈⠁⠀⠀⠀⠀⠈⠁⠈⠉⠉⠉⠀⠁⠀⠀⠈⠁ "
echo
}
function mario_done {
echo -e "${YELLOW}Done.${NOCOLOR}"
}
function mario_message {
I=$((0 + $RANDOM % ${#QUOTES[@]}))
echo -en "${BLUE}${QUOTES[$I]}! ${BLUE}${2}${YELLOW}${1} ${NOCOLOR}"
}
# TODO: Pass in which patterns and templates to use
function plumbit {
layer="$1"
shift
camel_api_name="$1"
shift
snake_api_name="$1"
shift
api_description="$1"
shift
files_array=($@)
WORKING_CODE_TEMPLATES=()
WORKING_PATTERNS=()
AUTOPLUMB=false
if [ "$layer" == "controller" ]; then
WORKING_PATTERNS=("${CONTROLLER_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${CONTROLLER_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${CONTROLLER_REPLACEMENT_PATTERNS[@]}")
elif [ "$layer" == "controller_shim" ]; then
WORKING_PATTERNS=("${CONTROLLER_SHIM_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${CONTROLLER_SHIM_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${CONTROLLER_SHIM_REPLACEMENT_PATTERNS[@]}")
AUTOPLUMB=$CONTROLLER
elif [ "$layer" == "btm_shim" ]; then
WORKING_PATTERNS=("${BTM_SHIM_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${BTM_SHIM_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${BTM_SHIM_REPLACEMENT_PATTERNS[@]}")
AUTOPLUMB=$CONTROLLER_SHIM
elif [ "$layer" == "bta" ]; then
WORKING_PATTERNS=("${BTA_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${BTA_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${BTA_REPLACEMENT_PATTERNS[@]}")
AUTOPLUMB=$BTM_SHIM
elif [ "$layer" == "btif" ]; then
WORKING_PATTERNS=("${BTIF_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${BTIF_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${BTIF_REPLACEMENT_PATTERNS[@]}")
AUTOPLUMB=$BTA
elif [ "$layer" == "topshim" ]; then
WORKING_PATTERNS=("${TOPSHIM_FIND_PATTERNS[@]}")
WORKING_CODE_TEMPLATES=("${TOPSHIM_CODE_TEMPLATES[@]}")
WORKING_REPLACEMENTS=("${TOPSHIM_REPLACEMENT_PATTERNS[@]}")
AUTOPLUMB=$BTIF
fi
for index in ${!files_array[@]}; do
CODE=$(echo "${WORKING_CODE_TEMPLATES[$index]}" | sed "s/:CamelApiName:/$camel_api_name/g" | sed "s/:snake_api_name:/$snake_api_name/g" | sed "s/WHOAMI/$(whoami)/g" | sed "s/:API_DESCRIPTION:/${api_description}/g")
if [ "$AUTOPLUMB" == true ]; then
CODE=$(echo "${CODE}" | sed "s/PLUMB:/ Autoplumbed\\\\\\\n /g")
fi
PATTERN="${WORKING_PATTERNS[$index]}"
REPLACEMENT=$(echo ${WORKING_REPLACEMENTS[$index]} | sed s/FIRST/"\\${PATTERN}"/g | sed s/SECOND/"${CODE}"/g)
if [ "$VERBOSE" == true ]; then
echo sed -i "s/\\${PATTERN}/\\${REPLACEMENT}/g" "${files_array[$index]}"
fi
sed -i "s/\\${PATTERN}/\\${REPLACEMENT}/g" "${files_array[$index]}"
done
}
CL_COUNT=0
function commitit {
mario_message "${1}" "Committing the code..."
git commit -qam "${2} ${1} API"
mario_done
let CL_COUNT=$CL_COUNT+1
}
function clangit {
FORMATTER="${ANDROID_BUILD_TOP}/tools/repohooks/tools/clang-format.py"
FIX="--fix"
CLANG_FORMAT="--clang-format ${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-stable/bin/clang-format"
GIT_CLANG_FORMAT="--git-clang-format ${ANDROID_BUILD_TOP}/prebuilts/clang/host/linux-x86/clang-stable/bin/git-clang-format"
COMMIT="--commit"
STYLE="--style file"
EXTENSIONS="--extensions c,h,cc,cpp,hpp"
HASH="$1"
CMD="${FORMATTER} ${FIX} ${CLANG_FORMAT} ${GIT_CLANG_FORMAT} ${COMMIT} ${HASH} ${STYLE} ${EXTENSIONS}"
$(${CMD})
}
function rustfmtit {
echo "rusty rust"
# FORMATTER="${ANDROID_BUILD_TOP}/prebuilts/rust/linux-x86/stable/rustfmt"
# CONFIG="'--config-path=rustfmt.toml'"
# FILE=""
# CMD="${FORMATTER} ${CONFIG} ${FILE}"
# $(${CMD})
}
function formatit {
mario_message "${1}" "Formatting the code..."
hash="$(git log -n 1 --pretty=oneline | awk '{ print $1 }')"
clangit $hash
rustfmtit $hash
git commit -a --amend --no-edit
mario_done
}
function controller {
if [ "$CONTROLLER" == false ]; then
return
fi
mario_message "Controller" "Plumbing the '${1}' API..."
plumbit "controller" "${1}" "${2}" "${3}" "${CONTROLLER_FILES[@]}"
mario_done
commitit "Controller" "${3}"
formatit "Controller"
}
function controller_shim {
if [ "$CONTROLLER_SHIM" == false ]; then
return
fi
mario_message "Controller shim" "Plumbing the '${1}' API..."
plumbit "controller_shim" "${1}" "${2}" "${3}" "${CONTROLLER_SHIM_FILES[@]}"
mario_done
commitit "Controller shim" "${3}"
formatit "Controller shim"
}
function btm_shim {
if [ "$BTM_SHIM" == false ]; then
return
fi
mario_message "BTM" "Plumbing the '${1}' API..."
plumbit "btm_shim" "${1}" "${2}" "${3}" "${BTM_SHIM_FILES[@]}"
mario_done
commitit "BTM" "${3}"
formatit "BTM"
}
function bta {
if [ "$BTA" == false ]; then
return
fi
mario_message "BTA" "Plumbing the '${1}' API..."
plumbit "bta" "${1}" "${2}" "${3}" "${BTA_FILES[@]}"
mario_done
commitit "BTA" "${3}"
formatit "BTA"
}
function btif {
if [ "$BTIF" == false ]; then
return
fi
mario_message "BTIF" "Plumbing the '${1}' API..."
plumbit "btif" "${1}" "${2}" "${3}" "${BTIF_FILES[@]}"
mario_done
commitit "BTIF" "${3}"
formatit "BTIF"
}
function topshim {
if [ "$TOPSHIM" == false ]; then
return
fi
mario_message "Topshim" "Plumbing the '${1}' API..."
plumbit "topshim" "${1}" "${2}" "${3}" "${TOPSHIM_FILES[@]}"
mario_done
commitit "Topshim" "${3}"
formatit "Topshim"
}
function main {
check_environment
parse_options $@
if [ "${#POSITIONAL[@]}" -lt 3 ]; then
echo -e "${RED}Error: Invalid argument count for API Names!${NOCOLOR}"
help_menu
exit 1
fi
camel_api_name="${POSITIONAL[0]}"
snake_api_name="${POSITIONAL[1]}"
api_description="${POSITIONAL[@]:2}"
show_mario "${camel_api_name} API that ${api_description}!"
controller "${camel_api_name}" "${snake_api_name}" "${api_description}"
controller_shim "${camel_api_name}" "${snake_api_name}" "${api_description}"
btm_shim "${camel_api_name}" "${snake_api_name}" "${api_description}"
bta "${camel_api_name}" "${snake_api_name}" "${api_description}"
btif "${camel_api_name}" "${snake_api_name}" "${api_description}"
topshim "${camel_api_name}" "${snake_api_name}" "${api_description}"
git rebase -i HEAD~${CL_COUNT} -x 'git commit --amend'
}
main $@
#/usr/local/google/home/optedoblivion/workspace/AOSP/prebuilts/rust/linux-x86/stable/rustfmt '--config-path=rustfmt.toml' system/gd/rust/topshim/facade/src/adapter_service.rs