32 private const REVERT_METHOD_TO_CHANGE_TAG = [
39 private $revisionRecord =
null;
42 private $isNew =
false;
45 private $originalRevisionId =
false;
48 private $originalRevision =
null;
51 private $revertMethod =
null;
54 private $newestRevertedRevId =
null;
57 private $oldestRevertedRevId =
null;
60 private $revertAfterRevId =
null;
63 private $revisionStore;
66 private $softwareTags;
84 $this->revisionStore = $revisionStore;
85 $this->softwareTags = $softwareTags;
86 $this->options = $options;
90 if ( $this->revisionRecord === null ) {
92 'Revision was not set prior to building an EditResult'
97 $this->guessOriginalRevisionId();
100 $this->detectManualRevert();
104 $this->originalRevisionId,
106 $this->oldestRevertedRevId,
107 $this->newestRevertedRevId,
108 $this->isExactRevert(),
110 $this->getRevertTags()
119 $this->revisionRecord = $revisionRecord;
127 $this->isNew = $isNew;
141 int $newestRevertedRevId,
142 ?
int $revertAfterRevId =
null
150 'must be one of REVERT_UNDO, REVERT_ROLLBACK, REVERT_MANUAL'
152 $this->revertAfterRevId = $revertAfterRevId;
154 if ( $newestRevertedRevId ) {
155 $this->revertMethod = $revertMethod;
156 $this->newestRevertedRevId = $newestRevertedRevId;
157 $revertAfterRevision = $revertAfterRevId ?
158 $this->revisionStore->getRevisionById( $revertAfterRevId ) :
160 $oldestRevertedRev = $revertAfterRevision ?
161 $this->revisionStore->getNextRevision( $revertAfterRevision ) :
null;
162 if ( $oldestRevertedRev ) {
163 $this->oldestRevertedRevId = $oldestRevertedRev->getId();
167 $this->oldestRevertedRevId = $this->newestRevertedRevId;
179 $this->originalRevision = $originalRevision;
180 $this->originalRevisionId = $originalRevision->getId();
182 $this->originalRevisionId = $originalRevision ??
false;
183 $this->originalRevision =
null;
194 private function detectManualRevert() {
196 if ( !$searchRadius ||
198 $this->revertMethod !==
null ||
200 $this->isNullEdit() ||
203 !$this->revisionRecord->getParentId()
208 $revertedToRev = $this->revisionStore->findIdenticalRevision( $this->revisionRecord, $searchRadius );
209 if ( !$revertedToRev ) {
212 $oldestReverted = $this->revisionStore->getNextRevision( $revertedToRev );
213 if ( !$oldestReverted ) {
217 $this->setOriginalRevision( $revertedToRev );
219 $this->oldestRevertedRevId = $oldestReverted->getId();
220 $this->newestRevertedRevId = $this->revisionRecord->getParentId();
221 $this->revertAfterRevId = $revertedToRev->getId();
227 private function guessOriginalRevisionId() {
228 if ( !$this->originalRevisionId ) {
229 if ( $this->revertAfterRevId ) {
230 $this->setOriginalRevision( $this->revertAfterRevId );
231 } elseif ( $this->newestRevertedRevId ) {
234 $undidRevision = $this->revisionStore->getRevisionById( $this->newestRevertedRevId );
235 if ( $undidRevision ) {
236 $originalRevision = $this->revisionStore->getPreviousRevision( $undidRevision );
237 if ( $originalRevision ) {
238 $this->setOriginalRevision( $originalRevision );
246 if ( $this->getOriginalRevision() &&
247 !$this->getOriginalRevision()->hasSameContent( $this->revisionRecord )
249 $this->setOriginalRevision(
false );
259 private function getOriginalRevision(): ?RevisionRecord {
260 if ( $this->originalRevision ) {
261 return $this->originalRevision;
263 if ( !$this->originalRevisionId ) {
267 $this->originalRevision = $this->revisionStore->getRevisionById( $this->originalRevisionId );
268 return $this->originalRevision;
275 private function isExactRevert(): bool {
276 if ( $this->isNew || $this->oldestRevertedRevId === null ) {
280 $originalRevision = $this->getOriginalRevision();
281 if ( !$originalRevision ) {
286 return $this->revisionRecord->hasSameContent( $originalRevision );
292 private function isNullEdit(): bool {
293 if ( $this->isNew ) {
297 return $this->getOriginalRevision() &&
298 $this->originalRevisionId === $this->revisionRecord->getParentId();
306 private function getRevertTags(): array {
307 if ( $this->revertMethod !== null ) {
308 $revertTag = self::REVERT_METHOD_TO_CHANGE_TAG[$this->revertMethod];
309 if ( in_array( $revertTag, $this->softwareTags ) ) {
310 return [ $revertTag ];