From 7223c3ec06a6812ae79bd17afa5389eaa3d00a06 Mon Sep 17 00:00:00 2001 From: Gerard Hickey Date: Thu, 2 Feb 2017 13:30:08 -0800 Subject: [PATCH] Added Github Enterprise support --- Makefile | 3 ++ bin/git-fork | 75 ++++++++++++++++++++++++++++++++------------- helper/config-value | 11 +++++++ man/git-fork.1 | 64 +++++++++++++++++++++++++++++++++++++- man/git-fork.html | 47 ++++++++++++++++++++++++++-- man/git-fork.md | 38 +++++++++++++++++++++++ 6 files changed, 212 insertions(+), 26 deletions(-) create mode 100644 helper/config-value diff --git a/Makefile b/Makefile index bb18c59de..02d995023 100644 --- a/Makefile +++ b/Makefile @@ -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; \ diff --git a/bin/git-fork b/bin/git-fork index 19e8d2e6c..a4d4c17bf 100755 --- a/bin/git-fork +++ b/bin/git-fork @@ -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 diff --git a/helper/config-value b/helper/config-value new file mode 100644 index 000000000..6923919e1 --- /dev/null +++ b/helper/config-value @@ -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 $? +} \ No newline at end of file diff --git a/man/git-fork.1 b/man/git-fork.1 index e3c40685e..addc9a2e1 100644 --- a/man/git-fork.1 +++ b/man/git-fork.1 @@ -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 @@ -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 @@ -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> . diff --git a/man/git-fork.html b/man/git-fork.html index 06b5b4443..93b1327c5 100644 --- a/man/git-fork.html +++ b/man/git-fork.html @@ -64,7 +64,7 @@
  1. git-fork(1)
  2. -
  3. Git Extras
  4. +
  5. git-fork(1)
@@ -99,8 +99,47 @@

DESCRIPTION

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
@@ -130,7 +169,9 @@ 

EXAMPLE

AUTHOR

-

Written by Andrew Griffiths <mail@andrewgriffithsonline.com>

+

Written by Andrew Griffiths <mail@andrewgriffithsonline.com>

+ +

Github Enterprise support and settings by Gerard Hickey <hickey@kinetic-compute.com>

REPORTING BUGS

@@ -143,7 +184,7 @@

SEE ALSO

  1. -
  2. August 2016
  3. +
  4. February 2017
  5. git-fork(1)
diff --git a/man/git-fork.md b/man/git-fork.md index 890c5d963..aca4a0eb2 100644 --- a/man/git-fork.md +++ b/man/git-fork.md @@ -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 @@ -51,6 +87,8 @@ git-fork(1) -- Fork a repo on github Written by Andrew Griffiths <> +Github Enterprise support and settings by Gerard Hickey <> + ## REPORTING BUGS <>