Blame git-request-pull.sh

Packit Service fe3200
#!/bin/sh
Packit Service fe3200
# Copyright 2005, Ryan Anderson <ryan@michonline.com>
Packit Service fe3200
#
Packit Service fe3200
# This file is licensed under the GPL v2, or a later version
Packit Service fe3200
# at the discretion of Linus Torvalds.
Packit Service fe3200
Packit Service fe3200
SUBDIRECTORY_OK='Yes'
Packit Service fe3200
OPTIONS_KEEPDASHDASH=
Packit Service fe3200
OPTIONS_STUCKLONG=
Packit Service fe3200
OPTIONS_SPEC='git request-pull [options] start url [end]
Packit Service fe3200
--
Packit Service fe3200
p    show patch text as well
Packit Service fe3200
'
Packit Service fe3200
Packit Service fe3200
. git-sh-setup
Packit Service fe3200
Packit Service fe3200
GIT_PAGER=
Packit Service fe3200
export GIT_PAGER
Packit Service fe3200
Packit Service fe3200
patch=
Packit Service fe3200
while	case "$#" in 0) break ;; esac
Packit Service fe3200
do
Packit Service fe3200
	case "$1" in
Packit Service fe3200
	-p)
Packit Service fe3200
		patch=-p ;;
Packit Service fe3200
	--)
Packit Service fe3200
		shift; break ;;
Packit Service fe3200
	-*)
Packit Service fe3200
		usage ;;
Packit Service fe3200
	*)
Packit Service fe3200
		break ;;
Packit Service fe3200
	esac
Packit Service fe3200
	shift
Packit Service fe3200
done
Packit Service fe3200
Packit Service fe3200
base=$1 url=$2 status=0
Packit Service fe3200
Packit Service fe3200
test -n "$base" && test -n "$url" || usage
Packit Service fe3200
Packit Service fe3200
baserev=$(git rev-parse --verify --quiet "$base"^0)
Packit Service fe3200
if test -z "$baserev"
Packit Service fe3200
then
Packit Service fe3200
    die "fatal: Not a valid revision: $base"
