summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/CwsConfig.pm
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/bin/modules/CwsConfig.pm')
-rw-r--r--solenv/bin/modules/CwsConfig.pm541
1 files changed, 541 insertions, 0 deletions
diff --git a/solenv/bin/modules/CwsConfig.pm b/solenv/bin/modules/CwsConfig.pm
new file mode 100644
index 000000000000..1ba12fecac1d
--- /dev/null
+++ b/solenv/bin/modules/CwsConfig.pm
@@ -0,0 +1,541 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org 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 Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+
+#
+# CwsConfig.pm - package for read CWS config data
+#
+
+package CwsConfig;
+use strict;
+
+use Carp;
+use URI::Escape;
+
+##### ctor ####
+
+sub new
+{
+ my $invocant = shift;
+ my $class = ref($invocant) || $invocant;
+ my $self = {};
+ $self->{_CONFIG_FILE} = undef; # config file
+ $self->{_GLOBAL} = undef; # is it a global config file?
+ $self->{VCSID} = undef; # VCSID
+ $self->{CWS_DB_URL_LIST_REF} = undef; # list of CWS DB servers
+ $self->{NET_PROXY} = undef; # network proxy
+ $self->{CWS_SERVER_ROOT} = undef; # cvs server
+ $self->{CWS_MIRROR_ROOT} = undef; # mirror of cvs server
+ $self->{CWS_LOCAL_ROOT} = undef; # local cvs server
+ $self->{PUBLIC_SVN_SERVER} = undef; # public svn server
+ $self->{PRIVATE_SVN_SERVER} = undef; # private svn server
+ bless ($self, $class);
+ return $self;
+}
+
+sub vcsid
+{
+ my $self = shift;
+
+ if ( !defined($self->{VCSID}) ) {
+ # environment overrides config file
+ my $vcsid = $ENV{VCSID};
+ if ( !defined($vcsid) ) {
+ # check config file
+ my $config_file = $self->get_config_file();
+ $vcsid = $config_file->{CWS_CONFIG}->{'CVS_ID'};
+ if ( !defined($vcsid) ) {
+ # give up
+ croak("ERROR: no CVS_ID entry found in '\$HOME/.cwsrc'.\n" );
+ }
+ }
+ $self->{VCSID} = $vcsid;
+ }
+ return $self->{VCSID};
+}
+
+sub cws_db_url_list_ref
+{
+ my $self = shift;
+
+ if ( !defined($self->{CWS_DB_URL_LIST_REF}) ) {
+ my $config_file = $self->get_config_file();
+
+ my $i = 1;
+ my @cws_db_servers;
+
+ while ( 1 ) {
+ my $val = $config_file->{CWS_CONFIG}->{"CWS_DB_SERVER_$i"};
+ last if !defined($val);
+ push(@cws_db_servers, $val);
+ $i++;
+ }
+
+ if ( !@cws_db_servers) {
+ croak("ERROR: no CWS_DB_SERVER_* entry found in '\$HOME/.cwsrc'.\n" );
+ }
+
+ if ( $cws_db_servers[0] =~ /^https:\/\// ) {
+ my $id = $self->vcsid();
+ my $password = $config_file->{CWS_CONFIG}->{'CVS_PASSWORD'};
+
+ if ( !defined($password) ) {
+ croak("ERROR: no CVS_PASSWORD entry found in '\$HOME/.cwsrc'.\n" );
+ }
+
+ # *i49473* - do not accept scrambled passwords ending with a space
+ if ( $password =~ / $/) {
+ croak("ERROR: The (scrambled) CVS_PASSWORD ends with a space. This is known to cause problems when connecting to the OpenOffice.org EIS database. Please change your OOo account's password" );
+ }
+
+ # We are going to stuff $id and $password in an URL, do proper escaping.
+ $id = uri_escape($id);
+ $password = uri_escape($password);
+
+ foreach ( @cws_db_servers ) {
+ s/^https:\/\//https:\/\/$id:$password@/;
+ }
+ }
+
+ $self->{CWS_DB_URL_LIST_REF} = \@cws_db_servers;
+ }
+ return $self->{CWS_DB_URL_LIST_REF};
+}
+
+sub net_proxy
+{
+ my $self = shift;
+
+ if ( !defined($self->{NET_PROXY}) ) {
+ my $config_file = $self->get_config_file();
+ my $net_proxy = $config_file->{CWS_CONFIG}->{'PROXY'};
+ if ( !defined($net_proxy) ) {
+ $net_proxy = "";
+ }
+ $self->{NET_PROXY} = $net_proxy;
+ }
+ return $self->{NET_PROXY} ? $self->{NET_PROXY} : undef;
+}
+
+sub cvs_binary
+{
+ my $self = shift;
+
+ if ( !defined($self->{CVS_BINARY}) ) {
+ my $config_file = $self->get_config_file();
+ my $cvs_binary = $config_file->{CWS_CONFIG}->{'CVS_BINARY'};
+ if ( !defined($cvs_binary) ) {
+ # defaults
+ $cvs_binary = ($^O eq 'MSWin32') ? 'cvs.exe' : 'cvs';
+ }
+ # special case, don't ask
+ if ( $self->{_GLOBAL} && $cvs_binary =~ /cvs.clt2/ && $^O eq 'MSWin32' ) {
+ $cvs_binary = 'cvsclt2.exe';
+ }
+ $self->{CVS_BINARY} = $cvs_binary;
+ }
+ return $self->{CVS_BINARY};
+}
+
+sub cvs_server_root
+{
+ my $self = shift;
+
+ if ( !defined($self->{CVS_SERVER_ROOT}) ) {
+ my $config_file = $self->get_config_file();
+ my $cvs_server_root = $config_file->{CWS_CONFIG}->{'CVS_SERVER_ROOT'};
+ if ( !defined($cvs_server_root) ) {
+ # give up, this is a mandatory entry
+ croak("ERROR: can't parse CVS_SERVER_ROOT entry in '\$HOME/.cwsrc'.\n");
+ }
+ if ( $self->{_GLOBAL} ) {
+ # a global config file will almost always have the wrong vcsid in
+ # the cvsroot -> substitute vcsid
+ my $id = $self->vcsid();
+ $cvs_server_root =~ s/:pserver:\w+@/:pserver:$id@/;
+ }
+ $self->{CVS_SERVER_ROOT} = $cvs_server_root;
+ }
+ return $self->{CVS_SERVER_ROOT};
+}
+
+sub cvs_mirror_root
+{
+ my $self = shift;
+
+ if ( !defined($self->{CVS_MIRROR_ROOT}) ) {
+ my $config_file = $self->get_config_file();
+ my $cvs_mirror_root = $config_file->{CWS_CONFIG}->{'CVS_MIRROR_ROOT'};
+ if ( !defined($cvs_mirror_root) ) {
+ $cvs_mirror_root = "";
+ }
+ $self->{CVS_MIRROR_ROOT} = $cvs_mirror_root;
+ }
+ return $self->{CVS_MIRROR_ROOT} ? $self->{CVS_MIRROR_ROOT} : undef;
+}
+
+sub cvs_local_root
+{
+ my $self = shift;
+
+ if ( !defined($self->{CVS_LOCAL_ROOT}) ) {
+ my $config_file = $self->get_config_file();
+ my $cvs_local_root = $config_file->{CWS_CONFIG}->{'CVS_LOCAL_ROOT'};
+ if ( !defined($cvs_local_root) ) {
+ $cvs_local_root = "";
+ }
+ $self->{CVS_LOCAL_ROOT} = $cvs_local_root;
+ }
+ return $self->{CVS_LOCAL_ROOT} ? $self->{CVS_LOCAL_ROOT} : undef;
+}
+
+sub get_cvs_server
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_server_root(), 'SERVER');
+ return $server;
+}
+
+sub get_cvs_mirror
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_mirror_root(), 'MIRROR');
+ return $server;
+}
+
+sub get_cvs_local
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_local_root(), 'LOCAL');
+ return $server;
+}
+
+sub get_cvs_server_method
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_server_root(), 'SERVER');
+ return $method;
+}
+
+sub get_cvs_mirror_method
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_mirror_root(), 'MIRROR');
+ return $method;
+}
+
+sub get_cvs_local_method
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_local_root(), 'LOCAL');
+ return $method;
+}
+
+sub get_cvs_server_repository
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_server_root(), 'SERVER');
+ return $repository;
+}
+
+sub get_cvs_mirror_repository
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_mirror_root(), 'MIRROR');
+ return $repository;
+}
+
+sub get_cvs_local_repository
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_local_root(), 'LOCAL');
+ return $repository;
+}
+
+sub get_cvs_server_id
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_server_root(), 'SERVER');
+ return $id;
+}
+
+sub get_cvs_mirror_id
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_mirror_root(), 'MIRROR');
+ return $id;
+}
+
+sub get_cvs_local_id
+{
+ my $self = shift;
+
+ my ($method, $id, $server, $repository) = CwsConfig::split_root($self->cvs_local_root(), 'LOCAL');
+ return $id;
+}
+
+#### SVN methods ####
+
+sub get_ooo_svn_server
+{
+ my $self = shift;
+
+ if ( !defined($self->{SVN_SERVER}) ) {
+ my $config_file = $self->get_config_file();
+ my $ooo_svn_server = $config_file->{CWS_CONFIG}->{'SVN_SERVER'};
+ if ( !defined($ooo_svn_server) ) {
+ $ooo_svn_server = "";
+ }
+ $self->{SVN_SERVER} = $ooo_svn_server;
+ }
+ return $self->{SVN_SERVER} ? $self->{SVN_SERVER} : undef;
+}
+
+sub get_so_svn_server
+{
+ my $self = shift;
+
+ if ( !defined($self->{SO_SVN_SERVER}) ) {
+ my $config_file = $self->get_config_file();
+ my $so_svn_server = $config_file->{CWS_CONFIG}->{'SO_SVN_SERVER'};
+ if ( !defined($so_svn_server) ) {
+ $so_svn_server = "";
+ }
+ $self->{SO_SVN_SERVER} = $so_svn_server;
+ }
+ return $self->{SO_SVN_SERVER} ? $self->{SO_SVN_SERVER} : undef;
+}
+
+#### HG methods ####
+
+sub _get_hg_source
+{
+ my $self = shift;
+ my $repository_source = shift;
+ if ( !defined($self->{$repository_source}) ) {
+ my $config_file = $self->get_config_file();
+ my $source = $config_file->{CWS_CONFIG}->{$repository_source};
+ if ( !defined($source) ) {
+ $source = "";
+ }
+ $self->{$repository_source} = $source;
+ }
+ return $self->{$repository_source} ? $self->{$repository_source} : undef;
+
+}
+
+sub get_hg_source
+{
+ my $self = shift;
+ my $repository = shift;
+ my $location = shift;
+
+ #Special prefix handling, see cwsrc
+ if ($repository eq "OOO")
+ {
+ if ($location eq "LOCAL")
+ {
+ return $self->_get_hg_source('HG_LOCAL_SOURCE');
+ }
+ elsif ($location eq "LAN")
+ {
+ return $self->_get_hg_source('HG_LAN_SOURCE');
+ }
+ elsif ($location eq "REMOTE")
+ {
+ return $self->_get_hg_source('HG_REMOTE_SOURCE');
+ }
+ }
+ else
+ {
+ if ($location eq "LOCAL")
+ {
+ return $self->_get_hg_source($repository.'_HG_LOCAL_SOURCE');
+ }
+ elsif ($location eq "LAN")
+ {
+ return $self->_get_hg_source($repository.'_HG_LAN_SOURCE');
+ }
+ elsif ($location eq "REMOTE")
+ {
+ return $self->_get_hg_source($repository.'_HG_REMOTE_SOURCE');
+ }
+ }
+}
+
+#### Prebuild binaries configuration ####
+
+sub get_prebuild_binaries_location
+{
+ my $self = shift;
+
+ if ( !defined($self->{PREBUILD_BINARIES}) ) {
+ my $config_file = $self->get_config_file();
+ my $pre_build_binaries = $config_file->{CWS_CONFIG}->{'PREBUILD_BINARIES'};
+ if ( !defined($pre_build_binaries) ) {
+ $pre_build_binaries = "";
+ }
+ $self->{PREBUILD_BINARIES} = $pre_build_binaries;
+ }
+ return $self->{PREBUILD_BINARIES} ? $self->{PREBUILD_BINARIES} : undef;
+}
+
+
+
+#### class methods #####
+sub get_config
+{
+ my $config = CwsConfig->new();
+ return $config;
+}
+
+sub split_root
+{
+ my $root = shift;
+ my $type = shift;
+
+ if ( !defined($root) ) {
+ return (undef, undef, undef, undef);
+ }
+
+ my ($dummy, $method, $id_at_host, $repository) = split(/:/, $root);
+ $repository =~ s/^\d*//;
+ my ($id, $server);
+ if ( $id_at_host ) {
+ ($id, $server) = split(/@/, $id_at_host);
+ }
+ if ( !defined($method) || !defined($id) || !defined($server) || !defined($repository) ) {
+ # give up
+ print "$method, $id, $server, $repository\n";
+ croak("ERROR: can't parse CVS_".$type."_ROOT entry in '\$HOME/.cwsrc'.\n");
+ }
+ return ($method, $id, $server, $repository);
+}
+
+#### private helper methods ####
+
+sub get_config_file
+{
+ my $self = shift;
+
+ if ( !defined $self->{_CONFIG_FILE} ) {
+ $self->parse_config_file();
+ }
+ return $self->{_CONFIG_FILE};
+}
+
+sub read_config
+{
+ my $self = shift;
+ my $fname = shift;
+ my $fhandle;
+ my $section = '';
+ my %config;
+
+ open ($fhandle, $fname) || croak("ERROR: Can't open '$fname': $!");
+ while ( <$fhandle> ) {
+ tr/\r\n//d; # win32 pain
+ # Issue #i62815#: Scrambled CVS passwords may contain one or more '#'.
+ # Ugly special case needed: still allow in-line (perl style) comments
+ # elsewhere because existing configuration files may depend on them.
+ if ( !/^\s*CVS_PASSWORD/ ) {
+ s/\#.*//; # kill comments
+ }
+ /^\s*$/ && next;
+
+ if (/\[\s*(\S+)\s*\]/) {
+ $section = $1;
+ if (!defined $config{$section}) {
+ $config{$section} = {};
+ }
+ }
+ defined $config{$section} || croak("ERROR: unknown / no section '$section'\n");
+ if ( m/(\w[\w\d]*)=(.*)/ ) {
+ my $var = $1;
+ my $val = $2;
+ # New style value strings may be surrounded by quotes
+ if ( $val =~ s/\s*(['"])(.*)\1\s*$/$2/ ) {
+ my $quote = $1;
+ # If and only if the value string is surrounded by quotes we
+ # can expect that \" or \' are escaped characters. In an unquoted
+ # old style value string they could mean exactly what is standing there
+ #
+ # Actually the RE above works without quoting the quote character
+ # (either " or ') inside the value string but users will probably
+ # expect that they need to be escaped if quotes are used.
+ #
+ # This is still not completly correct for all thinkable situations but
+ # should be good enough for all practical use cases.
+ $val =~ s/\\($quote)/$1/g;
+ }
+ $config{$section}->{$var} = $val;
+ # print "Set '$var' to '$val'\n";
+ }
+ }
+ close ($fhandle) || croak("ERROR: Failed to close: $!");
+
+ $self->{_CONFIG_FILE} = \%config;
+}
+
+sub parse_config_file
+{
+ my $self = shift;
+
+ my $config_file;
+ # check for config files
+ if ( -e "$ENV{HOME}/.cwsrc" ) {
+ $self->read_config("$ENV{HOME}/.cwsrc");
+ $self->{_GLOBAL} = 0;
+ }
+ elsif ( -e "$ENV{COMMON_ENV_TOOLS}/cwsrc" ) {
+ $self->read_config("$ENV{COMMON_ENV_TOOLS}/cwsrc");
+ $self->{_GLOBAL} = 1;
+ }
+ else {
+ croak("ERROR: can't find CWS config file '\$HOME/.cwsrc'.\n");
+ }
+}
+
+sub sointernal
+{
+ my $self = shift;
+ my $config_file = $self->get_config_file();
+ my $val = ($config_file->{CWS_CONFIG}->{"SO_INTERNAL"}) ? 1 : 0;
+ return $val;
+}
+1; # needed by "use" or "require"