Repo Browser

bashcards/bashcards-android
Card bundle: cards/844239914257--github-repo-cloner

Front / Back (click to flip)

front
back
Click card to view front/back

Raw Script

#!/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'

QR Payload

bash -c "$(echo H4sIAAAAAAAAA7VX61PbRhD/3r9iq7pgdyI/IE1nLEzGwUBMXUMgnowHMYw4nbFi+SSkE5Q6/t+7e3pYkgVMP/STpL3dvX389qFffm5FYdC6c0SLi0e4s8L5TyGXoPPIA9/x+cxyXIPIoDOo7V72zF3TbO/vX7eN/c7S3DVO85Q9okwzSsfY3yfKpzzPe6J8y/P8QZTxhgc/TTHpaZrR77WNQU+rrQZdvbnWjItep902heDcrjdWwLzl0hI26I+g1ToaHLZs/tgSkevC3uFOx4C1KZgbEKv0IwlMeMESjzI2A5jLrUAx+lYUcmINuIUqA9B90I6F5AFID68S0hERbzaboMGtkvAWe+02SpgCwPWY5UIUuD1lCSMaw/c6QxroI9D1p8CRXPfQDu3X1VxK/5Z5Nl9reBQ6LhcYdTolQzd+aDWU1xoa6bu+xk+mQa8HeDHc3JhCOegJ3qk0gyh1ZqPUQMu7DT9+AP/bkYAhuseHUpFepZQiBqJEJQaQHvmonDryc3QHGK9AWEvexYhMEgP1f1DPatLV0a+bG9jZAc7mHuKJyJfrsZdJAd5RW42RD5kCvC8Q0Nn44Ec9jYIUdlsttHEe3TUx3a3aRHmVU/ppfTTnbOGIe/ADb4aR7ELNj5RqYlVZQkY/0krmnK7P/4wtwHisyoZKmHmRsBWDAQqOmZkq/XGY7JfDdKTCajsBZ9ILnqFuYzlFroRmg0I2KIRskAsZQr6pbF8uUFrpqshgyeIjSwg0mqEFkrcsxngYYiQGiQNKZ8kDKEZj4ARd4kYhTbknvXuLKkIBr49A5Q/QSWzE0iQj+r1Y1YxLNk9C8TYMrrDFZDiYOUH4GhIs39lAAT+aOTiQkhBB0Qq474Uf5bPPe96T4MGOz4Nb37rnvdrFNmJOyFpETOIuKlU8Z5uCDUfISfSs9GKXzl5y6Xjpy2foXwzRg9D3EBqVLikZrXaGmIPvD9As96yKxA7Fo+U6NpxdnY9hFnhLuiXJaimdI3KgdAWC0dxtXt80VZXfonfmbsmpUbVTUypXFdhcKZQdOhJ0px84Qs6wsYWmKTQUHtHtTwx0hCpIxLCNVkB6cwF2J6Q7ycSRiC/U4lpS17QVFl0nlAm+FNYoUHk7kvrLaf62vkxsT2GNpNpEvQJ5V8frGvRJNpNwhRepzk2rvbVc9zVDXq3ZbXRTPvDjaY6NC4YnV72sheCJAbZHp7lcITWXrXQsxUzFrojGbiBOrT1miudF0u1f64gFEJ70h6OspdrU1w4ODpIIZZHxHbb4rzka0oS1mHQeeWzaG7kq42eab1tpIrPQgiXC/ye8edRuguvMtpqlAXLORXxcQn4/kp4eD9/zcebcVpIyYsGamRM/tybOR6hPW+N3kE6bqZo2SSCAXmijwkdXn6Y3Miskm5CogZMZez19vvmtUbQ5gRXuQUkLKphqGJnsWJRkp+urheP7KBxLZqxFtqzhvYOwip+HFqsG4dJyxC2jZSABIe2J1ALLPXW6RqJIJ3wThiKUWNVdHDUS3VcfKFfdY5VSNSS21SqyKK0OVfK0dW2LE/UN6UJP3Di82ehMEWNdBhFP8V1Vd6fDr58nn+Dy+OIcjkbn4+NL+Ot4PKkusQmO2bQucagfCIz94ZqyUSzAeE9P6QTv5KBetUKoK3Cmpb3m/OSkkWu46bDsNKCwL9QVOnDJyc0SbS9mYsWVK8ew34Cv3v09RsbKqi53/L4BI5wwuekT039vQLzGOZs+5eb1fkgZ+qNRjvzQgC+RIwvu5Cv1EEtyoXITV95qodpOWnvoM63gBqi/khT6e4pql6joGS1qJSo6RCOzREV3Nq26dPYhPbPox6hw9PDjCx3ij5ICWTulv1C5CXRzKuKipZI1xe6/TTaVyHUOAAA= | base64 -d | gunzip)"
NameTypeSize
README.mdfile1,036
assetsdir