michael@0: #!/usr/bin/perl -w michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: package Moz::Milestone; michael@0: use strict; michael@0: michael@0: use vars qw($officialMilestone michael@0: $milestone); michael@0: michael@0: local $Moz::Milestone::milestone; michael@0: local $Moz::Milestone::officialMilestone; michael@0: michael@0: # michael@0: # Usage: getOfficialMilestone($milestoneFile) michael@0: # Returns full milestone (x.x.x.x[ab12pre+]) michael@0: # michael@0: sub getOfficialMilestone($) { michael@0: my $mfile = $_[0]; michael@0: open(FILE,"$mfile") || michael@0: die ("Can't open $mfile for reading!"); michael@0: michael@0: my $num = ; michael@0: while($num =~ /^\s*#/ || $num !~ /^\d/) { michael@0: $num = ; michael@0: } michael@0: michael@0: close(FILE); michael@0: if ($num !~ /^\d/) { return; } michael@0: chomp($num); michael@0: # Remove extra ^M caused by using dos-mode line-endings michael@0: chop $num if (substr($num, -1, 1) eq "\r"); michael@0: $Moz::Milestone::officialMilestone = $num; michael@0: $Moz::Milestone::milestone = &getMilestoneNum; michael@0: return $num; michael@0: } michael@0: michael@0: # michael@0: # Usage: getMilestoneNum($num) michael@0: # Returns: milestone without a + if it exists. michael@0: # michael@0: sub getMilestoneNum { michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: return $Moz::Milestone::milestone; michael@0: } michael@0: michael@0: if (defined($Moz::Milestone::officialMilestone)) { michael@0: $Moz::Milestone::milestone = $Moz::Milestone::officialMilestone; michael@0: } else { michael@0: $Moz::Milestone::milestone = $_[0]; michael@0: } michael@0: michael@0: if ($Moz::Milestone::milestone =~ /\+$/) { # for x.x.x+, strip off the + michael@0: $Moz::Milestone::milestone =~ s/\+$//; michael@0: } michael@0: michael@0: return $Moz::Milestone::milestone; michael@0: } michael@0: michael@0: # michael@0: # Usage: getMilestoneQualifier($num) michael@0: # Returns: + if it exists. michael@0: # michael@0: sub getMilestoneQualifier { michael@0: my $milestoneQualifier; michael@0: if (defined($Moz::Milestone::officialMilestone)) { michael@0: $milestoneQualifier = $Moz::Milestone::officialMilestone; michael@0: } else { michael@0: $milestoneQualifier = $_[0]; michael@0: } michael@0: michael@0: if ($milestoneQualifier =~ /\+$/) { michael@0: return "+"; michael@0: } michael@0: } michael@0: michael@0: sub getMilestoneMajor { michael@0: my $milestoneMajor; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneMajor = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneMajor = $_[0]; michael@0: } michael@0: my @parts = split(/\./,$milestoneMajor); michael@0: return $parts[0]; michael@0: } michael@0: michael@0: sub getMilestoneMinor { michael@0: my $milestoneMinor; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneMinor = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneMinor = $_[0]; michael@0: } michael@0: my @parts = split(/\./,$milestoneMinor); michael@0: michael@0: if ($#parts < 1 ) { return 0; } michael@0: return $parts[1]; michael@0: } michael@0: michael@0: sub getMilestoneMini { michael@0: my $milestoneMini; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneMini = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneMini = $_[0]; michael@0: } michael@0: my @parts = split(/\./,$milestoneMini); michael@0: michael@0: if ($#parts < 2 ) { return 0; } michael@0: return $parts[2]; michael@0: } michael@0: michael@0: sub getMilestoneMicro { michael@0: my $milestoneMicro; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneMicro = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneMicro = $_[0]; michael@0: } michael@0: my @parts = split(/\./,$milestoneMicro); michael@0: michael@0: if ($#parts < 3 ) { return 0; } michael@0: return $parts[3]; michael@0: } michael@0: michael@0: sub getMilestoneAB { michael@0: my $milestoneAB; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneAB = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneAB = $_[0]; michael@0: } michael@0: michael@0: if ($milestoneAB =~ /a/) { return "alpha"; } michael@0: if ($milestoneAB =~ /b/) { return "beta"; } michael@0: return "final"; michael@0: } michael@0: michael@0: # michael@0: # Usage: getMilestoneABWithNum($milestoneFile) michael@0: # Returns the alpha and beta tag with its number (a1, a2, b3, ...) michael@0: # michael@0: sub getMilestoneABWithNum { michael@0: my $milestoneABNum; michael@0: if (defined($Moz::Milestone::milestone)) { michael@0: $milestoneABNum = $Moz::Milestone::milestone; michael@0: } else { michael@0: $milestoneABNum = $_[0]; michael@0: } michael@0: michael@0: if ($milestoneABNum =~ /([ab]\d+)/) { michael@0: return $1; michael@0: } else { michael@0: return ""; michael@0: } michael@0: } michael@0: michael@0: # michael@0: # build_file($template_file,$output_file) michael@0: # michael@0: sub build_file($$) { michael@0: my @FILE; michael@0: my @MILESTONE_PARTS; michael@0: my $MINI_VERSION = 0; michael@0: my $MICRO_VERSION = 0; michael@0: my $OFFICIAL = 0; michael@0: my $QUALIFIER = ""; michael@0: michael@0: if (!defined($Moz::Milestone::milestone)) { die("$0: no milestone file set!\n"); } michael@0: @MILESTONE_PARTS = split(/\./, &getMilestoneNum); michael@0: if ($#MILESTONE_PARTS >= 2) { michael@0: $MINI_VERSION = 1; michael@0: } else { michael@0: $MILESTONE_PARTS[2] = 0; michael@0: } michael@0: if ($#MILESTONE_PARTS >= 3) { michael@0: $MICRO_VERSION = 1; michael@0: } else { michael@0: $MILESTONE_PARTS[3] = 0; michael@0: } michael@0: if (! &getMilestoneQualifier) { michael@0: $OFFICIAL = 1; michael@0: } else { michael@0: $QUALIFIER = "+"; michael@0: } michael@0: michael@0: if (-e $_[0]) { michael@0: open(FILE, "$_[0]") || die("$0: Can't open $_[0] for reading!\n"); michael@0: @FILE = ; michael@0: close(FILE); michael@0: michael@0: open(FILE, ">$_[1]") || die("$0: Can't open $_[1] for writing!\n"); michael@0: michael@0: # michael@0: # There will be more of these based on what we need for files. michael@0: # michael@0: foreach(@FILE) { michael@0: s/__MOZ_MAJOR_VERSION__/$MILESTONE_PARTS[0]/g; michael@0: s/__MOZ_MINOR_VERSION__/$MILESTONE_PARTS[1]/g; michael@0: s/__MOZ_MINI_VERSION__/$MILESTONE_PARTS[2]/g; michael@0: s/__MOZ_MICRO_VERSION__/$MILESTONE_PARTS[3]/g; michael@0: if ($MINI_VERSION) { michael@0: s/__MOZ_OPTIONAL_MINI_VERSION__/.$MILESTONE_PARTS[2]/g; michael@0: } michael@0: if ($MICRO_VERSION) { michael@0: s/__MOZ_OPTIONAL_MICRO_VERSION__/.$MILESTONE_PARTS[3]/g; michael@0: } michael@0: michael@0: print FILE $_; michael@0: } michael@0: close(FILE); michael@0: } else { michael@0: die("$0: $_[0] doesn't exist for autoversioning!\n"); michael@0: } michael@0: michael@0: } michael@0: michael@0: 1;