diff --git a/tools/gerrit_delete_group.sh b/tools/gerrit_delete_group.sh new file mode 100755 index 0000000000..68732084a8 --- /dev/null +++ b/tools/gerrit_delete_group.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# Gerrit does not have a feature to delete Groups. This is a +# helper script to delete Gerrit groups from the database. +# This script will remove a Gerrit group but does not remove the +# group from the project's groups file (in refs/meta/config). +# If the group was previously used to provide/restrict access to a +# project label, branch, etc.. then it will still appear +# on the project access page. Since Gerrit doesn't know +# about the group anymore it will just get ignored. Basically +# you might be left with access rules that may not have +# any meaning. You would need to manually cleanup the deleted +# groups from the project access page. +# +# Reference: +# Directions for db manipulation documented in this gerrit issue: +# https://code.google.com/p/gerrit/issues/detail?id=44 +# +# To execute: +# ./gerrit-delete-group.sh /home/gerrit2/review_site "group to remove" + + +function get_config_data { + # Get DB config from existing gerrit site + local config_path=$1 + local config="$1/etc/gerrit.config" + local secure="$1/etc/secure.config" + + [[ ! -e "${config}" ]] && { echo "No gerrit config file supplied!"; exit 2; } + [[ ! -e "${secure}" ]] && { echo "No gerrit secure file supplied!"; exit 2; } + + CONFIG=${config} + DB_HOST=$(git config --file ${config} --get database.hostname) + DB_PORT=$(git config --file ${config} --get database.port) + if [ -z "${DB_PORT}" ] ; then + DB_PORT="3306" + fi + DB_NAME=$(git config --file ${config} --get database.database) + DB_USER=$(git config --file ${config} --get database.username) + DB_PASSWD=$(git config --file ${secure} --get database.password) +} + +function delete_group { + local name="$1" + + mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASSWD:+-p${DB_PASSWD}} ${DB_NAME} -e "DELETE FROM account_groups WHERE name='${name}';" + mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASSWD:+-p${DB_PASSWD}} ${DB_NAME} -e "DELETE FROM account_group_names WHERE group_id NOT IN (SELECT group_id FROM account_groups);" + +} + +function cleanup { + # clean up the database a bit to remove the now orphaned records: + + mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASSWD:+-p${DB_PASSWD}} ${DB_NAME} -e "DELETE FROM account_group_members WHERE group_id NOT IN (SELECT group_id FROM account_groups);" + mysql -h ${DB_HOST} -P ${DB_PORT} -u ${DB_USER} ${DB_PASSWD:+-p${DB_PASSWD}} ${DB_NAME} -e "DELETE FROM account_group_members_audit WHERE group_id NOT IN (SELECT group_id FROM account_groups);" + +} + +# main +REVIEW_SITE_PATH=$1 +GROUP=$2 +get_config_data ${REVIEW_SITE_PATH} +delete_group "${GROUP}" +cleanup