1#!/usr/bin/perl -w 2# This Source Code Form is subject to the terms of the Mozilla Public 3# License, v. 2.0. If a copy of the MPL was not distributed with this 4# file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 6package Moz::Milestone; 7use strict; 8 9use vars qw($officialMilestone 10 $milestone); 11 12local $Moz::Milestone::milestone; 13local $Moz::Milestone::officialMilestone; 14 15# 16# Usage: getOfficialMilestone($milestoneFile) 17# Returns full milestone (x.x.x.x[ab12pre+]) 18# 19sub getOfficialMilestone($) { 20 my $mfile = $_[0]; 21 open(FILE,"$mfile") || 22 die ("Can't open $mfile for reading!"); 23 24 my $num = <FILE>; 25 while($num =~ /^\s*#/ || $num !~ /^\d/) { 26 $num = <FILE>; 27 } 28 29 close(FILE); 30 if ($num !~ /^\d/) { return; } 31 chomp($num); 32 # Remove extra ^M caused by using dos-mode line-endings 33 chop $num if (substr($num, -1, 1) eq "\r"); 34 $Moz::Milestone::officialMilestone = $num; 35 $Moz::Milestone::milestone = &getMilestoneNum; 36 return $num; 37} 38 39# 40# Usage: getMilestoneNum($num) 41# Returns: milestone without a + if it exists. 42# 43sub getMilestoneNum { 44 if (defined($Moz::Milestone::milestone)) { 45 return $Moz::Milestone::milestone; 46 } 47 48 if (defined($Moz::Milestone::officialMilestone)) { 49 $Moz::Milestone::milestone = $Moz::Milestone::officialMilestone; 50 } else { 51 $Moz::Milestone::milestone = $_[0]; 52 } 53 54 if ($Moz::Milestone::milestone =~ /\+$/) { # for x.x.x+, strip off the + 55 $Moz::Milestone::milestone =~ s/\+$//; 56 } 57 58 return $Moz::Milestone::milestone; 59} 60 61# 62# Usage: getMilestoneQualifier($num) 63# Returns: + if it exists. 64# 65sub getMilestoneQualifier { 66 my $milestoneQualifier; 67 if (defined($Moz::Milestone::officialMilestone)) { 68 $milestoneQualifier = $Moz::Milestone::officialMilestone; 69 } else { 70 $milestoneQualifier = $_[0]; 71 } 72 73 if ($milestoneQualifier =~ /\+$/) { 74 return "+"; 75 } 76} 77 78sub getMilestoneMajor { 79 my $milestoneMajor; 80 if (defined($Moz::Milestone::milestone)) { 81 $milestoneMajor = $Moz::Milestone::milestone; 82 } else { 83 $milestoneMajor = $_[0]; 84 } 85 my @parts = split(/\./,$milestoneMajor); 86 return $parts[0]; 87} 88 89sub getMilestoneMinor { 90 my $milestoneMinor; 91 if (defined($Moz::Milestone::milestone)) { 92 $milestoneMinor = $Moz::Milestone::milestone; 93 } else { 94 $milestoneMinor = $_[0]; 95 } 96 my @parts = split(/\./,$milestoneMinor); 97 98 if ($#parts < 1 ) { return 0; } 99 return $parts[1]; 100} 101 102sub getMilestoneMini { 103 my $milestoneMini; 104 if (defined($Moz::Milestone::milestone)) { 105 $milestoneMini = $Moz::Milestone::milestone; 106 } else { 107 $milestoneMini = $_[0]; 108 } 109 my @parts = split(/\./,$milestoneMini); 110 111 if ($#parts < 2 ) { return 0; } 112 return $parts[2]; 113} 114 115sub getMilestoneMicro { 116 my $milestoneMicro; 117 if (defined($Moz::Milestone::milestone)) { 118 $milestoneMicro = $Moz::Milestone::milestone; 119 } else { 120 $milestoneMicro = $_[0]; 121 } 122 my @parts = split(/\./,$milestoneMicro); 123 124 if ($#parts < 3 ) { return 0; } 125 return $parts[3]; 126} 127 128sub getMilestoneAB { 129 my $milestoneAB; 130 if (defined($Moz::Milestone::milestone)) { 131 $milestoneAB = $Moz::Milestone::milestone; 132 } else { 133 $milestoneAB = $_[0]; 134 } 135 136 if ($milestoneAB =~ /a/) { return "alpha"; } 137 if ($milestoneAB =~ /b/) { return "beta"; } 138 return "final"; 139} 140 141# 142# Usage: getMilestoneABWithNum($milestoneFile) 143# Returns the alpha and beta tag with its number (a1, a2, b3, ...) 144# 145sub getMilestoneABWithNum { 146 my $milestoneABNum; 147 if (defined($Moz::Milestone::milestone)) { 148 $milestoneABNum = $Moz::Milestone::milestone; 149 } else { 150 $milestoneABNum = $_[0]; 151 } 152 153 if ($milestoneABNum =~ /([ab]\d+)/) { 154 return $1; 155 } else { 156 return ""; 157 } 158} 159 160# 161# build_file($template_file,$output_file) 162# 163sub build_file($$) { 164 my @FILE; 165 my @MILESTONE_PARTS; 166 my $MINI_VERSION = 0; 167 my $MICRO_VERSION = 0; 168 my $OFFICIAL = 0; 169 my $QUALIFIER = ""; 170 171 if (!defined($Moz::Milestone::milestone)) { die("$0: no milestone file set!\n"); } 172 @MILESTONE_PARTS = split(/\./, &getMilestoneNum); 173 if ($#MILESTONE_PARTS >= 2) { 174 $MINI_VERSION = 1; 175 } else { 176 $MILESTONE_PARTS[2] = 0; 177 } 178 if ($#MILESTONE_PARTS >= 3) { 179 $MICRO_VERSION = 1; 180 } else { 181 $MILESTONE_PARTS[3] = 0; 182 } 183 if (! &getMilestoneQualifier) { 184 $OFFICIAL = 1; 185 } else { 186 $QUALIFIER = "+"; 187 } 188 189 if (-e $_[0]) { 190 open(FILE, "$_[0]") || die("$0: Can't open $_[0] for reading!\n"); 191 @FILE = <FILE>; 192 close(FILE); 193 194 open(FILE, ">$_[1]") || die("$0: Can't open $_[1] for writing!\n"); 195 196 # 197 # There will be more of these based on what we need for files. 198 # 199 foreach(@FILE) { 200 s/__MOZ_MAJOR_VERSION__/$MILESTONE_PARTS[0]/g; 201 s/__MOZ_MINOR_VERSION__/$MILESTONE_PARTS[1]/g; 202 s/__MOZ_MINI_VERSION__/$MILESTONE_PARTS[2]/g; 203 s/__MOZ_MICRO_VERSION__/$MILESTONE_PARTS[3]/g; 204 if ($MINI_VERSION) { 205 s/__MOZ_OPTIONAL_MINI_VERSION__/.$MILESTONE_PARTS[2]/g; 206 } 207 if ($MICRO_VERSION) { 208 s/__MOZ_OPTIONAL_MICRO_VERSION__/.$MILESTONE_PARTS[3]/g; 209 } 210 211 print FILE $_; 212 } 213 close(FILE); 214 } else { 215 die("$0: $_[0] doesn't exist for autoversioning!\n"); 216 } 217 218} 219 2201; 221