Patch pm-task for ash.

This commit is contained in:
Ali
2026-04-09 12:51:21 +08:00
parent 3fe2d7abfc
commit 4034114d4d

65
pm-task
View File

@@ -38,29 +38,35 @@ function subBuild() {
} }
# List available projects in a workspace and let user choose one. # List available projects in a workspace and let user choose one.
# Arguments: $1 = workspace path (optional, defaults to current host's workspace) # Sets PROJECT_LIST (newline-separated) and PROJECT_COUNT globals
# Returns: Sets WORKSPACE_CHOICE var to selected project name or empty string
function subListProjects() { function subListProjects() {
local workspace="$1" workspace="$1"
local projects=() PROJECT_LIST=""
PROJECT_COUNT=0
# Get list of subdirectories (excluding special dirs) # Get list of subdirectories (excluding special dirs)
if [ -d "$workspace" ]; then if [ -d "$workspace" ]; then
while IFS= read -r -d '' dir; do for dir in "$workspace"/*/; do
local basename=$(basename "$dir") [ -d "$dir" ] || continue
# Skip hidden dirs and common non-project dirs bname=$(basename "$dir")
if [[ ! "$basename" =~ ^\. ]] && [[ "$basename" != "README"* ]]; then # Skip hidden dirs and README* dirs
projects+=("$basename") case "$bname" in
.*) continue ;;
README*) continue ;;
esac
PROJECT_COUNT=$((PROJECT_COUNT + 1))
if [ -z "$PROJECT_LIST" ]; then
PROJECT_LIST="$bname"
else
PROJECT_LIST="$PROJECT_LIST
$bname"
fi fi
done < <(find "$workspace" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null) done
fi fi
# Store projects in a global array
PROJECTS=("${projects[@]}")
} }
function subGotoWorkspace() { function subGotoWorkspace() {
local workspace="" workspace=""
# Determine workspace path based on hostname # Determine workspace path based on hostname
case $HOSTNAME in case $HOSTNAME in
@@ -90,29 +96,32 @@ function subGotoWorkspace() {
# If no argument provided, list projects and let user choose # If no argument provided, list projects and let user choose
if [ -z "$1" ]; then if [ -z "$1" ]; then
PROJECTS=() PROJECT_LIST=""
PROJECT_COUNT=0
subListProjects "$workspace" subListProjects "$workspace"
if [ ${#PROJECTS[@]} -eq 0 ]; then if [ "$PROJECT_COUNT" -eq 0 ]; then
echo "No projects found in $workspace" echo "No projects found in $workspace"
cd "$workspace" cd "$workspace"
return 0 return 0
fi fi
echo "Available projects in $workspace:" echo "Available projects in $workspace:"
local i=1 count=1
for project in "${PROJECTS[@]}"; do echo "$PROJECT_LIST" | while read -r project; do
echo " [$i] $project" echo " [$count] $project"
((i++)) count=$((count + 1))
done done
echo " [0] Cancel" echo " [0] Cancel"
read -ei 1 -p "Choose a project [1-${#PROJECTS[@]}]: " choice read -r choice
if [[ ! "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 0 ] || [ "$choice" -gt ${#PROJECTS[@]} ]; then case "$choice" in
''|*[!0-9]*)
echo "Invalid choice. Canceling." echo "Invalid choice. Canceling."
cd "$workspace" cd "$workspace"
return 0 return 0
fi ;;
esac
if [ "$choice" -eq 0 ]; then if [ "$choice" -eq 0 ]; then
echo "Canceled." echo "Canceled."
@@ -120,7 +129,15 @@ function subGotoWorkspace() {
return 0 return 0
fi fi
workspace="$workspace/${PROJECTS[$((choice-1))]}" if [ "$choice" -gt "$PROJECT_COUNT" ]; then
echo "Invalid choice. Canceling."
cd "$workspace"
return 0
fi
# Get the selected project
selected=$(echo "$PROJECT_LIST" | sed -n "${choice}p")
workspace="$workspace/$selected"
else else
workspace="$workspace/$1" workspace="$workspace/$1"
fi fi