From 79f6d3a44246ac4d8a5703f118a4135542d8efbd Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:28:47 +0300 Subject: [PATCH 1/9] Fix: Improve Docker sudo detection and error handling in mlh docker in command --- plugins/mlh-docker.sh | 77 +++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/plugins/mlh-docker.sh b/plugins/mlh-docker.sh index 9eed635..16300e8 100755 --- a/plugins/mlh-docker.sh +++ b/plugins/mlh-docker.sh @@ -11,7 +11,9 @@ # Examples: # mlh docker in mycontainer # Enter container with 'mycontainer' in name -set -euo pipefail +set -uo pipefail +# Note: We don't use 'set -e' because we need to handle errors manually +# for proper sudo detection and error messages print_help() { cat <<'EOF' @@ -96,46 +98,55 @@ in) } # Test Docker access and determine if sudo is needed - # First, try without sudo - DOCKER_TEST_OUTPUT=$("$DOCKER_BIN" ps --format "{{.ID}}" 2>&1) + # Strategy: Always try without sudo first, if it fails with permission error, use sudo + DOCKER_TEST_CMD="$DOCKER_BIN ps --format '{{.ID}}'" + DOCKER_TEST_OUTPUT=$($DOCKER_TEST_CMD 2>&1) DOCKER_TEST_EXIT=$? + # Check if we need sudo if [ $DOCKER_TEST_EXIT -ne 0 ]; then - # Docker command failed - check if it's a permission/connection error - # Common error patterns: permission denied, cannot connect, permission denied while trying to connect - if echo "$DOCKER_TEST_OUTPUT" | grep -qiE "permission denied|cannot connect to the docker daemon|Got permission denied|permission denied while trying to connect"; then - # Permission/connection error - try with sudo + # Check if it's a permission error + if echo "$DOCKER_TEST_OUTPUT" | grep -qiE "permission denied|cannot connect to the docker daemon|Got permission denied|permission denied while trying to connect|dial unix.*permission denied"; then + # Try with sudo if command -v sudo >/dev/null 2>&1; then - # Test if sudo docker works - SUDO_TEST_OUTPUT=$(sudo "$DOCKER_BIN" ps --format "{{.ID}}" 2>&1) + SUDO_TEST_OUTPUT=$(sudo $DOCKER_TEST_CMD 2>&1) SUDO_TEST_EXIT=$? if [ $SUDO_TEST_EXIT -eq 0 ]; then USE_SUDO=1 else - # Sudo also failed - show the error die "Cannot access Docker daemon even with sudo. Error: $SUDO_TEST_OUTPUT" fi else - die "Docker requires sudo permissions but sudo is not available. Install sudo or add user to docker group. Original error: $DOCKER_TEST_OUTPUT" + die "Docker requires sudo permissions. Error: $DOCKER_TEST_OUTPUT" fi else - # Other error (not permission related) - could be daemon not running, etc. + # Other error die "Docker command failed: $DOCKER_TEST_OUTPUT" fi fi # Find matching containers (running only) + # Use run_docker function which handles sudo automatically + # Important: Use run_docker here, not direct docker command CONTAINERS_OUTPUT=$(run_docker ps --format "{{.ID}}|{{.Names}}" 2>&1) CONTAINERS_EXIT=$? if [ $CONTAINERS_EXIT -ne 0 ]; then - die "Failed to list Docker containers: $CONTAINERS_OUTPUT" + die "Failed to list Docker containers. Exit code: $CONTAINERS_EXIT. Error: $CONTAINERS_OUTPUT" fi + # Check if we got any output at all (even empty line means no containers) + if [ -z "$CONTAINERS_OUTPUT" ] || [ "$(echo "$CONTAINERS_OUTPUT" | tr -d '\n' | tr -d ' ')" = "" ]; then + die "No containers are currently running. Start a container first." + fi + + # Filter containers by pattern (case-insensitive) mapfile -t CONTAINERS < <(echo "$CONTAINERS_OUTPUT" | grep -i "$PATTERN" || true) if [ ${#CONTAINERS[@]} -eq 0 ]; then - die "No running containers found matching pattern: $PATTERN" + # Show available containers to help user + AVAILABLE=$(echo "$CONTAINERS_OUTPUT" | cut -d'|' -f2 | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g') + die "No running containers found matching pattern: $PATTERN. Available containers: $AVAILABLE" fi if [ ${#CONTAINERS[@]} -eq 1 ]; then @@ -143,10 +154,25 @@ in) CONTAINER_ID="${CONTAINERS[0]%%|*}" CONTAINER_NAME="${CONTAINERS[0]##*|}" echo "Entering container: $CONTAINER_NAME" + # Try bash first, then sh if bash is not available if [ "$USE_SUDO" -eq 1 ]; then - exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + # Check if bash is available in container + if sudo "$DOCKER_BIN" exec "$CONTAINER_ID" which bash >/dev/null 2>&1; then + exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + elif sudo "$DOCKER_BIN" exec "$CONTAINER_ID" which sh >/dev/null 2>&1; then + exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" sh + else + die "Neither bash nor sh found in container $CONTAINER_NAME" + fi else - exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + # Check if bash is available in container + if "$DOCKER_BIN" exec "$CONTAINER_ID" which bash >/dev/null 2>&1; then + exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + elif "$DOCKER_BIN" exec "$CONTAINER_ID" which sh >/dev/null 2>&1; then + exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" sh + else + die "Neither bash nor sh found in container $CONTAINER_NAME" + fi fi else # Multiple matches - show menu @@ -176,10 +202,25 @@ in) echo "" echo "Entering container: $CONTAINER_NAME" + # Try bash first, then sh if bash is not available if [ "$USE_SUDO" -eq 1 ]; then - exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + # Check if bash is available in container + if sudo "$DOCKER_BIN" exec "$CONTAINER_ID" which bash >/dev/null 2>&1; then + exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + elif sudo "$DOCKER_BIN" exec "$CONTAINER_ID" which sh >/dev/null 2>&1; then + exec sudo "$DOCKER_BIN" exec -it "$CONTAINER_ID" sh + else + die "Neither bash nor sh found in container $CONTAINER_NAME" + fi else - exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + # Check if bash is available in container + if "$DOCKER_BIN" exec "$CONTAINER_ID" which bash >/dev/null 2>&1; then + exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" bash + elif "$DOCKER_BIN" exec "$CONTAINER_ID" which sh >/dev/null 2>&1; then + exec "$DOCKER_BIN" exec -it "$CONTAINER_ID" sh + else + die "Neither bash nor sh found in container $CONTAINER_NAME" + fi fi fi ;; From c3b4f1c027abadbc13d4adeb0740a21cb0f8c342 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:49:14 +0300 Subject: [PATCH 2/9] Fix: Improve sudo handling for non-interactive sessions in mlh docker in command --- plugins/mlh-docker.sh | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/plugins/mlh-docker.sh b/plugins/mlh-docker.sh index 16300e8..dc0f2db 100755 --- a/plugins/mlh-docker.sh +++ b/plugins/mlh-docker.sh @@ -89,9 +89,10 @@ in) PATTERN="$1" # Helper function to run docker command (with or without sudo) + # Use sudo -E to preserve environment variables (especially PATH) run_docker() { if [ "$USE_SUDO" -eq 1 ]; then - sudo "$DOCKER_BIN" "$@" + sudo -E "$DOCKER_BIN" "$@" else "$DOCKER_BIN" "$@" fi @@ -107,17 +108,41 @@ in) if [ $DOCKER_TEST_EXIT -ne 0 ]; then # Check if it's a permission error if echo "$DOCKER_TEST_OUTPUT" | grep -qiE "permission denied|cannot connect to the docker daemon|Got permission denied|permission denied while trying to connect|dial unix.*permission denied"; then - # Try with sudo + # Try with sudo (but handle password prompts gracefully) if command -v sudo >/dev/null 2>&1; then - SUDO_TEST_OUTPUT=$(sudo $DOCKER_TEST_CMD 2>&1) - SUDO_TEST_EXIT=$? - if [ $SUDO_TEST_EXIT -eq 0 ]; then - USE_SUDO=1 + # Check if we're in an interactive terminal (TTY) + if [ -t 0 ] && [ -t 1 ]; then + # Interactive mode: Try sudo (may prompt for password) + SUDO_TEST_OUTPUT=$(sudo $DOCKER_TEST_CMD 2>&1) + SUDO_TEST_EXIT=$? + if [ $SUDO_TEST_EXIT -eq 0 ]; then + USE_SUDO=1 + else + # Check if it's a password prompt error + if echo "$SUDO_TEST_OUTPUT" | grep -qiE "password is required|a terminal is required"; then + die "Docker requires sudo permissions, but password authentication failed. Please run: sudo mlh docker in $PATTERN" + else + die "Cannot access Docker daemon even with sudo. Error: $SUDO_TEST_OUTPUT" + fi + fi else - die "Cannot access Docker daemon even with sudo. Error: $SUDO_TEST_OUTPUT" + # Non-interactive mode: Cannot prompt for password + # Check if sudo can work without password (NOPASSWD) + SUDO_TEST_OUTPUT=$(sudo -n $DOCKER_TEST_CMD 2>&1) + SUDO_TEST_EXIT=$? + if [ $SUDO_TEST_EXIT -eq 0 ]; then + USE_SUDO=1 + else + # Sudo requires password but we're non-interactive + die "Docker requires sudo permissions, but we're in a non-interactive session. Please either: + 1. Run this command in an interactive terminal: mlh docker in $PATTERN + 2. Or run with sudo directly: sudo mlh docker in $PATTERN + 3. Or add your user to the docker group: sudo usermod -aG docker \$USER (then logout/login) +Original error: $DOCKER_TEST_OUTPUT" + fi fi else - die "Docker requires sudo permissions. Error: $DOCKER_TEST_OUTPUT" + die "Docker requires sudo permissions, but sudo is not available. Error: $DOCKER_TEST_OUTPUT" fi else # Other error From 75e6412d73a8564e748f505885e673b4b4e97856 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:50:01 +0300 Subject: [PATCH 3/9] Fix: Improve sudo handling and add troubleshooting for sudo mlh docker in command --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a0e0e18..238f303 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,11 @@ mlh docker in web ``` > **💡 Note:** `mlh docker in` automatically detects if Docker requires sudo permissions and uses `sudo docker` when needed. You don't need to run `sudo mlh docker in` - just run `mlh docker in ` and it will handle sudo automatically if required. +> +> **⚠️ Troubleshooting:** If you get `mlh: command not found` when running `sudo mlh docker in`, it's because `sudo` resets the PATH. Solutions: +> - **Recommended:** Run without sudo: `mlh docker in ` (script handles sudo internally) +> - **Alternative:** Use `sudo -E env PATH=$PATH mlh docker in ` to preserve PATH +> - **Best long-term:** Add your user to the docker group: `sudo usermod -aG docker $USER` (then logout/login) --- From a025652c41a2731d3b1caadcf26ed2efcf44d816 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:54:21 +0300 Subject: [PATCH 4/9] Update `get-mlh.sh` to switch branch reference to `bug/bookmark-list-category-hierarchy` in tarball URL setup --- get-mlh.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-mlh.sh b/get-mlh.sh index 8d1bcc5..66fc6e1 100755 --- a/get-mlh.sh +++ b/get-mlh.sh @@ -4,7 +4,7 @@ set -euo pipefail # ====== Your repo ====== REPO_OWNER="melihcelenk" REPO_NAME="MyLinuxHelper" -REPO_BRANCH="release/test" +REPO_BRANCH="bug/bookmark-list-category-hierarchy" # ======================= REPO_TARBALL_URL="https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/refs/heads/${REPO_BRANCH}" From fcf9de6e30deb99d53d8fc6fee5f848b54e58e34 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:59:23 +0300 Subject: [PATCH 5/9] Fix: Unset DOCKER_HOST if it points to Docker Desktop socket --- plugins/mlh-docker.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/mlh-docker.sh b/plugins/mlh-docker.sh index dc0f2db..52ed783 100755 --- a/plugins/mlh-docker.sh +++ b/plugins/mlh-docker.sh @@ -71,6 +71,12 @@ in) DOCKER_BIN="" USE_SUDO=0 + # Unset DOCKER_HOST if it points to Docker Desktop (which may not be running) + # This ensures we use the system Docker daemon at /var/run/docker.sock + if [ -n "${DOCKER_HOST:-}" ] && echo "$DOCKER_HOST" | grep -q "docker-desktop\|\.docker/desktop"; then + unset DOCKER_HOST + fi + if command -v docker >/dev/null 2>&1; then DOCKER_BIN="docker" elif [ -x "/usr/bin/docker" ]; then From cc4ac4e4b70dce1b33557efd8363988b7c8fe80c Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 21:59:42 +0300 Subject: [PATCH 6/9] Fix: Explicitly use system Docker socket at /var/run/docker.sock --- plugins/mlh-docker.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/mlh-docker.sh b/plugins/mlh-docker.sh index 52ed783..83126b8 100755 --- a/plugins/mlh-docker.sh +++ b/plugins/mlh-docker.sh @@ -71,9 +71,15 @@ in) DOCKER_BIN="" USE_SUDO=0 - # Unset DOCKER_HOST if it points to Docker Desktop (which may not be running) - # This ensures we use the system Docker daemon at /var/run/docker.sock - if [ -n "${DOCKER_HOST:-}" ] && echo "$DOCKER_HOST" | grep -q "docker-desktop\|\.docker/desktop"; then + # Force use of system Docker daemon at /var/run/docker.sock + # Docker Desktop socket may be configured but not running + # Check if system Docker socket exists, if so use it + if [ -S "/var/run/docker.sock" ]; then + # Use system Docker daemon explicitly + export DOCKER_HOST="unix:///var/run/docker.sock" + elif [ -n "${DOCKER_HOST:-}" ] && echo "$DOCKER_HOST" | grep -q "docker-desktop\|\.docker/desktop"; then + # Docker Desktop socket configured but may not be running + # Unset it to let Docker client use default unset DOCKER_HOST fi From 60bdfcd48a39cc06c94ece1dcb75b61c5a7b5f88 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 22:14:40 +0300 Subject: [PATCH 7/9] Fix: Handle branch names with slashes in get-mlh.sh (git checkout and tarball URL) --- get-mlh.sh | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/get-mlh.sh b/get-mlh.sh index 66fc6e1..158052b 100755 --- a/get-mlh.sh +++ b/get-mlh.sh @@ -64,8 +64,19 @@ download_repo() { if command -v git >/dev/null 2>&1; then if [ -d "${INSTALL_DIR}/.git" ]; then green "Updating repo (git pull)…" - git -C "${INSTALL_DIR}" fetch --all --depth=1 - git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" + # Fetch all branches including remote branches with slashes + git -C "${INSTALL_DIR}" fetch origin --depth=1 + # Check if branch exists locally, if not create tracking branch + if ! git -C "${INSTALL_DIR}" rev-parse --verify "${REPO_BRANCH}" >/dev/null 2>&1; then + # Branch doesn't exist locally, create tracking branch + git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" 2>/dev/null || \ + git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" 2>/dev/null || \ + git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" + else + # Branch exists locally, switch to it + git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" + fi + # Reset to remote branch git -C "${INSTALL_DIR}" reset --hard "origin/${REPO_BRANCH}" else green "Cloning repo (git)…" @@ -77,13 +88,34 @@ download_repo() { mkdir -p "${INSTALL_DIR}.tmp" local dlr dlr="$(ensure_downloader)" + # GitHub tarball URLs with branch names containing slashes need URL encoding + # Replace / with %2F in branch name for tarball URL + local encoded_branch + encoded_branch=$(echo "${REPO_BRANCH}" | sed 's|/|%2F|g') + local tarball_url="https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/refs/heads/${encoded_branch}" if [ "$dlr" = "curl" ]; then - curl -fsSL "${REPO_TARBALL_URL}" | tar -xz -C "${INSTALL_DIR}.tmp" + curl -fsSL "${tarball_url}" | tar -xz -C "${INSTALL_DIR}.tmp" else - wget -qO- "${REPO_TARBALL_URL}" | tar -xz -C "${INSTALL_DIR}.tmp" + wget -qO- "${tarball_url}" | tar -xz -C "${INSTALL_DIR}.tmp" fi rm -rf "${INSTALL_DIR}" - mv "${INSTALL_DIR}.tmp/${REPO_NAME}-${REPO_BRANCH}" "${INSTALL_DIR}" + # Tarball extracts to directory with branch name (slashes replaced with dashes in some cases, or URL encoded) + # Try different possible directory names + if [ -d "${INSTALL_DIR}.tmp/${REPO_NAME}-${REPO_BRANCH}" ]; then + mv "${INSTALL_DIR}.tmp/${REPO_NAME}-${REPO_BRANCH}" "${INSTALL_DIR}" + elif [ -d "${INSTALL_DIR}.tmp/${REPO_NAME}-$(echo "${REPO_BRANCH}" | sed 's|/|-|g')" ]; then + mv "${INSTALL_DIR}.tmp/${REPO_NAME}-$(echo "${REPO_BRANCH}" | sed 's|/|-|g')" "${INSTALL_DIR}" + else + # Find the extracted directory + local extracted_dir + extracted_dir=$(find "${INSTALL_DIR}.tmp" -mindepth 1 -maxdepth 1 -type d | head -1) + if [ -n "$extracted_dir" ]; then + mv "$extracted_dir" "${INSTALL_DIR}" + else + echo "Error: Could not find extracted directory" + exit 1 + fi + fi rm -rf "${INSTALL_DIR}.tmp" fi } From 5326a6d51df03452d382638dc2c07682b1e43fc1 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 22:18:00 +0300 Subject: [PATCH 8/9] Fix: Simplify get-mlh.sh to use bookmark-list-category-hierarchy branch and improve git fetch/checkout --- get-mlh.sh | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/get-mlh.sh b/get-mlh.sh index 158052b..89a8878 100755 --- a/get-mlh.sh +++ b/get-mlh.sh @@ -4,7 +4,7 @@ set -euo pipefail # ====== Your repo ====== REPO_OWNER="melihcelenk" REPO_NAME="MyLinuxHelper" -REPO_BRANCH="bug/bookmark-list-category-hierarchy" +REPO_BRANCH="bookmark-list-category-hierarchy" # ======================= REPO_TARBALL_URL="https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/refs/heads/${REPO_BRANCH}" @@ -64,23 +64,25 @@ download_repo() { if command -v git >/dev/null 2>&1; then if [ -d "${INSTALL_DIR}/.git" ]; then green "Updating repo (git pull)…" - # Fetch all branches including remote branches with slashes + # Fetch the specific branch from origin + git -C "${INSTALL_DIR}" fetch origin "${REPO_BRANCH}:${REPO_BRANCH}" --depth=1 2>/dev/null || \ git -C "${INSTALL_DIR}" fetch origin --depth=1 - # Check if branch exists locally, if not create tracking branch - if ! git -C "${INSTALL_DIR}" rev-parse --verify "${REPO_BRANCH}" >/dev/null 2>&1; then - # Branch doesn't exist locally, create tracking branch - git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" 2>/dev/null || \ - git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" 2>/dev/null || \ + # Checkout the branch (create local tracking branch if needed) + git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" 2>/dev/null || \ + git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" 2>/dev/null || { + # If branch doesn't exist, try to fetch without depth limit first + git -C "${INSTALL_DIR}" fetch origin git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" - else - # Branch exists locally, switch to it - git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" - fi - # Reset to remote branch - git -C "${INSTALL_DIR}" reset --hard "origin/${REPO_BRANCH}" + } + # Reset to remote branch to ensure we're up to date + git -C "${INSTALL_DIR}" reset --hard "origin/${REPO_BRANCH}" 2>/dev/null || \ + git -C "${INSTALL_DIR}" pull origin "${REPO_BRANCH}" else green "Cloning repo (git)…" - git clone --depth=1 --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" + git clone --depth=1 --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" 2>/dev/null || { + # If shallow clone fails, try full clone + git clone --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" + } fi else green "Downloading repo (tarball)…" @@ -88,25 +90,19 @@ download_repo() { mkdir -p "${INSTALL_DIR}.tmp" local dlr dlr="$(ensure_downloader)" - # GitHub tarball URLs with branch names containing slashes need URL encoding - # Replace / with %2F in branch name for tarball URL - local encoded_branch - encoded_branch=$(echo "${REPO_BRANCH}" | sed 's|/|%2F|g') - local tarball_url="https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/refs/heads/${encoded_branch}" + # GitHub tarball URL (no encoding needed for simple branch names) + local tarball_url="https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/refs/heads/${REPO_BRANCH}" if [ "$dlr" = "curl" ]; then curl -fsSL "${tarball_url}" | tar -xz -C "${INSTALL_DIR}.tmp" else wget -qO- "${tarball_url}" | tar -xz -C "${INSTALL_DIR}.tmp" fi rm -rf "${INSTALL_DIR}" - # Tarball extracts to directory with branch name (slashes replaced with dashes in some cases, or URL encoded) - # Try different possible directory names + # Tarball extracts to directory with branch name if [ -d "${INSTALL_DIR}.tmp/${REPO_NAME}-${REPO_BRANCH}" ]; then mv "${INSTALL_DIR}.tmp/${REPO_NAME}-${REPO_BRANCH}" "${INSTALL_DIR}" - elif [ -d "${INSTALL_DIR}.tmp/${REPO_NAME}-$(echo "${REPO_BRANCH}" | sed 's|/|-|g')" ]; then - mv "${INSTALL_DIR}.tmp/${REPO_NAME}-$(echo "${REPO_BRANCH}" | sed 's|/|-|g')" "${INSTALL_DIR}" else - # Find the extracted directory + # Find the extracted directory (fallback) local extracted_dir extracted_dir=$(find "${INSTALL_DIR}.tmp" -mindepth 1 -maxdepth 1 -type d | head -1) if [ -n "$extracted_dir" ]; then From dc0763eabed58d16670dd0dd7f1dfd34045a7983 Mon Sep 17 00:00:00 2001 From: melihcelenk Date: Sun, 9 Nov 2025 22:18:26 +0300 Subject: [PATCH 9/9] Fix: Improve git branch handling - re-clone if branch not found --- get-mlh.sh | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/get-mlh.sh b/get-mlh.sh index 89a8878..02ef58a 100755 --- a/get-mlh.sh +++ b/get-mlh.sh @@ -64,19 +64,23 @@ download_repo() { if command -v git >/dev/null 2>&1; then if [ -d "${INSTALL_DIR}/.git" ]; then green "Updating repo (git pull)…" - # Fetch the specific branch from origin - git -C "${INSTALL_DIR}" fetch origin "${REPO_BRANCH}:${REPO_BRANCH}" --depth=1 2>/dev/null || \ - git -C "${INSTALL_DIR}" fetch origin --depth=1 - # Checkout the branch (create local tracking branch if needed) - git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" 2>/dev/null || \ - git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" 2>/dev/null || { - # If branch doesn't exist, try to fetch without depth limit first - git -C "${INSTALL_DIR}" fetch origin - git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" - } - # Reset to remote branch to ensure we're up to date - git -C "${INSTALL_DIR}" reset --hard "origin/${REPO_BRANCH}" 2>/dev/null || \ - git -C "${INSTALL_DIR}" pull origin "${REPO_BRANCH}" + # First, fetch all branches to ensure we have the remote branch + git -C "${INSTALL_DIR}" fetch origin 2>/dev/null || true + # Try to checkout the branch + if git -C "${INSTALL_DIR}" checkout "${REPO_BRANCH}" 2>/dev/null; then + # Branch exists locally, pull latest changes + git -C "${INSTALL_DIR}" pull origin "${REPO_BRANCH}" 2>/dev/null || \ + git -C "${INSTALL_DIR}" reset --hard "origin/${REPO_BRANCH}" 2>/dev/null + elif git -C "${INSTALL_DIR}" checkout -b "${REPO_BRANCH}" "origin/${REPO_BRANCH}" 2>/dev/null; then + # Successfully created tracking branch + : + else + # Branch doesn't exist, remove and re-clone + green "Branch not found, re-cloning repository…" + rm -rf "${INSTALL_DIR}" + git clone --depth=1 --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" 2>/dev/null || \ + git clone --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" + fi else green "Cloning repo (git)…" git clone --depth=1 --branch "${REPO_BRANCH}" "${REPO_GIT_URL}" "${INSTALL_DIR}" 2>/dev/null || {