cards/844239914257--github-repo-cloner/assets/raw.sh
#!/usr/bin/env bash
set -euo pipefail;bash -c $'R=\'\\033[0;31m\';G=\'\\033[0;32m\';Y=\'\\033[1;33m\';B=\'\\033[0;34m\';W=\'\\033[1;37m\';N=\'\\033[0m\'\nU="";A=0;D="${D:-.}";P=100\nneed(){ command -v "$1" >/dev/null 2>&1; }\nclr(){ tput cnorm 2>/dev/null; clear; }\npause(){ read -r -p "Enter to continue... " _; }\nok200(){\n local url="$1" c\n c="$(curl -L --write-out "%{http_code}" --silent --output /dev/null "$url")"\n [[ "$c" == 200 ]]\n}\nclone1(){\n local url="$1"\n (cd "$D" 2>/dev/null || exit 1; git clone "$url")\n}\nsetu(){\n clr\n read -r -p "GitHub username: " U\n [[ -z "${U:-}" ]] && echo -e "${R}No username set${N}" && return 1\n local pu="https://github.com/$U"\n echo -e "${B}Checking profile: $pu${N}"\n ok200 "$pu" && echo -e "${G}OK${N}" || { echo -e "${R}Not found${N}"; U=""; return 1; }\n}\nsetd(){\n clr\n read -r -p "Clone directory (default .): " D\n [[ -z "${D:-}" ]] && D="."\n mkdir -p "$D" 2>/dev/null || { echo -e "${R}Cannot create/access: $D${N}"; D="."; return 1; }\n echo -e "${G}Dir:${N} $D"\n}\ntoga(){ [[ "$A" -eq 1 ]] && A=0 || A=1; }\nfetch(){\n [[ -z "${U:-}" ]] && echo -e "${R}Set username first${N}" && return 1\n local api="https://api.github.com/users/$U/repos?type=owner&per_page=$P"\n echo -e "${B}Fetching:${N} $api"\n J="$(curl -sL "$api")"\n [[ -z "${J:-}" ]] && echo -e "${R}Empty API response${N}" && return 1\n echo "$J" | jq . >/dev/null 2>&1 || { echo -e "${R}Invalid JSON from API${N}"; return 1; }\n L="$(echo "$J" | jq -r \'.[].clone_url\')"\n [[ -z "${L:-}" ]] && echo -e "${Y}No repos found${N}" && return 1\n Cn="$(printf "%s\\n" "$L" | wc -l | tr -d \' \')"\n echo -e "${G}Found:${N} $Cn repos"\n return 0\n}\nlist(){\n fetch || return 1\n clr\n echo -e "${W}Repos for:${N} ${W}$U${N} ${Y}($Cn)${N}\\n"\n printf "%s\\n" "$L"\n echo\n}\nclone_all(){\n fetch || return 1\n mkdir -p "$D" 2>/dev/null || return 1\n local url\n while IFS= read -r url; do\n [[ -z "${url:-}" ]] && continue\n echo -e "${B}Cloning:${N} $url"\n clone1 "$url" && echo -e "${G}OK${N}" || echo -e "${R}FAIL${N}"\n done <<< "$L"\n}\nclone_pick(){\n fetch || return 1\n clr\n echo -e "${W}Interactive clone:${N} ${W}$U${N} ${Y}($Cn)${N}"\n echo -e "${Y}Dir:${N} $D\\n"\n local url ans\n while IFS= read -r url; do\n [[ -z "${url:-}" ]] && continue\n echo -e "${B}Found:${N} $url"\n if [[ "$A" -eq 1 ]]; then\n echo -e "${G}Auto-clone ON${N}"\n clone1 "$url"\n continue\n fi\n read -r -p "Clone? (Y/N, default Y): " ans\n ans="${ans:-Y}"\n case "$ans" in\n [Yy]*) echo -e "${G}Cloning...${N}"; clone1 "$url";;\n [Nn]*) echo -e "${Y}Skipping${N}";;\n *) echo -e "${R}Invalid, skipping${N}";;\n esac\n done <<< "$L"\n}\nmain_check(){\n need jq || { echo -e "${Y}jq not found. Install: apt install jq${N}"; return 1; }\n need curl || { echo -e "${Y}curl not found${N}"; return 1; }\n need git || { echo -e "${Y}git not found${N}"; return 1; }\n return 0\n}\nmain_check || exit 1\nwhile true; do\n clr\n echo -e "${W}GITHUB REPO CLONER MENU${N}"\n echo -e "${Y}User:${N} ${U:-<none>} ${Y}Dir:${N} ${D:-.} ${Y}Auto:${N} $([[ "$A" -eq 1 ]] && echo ON || echo OFF)"\n echo\n echo "1) Set username (validate)"\n echo "2) Set clone directory"\n echo "3) Toggle auto-clone"\n echo "4) List repos"\n echo "5) Clone interactively"\n echo "6) Clone ALL"\n echo "q) Quit"\n echo\n read -r -p "> " k\n case "${k:-}" in\n 1) setu; pause;;\n 2) setd; pause;;\n 3) toga; pause;;\n 4) list; pause;;\n 5) clone_pick; pause;;\n 6) clone_all; pause;;\n q|Q) clr; exit 0;;\n *) echo -e "${R}Invalid${N}"; pause;;\n esac\ndone\n'