Anomie has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/401090 )
Change subject: ApiComparePages: Add 'fromsection' and 'tosection' parameters
......................................................................
ApiComparePages: Add 'fromsection' and 'tosection' parameters
The deprecated diffing in prop=revisions and such used a 'rvsection'
parameter. To enable migration of things using that, action=compare
needs corresponding section parameters.
Bug: T183823
Change-Id: If1a0e2df614c083b37640418c69cca367ce0e895
---
M includes/api/ApiComparePages.php
M includes/api/i18n/en.json
M includes/api/i18n/qqq.json
M tests/phpunit/includes/api/ApiComparePagesTest.php
4 files changed, 72 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core
refs/changes/90/401090/1
diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php
index eb67bab..5486594 100644
--- a/includes/api/ApiComparePages.php
+++ b/includes/api/ApiComparePages.php
@@ -94,6 +94,26 @@
$this->dieWithError( 'apierror-baddiff' );
}
+ // Extract sections, if told to
+ if ( isset( $params['fromsection'] ) ) {
+ $fromContent = $fromContent->getSection(
$params['fromsection'] );
+ if ( !$fromContent ) {
+ $this->dieWithError(
+ [ 'apierror-compare-nosuchfromsection',
wfEscapeWikiText( $params['fromsection'] ) ],
+ 'nosuchfromsection'
+ );
+ }
+ }
+ if ( isset( $params['tosection'] ) ) {
+ $toContent = $toContent->getSection(
$params['tosection'] );
+ if ( !$toContent ) {
+ $this->dieWithError(
+ [ 'apierror-compare-nosuchtosection',
wfEscapeWikiText( $params['tosection'] ) ],
+ 'nosuchtosection'
+ );
+ }
+ }
+
// Get the diff
$context = new DerivativeContext( $this->getContext() );
if ( $relRev && $relRev->getTitle() ) {
@@ -444,6 +464,7 @@
'text' => [
ApiBase::PARAM_TYPE => 'text'
],
+ 'section' => null,
'pst' => false,
'contentformat' => [
ApiBase::PARAM_TYPE =>
ContentHandler::getAllContentFormats(),
diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json
index e1360c8..cceed01 100644
--- a/includes/api/i18n/en.json
+++ b/includes/api/i18n/en.json
@@ -64,6 +64,7 @@
"apihelp-compare-param-fromid": "First page ID to compare.",
"apihelp-compare-param-fromrev": "First revision to compare.",
"apihelp-compare-param-fromtext": "Use this text instead of the content
of the revision specified by <var>fromtitle</var>, <var>fromid</var> or
<var>fromrev</var>.",
+ "apihelp-compare-param-fromsection": "Only use the specified section of
the specified 'from' content.",
"apihelp-compare-param-frompst": "Do a pre-save transform on
<var>fromtext</var>.",
"apihelp-compare-param-fromcontentmodel": "Content model of
<var>fromtext</var>. If not supplied, it will be guessed based on the other
parameters.",
"apihelp-compare-param-fromcontentformat": "Content serialization
format of <var>fromtext</var>.",
@@ -72,6 +73,7 @@
"apihelp-compare-param-torev": "Second revision to compare.",
"apihelp-compare-param-torelative": "Use a revision relative to the
revision determined from <var>fromtitle</var>, <var>fromid</var> or
<var>fromrev</var>. All of the other 'to' options will be ignored.",
"apihelp-compare-param-totext": "Use this text instead of the content
of the revision specified by <var>totitle</var>, <var>toid</var> or
<var>torev</var>.",
+ "apihelp-compare-param-tosection": "Only use the specified section of
the specified 'to' content.",
"apihelp-compare-param-topst": "Do a pre-save transform on
<var>totext</var>.",
"apihelp-compare-param-tocontentmodel": "Content model of
<var>totext</var>. If not supplied, it will be guessed based on the other
parameters.",
"apihelp-compare-param-tocontentformat": "Content serialization format
of <var>totext</var>.",
@@ -1675,6 +1677,8 @@
"apierror-chunk-too-small": "Minimum chunk size is $1
{{PLURAL:$1|byte|bytes}} for non-final chunks.",
"apierror-cidrtoobroad": "$1 CIDR ranges broader than /$2 are not
accepted.",
"apierror-compare-no-title": "Cannot pre-save transform without a
title. Try specifying <var>fromtitle</var> or <var>totitle</var>.",
+ "apierror-compare-nosuchfromsection": "There is no section $1 in the
'from' content.",
+ "apierror-compare-nosuchtosection": "There is no section $1 in the 'to'
content.",
"apierror-compare-relative-to-nothing": "No 'from' revision for
<var>torelative</var> to be relative to.",
"apierror-contentserializationexception": "Content serialization
failed: $1",
"apierror-contenttoobig": "The content you supplied exceeds the article
size limit of $1 {{PLURAL:$1|kilobyte|kilobytes}}.",
diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json
index 1724fa9..d21f29c 100644
--- a/includes/api/i18n/qqq.json
+++ b/includes/api/i18n/qqq.json
@@ -68,6 +68,7 @@
"apihelp-compare-param-fromid": "{{doc-apihelp-param|compare|fromid}}",
"apihelp-compare-param-fromrev":
"{{doc-apihelp-param|compare|fromrev}}",
"apihelp-compare-param-fromtext":
"{{doc-apihelp-param|compare|fromtext}}",
+ "apihelp-compare-param-fromsection":
"{{doc-apihelp-param|compare|fromsection}}",
"apihelp-compare-param-frompst":
"{{doc-apihelp-param|compare|frompst}}",
"apihelp-compare-param-fromcontentmodel":
"{{doc-apihelp-param|compare|fromcontentmodel}}",
"apihelp-compare-param-fromcontentformat":
"{{doc-apihelp-param|compare|fromcontentformat}}",
@@ -76,6 +77,7 @@
"apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}",
"apihelp-compare-param-torelative":
"{{doc-apihelp-param|compare|torelative}}",
"apihelp-compare-param-totext": "{{doc-apihelp-param|compare|totext}}",
+ "apihelp-compare-param-tosection":
"{{doc-apihelp-param|compare|tosection}}",
"apihelp-compare-param-topst": "{{doc-apihelp-param|compare|topst}}",
"apihelp-compare-param-tocontentmodel":
"{{doc-apihelp-param|compare|tocontentmodel}}",
"apihelp-compare-param-tocontentformat":
"{{doc-apihelp-param|compare|tocontentformat}}",
@@ -1564,6 +1566,8 @@
"apierror-chunk-too-small": "{{doc-apierror}}\n\nParameters:\n* $1 -
Minimum size in bytes.",
"apierror-cidrtoobroad": "{{doc-apierror}}\n\nParameters:\n* $1 -
\"IPv4\" or \"IPv6\"\n* $2 - Minimum CIDR mask length.",
"apierror-compare-no-title": "{{doc-apierror}}",
+ "apierror-compare-nosuchfromsection":
"{{doc-apierror}}\n\nParameters:\n* $1 - Section identifier. Probably a number
or \"T-\" followed by a number.",
+ "apierror-compare-nosuchtosection": "{{doc-apierror}}\n\nParameters:\n*
$1 - Section identifier. Probably a number or \"T-\" followed by a number.",
"apierror-compare-relative-to-nothing": "{{doc-apierror}}",
"apierror-contentserializationexception":
"{{doc-apierror}}\n\nParameters:\n* $1 - Exception text, may end with
punctuation. Currently this is probably English, hopefully we'll fix that in
the future.",
"apierror-contenttoobig": "{{doc-apierror}}\n\nParameters:\n* $1 -
Maximum article size in kilobytes.",
diff --git a/tests/phpunit/includes/api/ApiComparePagesTest.php
b/tests/phpunit/includes/api/ApiComparePagesTest.php
index 9399ef8..6bdba89 100644
--- a/tests/phpunit/includes/api/ApiComparePagesTest.php
+++ b/tests/phpunit/includes/api/ApiComparePagesTest.php
@@ -70,6 +70,9 @@
'page', [ 'page_latest' => 0 ], [ 'page_id' =>
self::$repl['pageE'] ]
);
+ self::$repl['revF1'] = $this->addPage( 'F', "== Section 1 ==\nF
1.1\n\n== Section 2 ==\nF 1.2" );
+ self::$repl['pageF'] = Title::newFromText( 'ApiComparePagesTest
F' )->getArticleId();
+
WikiPage::factory( Title::newFromText( 'ApiComparePagesTest C'
) )
->doDeleteArticleReal( 'Test for ApiComparePagesTest' );
@@ -372,6 +375,26 @@
],
false, true
],
+ 'Basic diff, test with sections' => [
+ [
+ 'fromtitle' => 'ApiComparePagesTest F',
+ 'fromsection' => 1,
+ 'totext' => "== Section 1 ==\nTo
text\n\n== Section 2 ==\nTo text?",
+ 'tosection' => 2,
+ ],
+ [
+ 'compare' => [
+ 'body' => '<tr><td colspan="2"
class="diff-lineno" id="mw-diff-left-l1" >Line 1:</td>' . "\n"
+ . '<td colspan="2"
class="diff-lineno">Line 1:</td></tr>' . "\n"
+ . '<tr><td
class=\'diff-marker\'>−</td><td class=\'diff-deletedline\'><div>== Section <del
class="diffchange diffchange-inline">1 </del>==</div></td><td
class=\'diff-marker\'>+</td><td class=\'diff-addedline\'><div>== Section <ins
class="diffchange diffchange-inline">2 </ins>==</div></td></tr>' . "\n"
+ . '<tr><td
class=\'diff-marker\'>−</td><td class=\'diff-deletedline\'><div><del
class="diffchange diffchange-inline">F 1.1</del></div></td><td
class=\'diff-marker\'>+</td><td class=\'diff-addedline\'><div><ins
class="diffchange diffchange-inline">To text?</ins></div></td></tr>' . "\n",
+ 'fromid' => '{{REPL:pageF}}',
+ 'fromrevid' => '{{REPL:revF1}}',
+ 'fromns' => '0',
+ 'fromtitle' =>
'ApiComparePagesTest F',
+ ]
+ ],
+ ],
'Diff with all props' => [
[
'fromrev' => '{{REPL:revB1}}',
@@ -568,6 +591,26 @@
[],
'compare-no-title',
],
+ 'Error, test with invalid from section ID' => [
+ [
+ 'fromtitle' => 'ApiComparePagesTest F',
+ 'fromsection' => 5,
+ 'totext' => "== Section 1 ==\nTo
text\n\n== Section 2 ==\nTo text?",
+ 'tosection' => 2,
+ ],
+ [],
+ 'nosuchfromsection',
+ ],
+ 'Error, test with invalid to section ID' => [
+ [
+ 'fromtitle' => 'ApiComparePagesTest F',
+ 'fromsection' => 1,
+ 'totext' => "== Section 1 ==\nTo
text\n\n== Section 2 ==\nTo text?",
+ 'tosection' => 5,
+ ],
+ [],
+ 'nosuchtosection',
+ ],
'Error, Relative diff, no from revision' => [
[
'fromtext' => 'Foo',
--
To view, visit https://gerrit.wikimedia.org/r/401090
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If1a0e2df614c083b37640418c69cca367ce0e895
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Anomie <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits