]> Tony Duckles's Git Repositories (git.nynim.org) - dotfiles.git/blob - bin/git-outgoing
bin/ipaddr: Size column based on max if-name length
[dotfiles.git] / bin / git-outgoing
1 #!/bin/sh
2 # Usage: git-outgoing [-d] [<upstream>] [<head> [<limit>]]
3 # Show commits on current branch that do not exist on branch <upstream>.
4
5 # bail out with message to stderr and exit status 1
6 die() {
7 echo "$(basename $0):" "$@" 1>&2
8 exit 1
9 }
10
11 # colors
12 SHA=$(git config --get-color 'color.branch.local')
13 ADD=$(git config --get-color 'color.diff.new')
14 REM=$(git config --get-color 'color.diff.old')
15 RESET=$(git config --get-color '' 'reset')
16
17 # check for -d / --diff argument
18 diff=false
19 if [ "$1" = '-d' -o "$1" = '--diff' ]
20 then diff=true
21 shift
22 fi
23
24 # get the current branch in refs/heads/<branch> form
25 ref=$(git symbolic-ref -q HEAD)
26 test -n "$ref" ||
27 die "you're not on a branch"
28
29 # just the branch name please
30 branch=$(echo "$ref" | sed 's@^refs/heads/@@')
31 test -n "$branch" ||
32 die "you're in a weird place; get on a local branch"
33
34 # use tracking branch if no upstream given
35 if [ $# -eq 0 ]
36 then
37 remote=$(git config --get "branch.$branch.remote" || true)
38
39 merge=$(git config branch.$branch.merge) ||
40 die "branch $branch isn't tracking a remote branch and no <upstream> given"
41
42 set -- "$remote/$(echo "$merge" |sed 's@^refs/heads/@@')"
43 fi
44
45 if $diff
46 then git diff "$1"...HEAD
47 else git cherry -v "$@" |
48 cut -c1-9,43- |
49 sed -e "s/^\(.\) \(.......\)/\1 $SHA\2$RESET/" |
50 sed -e "s/^-/$REM-$RESET/" -e "s/^+/$ADD+$RESET/"
51 fi