Ladsgroup has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/394999 )
Change subject: All the backward compatibility needed for compact diff
representation
......................................................................
All the backward compatibility needed for compact diff representation
Bug: T113468
Change-Id: I1bf483b42bf7c542e5f847680377ee2d65cdc4dc
---
M client/includes/Changes/AffectedPagesFinder.php
M client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
M lib/includes/Changes/ItemChange.php
M lib/tests/phpunit/Changes/ItemChangeTest.php
4 files changed, 99 insertions(+), 25 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/99/394999/1
diff --git a/client/includes/Changes/AffectedPagesFinder.php
b/client/includes/Changes/AffectedPagesFinder.php
index 99632b5..cec0eeb 100644
--- a/client/includes/Changes/AffectedPagesFinder.php
+++ b/client/includes/Changes/AffectedPagesFinder.php
@@ -16,7 +16,6 @@
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\EntityChange;
use Wikibase\ItemChange;
-use Wikibase\Lib\Changes\EntityDiffChangedAspects;
use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory;
use Wikibase\Lib\Store\StorageException;
@@ -115,21 +114,21 @@
}
/**
- * @param EntityChange|EntityDiffChangedAspects $change
+ * @param EntityChange $change
*
* @return string[]
*/
- public function getChangedAspects( $change ) {
+ public function getChangedAspects( EntityChange $change ) {
$aspects = [];
- if ( $change instanceof EntityChange ) {
- $diff = $change->getDiff();
- $diffAspects = ( new EntityDiffChangedAspectsFactory()
)->newFromEntityDiff( $diff );
- } elseif ( $change instanceof EntityDiffChangedAspects ) {
- $diffAspects = $change;
+ $info = $change->getInfo();
+ // We might unserialize old EntityChange which doesn't have
getAspectsDiff method
+ if ( array_key_exists( 'compactDiff', $info ) ) {
+ $diffAspects = $info['compactDiff'];
} else {
- throw new InvalidArgumentException(
'AffectedPagesFinder::getChangedAspects accepts ' .
- 'EntityChange or EntityDiffChangedAspects' );
+ $diffAspects = ( new EntityDiffChangedAspectsFactory()
)->newFromEntityDiff(
+ $change->getDiff()
+ );
}
if ( $diffAspects->getSiteLinkChanges() !== [] ) {
@@ -218,9 +217,15 @@
$usages = $this->transformAllPageEntityUsages( $usages,
$entityId, $changedAspects );
if ( $change instanceof ItemChange && in_array(
EntityUsage::TITLE_USAGE, $changedAspects ) ) {
- $diffChangedAspects = ( new
EntityDiffChangedAspectsFactory() )->newFromEntityDiff(
- $change->getDiff()
- );
+ $info = $change->getInfo();
+ // We might unserialize old EntityChange which doesn't
have getAspectsDiff method
+ if ( array_key_exists( 'compactDiff', $info ) ) {
+ $diffChangedAspects = $info['compactDiff'];
+ } else {
+ $diffChangedAspects = ( new
EntityDiffChangedAspectsFactory() )->newFromEntityDiff(
+ $change->getDiff()
+ );
+ }
$namesFromDiff = $this->getPagesReferencedInDiff(
$diffChangedAspects->getSiteLinkChanges()
);
diff --git a/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
b/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
index 59c9432..f166828 100644
--- a/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
+++ b/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
@@ -232,10 +232,18 @@
$trackUsagesInAllLanguages = false
) {
$referencedPagesFinder = $this->getAffectedPagesFinder( [], [],
$trackUsagesInAllLanguages );
+ $info = $change->getInfo();
+ if ( !array_key_exists( 'compactDiff', $info ) ) {
+ $aspects = ( new EntityDiffChangedAspectsFactory()
)->newFromEntityDiff(
+ $change->getDiff()
+ );
+ $info = $change->getInfo();
+ $info['compactDiff'] = $aspects;
+ $change->setField( 'info', $info );
- $aspects = ( new EntityDiffChangedAspectsFactory()
)->newFromEntityDiff( $change->getDiff() );
- $actual = $referencedPagesFinder->getChangedAspects( $aspects );
+ }
+ $actual = $referencedPagesFinder->getChangedAspects( $change );
sort( $expected );
sort( $actual );
$this->assertEquals( $expected, $actual );
diff --git a/lib/includes/Changes/ItemChange.php
b/lib/includes/Changes/ItemChange.php
index 467f6dd..706d55e 100644
--- a/lib/includes/Changes/ItemChange.php
+++ b/lib/includes/Changes/ItemChange.php
@@ -2,8 +2,12 @@
namespace Wikibase;
+use Diff\DiffOpAdd;
+use Diff\DiffOpChange;
use Diff\DiffOp\Diff\Diff;
+use Diff\DiffOpRemove;
use Wikibase\DataModel\Services\Diff\ItemDiff;
+use Wikibase\Lib\Changes\EntityDiffChangedAspects;
/**
* @license GPL-2.0+
@@ -16,22 +20,60 @@
* @return Diff
*/
public function getSiteLinkDiff() {
+ $info = $this->getInfo();
+ if ( !array_key_exists( 'diff', $info ) ) {
+ if ( !array_key_exists( 'compactDiff', $info ) ) {
+ $this->logWarning( $this );
+ return new Diff();
+ }
+
+ $aspects = $info['compactDiff'];
+ if ( !( $aspects instanceof EntityDiffChangedAspects )
) {
+ $this->logWarning( $aspects );
+ return new Diff();
+ }
+ return $this->getDiffFromSiteLinkChanges(
$aspects->getSiteLinkChanges() );
+
+ }
$diff = $this->getDiff();
-
if ( !( $diff instanceof ItemDiff ) ) {
- // This shouldn't happen, but we should be robust
against corrupt, incomplete
- // or obsolete instances in the database, etc.
-
- $cls = $diff === null ? 'null' : get_class( $diff );
-
- wfLogWarning(
- 'Cannot get sitelink diff from ' . $cls . '.
Change #' . $this->getId()
- . ", type " . $this->getType() );
-
+ $this->logWarning( $diff );
return new Diff();
} else {
return $diff->getSiteLinkDiff();
}
}
+ private function getDiffFromSiteLinkChanges( array $siteLinkChanges ) {
+ $siteLinkDiff = [];
+ foreach ( $siteLinkChanges as $wiki => $change ) {
+ if ( $change[0] === $change[1] ) {
+ continue;
+ }
+ $siteLinkDiff[$wiki] =
$this->getDiffFromSiteLinkChangesPerWiki( $change );
+ }
+
+ return new Diff( $siteLinkDiff, true );
+ }
+
+ private function getDiffFromSiteLinkChangesPerWiki( array $change ) {
+ if ( $change[0] === null && $change[1] !== null ) {
+ return new Diff( [ 'name' => new DiffOpAdd( $change[1]
) ], true );
+ } elseif ( $change[0] !== null && $change[1] === null ) {
+ return new Diff( [ 'name' => new DiffOpRemove(
$change[0] ) ], true );
+ } else {
+ return new Diff( [ 'name' => new DiffOpChange(
$change[0], $change[1] ) ], true );
+ }
+ }
+
+ private function logWarning( $obj ) {
+ // This shouldn't happen, but we should be robust against
corrupt, incomplete
+ // or obsolete instances in the database, etc.
+
+ $cls = $obj === null ? 'null' : get_class( $obj );
+ wfLogWarning(
+ 'Cannot get sitelink diff from ' . $cls . '. Change #'
. $this->getId()
+ . ", type " . $this->getType() );
+ }
+
}
diff --git a/lib/tests/phpunit/Changes/ItemChangeTest.php
b/lib/tests/phpunit/Changes/ItemChangeTest.php
index 372f005..7054689 100644
--- a/lib/tests/phpunit/Changes/ItemChangeTest.php
+++ b/lib/tests/phpunit/Changes/ItemChangeTest.php
@@ -8,6 +8,7 @@
use Wikibase\DataModel\Services\Diff\ItemDiff;
use Wikibase\EntityChange;
use Wikibase\ItemChange;
+use Wikibase\Lib\Changes\EntityDiffChangedAspectsFactory;
/**
* @covers Wikibase\ItemChange
@@ -55,6 +56,24 @@
$this->assertInstanceOf( Diff::class, $siteLinkDiff,
'getSiteLinkDiff must return a Diff' );
}
+ /**
+ * @dataProvider changeProvider
+ *
+ * @param ItemChange $change
+ */
+ public function testGetSiteLinkDiffFromCompactDiff( ItemChange $change
) {
+ $info = $change->getInfo();
+ if ( !array_key_exists( 'compactDiff', $info ) ) {
+ $aspects = ( new EntityDiffChangedAspectsFactory()
)->newFromEntityDiff(
+ $change->getDiff()
+ );
+ $info['compactDiff'] = $aspects;
+ $change->setField( 'info', $info );
+ }
+ $siteLinkDiff = $change->getSiteLinkDiff();
+ $this->assertInstanceOf( Diff::class, $siteLinkDiff,
'getSiteLinkDiff must return a Diff' );
+ }
+
public function changeBackwardsCompatProvider() {
global $wgDevelopmentWarnings;
--
To view, visit https://gerrit.wikimedia.org/r/394999
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I1bf483b42bf7c542e5f847680377ee2d65cdc4dc
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: wmf/1.31.0-wmf.10
Gerrit-Owner: Ladsgroup <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits