Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Github Enterprise support #627

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ install:
if grep "$(COMMAND)" need_git_commit >/dev/null; then \
cat ./helper/has-git-commit >> $(TEMPFILE); \
fi; \
if grep "# needed_by: $(COMMAND)" helper/config-value >/dev/null; then \
cat ./helper/config-value | grep -v "# needed_by:" >> $(TEMPFILE); \
fi; \
tail -n +2 bin/$(COMMAND) >> $(TEMPFILE); \
cp -f $(TEMPFILE) $(DESTDIR)$(BINPREFIX)/$(COMMAND); \
fi; \
Expand Down
75 changes: 53 additions & 22 deletions bin/git-fork
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,73 @@ 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 user
[ -n "$user" ] || abort "git username required"
echo "Enter github two-factor authentication code (leave blank if not set up)"
read MFA_CODE

# extract owner + project from repo url
project=${url##*/}
owner=${url%/$project}
project=${project%.git}
if [[ $owner == git@* ]]; then
owner=${owner##*:}
else
owner=${owner##*/}
fi
owner=${owner##*[/:]}
# Yes, the following extracts server for both SSH and https references
server=${url##*@}
server=${server##*://}
server=${server%%[/:]*}

# validate
[ -z "$project" -o -z "$owner" ] && abort "github repo needs to be specified as an argument"

# determine github credentials
user=$(get_config_value "$server.user")
token=$(get_config_value "$server.token")
if [[ $(get_config_value "$server.add-api") == "true" ]]; then
api_server="api.$server"
else
api_server=$server
fi

if [[ -z "$user" ]]; then
# validate user
echo "Enter your github username"
read user
[ -n "$user" ] || abort "git username required"
fi

if [[ -z "$token" ]]; then
echo "Enter github password"
read password
echo "Enter github two-factor authentication code (leave blank if not set up)"
read MFA_CODE
fi

auth_info=''
header_info=''
if [[ -n "$token" ]]; then
header_info="-H \"Authorization: token ${token}\""
elif [[ -n "$MFA_CODE" ]]; then
auth_info="-u \"$user:$password\""
header_info="-H \"X-GitHub-OTP: $MFA_CODE\""
elif [[ -n "$password" ]]; then
auth_info="-u \"$user:$password\""
else
echo "No login credentials specified."
exit 1
fi

# create fork
curl -qs \
-X POST \
-u "$user" \
-H "X-GitHub-OTP: $MFA_CODE" \
"https://api.github.com/repos/$owner/$project/forks"
IFS="'" cmd="curl -qs -X POST $auth_info $header_info https://$api_server/repos/$owner/$project/forks"
eval $cmd >/dev/null

[ $? = 0 ] || abort "fork failed"

echo "Add GitHub remote branch via SSH (you will be prompted to verify the server's credentials)? (y/n)"
read use_ssh
use_ssh=$(get_config_value "$server.use-ssh")
if [[ -z "$use_ssh" ]]; then
echo "Add GitHub remote branch via SSH (you will be prompted to verify the server's credentials)? (y/n)"
read use_ssh
fi

# 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:"
if [ -n "$use_ssh" ] && ssh -T git@$server 2>&1 | grep -qi 'success'; then
remote_prefix="git@$server:"
else
remote_prefix="https://github.com/"
remote_prefix="https://$server/"
fi

if [ "$origin" = true ]; then
Expand Down
11 changes: 11 additions & 0 deletions helper/config-value
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# needed_by: git-fork

get_config_value() {
echo $(git config git-extras.$1)
}

# set_config_value "key" "value" "global|system" (global or system not required)
set_config_value() {
$(git config ${3+--$3} git-extras.$1 $2)
echo $?
}
64 changes: 63 additions & 1 deletion man/git-fork.1
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GIT\-FORK" "1" "August 2016" "" "Git Extras"
.TH "GIT\-FORK" "1" "February 2017" "" ""
.
.SH "NAME"
\fBgit\-fork\fR \- Fork a repo on github
Expand Down Expand Up @@ -40,7 +40,66 @@ adds the forked repo as a remote called \fBorigin\fR
.P
Remotes will use ssh if you have it configured with GitHub, if not, https will be used\.
.
.P
Your Github settings can not be saved as git config values instead of specifying them each time\. To enable this you need to execute a few git config commands like the following\.
.
.IP "" 4
.
.nf

$ git config \-\-global git\-extras\.github\.com\.user greatcoder99
.
.fi
.
.IP "" 0
.
.P
Assuming that your username is \'greatcoder99\'\. All the configuration values are prefixed with \'git\-extras\.\' followed by server hostname and then finally by the variable name (defined below)\.
.
.P
In addition, other Github instances may be used other than just github\.com\. So if you have a Github Enterprise instance, then using that hostname instead of github\.com will work as expected\.
.
.P
Variables that are currently supported:
.
.IP "" 4
.
.nf

user: The username that the Github instance knows you as

token: The personal access token that has been generated to allow
password\-less access to the API\.

add\-api: In most cases this should be set to true\. This adds the \'api\'
hostname to the repo location (i\.e\. github\.com becomes api\.github\.com)
to access the Github API\. The time you would not set this is when
your API hostname is the same as Github instance hostname\.

use\-ssh: Set to true in order to set the upstream remote reference
to use SSH instead of https\.
.
.fi
.
.IP "" 0
.
.SH "EXAMPLE"
Create settings to prevent answering questions:
.
.IP "" 4
.
.nf

$ git config \-\-global git\-extras\.github\.com\.user bigdog
$ git config \-\-global git\-extras\.github\.com\.token d149feb47\.\.\.\.
$ git config \-\-global git\-extras\.github\.com\.add\-api true
$ git config \-\-global git\-extras\.github\.com\.use\-ssl true
.
.fi
.
.IP "" 0
.
.P
Fork expect\.js:
.
.IP "" 4
Expand Down Expand Up @@ -102,6 +161,9 @@ $ git fork
.SH "AUTHOR"
Written by Andrew Griffiths <\fImail@andrewgriffithsonline\.com\fR>
.
.P
Github Enterprise support and settings by Gerard Hickey <\fIhickey@kinetic\-compute\.com\fR>
.
.SH "REPORTING BUGS"
<\fIhttps://github\.com/tj/git\-extras/issues\fR>
.
Expand Down
47 changes: 44 additions & 3 deletions man/git-fork.html

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 38 additions & 0 deletions man/git-fork.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,44 @@ git-fork(1) -- Fork a repo on github

Remotes will use ssh if you have it configured with GitHub, if not, https will be used.

Your Github settings can not be saved as git config values instead of
specifying them each time. To enable this you need to execute a few git
config commands like the following.

$ git config --global git-extras.github.com.user greatcoder99

Assuming that your username is 'greatcoder99'. All the configuration
values are prefixed with 'git-extras.' followed by server hostname and
then finally by the variable name (defined below).

In addition, other Github instances may be used other than just
github.com. So if you have a Github Enterprise instance, then using that
hostname instead of github.com will work as expected.

Variables that are currently supported:

user: The username that the Github instance knows you as

token: The personal access token that has been generated to allow
password-less access to the API.

add-api: In most cases this should be set to true. This adds the 'api'
hostname to the repo location (i.e. github.com becomes api.github.com)
to access the Github API. The time you would not set this is when
your API hostname is the same as Github instance hostname.

use-ssh: Set to true in order to set the upstream remote reference
to use SSH instead of https.

## EXAMPLE

Create settings to prevent answering questions:

$ git config --global git-extras.github.com.user bigdog
$ git config --global git-extras.github.com.token d149feb47....
$ git config --global git-extras.github.com.add-api true
$ git config --global git-extras.github.com.use-ssl true

Fork expect.js:

$ git fork https://github.com/LearnBoost/expect.js
Expand Down Expand Up @@ -51,6 +87,8 @@ git-fork(1) -- Fork a repo on github

Written by Andrew Griffiths &lt;<[email protected]>&gt;

Github Enterprise support and settings by Gerard Hickey &lt;<[email protected]>&gt;

## REPORTING BUGS

&lt;<https://github.com/tj/git-extras/issues>&gt;
Expand Down