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 7USAGE='<start> <url> [<end>]' 8LONG_USAGE='Summarizes the changes between two commits to the standard output, 9and includes the given URL in the generated summary.' 10SUBDIRECTORY_OK='Yes' 11OPTIONS_KEEPDASHDASH= 12OPTIONS_SPEC='git request-pull [options] start url [end] 13-- 14p show patch text as well 15' 16 17. git-sh-setup 18 19GIT_PAGER= 20export GIT_PAGER 21 22patch= 23while case"$#"in0)break;;esac 24do 25case"$1"in 26-p) 27patch=-p;; 28--) 29shift;break;; 30-*) 31 usage ;; 32*) 33break;; 34esac 35shift 36done 37 38base=$1 url=$2head=${3-HEAD} status=0 branch_name= 39 40headref=$(git symbolic-ref -q "$head") 41if git show-ref -q --verify"$headref" 42then 43 branch_name=${headref#refs/heads/} 44iftest"z$branch_name"="z$headref"|| 45! git config "branch.$branch_name.description">/dev/null 46then 47 branch_name= 48fi 49fi 50 51tag_name=$(git describe --exact "$head^0" 2>/dev/null) 52 53test -n"$base"&&test -n"$url"|| usage 54 55baserev=$(git rev-parse --verify --quiet "$base"^0) 56iftest -z"$baserev" 57then 58 die "fatal: Not a valid revision:$base" 59fi 60 61headrev=$(git rev-parse --verify --quiet "$head"^0) 62iftest -z"$headrev" 63then 64 die "fatal: Not a valid revision:$head" 65fi 66 67merge_base=$(git merge-base $baserev $headrev)|| 68die "fatal: No commits in common between$baseand$head" 69 70# $head is the token given from the command line, and $tag_name, if 71# exists, is the tag we are going to show the commit information for. 72# If that tag exists at the remote and it points at the commit, use it. 73# Otherwise, if a branch with the same name as $head exists at the remote 74# and their values match, use that instead. 75# 76# Otherwise find a random ref that matches $headrev. 77find_matching_ref=' 78 sub abbr { 79 my$ref= shift; 80 if ($ref=~ s|^refs/heads/|| ||$ref=~ s|^refs/tags/|tags/|) { 81 return$ref; 82 } else { 83 return$ref; 84 } 85 } 86 87 my ($tagged,$branch,$found); 88 while (<STDIN>) { 89 my ($sha1,$ref,$deref) = /^(\S+)\s+(\S+?)(\^\{\})?$/; 90 next unless ($sha1eq$ARGV[1]); 91$found= abbr($ref); 92 if ($deref&&$refeq "tags/$ARGV[2]") { 93$tagged=$found; 94 last; 95 } 96 if ($ref=~ m|/\Q$ARGV[0]\E$|) { 97$exact=$found; 98 } 99 } 100 if ($tagged) { 101 print "$tagged\n"; 102 } elsif ($exact) { 103 print "$exact\n"; 104 } elsif ($found) { 105 print "$found\n"; 106 } 107' 108 109ref=$(git ls-remote "$url" | perl -e "$find_matching_ref" "$head" "$headrev" "$tag_name") 110 111url=$(git ls-remote --get-url "$url") 112 113git show -s --format='The following changes since commit %H: 114 115 %s (%ci) 116 117are available in the git repository at: 118'$merge_base&& 119echo"$url${ref+ $ref}"&& 120git show -s --format=' 121for you to fetch changes up to %H: 122 123 %s (%ci) 124 125----------------------------------------------------------------'$headrev&& 126 127iftest -n"$branch_name" 128then 129echo"(from the branch description for$branch_namelocal branch)" 130echo 131 git config "branch.$branch_name.description" 132fi&& 133 134iftest -n"$tag_name" 135then 136iftest -z"$ref"||test"$ref"!="tags/$tag_name" 137then 138echo>&2"warn: You locally have$tag_namebut it does not (yet)" 139echo>&2"warn: appear to be at$url" 140echo>&2"warn: Do you want to push it there, perhaps?" 141fi 142 git cat-file tag "$tag_name"| 143sed-n -e'1,/^$/d'-e'/^-----BEGIN PGP /q'-e p 144echo 145fi&& 146 147iftest -n"$branch_name"||test -n"$tag_name" 148then 149echo"----------------------------------------------------------------" 150fi&& 151 152git shortlog ^$baserev $headrev&& 153git diff-M --stat --summary$patch $merge_base..$headrev|| status=1 154 155iftest -z"$ref" 156then 157echo"warn: No branch of$urlis at:">&2 158 git show -s --format='warn: %h: %s'$headrev>&2 159echo"warn: Are you sure you pushed '$head' there?">&2 160 status=1 161fi 162exit$status