Odoo18-Base/setup/clean_up_addons.sh
2025-03-10 10:59:34 +07:00

101 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# Check if at least one root folder is provided as an argument
if [ $# -eq 0 ]; then
echo "Usage: $0 <root_folder> [<root_folder>...]"
echo "Please provide at least one root folder path."
exit 1
fi
# Define the protected items list file
PROTECTED_LIST="protected.txt"
if [ ! -f "$PROTECTED_LIST" ]; then
echo "Error: '$PROTECTED_LIST' not found."
echo "Please create 'protected.txt' one directory up with a list of protected files/folders (one per line)."
exit 1
fi
# Safeguard: Check if any file/folder matching patterns in protected.txt exists in a root folder
check_protected_items() {
local root_dir="$1"
while IFS= read -r pattern; do
# Skip empty lines
[ -z "$pattern" ] && continue
# Handle wildcards by using find for pattern matching
if [[ "$pattern" == *"*"* ]]; then
# Convert pattern to a find-compatible search
if [[ "$pattern" == /* ]]; then
search_path="${root_dir}${pattern}"
else
search_path="${root_dir}/${pattern}"
fi
# Use find to check if any files match the pattern
if find "$root_dir" -path "$search_path" 2>/dev/null | grep -q .; then
echo "Error: Protected pattern '$pattern' matches files in '$root_dir'. Aborting execution."
exit 1
fi
else
# Exact match for non-wildcard entries
if [ -e "$root_dir/$pattern" ]; then
echo "Error: Protected item '$pattern' found in '$root_dir'. Aborting execution."
exit 1
fi
fi
done < "$PROTECTED_LIST"
}
# Function to check and delete subfolders
delete_non_manifest_folders() {
local dir="$1"
# Loop through all immediate subdirectories in the given directory
for subfolder in "$dir"/*/ ; do
# Check if it's a directory
if [ -d "$subfolder" ]; then
# Check if __manifest__.py exists in this subfolder
if [ ! -f "$subfolder/__manifest__.py" ]; then
echo "Deleting '$subfolder' (no __manifest__.py found)"
rm -rf "$subfolder"
else
echo "Keeping '$subfolder' (__manifest__.py found)"
fi
fi
done
}
# Process each root folder provided as an argument
for ROOT_FOLDER in "$@"; do
# Check if the root folder exists and is a directory
if [ ! -d "$ROOT_FOLDER" ]; then
echo "Error: '$ROOT_FOLDER' is not a valid directory. Skipping."
continue
fi
# Perform the safeguard check for this root folder
echo "Checking for protected items in '$ROOT_FOLDER' from '$PROTECTED_LIST'..."
check_protected_items "$ROOT_FOLDER"
# Change to the root folder to handle relative paths cleanly
cd "$ROOT_FOLDER" || {
echo "Error: Could not change to directory '$ROOT_FOLDER'. Skipping."
continue
}
# Call the function with the current root folder
echo "Processing '$ROOT_FOLDER'..."
delete_non_manifest_folders "."
# Return to the original directory to process the next root folder
cd - > /dev/null || {
echo "Error: Could not return from '$ROOT_FOLDER'. Exiting."
exit 1
}
echo "Cleanup complete for '$ROOT_FOLDER'!"
done
echo "All root folders processed!"
exit 0