From 4034114d4d681f45024bc62ed67fa917cba14631 Mon Sep 17 00:00:00 2001 From: Ali Date: Thu, 9 Apr 2026 12:51:21 +0800 Subject: [PATCH] Patch pm-task for ash. --- pm-task | 79 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/pm-task b/pm-task index 80a4777..7485ed6 100755 --- a/pm-task +++ b/pm-task @@ -11,7 +11,7 @@ # Image building with docker compose. function subBuild() { - + if [ -f compose.yaml ] || [ -f docker-compose.yml ] || [ -f container-compose.yml ]; then ls -lah @@ -23,7 +23,7 @@ function subBuild() { if [[ $confirm =~ ^[Yy]$ ]]; then docker compose down && docker compose up -d fi - + # read -e -p "Restart nginx service in container? " confirm # if [[ $confirm =~ ^[Yy]$ ]]; then # docker exec -d nginx service nginx reload @@ -38,29 +38,35 @@ function subBuild() { } # List available projects in a workspace and let user choose one. -# Arguments: $1 = workspace path (optional, defaults to current host's workspace) -# Returns: Sets WORKSPACE_CHOICE var to selected project name or empty string +# Sets PROJECT_LIST (newline-separated) and PROJECT_COUNT globals function subListProjects() { - local workspace="$1" - local projects=() + workspace="$1" + PROJECT_LIST="" + PROJECT_COUNT=0 # Get list of subdirectories (excluding special dirs) if [ -d "$workspace" ]; then - while IFS= read -r -d '' dir; do - local basename=$(basename "$dir") - # Skip hidden dirs and common non-project dirs - if [[ ! "$basename" =~ ^\. ]] && [[ "$basename" != "README"* ]]; then - projects+=("$basename") + for dir in "$workspace"/*/; do + [ -d "$dir" ] || continue + bname=$(basename "$dir") + # Skip hidden dirs and README* dirs + 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 - done < <(find "$workspace" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null) + done fi - - # Store projects in a global array - PROJECTS=("${projects[@]}") } function subGotoWorkspace() { - local workspace="" + workspace="" # Determine workspace path based on hostname case $HOSTNAME in @@ -90,29 +96,32 @@ function subGotoWorkspace() { # If no argument provided, list projects and let user choose if [ -z "$1" ]; then - PROJECTS=() + PROJECT_LIST="" + PROJECT_COUNT=0 subListProjects "$workspace" - if [ ${#PROJECTS[@]} -eq 0 ]; then + if [ "$PROJECT_COUNT" -eq 0 ]; then echo "No projects found in $workspace" cd "$workspace" return 0 fi echo "Available projects in $workspace:" - local i=1 - for project in "${PROJECTS[@]}"; do - echo " [$i] $project" - ((i++)) + count=1 + echo "$PROJECT_LIST" | while read -r project; do + echo " [$count] $project" + count=$((count + 1)) done - echo " [0] Cancel" + echo " [0] Cancel" - read -ei 1 -p "Choose a project [1-${#PROJECTS[@]}]: " choice - if [[ ! "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 0 ] || [ "$choice" -gt ${#PROJECTS[@]} ]; then - echo "Invalid choice. Canceling." - cd "$workspace" - return 0 - fi + read -r choice + case "$choice" in + ''|*[!0-9]*) + echo "Invalid choice. Canceling." + cd "$workspace" + return 0 + ;; + esac if [ "$choice" -eq 0 ]; then echo "Canceled." @@ -120,7 +129,15 @@ function subGotoWorkspace() { return 0 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 workspace="$workspace/$1" fi @@ -252,7 +269,7 @@ if [ $1 ]; then *) subGotoWorkspace $TASK esac - + # Go to the workspace when no argument is provided. else echo "Usage: pm-task [...]"