Edit

kc3-lang/SDL/build-scripts/git-pre-push-hook.pl

Branch :

  • Show log

    Commit

  • Author : Ryan C. Gordon
    Date : 2021-03-17 13:36:38
    Hash : db2ad6fa
    Message : git-pre-push-hook: remove ".git" from URL.

  • build-scripts/git-pre-push-hook.pl
  • #!/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: