This week I’m at the Wikimedia Technical Conference in Atlanta, Georgia. I’ve attended a bunch of great sessions and I’m getting a lot out of my attendance. Today I attended a session about “user scripts” that piqued my interest.
MediaWiki user scripts are powerful user-customizations, written in JavaScript, that themselves exists as pages on the wiki and are used to modify a user’s view of MediaWiki page. There are many available user scripts, and you can also write your own directly in your common.js user page (or in any lowercase user page).
I’m enamoured by all of this. Going into this session, I wasn’t too terribly familiar with gadgets and user scripts – but I learned a ton! The folks in the community know best the kinds of customizations that will improve their lives, and here’s the mechanism by which they’re empowered to make that happen. There are, however, some issues with this approach.
I love wikipages, but I was, long-ago, crippled by Vim and I can’t edit any long-form text outside of Vim and a wikipage is not Vim. Further, code review for user scripts seems, from what I’m told anyway, a bit ad hoc.
One of the projects I spend a lot of time digging in is git; particularly in the
contrib
folder of the project. There are all sorts of
strange and wonderful scripts there. One contrib script that I’ve been
aware of for years is mw-to-git
which is a perl module that provides a custom MediaWiki remote for git
repos. This, to me, seems like a potential solution to this problem.
Setup and usage
After you’ve installed git-mediawiki
and have that in
your path and the perl module installed, the process is not too
involved.
First, you initialize a git repo setting the “pages” variable on the
remote to limit it only to the pages you’re interested in. In this
instance, I’m interested in my user’s common.js
file:
$ git init
Initialized empty Git repository in /home/thcipriani/Projects/User:Thcipriani/.git/
$ git remote add origin mediawiki::https://en.wikipedia.org/w
$ git config remote.origin.pages 'User:Thcipriani/common.js'
$ git pull
Searching revisions...
No previous mediawiki revision found, fetching from beginning.
Fetching & writing export data by pages...
Listing pages on remote wiki...
1 pages found.
page 1/1: User:Thcipriani/common.js
Found 2 revision(s).
Namespace User not found in cache, querying the wiki ...
1/2: Revision #926066306 of User:Thcipriani%2Fcommon.js
2/2: Revision #926066361 of User:Thcipriani%2Fcommon.js
Searching revisions...
No previous mediawiki revision found, fetching from beginning.
Fetching & writing export data by pages...
Listing pages on remote wiki...
1 pages found.
page 1/1: User:Thcipriani/common.js
Found 2 revision(s).
1/2: Revision #926066306 of User:Thcipriani%2Fcommon.js
2/2: Revision #926066361 of User:Thcipriani%2Fcommon.js
$ git checkout master
Now I have a file in that directory,
User:Thcipriani%2Fcommon.js.mw
, that contains the contents
of my common.js
page. From here I can make slight
modifications to the page and push it backup via the same git
remote.
$ chmod 600 .git/config # Since we'll end up with a password in there
$ git config remote.origin.mwUser 'Thcipriani'
$ git config remote.origin.mwPassword 'NotMyPassword1234'
$ git push
Last local mediawiki revision found is 926066361.
Logged in mediawiki user "thcipriani".
Listing pages on remote wiki...
1 pages found.
Getting last revision id on tracked pages...
Last remote revision found is 926066361.
Computing path from local to remote ...
Namespace User:Thcipriani/common.js.mw not found in cache, querying the wiki ...
No such namespace User:Thcipriani/common.js.mw on MediaWiki, known namespaces: Book Book_talk Category Category_talk Draft Draft_talk Education_Progra$
Education_Program_talk File File_talk Gadget Gadget_definition Gadget_definition_talk Gadget_talk Help Help_talk Media MediaWiki MediaWiki_talk Modul$
Module_talk Portal Portal_talk Project Project_talk Special Talk Template Template_talk TimedText TimedText_talk User User_talk Wikipedia Wikipedia_t$
lk
Pushed file: 3f1cfc54f8c831f47aff3f05d33e5e12fd9d3df8 - User:Thcipriani/common.js
To mediawiki::https://en.wikipedia.org/w
* [new branch] master -> master
I also added a github remote for this repo. I could see, for example (if I had a popular user script) allowing pull-requests via github, code reviewing on github, merging, and pushing back up to Wikipedia post-merge.
There are undoubtedly issues here, but I had this idea kicking around my head and wanted to get it committed to pixels before it slipped out of my mind.
BIG GIANT DISCLAIMER OF DOOM
My views are my own. My views do not represent the views of any employer I've had/have: past, present, or future. I'm probably not even qualified to have these views. I am an egg.