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;
70 private readonly array $softwareTags,
73 $options->assertRequiredOptions( self::CONSTRUCTOR_OPTIONS );
77 if ( $this->revisionRecord === null ) {
79 'Revision was not set prior to building an EditResult'
84 $this->guessOriginalRevisionId();
87 $this->detectManualRevert();
91 $this->originalRevisionId,
93 $this->oldestRevertedRevId,
94 $this->newestRevertedRevId,
95 $this->isExactRevert(),
97 $this->getRevertTags()
106 $this->revisionRecord = $revisionRecord;
114 $this->isNew = $isNew;
128 int $newestRevertedRevId,
129 ?
int $revertAfterRevId =
null
137 'must be one of REVERT_UNDO, REVERT_ROLLBACK, REVERT_MANUAL'
139 $this->revertAfterRevId = $revertAfterRevId;
141 if ( $newestRevertedRevId ) {
142 $this->revertMethod = $revertMethod;
143 $this->newestRevertedRevId = $newestRevertedRevId;
144 $revertAfterRevision = $revertAfterRevId ?
145 $this->revisionStore->getRevisionById( $revertAfterRevId ) :
147 $oldestRevertedRev = $revertAfterRevision ?
148 $this->revisionStore->getNextRevision( $revertAfterRevision ) :
null;
149 if ( $oldestRevertedRev ) {
150 $this->oldestRevertedRevId = $oldestRevertedRev->getId();
154 $this->oldestRevertedRevId = $this->newestRevertedRevId;
166 $this->originalRevision = $originalRevision;
167 $this->originalRevisionId = $originalRevision->getId();
169 $this->originalRevisionId = $originalRevision ??
false;
170 $this->originalRevision =
null;
181 private function detectManualRevert() {
183 if ( !$searchRadius ||
185 $this->revertMethod !==
null ||
187 $this->isNullEdit() ||
190 !$this->revisionRecord->getParentId()
195 $revertedToRev = $this->revisionStore->findIdenticalRevision( $this->revisionRecord, $searchRadius );
196 if ( !$revertedToRev ) {
199 $oldestReverted = $this->revisionStore->getNextRevision( $revertedToRev );
200 if ( !$oldestReverted ) {
204 $this->setOriginalRevision( $revertedToRev );
206 $this->oldestRevertedRevId = $oldestReverted->getId();
207 $this->newestRevertedRevId = $this->revisionRecord->getParentId();
208 $this->revertAfterRevId = $revertedToRev->getId();
214 private function guessOriginalRevisionId() {
215 if ( !$this->originalRevisionId ) {
216 if ( $this->revertAfterRevId ) {
217 $this->setOriginalRevision( $this->revertAfterRevId );
218 } elseif ( $this->newestRevertedRevId ) {
221 $undidRevision = $this->revisionStore->getRevisionById( $this->newestRevertedRevId );
222 if ( $undidRevision ) {
223 $originalRevision = $this->revisionStore->getPreviousRevision( $undidRevision );
224 if ( $originalRevision ) {
225 $this->setOriginalRevision( $originalRevision );
233 if ( $this->getOriginalRevision() &&
234 !$this->getOriginalRevision()->hasSameContent( $this->revisionRecord )
236 $this->setOriginalRevision(
false );
249 private function getOriginalRevision(): ?RevisionRecord {
250 if ( $this->originalRevision ) {
251 return $this->originalRevision;
253 if ( !$this->originalRevisionId ) {
257 $this->originalRevision = $this->revisionStore->getRevisionById( $this->originalRevisionId );
258 return $this->originalRevision;
265 private function isExactRevert(): bool {
266 if ( $this->isNew || $this->oldestRevertedRevId === null ) {
270 $originalRevision = $this->getOriginalRevision();
271 if ( !$originalRevision ) {
276 return $this->revisionRecord->hasSameContent( $originalRevision );
285 private function isNullEdit(): bool {
286 if ( $this->isNew ) {
290 return $this->getOriginalRevision() &&
291 $this->originalRevisionId === $this->revisionRecord->getParentId();
299 private function getRevertTags(): array {
300 if ( $this->revertMethod !== null ) {
301 $revertTag = self::REVERT_METHOD_TO_CHANGE_TAG[$this->revertMethod];
302 if ( in_array( $revertTag, $this->softwareTags ) ) {
303 return [ $revertTag ];