Packit Service fe3200
fi
Packit Service fe3200
Packit Service fe3200
#
Packit Service fe3200
# $3 must be a symbolic ref, a unique ref, or
Packit Service fe3200
# a SHA object expression. It can also be of
Packit Service fe3200
# the format 'local-name:remote-name'.
Packit Service fe3200
#
Packit Service fe3200
local=${3%:*}
Packit Service fe3200
local=${local:-HEAD}
Packit Service fe3200
remote=${3#*:}
Packit Service fe3200
pretty_remote=${remote#refs/}
Packit Service fe3200
pretty_remote=${pretty_remote#heads/}
Packit Service fe3200
head=$(git symbolic-ref -q "$local")
Packit Service fe3200
head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)}
Packit Service fe3200
head=${head:-$(git rev-parse --quiet --verify "$local")}
Packit Service fe3200
Packit Service fe3200
# None of the above? Bad.
Packit Service fe3200
test -z "$head" && die "fatal: Not a valid revision: $local"
Packit Service fe3200
Packit Service fe3200
# This also verifies that the resulting head is unique:
Packit Service fe3200
# "git show-ref" could have shown multiple matching refs..
Packit Service fe3200
headrev=$(git rev-parse --verify --quiet "$head"^0)
Packit Service fe3200
test -z "$headrev" && die "fatal: Ambiguous revision: $local"
Packit Service fe3200
Packit Service fe3200
local_sha1=$(git rev-parse --verify --quiet "$head")
Packit Service fe3200
Packit Service fe3200
# Was it a branch with a description?
Packit Service fe3200
branch_name=${head#refs/heads/}
Packit Service fe3200
if test "z$branch_name" = "z$headref" ||
Packit Service fe3200
	! git config "branch.$branch_name.description" >/dev/null
Packit Service fe3200
then
Packit Service fe3200
	branch_name=
Packit Service fe3200
fi
Packit Service fe3200
Packit Service fe3200
merge_base=$(git merge-base $baserev $headrev) ||
Packit Service fe3200
die "fatal: No commits in common between $base and $head"
Packit Service fe3200
Packit Service fe3200
# $head is the refname from the command line.
Packit Service fe3200
# Find a ref with the same name as $head that exists at the remote
Packit Service fe3200
# and points to the same commit as the local object.
Packit Service fe3200
find_matching_ref='
Packit Service fe3200
	my ($head,$headrev) = (@ARGV);
Packit Service fe3200
	my $pattern = qr{/\Q$head\E$};
Packit Service fe3200
	my ($remote_sha1, $found);
Packit Service fe3200
Packit Service fe3200
	while (<STDIN>) {
Packit Service fe3200
		chomp;
Packit Service fe3200
		my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/;
Packit Service fe3200
Packit Service fe3200
		if ($sha1 eq $head) {
Packit Service fe3200
			$found = $remote_sha1 = $sha1;
Packit Service fe3200
			break;
Packit Service fe3200
		}
Packit Service fe3200
Packit Service fe3200
		if ($ref eq $head || $ref =~ $pattern) {
Packit Service fe3200
			if ($deref eq "") {
Packit Service fe3200
				# Remember the matching object on the remote side
Packit Service fe3200
				$remote_sha1 = $sha1;
Packit Service fe3200
			}
Packit Service fe3200
			if ($sha1 eq $headrev) {
Packit Service fe3200
				$found = $ref;
Packit Service fe3200
				break;
Packit Service fe3200
			}
Packit Service fe3200
		}
Packit Service fe3200
	}
Packit Service fe3200
	if ($found) {
Packit Service fe3200
		$remote_sha1 = $headrev if ! defined $remote_sha1;
Packit Service fe3200
		print "$remote_sha1 $found\n";
Packit Service fe3200
	}
Packit Service fe3200
'
Packit Service fe3200
Packit Service fe3200
set fnord $(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "${remote:-HEAD}" "$headrev")
Packit Service fe3200
remote_sha1=$2
Packit Service fe3200
ref=$3
Packit Service fe3200
Packit Service fe3200
if test -z "$ref"
Packit Service fe3200
then
Packit Service fe3200
	echo "warn: No match for commit $headrev found at $url" >&2
Packit Service fe3200
	echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
Packit Service fe3200
	status=1
Packit Service fe3200
elif test "$local_sha1" != "$remote_sha1"
Packit Service fe3200
then
Packit Service fe3200
	echo "warn: $head found at $url but points to a different object" >&2
Packit Service fe3200
	echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
Packit Service fe3200
	status=1
Packit Service fe3200
fi
Packit Service fe3200
Packit Service fe3200
# Special case: turn "for_linus" to "tags/for_linus" when it is correct
Packit Service fe3200
if test "$ref" = "refs/tags/$pretty_remote"
Packit Service fe3200
then
Packit Service fe3200
	pretty_remote=tags/$pretty_remote
Packit Service fe3200
fi
Packit Service fe3200
Packit Service fe3200
url=$(git ls-remote --get-url "$url")
Packit Service fe3200
Packit Service fe3200
git show -s --format='The following changes since commit %H:
Packit Service fe3200
Packit Service fe3200
  %s (%ci)
Packit Service fe3200
Packit Service fe3200
are available in the Git repository at:
Packit Service fe3200
' $merge_base &&
Packit Service fe3200
echo "  $url $pretty_remote" &&
Packit Service fe3200
git show -s --format='
Packit Service fe3200
for you to fetch changes up to %H:
Packit Service fe3200
Packit Service fe3200
  %s (%ci)
Packit Service fe3200
Packit Service fe3200
----------------------------------------------------------------' $headrev &&
Packit Service fe3200
Packit Service fe3200
if test $(git cat-file -t "$head") = tag
Packit Service fe3200
then
Packit Service fe3200
	git cat-file tag "$head" |
Packit Service fe3200
	sed -n -e '1,/^$/d' -e '/^-----BEGIN PGP /q' -e p
Packit Service fe3200
	echo
Packit Service fe3200
	echo "----------------------------------------------------------------"
Packit Service fe3200
fi &&
Packit Service fe3200
Packit Service fe3200
if test -n "$branch_name"
Packit Service fe3200
then
Packit Service fe3200
	echo "(from the branch description for $branch_name local branch)"
Packit Service fe3200
	echo
Packit Service fe3200
	git config "branch.$branch_name.description"
Packit Service fe3200
	echo "----------------------------------------------------------------"
Packit Service fe3200
fi &&
Packit Service fe3200
Packit Service fe3200
git shortlog ^$baserev $headrev &&
Packit Service fe3200
git diff -M --stat --summary $patch $merge_base..$headrev || status=1
Packit Service fe3200
Packit Service fe3200
exit $status