]> git.donarmstrong.com Git - zsh.git/commitdiff
ENH: giturl -- determines tracked remote (if not origin), supports github
authorYaroslav Halchenko <debian@onerussian.com>
Mon, 18 Oct 2010 16:43:12 +0000 (12:43 -0400)
committermartin f. krafft <madduck@madduck.net>
Tue, 19 Oct 2010 05:37:28 +0000 (07:37 +0200)
* reverts to origin if remote could not be determined for the branch
* BF: $REMOTE -> $remote
* handles alioth.debian in addition to canonical git.debian

.zsh/func/giturl

index 9f96a5becf71d0e2835b3b08113398ce821f519a..04f998f8adc7188034e022ca67ce32878825212a 100755 (executable)
@@ -7,14 +7,21 @@
 #
 # Copyright © 2010 martin f. krafft <madduck@madduck.net>
 # Released under the terms of the Artistic Licence 2.0
+# Contributions from Yaroslav O. Halchenko <debian@onerussian.com>
 #
 # Source repository: git://git.madduck.net/etc/zsh.git
 #
 
-local remote; remote=$(git config --get remote.origin.url)
+local branch remote remote_name
+branch=$(git symbolic-ref -q HEAD); branch="${branch#refs/heads/}"
+# Obtain remote which current branch tracks, origin if not known
+remote_name=$(git config branch.$branch.remote || echo origin)
+remote=$(git config --get remote.$remote_name.url)
 
-local part gitweb_base oldstyle
-oldstyle=0
+local part gitweb_base style commitkw
+style=gitweb
+commitkw=commitdiff          # keyword for commit -- differ for github
+argssep=:                    # separator for arguments of the query
 case "$remote" in
   madduck:pub/*|ssh://git.madduck.net/madduck/pub/*)
     gitweb_base=http://git.madduck.net/v
@@ -22,16 +29,27 @@ case "$remote" in
     part="${part#ssh://git.madduck.net/madduck/pub/}"
     part="${part%.git}.git"
     ;;
-  debian:*|*://git.debian.org/git/*|*@git.debian.org/git/*)
+  debian:*|*://git.debian.org/git/*|*://alioth.debian.org/git/*|*@git.debian.org/git/*)
     gitweb_base=http://git.debian.org
     part="${remote#debian:}"
     part="${part#*://git.debian.org/git/}"
+    part="${part#*://alioth.debian.org/git/}"
     part="${part#*@git.debian.org/git/}"
     part="${part%.git}.git"
-    oldstyle=1
+    style=gitweb_old
+    ;;
+  github:*|*://github.com/*|*@github.com/*)
+    gitweb_base=http://github.com
+    part="${remote#github:}"
+    part="${part#*://github.com/}"
+    part="${part#*@github.com/}"
+    part="${part%.git}"
+    style=github
+    commitkw=commit
+    argssep=
     ;;
   *)
-    echo >&2 "E: I do not know how to translate $REMOTE into a gitweb URL."
+    echo >&2 "E: I do not know how to translate $remote into a gitweb URL."
     return 1
     ;;
 esac
@@ -39,17 +57,17 @@ esac
 local hash
 hash=$(git rev-parse HEAD)
 
-case "$oldstyle" in
-  0)
+case "$style" in
+  gitweb|github)
     echo "$gitweb_base/$part"
-    echo "$gitweb_base/$part/commitdiff/$hash"
+    echo "$gitweb_base/$part/$commitkw/$hash"
     echo "$gitweb_base/$part/tree/HEAD"
     for i in $@; do
-      [ -f "$i" ] && echo "$gitweb_base/$part/blob/HEAD:/$i"
-      [ -d "$i" ] && echo "$gitweb_base/$part/tree/HEAD:/$i"
+      [ -f "$i" ] && echo "$gitweb_base/$part/blob/HEAD${argssep}/$i"
+      [ -d "$i" ] && echo "$gitweb_base/$part/tree/HEAD${argssep}/$i"
     done
     ;;
-  *)
+  gitweb_old)
     echo "$gitweb_base/?p=$part"
     echo "$gitweb_base/?p=$part;a=commitdiff;h=$hash"
     echo "$gitweb_base/?p=$part;a=tree;h=HEAD"