Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Mike Kelly May 23, 2012
executable file 128 lines (117 sloc) 3.667 kb
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
#!/usr/bin/perl -w
#
# migrate gitosis.conf to gitolite.conf format
#
# Based on gl-conf-convert by: Sitaram Chamarty
# Rewritten by: Behan Webster <behanw@websterwood.com>
#

use strict;
use warnings;

if (not @ARGV and -t or @ARGV and $ARGV[0] eq '-h') {
    print "Usage:\n gl-conf-convert < gitosis.conf > gitolite.conf\n(please see the documentation for details)\n";
    exit 1;
}

my @comments = ();
my $groupname;
my %groups;
my $reponame;
my %repos;

while (<>)
{
    # not supported
    if (/^repositories *=/ or /^map /) {
        print STDERR "not supported: $_";
        s/^/NOT SUPPORTED: /;
        print;
        next;
    }

    # normalise whitespace to help later regexes
    chomp;
    s/\s+/ /g;
    s/ ?= ?/ = /;
    s/^ //;
    s/ $//;

    if (/^\s*$/ and @comments > 1) {
        @{$repos{$reponame}{comments}} = @comments if $reponame;
        @{$groups{$groupname}{comments}} = @comments if $groupname;
        @comments = ();
    } elsif (/^\s*#/) {
        push @comments, $_;
    } elsif (/^\[repo\s+(.*?)\]$/) {
        $groupname = '';
        $reponame = $1;
        $reponame =~ s/\.git$//;
    } elsif (/^\[gitosis\]$/) {
        $groupname = '';
        $reponame = '@all';
    } elsif (/^gitweb\s*=\s*yes/i) {
        push @{$repos{$reponame}{R}}, 'gitweb';
    } elsif (/^daemon\s*=\s*yes/i) {
        push @{$repos{$reponame}{R}}, 'daemon';
    } elsif (/^description\s*=\s*(.+?)$/) {
        $repos{$reponame}{desc} = $1;
    } elsif (/^owner\s*=\s*(.+?)$/) {
        $repos{$reponame}{owner} = $1;
    } elsif (/^\[group\s+(.*)\]$/) {
        $reponame = '';
        $groupname = $1;
    } elsif (/^members\s*=\s*(.*)/) {
        push @{$groups{$groupname}{users}}, map {s/\@([^.]+)$/_$1/g; $_} split(' ', $1);
    } elsif (/^write?able\s*=\s*(.*)/) {
        foreach my $repo (split(' ', $1)) {
            $repo =~ s/\.git$//;
            push @{$repos{$repo}{RW}}, "\@$groupname";
        }
    } elsif (/^readonly\s*=\s*(.*)/) {
        foreach my $repo (split(' ', $1)) {
            $repo =~ s/\.git$//;
            push @{$repos{$repo}{R}}, "\@$groupname";
        }
    }
}

#use Data::Dumper;
#print Dumper(\%repos);
#print Dumper(\%groups);

# Groups
print "#\n# Groups\n#\n\n";
foreach my $grp (sort keys %groups) {
    next unless @{$groups{$grp}{users}};
    printf join("\n", @{$groups{$grp}{comments}})."\n" if $groups{$grp}{comments};
    printf "\@%-19s = %s\n", $grp, join(' ', @{$groups{$grp}{users}});
}

# Gitweb
print "\n#\n# Gitweb\n#\n\n";
foreach my $repo (sort keys %repos) {
    if ($repos{$repo}{desc}) {
        @{$repos{$repo}{R}} = grep(!/^gitweb$/, @{$repos{$repo}{R}});
        print $repo;
        print " \"$repos{$repo}{owner}\"" if $repos{$repo}{owner};
        print " = \"$repos{$repo}{desc}\"\n";
    }
}

# Repos
print "\n#\n# Repos\n#\n";
foreach my $repo (sort keys %repos) {
    print "\n";
    printf join("\n", @{$repos{$repo}{comments}})."\n" if $repos{$repo}{comments};
    #if ($repos{$repo}{desc}) {
    # @{$repos{$repo}{R}} = grep(!/^gitweb$/, @{$repos{$repo}{R}});
    #}
    print "repo\t$repo\n";
    foreach my $access (qw(RW+ RW R)) {
        next unless $repos{$repo}{$access};
        my @keys;
        foreach my $key (@{$repos{$repo}{$access}}) {
            if ($key =~ /^\@(.*)/) {
                next unless defined $groups{$1} and @{$groups{$1}{users}};
            }
            push @keys, $key;
        }
        printf "\t$access\t= %s\n", join(' ', @keys) if @keys;
    }
    #if ($repos{$repo}{desc}) {
    # print $repo;
    # print " \"$repos{$repo}{owner}\"" if $repos{$repo}{owner};
    # print " = \"$repos{$repo}{desc}\"\n";
    #}
}
Something went wrong with that request. Please try again.