]> git.ipfire.org Git - thirdparty/git.git/blame - git-request-pull.sh
Merge branch 'maint-2.1' into maint
[thirdparty/git.git] / git-request-pull.sh
CommitLineData
53dfac44 1#!/bin/sh
ab421d2c
RA
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
3eb91bfc
SN
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.'
806f36d4 10SUBDIRECTORY_OK='Yes'
50ab6558 11OPTIONS_KEEPDASHDASH=
51ba8ce3 12OPTIONS_STUCKLONG=
133cfaeb
JH
13OPTIONS_SPEC='git request-pull [options] start url [end]
14--
15p show patch text as well
16'
17
806f36d4 18. git-sh-setup
ab421d2c 19
653a31c1
MM
20GIT_PAGER=
21export GIT_PAGER
22
133cfaeb
JH
23patch=
24while case "$#" in 0) break ;; esac
25do
26 case "$1" in
27 -p)
28 patch=-p ;;
29 --)
30 shift; break ;;
31 -*)
32 usage ;;
33 *)
34 break ;;
35 esac
36 shift
37done
38
024d34cb 39base=$1 url=$2 status=0
d0504645 40
3c9f1e7c 41test -n "$base" && test -n "$url" || usage
ace33bf9
DW
42
43baserev=$(git rev-parse --verify --quiet "$base"^0)
44if test -z "$baserev"
45then
46 die "fatal: Not a valid revision: $base"
47fi
48
024d34cb
LT
49#
50# $3 must be a symbolic ref, a unique ref, or
dc2eacc5
LT
51# a SHA object expression. It can also be of
52# the format 'local-name:remote-name'.
024d34cb 53#
dc2eacc5
LT
54local=${3%:*}
55local=${local:-HEAD}
56remote=${3#*:}
5aae66bd
JH
57pretty_remote=${remote#refs/}
58pretty_remote=${pretty_remote#heads/}
dc2eacc5
LT
59head=$(git symbolic-ref -q "$local")
60head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)}
61head=${head:-$(git rev-parse --quiet --verify "$local")}
024d34cb
LT
62
63# None of the above? Bad.
dc2eacc5 64test -z "$head" && die "fatal: Not a valid revision: $local"
024d34cb
LT
65
66# This also verifies that the resulting head is unique:
67# "git show-ref" could have shown multiple matching refs..
ace33bf9 68headrev=$(git rev-parse --verify --quiet "$head"^0)
dc2eacc5 69test -z "$headrev" && die "fatal: Ambiguous revision: $local"
024d34cb
LT
70
71# Was it a branch with a description?
72branch_name=${head#refs/heads/}
73if test "z$branch_name" = "z$headref" ||
74 ! git config "branch.$branch_name.description" >/dev/null
ace33bf9 75then
024d34cb 76 branch_name=
ace33bf9 77fi
ab421d2c 78
3c9f1e7c 79merge_base=$(git merge-base $baserev $headrev) ||
ff06c743
SP
80die "fatal: No commits in common between $base and $head"
81
024d34cb
LT
82# $head is the refname from the command line.
83# If a ref with the same name as $head exists at the remote
84# and their values match, use that.
682853e6
JH
85#
86# Otherwise find a random ref that matches $headrev.
fe46fa9d 87find_matching_ref='
dc2eacc5
LT
88 my ($head,$headrev) = (@ARGV);
89 my ($found);
fe46fa9d 90
fe46fa9d 91 while (<STDIN>) {
dc2eacc5 92 chomp;
024d34cb 93 my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/;
dc2eacc5
LT
94 my ($pattern);
95 next unless ($sha1 eq $headrev);
96
97 $pattern="/$head\$";
98 if ($ref eq $head) {
99 $found = $ref;
100 }
101 if ($ref =~ /$pattern/) {
102 $found = $ref;
682853e6 103 }
dc2eacc5 104 if ($sha1 eq $head) {
024d34cb 105 $found = $sha1;
fe46fa9d
JH
106 }
107 }
dc2eacc5 108 if ($found) {
fe46fa9d
JH
109 print "$found\n";
110 }
111'
112
dc2eacc5 113ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "${remote:-HEAD}" "$headrev")
024d34cb
LT
114
115if test -z "$ref"
116then
dc2eacc5
LT
117 echo "warn: No match for commit $headrev found at $url" >&2
118 echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
024d34cb
LT
119 status=1
120fi
fe46fa9d 121
d952cbb1
JH
122# Special case: turn "for_linus" to "tags/for_linus" when it is correct
123if test "$ref" = "refs/tags/$pretty_remote"
124then
125 pretty_remote=tags/$pretty_remote
126fi
127
1a927775 128url=$(git ls-remote --get-url "$url")
ff06c743 129
10eb0007 130git show -s --format='The following changes since commit %H:
ab421d2c 131
10eb0007
MV
132 %s (%ci)
133
cf731666 134are available in the git repository at:
b7e642ec 135' $merge_base &&
5aae66bd 136echo " $url $pretty_remote" &&
cf731666
JH
137git show -s --format='
138for you to fetch changes up to %H:
139
140 %s (%ci)
141
142----------------------------------------------------------------' $headrev &&
ab421d2c 143
4b14ec87 144if test $(git cat-file -t "$head") = tag
c0168147 145then
4b14ec87 146 git cat-file tag "$head" |
d0504645
JH
147 sed -n -e '1,/^$/d' -e '/^-----BEGIN PGP /q' -e p
148 echo
4b14ec87 149 echo "----------------------------------------------------------------"
d0504645
JH
150fi &&
151
c0168147 152if test -n "$branch_name"
d0504645 153then
fe46fa9d 154 echo "(from the branch description for $branch_name local branch)"
c0168147
JH
155 echo
156 git config "branch.$branch_name.description"
157 echo "----------------------------------------------------------------"
158fi &&
d0504645 159
53dfac44 160git shortlog ^$baserev $headrev &&
cf731666
JH
161git diff -M --stat --summary $patch $merge_base..$headrev || status=1
162
ff06c743 163exit $status