Good to have:
Required:
On Ubuntu 18.04:
apt-get install mysql-server
apt-get install make
apt-get install apache2
Modify MediaWiki:Common.js so that it executes after things are loaded.
mw.loader.using( ['mediawiki.user'] ).done( function() {
… // everything in MediaWiki:Common.js right now
} );
addOnloadHook()
to $(document.ready(…))
. See Legacy removals for more information. For example, change
addOnloadHook(CustomizeModificationsOfSidebar);
to
$(document.ready( function() { CustomizeModificationsOfSidebar(); } );
wikipathways.username
should be replaced with a "proper" mwjs fetching of the user name. You can use mw.config.get("wgUserName")
.
tbd
tbd
For simple git actions across all submodules, the wpgit.sh
provides some handy commands, for example:
./wpgit.sh status #perform git status on all repos
tbd
Since I like to have a concrete target when I write, I'll document how I'm solving a problem that Egon found. This will demonstrate how I examine the code and give some idea of how to use the git submodules.
1) Once the page in the bug loads I confirm that clicking any author's name brings up their user page. Clicking “et al.” does not appear to work.
2) Checking the Javascript console, I see the following message: ReferenceError: AuthorInfo is not defined
3) Mousing over “et al.” I see: javascript:AuthorInfo.showAllAuthors()
4) Using git submodule foreach
to invoke git grep
, we can search all the repositories in under a second. When we do, we find it:
$ git submodule foreach 'git grep showAllAuthors || :'
Entering 'extensions/BiblioPlus'
Entering 'extensions/Cite'
Entering 'extensions/CodeEditor'
Entering 'extensions/ConfirmEdit'
Entering 'extensions/ContributionScores'
Entering 'extensions/EmbedVideo'
Entering 'extensions/GPML'
modules/AuthorInfo.js: html += ", <a href='javascript:AuthorInfo.showAllAuthors()' " +
modules/AuthorInfo.js:AuthorInfo.showAllAuthors = function() {
Entering 'extensions/GPMLConverter'
5) From here, we can see that the GPML extension should be loading modules/AuthorInfo.js
in order to provide the function. It appears that this is missing.
Also, since we know it is in the [GPML extension's repository](https://github.com/wikipathways/mediawiki-extensions-WikiPathways-GPML), we can narrow our work to that repository. Using ```git grep``` again, we check to make sure that the file is in the list of files available to [ResourceLoader](https://www.mediawiki.org/wiki/ResourceLoader):
```sh
$ cd extensions/GPML
$ git grep -n AuthorInfo.js
extension.json:64: "AuthorInfo.js"
```
6) To find the module for the AuthorInfo.js file, we examine the file extension.json
in the GPML extension. From here, we can see that if ResourceLoader is told to load the wpi.AuthorInfo module, then it will send the AuthorInfo.js file:
$ jq -c '.ResourceModules | to_entries[] | \
select( .value.scripts | index("AuthorInfo.js") )| \
.key' extensions/GPML/extension.json
"wpi.AuthorInfo"
7) Using git grep only on the GPML
extension, we find that the wpi.AuthorInfo
module is called just before we return from WikiPathways\GPML\AuthorInfoList::render()
:
$ cd extensions/GPML
$ git grep -n wpi.AuthorInfo
extension.json:62: "wpi.AuthorInfo": {
src/AuthorInfoList.php:182: $parser->getOutput()->addModules( "wpi.AuthorInfo" );
src/Content.php:249: [ "wpi.AuthorInfo", "wpi.Pathway", "wpi.toggleButton", "wpi.PageEditor" ]
8) MediaWiki is told in WikiPathways\GPML\Hook::onParserFirstCallInit()
to call WikiPathways\GPML\AuthorInfoList::render()
when it comes across the <AuthorInfo>
tag in wikitext:
$ git grep -n B 2 AuthorInfoList::render
src/Hook.php-54- public static function onParserFirstCallInit( Parser &$parser ) {
src/Hook.php-55- $parser->setHook(
src/Hook.php:56: "AuthorInfo", "WikiPathways\\GPML\\AuthorInfoList::render"
9) We can't find the <AuthorInfo>
tag anywhere in GPML, so let's look in the other extensions:
$ pwd
…/new.wikipathways.org/extensions/GPML
$ git grep ‘<AuthorInfo'
$ cd ..
$ git submodule foreach -q 'git grep "<AuthorInfo" || :'
$
10) Since it isn't invoked anywhere (<AuthorInfo>
is kept for backwards compatibility just in case anyone used it in wikitext somewhere), let's look at the other match back in step 7. There we saw that the wpi.AuthorInfo
module is also included in WikiPathways\GPML\Content::fillParserOutput()
but is this ever called?
Let's do a brute force check:
```
$ curl https://vm1.wikipathways.org/Pathway:WP528?debug=true | grep wpi.AuthorInfo
<script>(window.RLQ=window.RLQ||[]).push(function(){mw.loader.load(["wpi.PathwayLoader.js","wpi.openInPathVisio","wpi.Dropdown","wpi.CurationTags","wpi.AuthorInfo","wpi.XrefPanel","wpi.Pathway","wpi.toggleButton","wpi.PageEditor","mediawiki.action.view.postEdit","site","mediawiki.page.startup","mediawiki.user","mediawiki.hidpi","mediawiki.page.ready","jquery.tablesorter","mediawiki.searchSuggest","ext.biblioPlus.qtip.config","skins.vector.js"]);});</script>
```
*(Note the use of ```?debug=true``` to keep MediaWiki from minimizing the output and allowing us to read it.)*
This shows us that it is at least referenced in the output.
11) Adding ?debug=true
to the url we want to check (like this) and then loading it in the browser forces each javascript file to be loaded seperately. When we do this, it looks clicking “et al.” works without a problem.
12) We visit the page again without ?debug=true
and purge the cache. The problem re-appears
At this point, we conclude that we found a bug in MediaWiki's handling of javascript files.
13) (2 days later) After having a chance to sleep on it, we remember that ResourceLoader is minifying the javascript and, in the process changing the global name AuthorInfo
. Since we want to keep the old behavior (and we aren't JS natives), we consult the documentation for developers migrating to ResourceLoader, especially the bit on global scope and discover that we can fix this by looking for AuthorInfo
in our js file and replace it with document.AuthorInfo
.