App-GitGerrit
view release on metacpan or search on metacpan
lib/App/GitGerrit.pm view on Meta::CPAN
if (my $reviewers = $Options{reviewer}) {
push @reviewers, split(/,/, join(',', @$reviewers));
}
if (@reviewers) {
push @tags, map("r=$_", @reviewers);
}
if (my $ccs = $Options{cc}) {
push @tags, map("cc=$_", split(/,/, join(',', @$ccs)));
}
if ($Options{submit}) {
push @tags, 'submit';
}
if (my $base = $Options{base}) {
push @tags, "base=$base";
}
if (@tags) {
$refspec .= '%';
$refspec .= join(',', @tags);
}
my $remote = config('remote');
cmd "git push $remote $refspec"
or error "$Command: Error pushing change.";
if ($is_clean && ! $Options{keep}) {
cmd "git checkout $upstream" and cmd "git branch -D $branch";
}
install_commit_msg_hook;
return;
};
$Commands{query} = sub {
get_options(
'verbose',
'limit=i',
);
my (@names, @queries);
foreach my $arg (@ARGV) {
if ($arg =~ /(?<name>.*?)=(?<query>.*)/) {
push @names, $+{name};
push @queries, $+{query};
} else {
push @names, "QUERY";
push @queries, $arg;
}
}
my $changes = query_changes(@queries);
for (my $i=0; $i < @$changes; ++$i) {
print "[$names[$i]=$queries[$i]]\n";
next unless @{$changes->[$i]};
require Text::Table;
my $table = Text::Table->new("ID\n&num", qw/STATUS CR UPDATED PROJECT BRANCH OWNER SUBJECT/);
foreach my $change (sort {$b->{updated} cmp $a->{updated}} @{$changes->[$i]}) {
if ($Options{verbose}) {
if (my $topic = gerrit_or_die(GET => "/changes/$change->{id}/topic")) {
$change->{branch} .= " ($topic)";
}
}
$table->add(
$change->{_number},
$change->{status},
code_review($change->{labels}{'Code-Review'}),
normalize_date($change->{updated}),
$change->{project},
$change->{branch},
$change->{owner}{name},
$change->{subject},
);
}
print $table->table(), "\n";
}
return;
};
my %StandardQueries = (
changes => [
'Outgoing reviews=is:open+owner:self',
'Incoming reviews=is:open+reviewer:self+-owner:self',
'Recently closed=is:closed+owner:self+-age:1mon',
],
drafts => ['Drafts=is:draft'],
watched => ['Watched changes=is:watched+status:open'],
starred => ['Starred changes=is:starred'],
);
$Commands{my} = sub {
if (@ARGV) {
if (exists $StandardQueries{$ARGV[-1]}) {
splice @ARGV, -1, 1, @{$StandardQueries{$ARGV[-1]}};
} elsif ($ARGV[-1] =~ /^-/) {
# By default we show 'My Changes'
push @ARGV, @{$StandardQueries{changes}};
} else {
syntax_error "$Command: Invalid change specification: '$ARGV[-1]'";
}
} else {
# By default we show 'My Changes'
push @ARGV, @{$StandardQueries{changes}};
}
$Commands{query}();
return;
};
$Commands{show} = sub {
get_options();
grok_unspecified_change;
foreach my $id (@ARGV) {
my $change = gerrit_or_die(GET => "/changes/$id/detail");
print <<EOF;
Change-Num: $change->{_number}
Change-Id: $change->{change_id}
Subject: $change->{subject}
Owner: $change->{owner}{name}
EOF
foreach my $date (qw/created updated/) {
$change->{$date} = normalize_date($change->{$date})
if exists $change->{$date};
}
foreach my $key (qw/project branch topic created updated status reviewed mergeable/) {
printf "%12s %s\n", "\u$key:", $change->{$key}
if exists $change->{$key};
}
print "\n";
# We want to produce a table in which the first column lists the
# reviewer names and the other columns have their votes for each
# label. However, the change object has this information
# inverted. So, we have to first collect all votes.
my @labels = sort keys %{$change->{labels}};
my %reviewers;
while (my ($label, $info) = each %{$change->{labels}}) {
foreach my $vote (@{$info->{all}}) {
$reviewers{$vote->{name}}{$label} = $vote->{value};
}
}
# And now we can output the vote table
require Text::Table;
my $table = Text::Table->new('REVIEWER', map {"$_\n&num"} @labels);
foreach my $name (sort keys %reviewers) {
my @votes = map {$_ > 0 ? "+$_" : $_} map {defined $_ ? $_ : '0'} @{$reviewers{$name}}{@labels};
$table->add($name, @votes);
}
print $table->table(), '-' x 60, "\n";
}
return;
};
$Commands{fetch} = sub {
get_options();
grok_unspecified_change;
my $branch;
my $project = config('project');
my @change_branches;
foreach my $id (@ARGV) {
my $change = get_change($id);
$change->{project} eq $project
or error "$Command: Change $id belongs to a different project ($change->{project}), not $project";
my ($revision) = values %{$change->{revisions}};
my ($url, $ref) = @{$revision->{fetch}{http}}{qw/url ref/};
$branch = "change/$change->{branch}/$change->{_number}";
cmd "git fetch $url $ref:$branch"
or error "$Command: Can't fetch $url";
push @change_branches, $branch;
}
return @change_branches;
};
( run in 0.606 second using v1.01-cache-2.11-cpan-140bd7fdf52 )