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
|