/** * Adds or updates the flagged revision table for this page/id set * @param Revision $rev The revision to be accepted * @param FlaggedRevision $oldFrev Currently accepted version of $rev or null * @throws MWException * @return bool|array true on success, array of errors on failure */ private function approveRevision(Revision $rev, FlaggedRevision $oldFrev = null) { wfProfileIn(__METHOD__); # Revision rating flags $flags = $this->dims; $quality = 0; // quality tier from flags if (FlaggedRevs::isQuality($flags)) { $quality = FlaggedRevs::isPristine($flags) ? 2 : 1; } # Our template/file version pointers list($tmpVersions, $fileVersions) = self::getIncludeVersions($this->templateParams, $this->imageParams); # If this is an image page, store corresponding file info $fileData = array('name' => null, 'timestamp' => null, 'sha1' => null); if ($this->page->getNamespace() == NS_FILE && $this->fileVersion) { # Stable upload version for file pages... $data = explode('#', $this->fileVersion, 2); if (count($data) == 2) { $fileData['name'] = $this->page->getDBkey(); $fileData['timestamp'] = $data[0]; $fileData['sha1'] = $data[1]; } } # Get current stable version ID (for logging) $oldSv = FlaggedRevision::newFromStable($this->page, FR_MASTER); # Is this a duplicate review? if ($oldFrev && $oldFrev->getTags() == $flags && $oldFrev->getFileSha1() == $fileData['sha1'] && $oldFrev->getFileTimestamp() == $fileData['timestamp'] && $oldFrev->getTemplateVersions(FR_MASTER) == $tmpVersions && $oldFrev->getFileVersions(FR_MASTER) == $fileVersions) { wfProfileOut(__METHOD__); return true; // don't record if the same } # The new review entry... $flaggedRevision = new FlaggedRevision(array('rev' => $rev, 'user_id' => $this->user->getId(), 'timestamp' => wfTimestampNow(), 'quality' => $quality, 'tags' => FlaggedRevision::flattenRevisionTags($flags), 'img_name' => $fileData['name'], 'img_timestamp' => $fileData['timestamp'], 'img_sha1' => $fileData['sha1'], 'templateVersions' => $tmpVersions, 'fileVersions' => $fileVersions, 'flags' => '')); # Delete the old review entry if it exists... if ($oldFrev) { $oldFrev->delete(); } # Insert the new review entry... if (!$flaggedRevision->insert()) { throw new MWException("Flagged revision with ID {$rev->getId()} exists with unexpected fr_page_id"); } # Update the article review log... $oldSvId = $oldSv ? $oldSv->getRevId() : 0; FlaggedRevsLog::updateReviewLog($this->page, $this->dims, $this->oldFlags, $this->comment, $this->oldid, $oldSvId, true); # Get the new stable version as of now $sv = FlaggedRevision::determineStable($this->page, FR_MASTER); # Update recent changes... self::updateRecentChanges($rev, 'patrol', $sv); # Update page and tracking tables and clear cache $changed = FlaggedRevs::stableVersionUpdates($this->page, $sv, $oldSv); if ($changed) { FlaggedRevs::HTMLCacheUpdates($this->page); // purge pages that use this page } # Caller may want to get the change time $this->newLastChangeTime = $flaggedRevision->getTimestamp(); wfProfileOut(__METHOD__); return true; }
/** * (a) Stabilize inclusions in Parser output * (b) Load all of the "review time" versions of template/files from $frev * (c) Load their stable version counterparts (avoids DB hits) * Note: Used when calling FlaggedRevs::parseStableText(). * @param FlaggedRevision $frev * @return void */ public function stabilizeParserOutput(FlaggedRevision $frev) { $tStbVersions = $fStbVersions = array(); // stable versions $tRevVersions = $frev->getTemplateVersions(); $fRevVersions = $frev->getFileVersions(); # We can preload *most* of the stable version IDs the parser will need... if (FlaggedRevs::inclusionSetting() == FR_INCLUDES_STABLE) { $tStbVersions = $frev->getStableTemplateVersions(); $fStbVersions = $frev->getStableFileVersions(); } $this->setReviewedVersions($tRevVersions, $fRevVersions); $this->setStableVersionCache($tStbVersions, $fStbVersions); }