diff --git a/mozilla/webtools/aus/tests/Verify.py b/mozilla/webtools/aus/tests/Verify.py index 947aef7ac8c..104ba88a193 100755 --- a/mozilla/webtools/aus/tests/Verify.py +++ b/mozilla/webtools/aus/tests/Verify.py @@ -31,6 +31,7 @@ class Verify(ColumnFixture): "dist": "String", "distVersion": "String", "force": "String", + "newchannel": "String", "licenseUrl": "String", "lastURI": "String", "newURI": "String", @@ -57,6 +58,7 @@ class Verify(ColumnFixture): self.dist = "" self.distVersion = "" self.force = "" + self.newchannel = "" # For storign the last retrieved AUS XML and its URI. self.lastURI = "" @@ -86,7 +88,7 @@ class Verify(ColumnFixture): def hasLicenseUrl(self): return (self.licenseUrl in self.getXml()) - # Check to see if the XML has a licenseURL. + # Check to see if the XML has force set. def hasForce (self): return ('force=1' in self.getXml()) @@ -156,6 +158,9 @@ class Verify(ColumnFixture): if (self.force == 'true'): url += '?force=1' + if (self.newchannel != "NULL"): + url += '?newchannel=' + self.newchannel + return url diff --git a/mozilla/webtools/aus/tests/Verify.txt b/mozilla/webtools/aus/tests/Verify.txt index dba5366ef03..aa8545c6952 100644 --- a/mozilla/webtools/aus/tests/Verify.txt +++ b/mozilla/webtools/aus/tests/Verify.txt @@ -179,3 +179,9 @@ |build|channel|complete|partial|hasUpdate?|hasComplete?|hasPartial?|isValidXml?| |1000000001|channel|complete001|partial001|true|true|false|true| |1000000002|channel|complete002|partial002|true|true|true|true| + +!1 Channel changing (newchannel) + 2 newchannel with release works +|aus.Verify|${host}|3|${product}|${version}|${platform}|${locale}|${osVersion}| +|build|channel|complete|partial|newchannel|hasUpdate?|hasComplete?|hasPartial?|isValidXml?| +|1000000002|channel|complete002|partial002|channel|true|true|false|true| diff --git a/mozilla/webtools/aus/xml/inc/config-dist.php b/mozilla/webtools/aus/xml/inc/config-dist.php index 707a2deda89..82cd0ef055f 100644 --- a/mozilla/webtools/aus/xml/inc/config-dist.php +++ b/mozilla/webtools/aus/xml/inc/config-dist.php @@ -156,6 +156,16 @@ $productBranchVersions = array( ), ); +// Specify which release should be used for channel-changers wanting to go to +// release or beta channels. + +$latestRelease = array( + 'Firefox' => array( + 'beta' => '5.0', + 'release' => '5.0' + ) +); + // Config for memcache. define('MEMCACHE_NAMESPACE', 'aus'); // set memcache namespace. Keep this string as short and simple as possible. define('MEMCACHE_EXPIRE', 1800); // how long items are stored in memcache diff --git a/mozilla/webtools/aus/xml/inc/patch.class.php b/mozilla/webtools/aus/xml/inc/patch.class.php index 87064e9fc2f..1a2ddfac6bb 100644 --- a/mozilla/webtools/aus/xml/inc/patch.class.php +++ b/mozilla/webtools/aus/xml/inc/patch.class.php @@ -65,6 +65,9 @@ class Patch extends AUS_Object { // Array the defines which channels are flagged as 'nightly' channels. var $nightlyChannels; + // Array that defines which releases are considered the latest, for channel-changing purposes. + var $latestRelease; + // Valid patch flag. var $isPatch; @@ -81,13 +84,18 @@ class Patch extends AUS_Object { var $hasUpdateInfo; var $hasDetailsUrl; + // Is this a channel-changing request? + var $isChangingChannel; + /** * Constructor. */ - function Patch($productBranchVersions=array(),$nightlyChannels,$type='complete') { + function Patch($productBranchVersions=array(),$nightlyChannels,$type='complete',$latestRelease=null) { $this->setProductBranchVersions($productBranchVersions); $this->setNightlyChannels($nightlyChannels); + $this->setVar('latestRelease',$latestRelease); $this->setVar('isPatch',false); + $this->setVar('isChangingChannel',false); $this->setVar('patchType',$type); $this->setVar('updateType','minor'); $this->setVar('hasUpdateInfo',false); @@ -257,18 +265,35 @@ class Patch extends AUS_Object { // Determine the branch of the client's version. $branchVersion = $this->getBranch($product,$version,$channel); - // Otherwise, if it is a complete patch and a nightly channel, force the complete update to take the user to the latest build. - if ($this->isComplete() && $this->isNightlyChannel($channel)) { + if ($this->isComplete()) { + // If it is a complete patch and a nightly channel, force the complete update to take the user to the latest build. + if ($this->isNightlyChannel($channel) || $this->isChangingChannel()) { + $buildSource = 3; + if ($this->isNightlyChannel($channel)) { + $buildSource = 2; + } else { + if (isset($this->latestRelease[$product][$channel])) { + $branchVersion = $this->latestRelease[$product][$channel]; + if (!$branchVersion) { + return false; + } + } + } - // Get the latest build that has an update for this branch. - $latestCompleteBuild = $this->getLatestCompleteBuild($product,$branchVersion,$platform,$locale); - - // If we have the latest complete build, the path is valid, the file exists, and the filesize is greater than zero, we have a valid complete patch. - if ($latestCompleteBuild && $this->setPath($product,$platform,$locale,$branchVersion,$latestCompleteBuild,2,$channel) && file_exists($this->path) && filesize($this->path) > 0) { - $this->setSnippet($this->path); - return $this->isNewerBuild($build); + // Get the latest build that has an update for this branch. + $latestCompleteBuild = $this->getLatestCompleteBuild($product,$branchVersion,$platform,$locale,$buildSource,$channel); + + // If we have the latest complete build, the path is valid, the file exists, and the filesize is greater than zero, we have a valid complete patch. + if ($latestCompleteBuild && $this->setPath($product,$platform,$locale,$branchVersion,$latestCompleteBuild,$buildSource,$channel) && file_exists($this->path) && filesize($this->path) > 0) { + $this->setSnippet($this->path); + if ($this->isChangingChannel()) { + return true; + } elseif ($this->isNightlyChannel($channel)) { + return $this->isNewerBuild($build); + } + } } - } + } // Otherwise, check for the partial snippet info. If an update exists, pass it along. if ($this->isPartial() && $this->isNightlyChannel($channel) && $this->setPath($product,$platform,$locale,$branchVersion,$build,2,$channel) && file_exists($this->path) && filesize($this->path) > 0) { @@ -325,6 +350,25 @@ class Patch extends AUS_Object { return in_array($channel,$this->nightlyChannels); } + /** + * Set whether this is a channel-changing request. + * + * @param boolean $option + * @return boolean + */ + function setChangingChannel($option) { + return $this->setVar('isChangingChannel', $option, true); + } + + /** + * Determine whether or not this is a channel-changing request. + * + * @return boolean + */ + function isChangingChannel() { + return $this->isChangingChannel; + } + /** * Determine whether or not the incoming version matches a (wildcard) version pattern * @@ -448,10 +492,10 @@ class Patch extends AUS_Object { * @param string $platform * @param return string|false false if there is no matching build */ - function getLatestCompleteBuild($product,$branchVersion,$platform,$locale) { + function getLatestCompleteBuild($product,$branchVersion,$platform,$locale,$buildSource,$channel) { $files = array(); - $dir = SOURCE_DIR.'/2/'.$product.'/'.$branchVersion.'/'.$platform; + $dir = SOURCE_DIR.'/'.$buildSource.'/'.$product.'/'.$branchVersion.'/'.$platform; // Find the build ids for the given product/branchVersion/platform. The last complete update // is normally found in the second-to-last build directory. @@ -472,7 +516,10 @@ class Patch extends AUS_Object { // Return the directory with the non-empty complete.txt, which is the latest available build foreach ($files as $buildID) { if (!empty($buildID) && is_numeric($buildID)) { - $testPath = $dir.'/'.$buildID.'/'.$locale.'/complete.txt'; + $testPath = $dir.'/'.$buildID.'/'.$locale.'/'.$channel.'/complete.txt'; + if ($this->isNightlyChannel($channel)) { + $testPath = $dir.'/'.$buildID.'/'.$locale.'/complete.txt'; + } if (file_exists($testPath) && filesize($testPath) > 0) { return $buildID; } @@ -481,7 +528,7 @@ class Patch extends AUS_Object { } // By default we return false, meaning that there is no latest complete update. - // Doing so means no updates for the nightly channel. + // Doing so means no updates for this channel. return false; } diff --git a/mozilla/webtools/aus/xml/index.php b/mozilla/webtools/aus/xml/index.php index 15076e407d4..717a22faaaf 100644 --- a/mozilla/webtools/aus/xml/index.php +++ b/mozilla/webtools/aus/xml/index.php @@ -72,6 +72,11 @@ $rawPath = substr(urldecode($_SERVER['QUERY_STRING']),5,255); // Munge he resulting string and store it in $path. $path = explode('/',$rawPath); +// Check to see if the user is requesting channel changing. +if ( !(empty($_GET['newchannel']))) { + $newchannel = $_GET['newchannel']; +} + // Determine incoming request and clean inputs. $clean = Array(); $clean['updateVersion'] = isset($path[0]) ? intval($path[0]) : null; @@ -84,6 +89,7 @@ $clean['channel'] = isset($path[6]) ? trim($path[6]) : null; $clean['platformVersion'] = isset($path[7]) ? trim($path[7]) : null; $clean['dist'] = isset($path[8]) ? trim($path[8]) : null; $clean['distVersion'] = isset($path[9]) ? trim($path[9]) : null; +$clean['newchannel'] = isset($newchannel) ? trim($newchannel) : null; // Check to see if we have a beta on PPC, and if so don't update since beta 4 // doesn't work on PPC. See bug 588412. @@ -192,10 +198,16 @@ if ($_cached_xml) { $update = new Update(); // Instantiate our complete patch. - $completePatch = new Patch($productBranchVersions,$nightlyChannels,'complete'); + $completePatch = new Patch($productBranchVersions,$nightlyChannels,'complete',$latestRelease); + + $channel = $clean['channel']; + if (isset($clean['newchannel'])) { + $completePatch->setChangingChannel(true); + $channel = $clean['newchannel']; + } // If our complete patch exists and is valid, set the patch line. - if ($completePatch->findPatch($clean['product'],$clean['platform'],$clean['locale'],$clean['version'],$clean['build'],$clean['channel']) && $completePatch->isPatch()) { + if ($completePatch->findPatch($clean['product'],$clean['platform'],$clean['locale'],$clean['version'],$clean['build'],$channel) && $completePatch->isPatch()) { // Set our patchLine. $xml->setPatchLine($completePatch); @@ -223,16 +235,20 @@ if ($_cached_xml) { } } - // Instantiate our partial patch. - $partialPatch = new Patch($productBranchVersions,$nightlyChannels,'partial'); + // if we are channel-switching, do not check for partial updates. + if (!isset($clean['newchannel'])) { - // If our partial patch exists and is valid, set the patch line. - if ($partialPatch->findPatch($clean['product'],$clean['platform'],$clean['locale'],$clean['version'],$clean['build'],$clean['channel']) - && $partialPatch->isPatch() - && $partialPatch->isOneStepFromLatest($completePatch->build)) { - $xml->setPatchLine($partialPatch); - } + // Instantiate our partial patch. + $partialPatch = new Patch($productBranchVersions,$nightlyChannels,'partial'); + + // If our partial patch exists and is valid, set the patch line. + if ($partialPatch->findPatch($clean['product'],$clean['platform'],$clean['locale'],$clean['version'],$clean['build'],$clean['channel']) + && $partialPatch->isPatch() + && $partialPatch->isOneStepFromLatest($completePatch->build)) { + $xml->setPatchLine($partialPatch); + } + } // If we have valid patchLine(s), set up our output. if ($xml->hasPatchLine() && $completePatch->isSupported($completePatch->updateType, $clean['product'], $clean['version'], $clean['platformVersion'], $unsupportedPlatforms)) { $xml->startUpdate($update);