aboutsummaryrefslogtreecommitdiffstats
path: root/mgagit
blob: 63aa5ce7d9fd5e7e829e63c380ce247f4be598b7 (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
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
#!/usr/bin/perl -w

use strict;
use MGA::Git;
use YAML;
#use Data::Dump qw/dd/;

my %actions = (
    glconf => {
        run  => \&glconf,
        descr => 'Print gitolite configuration',
        usage => <<END,
$0 glconf [repo]

Print the gitolite configuration. Optionaly you can add a repository
name as parameter to display the configuration for this repository only.
END
    },
    glrun  => {
        run  => \&glrun,
        descr => 'Update gitolite configuration',
        usage => <<END,
$0 glrun

Update gitolite configuration, and run gitolite if changed.
END
    },
    usage  => {
        run   => \&usage,
        descr => 'Show usage informations for an action',
        usage => <<END,
$0 usage [action]

Show action usage
END
    },
    showconf  => {
        run   => \&showconf,
        descr => 'Show YAML mgagit configuration',
        usage => <<END,
$0 showconf [reponame] [optionname]

Show the mgagit configuration. If given one argument, it will display
the configuration for the specified repo. If given two argument, it
will display the value of the specified option for the specified repo.
Without any argument, it displays all the configuration.
END
    },
);

sub usage {
    if ($_[1] && $actions{$_[1]}) {
        print STDERR $actions{$_[1]}->{usage};
    } else {
        print STDERR "$0 [action] [options]\n";
        print STDERR "$0 usage [action]\n\n";
        print STDERR "Available actions:\n";
        print STDERR map { " - $_ : $actions{$_}->{descr}\n" } keys %actions;
    }
}
sub usageexit {
    usage(@_);
    exit 1;
}

sub glconf {
    usageexit('usage', $_[0]) unless @_ <= 2;
    my %r;
    MGA::Git::load_gitrepos(\%r);
    MGA::Git::load_groups(\%r) if @_ == 1;
    MGA::Git::load_users(\%r);
    if (my $repo = $_[1]) {
        if (!$r{repos}{$repo}) {
            print STDERR "Cannot find repository $repo\n";
            exit 1;
        }
        print MGA::Git::gitolite_repo_config(\%r, $repo);
    } else {
        print MGA::Git::gitolite_config(\%r), "\n";
    }
}

sub glrun {
    usageexit('usage', $_[0]) unless @_ == 1;
    my %r;
    MGA::Git::load_gitrepos(\%r);
    MGA::Git::load_groups(\%r);
    MGA::Git::load_users(\%r);
    MGA::Git::dumpdb(\%r);
    MGA::Git::update_gitolite_keydir(\%r);
    MGA::Git::update_gitolite_config(\%r);
    MGA::Git::run_gitolite(\%r);
}

sub showconf {
    shift;
    my $res;
    my %r;
    MGA::Git::load_gitrepos(\%r);
    usageexit('usage', 'showconf') if @_ > 2;
    if (@_ == 1) {
        $res = YAML::Dump($r{repos}{$_[0]});
    } elsif (@_ == 2) {
        $res = MGA::Git::repo_config(\%r, @_);
        $res .= "\n" if defined $res;
    } else {
        my $c = $MGA::Git::config;
        $c->{r} = \%r;
        $res = YAML::Dump($c);
    }
    print defined $res ? $res : "undef\n";
    exit !defined $res;
}

if (@ARGV == 0 || !$actions{$ARGV[0]}) {
    usageexit();
}
$actions{$ARGV[0]}->{run}->(@ARGV);