git-request-pull.shon commit Merge branch 'jh/trace2-pretty-output' (93fc876)
   1#!/bin/sh
   2# Copyright 2005, Ryan Anderson <ryan@michonline.com>
   3#
   4# This file is licensed under the GPL v2, or a later version
   5# at the discretion of Linus Torvalds.
   6
   7SUBDIRECTORY_OK='Yes'
   8OPTIONS_KEEPDASHDASH=
   9OPTIONS_STUCKLONG=
  10OPTIONS_SPEC='git request-pull [options] start url [end]
  11--
  12p    show patch text as well
  13'
  14
  15. git-sh-setup
  16
  17GIT_PAGER=
  18export GIT_PAGER
  19
  20patch=
  21while   case "$#" in 0) break ;; esac
  22do
  23        case "$1" in
  24        -p)
  25                patch=-p ;;
  26        --)
  27                shift; break ;;
  28        -*)
  29                usage ;;
  30        *)
  31                break ;;
  32        esac
  33        shift
  34done
  35
  36base=$1 url=$2 status=0
  37
  38test -n "$base" && test -n "$url" || usage
  39
  40baserev=$(git rev-parse --verify --quiet "$base"^0)
  41if test -z "$baserev"
  42then
  43    die "fatal: Not a valid revision: $base"
  44fi
  45
  46#
  47# $3 must be a symbolic ref, a unique ref, or
  48# a SHA object expression. It can also be of
  49# the format 'local-name:remote-name'.
  50#
  51local=${3%:*}
  52local=${local:-HEAD}
  53remote=${3#*:}
  54pretty_remote=${remote#refs/}
  55pretty_remote=${pretty_remote#heads/}
  56head=$(git symbolic-ref -q "$local")
  57head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)}
  58head=${head:-$(git rev-parse --quiet --verify "$local")}
  59
  60# None of the above? Bad.
  61test -z "$head" && die "fatal: Not a valid revision: $local"
  62
  63# This also verifies that the resulting head is unique:
  64# "git show-ref" could have shown multiple matching refs..
  65headrev=$(git rev-parse --verify --quiet "$head"^0)
  66test -z "$headrev" && die "fatal: Ambiguous revision: $local"
  67
  68local_sha1=$(git rev-parse --verify --quiet "$head")
  69
  70# Was it a branch with a description?
  71branch_name=${head#refs/heads/}
  72if test "z$branch_name" = "z$headref" ||
  73        ! git config "branch.$branch_name.description" >/dev/null
  74then
  75        branch_name=
  76fi
  77
  78merge_base=$(git merge-base $baserev $headrev) ||
  79die "fatal: No commits in common between $base and $head"
  80
  81# $head is the refname from the command line.
  82# Find a ref with the same name as $head that exists at the remote
  83# and points to the same commit as the local object.
  84find_matching_ref='
  85        my ($head,$headrev) = (@ARGV);
  86        my $pattern = qr{/\Q$head\E$};
  87        my ($remote_sha1, $found);
  88
  89        while (<STDIN>) {
  90                chomp;
  91                my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/;
  92
  93                if ($sha1 eq $head) {
  94                        $found = $remote_sha1 = $sha1;
  95                        break;
  96                }
  97
  98                if ($ref eq $head || $ref =~ $pattern) {
  99                        if ($deref eq "") {
 100                                # Remember the matching object on the remote side
 101                                $remote_sha1 = $sha1;
 102                        }
 103                        if ($sha1 eq $headrev) {
 104                                $found = $ref;
 105                                break;
 106                        }
 107                }
 108        }
 109        if ($found) {
 110                $remote_sha1 = $headrev if ! defined $remote_sha1;
 111                print "$remote_sha1 $found\n";
 112        }
 113'
 114
 115set fnord $(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "${remote:-HEAD}" "$headrev")
 116remote_sha1=$2
 117ref=$3
 118
 119if test -z "$ref"
 120then
 121        echo "warn: No match for commit $headrev found at $url" >&2
 122        echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
 123        status=1
 124elif test "$local_sha1" != "$remote_sha1"
 125then
 126        echo "warn: $head found at $url but points to a different object" >&2
 127        echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
 128        status=1
 129fi
 130
 131# Special case: turn "for_linus" to "tags/for_linus" when it is correct
 132if test "$ref" = "refs/tags/$pretty_remote"
 133then
 134        pretty_remote=tags/$pretty_remote
 135fi
 136
 137url=$(git ls-remote --get-url "$url")
 138
 139git show -s --format='The following changes since commit %H:
 140
 141  %s (%ci)
 142
 143are available in the Git repository at:
 144' $merge_base &&
 145echo "  $url $pretty_remote" &&
 146git show -s --format='
 147for you to fetch changes up to %H:
 148
 149  %s (%ci)
 150
 151----------------------------------------------------------------' $headrev &&
 152
 153if test $(git cat-file -t "$head") = tag
 154then
 155        git cat-file tag "$head" |
 156        sed -n -e '1,/^$/d' -e '/^-----BEGIN PGP /q' -e p
 157        echo
 158        echo "----------------------------------------------------------------"
 159fi &&
 160
 161if test -n "$branch_name"
 162then
 163        echo "(from the branch description for $branch_name local branch)"
 164        echo
 165        git config "branch.$branch_name.description"
 166        echo "----------------------------------------------------------------"
 167fi &&
 168
 169git shortlog ^$baserev $headrev &&
 170git diff -M --stat --summary $patch $merge_base..$headrev || status=1
 171
 172exit $status