diff -r 6d08f4a05d93 -r 3145852acc89 releasing/cbrtools/perl/PathData/ComponentBased.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/releasing/cbrtools/perl/PathData/ComponentBased.pm Fri Jun 25 18:37:20 2010 +0800 @@ -0,0 +1,344 @@ +# Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# +# Description: +# PathData/ComponentBased.pm +# + +package PathData::ComponentBased; +use strict; + +BEGIN { + @PathData::ComponentBased::ISA=('PathData'); +}; + +# +# Public +# +# + +sub ProcessLine { + my $self = shift; + my $keywordref = shift; + my $lineref = shift; + + die "Unknown keyword $$keywordref for component-based path data" unless ($$keywordref =~ m/archive_path_file/i); + print "Warning: Deprecated keyword 'archive_path_file' found. Support for component-based archives is planned for removal - please see documention for the 'archive_path' keyword for how to use project-based archives.\n"; + + die "Can't have multiple archive_path_file keywords in reltools.ini." if ($self->{archive_path_file}); + + $self->{archive_path_file} = $$lineref; # store the filename, just in case anybody wants to debug us - it might be useful. + $self->ParsePathData(); +} + +sub LocalArchivePathForNewComponent { + my $self = shift; + my $comp = shift; + my $ver = shift; + my $project = shift; + die "Project $project does not make any sense when we are using an archive_path_data.txt file"; + return $self->LocalArchivePath($comp, $ver); +} + +sub LocalArchivePathForExistingComponent { + my $self = shift; + my $comp = shift; + my $ver = shift; + return $self->LocalArchivePath($comp, $ver); +} + +sub LocalArchivePathForImportingComponent { + my $self = shift; + my $comp = shift; + my $ver = shift; + my $remotepath = shift; + return $self->LocalArchivePath($comp, $ver); +} + +sub RemoteArchivePathForExistingComponent { + my $self = shift; + my $comp = shift; + my $ver = shift; + return $self->RemoteArchivePath($comp, $ver); +} + +sub RemoteArchivePathForExportingComponent { + my $self = shift; + my $comp = shift; + my $ver = shift; + my $localpath = shift; + return $self->RemoteArchivePath($comp, $ver); +} + +sub ListComponents { + my $self = shift; + my $remote = shift || 0; + my @comps; + if ($remote) { # list those in the remote archive + die "Must pass a remote site object to ListComponents if you want a list of the components on the remote site" unless ref $remote; + foreach my $location (values %{$self->{remote_archive_path}}) { + my $list = $remote->DirList($location); + $location =~ s/\\/\//g; + foreach (@$list) { + s/^$location\/?//i; + push @comps, $_; + } + } + } else { # list those in the local archive + foreach my $location (values %{$self->{local_archive_path}}) { + push @comps, @{Utils::ReadDir($location)} if (-d $location); + } + } + return \@comps; +} + +sub ListProjects { + my $self = shift; + die "Cannot give a list of projects because we are using the component-based style of archive path data."; +} + +sub ListVersions { + my $self = shift; + my $comp = shift; + my $remote = shift; + my $filter = shift; + my $found; + if ($remote) { # list those in the remote archive + die "Must pass a remote site object to ListVersions if you want a list of the versions on the remote site" unless ref $remote; + my $compDir = $self->GetArchivePath($comp, "remote_archive_path")."/$comp"; + my $files = $remote->DirList($compDir); + my @results = map { m/\Q$comp\E([^\\\/]*)\.zip/i; $1 } @$files; + $found = \@results; + } else { # list those in the local archive + my $compDir = $self->GetArchivePath($comp, "local_archive_path")."\\$comp"; + return [] unless (-d $compDir); + $found = Utils::ReadDir($compDir); + } + @$found = grep { m/$filter/i } @$found if ($filter); + return @$found if wantarray; + return $found; +} + +sub ComponentProjects { + my $self = shift; + my $comp = shift; + my $ver = shift; + return (""); +} + +sub ComponentProject { + my $self = shift; + my $comp = shift; + my $ver = shift; + return (""); +} + +# +# Private +# +# +# + +sub GetArchivePath { + my $self = shift; + my $component = lc(shift); + my $type = shift; + + die "Couldn't get archive path for undefined component" unless defined $component; + die unless defined $type; + + if ($self->{$type}->{$component}) { + return $self->{$type}->{$component}; + } + elsif ($self->{$type}->{default}) { + return $self->{$type}->{default}; + } + else { + die "Error: archive path not specified for $component\n"; + } +} + +sub LocalArchivePath { + my $self = shift; + my $component = shift; + my $ver = shift; + + return $self->GetArchivePath($component, "local_archive_path")."\\$component\\$ver"; +} + +sub RemoteArchivePath { + my $self = shift; + my $component = shift; + my $ver = shift; + + return $self->GetArchivePath($component, "remote_archive_path")."/$component"; +} + +sub ParsePathData { + my $self = shift; + + my $path_file = $self->{archive_path_file}; + + unless (-f $path_file) { + die "Error: $path_file not found\n"; + } + + open PATH, "$path_file" or die "Unable to open $path_file for reading\n"; + + while (my $line = ) { + # Remove line feed, white space and comments. + chomp $line; + $line =~ s/^\s*$//; + $line =~ s/#.*//; + if ($line eq '') { + # Nothing left. + next; + } + my ($component, $local, $remote) = split (/\s+/, $line, 4); + $component = lc($component); + unless ($local and $remote) { + die "Error: Path not defined for \"$component\" in \"$path_file\"\n"; + } + if (exists $self->{local_archive_path}->{$component}) { + die "Error: \"$component\" specified more than once in \"$path_file\"\n"; + } + $self->{local_archive_path}->{$component} = $local; + $self->{remote_archive_path}->{$component} = $remote; + } + close PATH; +} + + +1; + +__END__ + +=head1 NAME + +PathData/ComponentBased.pm - Provides the location of archived releases with an old-style archive arrangement. + +=head1 DESCRIPTION + +Parses a file containing paths to component release packets on both the local and remote archives. + +=head1 INTERFACE + +=head2 ProcessLine + +This interprets an C line from your F, and goes away to parse the F file (which it does using the internal method C). + +The parser expects each line in the file to have the following form: + + + +So an example file might have the following structure: + + # + # App Engines + # + agnmodel X:\ProjectX\appeng \ProjectX\appeng + cntmodel X:\ProjectX\appeng \ProjectX\appeng + damodel X:\ProjectX\appeng \ProjectX\appeng + ... + ... + # + # App Framework + # + apparc X:\ProjectX\appframework \ProjectX\appframework + eikstd X:\ProjectX\appframework \ProjectX\appframework + etext X:\ProjectX\appframework \ProjectX\appframework + ... + ... + # + # Default path + # + default X:\ProjectX\misc \ProjectX\misc + +The C line is optional (and there should be only one in the file). The C value is the path given to all component releases which are not explicity listed in the file. + +[Note: text following a # is treated as a comment] + +=head2 Methods that return paths + +All of these methods are expected to return the full location where the files should be stored; i.e. local archive paths should end in "\component\version" and remote archive paths should end in "/component". + +=head2 LocalArchivePathForNewComponent + +This takes a component and a version and (optionally) the name of the project to store the component in. + +=head2 LocalArchivePathForExistingComponent + +This takes a component and a version. + +=head2 LocalArchivePathForImportingComponent + +This takes a component, a version, and the remote path where the component was found. + +=head2 RemoteArchivePathForExistingComponent + +This takes a component and a version. + +=head2 RemoteArchivePathForExportingComponent + +This takes a component, a version, and the local path where the component was found. + +=head2 ListComponents + +This may take "1" to indicate that it should list the components stored remotely, not locally. + +=head2 ListVersions + +This takes a component. It may optionally take a "1" to indicate that it should list the versions stored remotely, not locally. + +=head2 ListProjects + +=head2 ComponentProjects + +=head2 ComponentProject + +These methods all throw an error, since projects aren't a relevant concept in this type of archive structure. + +=head1 IMPLEMENTATION + +=head2 LocalArchivePath + +Takes a component name. Returns the path of the component release packet on the local archive. Dies if not found. + +=head2 RemoteArchivePath + +Takes a component name. Returns the path of the component release packet on the remote archive (either an FTP site or a network drive). Dies if not found. + +=head1 KNOWN BUGS + +None. + +=head1 COPYRIGHT + + Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + This component and the accompanying materials are made available + under the terms of the License "Eclipse Public License v1.0" + which accompanies this distribution, and is available + at the URL "http://www.eclipse.org/legal/epl-v10.html". + + Initial Contributors: + Nokia Corporation - initial contribution. + + Contributors: + + Description: + + +=cut