Исключая автора из списка рецензентов в Gerrit - PullRequest
8 голосов
/ 06 июня 2011

Я настраиваю контроль доступа для своей компании в Gerrit, и в нашем текущем внутреннем процессе происходит перекрестное взаимодействие между рецензентами и программистами (они, как правило, представляют собой одну и ту же группу людей). Мы также хотим, чтобы только один рецензент рассмотрел код и отправил его, если он выглядит хорошо.

При настройке по умолчанию любой пользователь с параметром +2: Looks good to me, approved может просмотреть свой собственный код.

Есть ли способ запретить автору просматривать свой собственный код, но все же позволить ему полностью просмотреть другой код? Мне не удалось найти автора исключений в настройках группы управления доступом или настройках разрешений.

Ответы [ 5 ]

4 голосов
/ 01 мая 2013

Пример поваренной книги Геррита 8 не строго запрещает Автору просматривать его / ее собственное изменение, но потребует, чтобы кто-то еще +2 внес его, прежде чем сможет отправить.

2 голосов
/ 16 марта 2012

Это работает для меня, но это быстрый взлом:

  • позволяет настраиваемому числу + 1 считаться как +2 для ручной подачи
  • при желании автоматически подать достаточно +1 голосов
  • при желании подсчитывает -1 голос как против +1 в целях подсчета
  • опционально игнорирует собственные +1, добавленные пользователем (вы можете предпочесть проверку на автора, что я не сделал)

Я подправил свой предыдущий ответ, чтобы он не предполагал, что вы используете сервер MySQL.

Возможно, вы захотите переместить файл журнала куда-нибудь, где он будет подвергаться любой обычной ротации журнала - возможно, в ../logs/comment-added.log.

Я пытался выдвинуть настраиваемые биты на передний план. Назовите этот файл комментарий-хук и поместите это в $ gerrit_root / hooks, chmod это 755 или подобное. Настройте пользователя робота в админке группа, так что ловушка может использовать интерфейс sql (и комментировать +2 на вещи с достаточным количеством +1).

#!/usr/bin/perl
#
# comment-hook for a +2 approval from a simple quorum of +1 votes.
#
# Licence: Public domain. All risk is yours; if it breaks, you get to keep both pieces.

$QUORUM = 2; # Total number of +1 votes causing a +2
$PLEBIANS = 'abs(value) < 2'; # or 'value = 1' to ignore -1 unvotes
$AUTO_SUBMIT_ON_QUORACY = '--submit'; # or '' for none
$AND_IGNORE_UPLOADER = 'and uploader_account_id != account_id'; # or '' to let uploaders votes count

$GERRIT_SSH_PORT = 29418;
$SSH_PRIVATE_KEY = '/home/gerrit2/.ssh/id_rsa';
$SSH_USER_IN_ADMIN_GROUP = 'devuser';

# Hopefully you shouldn't need to venture past here.

$SSH = "ssh -i $SSH_PRIVATE_KEY -p $GERRIT_SSH_PORT $SSH_USER_IN_ADMIN_GROUP\@localhost";

$LOG = "/home/gerrit2/hooks/log.comment-added";
open LOG, ">>$LOG" or die;

sub count_of_relevant_votes {
        # Total selected code review votes for this commit
        my $relevance = shift;
        $query = "
                select sum(value) from patch_sets, patch_set_approvals
                where patch_sets.change_id = patch_set_approvals.change_id
                and patch_sets.patch_set_id = patch_set_approvals.patch_set_id
                and revision = '$V{commit}'
                and category_id = 'CRVW'
                and $relevance
                $AND_IGNORE_UPLOADER
                ;";
        $command = "$SSH \"gerrit gsql -c \\\"$query\\\"\"";
        #print LOG "FOR... $command\n";
        @lines = qx($command);
        chomp @lines;
        #print LOG "GOT... ", join("//", @lines), "\n";
        # 0=headers 1=separators 2=data 3=count and timing.
        return $lines[2];
}

sub response {
        my $review = shift;
        return "$SSH 'gerrit review --project=\"$V{project}\" $review $V{commit}'";
}

# ######################
# Parse options

$key='';
while ( $_ = shift @ARGV ) {
        if (/^--(.*)/) {
                $key = $1;
        }
        else {
                $V{$key} .= " " if exists $V{$key};
                $V{$key} .= $_;
        }
}
#print LOG join("\n", map { "$_ = '$V{$_}'" } keys %V), "\n";

# ######################
# Ignore my own comments

