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.
 
 
 
 

95 lines
2.7 KiB

package ksb::Module::BranchGroupResolver;
# This provides an object that can be used to lookup the appropriate git branch
# to use for a given KDE project module and given desired logical branch group, using
# supplied JSON data (from kde-build-metadata).
#
# See also https://community.kde.org/Infrastructure/Project_Metadata
use strict;
use warnings;
use 5.014;
our $VERSION = '0.10';
use List::Util qw(first);
sub new
{
my ($class, $jsonData) = @_;
my $self = { };
my @keys = qw/layers groups/;
# Copy just the objects we want over.
@{$self}{@keys} = @{$jsonData}{@keys};
# For layers and groups, remove anything beginning with a '_' as that is
# defined in the spec to be a comment of some sort.
@{$self->{layers}} = grep { /^[^_]/ } @{$self->{layers}};
# Deleting a hash slice. Sorry about the syntax.
delete @{$self->{groups}}{grep { /^_/ } keys %{$self->{groups}}};
# Extract wildcarded groups separately as they are handled separately
# later. Note that the specific catch-all group '*' is itself handled
# as a special case in findModuleBranch.
$self->{wildcardedGroups} = {
map { ($_, $self->{groups}->{$_}) }
grep { substr($_,-1) eq '*' }
keys %{$self->{groups}}
};
bless $self, $class;
return $self;
}
# Returns the branch for the given logical group and module specifier. This
# function should not be called if the module specifier does not actually
# exist.
sub _findLogicalGroup
{
my ($self, $module, $logicalGroup) = @_;
# Using defined-or and still returning undef is on purpose, silences
# warning about use of undefined value.
return $self->{groups}->{$module}->{$logicalGroup} // undef;
}
sub findModuleBranch
{
my ($self, $module, $logicalGroup) = @_;
if (exists $self->{groups}->{$module}) {
return $self->_findLogicalGroup($module, $logicalGroup);
}
my %catchAllGroupStats = map {
# Map module search spec to prefix string that is required for a match
$_ => substr($_, 0, -1)
} keys %{$self->{wildcardedGroups}};
# Sort longest required-prefix to the top... first match that is valid will
# then also be the right match.
my @orderedCandidates = sort {
$catchAllGroupStats{$b} cmp $catchAllGroupStats{$a}
} keys %catchAllGroupStats;
my $match = first {
substr($module, 0, length $catchAllGroupStats{$_}) eq
$catchAllGroupStats{$_}
} @orderedCandidates;
if ($match) {
return $self->_findLogicalGroup($match, $logicalGroup);
}
if (exists $self->{groups}->{'*'}) {
return $self->_findLogicalGroup('*', $logicalGroup);
}
return;
}
1;