App-GitGerrit
view release on metacpan or search on metacpan
lib/App/GitGerrit.pm view on Meta::CPAN
return $result;
}
# The normalize_date routine removes the trailing zeroes from a $date.
sub normalize_date {
my ($date) = @_;
$date =~ s/\.0+$//;
return $date;
}
# The query_changes routine receives a list of strings to query the
# Gerrit server. It returns an array-ref containing a list of
# array-refs, each containing a list of change descriptions.
sub query_changes {
my @queries = @_;
return [] unless @queries;
# If we're inside a git repository, restrict the query to the
# current project's reviews.
if (my $project = config('project')) {
$project = uri_escape_utf8($project);
@queries = map "q=project:$project+$_", @queries;
}
push @queries, "n=$Options{limit}" if $Options{limit};
push @queries, "o=LABELS";
my $changes = gerrit_or_die(GET => "/changes/?" . join('&', @queries));
$changes = [$changes] if ref $changes->[0] eq 'HASH';
return $changes;
}
# The get_change routine returns the description of a change
# identified by $id. An optional boolean second argument ($allrevs)
# tells if the change description should contain a description of all
# patchsets or just the current one.
sub get_change {
my ($id, $allrevs) = @_;
my $revs = $allrevs ? 'ALL_REVISIONS' : 'CURRENT_REVISION';
return (gerrit_or_die(GET => "/changes/?q=change:$id&o=$revs"))[0][0];
}
# The current_branch routine returns the name of the current branch or
# 'HEAD' in a dettached head state.
sub current_branch {
chomp(my $branch = qx/git rev-parse --abbrev-ref HEAD/);
return $branch;
}
# The update_branch routine receives a local $branch name and updates
# it with the homonym branch in the Gerrit remote.
sub update_branch {
my ($branch) = @_;
my $remote = config('remote');
cmd "git fetch $remote $branch:$branch";
}
# The change_branch_info routine receives the name of a branch. If
# it's a change-branch, it returns a two-element list containing it's
# upstream name and its id. Otherwise, it returns the empty list.
sub change_branch_info {
my ($branch) = @_;
if ($branch =~ m:^change/(?<upstream>.*)/(?<id>[^/]+):) {
return ($+{upstream}, $+{id});
}
return;
}
# The current_change_id routine returns the id of the change branch
# we're currently in. If we're not in a change branch, it returns
# undef.
sub current_change_id {
my ($branch, $id) = change_branch_info(current_branch);
return $id;
}
# This routine receives the hash-ref mapped to the 'Code-Review' label
# in a change's 'labels' key when it's fetched with the option
# LABELS. For more information, please read:
# https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#label-info
sub code_review {
my ($cr) = @_;
if (! defined $cr) {
return '';
} elsif (exists $cr->{rejected}) {
return '-2';
} elsif (exists $cr->{disliked}) {
return '-1';
} elsif (exists $cr->{approved}) {
return '+2';
} elsif (exists $cr->{recommended}) {
return '+1';
} else {
return '';
}
}
# This routine receives a branch name (normally the upstream of a
# change-branch) and returns a list of users matching the
# git-gerrit.reviewers specifications. The list returned is guaranteed
# to have no duplicates.
sub auto_reviewers {
my ($upstream) = @_;
my $paths;
my @reviewers;
( run in 2.252 seconds using v1.01-cache-2.11-cpan-600a1bdf6e4 )