diff --git a/bin/git-gpush b/bin/git-gpush index 62833850eb3e2197eb541a25ff11efa9104519e4..5f6c9e2506c885fd487dcaab18c052b66a639dda 100755 --- a/bin/git-gpush +++ b/bin/git-gpush @@ -9,8 +9,6 @@ use strict; use warnings; -package Git::Gerrit::Push; - use File::Basename; # Cannot use Pod::Usage for this file, since git on Windows will invoke its own perl version, which @@ -67,7 +65,7 @@ Description: options are passed on directly to the normal 'git push' command. If you want to avoid specifying all options first, any options specified after a '--' are also passed on directly to the - underlying 'git push' command. This is can be particularly useful + underlying 'git push' command. This can be particularly useful with the -n/--dry-run options, which make git do everything except actually sending the updates. @@ -88,50 +86,64 @@ License: EOM } -sub parse_arguments -{ - my ($self, @arguments) = @_; +my $verbose = 0; + +my $remote = "gerrit"; +my $remote_override = 0; +my $ref_from = "HEAD"; +my $ref_to = ""; +my $ref_override = 0; + +my %aliases = (); + +my @reviewers = (); +my @CCs = (); + +my @arguments = (); - while (scalar @arguments) { - my $arg = shift @arguments; +sub parse_arguments(@) +{ + while (scalar @_) { + my $arg = shift @_; if ($arg eq "-v" || $arg eq "--verbose") { - $self->{'verbose'} = 1; - push @{$self->{'arguments'}}, $arg; + $verbose = 1; + push @arguments, $arg; } elsif ($arg eq "--aliases") { - foreach my $key (sort(keys %{$self->{'aliases'}})) { - print "$key = $self->{'aliases'}->{$key}\n"; + foreach my $key (sort(keys %aliases)) { + print "$key = $aliases{$key}\n"; } exit 0; } elsif ($arg eq "-?" || $arg eq "--?" || $arg eq "-h" || $arg eq "--help") { - $self->usage(); + usage(); exit 0; } elsif ($arg eq "--") { - push @{$self->{'arguments'}}, @arguments; + push @arguments, @_; return; } elsif ($arg =~ /^\+(.+)/) { - push @{$self->{'reviewers'}}, split(/,/, $self->lookup_alias($1)); + push @reviewers, split(/,/, lookup_alias($1)); } elsif ($arg =~ /^\=(.+)/) { - push @{$self->{'CCs'}}, split(/,/, $self->lookup_alias($1)); + push @CCs, split(/,/, lookup_alias($1)); } elsif ($arg =~ /^\-(.+)/) { - push @{$self->{'arguments'}}, $arg; - } elsif (!$self->{'remote-override'} || !$self->{'ref-override'}) { + push @arguments, $arg; + } elsif (!$remote_override || !$ref_override) { if ($arg =~ /(.*):(.*)/) { - $self->{'ref-from'} = $1 if (defined $1 && $1 ne ""); - $self->{'ref-to'} = $2 if (defined $2 && $2 ne ""); - $self->{'ref-override'} = 1; + $ref_from = $1 if (defined $1 && $1 ne ""); + $ref_to = $2 if (defined $2 && $2 ne ""); + $ref_override = 1; } else { - $self->{'remote'} = $arg; - $self->{'remote-override'} = 1; + $remote = $arg; + $remote_override = 1; } } else { - push @{$self->{'arguments'}}, $arg; + push @arguments, $arg; } } } -sub fileContents { - my ($self, $filename) = @_; +sub fileContents($) +{ + my ($filename) = @_; my @contents = ""; my $fh; @@ -142,18 +154,17 @@ sub fileContents { return @contents; } -sub load_aliases +sub load_aliases() { - my ($self) = @_; my $script_path = dirname($0); # Read aliases from .git-gpush-aliases file - foreach my $line ($self->fileContents("$script_path/.git-gpush-aliases")) { + foreach my $line (fileContents("$script_path/.git-gpush-aliases")) { chomp $line; $line =~ s,(#|//).*$,,; # Remove any comments if ($line =~ /([^ ]+)\s*=\s*(\S+)/) { # Capture the alias for my $alias (split(/,/, $1)) { - $self->{'aliases'}->{$alias} = $2; + $aliases{$alias} = $2; } } } @@ -163,34 +174,36 @@ sub load_aliases return if ($?); # just return if no git configs for gpush foreach (@gitconfigs) { - if (/^gpush\.(remote|ref-from|ref-to) (\w+)/) { - $self->{$1} = $2; + if (/^gpush\.remote (\w+)/) { + $remote = $2; + } elsif (/^gpush\.ref-from (.+)/) { + $ref_from = $2; + } elsif (/^gpush\.ref-to (.+)/) { + $ref_to = $2; } elsif (/^gpush\.alias\.([^ ]*) (.+)/) { - $self->{'aliases'}->{$1} = $2; + $aliases{$1} = $2; } # else ignore } } -sub lookup_alias +sub lookup_alias($) { - my ($self, $user) = @_; + my ($user) = @_; - my $alias = $self->{'aliases'}->{$user}; + my $alias = $aliases{$user}; if (defined $alias && $alias ne "") { - print " $user = $alias\n" if ($self->{'verbose'}); + print " $user = $alias\n" if ($verbose); return $alias; } return $user; } -sub push_patches +sub push_patches() { - my ($self) = @_; - # Detect tracking branch if ref-to is not set - if ($self->{'ref-to'} eq "") { - my $ref = $self->{'ref-from'}; + if ($ref_to eq "") { + my $ref = $ref_from; $ref =~ s/[~^].*$//; my $sref = `git symbolic-ref -q $ref`; if ($? == 0) { @@ -200,68 +213,33 @@ sub push_patches $ref =~ s,^refs/heads/,,; `git rev-parse --verify -q refs/heads/$ref`; die "Cannot detect tracking branch, $ref is not a valid ref.\n" if ($? != 0); - my $trackref = `git config branch.$ref.merge`; + $ref_to = `git config branch.$ref.merge`; die "Cannot detect tracking branch, 'git config branch.$ref.merge' failed.\n" if ($? != 0); - chomp $trackref; - $trackref =~ s,^refs/heads/,,; - $self->{'ref-to'} = $trackref; + chomp $ref_to; + $ref_to =~ s,^refs/heads/,,; } - if ($self->{'ref-to'} =~ m,^refs/for/,) { + if ($ref_to =~ m,^refs/for/,) { print STDERR "Notice: it is unnecessary to specify refs/for/ in the target ref.\n"; } else { - $self->{'ref-to'} = "refs/for/".$self->{'ref-to'}; + $ref_to = "refs/for/".$ref_to; } - my @reviewers = (); - if (@{$self->{'reviewers'}} || @{$self->{'CCs'}}) { - push @reviewers, "--receive-pack=git receive-pack"; - push @reviewers, map { " --reviewer=$_" } @{$self->{'reviewers'}}; - push @reviewers, map { " --cc=$_" } @{$self->{'CCs'}}; + my @dudes = (); + if (@reviewers || @CCs) { + push @dudes, "--receive-pack=git receive-pack"; + push @dudes, map { " --reviewer=$_" } @reviewers; + push @dudes, map { " --cc=$_" } @CCs; } my @gitcmd = ("git", "push"); - push @gitcmd, @{$self->{'arguments'}}; - push @gitcmd, join '', @reviewers if(scalar @reviewers); # Single argument to git push - push @gitcmd, $self->{'remote'}, "$self->{'ref-from'}:$self->{'ref-to'}"; + push @gitcmd, @arguments; + push @gitcmd, join('', @dudes) if (scalar @dudes); # Single argument to git push + push @gitcmd, $remote, "$ref_from:$ref_to"; - print '+'.join(',', @gitcmd)."\n" if ($self->{'verbose'}); + print '+'.join(',', @gitcmd)."\n" if ($verbose); exit system(@gitcmd); } -sub new -{ - my ($class, @arguments) = @_; - - my $self = {}; - bless $self, $class; - - $self->{'verbose'} = 0; - - $self->{'remote'} = "gerrit"; - $self->{'remote-override'} = 0; - $self->{'ref-from'} = "HEAD"; - $self->{'ref-to'} = ""; - $self->{'ref-override'} = 0; - - $self->{'aliases'} = (); - - $self->{'reviewers'} = []; - $self->{'CCs'} = []; - - $self->{'arguments'} = []; - - $self->load_aliases; - $self->parse_arguments(@arguments); - return $self; -} - -sub run -{ - my ($self) = @_; - $self->push_patches; -} - -#============================================================================== - -Git::Gerrit::Push->new(@ARGV)->run if (!caller); -1; +load_aliases(); +parse_arguments(@ARGV); +push_patches();