diff --git a/conf-convert.pl b/conf-convert.pl new file mode 100755 index 0000000..4f8e913 --- /dev/null +++ b/conf-convert.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; + +# migrate gitosis.conf to gitosis-lite.conf format + +# not very smart, but there shouldn't be any errors for simple configurations. +# the biggest thing you'll find is probably some comments rearranged or +# something, due to the "flush" thing below + +# for stuff it can't handle, it'll ignore the trivial ones (like gitweb and +# daemon), and put in an obviously syntax error-ed line for "repositories" and +# "map" statements. + +my @repos; +my @RO_repos; +my @comments; +my @users; +my $groupname; + +# a gitosis.conf stanza ends when a new "[group name]" line shows up, so you +# can't write as you go; you have to accumulate and flush +sub flush { + die "repos but no users?" if (not @users and (@repos or @RO_repos)); + # just a groupname + if (@users and not (@repos or @RO_repos)) { + print "\@$groupname = ", join(" ", @users), "\n"; + } + # RW repos + if (@repos) + { + print "repo ", join(" ", @repos), "\n"; + print " RW = ", join(" ", @users), "\n"; + } + # RO repos + if (@RO_repos) + { + print "repo ", join(" ", @RO_repos), "\n"; + print " R = ", join(" ", @users), "\n"; + } + # comments; yes there'll be some reordering, sorry! + print @comments if @comments; + + # empty out for next round + @users = (); + @repos = (); + @RO_repos = (); + @comments = (); +} + +while (<>) +{ + # pure comment lines or blank lines + if (/^\s*#/ or /^\s*$/) { + push @comments, $_; + next; + } + + # not supported + if (/^repositories *=/ or /^map /) { + print STDERR "not supported: $_"; + s/^/NOT SUPPORTED: /; + print; + next; + } + + chomp; + + # normalise whitespace to help later regexes + s/\s+/ /g; + s/ ?= ?/ = /; + s/^ //; + s/ $//; + + # the chaff... + next if /^\[(gitosis|repo)\]$/ + or /^(gitweb|daemon|loglevel|description|owner) =/; + + # the wheat... + if (/^members = (.*)/) { + push @users, split(' ', $1); + next; + } + if (/^write?able = (.*)/) { + push @repos, split(' ', $1); + next; + } + if (/^readonly = (.*)/) { + push @RO_repos, split(' ', $1); + next; + } + + # new group starts + if (/^\[group (.*?) ?\]/) { + flush(); + $groupname = $1; + } +} + +flush();