You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

226 lines
7.7 KiB

package ksb::ModuleSet::KDEProjects 0.30;
# Class: ModuleSet::KDEProjects
#
# This represents a collective grouping of modules that share common options,
# based on the KDE project repositories. Metadata for that repository is
# itself housed in a dedicated KDE.org git repository "sysadmin/repo-metadata",
# which this class uses to imbue ksb::Modules generated by this ModuleSet.
#
# The only changes here are to allow for expanding out module specifications
# (except for ignored modules), by using KDEXMLReader.
#
# See also: ModuleSet
use strict;
use warnings;
use 5.014;
use parent qw(ksb::ModuleSet);
no if $] >= 5.018, 'warnings', 'experimental::smartmatch';
use ksb::Module;
use ksb::Debug;
use ksb::KDEXMLReader 0.20;
use ksb::BuildContext 0.20;
use ksb::Util;
sub new
{
my $self = ksb::ModuleSet::new(@_);
$self->{projectsDataReader} = undef; # Will be filled in when we get fh
return $self;
}
# Simple utility subroutine. See List::Util's perldoc
sub none_true
{
($_ && return 0) for @_;
return 1;
}
sub _createMetadataModule
{
my ($ctx, $moduleName) = @_;
my $metadataModule = ksb::Module->new($ctx, $moduleName =~ s,/,-,r);
# Hardcode the results instead of expanding out the project info
$metadataModule->setOption('repository', "kde:$moduleName");
$metadataModule->setOption('#xml-full-path', $moduleName);
$metadataModule->setOption('#branch:stable', 'master');
$metadataModule->setScmType('metadata');
$metadataModule->setOption('disable-snapshots', 1);
$metadataModule->setOption('branch', 'master');
my $moduleSet = ksb::ModuleSet::KDEProjects->new($ctx, '<kde-projects dependencies>');
$metadataModule->setModuleSet($moduleSet);
# Ensure we only ever try to update source, not build.
$metadataModule->phases()->phases('update');
return $metadataModule;
}
# Function: getDependenciesModule
#
# Static. Returns a <Module> that can be used to download the
# 'kde-build-metadata' module, which itself contains module dependencies
# in the KDE build system. The module is meant to be held by the <BuildContext>
#
# Parameters:
# ctx - the <ksb::BuildContext> for this script execution.
sub getDependenciesModule
{
my $ctx = assert_isa(shift, 'ksb::BuildContext');
return _createMetadataModule($ctx, 'kde-build-metadata');
}
# Function: getProjectMetadataModule
#
# Static. Returns a <Module> that can be used to download the
# 'repo-metadata' module, which itself contains information on each
# repository in the KDE build system (though currently not
# dependencies). The module is meant to be held by the <BuildContext>
#
# Parameters:
# ctx - the <ksb::BuildContext> for this script execution.
sub getProjectMetadataModule
{
my $ctx = assert_isa(shift, 'ksb::BuildContext');
return _createMetadataModule($ctx, 'sysadmin/repo-metadata');
}
# Function: _expandModuleCandidates
#
# A class method which goes through the modules in our search list (assumed to
# be found in kde-projects), expands them into their equivalent git modules,
# and returns the fully expanded list. Non kde-projects modules cause an error,
# as do modules that do not exist at all within the database.
#
# *Note*: Before calling this function, the kde-projects database itself must
# have been downloaded first. See getProjectMetadataModule, which ties to the
# BuildContext.
#
# Modules that are part of a module-set requiring a specific branch, that don't
# have that branch, are still listed in the return result since there's no way
# to tell that the branch won't be there. These should be removed later.
#
# Parameters:
# ctx - The <BuildContext> in use.
# moduleSearchItem - The search description to expand in ksb::Modules. See
# _projectPathMatchesWildcardSearch for a description of the syntax.
#
# Returns:
# @modules - List of expanded git <Modules>.
#
# Throws:
# Runtime - if the kde-projects database was required but couldn't be
# downloaded or read.
# Runtime - if the git-desired-protocol is unsupported.
# Runtime - if an "assumed" kde-projects module was not actually one.
sub _expandModuleCandidates
{
my $self = assert_isa(shift, 'ksb::ModuleSet::KDEProjects');
my $ctx = assert_isa(shift, 'ksb::BuildContext');
my $moduleSearchItem = shift;
my @allModuleResults = $ctx->
getProjectDataReader()->
getModulesForProject($moduleSearchItem);
croak_runtime ("Unknown KDE project: $moduleSearchItem") unless @allModuleResults;
# It's possible to match modules which are marked as inactive on
# projects.kde.org, elide those.
my @activeResults = grep { $_->{'active'} } (@allModuleResults);
if (!@activeResults) {
warning (" y[b[*] Module y[$moduleSearchItem] is apparently a KDE collection, but contains no\n" .
"active modules to build!");
my $count = scalar @allModuleResults;
if ($count > 0) {
warning ("\tAlthough no active modules are available, there were\n" .
"\t$count inactive modules. Perhaps the git modules are not ready?");
}
}
# Setup module options.
my @moduleList;
my @ignoreList = $self->modulesToIgnore();
foreach (@activeResults) {
my $result = $_;
my $repo = $result->{'repo'};
# Prefer kde: alias to normal clone URL.
$repo =~ s(^git://anongit\.kde\.org/)(kde:);
my $newModule = ksb::Module->new($ctx, $result->{'name'});
$self->_initializeNewModule($newModule);
$newModule->setOption('repository', $repo);
$newModule->setOption('#xml-full-path', $result->{'fullName'});
$newModule->setOption('#branch:stable', undef);
$newModule->setOption('#found-by', $result->{found_by});
$newModule->setScmType('proj');
if (none_true(
map {
ksb::KDEXMLReader::_projectPathMatchesWildcardSearch(
$result->{'fullName'},
$_
)
} (@ignoreList)))
{
push @moduleList, $newModule;
}
else {
debug ("--- Ignoring matched active module $newModule in module set " .
$self->name());
}
};
return @moduleList;
}
# This function should be called after options are read and build metadata is
# available in order to convert this module set to a list of ksb::Module.
# Any modules ignored by this module set are excluded from the returned list.
# The modules returned have not been added to the build context.
sub convertToModules
{
my ($self, $ctx) = @_;
my @moduleList; # module names converted to ksb::Module objects.
my %foundModules;
# Setup default options for each module
# Extraction of relevant kde-project modules will be handled immediately
# after this phase of execution.
for my $moduleItem ($self->modulesToFind()) {
# We might have already grabbed the right module recursively.
next if exists $foundModules{$moduleItem};
# eval in case the YAML processor throws an exception.
undef $@;
my @candidateModules = eval {
$self->_expandModuleCandidates($ctx, $moduleItem);
};
if ($@) {
die $@ if had_an_exception(); # Forward exception objects up
croak_runtime("The KDE Project database could not be understood: $@");
}
my @moduleNames = map { $_->name() } @candidateModules;
@foundModules{@moduleNames} = (1) x @moduleNames;
push @moduleList, @candidateModules;
}
if (not scalar @moduleList) {
warning ("No modules were defined for the module-set " . $self->name());
warning ("You should use the g[b[use-modules] option to make the module-set useful.");
}
return @moduleList;
}
1;