releasing/cbrtools/perl/Symbian/CBR/DeltaRelease/Manifest.pm
changeset 607 378360dbbdba
parent 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/DeltaRelease/Manifest.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,380 @@
+# Copyright (c) 2007-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:
+# Symbian::CBR::Delta::Manifest.pm
+#
+
+package Symbian::CBR::DeltaRelease::Manifest;
+
+use strict;
+use XML::Simple;
+use Carp;
+use POSIX qw(strftime);
+use base qw (Exporter);
+
+#
+#Constants
+#
+
+use constant DELTA_MANIFEST_FILE      => 'delta_manifest_baseline.xml';
+use constant META_FILES               => 'metafiles';
+use constant ADDED_ZIPS               => 'addedZips';
+
+our @EXPORT_OK = qw(DELTA_MANIFEST_FILE META_FILES ADDED_ZIPS);
+
+
+
+#
+#Public.
+#
+
+sub new {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  return $self;
+}
+
+sub Save {
+  my $self = shift;
+  my $destination = shift;
+  mkpath ($destination) unless (-e $destination);
+  my $manifestFile = File::Spec->catfile($destination,DELTA_MANIFEST_FILE);
+  print "Writing Delta manifest file.\n " ;
+  #Hash structure to be provided as input for XML::Simple->XMLout()
+  my $manifestHash = {
+    version => "1.0.0",
+    meta => { 'reference-baseline' => { 'value' => $self->{referenceBaseline} },
+              'reference-version' => { 'value' => $self->{referenceVersion} },
+              'nominated-baseline' => { 'value' => $self->{nominatedBaseline} },
+              'nominated-version' => { 'value' => $self->{nominatedVersion} },
+              'created-time' => { 'value' => strftime( '%Y-%m-%dT%H:%M:%S', localtime() ) } }
+  };
+  my $cgroups = {};
+  foreach my $thisComp (sort keys %{$self->{components}}) {
+    my $compStatus = $self->{components}{$thisComp}{'status'};
+    my $nomVer = $self->{components}{$thisComp}{'nominatedVersion'} if (defined $self->{components}{$thisComp}{'nominatedVersion'});
+    my $refVer = $self->{components}{$thisComp}{'referenceVersion'} if (defined $self->{components}{$thisComp}{'referenceVersion'});
+    my $zgroups = {};
+    my @zGroupArray = ();
+    foreach  my $thisZip (sort keys %{$self->{components}{$thisComp}{'zipFiles'}}) {
+      my $thisZipFileStatus = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{'status'};
+      if ( !defined $zgroups->{$thisZip} ) {
+        $zgroups->{$thisZip} = {file => []};
+        if ($thisZip =~ /^exports([A-Z])\.zip$/i) {
+          $zgroups->{$thisZip}{'ipr-category'} = $1;
+          $zgroups->{$thisZip}{'content-type'} = "exports";
+        }
+        elsif ($thisZip =~ /^source([A-Z])\.zip$/i) {
+          $zgroups->{$thisZip}{'ipr-category'} = $1;
+          $zgroups->{$thisZip}{'content-type'} = "source";
+        }
+        elsif ($thisZip =~ /^binaries\.zip$/i) {
+          $zgroups->{$thisZip}{'content-type'} = "binary";
+        }
+        elsif ($thisZip =~ /^binaries\_([_a-zA-Z0-9]+)\.zip$/i) {
+          $zgroups->{$thisZip}{'content-type'} = "binary";
+          $zgroups->{$thisZip}{'platform'} = $1;
+        }
+        $zgroups->{$thisZip}{status} = $thisZipFileStatus;
+        push @zGroupArray, $zgroups->{$thisZip};
+      }
+      foreach my $thisFile (keys %{$self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}}) {
+        my $file = { path => $thisFile };
+        $file->{status} = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}{$thisFile}{status};
+        $file->{type} = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}{$thisFile}{type};
+        push @{$zgroups->{$thisZip}{file}}, $file;
+      }
+    }
+    if ( !defined $cgroups->{$thisComp} ) {
+      $cgroups->{$thisComp} = { files => [] };
+      $cgroups->{$thisComp}{name} = $thisComp;
+      $cgroups->{$thisComp}{status} = $compStatus;
+      $cgroups->{$thisComp}{referenceVersion} = $refVer if(defined $refVer);
+      $cgroups->{$thisComp}{nominatedVersion} = $nomVer if(defined $nomVer);
+      push @{$manifestHash->{component}}, $cgroups->{$thisComp};
+    }
+    foreach my $zgroup (@zGroupArray) {
+      push @{$cgroups->{$thisComp}{files}}, $zgroup;
+    }
+    foreach my $thisFile (sort keys %{$self->{components}{$thisComp}{metafiles}}) {
+      my $file = { path => $thisFile };
+      push @{$cgroups->{$thisComp}{metafiles}{file}}, $file;
+    }
+  }
+  #Use the hash structure for calling the XMLout() to write the manifest file
+  eval {XMLout(
+        $manifestHash,
+        xmldecl     => '<?xml version="1.0" ?>',
+        rootname    => 'manifest',
+        outputfile  => $manifestFile )};
+  croak "Error: Can't write manifest file: $@\n" if $@;
+}
+
+sub LoadManifest {
+  my $self = shift;
+  my $manifestFile = shift;
+  print "Reading $manifestFile file.\n";
+
+  my $manifest    = eval{XMLin(
+                    $manifestFile,
+                    forcearray => [ qw(component files file metafiles) ], keyattr => [])
+                    };
+
+  croak "Error: Can't read manifest file '$manifestFile': $@\n" if $@;
+
+  # Mapping from xml keyword to our internal data structure keyword
+  my %metaFieldMap = ('nominated-baseline' => 'nominatedBaseline',
+                      'nominated-version'  => 'nominatedVersion',
+                      'reference-baseline' => 'referenceBaseline',
+                      'reference-version'  => 'referenceVersion',
+                      'created-time'       => 'createdTime');
+
+  foreach my $metaInformation (@{$manifest->{meta}}) {
+    $self->{$metaFieldMap{$metaInformation->{name}}} = $metaInformation->{value};
+  }
+  
+  foreach my $component ( @{$manifest->{component} } ) {  
+    $self->{components}->{$component->{name}} = {
+                referenceVersion => $component->{referenceVersion},
+                nominatedVersion => $component->{nominatedVersion},
+                status => $component->{status}}; 
+
+    foreach my $zipfile ( @{ $component->{files} } ) {
+      my $content = $zipfile->{'content-type'};
+      my $category;
+      my $platform;
+      my $zipFileName ;
+      if ($content eq "source" or $content eq "exports") {
+        $category = $zipfile->{'ipr-category'};
+        $zipFileName = $content.$category.".zip";
+      }
+      else {
+        $platform = $zipfile->{platform};
+        if (defined $platform) {
+          $zipFileName = "binaries_".$platform.".zip";
+        }
+        else {
+          $zipFileName = "binaries.zip";
+        }
+      }
+      
+      $self->{components}->{$component->{name}}->{zipFiles}->{$zipFileName}->{status} = $zipfile->{status};
+     
+      foreach my $file (@{$zipfile->{file}}) {      
+        $self->{components}->{$component->{name}}->{zipFiles}->{$zipFileName}->{files}->{$file->{path}} = {
+                                                                                          status => $file->{status},
+                                                                                          type => $file->{type}};
+      }
+    }
+    foreach my $metafiles ( @{ $component->{metafiles} } ) {
+      foreach my $file (@{$metafiles->{file}}) {
+        my $name = $file->{path};
+        $self->{components}->{$component->{name}}->{metafiles}->{$name} = 1;
+      }
+    }
+  }
+}
+
+sub SetReferenceBaselineComp {
+  my $self = shift;
+  my $comp = shift;
+  $self->{referenceBaseline} = $comp;
+}
+
+sub SetReferenceBaselineVer {
+  my $self = shift;
+  my $version = shift;
+  $self->{referenceVersion} = $version;
+}
+
+sub SetNominatedBaselineComp {
+  my $self = shift;
+  my $comp = shift;
+  $self->{nominatedBaseline} = $comp;
+}
+
+sub SetNominatedBaselineVer {
+  my $self = shift;
+  my $version = shift;
+  $self->{nominatedVersion} = $version;
+}
+
+sub SetComponentDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $status = shift;
+  my $refVersion = shift;
+  my $nomVersion = shift;
+  $self->{components}{$comp}{'status'} = $status;
+  $self->{components}{$comp}{'referenceVersion'} = $refVersion if(defined $refVersion);
+  $self->{components}{$comp}{'nominatedVersion'} = $nomVersion if(defined $nomVersion);
+}
+
+sub SetZipfileDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $status = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{'status'} = $status;
+}
+
+sub SetFileDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file = shift;
+  my $status = shift;
+  my $type = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{status} = $status;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{type} = $type;
+}
+
+sub RecordMetaFile {
+  my $self = shift;
+  my $comp = shift;
+  my $file = shift;
+  $self->{components}{$comp}{metafiles}{$file} = 1;
+}
+
+sub GetReferenceBaselineComp {
+  my $self = shift;
+  return $self->{referenceBaseline} ;
+}
+
+sub GetReferenceBaselineVer {
+  my $self = shift;
+  return $self->{referenceVersion};
+}
+
+sub GetNominatedBaselineComp {
+  my $self = shift;
+  return $self->{nominatedBaseline};
+}
+
+sub GetNominatedBaselineVer {
+  my $self = shift;
+  return $self->{nominatedVersion};
+}
+
+sub ListAllComponents {
+  my $self = shift;
+  return $self->{components};
+}
+
+sub GetCompStatus {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'status'};
+}
+
+sub GetCompReferenceVer {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'referenceVersion'};
+}
+
+sub GetCompNominatedVer {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'nominatedVersion'};
+}
+
+
+sub GetZipFilesForComp {
+  my $self = shift;
+  my $comp = shift;
+  return ($self->{components}{$comp}{zipFiles} || {});
+}
+
+sub GetZipStatus {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  return $self->{components}{$comp}{zipFiles}{$zipFile}{'status'};
+}
+
+sub GetFilesForZip {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  return ($self->{components}{$comp}{zipFiles}{$zipFile}{files} || {});
+}
+
+sub GetFileStatus {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file  = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{status};
+}
+
+sub GetFileType {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file  = shift;
+  return $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{type};
+}
+
+sub GetMetaFiles {
+  my $self = shift;
+  my $comp = shift;
+  return ($self->{components}{$comp}{metafiles} || {});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Symbian::CBR::DeltaRelease::Manifest.pm - Provides an interface to data associated with a deltas created from reference version to the nominated version.
+
+=head2 new
+
+Creates a new Symbian::CBR::Delta::Manifest object.
+
+=head2 Save
+
+Expects to be passed a destination path. Creates destination path if destination path is not existing, and save the hash structure to xml file.
+
+=head2 LoadManifest
+
+Expects to be passed a manifest file name. Reads delta manifest file and converts into a hash structure.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2007-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