summaryrefslogtreecommitdiffstats
path: root/src/syntactic-sugar/macros
blob: a3493a4874bebe331a0c6034134efddbc59e5fed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# 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