Skip to content
Browse files

git helpers

  • Loading branch information...
1 parent 16c5899 commit 3be5bb2eff8619b18d9d3cceae5bf26c504835c2 Tammer Saleh committed Feb 17, 2013
Showing with 410 additions and 0 deletions.
  1. +58 −0 bin/git-editor
  2. +304 −0 bin/git-info
  3. +48 −0 bin/git-pager
View
58 bin/git-editor
@@ -0,0 +1,58 @@
+#!/bin/sh
+#
+# git-editor - invokes the editor that Git would pick
+#
+# How to set up:
+# $ install -m 755 git-editor ~/bin/
+# $ git config --global alias.editor '!$HOME/bin/git-editor'
+#
+# Copyright (c) 2009 Akinori MUSHA
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+: ${GIT_EDITOR:="$(git config core.editor)"}
+: ${GIT_EDITOR:="${VISUAL}"}
+: ${GIT_EDITOR:="${EDITOR}"}
+
+if [ -z "$GIT_EDITOR" ]; then
+ case "$TERM" in
+ dumb|'')
+ echo "$0: Terminal is dumb but no VISUAL nor EDITOR defined." >&2
+ exit 1
+ ;;
+ *)
+ GIT_EDITOR=vi
+ ;;
+ esac
+fi
+
+case "$GIT_EDITOR" in
+ *["\$ '"]*)
+ exec /bin/sh -c "$GIT_EDITOR \"\$@\"" . "$@"
+ ;;
+ *)
+ exec "$GIT_EDITOR" "$@"
+ ;;
+esac
View
304 bin/git-info
@@ -0,0 +1,304 @@
+#!/bin/sh
+#
+# git-info - shows information about a Git repository a la `svn info'
+#
+# How to use:
+# $ git info
+# $ git info ~/src/somewhere/somefile
+# $ git info some/relative/file_or_directory
+# $ git info ~/repos/something.git
+#
+# Copyright (c) 2009, 2012 Akinori MUSHA
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+PAGINATE=t
+COLOR=
+
+main () {
+ local path file first=t opt OPTIND=1 ret
+
+ while getopts 'p-:' opt; do
+ case "$opt" in
+ p)
+ PAGINATE=t
+ ;;
+ -)
+ case "$OPTARG" in
+ paginate)
+ PAGINATE=t
+ ;;
+ no-pager)
+ PAGINATE=
+ ;;
+ color)
+ COLOR=always
+ ;;
+ color\=*)
+ COLOR="${OPTARG#color=}"
+ ;;
+ *)
+ die "Illegal option --$OPTARG"
+ ;;
+ esac
+ ;;
+ *)
+ echo "Usage: $0 [-p|--paginate|--no-pager|--color[=<when>]] [path]" >&2
+ die
+ ;;
+ esac
+ done
+
+ shift $(($OPTIND - 1))
+
+ initialize_colors
+
+ case "$#" in
+ 1)
+ ;;
+ 0)
+ if [ -n "$GIT_DIR" ]; then
+ set -- "$GIT_DIR"
+ else
+ set -- .
+ fi
+ ;;
+ *)
+ die "Too many arguments"
+ ;;
+ esac
+
+ git_info "$1"
+
+ ret=$?
+
+ finalize
+
+ return $ret
+}
+
+initialize_colors () {
+ if [ -z "$COLOR" ]; then
+ if git config --get-colorbool color.info; then
+ COLOR=always
+ else
+ COLOR=never
+ fi
+ fi
+
+ case "$COLOR" in
+ always|never)
+ COLOR_BRANCH=$COLOR
+ ;;
+ auto)
+ if git config --get-colorbool color.branch; then
+ COLOR_BRANCH=always
+ else
+ COLOR_BRANCH=never
+ fi
+ ;;
+ *)
+ die "option \`color' expects \"always\", \"auto\", or \"never\""
+ ;;
+ esac
+
+ if [ "$COLOR" = always ]; then
+ REMOTE_COLOR="$(get_color color.info.remote color.branch.remote red)"
+ LOCAL_COLOR="$(get_color color.info.local color.branch.local green)"
+ PATH_COLOR="$(get_color color.info.path '' 'bold')"
+ REPOSITORY_COLOR="$(get_color color.info.repository '' 'bold')"
+ ID_COLOR="$(get_color color.info.id '' 'yellow')"
+ RESET_COLOR="$(git config --get-color '' '')"
+ else
+ REMOTE_COLOR=
+ LOCAL_COLOR=
+ PATH_COLOR=
+ REPOSITORY_COLOR=
+ ID_COLOR=
+ RESET_COLOR=
+ fi
+}
+
+get_color () {
+ local key1="$1" key2="$2" fb="$3"
+ local color="$(git config --get-color "$key1" '')"
+ case "$color" in
+ ''|'')
+ git config --get-color "$key2" "$fb"
+ ;;
+ *)
+ printf '%s' "$color"
+ ;;
+ esac
+}
+
+git_info () {
+ local path="$1" dir relpath root git_dir
+
+ if [ -d "$path" ]; then
+ dir="$(cd -P "$path" && pwd)" || die "$path: Cannot cd to the directory"
+ case "$path" in
+ *.git)
+ git_dir="$dir"
+ ;;
+ esac
+ elif [ -f "$path" ]; then
+ dir="$(dirname "$path")"
+ dir="$(cd -P "$dir" && pwd)" || die "$dir: Cannot cd to the directory"
+ relpath="$(basename "$path")"
+ else
+ die "$path: No such file or directory"
+ fi
+
+ if [ -n "$git_dir" ]; then
+ dir=
+ relpath=
+ elif case "$dir" in ?*.git) [ -d "$dir/objects" -a -d "$dir/refs" ] ;; *) false ;; esac; then
+ git_dir="$dir"
+ relpath=
+ else
+ root="$(
+ cd "$dir" || exit 1
+ while [ ! -d .git ]; do
+ [ "$(pwd)" = / ] && exit 1
+ cd ..
+ done
+ pwd
+ )" || die "Not a git repository."
+ git_dir="$root/.git"
+ if [ "$dir" = "$root" ]; then
+ relpath=.
+ elif [ -n "$relpath" ]; then
+ relpath="${dir#"$root/"}/$relpath"
+ else
+ relpath="${dir#"$root/"}"
+ fi
+ fi
+
+ set -- "$git_dir"
+ if [ -n "$relpath" ]; then
+ set -- "$@" "$relpath"
+ fi
+
+ if [ -n "$PAGINATE" ]; then
+ do_git_info "$@" | git-pager
+ else
+ do_git_info "$@"
+ fi
+}
+
+do_git_info () {
+ local git_dir="$1" relpath="$2" root line field color reset
+
+ shift
+
+ echo "Repository Path: $PATH_COLOR$git_dir$RESET_COLOR"
+
+ if [ $# -gt 0 ]; then
+ root="$(dirname "$git_dir")"
+ if [ "$relpath" = . ]; then
+ echo "Path: $PATH_COLOR$root$RESET_COLOR"
+ else
+ echo "Path: $PATH_COLOR$root/$relpath$RESET_COLOR"
+ fi
+ fi
+
+ maketemp
+
+ GIT_DIR="$git_dir" git remote -v > "$TEMPFILE"
+ if [ -s "$TEMPFILE" ]; then
+ echo "Remote Repositories:"
+ sed -e "s/^\([^ ]\{1,\}\)\([ ]\{1,\}\)\([^ ]\{1,\}\)/$REMOTE_COLOR\1$RESET_COLOR\2$REPOSITORY_COLOR\3$RESET_COLOR/" \
+ -e 's/^/ /' \
+ "$TEMPFILE"
+ fi
+
+ GIT_DIR="$git_dir" git branch -r --color=$COLOR_BRANCH > "$TEMPFILE"
+ if [ -s "$TEMPFILE" ]; then
+ echo "Remote Branches:"
+ sed -e "s/\([ ]\{1,\}->[ ]\{1,\}\)\([^ ]\{1,\}\)/\1$REMOTE_COLOR\2$RESET_COLOR/" \
+ -e 's/^ */ /' "$TEMPFILE"
+ fi
+
+ GIT_DIR="$git_dir" git branch --color=$COLOR_BRANCH > "$TEMPFILE"
+ if [ -s "$TEMPFILE" ]; then
+ echo "Local Branches:"
+ sed 's/^/ /' "$TEMPFILE"
+ fi
+
+ echo "Repository Configuration:"
+ sed -e "s/^\(\[remote \"\)\([^\"]\{1,\}\)\(\"\]\)$/\1$REMOTE_COLOR\2$RESET_COLOR\3/" \
+ -e "s/^\([ ]*remote[ ]*=[ ]*\"\{0,1\}\)\([^\" ]\{1,\}\)\(\"\{0,1\}[ ]*\)$/\1$REMOTE_COLOR\2$RESET_COLOR\3/" \
+ -e "s/^\(\[branch \"\)\([^\"]\{1,\}\)\(\"\]\)$/\1$LOCAL_COLOR\2$RESET_COLOR\3/" \
+ -e "s/^\([ ]*url[ ]*=[ ]*\"\{0,1\}\)\([^\" ]\{1,\}\)\(\"\{0,1\}[ ]*\)$/\1$REPOSITORY_COLOR\2$RESET_COLOR\3/" \
+ -e 's/^/ /' \
+ "$git_dir"/config
+
+ (cd "$root" && GIT_DIR="$git_dir" git log --max-count=1 "$@") | {
+ while read -r field line; do
+ color=
+ reset=
+ case "$field" in
+ commit)
+ field='Commit ID:'
+ color="$ID_COLOR"
+ reset="$RESET_COLOR"
+ ;;
+ *:)
+ ;;
+ '')
+ break
+ ;;
+ esac
+ echo "Last Changed $field $color$line$reset"
+ done
+ cat > "$TEMPFILE"
+ }
+ echo "Last Changed Log:"
+ sed 's/^ / /' "$TEMPFILE"
+}
+
+die () {
+ [ "$#" -gt 0 ] && echo "$0: $@" >&2
+ finalize
+ exit 1
+}
+
+TEMPFILE=
+
+maketemp () {
+ if [ -z "$TEMPFILE" ]; then
+ TEMPFILE="$(mktemp /tmp/git-info.XXXXXX)" || die
+ trap "finalize; exit 130" 1 2 3 15
+ fi
+}
+
+finalize () {
+ if [ -n "$TEMPFILE" ]; then
+ rm -f "$TEMPFILE"
+ fi
+}
+
+main "$@"
View
48 bin/git-pager
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# git-pager - invokes the pager that Git would pick
+#
+# How to set up:
+# $ install -m 755 git-pager ~/bin/
+# $ git config --global alias.pager '!$HOME/bin/git-pager'
+#
+# Copyright (c) 2009 Akinori MUSHA
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+
+: ${GIT_PAGER:="$(git config core.pager)"}
+: ${GIT_PAGER:="${PAGER:-less}"}
+
+LESS="${LESS-FRSX}"
+export LESS
+
+case "$GIT_PAGER" in
+ *["\$ '"]*)
+ exec /bin/sh -c "$GIT_PAGER "'"$@"' . "$@"
+ ;;
+ *)
+ exec "$GIT_PAGER" "$@"
+ ;;
+esac

0 comments on commit 3be5bb2

Please sign in to comment.
Something went wrong with that request. Please try again.