46 private const REVERT_METHOD_TO_CHANGE_TAG = [
53 private $revisionRecord =
null;
56 private $isNew =
false;
59 private $originalRevisionId =
false;
62 private $originalRevision =
null;
65 private $revertMethod =
null;
68 private $newestRevertedRevId =
null;
71 private $oldestRevertedRevId =
null;
74 private $revertAfterRevId =
null;
77 private $revisionStore;
80 private $softwareTags;
98 $this->revisionStore = $revisionStore;
99 $this->softwareTags = $softwareTags;
100 $this->options = $options;
104 if ( $this->revisionRecord === null ) {
106 'Revision was not set prior to building an EditResult'
111 $this->guessOriginalRevisionId();
114 $this->detectManualRevert();
118 $this->originalRevisionId,
120 $this->oldestRevertedRevId,
121 $this->newestRevertedRevId,
122 $this->isExactRevert(),
124 $this->getRevertTags()
133 $this->revisionRecord = $revisionRecord;
141 $this->isNew = $isNew;
155 int $newestRevertedRevId,
156 ?
int $revertAfterRevId =
null
164 'must be one of REVERT_UNDO, REVERT_ROLLBACK, REVERT_MANUAL'
166 $this->revertAfterRevId = $revertAfterRevId;
168 if ( $newestRevertedRevId ) {
169 $this->revertMethod = $revertMethod;
170 $this->newestRevertedRevId = $newestRevertedRevId;
171 $revertAfterRevision = $revertAfterRevId ?
172 $this->revisionStore->getRevisionById( $revertAfterRevId ) :
174 $oldestRevertedRev = $revertAfterRevision ?
175 $this->revisionStore->getNextRevision( $revertAfterRevision ) :
null;
176 if ( $oldestRevertedRev ) {
177 $this->oldestRevertedRevId = $oldestRevertedRev->getId();
181 $this->oldestRevertedRevId = $this->newestRevertedRevId;
193 $this->originalRevision = $originalRevision;
194 $this->originalRevisionId = $originalRevision->getId();
196 $this->originalRevisionId = $originalRevision ??
false;
197 $this->originalRevision =
null;
208 private function detectManualRevert() {
210 if ( !$searchRadius ||
212 $this->revertMethod !==
null ||
214 $this->isNullEdit() ||
217 !$this->revisionRecord->getParentId()
222 $revertedToRev = $this->revisionStore->findIdenticalRevision( $this->revisionRecord, $searchRadius );
223 if ( !$revertedToRev ) {
226 $oldestReverted = $this->revisionStore->getNextRevision( $revertedToRev );
227 if ( !$oldestReverted ) {
231 $this->setOriginalRevision( $revertedToRev );
233 $this->oldestRevertedRevId = $oldestReverted->getId();
234 $this->newestRevertedRevId = $this->revisionRecord->getParentId();
235 $this->revertAfterRevId = $revertedToRev->getId();
241 private function guessOriginalRevisionId() {
242 if ( !$this->originalRevisionId ) {
243 if ( $this->revertAfterRevId ) {
244 $this->setOriginalRevision( $this->revertAfterRevId );
245 } elseif ( $this->newestRevertedRevId ) {
248 $undidRevision = $this->revisionStore->getRevisionById( $this->newestRevertedRevId );
249 if ( $undidRevision ) {
250 $originalRevision = $this->revisionStore->getPreviousRevision( $undidRevision );
251 if ( $originalRevision ) {
252 $this->setOriginalRevision( $originalRevision );
260 if ( $this->getOriginalRevision() &&
261 !$this->getOriginalRevision()->hasSameContent( $this->revisionRecord )
263 $this->setOriginalRevision(
false );
273 private function getOriginalRevision(): ?RevisionRecord {
274 if ( $this->originalRevision ) {
275 return $this->originalRevision;
277 if ( !$this->originalRevisionId ) {
281 $this->originalRevision = $this->revisionStore->getRevisionById( $this->originalRevisionId );
282 return $this->originalRevision;
289 private function isExactRevert(): bool {
290 if ( $this->isNew || $this->oldestRevertedRevId === null ) {
294 $originalRevision = $this->getOriginalRevision();
295 if ( !$originalRevision ) {
300 return $this->revisionRecord->hasSameContent( $originalRevision );
306 private function isNullEdit(): bool {
307 if ( $this->isNew ) {
311 return $this->getOriginalRevision() &&
312 $this->originalRevisionId === $this->revisionRecord->getParentId();
320 private function getRevertTags(): array {
321 if ( isset( self::REVERT_METHOD_TO_CHANGE_TAG[$this->revertMethod] ) ) {
322 $revertTag = self::REVERT_METHOD_TO_CHANGE_TAG[$this->revertMethod];
323 if ( in_array( $revertTag, $this->softwareTags ) ) {
324 return [ $revertTag ];