#!/usr/bin/perl
use strict;
use warnings;

my $rule = $ARGV[7];
die "\n\nFATAL: GL_REFEX_EXPR_ doesn't exist\n(your admin probably forgot the rc file change needed for this to work)\n\n"
  unless exists $ENV{"GL_REFEX_EXPR_" . $rule};
my $res = $ENV{"GL_REFEX_EXPR_" . $rule} || 0;
print "$ARGV[6] ($res)\n" if $res;

exit 0;

__END__

Documentation for the refex-expression evaluation feature

First, make sure you have both the VREF and the trigger scripts
(src/VREF/refex-expr and src/lib/Gitolite/Triggers/RefexExpr.pm)

Next, add this to the ACCESS_2 list in the rc file:

    'RefexExpr::access_2',

For the rest, we'll use this example:

  * user u1 can push foo to some other branch, and anything else to the master
    branch, but not foo to the master branch

  * user u2 is allowed to push either 'doc/' or 'src/' but not both

Here's the conf file extract:

    repo    testing
        RW+     master              =   u1          # line 1
        RW+                         =   @all        # line 2

        RW+     VREF/NAME/foo       =   u1
        RW+     VREF/NAME/doc/      =   u2
        RW+     VREF/NAME/src/      =   u2

        # set up 2 refex expressions, named e1, e2
        option  refex-expr.e1       =   master and VREF/NAME/foo
        option  refex-expr.e2       =   VREF/NAME/doc/ and VREF/NAME/src/

        # now deny users if the corresponding expression is true
        -       VREF/refex-expr/e1  =   u1
        -       VREF/refex-expr/e2  =   u2

Here are some IMPORTANT notes:

  * You MUST place VREF/refex-expr rules at the end.  (Only 'partial-copy', if
    you use it, must come later).

  * You MUST explicitly permit the refexes used in your refex expressions.  If
    you have more generic rules, the specific ones must come first.

    For example, without line 1, the refex recorded for user u1 will come from
    line 2, (so it will be 'refs/.*'), and 'master' in the refex expressions
    will never have a true value.

  * (corollary) make sure you use the exact same refex in the expression as
    you did on the original rule line.  E.g., a missing slash at the end will
    mess things up.

  * You can use any logical expression using refexes as operands and using
    these operators:

        and not xor or

    Parens are not allowed.

    If a refex has passed, it will have a 'true' value, else it will be false.

    The result of the evaluation, after these substitutions, will be the
    result of the refex-expr VREF.
