releasing/cbrtools/perl/MergeEnvironments
author kelvzhu
Mon, 18 Oct 2010 16:16:46 +0800
changeset 655 3f65fd25dfd4
parent 602 3145852acc89
permissions -rw-r--r--
sync up SVN codes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     1
#!perl -w
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     2
# Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     3
# All rights reserved.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     4
# This component and the accompanying materials are made available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     5
# under the terms of the License "Eclipse Public License v1.0"
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     6
# which accompanies this distribution, and is available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     8
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     9
# Initial Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    11
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    12
# Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    13
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    14
# Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    15
# MergeTwoEnvironments
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    16
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    17
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    18
use strict;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    19
use FindBin;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    20
use lib "$FindBin::Bin";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    21
use RelData;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    22
use IniData;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    23
use MrpData;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    24
use EnvDb;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    25
use Getopt::Long;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    26
use Data::Dumper;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    27
use Utils;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    28
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    29
# Process command-line options
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    30
Getopt::Long::Configure ("bundling");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    31
my ($help, $verbose, $project, $releasenotes, $dummyrun, $internalver, $force);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    32
GetOptions("h" => \$help, "v+" => \$verbose, "w=s" => \$project, "r=s" => \$releasenotes, "d" => \$dummyrun, "i=s" => \$internalver, 'f' => \$force);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    33
$verbose ||= 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    34
$internalver ||= "-";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    35
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    36
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    37
# Get the name and version of the new environment
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    38
my ($newcomp, $newver, @argsleft) = @ARGV;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    39
print "Using \"$newcomp\" \"$newver\"\n" if ($verbose);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    40
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    41
# Eat up the environments to merge
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    42
my @envstomerge;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    43
while (scalar @argsleft) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    44
  my ($oldcomp, $oldver, $prefix);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    45
  ($oldcomp, $oldver, $prefix, @argsleft) = @argsleft;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    46
  print "Adding \"$oldcomp\" \"$oldver\" prefix \"$prefix\"\n" if ($verbose);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    47
  push @envstomerge, {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    48
    comp => $oldcomp,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    49
    ver => $oldver,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    50
    prefix => $prefix
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    51
  };
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    52
  die "You must provide a component, version and environment for each environment you want to merge" unless $oldcomp && $oldver && defined $prefix;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    53
    # In fact, a blank (but defined) prefix might be worth having so we'll let them get away with that
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    54
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    55
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    56
print <<ENDHELP and exit if $help;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    57
Merges several environments into a new release.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    58
Usage:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    59
MergeEnvironments <options> newcomp newver {oldcomp oldver prefix} ...
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    60
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    61
The {oldcomp oldver prefix} section must be repeated at least twice
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    62
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    63
Options:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    64
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    65
-r <release.src> the release.src file to use (mandatory)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    66
-h               show this help
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    67
-w <project>     make the reldata in this project
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    68
-v               verbose
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    69
-f               (deprecated)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    70
-d               dummy run (just report the environment to be produced)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    71
-i <ver>         internal version number of the release we're creating
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    72
ENDHELP
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    73
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    74
die "You must specify a release notes file" unless $releasenotes;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    75
die "Release notes file \"$releasenotes\" doesn't exist" unless -e $releasenotes;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    76
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    77
##############################################################################
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    78
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    79
# Create objects that the Release Tools need
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    80
my $iniData = New IniData;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    81
my $envDb = Open EnvDb($iniData);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    82
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    83
# The final environment we're going to use
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    84
my %newenv;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    85
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    86
foreach my $mergeenv (@envstomerge) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    87
  my $env = ReadEnvironmentFromRelData($mergeenv->{comp}, $mergeenv->{ver});
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    88
  my %copy = %$env;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    89
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    90
  # Delete things according to the prefix
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    91
  foreach (keys %copy) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    92
    my $prefix = $mergeenv->{prefix};
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    93
    delete $copy{$_} if ($copy{$_} !~ m/^$prefix/i);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    94
  }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    95
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    96
  %newenv = (%copy, %newenv);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    97
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    98
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    99
# Finally make sure our new component itself is in the environment
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   100
$newenv{$newcomp} = $newver;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   101
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   102
if ($verbose || $dummyrun) {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   103
  print "Have combined the two environments. Results are:\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   104
  print Dumper(\%newenv);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   105
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   106
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   107
CreateNewRelease($newcomp, $newver, \%newenv, $project) unless $dummyrun;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   108
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   109
exit;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   110
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   111
##############################################################################
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   112
sub ReadEnvironmentFromRelData {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   113
  my $comp = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   114
  my $ver = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   115
  print "Reading environment from \"$comp\", \"$ver\"...\n" if ($verbose);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   116
  my $rd = Open RelData($iniData, $comp, $ver, 2) or die "Couldn't open reldata for \"$comp\" \"$ver\"";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   117
  return $rd->Environment;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   118
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   119
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   120
sub CreateNewRelease {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   121
  my $comp = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   122
  my $ver = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   123
  my $env = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   124
  my $project = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   125
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   126
  my $fakeMrpName = Utils::PrependEpocRoot("\\__reltools_tmp_mrp");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   127
  WriteFakeMrp($fakeMrpName, $comp, $releasenotes);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   128
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   129
  my $mrpData = New MrpData($fakeMrpName,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   130
                          $ver, 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   131
                          $internalver, 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   132
                          $iniData, 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   133
                          $verbose,  # verbosity
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   134
                          0); # fixLibs
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   135
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   136
  unlink($fakeMrpName);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   137
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   138
  my $dir = $iniData->PathData->LocalArchivePathForNewComponent($comp, $ver, $project);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   139
  print "Making directory \"$dir\"\n" if ($verbose);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   140
  Utils::MakeDir($dir);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   141
  print "Writing out reldata\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   142
  my $relData = New RelData($iniData,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   143
                   $mrpData, 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   144
                   $releasenotes,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   145
                   $env, 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   146
                   "MergeTwoEnvironments", 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   147
                   $verbose, # verbosity
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   148
                   undef, # dontPersist
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   149
                   $project);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   150
  print "$comp $ver created.\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   151
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   152
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   153
sub WriteFakeMrp {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   154
  my $name = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   155
  my $comp = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   156
  my $relnotes = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   157
  open(FILE, ">$name") or die "Couldn't write to \"$name\" because $!";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   158
  print FILE "component $comp\nnotes_source $relnotes\n";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   159
  close FILE;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   160
}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   161
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   162
__END__
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   163
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   164
=head1 NAME
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   165
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   166
MergeEnvironments - Merge the environments of several existing releases into a new release
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   167
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   168
=head1 SYNOPSIS
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   169
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   170
MergeEnvironments <options> newcomp newver {oldcomp oldver prefix} ...
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   171
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   172
The {oldcomp oldver prefix} section must be repeated at least twice.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   173
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   174
Options:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   175
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   176
  -r <release.src> the release.src file to use (mandatory)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   177
  -h               help
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   178
  -w <project>     make the new release in this project (only applicable for new-style archive-path arrangements)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   179
  -v               verbose (-vv = very verbose)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   180
  -f		   (deprecated)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   181
  -d               dummy run (just report the environment to be produced)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   182
  -i <ver>         internal version number of the release we're creating
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   183
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   184
=head1 DESCRIPTION
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   185
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   186
This tool will merge several environments to produce a new one. It reads the environment from two existing components, and produces another one. This new component just contains an environment; it has no binaries nor source.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   187
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   188
It is expected that you will then use C<validateenv> to validate against that environment.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   189
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   190
=head1 KNOWN BUGS
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   191
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   192
Not really a defect, but it's limiting that you can only merge the environments based on the prefix of the version number. It would be nice to have more flexible criteria.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   193
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   194
The command line syntax is not intuitive. This may be fixed one day.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   195
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   196
But much more likely, the whole issue will go away with Release Tools 3, when validation will be substantially changed.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   197
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   198
=head1 STATUS
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   199
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   200
Supported. If you find a problem, please report it to us.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   201
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   202
=head1 COPYRIGHT
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   203
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   204
 Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   205
 All rights reserved.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   206
 This component and the accompanying materials are made available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   207
 under the terms of the License "Eclipse Public License v1.0"
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   208
 which accompanies this distribution, and is available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   209
 at the URL "http://www.eclipse.org/legal/epl-v10.html".
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   210
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   211
 Initial Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   212
 Nokia Corporation - initial contribution.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   213
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   214
 Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   215
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   216
 Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   217
 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   218
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   219
=cut