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