560 lines
21 KiB
Bash
Executable File
560 lines
21 KiB
Bash
Executable File
#!/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
|