mirror of
https://github.com/tw93/Mole.git
synced 2026-03-22 20:15:07 +00:00
refactor(clean): extract shared purge hint helpers
This commit is contained in:
137
lib/clean/purge_shared.sh
Normal file
137
lib/clean/purge_shared.sh
Normal file
@@ -0,0 +1,137 @@
|
||||
#!/bin/bash
|
||||
# Shared purge configuration and helpers (side-effect free).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [[ -n "${MOLE_PURGE_SHARED_LOADED:-}" ]]; then
|
||||
return 0
|
||||
fi
|
||||
readonly MOLE_PURGE_SHARED_LOADED=1
|
||||
|
||||
# Canonical purge targets (heavy project build artifacts).
|
||||
readonly MOLE_PURGE_TARGETS=(
|
||||
"node_modules"
|
||||
"target" # Rust, Maven
|
||||
"build" # Gradle, various
|
||||
"dist" # JS builds
|
||||
"venv" # Python
|
||||
".venv" # Python
|
||||
".pytest_cache" # Python (pytest)
|
||||
".mypy_cache" # Python (mypy)
|
||||
".tox" # Python (tox virtualenvs)
|
||||
".nox" # Python (nox virtualenvs)
|
||||
".ruff_cache" # Python (ruff)
|
||||
".gradle" # Gradle local
|
||||
"__pycache__" # Python
|
||||
".next" # Next.js
|
||||
".nuxt" # Nuxt.js
|
||||
".output" # Nuxt.js
|
||||
"vendor" # PHP Composer
|
||||
"bin" # .NET build output (guarded; see is_protected_purge_artifact)
|
||||
"obj" # C# / Unity
|
||||
".turbo" # Turborepo cache
|
||||
".parcel-cache" # Parcel bundler
|
||||
".dart_tool" # Flutter/Dart build cache
|
||||
".zig-cache" # Zig
|
||||
"zig-out" # Zig
|
||||
".angular" # Angular
|
||||
".svelte-kit" # SvelteKit
|
||||
".astro" # Astro
|
||||
"coverage" # Code coverage reports
|
||||
"DerivedData" # Xcode
|
||||
"Pods" # CocoaPods
|
||||
".cxx" # React Native Android NDK build cache
|
||||
".expo" # Expo
|
||||
)
|
||||
|
||||
readonly MOLE_PURGE_DEFAULT_SEARCH_PATHS=(
|
||||
"$HOME/www"
|
||||
"$HOME/dev"
|
||||
"$HOME/Projects"
|
||||
"$HOME/GitHub"
|
||||
"$HOME/Code"
|
||||
"$HOME/Workspace"
|
||||
"$HOME/Repos"
|
||||
"$HOME/Development"
|
||||
)
|
||||
|
||||
readonly MOLE_PURGE_MONOREPO_INDICATORS=(
|
||||
"lerna.json"
|
||||
"pnpm-workspace.yaml"
|
||||
"nx.json"
|
||||
"rush.json"
|
||||
)
|
||||
|
||||
readonly MOLE_PURGE_PROJECT_INDICATORS=(
|
||||
"package.json"
|
||||
"Cargo.toml"
|
||||
"go.mod"
|
||||
"pyproject.toml"
|
||||
"requirements.txt"
|
||||
"pom.xml"
|
||||
"build.gradle"
|
||||
"Gemfile"
|
||||
"composer.json"
|
||||
"pubspec.yaml"
|
||||
"Makefile"
|
||||
"build.zig"
|
||||
"build.zig.zon"
|
||||
".git"
|
||||
)
|
||||
|
||||
# High-noise targets intentionally excluded from quick hint scans in mo clean.
|
||||
readonly MOLE_PURGE_QUICK_HINT_EXCLUDED_TARGETS=(
|
||||
"bin"
|
||||
"vendor"
|
||||
)
|
||||
|
||||
mole_purge_is_project_root() {
|
||||
local dir="$1"
|
||||
local indicator
|
||||
|
||||
for indicator in "${MOLE_PURGE_MONOREPO_INDICATORS[@]}"; do
|
||||
if [[ -e "$dir/$indicator" ]]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
for indicator in "${MOLE_PURGE_PROJECT_INDICATORS[@]}"; do
|
||||
if [[ -e "$dir/$indicator" ]]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
mole_purge_quick_hint_target_names() {
|
||||
local target
|
||||
local excluded
|
||||
local is_excluded
|
||||
|
||||
for target in "${MOLE_PURGE_TARGETS[@]}"; do
|
||||
is_excluded=false
|
||||
for excluded in "${MOLE_PURGE_QUICK_HINT_EXCLUDED_TARGETS[@]}"; do
|
||||
if [[ "$target" == "$excluded" ]]; then
|
||||
is_excluded=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
[[ "$is_excluded" == "true" ]] && continue
|
||||
printf '%s\n' "$target"
|
||||
done
|
||||
}
|
||||
|
||||
mole_purge_read_paths_config() {
|
||||
local config_file="${1:-$HOME/.config/mole/purge_paths}"
|
||||
[[ -f "$config_file" ]] || return 0
|
||||
|
||||
local line
|
||||
while IFS= read -r line; do
|
||||
line="${line#"${line%%[![:space:]]*}"}"
|
||||
line="${line%"${line##*[![:space:]]}"}"
|
||||
[[ -z "$line" || "$line" =~ ^# ]] && continue
|
||||
line="${line/#\~/$HOME}"
|
||||
printf '%s\n' "$line"
|
||||
done < "$config_file"
|
||||
}
|
||||
Reference in New Issue
Block a user