80 lines
2.4 KiB
Perl
Executable file
80 lines
2.4 KiB
Perl
Executable file
#!/usr/bin/perl -w
|
|
|
|
# To use this script: symlink it to .git/hooks/pre-push, then "git push"
|
|
#
|
|
# This script is called by "git push" after it has checked the remote status,
|
|
# but before anything has been pushed. If this script exits with a non-zero
|
|
# status nothing will be pushed.
|
|
#
|
|
# This hook is called with the following parameters:
|
|
#
|
|
# $1 -- Name of the remote to which the push is being done
|
|
# $2 -- URL to which the push is being done
|
|
#
|
|
# If pushing without using a named remote those arguments will be equal.
|
|
#
|
|
# Information about the commits which are being pushed is supplied as lines to
|
|
# the standard input in the form:
|
|
#
|
|
# <local ref> <local sha1> <remote ref> <remote sha1>
|
|
|
|
use warnings;
|
|
use strict;
|
|
|
|
my $remote = $ARGV[0];
|
|
my $url = $ARGV[1];
|
|
|
|
#print("remote: $remote\n");
|
|
#print("url: $url\n");
|
|
|
|
$url =~ s/\.git$//; # change myorg/myproject.git to myorg/myproject
|
|
$url =~ s#^git\@github\.com\:#https://github.com/#i;
|
|
my $commiturl = $url =~ /\Ahttps?:\/\/github.com\// ? "$url/commit/" : '';
|
|
|
|
my $z40 = '0000000000000000000000000000000000000000';
|
|
my $reported = 0;
|
|
|
|
while (<STDIN>) {
|
|
chomp;
|
|
my ($local_ref, $local_sha, $remote_ref, $remote_sha) = split / /;
|
|
#print("local_ref: $local_ref\n");
|
|
#print("local_sha: $local_sha\n");
|
|
#print("remote_ref: $remote_ref\n");
|
|
#print("remote_sha: $remote_sha\n");
|
|
|
|
my $range = '';
|
|
if ($remote_sha eq $z40) { # New branch, examine all commits
|
|
$range = $local_sha;
|
|
} else { # Update to existing branch, examine new commits
|
|
$range = "$remote_sha..$local_sha";
|
|
}
|
|
|
|
my $gitcmd = "git log --reverse --oneline --no-abbrev-commit '$range'";
|
|
open(GITPIPE, '-|', $gitcmd) or die("\n\n$0: Failed to run '$gitcmd': $!\n\nAbort push!\n\n");
|
|
while (<GITPIPE>) {
|
|
chomp;
|
|
if (/\A([a-fA-F0-9]+)\s+(.*?)\Z/) {
|
|
my $hash = $1;
|
|
my $msg = $2;
|
|
|
|
if (!$reported) {
|
|
print("\nCommits expected to be pushed:\n");
|
|
$reported = 1;
|
|
}
|
|
|
|
#print("hash: $hash\n");
|
|
#print("msg: $msg\n");
|
|
|
|
print("$commiturl$hash -- $msg\n");
|
|
} else {
|
|
die("$0: Unexpected output from '$gitcmd'!\n\nAbort push!\n\n");
|
|
}
|
|
}
|
|
die("\n\n$0: Failing exit code from running '$gitcmd'!\n\nAbort push!\n\n") if !close(GITPIPE);
|
|
}
|
|
|
|
print("\n") if $reported;
|
|
|
|
exit(0); # Let the push go forward.
|
|
|
|
# vi: set ts=4 sw=4 expandtab:
|