139 lines
3.8 KiB
Bash
139 lines
3.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
RESET_COLOR="\\033[0m"
|
|
RED_COLOR="\\033[0;31m"
|
|
GREEN_COLOR="\\033[0;32m"
|
|
BLUE_COLOR="\\033[0;34m"
|
|
|
|
function reset_color() {
|
|
echo -e "${RESET_COLOR}\\c"
|
|
}
|
|
|
|
function red_color() {
|
|
echo -e "${RED_COLOR}\\c"
|
|
}
|
|
|
|
function green_color() {
|
|
echo -e "${GREEN_COLOR}\\c"
|
|
}
|
|
|
|
function blue_color() {
|
|
echo -e "${BLUE_COLOR}\\c"
|
|
}
|
|
|
|
function hello() {
|
|
blue_color
|
|
echo " "
|
|
echo " Backup My GitHub "
|
|
echo " "
|
|
echo " "
|
|
echo "This script will clone all your repositories from provided username to your machine"
|
|
echo "It will prompt you for your username account and personal access token"
|
|
echo "To generate token, please, refer this guide - https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line"
|
|
echo "Make sure, that your token has full access to repo scope!"
|
|
reset_color
|
|
}
|
|
|
|
function checkForCurl() {
|
|
if ! [ "$(command -v curl)" ]; then
|
|
red_color
|
|
echo "You don't have installed curl"
|
|
exit 1
|
|
else
|
|
green_color
|
|
echo "curl is present on your machine, continue..."
|
|
fi
|
|
|
|
reset_color
|
|
}
|
|
|
|
function checkForJQ() {
|
|
if ! [ "$(command -v jq)" ]; then
|
|
red_color
|
|
echo "You don't have installed jq"
|
|
exit 1
|
|
else
|
|
green_color
|
|
echo "jq is present on your machine, continue..."
|
|
fi
|
|
|
|
reset_color
|
|
}
|
|
|
|
function cloneRepositories() {
|
|
green_color
|
|
echo
|
|
read -r -p "What is your username on GitHub: " username
|
|
read -r -p "What is your personal access token: " token
|
|
echo
|
|
blue_color
|
|
|
|
mkdir -p my
|
|
pushd my
|
|
|
|
repository_count=$(curl -XGET -s https://"${username}":"${token}"@api.github.com/users/"${username}" | jq -c --raw-output ".public_repos")
|
|
repositories=$(curl -XGET -s https://"${username}":"${token}"@api.github.com/users/"${username}"/repos?per_page="${repository_count}" | jq -c --raw-output ".[].ssh_url")
|
|
|
|
green_color
|
|
echo "Cloning ${repository_count} repositories"
|
|
|
|
blue_color
|
|
for repository in ${repositories}; do
|
|
echo "Cloning ${repository}..."
|
|
git clone --quiet "${repository}"
|
|
done
|
|
|
|
popd
|
|
|
|
green_color
|
|
echo "All your repositories are successfully cloned in ./my directory"
|
|
}
|
|
|
|
function cloneStars() {
|
|
green_color
|
|
echo
|
|
read -r -p "What is your username on GitHub: " username
|
|
read -r -p "What is your personal access token: " token
|
|
echo
|
|
blue_color
|
|
|
|
mkdir -p stars
|
|
pushd stars
|
|
|
|
repository_pages=$(curl -XGET -s https://"${username}":"${token}"@api.github.com/user/starred?per_page=100 -D - -o /dev/null | sed -nEe 's/^Link.+page=([[:digit:]]+)>; rel="last"/\1/p' | tr -d '[:space:]')
|
|
|
|
green_color
|
|
echo "Cloning ${repository_pages} pages of 100 repositories"
|
|
|
|
blue_color
|
|
bad=0
|
|
count=1
|
|
for page in `seq 1 $repository_pages`; do
|
|
echo "Getting page ${page}..."
|
|
repo_pairs=$(curl -XGET -s https://"${username}":"${token}"@api.github.com/user/starred?per_page=100\&page="${page}" | jq -c --raw-output ".[]|{url:.ssh_url,name:.full_name}")
|
|
for repo in ${repo_pairs}; do
|
|
url=$(echo $repo | jq -c --raw-output ".url")
|
|
name=$(echo $repo | jq -c --raw-output ".name")
|
|
echo "$count. Cloning ${name} from ${url}..."
|
|
mkdir -p $(dirname $name)
|
|
git clone --quiet "${url}" "${name}" || (let bad+=1; continue)
|
|
let count+=1
|
|
done
|
|
done
|
|
|
|
popd
|
|
|
|
green_color
|
|
echo "${count} starred repositories are successfully cloned in ./stars directory"
|
|
echo "${bad} repositories had errors"
|
|
}
|
|
|
|
hello
|
|
checkForCurl
|
|
checkForJQ
|
|
# Todo: use env vars for github login/token
|
|
cloneRepositories
|
|
cloneStars
|