| #************************************************************** |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| #************************************************************** |
| |
| |
| |
| #************************************************************************* |
| # |
| # SourceConfigHelper - Perl extension for parsing general info databases |
| # |
| # usage: see below |
| # |
| #************************************************************************* |
| |
| package SourceConfigHelper; |
| |
| use strict; |
| |
| use RepositoryHelper; |
| use SourceConfig; |
| use Cwd qw (cwd); |
| use Carp; |
| |
| my $debug = 0; |
| my @source_config_list; # array of sourceconfig objects |
| |
| #----------------------------------------------------------------------- |
| # Constants |
| #----------------------------------------------------------------------- |
| |
| use constant SOURCE_CONFIG_NONE => 0; |
| use constant SOURCE_CONFIG_CURRENT_FIRST => 1; |
| use constant SOURCE_CONFIG_ENVIRONMENT_FIRST => 2; |
| use constant SOURCE_CONFIG_CURRENT_ONLY => 3; |
| use constant SOURCE_CONFIG_ENVIRONMENT_ONLY => 4; |
| |
| use constant SOURCE_CONFIG_DEFAULT => SOURCE_CONFIG_CURRENT_FIRST; |
| |
| ##### profiling ##### |
| |
| ##### ctor ##### |
| |
| sub new { |
| my $proto = shift; |
| my $class = ref($proto) || $proto; |
| my $init_action = shift; |
| my $self = {}; |
| my $SourceConfigCurrent; |
| my $SourceConfigEnvironment; |
| |
| $init_action = SOURCE_CONFIG_DEFAULT if (!defined ($init_action)); |
| if (!eval ($init_action) or ($init_action < SOURCE_CONFIG_NONE) or ($init_action > SOURCE_CONFIG_ENVIRONMENT_ONLY)) { |
| croak("wrong initial parameter: $init_action\n"); |
| } |
| |
| if ($init_action != SOURCE_CONFIG_NONE) { |
| my $repositoryHash_ref = {}; |
| if ($init_action != SOURCE_CONFIG_ENVIRONMENT_ONLY) { |
| my $initial_directory = cwd(); |
| my $result = is_repository($initial_directory, $repositoryHash_ref); |
| if ($result) { |
| $SourceConfigCurrent = SourceConfig->new($repositoryHash_ref->{REPOSITORY_ROOT}); |
| } |
| } |
| if ($init_action != SOURCE_CONFIG_CURRENT_ONLY) { |
| my $source_config = $ENV{SOURCE_ROOT_DIR} . '/' . SourceConfig::SOURCE_CONFIG_FILE_NAME; |
| if (-f $source_config) { |
| $SourceConfigEnvironment = SourceConfig->new($source_config); |
| } |
| } |
| |
| # fill array |
| |
| if (($init_action == SOURCE_CONFIG_CURRENT_FIRST) or ($init_action == SOURCE_CONFIG_CURRENT_ONLY)) { |
| if (defined ($SourceConfigCurrent)) { |
| push (@source_config_list, $SourceConfigCurrent); |
| } |
| if ($init_action == SOURCE_CONFIG_CURRENT_FIRST) { |
| if (defined ($SourceConfigEnvironment)) { |
| push (@source_config_list, $SourceConfigEnvironment); |
| } |
| } |
| } |
| elsif (($init_action == SOURCE_CONFIG_ENVIRONMENT_FIRST) or ($init_action == SOURCE_CONFIG_ENVIRONMENT_ONLY)) { |
| if (defined ($SourceConfigEnvironment)) { |
| push (@source_config_list, $SourceConfigEnvironment); |
| } |
| if ($init_action == SOURCE_CONFIG_ENVIRONMENT_FIRST) { |
| if (defined ($SourceConfigCurrent)) { |
| push (@source_config_list, $SourceConfigCurrent); |
| } |
| } |
| } |
| } |
| |
| $self->{SOURCE_CONFIG_LIST} = \@source_config_list; |
| |
| bless($self, $class); |
| return $self; |
| } |
| |
| ##### methods ##### |
| |
| ############################################################################################ |
| |
| sub add_SourceConfig { |
| my $self = shift; |
| my $source_config = shift; |
| push (@{$self->{SOURCE_CONFIG_LIST}}, $source_config); |
| } |
| |
| ############################################################################################ |
| |
| sub get_SourceConfigList { |
| my $self = shift; |
| return @{$self->{SOURCE_CONFIG_LIST}}; |
| } |
| |
| ############################################################################################ |
| |
| sub has_SourceConfig { |
| my $self = shift; |
| my $result = 0; |
| my $count = @{$self->{SOURCE_CONFIG_LIST}}; |
| $result = 1 if ($count > 0); |
| return $result; |
| } |
| |
| ############################################################################################ |
| |
| sub get_module_path { |
| my $self = shift; |
| my $module = shift; |
| my $function = \&SourceConfig::get_module_path; |
| my $result; |
| $result = $self->get_StringResult ($function, $module); |
| return $result; |
| } |
| |
| ############################################################################################ |
| |
| sub get_active_modules { |
| my $self = shift; |
| my $parameter; # empty |
| my $function = \&SourceConfig::get_active_modules; |
| my $array_ref; |
| $array_ref = $self->get_ArrayResult ($function, $parameter); |
| return @$array_ref; |
| } |
| |
| ############################################################################################ |
| |
| sub get_repositories { |
| my $self = shift; |
| my $parameter; # empty |
| my $function = \&SourceConfig::get_repositories; |
| my $array_ref; |
| $array_ref = $self->get_ArrayResult ($function, $parameter); |
| return @$array_ref; |
| } |
| |
| ############################################################################################ |
| |
| sub get_module_repository { |
| my $self = shift; |
| my $module = shift; |
| my $function = \&SourceConfig::get_module_repository; |
| my $result; |
| $result = $self->get_StringResult ($function, $module); |
| return $result; |
| } |
| |
| ############################################################################################ |
| |
| sub is_active { |
| my $self = shift; |
| my $module = shift; |
| my $function = \&SourceConfig::is_active; |
| my $result_ref; |
| my $is_active = 0; |
| $result_ref = $self->get_ResultOfList ($function, $module); |
| my $count = @$result_ref; |
| if ($count>0) { |
| foreach my $active (@$result_ref) { |
| if ($active) { |
| $is_active = $active; |
| } |
| } |
| } |
| return $is_active; |
| } |
| |
| ##### private methods ##### |
| |
| ############################################################################################ |
| # |
| # is_repository () : check if the directory is a valid repository |
| # |
| # input: - directory |
| # - hash reference, where the output will be stored |
| # |
| # output: 0 = FALSE, the directory is no valid repository |
| # 1 = TRUE, the repository root can be found in $repositoryHash_ref->{REPOSITORY_ROOT} |
| # |
| ############################################################################################ |
| |
| sub is_repository { |
| my $directory = shift; |
| my $repositoryHash_ref = shift; |
| $repositoryHash_ref->{INITIAL_DIRECTORY} = $directory; |
| $repositoryHash_ref->{REPOSITORY_ROOT} = undef; |
| $repositoryHash_ref->{REPOSITORY_NAME} = undef; |
| my $result = RepositoryHelper::search_via_build_lst($repositoryHash_ref); |
| chdir $repositoryHash_ref->{INITIAL_DIRECTORY}; |
| if (!$result) { |
| $result = RepositoryHelper::search_for_hg($repositoryHash_ref); |
| } |
| return $result; |
| } |
| |
| ############################################################################################ |
| # |
| # get_ResultOfList(): give back an array reference from all SourceConfig Objects results |
| # |
| # input: - function : reference to the called function of each SourceConfig Object |
| # - parameter : parameter for the called function |
| # |
| # output: result : array of all results |
| # |
| ############################################################################################ |
| |
| sub get_ResultOfList { |
| my $self = shift; |
| my $function = shift; |
| my $parameter = shift; |
| my @result; |
| foreach my $source_config (@{$self->{SOURCE_CONFIG_LIST}}) { |
| push (@result, &$function ($source_config, $parameter)); |
| } |
| return \@result; |
| } |
| |
| ############################################################################################ |
| # |
| # get_StringResult(): give back the first defined result from all SourceConfig Objects |
| # |
| # input: - function : reference to the called function of each SourceConfig Object |
| # - parameter : parameter for the called function |
| # |
| # output: result : scalar variable (string), undef if no result |
| # |
| ############################################################################################ |
| |
| sub get_StringResult { |
| my $self = shift; |
| my $function = shift; |
| my $parameter = shift; |
| my $result_ref; |
| $result_ref = $self->get_ResultOfList ($function, $parameter); |
| my $count = @$result_ref; |
| if ($count>0) { |
| my $value; |
| my $i = 0; |
| while (($i < $count) and !defined ($value)) { # search the first defined result |
| $value = $$result_ref[$i]; |
| $i++; |
| } |
| return $value; |
| } |
| return undef; |
| } |
| |
| ############################################################################################ |
| # |
| # get_StringResult(): give back a sorted and uniqe array reference of the results |
| # from all SourceConfig Objects |
| # |
| # input: - function : reference to the called function of each SourceConfig Object |
| # - parameter : parameter for the called function |
| # |
| # output: result : sorted and uniqe array reference |
| # |
| ############################################################################################ |
| |
| sub get_ArrayResult { |
| my $self = shift; |
| my $function = shift; |
| my $parameter = shift; |
| my $result_ref; |
| my @modules; |
| $result_ref = $self->get_ResultOfList ($function, $parameter); |
| my $count = @$result_ref; |
| if ($count>0) { |
| my %moduleHash; |
| foreach my $module (@$result_ref) { |
| $moduleHash{$module}++; |
| } |
| @modules = sort keys %moduleHash; |
| } |
| return \@modules; |
| } |
| |
| ##### finish ##### |
| |
| 1; # needed by use or require |
| |
| __END__ |
| |
| =head1 NAME |
| |
| SourceConfigHelper - Perl extension for handling with SourceConfigObjetcs |
| |
| =head1 SYNOPSIS |
| |
| # example that will read source_config file and return the active repositories |
| |
| use SourceConfigHelper; |
| |
| # Create a new instance: |
| $a = SourceConfigHelper->new(); |
| |
| # Get repositories for the actual workspace: |
| $a->get_repositories(); |
| |
| =head1 DESCRIPTION |
| |
| SourceConfigHelper is a perl extension to handle more than one objects of SourceConfig |
| to set up a search order for modules. |
| |
| Methods: |
| |
| SourceConfigHelper::new() |
| |
| Creates a new instance of SourceConfigHelper. Can be initialized by: default - empty or with a constant of search order. default: the source_config will be taken first from the current repository and second from the environment |
| Possible parameters are: |
| SourceConfigHelper::SOURCE_CONFIG_NONE - no SourceConfig Object will be created |
| SourceConfigHelper::SOURCE_CONFIG_CURRENT_FIRST - use the current repository first |
| SourceConfigHelper::SOURCE_CONFIG_ENVIRONMENT_FIRST - use the repository of the environment first |
| SourceConfigHelper::SOURCE_CONFIG_CURRENT_ONLY - use only the current repository |
| SourceConfigHelper::SOURCE_CONFIG_ENVIRONMENT_ONLY - use only the repository of the environment |
| |
| SourceConfigHelper::get_repositories() |
| |
| Returns sorted list of active repositories for the actual workspace |
| |
| SourceConfigHelper::get_active_modules() |
| |
| Returns a sorted list of active modules |
| |
| SourceConfigHelper::get_all_modules() |
| |
| Returns sorted list of all modules in active repositories. |
| |
| SourceConfigHelper::get_module_path($module) |
| |
| Returns absolute module path. If the module is not active or don't exists, "undef" will be returned. |
| |
| SourceConfigHelper::get_module_repository($module) |
| |
| Returns the module's repository. If the module is not active or don't exists, "undef" will be returned. |
| |
| SourceConfigHelper::is_active() |
| |
| Returns 1 (TRUE) if a module is active |
| Returns 0 (FALSE) if a module is not active |
| |
| SourceConfigHelper::add_SourceConfig($SourceConfigObject) |
| |
| Add the SourceConfigObject to the end of the list |
| |
| SourceConfigHelper::get_SourceConfigList() |
| |
| Return an array of SourceConfigObjects |
| |
| SourceConfigHelper::has_SourceConfig() |
| |
| Returns 1 (TRUE) if one or more SourceConfig Objects is in the list |
| Returns 0 (FALSE) if no SourceConfig Object is in the list (can happen if there is no valid repository) |
| |
| =head2 EXPORT |
| |
| SourceConfigHelper::new() |
| SourceConfigHelper::get_repositories() |
| SourceConfigHelper::get_active_modules() |
| SourceConfigHelper::get_all_modules() |
| SourceConfigHelper::get_module_path($module) |
| SourceConfigHelper::get_module_repository($module) |
| SourceConfigHelper::is_active($module) |
| SourceConfigHelper::add_SourceConfig($SourceConfigObject) |
| SourceConfigHelper::get_SourceConfigList() |
| SourceConfigHelper::has_SourceConfig() |
| |
| =head1 AUTHOR |
| |
| Kurt Zenker, kz@openoffice.org |
| |
| =head1 SEE ALSO |
| |
| perl(1). |
| |
| =cut |