# ------------------------------------------------------------------------------
# (C) British Crown Copyright 2006-17 Met Office.
#
# This file is part of FCM, tools for managing and building source code.
#
# FCM 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 3 of the License, or
# (at your option) any later version.
#
# FCM 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 FCM. If not, see .
# ------------------------------------------------------------------------------
use strict;
use warnings;
# ------------------------------------------------------------------------------
package FCM::System;
use base qw{FCM::Class::CODE};
use FCM::Util;
use Scalar::Util qw{reftype};
# Alias
our $S;
# The (keys) named actions of this class and (values) their implementations.
our %ACTION_OF = (
browse => _func('misc', sub {$S->browse(@_)}),
build => _func('old' , sub {$S->build(@_)}),
config_compare => _func('old' , sub {$S->config_compare(@_)}),
config_parse => _func('misc', sub {$S->config_parse(@_)}),
cm_branch_create => _func('cm' , sub {$S->cm_branch_create(@_)}),
cm_branch_delete => _func('cm' , sub {$S->cm_branch_delete(@_)}),
cm_branch_diff => _func('cm' , sub {$S->cm_branch_diff(@_)}),
cm_branch_info => _func('cm' , sub {$S->cm_branch_info(@_)}),
cm_branch_list => _func('cm' , sub {$S->cm_branch_list(@_)}),
cm_commit => _func('cm' , sub {$S->cm_commit(@_)}),
cm_checkout => _func('cm' , sub {$S->cm_checkout(@_)}),
cm_check_missing => _func('cm' , sub {$S->cm_check_missing(@_)}),
cm_check_unknown => _func('cm' , sub {$S->cm_check_unknown(@_)}),
cm_diff => _func('cm' , sub {$S->cm_diff(@_)}),
cm_loc_layout => _func('cm' , sub {$S->cm_loc_layout(@_)}),
cm_merge => _func('cm' , sub {$S->cm_merge(@_)}),
cm_mkpatch => _func('cm' , sub {$S->cm_mkpatch(@_)}),
cm_project_create => _func('cm' , sub {$S->cm_project_create(@_)}),
cm_resolve_conflicts => _func('cm' , sub {$S->cm_resolve_conflicts(@_)}),
cm_switch => _func('cm' , sub {$S->cm_switch(@_)}),
cm_update => _func('cm' , sub {$S->cm_update(@_)}),
export_items => _func('misc', sub {$S->export_items(@_)}),
extract => _func('old' , sub {$S->extract(@_)}),
keyword_find => _func('misc', sub {$S->keyword_find(@_)}),
make => _func('make', sub {$S->main(@_)}),
svn => _func('cm' , sub {$S->svn(@_)}),
util => sub {$_[0]->{util}},
);
# The (keys) named system and their implementation classes.
our %SYSTEM_CLASS_OF = (
cm => 'FCM::System::CM',
old => 'FCM::System::Old',
make => 'FCM::System::Make',
misc => 'FCM::System::Misc',
);
# Creates the class.
__PACKAGE__->class(
{ gui => '$',
system_class_of => {isa => '%', default => {%SYSTEM_CLASS_OF}},
system_of => '%',
util => '&',
},
{init => \&_init, action_of => {%ACTION_OF}},
);
# Initialises attributes.
sub _init {
my $attrib_ref = shift();
$attrib_ref->{util} = FCM::Util->new();
}
# Generates main functions.
sub _func {
my ($name, $code_ref) = @_;
sub {
my ($attrib_ref, @args) = @_;
if (!defined($attrib_ref->{system_of}{$name})) {
my $class_name = $attrib_ref->{system_class_of}{$name};
$attrib_ref->{util}->class_load($class_name);
$attrib_ref->{system_of}{$name} = $class_name->new({
gui => $attrib_ref->{gui},
util => $attrib_ref->{util},
});
}
local($S) = $attrib_ref->{system_of}{$name};
$code_ref->(@args);
};
}
# ------------------------------------------------------------------------------
1;
__END__
=head1 NAME
FCM::System
=head1 SYNOPSIS
use FCM::System;
$fcm = FCM::System->new();
# ...
$fcm->make(\%option, @args);
=head1 DESCRIPTION
Provides a top level interface to access the functionalities of the FCM system.
=head1 METHODS
=over 4
=item $class->new(\%attrib)
Returns a new instance. It also initialises the utility and sub-system classes.
The %attrib hash can be used configure the behaviour of the instance:
=over 4
=item event
A CODE to handle event.
=item gui
The GUI geometry of "fcm gui-internal".
=item system_class_of
A HASH to map (keys) sub-system names to (values) their implementation classes.
See %FCM::System::SYSTEM_CLASS_OF.
=item system_of
A HASH to map (keys) sub-system names to (values) their implementation instances.
=item util
An instance of L.
=back
=item $fcm->browse(\%option,@args)
Invokes a browser to browse the sources in @args.
=item $fcm->build(\%option,@args)
(Obsolete) Invokes the FCM 1 build system.
=item $fcm->config_compare(\%option,@args)
(Obsolete) Compares 2 FCM 1 extract configuration files.
=item $fcm->config_parse(\%option,@args)
Parses a configuration file.
=item $fcm->cm_branch_create(\%option,@args)
Creates of a branch in a project in a Subversion repository with a standard FCM
layout.
=item $fcm->cm_branch_delete(\%option,@args)
Deletes of a branch in a project in a Subversion repository with a standard FCM
layout.
=item $fcm->cm_branch_diff(\%option,@args)
Displays the changes between a branch and its parent in a project in a
Subversion repository with a standard FCM layout.
=item $fcm->cm_branch_info(\%option,@args)
Displays information of a branch in a project in a Subversion repository with a
standard FCM layout.
=item $fcm->cm_branch_list(\%option,@args)
Lists branches in a project in a Subversion repository with a standard FCM
layout.
=item $fcm->cm_commit(\%option,@args)
Wraps C.
=item $fcm->cm_checkout(\%option,@args)
Wraps C.
=item $fcm->cm_check_missing(\%option,@args)
Checks for missing status in a Subversion working copy.
=item $fcm->cm_check_unknown(\%option,@args)
Checks for unknown status in a Subversion working copy.
=item $fcm->cm_diff(\%option,@args)
Wraps C.
=item $fcm->cm_loc_layout(\%option,@args)
Parse and print layout information of each target in @args.
=item $fcm->cm_merge(\%option,@args)
Wraps C.
=item $fcm->cm_mkpatch(\%option,@args)
Creates FCM patches.
=item $fcm->cm_project_create(\%option,@args)
Create a new project in a Subversion repository.
=item $fcm->cm_resolve_conflicts(\%option,@args)
Invokes a graphic merge tool to resolve conflicts.
=item $fcm->cm_switch(\%option,@args)
Wraps C.
=item $fcm->cm_update(\%option,@args)
Wraps C.
=item $fcm->export_items(\%option,@args)
Exports directories as versioned items in a branch of a project in a Subversion
repository with the standard FCM layout.
=item $fcm->extract(\%option,@args)
(Obsolete) Invokes the FCM 1 extract system.
=item $fcm->keyword_find(\%option,@args)
If @args is empty, search for all known FCM location keyword entries. Otherwise,
search for FCM location keyword entries matching the locations specified in
@args.
=item $fcm->make(\%option,@args)
Invokes the FCM make system.
=item $fcm->svn(\%option,@args)
Invokes C with @args. %option is ignored.
=item $fcm->util()
Returns the L object.
=back
=head1 DIAGNOSTICS
=head2 FCM::System::Exception
This exception is a sub-class of L and is thrown
by methods of this class on error.
=head1 COPYRIGHT
(C) Crown copyright Met Office. All rights reserved.
=cut