# vim: syn=perl:

# "sugar script" (syntactic sugar helper) for gitolite3

# simple line-wise macro processor
# ----------------------------------------------------------------------
# see documentation at the end of this script

my %macro;
sub sugar_script {
    my $lines = shift;
    my @out  = ();

    my $l = join("\n", @$lines);
    while ($l =~ s/^macro (\w+)\b(.*?)\nend//ms) {
        $macro{$1} = $2;
    }

    $l =~ s/^((\w+)\b.*)/$macro{$2} ? expand($1) : $1/gem;

    $lines = [split "\n", $l];
    return $lines;
}

sub expand {
    my $l = shift;
    my ($word, @arg) = split ' ', $l;
    my $v = $macro{$word};
    $v =~ s/%(\d+)/$arg[$1-1] or die "macro '$word' needs $1 arguments at '$l'\n"/gem;
    return $v;
}

__END__

Documentation is mostly by example.

Setup:

  * uncomment the line
        'macros',
    in the ENABLE list in ~/.gitolite.rc

Notes on macro definition:

  * the keywords 'macro' and 'end' should start on a new line
  * the first word after 'macro' is the name of the macro, and the rest, until
    the 'end', is the body

Notes on macro use:

  * the macro name should be the first word on a line
  * the rest of the line is used as arguments to the macro

Example:

    if your conf contains:

        macro foo repo aa-%1
            RW  =   u1 %2
            R   =   u2
        end

        foo 1 alice
        foo 2 bob

    this will effectively turn into

        repo aa-1
            RW  =   u1 alice
            R   =   u2

        repo aa-2
            RW  =   u1 bob
            R   =   u2
