337 lines
11 KiB
Perl
337 lines
11 KiB
Perl
#
|
|
# This file is part of the LibreOffice project.
|
|
#
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
#
|
|
# This file incorporates work covered by the following license notice:
|
|
#
|
|
# 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 .
|
|
#
|
|
|
|
package par2script::check;
|
|
|
|
use par2script::globals;
|
|
|
|
################################
|
|
# Checks of the setup script
|
|
################################
|
|
|
|
########################################################
|
|
# Checking if all defined directories are needed
|
|
########################################################
|
|
|
|
sub check_needed_directories
|
|
{
|
|
my $allfiles = $par2script::globals::definitions{'File'};
|
|
my $alldirs = $par2script::globals::definitions{'Directory'};
|
|
|
|
# checking if all defined directories are needed
|
|
|
|
my $dir;
|
|
foreach $dir ( keys %{$alldirs} )
|
|
{
|
|
# I. directory has create flag
|
|
if (( exists($alldirs->{$dir}->{'Styles'}) ) && ( $alldirs->{$dir}->{'Styles'} =~ /\bCREATE\b/ )) { next; }
|
|
|
|
# II. there is at least one file in the directory
|
|
my $fileinside = 0;
|
|
my $file;
|
|
foreach $file ( keys %{$allfiles} )
|
|
{
|
|
if (( $allfiles->{$file}->{'Dir'} eq $dir ) || ( $allfiles->{$file}->{'NetDir'} eq $dir ))
|
|
{
|
|
$fileinside = 1;
|
|
last;
|
|
}
|
|
}
|
|
if ( $fileinside ) { next; }
|
|
|
|
# III. the directory is parent for another directory
|
|
my $isparent = 0;
|
|
my $onedir;
|
|
foreach $onedir ( keys %{$alldirs} )
|
|
{
|
|
if ( $alldirs->{$onedir}->{'ParentID'} eq $dir )
|
|
{
|
|
$isparent = 1;
|
|
last;
|
|
}
|
|
}
|
|
if ( $isparent ) { next; }
|
|
|
|
# no condition is true -> directory definition is superfluous
|
|
my $infoline = "\tINFO: Directory definition $dir is superfluous\n";
|
|
# print $infoline;
|
|
push(@par2script::globals::logfileinfo, $infoline);
|
|
}
|
|
}
|
|
|
|
##################################################
|
|
# Checking if the directories in the item
|
|
# definitions are defined.
|
|
##################################################
|
|
|
|
sub check_directories_in_item_definitions
|
|
{
|
|
my $item;
|
|
foreach $item ( @par2script::globals::items_with_directories )
|
|
{
|
|
my $allitems = $par2script::globals::definitions{$item};
|
|
|
|
my $onegid;
|
|
foreach $onegid ( keys %{$allitems} )
|
|
{
|
|
if ( ! exists($allitems->{$onegid}->{'Dir'}) ) { die "\nERROR: No directory defined for item: $onegid!\n\n"; }
|
|
my $dir = $allitems->{$onegid}->{'Dir'};
|
|
if (( $dir eq "PD_PROGDIR" ) || ( $dir =~ /PREDEFINED_/ )) { next; }
|
|
|
|
# checking if this directoryid is defined
|
|
if ( ! exists($par2script::globals::definitions{'Directory'}->{$dir}) )
|
|
{
|
|
die "\nERROR: Directory $dir in item $onegid not defined!\n\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
########################################################
|
|
# Checking for all Items, that know their modules,
|
|
# whether these modules exist.
|
|
########################################################
|
|
|
|
sub check_module_existence
|
|
{
|
|
my $item;
|
|
foreach $item ( @par2script::globals::items_with_moduleid )
|
|
{
|
|
my $allitems = $par2script::globals::definitions{$item};
|
|
|
|
my $onegid;
|
|
foreach $onegid ( keys %{$allitems} )
|
|
{
|
|
if ( ! exists($allitems->{$onegid}->{'ModuleID'}) ) { die "\nERROR: No ModuleID defined for item: $onegid!\n\n"; }
|
|
my $moduleid = $allitems->{$onegid}->{'ModuleID'};
|
|
|
|
# checking if this directoryid is defined
|
|
if ( ! exists($par2script::globals::definitions{'Module'}->{$moduleid}) )
|
|
{
|
|
die "\nERROR: ModuleID $moduleid in item $onegid not defined!\n\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
########################################################
|
|
# Every script has to contain exactly one root module.
|
|
# This module has no ParentID or an empty ParentID.
|
|
########################################################
|
|
|
|
sub check_rootmodule
|
|
{
|
|
my $rootgid = "";
|
|
my $foundroot = 0;
|
|
|
|
my $allmodules = $par2script::globals::definitions{'Module'};
|
|
|
|
my $modulegid = "";
|
|
foreach $modulegid (keys %{$allmodules} )
|
|
{
|
|
if (( ! exists($allmodules->{$modulegid}->{'ParentID'}) ) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" ))
|
|
{
|
|
if ( $foundroot )
|
|
{
|
|
die "\nERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).\n";
|
|
}
|
|
$rootgid = $modulegid;
|
|
$foundroot = 1;
|
|
}
|
|
}
|
|
|
|
if ( ! $foundroot )
|
|
{
|
|
die "\nERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.\n";
|
|
}
|
|
|
|
print " $rootgid\n" if $par2script::globals::verbose;
|
|
|
|
}
|
|
|
|
########################################################
|
|
# File, Shortcut, Directory, Unixlink must not
|
|
# contain a ModuleID
|
|
########################################################
|
|
|
|
sub check_moduleid_at_items
|
|
{
|
|
my $item;
|
|
foreach $item ( @par2script::globals::items_without_moduleid )
|
|
{
|
|
my $allitems = $par2script::globals::definitions{$item};
|
|
|
|
my $onegid;
|
|
foreach $onegid ( keys %{$allitems} )
|
|
{
|
|
if ( exists($allitems->{$onegid}->{'ModuleID'}) )
|
|
{
|
|
die "\nERROR: ModuleID assigned to $onegid! No module assignment to $item!\n\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
########################################################
|
|
# Controlling existence of multi assignments
|
|
########################################################
|
|
|
|
sub check_multiple_assignments
|
|
{
|
|
my @multiassignments = ();
|
|
my $error;
|
|
|
|
my $topitem;
|
|
foreach $topitem ( keys %par2script::globals::assignedgids )
|
|
{
|
|
my $item;
|
|
foreach $item ( keys %{$par2script::globals::assignedgids{$topitem}} )
|
|
{
|
|
if ( $par2script::globals::assignedgids{$topitem}->{$item} > 1 )
|
|
{
|
|
$error = 1;
|
|
my $string = "\tGID: $item Assignments: $par2script::globals::assignedgids{$topitem}->{$item}";
|
|
push(@multiassignments, $string);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( $error ) { par2script::exiter::multiassignmenterror(\@multiassignments); }
|
|
}
|
|
|
|
########################################################
|
|
# Check, if a defined directory has a flag CREATE
|
|
########################################################
|
|
|
|
sub contains_create_flag
|
|
{
|
|
my ($gid) = @_;
|
|
|
|
my $createflag = 0;
|
|
|
|
if (( exists($par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'}) ) &&
|
|
( $par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'} =~ /\bCREATE\b/ ))
|
|
{
|
|
$createflag = 1;
|
|
}
|
|
|
|
return $createflag;
|
|
}
|
|
|
|
########################################################
|
|
# Controlling existence of definitions without
|
|
# any assignment
|
|
########################################################
|
|
|
|
sub check_missing_assignments
|
|
{
|
|
# If defined gids for "File", "Directory" or "Unixlink" are not assigned,
|
|
# this causes an error.
|
|
# Directories only have to be assigned, if they have the flag "CREATE".
|
|
|
|
my @missingassignments = ();
|
|
$error = 0;
|
|
|
|
my $item;
|
|
foreach $item ( @par2script::globals::items_assigned_at_modules )
|
|
{
|
|
my $assignedgids = $par2script::globals::assignedgids{$item};
|
|
my $definedgids = $par2script::globals::definitions{$item};
|
|
|
|
my $gid;
|
|
foreach $gid ( keys %{$definedgids} )
|
|
{
|
|
if ( $item eq "Directory" ) { if ( ! contains_create_flag($gid) ) { next; } }
|
|
|
|
if ( ! exists( $assignedgids->{$gid} ))
|
|
{
|
|
$error = 1;
|
|
push(@missingassignments, $gid);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( $error ) { par2script::exiter::missingassignmenterror(\@missingassignments); }
|
|
}
|
|
|
|
#############################################################
|
|
# Controlling if for all shortcuts with file assignment
|
|
# the file is defined. And for all shortcuts with
|
|
# shortcut assignment the shortcut has to be defined.
|
|
#############################################################
|
|
|
|
sub check_shortcut_assignments
|
|
{
|
|
my $allshortcuts = $par2script::globals::definitions{'Shortcut'};
|
|
my $allfiles = $par2script::globals::definitions{'File'};
|
|
|
|
my $shortcut;
|
|
foreach $shortcut ( keys %{$allshortcuts} )
|
|
{
|
|
if (( exists($allshortcuts->{$shortcut}->{'FileID'}) ) &&
|
|
( ! exists($allfiles->{$allshortcuts->{$shortcut}->{'FileID'}}) ))
|
|
{
|
|
die "\nERROR: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n";
|
|
}
|
|
|
|
if (( exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
|
|
( ! exists($allshortcuts->{$allshortcuts->{$shortcut}->{'ShortcutID'}}) ))
|
|
{
|
|
die "\nERROR: ShortcutID $allshortcuts->{$shortcut}->{'ShortcutID'} has no definition at shortcut $shortcut !\n";
|
|
}
|
|
|
|
if (( ! exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
|
|
( ! exists($allshortcuts->{$shortcut}->{'FileID'}) ))
|
|
{
|
|
die "\nERROR: Shortcut requires assignment to \"ShortcutID\" or \"FileID\". Missing at shortcut $shortcut !\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
#############################################################
|
|
# Controlling if for Modules and Directories, the parents
|
|
# are defined. If not, this can lead to a problem during
|
|
# script creation, because only recursively added
|
|
# Modules or Directories are added to the script.
|
|
#############################################################
|
|
|
|
sub check_missing_parents
|
|
{
|
|
my @parentitems = ("Module", "Directory");
|
|
my %rootparents = ("PREDEFINED_PROGDIR" => "1");
|
|
|
|
my $oneitem;
|
|
foreach $oneitem ( @parentitems )
|
|
{
|
|
my $alldefinitions = $par2script::globals::definitions{$oneitem};
|
|
|
|
my $onegid;
|
|
foreach $onegid ( keys %{$alldefinitions} )
|
|
{
|
|
# If there is a ParentID used, it must be defined
|
|
if (( exists($alldefinitions->{$onegid}->{'ParentID'}) ) &&
|
|
( ! exists($alldefinitions->{$alldefinitions->{$onegid}->{'ParentID'}}) ) &&
|
|
( ! exists($rootparents{$alldefinitions->{$onegid}->{'ParentID'}}) ))
|
|
{
|
|
die "\nERROR: Parent \"$alldefinitions->{$onegid}->{'ParentID'}\" at $oneitem \"$onegid\" is not defined!\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
1;
|