jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/344589 )
Change subject: New Wikidata Build - 2017-03-24T10:00:01+0000 ...................................................................... New Wikidata Build - 2017-03-24T10:00:01+0000 Change-Id: Ibc141d58cad359370c7149ca0fe44cee03bba53a --- M composer.lock M extensions/Wikibase/client/i18n/ar.json M extensions/Wikibase/client/i18n/de.json M extensions/Wikibase/client/i18n/fr.json M extensions/Wikibase/client/i18n/gl.json M extensions/Wikibase/client/i18n/he.json M extensions/Wikibase/client/i18n/it.json M extensions/Wikibase/client/i18n/qqq.json M extensions/Wikibase/client/i18n/zh-hans.json M extensions/Wikibase/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php M extensions/Wikibase/client/includes/Hooks/MagicWordHookHandlers.php M extensions/Wikibase/repo/i18n/gl.json A extensions/Wikibase/repo/tests/testDispatchCoordinator.php M extensions/WikimediaBadges/package.json M vendor/composer/installed.json 15 files changed, 300 insertions(+), 76 deletions(-) Approvals: Addshore: Looks good to me, approved jenkins-bot: Verified diff --git a/composer.lock b/composer.lock index e57fab6..322a5ae 100644 --- a/composer.lock +++ b/composer.lock @@ -1556,12 +1556,12 @@ "source": { "type": "git", "url": "https://github.com/wikimedia/mediawiki-extensions-Wikibase.git", - "reference": "f37e244cd624ead83bc9552ff0b5d4c23880948e" + "reference": "eb0756f3f2d86da9f8ce684234a59b04fedea5c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/f37e244cd624ead83bc9552ff0b5d4c23880948e", - "reference": "f37e244cd624ead83bc9552ff0b5d4c23880948e", + "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/eb0756f3f2d86da9f8ce684234a59b04fedea5c8", + "reference": "eb0756f3f2d86da9f8ce684234a59b04fedea5c8", "shasum": "" }, "require": { @@ -1635,7 +1635,7 @@ "wikibaserepo", "wikidata" ], - "time": "2017-03-22 22:11:13" + "time": "2017-03-24 03:39:57" }, { "name": "wikibase/wikimedia-badges", @@ -1643,7 +1643,7 @@ "source": { "type": "git", "url": "https://gerrit.wikimedia.org/r/mediawiki/extensions/WikimediaBadges", - "reference": "d9546983a02b4b693f66f095916a0b3e043722c4" + "reference": "d4a58bada110d31d1a5c6a9a02b2778950c4cd27" }, "require": { "php": ">=5.3.0" @@ -1677,7 +1677,7 @@ "support": { "irc": "irc://irc.freenode.net/wikidata" }, - "time": "2017-02-20 23:04:34" + "time": "2017-03-23 18:33:02" }, { "name": "wikimedia/assert", diff --git a/extensions/Wikibase/client/i18n/ar.json b/extensions/Wikibase/client/i18n/ar.json index ada4bd7..ccc0d58 100644 --- a/extensions/Wikibase/client/i18n/ar.json +++ b/extensions/Wikibase/client/i18n/ar.json @@ -85,6 +85,7 @@ "wikibase-rc-show-wikidata-pref": "إظهار تعديلات {{WBREPONAME}} في صفحة أحدث التغييرات", "wikibase-rc-wikibase-edit-letter": "د", "wikibase-rc-wikibase-edit-title": "تعديل {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-label": "تعديلات {{WBREPONAME}}", "wikibase-replicationnote": "قد يلزم وقت لتظهر التعديلات في جميع الويكيات.", "wikibase-watchlist-show-changes-pref": "إظهار تعديلات {{WBREPONAME}} في قائمة مراقبتك", "wikibase-error-deserialize-error": "فشل إلغاء تسلسل البيانات.", diff --git a/extensions/Wikibase/client/i18n/de.json b/extensions/Wikibase/client/i18n/de.json index 3503c63..3abb7da 100644 --- a/extensions/Wikibase/client/i18n/de.json +++ b/extensions/Wikibase/client/i18n/de.json @@ -73,6 +73,12 @@ "wikibase-rc-show-wikidata-pref": "Bearbeitungen auf {{WBREPONAME}} in den „Letzten Änderungen“ anzeigen", "wikibase-rc-wikibase-edit-letter": "D", "wikibase-rc-wikibase-edit-title": "{{WBREPONAME}}-Bearbeitung", + "wikibase-rcfilters-hide-wikibase-label": "{{WBREPONAME}}-Bearbeitungen", + "wikibase-rcfilters-hide-wikibase-description": "Bearbeitungen, die von {{WBREPONAME}} abstammen.", + "wikibase-rcfilters-hide-wikibase-conflicts-ores": "Dieser Filter befindet sich in Konflikt mit einem oder mehreren Beitragqualitäts- oder Benutzerabsichtfiltern. Qualitäts- und Absichtprognosen sind für {{WBREPONAME}}-Bearbeitungen nicht verfügbar.", + "wikibase-rcfilters-hide-wikibase-conflicts-ores-global": "Der Filter „{{WBREPONAME}}-Bearbeitungen“ befindet sich in Konflikt mit einem oder mehreren Beitragqualitäts- oder Benutzerabsichtfiltern. Qualitäts- und Absichtprognosen sind für {{WBREPONAME}}-Bearbeitungen nicht verfügbar. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.", + "wikibase-rcfilters-damaging-conflicts-hide-wikibase": "Beitragqualitätsprognosen sind für bestimmte Änderungstypen nicht verfügbar, so dass sich dieser Filter in Konflikt mit {{PLURAL:$2|dem folgenden Änderungstypfilter|den folgenden Änderungstypfiltern}} befindet: $1", + "wikibase-rcfilters-goodfaith-conflicts-hide-wikibase": "Benutzerabsichtprognosen sind für bestimmte Änderungstypen nicht verfügbar, so dass sich dieser Filter in Konflikt mit {{PLURAL:$2|dem folgenden Änderungstypfilter|den folgenden Änderungstypfiltern}} befindet: $1", "wikibase-replicationnote": "Bitte bedenke, dass es einige Minuten dauern kann, bis die Änderungen auf allen Wikis sichtbar sind.", "wikibase-watchlist-show-changes-pref": "Bearbeitungen auf {{WBREPONAME}} in der Beobachtungsliste anzeigen", "wikibase-error-deserialize-error": "Daten konnten nicht deserialisiert werden.", diff --git a/extensions/Wikibase/client/i18n/fr.json b/extensions/Wikibase/client/i18n/fr.json index b6f8020..12465a9 100644 --- a/extensions/Wikibase/client/i18n/fr.json +++ b/extensions/Wikibase/client/i18n/fr.json @@ -90,6 +90,12 @@ "wikibase-rc-show-wikidata-pref": "Afficher les modifications de {{WBREPONAME}} dans les modifications récentes", "wikibase-rc-wikibase-edit-letter": "D", "wikibase-rc-wikibase-edit-title": "Modification de {{WBREPONAME}}.", + "wikibase-rcfilters-hide-wikibase-label": "Modifications {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-description": "Modifications qui proviennent de {{WBREPONAME}}.", + "wikibase-rcfilters-hide-wikibase-conflicts-ores": "Ce filtre est en conflit avec au moins un filtre de Qualité de la contribution ou d’intention de l’utilisateur. Les prédictions de qualité ou d’intention ne sont pas disponibles pour les modifications de {{WBREPONAME}}.", + "wikibase-rcfilters-hide-wikibase-conflicts-ores-global": "Le filtre « modifications {{WBREPONAME}} » est en conflit avec au moins un filtre de Qualité de la contribution ou d’intention de l’utilisateur. Les prédictions de qualité et d’intention ne sont pas disponibles pour les modifications {{WBREPONAME}}. Les filtres en conflit sont marqués dans la zone des filtres actifs ci-dessus.", + "wikibase-rcfilters-damaging-conflicts-hide-wikibase": "Les prédictions de Qualité de la contribution ne sont pas disponibles pour certains types de modification, donc ce filtre est en conflit avec {{PLURAL:$2|le filtre de type de modification suivant|les filtres de type de modification suivants}} : $1", + "wikibase-rcfilters-goodfaith-conflicts-hide-wikibase": "Les prédictions d’Intention de l’utilisateur ne sont pas disponibles pour certains types de modification, donc ce filtre est en conflit avec {{PLURAL:$2|le filtre de type de modification suivant|les filtres de type de modification suivants}} : $1", "wikibase-replicationnote": "Veuillez noter que cela peut prendre plusieurs minutes avant que les modifications soient visibles sur tous les wikis.", "wikibase-watchlist-show-changes-pref": "Voir les modifications de {{WBREPONAME}} dans votre liste de suivi", "wikibase-error-deserialize-error": "Échec à la désérialisation des données.", diff --git a/extensions/Wikibase/client/i18n/gl.json b/extensions/Wikibase/client/i18n/gl.json index be3372a..ec2fce3 100644 --- a/extensions/Wikibase/client/i18n/gl.json +++ b/extensions/Wikibase/client/i18n/gl.json @@ -71,6 +71,8 @@ "wikibase-rc-show-wikidata-pref": "Mostrar as modificacións de {{WBREPONAME}} nos cambios recentes", "wikibase-rc-wikibase-edit-letter": "D", "wikibase-rc-wikibase-edit-title": "Edición de {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-label": "Edicións de {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-description": "Edicións con orixe en {{WBREPONAME}}.", "wikibase-replicationnote": "Teña en conta que pode levar varios minutos que as modificacións sexan visibles en todos os wikis.", "wikibase-watchlist-show-changes-pref": "Mostrar as modificacións de {{WBREPONAME}} na súa lista de vixilancia", "wikibase-error-deserialize-error": "Erro ao deseriar os datos.", diff --git a/extensions/Wikibase/client/i18n/he.json b/extensions/Wikibase/client/i18n/he.json index 5a5e90f..a6394e7 100644 --- a/extensions/Wikibase/client/i18n/he.json +++ b/extensions/Wikibase/client/i18n/he.json @@ -75,6 +75,12 @@ "wikibase-rc-show-wikidata-pref": "הצגת עריכות שנעשו ב{{GRAMMAR:תחילית|{{WBREPONAME}}}} בדף השינויים האחרונים", "wikibase-rc-wikibase-edit-letter": "נ", "wikibase-rc-wikibase-edit-title": "עריכה ב{{GRAMMAR:תחילית|{{WBREPONAME}}}}", + "wikibase-rcfilters-hide-wikibase-label": "עריכות {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-description": "עריכות שמקורן ב{{GRAMMAR:תחילית|{{WBREPONAME}}}}", + "wikibase-rcfilters-hide-wikibase-conflicts-ores": "המסנן הזה מתנגש עם אחד ממסנני איכות תרומות או כוונת משתמש. חיזויי איכות וכוונה אינם זמינים לעריכות {{WBREPONAME}}.", + "wikibase-rcfilters-hide-wikibase-conflicts-ores-global": "מסנן \"עריכות {{WBREPONAME}}\" מתנגש עם אחד ממסנני \"איכות תרומות\" או \"כוונת משתמש\". חיזויי איכות וכוונה אינם זמינים לעריכות {{WBREPONAME}}. המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.", + "wikibase-rcfilters-damaging-conflicts-hide-wikibase": "חיזויי איכות תרומות אינם זמינים לסוגים מסוימים של שינויים, אז המסנן הזה מתנגש עם {{PLURAL:$2|מסנן סוג השינוי הבא|מסנני סוג השינוי הבאים}}: $1", + "wikibase-rcfilters-goodfaith-conflicts-hide-wikibase": "חיזויי כוונת משתמש אינם זמינים לסוגים מסוימים של שינויים, אז המסנן הזה מתנגש עם {{PLURAL:$2|מסנן סוג השינוי הבא|מסנני סוג השינוי הבאים}}: $1", "wikibase-replicationnote": "יש לשים לב שייתכן שייקח מספר דקות עד שהשינויים יוצגו בכל אתרי הוויקי.", "wikibase-watchlist-show-changes-pref": "הצגת עריכות שנעשו ב{{GRAMMAR:תחילית|{{WBREPONAME}}}} ברשימת המעקב", "wikibase-error-deserialize-error": "הוצאת נתונים מהסדרה לא עבדה.", diff --git a/extensions/Wikibase/client/i18n/it.json b/extensions/Wikibase/client/i18n/it.json index 494304a..3fda05a 100644 --- a/extensions/Wikibase/client/i18n/it.json +++ b/extensions/Wikibase/client/i18n/it.json @@ -84,6 +84,8 @@ "wikibase-rc-show-wikidata-pref": "Mostra le modifiche di {{WBREPONAME}} nelle ultime modifiche", "wikibase-rc-wikibase-edit-letter": "D", "wikibase-rc-wikibase-edit-title": "Modifica effettuata su {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-label": "modifiche {{WBREPONAME}}", + "wikibase-rcfilters-hide-wikibase-description": "Modifiche che hanno origine da {{WBREPONAME}}.", "wikibase-replicationnote": "Potrebbero essere necessari diversi minuti prima che le modifiche siano visibili su tutti i wiki", "wikibase-watchlist-show-changes-pref": "Mostra le modifiche su {{WBREPONAME}} nella tua lista degli osservati speciali", "wikibase-error-deserialize-error": "Errore nella deserializzazione dei dati.", diff --git a/extensions/Wikibase/client/i18n/qqq.json b/extensions/Wikibase/client/i18n/qqq.json index 91f05e2..a845e92 100644 --- a/extensions/Wikibase/client/i18n/qqq.json +++ b/extensions/Wikibase/client/i18n/qqq.json @@ -86,7 +86,7 @@ "wikibase-rc-show-wikidata-pref": "Option in the recent changes section of preferences to show wikibase changes by default in recent changes.", "wikibase-rc-wikibase-edit-letter": "Very short form of \"'''wikidata edit'''\". Used in [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nSee also:\n* {{msg-mw|Newpageletter}}\n* {{msg-mw|Minoreditletter}}\n* {{msg-mw|Boteditletter}}\n* {{msg-mw|Unpatrolledletter}}", "wikibase-rc-wikibase-edit-title": "Tooltip for {{msg-mw|wikibase-rc-wikibase-edit-letter}}.\n\nSee also:\n* {{msg-mw|Recentchanges-label-newpage}}\n* {{msg-mw|Recentchanges-label-minor}}\n* {{msg-mw|Recentchanges-label-bot}}\n* {{msg-mw|Recentchanges-label-unpatrolled}}\n{{Identical|Edit}}", - "wikibase-rcfilters-hide-wikibase-label": "Label for 'Wikidata edits' filter on ChangesList pages (such as RecentChanges)", + "wikibase-rcfilters-hide-wikibase-label": "Label for \"Wikidata edits\" filter on ChangesList pages (such as RecentChanges).", "wikibase-rcfilters-hide-wikibase-description": "Description for 'Wikidata edits' filter on ChangesList pages (such as RecentChanges)", "wikibase-rcfilters-hide-wikibase-conflicts-ores": "Tooltip shown when hovering over a 'Wikidata edits' filter tag, when a ORES filter is also selected.\n* 'Contribution quality' is based on {{msg-mw|Ores-rcfilters-damaging-title}}.\n* 'User intent' is based on {{msg-mw|Ores-rcfilters-goodfaith-title}}.", "wikibase-rcfilters-hide-wikibase-conflicts-ores-global": "Message shown in the result area when both an ORES filter and the 'Wikidata edits' filter are selected. This indicates that no results will be shown because propagated Wikidata edits do not have ORES scores available.\n\n* \"Wikidata edits\" is {{msg-mw|wikibase-rcfilters-hide-wikibase-label}}.\n* \"Contribution quality\" is based on {{msg-mw|Ores-rcfilters-damaging-title}}.\n* \"User intent\" is based on {{msg-mw|Ores-rcfilters-goodfaith-title}}.\n* \"Active Filters\" is based on {{msg-mw|rcfilters-activefilters}}.", diff --git a/extensions/Wikibase/client/i18n/zh-hans.json b/extensions/Wikibase/client/i18n/zh-hans.json index e25d88a..9a12470 100644 --- a/extensions/Wikibase/client/i18n/zh-hans.json +++ b/extensions/Wikibase/client/i18n/zh-hans.json @@ -85,6 +85,12 @@ "wikibase-rc-show-wikidata-pref": "在最近更改中显示{{WBREPONAME}}编辑", "wikibase-rc-wikibase-edit-letter": "数", "wikibase-rc-wikibase-edit-title": "{{WBREPONAME}}编辑", + "wikibase-rcfilters-hide-wikibase-label": "{{WBREPONAME}}编辑", + "wikibase-rcfilters-hide-wikibase-description": "在{{WBREPONAME}}引起的编辑。", + "wikibase-rcfilters-hide-wikibase-conflicts-ores": "该过滤器与一个或多个贡献质量或用户目的过滤器冲突。质量和目的预测不可用于{{WBREPONAME}}的编辑。", + "wikibase-rcfilters-hide-wikibase-conflicts-ores-global": "“{{WBREPONAME}}编辑”过滤器与一个或多个贡献质量或用户目的过滤器冲突。质量和目的预测不可用于{{WBREPONAME}}编辑。冲突过滤器已在上方活跃过滤器中被标记。", + "wikibase-rcfilters-damaging-conflicts-hide-wikibase": "贡献质量预测对于某些更改类型不可用,因此该过滤器与以下更改{{PLURAL:$2|过滤器}}类型相冲突:$1", + "wikibase-rcfilters-goodfaith-conflicts-hide-wikibase": "用户目的预测对于某些更改类型不可用,因此该过滤器与以下更改{{PLURAL:$2|过滤器}}类型相冲突:$1", "wikibase-replicationnote": "该更改可能需要几分钟才能在所有的维基项目上显示,请谅解。", "wikibase-watchlist-show-changes-pref": "在您的监视列表中显示{{WBREPONAME}}编辑", "wikibase-error-deserialize-error": "无法反序列化数据。", diff --git a/extensions/Wikibase/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php b/extensions/Wikibase/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php index 2e0f963..b1f525e 100644 --- a/extensions/Wikibase/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php +++ b/extensions/Wikibase/client/includes/Hooks/ChangesListSpecialPageHookHandlers.php @@ -233,20 +233,24 @@ if ( $extensionRegistry->isLoaded( 'ORES' ) ) { $damagingGroup = $specialPage->getFilterGroup( 'damaging' ); - $wikidataFilter->conflictsWith( - $damagingGroup, - 'wikibase-rcfilters-hide-wikibase-conflicts-ores-global', - 'wikibase-rcfilters-hide-wikibase-conflicts-ores', - 'wikibase-rcfilters-damaging-conflicts-hide-wikibase' - ); + if ( $damagingGroup ) { + $wikidataFilter->conflictsWith( + $damagingGroup, + 'wikibase-rcfilters-hide-wikibase-conflicts-ores-global', + 'wikibase-rcfilters-hide-wikibase-conflicts-ores', + 'wikibase-rcfilters-damaging-conflicts-hide-wikibase' + ); + } $goodfaithGroup = $specialPage->getFilterGroup( 'goodfaith' ); - $wikidataFilter->conflictsWith( - $goodfaithGroup, - 'wikibase-rcfilters-hide-wikibase-conflicts-ores-global', - 'wikibase-rcfilters-hide-wikibase-conflicts-ores', - 'wikibase-rcfilters-goodfaith-conflicts-hide-wikibase' - ); + if ( $goodfaithGroup ) { + $wikidataFilter->conflictsWith( + $goodfaithGroup, + 'wikibase-rcfilters-hide-wikibase-conflicts-ores-global', + 'wikibase-rcfilters-hide-wikibase-conflicts-ores', + 'wikibase-rcfilters-goodfaith-conflicts-hide-wikibase' + ); + } } } diff --git a/extensions/Wikibase/client/includes/Hooks/MagicWordHookHandlers.php b/extensions/Wikibase/client/includes/Hooks/MagicWordHookHandlers.php index f01a177..30e5b36 100644 --- a/extensions/Wikibase/client/includes/Hooks/MagicWordHookHandlers.php +++ b/extensions/Wikibase/client/includes/Hooks/MagicWordHookHandlers.php @@ -6,6 +6,7 @@ use Message; use Parser; use ResourceLoaderContext; +use Wikibase\NoLangLinkHandler; use Wikibase\SettingsArray; use Wikibase\Client\WikibaseClient; diff --git a/extensions/Wikibase/repo/i18n/gl.json b/extensions/Wikibase/repo/i18n/gl.json index 6c90fcf..7da9609 100644 --- a/extensions/Wikibase/repo/i18n/gl.json +++ b/extensions/Wikibase/repo/i18n/gl.json @@ -434,17 +434,17 @@ "apihelp-wbgetentities-param-sitefilter": "Filtrar ligazóns de sitios en entidades a aquellos con estos identificadores de sitio.", "apihelp-wbgetentities-example-1": "Obter entidades con identificador <samp>Q42</samp> con todos os atributos dispoñibles en todos os idiomas dispoñibles", "apihelp-wbgetentities-example-2": "Obter entidades con identificador <samp>P17</samp> con todos os atributos dispoñibles en todos os idiomas dispoñibles", - "apihelp-wbgetentities-example-3": "Obter entidades con identificadores Q42 e P17 con todos os atributos dispoñibles en todos os idiomas dispoñibles", - "apihelp-wbgetentities-example-4": "Obter entidades con identificador Q42 con todos os atributos dispoñibles en inglés", - "apihelp-wbgetentities-example-5": "Obter entidades con identificador Q42 con todos os atributos dispoñibles en calquera redución de idiomas posible para o idioma ii", - "apihelp-wbgetentities-example-6": "Obter entidades con identificador Q42 con todas as etiquetas en todos os idiomas dispoñibles", - "apihelp-wbgetentities-example-7": "Obter entidades con identificadores P17 e P3 que só teñen tipos de datos", - "apihelp-wbgetentities-example-8": "Obter entidades con identificador Q42 con todos os seus alias en inglés", - "apihelp-wbgetentities-example-9": "Obter entidades con identificadores Q1 e Q42 con descricións en inglés, alemán e francés", - "apihelp-wbgetentities-example-10": "Obtén o elemento para a páxina \"Berlín\" no sitio \"enwiki\", cos atributos de idioma en inglés", - "apihelp-wbgetentities-example-11": "Obtén o elemento da páxina \"Berlín\" no sitio \"enwiki\" despois de normalizar o título a \"berlín\"", - "apihelp-wbgetentities-example-12": "Obter as ligazóns de sitio do elemento Q42", - "apihelp-wbgetentities-example-13": "Obter as entidades con identificador Q42 que só teñen ligazóns de sitio de \"enwiki\"", + "apihelp-wbgetentities-example-3": "Obter entidades con identificadores <samp>Q42</samp> e <samp>P17</samp> con todos os atributos dispoñibles en todos os idiomas dispoñibles", + "apihelp-wbgetentities-example-4": "Obter entidades con identificador <samp>Q42</samp> con todos os atributos dispoñibles en inglés", + "apihelp-wbgetentities-example-5": "Obter entidades con identificador <samp>Q42</samp> con todos os atributos dispoñibles en calquera redución de idiomas posible para o idioma <var>ii</var>", + "apihelp-wbgetentities-example-6": "Obter entidades con identificador <samp>Q42</samp> con todas as etiquetas en todos os idiomas dispoñibles", + "apihelp-wbgetentities-example-7": "Obter entidades con identificadores <samp>P17</samp> e <samp>P3</samp> que só teñen tipos de datos", + "apihelp-wbgetentities-example-8": "Obter entidades con identificador <samp>Q42</samp> con todos os seus alias en inglés", + "apihelp-wbgetentities-example-9": "Obter entidades con identificadores <samp>Q1</samp> e <samp>Q42</samp> con descricións en inglés, alemán e francés", + "apihelp-wbgetentities-example-10": "Obtén o elemento para a páxina \"<var>Berlin</var>\" no sitio \"<var>enwiki</var>\", cos atributos de idioma en inglés", + "apihelp-wbgetentities-example-11": "Obtén o elemento da páxina \"<var>Berlin</var>\" no sitio \"<var>enwiki</var>\" despois de normalizar o título a \"<var>berlin</var>\"", + "apihelp-wbgetentities-example-12": "Obter as ligazóns de sitio do elemento <samp>Q42</samp>", + "apihelp-wbgetentities-example-13": "Obter as entidades con identificador <samp>Q42</samp> que só teñen ligazóns de sitio de \"<var>enwiki</var>\"", "apihelp-wblinktitles-description": "Asocia dous artigos en dúas wikis diferentes cun elemento Wikibase.", "apihelp-wblinktitles-param-tosite": "Un identificador para o sitio no que reside a páxina.\nÚseo xunto con <var>totitle</var> para crear unha ligazón completa ó sitio.", "apihelp-wblinktitles-param-totitle": "Título da páxina a asociar.\nÚseo xunto con <var>tosite</var> para crear unha ligazón completa ó sitio.", @@ -455,15 +455,15 @@ "apihelp-wbmergeitems-description": "Fusiona varios elementos.", "apihelp-wbmergeitems-param-fromid": "O identificador desde o que fusionar", "apihelp-wbmergeitems-param-toid": "O identificador co que fusionar", - "apihelp-wbmergeitems-param-ignoreconflicts": "Matriz de elementos do obxecto para os que ignorar conflitos, só pode conter valores de \"description\" (descrición) e ou \"sitelink\" (ligazón de sitio) e ou \"statement\" (declaración)", + "apihelp-wbmergeitems-param-ignoreconflicts": "Matriz de elementos do obxecto para os que ignorar conflitos. Só pode conter valores de \"<var>description</var>\" (descrición), \"<var>sitelink</var>\" (ligazón de sitio) e \"<var>statement</var>\" (declaración)", "apihelp-wbmergeitems-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", "apihelp-wbmergeitems-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", - "apihelp-wbmergeitems-example-1": "Fusiona datos desde Q42 en Q222", - "apihelp-wbmergeitems-example-2": "Fusiona datos desde Q555 en Q3", - "apihelp-wbmergeitems-example-3": "Fusiona datos desde Q66 en Q99 ignorando calquera ligazón de sitio conflitiva", - "apihelp-wbmergeitems-example-4": "Fusiona datos desde Q66 en Q99 ignorando calquera ligazón de sitio ou descricións conflitivas", - "apihelp-wbparsevalue-description": "Analiza valores usando un analizador de valores.", - "apihelp-wbparsevalue-param-parser": "Identificador do analizador de valores a usar. <span class=\"apihelp-deprecated\">Obsoleto</span>. Utilice o parámetro <var>datatype</var> no seu lugar.", + "apihelp-wbmergeitems-example-1": "Fusiona datos desde <samp>Q42</samp> en <samp>Q222</samp>", + "apihelp-wbmergeitems-example-2": "Fusiona datos desde <samp>Q555</samp> en <samp>Q3</samp>", + "apihelp-wbmergeitems-example-3": "Fusiona datos desde <samp>Q66</samp> en <samp>Q99</samp> ignorando calquera ligazón de sitio conflitiva", + "apihelp-wbmergeitems-example-4": "Fusiona datos desde <samp>Q66</samp> en <samp>Q99</samp> ignorando calquera ligazón de sitio ou descricións conflitivas", + "apihelp-wbparsevalue-description": "Analiza valores usando un <code>ValueParser</code> (analizador de valores).", + "apihelp-wbparsevalue-param-parser": "Identificador do <code>ValueParser</code> (analizador de valores) a usar. <span class=\"apihelp-deprecated\">Obsoleto</span>. Utilice o parámetro <var>datatype</var> no seu lugar.", "apihelp-wbparsevalue-param-datatype": "Tipo de datos do valor a analizar. Determina o analizador a utilizar.", "apihelp-wbparsevalue-param-validate": "Se adicionalmente verificar os datos transmitidos.", "apihelp-wbparsevalue-param-values": "Valores a analizar", @@ -479,18 +479,18 @@ "apihelp-wbremoveclaims-example-1": "Eliminar afirmación con GUID de \"Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0N\"", "apihelp-wbremovequalifiers-description": "Elimina un cualificador dunha afirmación.", "apihelp-wbremovequalifiers-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", - "apihelp-wbremovequalifiers-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", + "apihelp-wbremovequalifiers-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", "apihelp-wbremovequalifiers-param-claim": "O GUID que identifica a afirmación da que eliminar os cualificadores", "apihelp-wbremovequalifiers-param-qualifiers": "Función hash do snak dos cualificadores a eliminar", "apihelp-wbremovequalifiers-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", - "apihelp-wbremovequalifiers-example-1": "Eliminar o cualificador con función hash \"1eb8793c002b1d9820c833d234a1b54c8e94187e\" da afirmación con GUID \"Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F\"", + "apihelp-wbremovequalifiers-example-1": "Eliminar o cualificador con función hash \"<var>1eb8793c002b1d9820c833d234a1b54c8e94187e</var>\" da afirmación con GUID \"<var>Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F</var>\"", "apihelp-wbremovereferences-description": "Elimina un ou máis referencias á mesma declaración.", "apihelp-wbremovereferences-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", - "apihelp-wbremovereferences-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", + "apihelp-wbremovereferences-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", "apihelp-wbremovereferences-param-statement": "Un GUID que identifica a declaración para a que se vai fixar a referencia", "apihelp-wbremovereferences-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", "apihelp-wbremovereferences-param-references": "As funcións hash das referencias que deben ser eliminadas", - "apihelp-wbremovereferences-example-1": "Eliminar a referencia coa función hash \"455481eeac76e6a8af71a6b493c073d54788e7e9\" da declaración con GUID \"Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F\"", + "apihelp-wbremovereferences-example-1": "Eliminar a referencia coa función hash \"<var>455481eeac76e6a8af71a6b493c073d54788e7e9</var>\" da declaración con GUID \"<var>Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F</var>\"", "apihelp-wbsearchentities-description": "Busca entidades usando etiquetas e alias.\nDevolve unha etiqueta e descrición para a entidade na lingua do usuario, se é posible.\nDevolve os detalles do termo asociado.\nO texto do termo asociado tamén está presente na clave alias se se é diferente da etiqueta que se visualiza.", "apihelp-wbsearchentities-param-search": "Buscar este texto.", "apihelp-wbsearchentities-param-language": "Buscar neste idioma.", @@ -515,8 +515,8 @@ "apihelp-query+wbsubscribers-param-entities": "Entidades das que obter os subscritores", "apihelp-query+wbsubscribers-param-prop": "Propiedades a engadir ó resultado", "apihelp-query+wbsubscribers-param-limit": "Número máximo de resultados", - "apihelp-query+wbsubscribers-example-1": "Obter os subscritores á entidade Q42", - "apihelp-query+wbsubscribers-example-2": "Obter os subscritores á entidade Q42 coa URL a Special:EntityUsage incluída", + "apihelp-query+wbsubscribers-example-1": "Obter os subscritores á entidade <samp>Q42</samp>", + "apihelp-query+wbsubscribers-example-2": "Obter os subscritores á entidade <samp>Q42</samp> coa URL a <code>Special:EntityUsage</code> incluída", "apihelp-wbsetaliases-description": "Fixa os alias para unha entidade de Wikibase.", "apihelp-wbsetaliases-param-id": "Identificador da entidade, incluíndo o prefixo. \nUse <var>id</var> ou <var>site</var> e <var>title</var> xuntos.", "apihelp-wbsetaliases-param-new": "Si se establece, se creará una entidad nueva.\nEstablece esto al tipo de entidad que quieres crear.", @@ -524,32 +524,32 @@ "apihelp-wbsetaliases-param-title": "Título da páxina a asociar.\nÚseo xunto con <var>site</var> para crear unha ligazón completa ó sitio.", "apihelp-wbsetaliases-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", "apihelp-wbsetaliases-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", - "apihelp-wbsetaliases-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", + "apihelp-wbsetaliases-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", "apihelp-wbsetaliases-param-add": "Lista de alias a engadir (pode combinarse con <var>remove</var>)", "apihelp-wbsetaliases-param-remove": "Lista de alias a eliminar (pode combinarse con <var>add</var>)", "apihelp-wbsetaliases-param-set": "Lista de alias que reemprazarán á lista actual (non pode ser combinada con <var>add</var> nin con <var>remove</var>)", "apihelp-wbsetaliases-param-language": "Idioma para o cal fixar os alias", - "apihelp-wbsetaliases-example-1": "Fixar os alias en inglés para a entidade con identificador Q1 a Foo e Bar", - "apihelp-wbsetaliases-example-2": "Engadir Foo e Bar á lista de alias en inglés para a entidade con identificador Q1", - "apihelp-wbsetaliases-example-3": "Eliminar Foo e Bar da lista de alias en inglés para a entidade con identificador Q1", - "apihelp-wbsetaliases-example-4": "Eliminar Foo da lista de alias en inglés para a entidade con identificador Q1 e engadirlle o alias Bar", + "apihelp-wbsetaliases-example-1": "Fixar os alias en inglés para a entidade con identificador <samp>Q1</samp> a <var>Foo</var> e <var>Bar</var>", + "apihelp-wbsetaliases-example-2": "Engadir <var>Foo</var> e <var>Bar</var> á lista de alias en inglés para a entidade con identificador <samp>Q1</samp>", + "apihelp-wbsetaliases-example-3": "Eliminar <var>Foo</var> e <var>Bar</var> da lista de alias en inglés para a entidade con identificador <samp>Q1</samp>", + "apihelp-wbsetaliases-example-4": "Eliminar <var>Foo</var> da lista de alias en inglés para a entidade con identificador <samp>Q1</samp> e engadirlle <var>Bar</var>", "apihelp-wbsetclaim-description": "Crea ou actualiza unha declaración ou afirmación enteira.", "apihelp-wbsetclaim-param-claim": "Serialización de declaración ou afirmación", "apihelp-wbsetclaim-param-index": "Índice dentro da lista de declaracións de entidades ó que mover a declaración. Opcional. Teña coidado de que cando se asigne un índice que especifica unha posición que non está a continuación dunha declaración cuxo snak principal non presenta a mesma propiedade, todo o grupo de declaracións cuxo snak principal presenta a mesma propiedade será movido. Cando non se indica, unha declaración existente seguirá no mesmo lugar mentres que unha declaración nova será engadida á última cuxo snak principal presente a mesma propiedade.", "apihelp-wbsetclaim-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", "apihelp-wbsetclaim-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", - "apihelp-wbsetclaim-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", - "apihelp-wbsetclaim-example-1": "Fixar a afirmación co identificador indicado e a propiedade P1 coa cadea de texto co valor de \"City\" (cidade)", - "apihelp-wbsetclaim-example-2": "Asignar a afirmación co identificador dado á propiedade P1 coa cadea de texto con valor \"City\" (cidade) e mover a afirmación á posición superior dentro do subgrupo de afirmacións da entidade que presentan a propiedade snak P1 principal. Adicionalmente, move todo o subgrupo á parte superior de todos os subgrupos engadidos por propiedade.", - "apihelp-wbsetclaim-example-3": "Asignar a declaración co identificador dado á propiedade P1 cunha cadea de texto de valor \"City\" (cidade) e asignar as referencias da declaración a unha referencia simple coa cadea de texto de valor \"The Economy of Cities\" (A economía das cidades) asignada á propiedade P2.", + "apihelp-wbsetclaim-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", + "apihelp-wbsetclaim-example-1": "Fixar a afirmación co identificador indicado e a propiedade <samp>P1</samp> coa cadea de texto co valor de \"<var>City</var>\" (cidade)", + "apihelp-wbsetclaim-example-2": "Asignar a afirmación co identificador dado á propiedade <samp>P1</samp> coa cadea de texto con valor \"<var>City</var>\" (cidade) e mover a afirmación á posición superior dentro do subgrupo de afirmacións da entidade que presentan a propiedade snak <samp>P1</samp> principal. Adicionalmente, move todo o subgrupo á parte superior de todos os subgrupos engadidos por propiedade.", + "apihelp-wbsetclaim-example-3": "Asignar a declaración co identificador dado á propiedade <samp>P1</samp> cunha cadea de texto de valor \"<var>City</var>\" (cidade) e asignar as referencias da declaración a unha referencia simple coa cadea de texto de valor \"<var>The Economy of Cities</var>\" (A economía das cidades) asignada á propiedade <samp>P2</samp>.", "apihelp-wbsetclaimvalue-description": "Fixa o valor dunha afirmación Wikibase.", "apihelp-wbsetclaimvalue-param-claim": "GUID que identifica a afirmación", "apihelp-wbsetclaimvalue-param-snaktype": "O tipo do snak", "apihelp-wbsetclaimvalue-param-value": "Valor para fixar o Valor de Dato do snak principal da afirmación", "apihelp-wbsetclaimvalue-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", "apihelp-wbsetclaimvalue-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", - "apihelp-wbsetclaimvalue-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", - "apihelp-wbsetclaimvalue-example-1": "Fixa a afirmación co GUID de Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F a un valor de Q1", + "apihelp-wbsetclaimvalue-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", + "apihelp-wbsetclaimvalue-example-1": "Fixa a afirmación co GUID de <var>Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F</var> a un valor de <samp>Q1</samp>", "apihelp-wbsetdescription-description": "Fixa unha descrición para unha soa entidade de Wikibase.", "apihelp-wbsetdescription-param-id": "Identificador da entidade, incluíndo o prefixo. \nUse <var>id</var> ou <var>site</var> e <var>title</var> xuntos.", "apihelp-wbsetdescription-param-new": "Se se establece, crearase unha entidade nova.\nEstableza isto ó tipo de entidade que quere crear.", @@ -557,11 +557,11 @@ "apihelp-wbsetdescription-param-title": "Título da páxina a asociar.\nÚseo xunto con <var>site</var> para crear unha ligazón completa ó sitio.", "apihelp-wbsetdescription-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", "apihelp-wbsetdescription-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", - "apihelp-wbsetdescription-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", + "apihelp-wbsetdescription-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", "apihelp-wbsetdescription-param-language": "Idioma da descrición", "apihelp-wbsetdescription-param-value": "Valor para fixar a descrición", - "apihelp-wbsetdescription-example-1": "Asignar ca cadea de texto \"An encyclopedia that everyone can edit\" para a páxina con identificador \"Q42\" como a súa descrición en inglés", - "apihelp-wbsetdescription-example-2": "Asignar a cadea de texto \"An encyclopedia that everyone can edit\" como a descrición en inglés para a páxina cunha ligazón ó sitio enwiki:Wikipedia", + "apihelp-wbsetdescription-example-1": "Asignar ca cadea de texto \"<var>An encyclopedia that everyone can edit</var>\" para a páxina con identificador \"<samp>Q42</samp>\" como a súa descrición en inglés", + "apihelp-wbsetdescription-example-2": "Asignar a cadea de texto \"<var>An encyclopedia that everyone can edit</var>\" como a descrición en inglés para a páxina cunha ligazón ó sitio <var>enwiki:Wikipedia</var>", "apihelp-wbsetlabel-description": "Fixa unha etiqueta para unha soa entidade de Wikibase.", "apihelp-wbsetlabel-param-id": "Identificador da entidade, incluíndo o prefixo. \nUse <var>id</var> ou <var>site</var> e <var>title</var> xuntos.", "apihelp-wbsetlabel-param-new": "Se se establece, crearase unha entidade nova.\nEstableza isto ó tipo de entidade que quere crear.", @@ -569,11 +569,11 @@ "apihelp-wbsetlabel-param-title": "Título da páxina a asociar.\nÚseo xunto con <var>site</var> para crear unha ligazón completa ó sitio.", "apihelp-wbsetlabel-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", "apihelp-wbsetlabel-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", - "apihelp-wbsetlabel-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", + "apihelp-wbsetlabel-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", "apihelp-wbsetlabel-param-language": "Idioma da etiqueta", "apihelp-wbsetlabel-param-value": "Valor da etiqueta", - "apihelp-wbsetlabel-example-1": "Asignar a cadea de texto \"Wikimedia\" para a páxina con identificador \"Q42\" como etiqueta en inglés e notificalo como presentación json", - "apihelp-wbsetlabel-example-2": "Asignar a etiqueta en inglés a \"Earth\" para o obxecto coa ligazón ó sitio enwiki => \"Earth\".", + "apihelp-wbsetlabel-example-1": "Asignar a cadea de texto \"Wikimedia\" para a páxina con identificador \"<samp>Q42</samp>\" como etiqueta en inglés e notificalo como presentación JSON.", + "apihelp-wbsetlabel-example-2": "Asignar a etiqueta en inglés a \"<var>Earth</var>\" para o obxecto coa ligazón ó sitio <var>enwiki</var> => \"<var>Earth</var>\".", "apihelp-wbsetqualifier-description": "Crea un cualificador ou asigna o valor dun xa existente.", "apihelp-wbsetqualifier-param-claim": "Un GUID que identifica a afirmación para a que se vai fixar un cualificador", "apihelp-wbsetqualifier-param-property": "Identificador da propiedade snak.\nSó debe ser proporcionado cando se crea un cualificador novo ou cando se cambia a propiedade dun xa existente.", @@ -582,8 +582,8 @@ "apihelp-wbsetqualifier-param-snakhash": "A función hash do snak a modificar. Só debe proporcionarse para cualificadores existentes.", "apihelp-wbsetqualifier-param-summary": "Resumo da edición.\nEngadirase un comentario xenerado automaticamente. O límite de lonxitude do autocomentario xunto co seu resumo é de 260 caracteres. Teña en conta que todo o que exceda dese límite non será tido en conta.", "apihelp-wbsetqualifier-param-baserevid": "Identificador numérico para a revisión na que basear a edición.\nÚsase para detectar conflitos durante a gravación.", - "apihelp-wbsetqualifier-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"bot\".", - "apihelp-wbsetqualifier-example-1": "Asignar o cualificador da afirmación indicada coa propiedade P1 ó valor de cadea de texto GdyjxP8I6XB3", + "apihelp-wbsetqualifier-param-bot": "Marcar esta edición como bot. Esta etiqueta de URL só será respectada se o usuario pertence ó grupo \"{{int:group-bot}}\".", + "apihelp-wbsetqualifier-example-1": "Asignar o cualificador da afirmación indicada coa propiedade <samp>P1</samp> ó valor de cadea de texto <var>GdyjxP8I6XB3</var>", "apihelp-wbsetreference-description": "Crea unha referencia ou asigna o valor dunha xa existente.", "apihelp-wbsetreference-param-statement": "Un GUID que identifica a declaración para a que se vai fixar a referencia", "apihelp-wbsetreference-param-snaks": "Snak a asignar á referencia. O obxecto JSON con identificadores de propiedade apuntado a matrices contendo os snaks para esa propiedade", diff --git a/extensions/Wikibase/repo/tests/testDispatchCoordinator.php b/extensions/Wikibase/repo/tests/testDispatchCoordinator.php new file mode 100644 index 0000000..4047f1e --- /dev/null +++ b/extensions/Wikibase/repo/tests/testDispatchCoordinator.php @@ -0,0 +1,190 @@ +<?php + +namespace Wikibase\Repo\Tests; + +use LockManagerGroup; +use LogicException; +use Maintenance; +use MediaWiki\MediaWikiServices; +use MWException; +use WANObjectCache; +use Wikibase\Repo\Store\Sql\LockManagerSqlChangeDispatchCoordinator; +use Wikibase\Repo\WikibaseRepo; +use Wikibase\SettingsArray; +use Wikibase\Store\ChangeDispatchCoordinator; +use Wikibase\Store\Sql\SqlChangeDispatchCoordinator; + +$basePath = getenv( 'MW_INSTALL_PATH' ) !== false ? getenv( 'MW_INSTALL_PATH' ) : __DIR__ . '/../../../..'; + +require_once $basePath . '/maintenance/Maintenance.php'; + +/** + * Test maintenance script that runs two dispatching and checks if they conflict. + * The main purpose of this file is to test dispatchChanges.php maintenance script. + * + * @license GPL-2.0+ + * @author Amir Sarabadani <ladsgr...@gmail.com> + */ +class TestDispatchCoordinator extends Maintenance { + + /** + * @var WANObjectCache $cache + */ + private $cache; + + const TABLE_PREFIX = 'fake_'; + + public function __construct() { + parent::__construct(); + + $this->addDescription( + "Test maintenance script that runs two dispatching and checks if they conflict.\n" . + "See docs/change-propagation.wiki for an overview of the change propagation mechanism." + ); + $this->addOption( 'lock', 'Name of the lock manager to test', false, true, 'l' ); + $this->addOption( 'number', 'Number of tries for a lock manager', false, true, 'n' ); + + } + + /** + * @return string[] A mapping of client wiki site IDs to logical database names. + */ + private function getClientWikis() { + return [ 'test1wiki' => 'test1wiki1', 'test2wiki' => 'test2wiki' ]; + } + + /** + * Maintenance script entry point. + */ + public function execute() { + if ( !defined( 'WBL_VERSION' ) ) { + throw new MWException( "WikibaseLib has not been loaded." ); + } + + $this->cache = MediaWikiServices::getInstance()->getMainWANObjectCache(); + $wikibaseRepo = WikibaseRepo::getDefaultInstance(); + + $iterations = (int)$this->getOption( 'number', 30 ); + $this->createFakeTables( $iterations ); + + $coordinatorOne = $this->createCoordinator( $wikibaseRepo->getSettings() ); + $coordinatorOne->initState( $this->getClientWikis() ); + + for ( $i = 1; $i <= $iterations; $i++ ) { + $this->log( "--- Pass $i of $iterations ---" ); + $this->testCoordinator( $coordinatorOne ); + } + } + + /** + * Find and return the proper ChangeDispatchCoordinator + * + * @param SettingsArray $settings + * + * @return ChangeDispatchCoordinator + */ + private function createCoordinator( SettingsArray $settings ) { + $repoID = wfWikiID(); + $lockManagerName = $this->getOption( + 'lock', + $settings->getSetting( 'dispatchingLockManager' ) + ); + if ( !is_null( $lockManagerName ) ) { + $lockManager = LockManagerGroup::singleton( wfWikiID() )->get( $lockManagerName ); + $coordinator = new LockManagerSqlChangeDispatchCoordinator( + $lockManager, + $settings->getSetting( 'changesDatabase' ), + $repoID + ); + } else { + $coordinator = new SqlChangeDispatchCoordinator( + $settings->getSetting( 'changesDatabase' ), + $repoID + ); + } + $coordinator->setChangesTable( self::TABLE_PREFIX . 'wb_changes' ); + $coordinator->setStateTable( self::TABLE_PREFIX . 'wb_changes_dispatch' ); + $coordinator->setLockGraceInterval( 2 ); + $coordinator->setDispatchInterval( 2 ); + + return $coordinator; + } + + /** + * @param ChangeDispatchCoordinator $coordinator + */ + private function testCoordinator( ChangeDispatchCoordinator $coordinator ) { + $clientId = null; + $state = null; + + while ( true ) { + $this->log( "Trying to get a lock on a client wiki..." ); + $state = $coordinator->selectClient(); + + if ( $state ) { + $clientId = $state['chd_site']; + $this->log( "Got a lock on clinet wiki $clientId" ); + break; + } else { + $this->log( "Could not get a lock on any client wiki. Sleep and retry." ); + sleep( 1 ); + } + }; + + $this->writeTestValue( $clientId, 0 ); + + sleep( 1 ); + $this->assertSame( 0, $this->readTestValue( $clientId ) ); + $this->writeTestValue( $clientId, 1 ); + + sleep( 1 ); + $this->assertSame( 1, $this->readTestValue( $clientId ) ); + + $state['chd_seen'] += 1; + $coordinator->releaseClient( $state ); + } + + private function readTestValue( $key ) { + $memcKey = wfMemcKey( 'test-dispatch-coordinator-' . $key ); + $value = $this->cache->get( $memcKey ); + $this->log( "Got cache key $key: $value" ); + return is_string( $value ) ? (int)$value : $value; + } + + private function writeTestValue( $key, $value ) { + $memcKey = wfMemcKey( 'test-dispatch-coordinator-' . $key ); + $this->cache->set( $memcKey, $value, WANObjectCache::TTL_MINUTE * 15 ); + $this->log( "Set cache key $key to $value" ); + } + + private function createFakeTables( $maxIter ) { + $dbw = wfGetDB( DB_MASTER ); + $tables = [ 'wb_changes_dispatch', 'wb_changes' ]; + foreach ( $tables as $table ) { + $dbw->duplicateTableStructure( $table, self::TABLE_PREFIX . $table, true ); + } + + // Inserting a fake change to fool the dispatch coordinator + // Since we count up chd_seen in testCoordinator(), change_id has to be greater than + // the number of times we run the test. + $dbw->insert( self::TABLE_PREFIX . 'wb_changes', [ 'change_id' => $maxIter + 10 ] ); + } + + /** + * @param string $message + */ + public function log( $message ) { + $this->output( date( 'H:i:s' ) . ' ' . $message . "\n", 'dispatchChanges::log' ); + $this->cleanupChanneled(); + } + + private function assertSame( $expected, $actual ) { + if ( $expected !== $actual ) { + throw new LogicException( "Test failed: $actual is not the same as expected $expected" ); + } + } + +} + +$maintClass = TestDispatchCoordinator::class; +require_once RUN_MAINTENANCE_IF_MAIN; diff --git a/extensions/WikimediaBadges/package.json b/extensions/WikimediaBadges/package.json index 7e17e83..914df3e 100644 --- a/extensions/WikimediaBadges/package.json +++ b/extensions/WikimediaBadges/package.json @@ -1,10 +1,10 @@ { - "devDependencies": { - "grunt": "1.0.1", - "grunt-banana-checker": "0.5.0", - "grunt-jsonlint": "1.1.0" - }, - "scripts": { - "test": "grunt test" - } + "devDependencies": { + "grunt": "1.0.1", + "grunt-banana-checker": "0.5.0", + "grunt-jsonlint": "1.1.0" + }, + "scripts": { + "test": "grunt test" + } } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index f07fb06..2264eea 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1357,12 +1357,12 @@ "source": { "type": "git", "url": "https://github.com/wikimedia/mediawiki-extensions-Wikibase.git", - "reference": "f37e244cd624ead83bc9552ff0b5d4c23880948e" + "reference": "eb0756f3f2d86da9f8ce684234a59b04fedea5c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/f37e244cd624ead83bc9552ff0b5d4c23880948e", - "reference": "f37e244cd624ead83bc9552ff0b5d4c23880948e", + "url": "https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/eb0756f3f2d86da9f8ce684234a59b04fedea5c8", + "reference": "eb0756f3f2d86da9f8ce684234a59b04fedea5c8", "shasum": "" }, "require": { @@ -1394,7 +1394,7 @@ "jakub-onderka/php-parallel-lint": ">=0.3 <0.10", "mediawiki/mediawiki-codesniffer": ">=0.4 <0.8" }, - "time": "2017-03-22 22:11:13", + "time": "2017-03-24 03:39:57", "type": "mediawiki-extension", "installation-source": "dist", "autoload": { @@ -1446,12 +1446,12 @@ "source": { "type": "git", "url": "https://gerrit.wikimedia.org/r/mediawiki/extensions/WikimediaBadges", - "reference": "d9546983a02b4b693f66f095916a0b3e043722c4" + "reference": "d4a58bada110d31d1a5c6a9a02b2778950c4cd27" }, "require": { "php": ">=5.3.0" }, - "time": "2017-02-20 23:04:34", + "time": "2017-03-23 18:33:02", "type": "mediawiki-extension", "installation-source": "source", "autoload": { -- To view, visit https://gerrit.wikimedia.org/r/344589 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ibc141d58cad359370c7149ca0fe44cee03bba53a Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikidata Gerrit-Branch: master Gerrit-Owner: WikidataBuilder <wikidata-servi...@wikimedia.de> Gerrit-Reviewer: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: Aude <aude.w...@gmail.com> Gerrit-Reviewer: Jonas Kress (WMDE) <jonas.kr...@wikimedia.de> Gerrit-Reviewer: Siebrand <siebr...@kitano.nl> Gerrit-Reviewer: Tobias Gritschacher <tobias.gritschac...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits