Исключение автора из списка рецензентов в gerrit

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

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

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


person jyoung    schedule 06.06.2011    source источник
comment
Вы уверены, что вам нужно заставить это? Программисты — интеллигентные ребята, просто возьми себе за правило. В некоторых крайних случаях может быть полезно просмотреть свой собственный код (например, код уже был проверен, но вы исправили опечатку в сообщении фиксации, в этом случае еще одна проверка будет потерей времени).   -  person Tomasz Wysocki    schedule 06.12.2011
comment
@TomaszWysocki все, что я могу сказать, это то, что программисты далеко не умны, когда дело доходит до описанного процесса. Я уже некоторое время ищу эту функцию в Gerrit из-за глупых разработчиков. Конкретный пример, который вы хотели бы просмотреть в своей работе, открывает всю систему для неправильного использования. Разве это так много — просить другого рецензента рассмотреть простое изменение! Просто добавлю, что я разработчик.   -  person mark-cs    schedule 13.01.2012
comment
См. этот ответ: использовать оператор блока   -  person very    schedule 19.12.2017


Ответы (5)


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

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

person David Pursehouse    schedule 19.01.2013
comment
Я не устанавливал gerrit с помощью git. Я более или менее следовал этому руководству [digitalocean.com/community/tutorials/ Где мне найти rules.pl в таком случае? Куда пойдет rules.pl в таком случае? - person Harshdeep; 12.05.2016
comment
Как указано в документации, файл rules.pl следует поместить в refs/meta/config ветвь проекта. - person David Pursehouse; 07.07.2016

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

person Uffe    schedule 01.05.2013

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

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

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

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

Я попытался выдвинуть настраиваемые биты на первый план. Назовите этот файл comment-hook и поместите его в $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;
person android.weasel    schedule 16.03.2012

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

Это сделает владельца смены привилегией для предоставления от -1 до +1

person Raviraj    schedule 11.01.2017

Я только что написал этот пролог-фильтр для нашей установки 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 - comment sign was missing
    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).

person hair raisin    schedule 16.06.2016