#---------------------------------------------------------------------- # # Copyright (C) 2012 - Marco Hess # # This file is part of the "Git Repositories" panel in the # SME Server server-manager panel to configure git repositories. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #---------------------------------------------------------------------- package esmith::GitDB; use strict; use warnings; use esmith::db; use esmith::AccountsDB; use vars qw( $AUTOLOAD @ISA ); use esmith::DB::db; @ISA = qw(esmith::DB::db); =head1 NAME esmith::GitDB - interface to the Git respositories database =head1 SYNOPSIS use esmith::GitDB; my $g = esmith::GitDB->open; my @repos = $g->repositories(); =head1 DESCRIPTION This module provides an abstracted interface to the Git repositiries database. The Git repositories are maintained in a separate database so the Git repositories have their own name space and won't clash with the accounts database entries such as ibays, pseudonyms and users. =cut our $VERSION = sprintf '%d.%03d', q$Revision: 1.0 $ =~ /: (\d+).(\d+)/; =head2 open() Loads an existing git database and returns an esmith::GitDB object representing it. =cut sub open { my($class, $file) = @_; $file = $file || $ENV{ESMITH_GIT_DB} || "git"; return $class->SUPER::open($file); } sub open_ro { my($class, $file) = @_; $file = $file || $ENV{ESMITH_GIT_DB} || "git"; return $class->SUPER::open_ro($file); } sub AUTOLOAD { my $self = shift; my ($called_sub_name) = ($AUTOLOAD =~ m/([^:]*)$/); my @types = qw( repositories ); if( grep /^$called_sub_name$/, @types ) { $called_sub_name =~ s/s$//g; # de-pluralize return $self->get_all_by_prop(type => qw( repository )); } } sub effective_users_list_from { my($class,$groups1, $users1,$groups2, $users2) = @_; ### Generate effective list of users from the groups and individual users combined ### my @effective_users_list; ### Collect users listed for the named groups if( $groups1 || $groups2 ) { my @groups; if( $groups1 ) { push @groups, split ( /,/, $groups1 ); } if( $groups2 ) { push @groups, split ( /,/, $groups2 ); } my $accounts_db = esmith::AccountsDB->open_ro() or die( "Failed to open Accounts database : $!. The database file may not be readable by this user.\n" ); foreach my $group (@groups) { if( $group eq 'admin' ) { push @effective_users_list, 'admin'; } elsif( $group eq 'shared' ) { push @effective_users_list, $_->key foreach( $accounts_db->users() ); } else { my $record = $accounts_db->get($group); if ($record) { my $members = $record->prop('Members') || ""; if (length($members) > 0) { push @effective_users_list, split (/,/, $members); } } undef $record; } } } ### Combine individual users into the list generated so far if( $users1 ) { push @effective_users_list, split ( /,/, $users1 ); } if( $users2 ) { push @effective_users_list, split ( /,/, $users2 ); } ### When there is more than one entry, sort it if( @effective_users_list > 1 ) { @effective_users_list = sort(@effective_users_list); } ### Ensure we only have unique entries my $effective_users_list; my $prev = ''; @effective_users_list = grep( $_ ne $prev && (($prev) = $_), @effective_users_list ); $effective_users_list = join( " ", @effective_users_list ) || ''; undef @effective_users_list; return $effective_users_list; }