mirror of
https://github.com/tj/git-extras.git
synced 2026-09-10 07:26:17 -04:00
68 lines
1.9 KiB
Bash
Executable file
68 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
abort() {
|
|
echo "$@"
|
|
exit 1
|
|
}
|
|
|
|
url="$1"
|
|
test -z "$url" && url=$(git remote get-url origin 2> /dev/null) && origin=true
|
|
# validate repo url
|
|
test -z "$url" && abort "github repo needs to be specified as an argument"
|
|
|
|
# validate user
|
|
echo "Enter your github username"
|
|
read -r user
|
|
[ -n "$user" ] || abort "git username required"
|
|
# personal access token
|
|
# config name is github-personal-access-token '_' is not allowed in git config
|
|
|
|
github_personal_access_token=$(git config --default "$GITHUB_TOKEN" git-extras.github-personal-access-token)
|
|
|
|
test -z "$github_personal_access_token" && abort "GITHUB_TOKEN, or git config git-extras.github-personal-access-token required"
|
|
|
|
# extract owner + project from repo url
|
|
project=${url##*/}
|
|
owner=${url%/"$project"}
|
|
project=${project%.git}
|
|
if [[ $owner == git@* ]]; then
|
|
owner=${owner##*:}
|
|
else
|
|
owner=${owner##*/}
|
|
fi
|
|
|
|
# validate
|
|
[[ -z "$project" || -z "$owner" ]] && abort "github repo needs to be specified as an argument"
|
|
|
|
# create fork
|
|
if ! curl -qsf \
|
|
-X POST \
|
|
-u "$user:$github_personal_access_token" \
|
|
-H "X-GitHub-OTP: $MFA_CODE" \
|
|
"https://api.github.com/repos/$owner/$project/forks"
|
|
then
|
|
abort "fork failed"
|
|
fi
|
|
|
|
echo "Add GitHub remote branch via SSH (you will be prompted to verify the server's credentials)? (y/n)"
|
|
read -r use_ssh
|
|
# Check if user has ssh configured with GitHub
|
|
if [ -n "$use_ssh" ] && ssh -T git@github.com 2>&1 | grep -qi 'success'; then
|
|
remote_prefix="git@github.com:"
|
|
else
|
|
remote_prefix="https://github.com/"
|
|
fi
|
|
|
|
if [ "$origin" = true ]; then
|
|
git remote rename origin upstream
|
|
git remote add origin "${remote_prefix}${user}/${project}.git"
|
|
git fetch origin
|
|
else
|
|
# clone forked repo into current dir
|
|
git clone "${remote_prefix}${user}/${project}.git" "$project"
|
|
# add reference to origin fork so can merge in upstream changes
|
|
cd "$project"
|
|
git remote add upstream "${remote_prefix}${owner}/${project}.git"
|
|
git fetch upstream
|
|
fi
|