| #!/usr/bin/perl -w | |
| ################################################################################ | |
| # Copyright (C) 2017, Ericsson. | |
| # | |
| # All rights reserved. This program and the accompanying materials | |
| # are made available under the terms of the Eclipse Public License 2.0 | |
| # which accompanies this distribution, and is available at | |
| # https://www.eclipse.org/legal/epl-2.0/ | |
| # | |
| # SPDX-License-Identifier: EPL-2.0 | |
| # | |
| # Contributors | |
| # Bernd Hufmann - Initial version | |
| ################################################################################ | |
| use strict; | |
| use File::Basename; | |
| $::me = basename($0, ""); | |
| use Getopt::Std; # standard Perl module | |
| getopts("vh"); | |
| $::gVerbose = $::opt_v if ($::opt_v); | |
| $::gHelp = $::opt_h if ($::opt_h); | |
| # Function prototypes to keep perl -w quiet: | |
| sub debug($); | |
| ##------------------------------------------------------------------------ | |
| # Debug output. Use instead of "print()" | |
| sub debug($) | |
| { | |
| my $what = shift; | |
| print STDERR "$what\n" if $::gVerbose; | |
| } | |
| sub usage() | |
| { | |
| print <<USAGE; | |
| $::me [-v] [-h] <simRelName> <updateRelease> <milestone> <releaseNumber> | |
| Creating milestone builds and storing the relevant artifacts and doc | |
| in the corresponding directory. | |
| Note: to make a release, at least rc1 and rc2 have to be created. | |
| where: | |
| -v: verbose mode | |
| -h: print usage | |
| simRelName: name of simultaneous release (e.g. neon, oxygen) | |
| updateRelease: number of update release 0-3 | |
| milestone: m1, m2, m3, rc1, rc2 or release (at release time) | |
| release nubmer: the actual release number (e.g. 4.1.0) | |
| Examples: | |
| ./create-release.pl -v photon 0 m1 4.0.0 | |
| ./create-release.pl -v photon 0 rc1 4.0.0 | |
| ./create-release.pl -v photon 3 release 4.3.0 | |
| USAGE | |
| exit; | |
| } | |
| usage() if ($::gHelp); | |
| usage() if ($#ARGV < 3); | |
| ################################################################################ | |
| # Validate command-line parameters | |
| ################################################################################ | |
| $::gSimReleaseName = shift; | |
| $::gUpdateRelease = shift; | |
| $::gMilestone = shift; | |
| $::gTraceCompassRelease = shift; | |
| debug ("Sim Release Name:\t$::gSimReleaseName"); | |
| debug ("Update Release:\t\t$::gUpdateRelease"); | |
| debug ("Milestone:\t\t$::gMilestone"); | |
| debug ("Version:\t\t$::gTraceCompassRelease\n"); | |
| ################################################################################ | |
| # Basic constants | |
| ################################################################################ | |
| $::gBaseDir = "/home/data/httpd/"; | |
| $::gTraceCompassDir = $::gBaseDir."download.eclipse.org/tracecompass/"; | |
| $::gReleaseBaseDir = $::gTraceCompassDir.$::gSimReleaseName."/"; | |
| $::gMilestoneBaseDir = $::gReleaseBaseDir."milestones/"; | |
| $::gSimRelStableDir = $::gReleaseBaseDir."stable/"; | |
| $::gSimRelStableRepositoryDir = $::gSimRelStableDir."repository/"; | |
| $::gSimRelStableRcpDir = $::gSimRelStableDir."rcp/"; | |
| $::gStableDir = $::gTraceCompassDir."stable/"; | |
| $::gStableRcpDir = $::gStableDir."rcp/"; | |
| $::gFinalReleaseDir = $::gTraceCompassDir."releases/".$::gTraceCompassRelease."/"; | |
| $::gFinalReleaseRcpDir = $::gFinalReleaseDir."rcp/"; | |
| $::gDocBaseDir = $::gBaseDir."archive.eclipse.org/tracecompass/doc/"; | |
| $::gDocStableDir = $::gDocBaseDir."stable/"; | |
| $::gDocReleaseStableDir = "$::gDocBaseDir".$::gSimReleaseName."/stable/"; | |
| $::gBackupArtifactDir = "$::gTraceCompassDir"."tmp/backup/artifacts/"; | |
| $::gBackupDocDir = "$::gTraceCompassDir"."tmp/backup/doc/"; | |
| $::gMasterArtifactsDir = $::gTraceCompassDir."master/"; | |
| $::gMasterRepositoryDir = $::gMasterArtifactsDir."repository/"; | |
| $::gStableBranchName = "stable_$::gTraceCompassRelease"; | |
| $::gStableBranchName =~ s/(\d+\.\d+)\.\d+/$1/; | |
| $::gNewNoteworthy = "NewIn$::gTraceCompassRelease"; | |
| $::gNewNoteworthy =~ s/(\d+)\.(\d+)\.\d+/$1$2/; | |
| $::gMilestoneUpperCase = $::gMilestone; | |
| $::gMilestoneUpperCase =~ s/(\S+)/uc($1)/ge; | |
| $::gSimReleaseNameUpperCase = $::gSimReleaseName; | |
| $::gSimReleaseNameUpperCase =~ s/\b(\w)/\U$1/g; | |
| ################################################################################ | |
| # Create update release hash table | |
| ################################################################################ | |
| %::G_UPDATE_RELEASE_HASH = ( | |
| "0" => "", | |
| "1" => "ur1_", | |
| "2" => "ur2_", | |
| "3" => "ur3_", | |
| ); | |
| ################################################################################ | |
| # Validate update release parameter | |
| ################################################################################ | |
| if (!defined $::G_UPDATE_RELEASE_HASH{$::gUpdateRelease}) | |
| { | |
| die "$::me-error: Update release $::gUpdateRelease not supported " | |
| } | |
| ################################################################################ | |
| # Create hash table with milestone/release content | |
| ################################################################################ | |
| $::gMilestoneDir = $::gMilestoneBaseDir.$::G_UPDATE_RELEASE_HASH{$::gUpdateRelease}.$::gMilestone."/"; | |
| $::gReminders = ""; | |
| my $http = '"http:\/\/"'; | |
| if ($::gMilestone ne "release") | |
| { | |
| $::gReminders = "\ | |
| - Update tracecompass.aggrcon of repo org.eclipse.simrel.build with:\ | |
| $::gMilestoneDir\n"; | |
| } | |
| else | |
| { | |
| $::gReminders = "\ | |
| - Update tracecompass.aggrcon of repo org.eclipse.simrel.build with:\ | |
| http://download.eclipse.org/tracecompass/releases/$::gTraceCompassRelease/repository/\n"; | |
| } | |
| $::gReminders =~ s/$::gBaseDir/$http/eeg; | |
| $::gMileStoneEmailBase = "\ | |
| Title: Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease $::gMilestoneUpperCase posted\ | |
| \ | |
| Hi,\ | |
| \ | |
| I posted the Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease $::gMilestoneUpperCase build:\ | |
| $::gMilestoneDir\ | |
| \ | |
| It is based on commit: <TODO>\ | |
| \n"; | |
| $::gReleaseEmail = "\ | |
| Hi,\ | |
| \ | |
| The Trace Compass team is pleased to announce that the release $::gTraceCompassRelease for $::gSimReleaseNameUpperCase.$::gUpdateRelease is now available\ | |
| from the project's download page [1]. Details are available on the New & Noteworthy page [2].\ | |
| \ | |
| The Trace Compass p2 repository is up at http://download.eclipse.org/tracecompass/releases/$::gTraceCompassRelease/repository/\ | |
| \ | |
| The Trace Compass standalone RCP is available from: http://download.eclipse.org/tracecompass/releases/$::gTraceCompassRelease/rcp/\ | |
| \ | |
| The tag v$::gTraceCompassRelease maps to the commit <TODO>\ | |
| \ | |
| Congratulations and thanks to everyone!\ | |
| \ | |
| Regards\ | |
| Bernd\ | |
| \ | |
| [1] https://projects.eclipse.org/projects/tools.tracecompass/downloads\ | |
| [2] https://wiki.eclipse.org/Trace_Compass/News/$::gNewNoteworthy\ | |
| \n"; | |
| $::gGreeting = "\ | |
| Regards\ | |
| Bernd\ | |
| \n"; | |
| %::G_MILESTONES_HASH = ( | |
| "m1" => { | |
| from => $::gMasterRepositoryDir, | |
| to => $::gMilestoneDir, | |
| email => $::gMileStoneEmailBase, | |
| addon => "Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease M2 will be <TODO>\n".$::gGreeting, | |
| reminder => $::gReminders | |
| }, | |
| "m2" => { | |
| from => $::gMasterRepositoryDir, | |
| to => $::gMilestoneDir, | |
| email => $::gMileStoneEmailBase, | |
| addon => "Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease M3 will be <TODO>\n".$::gGreeting, | |
| reminder => $::gReminders | |
| }, | |
| "m3" => { | |
| from => $::gMasterRepositoryDir, | |
| to => $::gMilestoneDir, | |
| email => $::gMileStoneEmailBase, | |
| addon => "Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease RC1 will be <TODO>\ | |
| \ | |
| Reminder: RC1 will be API and feature freeze for this release.\n".$::gGreeting, | |
| reminder => $::gReminders, | |
| }, | |
| "rc1" => { | |
| from => $::gMasterRepositoryDir, | |
| to => $::gMilestoneDir, | |
| fromArtifacts => $::gMasterArtifactsDir, | |
| toArtifacts => $::gSimRelStableDir, | |
| fromDoc => $::gDocBaseDir, | |
| toDoc => $::gDocReleaseStableDir, | |
| rcpDir => $::gSimRelStableRcpDir, | |
| title => "Trace Compass Release Candidate", | |
| email => $::gMileStoneEmailBase, | |
| addon => "The corresponding RCP can be downloaded from: | |
| $::gSimRelStableRcpDir\ | |
| \ | |
| I've also created the release branch $::gStableBranchName.\ | |
| \ | |
| Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease RC2 will be <TODO>\ | |
| RC2 will be the final build for this release.\ | |
| \ | |
| Reminders: | |
| - RC1 is API and feature freeze for this release. | |
| - For any fixes that need to go into the $::gSimReleaseNameUpperCase release, please provide a | |
| bug report, submit a patch on master first and then cherry-pick it | |
| on $::gStableBranchName branch after it's merged to master.\ | |
| $::gGreeting", | |
| reminder => $::gReminders."\ | |
| - Create $::gStableBranchName\ | |
| - Update and enable tracecompass-stable-release-nightly-new job on Hudson to build $::gStableBranchName branch\n", | |
| }, | |
| "rc2" => { | |
| from => $::gSimRelStableRepositoryDir, | |
| to => $::gMilestoneDir, | |
| fromArtifacts => $::gSimRelStableDir, | |
| toArtifacts => $::gBackupArtifactDir, | |
| fromDoc => $::gDocReleaseStableDir, | |
| toDoc => $::gBackupDocDir, | |
| email => $::gMileStoneEmailBase, | |
| addon => "The corresponding RCP can be downloaded from: | |
| $::gSimRelStableRcpDir\ | |
| \ | |
| This is the final build for Trace Compass $::gTraceCompassRelease/$::gSimReleaseNameUpperCase.$::gUpdateRelease.\ | |
| The release will take place on <TODO>.\ | |
| $::gGreeting", | |
| reminder => $::gReminders."\ | |
| - Disable tracecompass-stable-release-nightly-new job on Hudson\n", | |
| }, | |
| "release" => { | |
| from => $::gBackupArtifactDir, | |
| to => $::gFinalReleaseDir, | |
| fromArtifacts => $::gBackupArtifactDir, | |
| toArtifacts => $::gStableDir, | |
| fromDoc => $::gBackupDocDir, | |
| toDoc => $::gDocStableDir, | |
| rcpDir => $::gFinalReleaseRcpDir, | |
| stableRcpDir => $::gStableRcpDir, | |
| title => "Trace Compass Release $::gTraceCompassRelease", | |
| stableTitle => "Trace Compass Latest Stable Version", | |
| email => $::gReleaseEmail, | |
| addon => "", | |
| reminder => $::gReminders."\ | |
| - Update the Trace Compass download page at https://projects.eclipse.org/projects/tools.tracecompass/downloads\ | |
| - Update tracecompass-stable-nightly job on Hudson to build $::gStableBranchName branch\ | |
| - In Eclipse, tag commit with release tag v$::gTraceCompassRelease push to the main repository\ | |
| - Upload test report to the Eclipse wiki and update Test Reports wiki page\ | |
| - Create target baseline\n", | |
| } | |
| ); | |
| ################################################################################ | |
| # Validate milestone parameter and if relevant directories exists | |
| ################################################################################ | |
| if (!defined $::G_MILESTONES_HASH{$::gMilestone}) | |
| { | |
| die "$::me-error: Milestone $::gMilestone not supported" | |
| } | |
| if (!-d $::G_MILESTONES_HASH{$::gMilestone}{from}) | |
| { | |
| die "$::me-error: Milestone directory $::G_MILESTONES_HASH{$::gMilestone}{from} doesn't exists" | |
| } | |
| if (-d $::G_MILESTONES_HASH{$::gMilestone}{to}) | |
| { | |
| die "$::me-error: Milestone directory $::G_MILESTONES_HASH{$::gMilestone}{to} already exists" | |
| } | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{fromArtifacts})) | |
| { | |
| if (! -d $::G_MILESTONES_HASH{$::gMilestone}{fromArtifacts}) | |
| { | |
| die "$::me-error: Artifacts directory $::G_MILESTONES_HASH{$::gMilestone}{fromArtifacts} doesn't exists" | |
| } | |
| } | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{fromDoc})) | |
| { | |
| if (! -d $::G_MILESTONES_HASH{$::gMilestone}{fromDoc}) | |
| { | |
| die "$::me-error: Doc directory $::G_MILESTONES_HASH{$::gMilestone}{fromDoc} doesn't exists" | |
| } | |
| } | |
| ################################################################################ | |
| # Create milestones and stable base directories | |
| ################################################################################ | |
| if (! -d $::gMilestoneBaseDir) | |
| { | |
| System("mkdir -p $::gMilestoneBaseDir"); | |
| System("mkdir -p $::gSimRelStableDir"); | |
| } | |
| ################################################################################ | |
| # Create simRel milestone or release directory | |
| ################################################################################ | |
| System("mkdir -p $::G_MILESTONES_HASH{$::gMilestone}{to}"); | |
| ################################################################################ | |
| # After each milestone build (not release) | |
| # - Update files composite update site | |
| ################################################################################ | |
| chdir($::G_MILESTONES_HASH{$::gMilestone}{to}); | |
| if ($::gMilestone ne "release") | |
| { | |
| createCompositeFiles ($::gMilestoneBaseDir, $::gSimReleaseName, "$::G_UPDATE_RELEASE_HASH{$::gUpdateRelease}$::gMilestone"); | |
| } | |
| ################################################################################ | |
| # Copy files and directories | |
| ################################################################################ | |
| System("cp -r $::G_MILESTONES_HASH{$::gMilestone}{from}* $::G_MILESTONES_HASH{$::gMilestone}{to}"); | |
| ################################################################################ | |
| # - Create artifacts directory, if needed | |
| # - Delete old artifacts directory content, if needed. | |
| # - Save rcp, repository and rcp-repository in artifacts directory. | |
| ################################################################################ | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{toArtifacts})) | |
| { | |
| if (-d $::G_MILESTONES_HASH{$::gMilestone}{toArtifacts}) | |
| { | |
| System("\\rm -rf $::G_MILESTONES_HASH{$::gMilestone}{toArtifacts}*"); | |
| } | |
| else | |
| { | |
| System("mkdir -p $::G_MILESTONES_HASH{$::gMilestone}{toArtifacts}"); | |
| } | |
| System("cp -r $::G_MILESTONES_HASH{$::gMilestone}{fromArtifacts}r* $::G_MILESTONES_HASH{$::gMilestone}{toArtifacts}"); | |
| } | |
| ################################################################################ | |
| # - Create doc directory, if needed | |
| # - Delete old doc directory content, if needed. | |
| # - Save docs in doc directory | |
| ################################################################################ | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{fromDoc})) | |
| { | |
| if (-d $::G_MILESTONES_HASH{$::gMilestone}{toDoc}) | |
| { | |
| System("\\rm -rf $::G_MILESTONES_HASH{$::gMilestone}{toDoc}*"); | |
| } | |
| else | |
| { | |
| System("mkdir -p $::G_MILESTONES_HASH{$::gMilestone}{toDoc}"); | |
| } | |
| System("cp -r $::G_MILESTONES_HASH{$::gMilestone}{fromDoc}org* $::G_MILESTONES_HASH{$::gMilestone}{toDoc}"); | |
| } | |
| ################################################################################ | |
| # Update index.php in RCP directory | |
| ################################################################################ | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{rcpDir}) ) | |
| { | |
| debug("Update index.php"); | |
| updateIndexPhp($::G_MILESTONES_HASH{$::gMilestone}{rcpDir}, $::G_MILESTONES_HASH{$::gMilestone}{title}); | |
| } | |
| if (defined($::G_MILESTONES_HASH{$::gMilestone}{stableRcpDir}) ) | |
| { | |
| debug("Update index.php in stable"); | |
| updateIndexPhp($::G_MILESTONES_HASH{$::gMilestone}{stableRcpDir}, $::G_MILESTONES_HASH{$::gMilestone}{stableTitle}); | |
| } | |
| my $email = $::G_MILESTONES_HASH{$::gMilestone}{email}.$::G_MILESTONES_HASH{$::gMilestone}{addon}; | |
| $email =~ s/$::gBaseDir/$http/eeg; | |
| print ("\n################################################################################\n"); | |
| print ($::G_MILESTONES_HASH{$::gMilestone}{reminder}); | |
| print ("- Send email to mailing list:\n$email"); | |
| print ("\n################################################################################\n"); | |
| ################################################################################ | |
| # subroutines | |
| ################################################################################ | |
| sub System | |
| { | |
| debug("@_"); | |
| if (system(@_) != 0) | |
| { | |
| print "\n"; | |
| exit -1; | |
| } | |
| } | |
| sub createCompositeFiles | |
| { | |
| debug("Create CompositeArtifact.xml"); | |
| createCompositeFile(@_, "artifact"); | |
| debug("Create CompositeContent.xml"); | |
| createCompositeFile(@_, "content"); | |
| } | |
| sub createCompositeFile | |
| { | |
| my $location = shift; | |
| my $release = shift; | |
| my $milestone = shift; | |
| my $what = shift; | |
| my $compositeFile = "$location/compositeArtifacts.xml"; | |
| my $tag = "compositeArtifactRepository"; | |
| my $type = "org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository"; | |
| if ($what eq "content") | |
| { | |
| $compositeFile = "$location/compositeContent.xml"; | |
| $tag = "compositeMetadataRepository"; | |
| $type = "org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository"; | |
| } | |
| my $count = 1; | |
| my @children; | |
| if (-e $compositeFile) | |
| { | |
| open FH_IN, "$compositeFile" | |
| or die "$::me-error: could not open $compositeFile\n"; | |
| while (<FH_IN>) | |
| { | |
| if (/<child location="\S+"\/>/) | |
| { | |
| $_ =~ s/^\s*//; # removing leading whitespaces | |
| $_ =~ s/\s*$//; # removing ending whitespaces | |
| $_ =~ s/<child location="(\S+)"\/>/$1/; | |
| $children[$count] = $_; | |
| $count++; | |
| } | |
| } | |
| close FH_IN; | |
| } | |
| open FH_OUT, ">$compositeFile" or die "$::me-error: Could not open $compositeFile"; | |
| print FH_OUT "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; | |
| print FH_OUT "<?$tag version='1.0.0'?>\n"; | |
| print FH_OUT "<repository name=\""Trace Compass $release Milestone Site"\" type=\"$type\" version=\"1.0.0\">\n"; | |
| print FH_OUT " <properties size=\"1\">"; | |
| print FH_OUT " <property name=\"p2.timestamp\" value=\"1380637685016\"/>\n"; | |
| print FH_OUT " </properties>\n"; | |
| print FH_OUT " <children size=\"$count\">\n"; | |
| for (my $i = 1 ; $i <= $#children ; $i++) | |
| { | |
| print FH_OUT " <child location=\"$children[$i]\"/>\n"; | |
| } | |
| print FH_OUT " <child location=\"$milestone\"/>\n"; | |
| print FH_OUT " </children>\n"; | |
| print FH_OUT "</repository>\n"; | |
| close FH_OUT; | |
| } | |
| sub updateIndexPhp | |
| { | |
| my $location=shift; | |
| my $title=shift; | |
| my $indexFile = "$location/index.php"; | |
| my $tmpFile = "$indexFile.tmp"; | |
| if (! -e $indexFile) | |
| { | |
| print STDERR "$location/index.php doesn't exist"; | |
| return; | |
| } | |
| open FH_IN, "$indexFile" | |
| or die "$::me-error: could not open $indexFile\n"; | |
| open FH_OUT, ">$tmpFile" | |
| or die "$::me-error: Could not open $tmpFile"; | |
| while (<FH_IN>) | |
| { | |
| if (/<title>Trace Compass/) | |
| { | |
| print FH_OUT "<title>$title</title>\n"; | |
| } | |
| elsif (/.*echo.*Trace Compass.*/) | |
| { | |
| print FH_OUT "echo \"<tr class=\\\"h\\\"><td colspan=\\\"3\\\"><h1 class=\\\"p\\\">$title</h1></td></tr>\";\n"; | |
| } | |
| else | |
| { | |
| print FH_OUT $_; | |
| } | |
| } | |
| System("\\rm -f $indexFile"); | |
| System("mv -f $tmpFile $indexFile"); | |
| close FH_IN; | |
| close FH_OUT; | |
| } |