$GATEKEEPER="::GATEKEEPER::";
if ($V{comment} =~ /$GATEKEEPER/) {
        # print LOG localtime() . "$V{commit}: Ignore $GATEKEEPER comments\n";
        exit 0;
}

# ######################
# Forbear to analyse anything already +2'd

$submittable = count_of_relevant_votes('value = 2');
if ($submittable > 0) {
        # print LOG "$V{commit} Already +2'd by someone or something.\n";
        exit 0;
}

# ######################
# Look for a consensus amongst qualified voters.

$plebicite = count_of_relevant_votes($PLEBIANS);

#if ($V{comment} =~ /TEST:(\d)/) {
#        $plebicite=$1;
#}

# ######################
# If there's a quorum, approve and submit.

if ( $plebicite >= $QUORUM ) {
        $and_submitting = ($AUTO_SUBMIT_ON_QUORACY ? " and submitting" : "");
        $review = " --code-review=+2 --message=\"$GATEKEEPER approving$and_submitting due to $plebicite total eligible votes\" $AUTO_SUBMIT_ON_QUORACY";
}
else {
        $review = " --code-review=0 --message=\"$GATEKEEPER ignoring $plebicite total eligible votes\"";
        # print LOG "$V{commit}: $review\n";

        exit 0;
}

$response = response($review);

print LOG "RUNNING: $response\n";
$output = qx( $response 2>&1   );
if ($output =~ /\S/) {
        print LOG "$V{commit}: output from commenting: $output";
        $response = response(" --message=\"During \Q$review\E: \Q$output\E\"");
        print LOG "WARNING: $response\n";
        $output = qx( $response 2>&1   );
        print LOG "ERROR: $output\n";
}

exit 0;
0 голосов
/ 11 января 2017

Вы можете сделать это из графического интерфейса на вкладке доступа.Перейдите в раздел / refs /глав / -> добавить группу «Смена владельца» в разделе «Проверка кода» -> выберите -1 .. + 1

Это позволит владельцу изменения получить привилегию для предоставления -1до + 1

0 голосов
/ 16 июня 2016

Я только что написал этот пролог-фильтр для нашей установки Gerrit.Я сделал это как submit_filter в родительском проекте, потому что хотел, чтобы он применялся ко всем проектам в нашей системе.

%filter to require all projects to have a code-reviewer other than the owner
submit_filter(In, Out) :-
    %unpack the submit rule into a list of code reviews
    In =.. [submit | Ls],
    %add the non-owner code review requiremet
    reject_self_review(Ls, R),
    %pack the list back up and return it (kinda)
    Out =.. [submit | R].

reject_self_review(S1, S2) :-
    %set O to be the change owner
    gerrit:change_owner(O),
    %find a +2 code review, if it exists, and set R to be the reviewer
    gerrit:commit_label(label('Code-Review', 2), R), 
    %if there is a +2 review from someone other than the owner, then the filter has no work to do, assign S2 to S1
    R \= O, !,
    %the cut (!) predicate prevents further rules from being consulted
    S2 = S1.
reject_self_review(S1, S2) :-
    %set O to be the change owner
    gerrit:change_owner(O),
    find a +2 code review, if it exists, and set R to be the reviewer
    gerrit:commit_label(label('Code-Review', 2), R), 
    R = O, !,
    %if there isn't a +2 from someone else (above rule), and there is a +2 from the owner, reject with a self-reviewed label
    S2 = [label('Self-Reviewed', reject(O))|S1].
%if the above two rules didn't make it to the ! predicate, there aren't any +2s so let the default rules through unfiltered
reject_self_review(S1, S1).

Преимущества (IMO) этого правила по сравнению с правилом № 8 из поваренной книги:

  • Метка Self-Reviewed отображается только в том случае, если изменение блокируется, вместо добавления метки Non-Author-Code-Review к при каждом изменении
  • Используя reject(O), правило заставляет метку Self-Reviewed буквально быть красным флагом
  • . Как submit_filter вместо submit_rule, это правило устанавливается в родительском проекте и применяетсядля всех подпроектов

Обратите внимание: Это правило создано для предотвращения самопроверки изменения Owner, в то время как пример из поваренной книги сравнивается с Author.В зависимости от вашего рабочего процесса вы можете заменить предикаты 2 gerrit:change_owner(O) на gerrit:commit_author(O) или gerrit:commit_committer(O)

0 голосов
/ 19 января 2013

Gerrit позволяет вам установить пролог "правила отправки", которые определяют, когда изменение может быть отправлено.

Документация включает несколько примеров, в том числе один, который запрещает автору утверждать свои изменения.

...