# 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 ); eval "require Text::ParseWords"; if ($@) { ( $word, @arg ) = split ' ', $l; } else { ( $word, @arg ) = Text::ParseWords::shellwords($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