minor fixup to a test script...
[gitolite.git] / src / syntactic-sugar / macros
bloba3493a4874bebe331a0c6034134efddbc59e5fed
1 # vim: syn=perl:
3 # "sugar script" (syntactic sugar helper) for gitolite3
5 # simple line-wise macro processor
6 # ----------------------------------------------------------------------
7 # see documentation at the end of this script
9 my %macro;
11 sub sugar_script {
12     my $lines = shift;
13     my @out   = ();
15     my $l = join( "\n", @$lines );
16     while ( $l =~ s/^macro (\w+)\b(.*?)\nend//ms ) {
17         $macro{$1} = $2;
18     }
20     $l =~ s/^((\w+)\b.*)/$macro{$2} ? expand($1) : $1/gem;
22     $lines = [ split "\n", $l ];
23     return $lines;
26 sub expand {
27     my $l = shift;
28     my ( $word, @arg );
30     eval "require Text::ParseWords";
31     if ($@) {
32         ( $word, @arg ) = split ' ', $l;
33     } else {
34         ( $word, @arg ) = Text::ParseWords::shellwords($l);
35     }
36     my $v = $macro{$word};
37     $v =~ s/%(\d+)/$arg[$1-1] or die "macro '$word' needs $1 arguments at '$l'\n"/gem;
38     return $v;
41 __END__
43 Documentation is mostly by example.
45 Setup:
47   * uncomment the line
48         'macros',
49     in the ENABLE list in ~/.gitolite.rc
51 Notes on macro definition:
53   * the keywords 'macro' and 'end' should start on a new line
54   * the first word after 'macro' is the name of the macro, and the rest, until
55     the 'end', is the body
57 Notes on macro use:
59   * the macro name should be the first word on a line
60   * the rest of the line is used as arguments to the macro
62 Example:
64     if your conf contains:
66         macro foo repo aa-%1
67             RW  =   u1 %2
68             R   =   u2
69         end
71         foo 1 alice
72         foo 2 bob
74     this will effectively turn into
76         repo aa-1
77             RW  =   u1 alice
78             R   =   u2
80         repo aa-2
81             RW  =   u1 bob
82             R   =   u2