Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save nikitakarpenkov/eb7484e70083dcc970efe81842e56a7a to your computer and use it in GitHub Desktop.
Save nikitakarpenkov/eb7484e70083dcc970efe81842e56a7a to your computer and use it in GitHub Desktop.
Destructive changes using git diff
#!/bin/bash
write_xml () {
local type_name="$1"
shift
local type_arry=("$@")
XML="${XML}\n\t<types>\n\t\t<name>${type_name}</name>"
for FILENAME in "${type_arry[@]}"; do
XML="${XML}\n\t\t<members>${FILENAME}</members>"
done
XML="${XML}\n\t</types>"
}
TEMP_DIR=.temp
mkdir $TEMP_DIR &> /dev/null
CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
if [ $# -ne 0 ]
then
CURRENT_BRANCH=$1
fi
# detect deletions by tracking metadata files
DIFF_CMD="git diff -z --name-only --no-renames --diff-filter=D master..${CURRENT_BRANCH} -- 'force-app/**/*-meta.xml'"
echo detecting deletes using ${DIFF_CMD}
while read -r -d '' file; do
if [[ ${file} != *-meta.xml ]]; then # ensure we are working with meta files
continue
fi
# ignore files that exist in the deploy folder
FILE_NAME=`expr "${file}" : ".*\/\(.*\)"`
FILE_EXISTS=`find ${TEMP_DIR}/deploy -name "${FILE_NAME}"`
if [[ "${FILE_EXISTS}" != "" ]]; then
continue
fi
FILENAME_WO_EXTENSION=`expr "${FILE_NAME}" : "\([^\.]*\)"`
ALL_FILES+=("${FILENAME_WO_EXTENSION}")
if [[ ${file} =~ \/staticresources\/ ]]; then # StaticResource
echo " - deleting resource ${FILENAME_WO_EXTENSION}"
STATIC_RESOURCES+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/aura\/ ]]; then # AuraDefinitionBundle
echo " - deleting aura ${FILENAME_WO_EXTENSION}"
AURA_BUNDLES+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/lwc\/ ]]; then # LightningComponentBundle
echo " - deleting lwc ${FILENAME_WO_EXTENSION}"
LWC_BUNDLES+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/classes\/ ]]; then # ApexClass
echo " - deleting class ${FILENAME_WO_EXTENSION}"
APEX_CLASSES+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/pages\/ ]]; then # ApexPage
echo " - deleting page ${FILENAME_WO_EXTENSION}"
APEX_PAGES+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/triggers\/ ]]; then # ApexTrigger
echo " - deleting trigger ${FILENAME_WO_EXTENSION}"
APEX_TRIGGERS+=("${FILENAME_WO_EXTENSION}")
elif [[ ${file} =~ \/components\/ ]]; then # ApexComponent
echo " - deleting component ${FILENAME_WO_EXTENSION}"
APEX_COMPONENTS+=("${FILENAME_WO_EXTENSION}")
fi
done < <(sh -c "${DIFF_CMD}")
if [[ "${#ALL_FILES[@]}" == "0" ]]; then
echo "no deletions"
echo ""
exit 0
fi
# create xml
XML='<?xml version="1.0" encoding="UTF-8"?>\n<Package xmlns="http://soap.sforce.com/2006/04/metadata">'
if [[ "${#APEX_CLASSES[@]}" != "0" ]]; then
write_xml 'ApexClass' "${APEX_CLASSES[@]}"
fi
if [[ "${#APEX_PAGES[@]}" != "0" ]]; then
write_xml 'ApexPage' "${APEX_PAGES[@]}"
fi
if [[ "${#APEX_TRIGGERS[@]}" != "0" ]]; then
write_xml 'ApexTrigger' "${APEX_TRIGGERS[@]}"
fi
if [[ "${#APEX_COMPONENTS[@]}" != "0" ]]; then
write_xml 'ApexComponent' "${APEX_COMPONENTS[@]}"
fi
if [[ "${#STATIC_RESOURCES[@]}" != "0" ]]; then
write_xml 'StaticResource' "${STATIC_RESOURCES[@]}"
fi
if [[ "${#AURA_BUNDLES[@]}" != "0" ]]; then
write_xml 'AuraDefinitionBundle' "${AURA_BUNDLES[@]}"
fi
if [[ "${#LWC_BUNDLES[@]}" != "0" ]]; then
write_xml 'LightningComponentBundle' "${LWC_BUNDLES[@]}"
fi
# close xml
XML="${XML}\n\t<version>49.0</version>\n</Package>"
mkdir $TEMP_DIR/deploy &> /dev/null
rm $TEMP_DIR/deploy/destructiveChangesPost.xml &> /dev/null
printf "${XML}" > $TEMP_DIR/deploy/destructiveChangesPost.xml
echo "destructiveChangesPost.xml written to ${TEMP_DIR}/deploy"
echo ""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment