A lot has happened in my Google Summer of Code project since my last blog post about it, so here is another update. I did give a short presentation about it at Wikimania 2010, but that did not go very well unfortunately. You can get the slides though.
I changed the goals of my project again, from building an extension management platform build onto the Deployment Framework and Configure to creating a more general Deployment base on which the new MediaWiki installer and extension management can run. The reason for this change is that it makes a lot more sense from a technical perspective. The work done by the MediaWiki installer, and the still-to-be-created realized extension management is very similar after all. Because of this change I renamed the project from Extension Management Platform to Deployment.
So let’s have a look at what my idea of the end product is, from an users perspective. There would be 4 new special pages with the extension management functionality, largely based on what you can do in WordPress:
- Special:Install: On this page administrators can browse and search through extensions that are in the connected repository. This can be very basic to start with, but should eventually include filtering on categories and keywords, popularity, rating, ect.
- Special:Update: Checks for updates for both core and extensions, and shows update options for individual components, or the whole deal.
- Special:Extensions: A page listing all installed extensions, with options to uninstall, disable and upgrade them, as well as links to documentation, ect. Once MediaWiki has a configuration database, links to configure the extensions can also be included here.
- Special:Dashboard: A dashboard for administrators containing update information and fancy stuff like statistics.
The new MediaWiki installer would also have support for installation extension on initial run, and be able to do a complete core upgrade, instead of just a database update as is now the case.
This is a rough draft of how I see the structure of the end product, and where the code is coming from:
I’m in search of a quick and easy diagram tool to make a cleaner and more elaborate version 🙂
Stuff we already have
The underneath items have been completed, or require only a little work.
- Web interface for the core installer.
- Database abstraction for the installer.
- CLI interface for the core installer? (in progress)
- Core installer class with database install and upgrade capabilities.
- Filesystem abstraction (I ported this from WP (see code here), mostly done, no testing done yet though).
Stuff that’s still needed
- Everything related to detecting updates, fetching packages and instructions, ect. The DF has some nice stuff that can be used here, so does WP. It’s be nice to also have an abstraction layer here, so multiple mechanisms can be used here. An extension repository also needs to be set up, preferably on mediawiki.org.
- Filesystem support for the installer, so it can be used to upgrade MW by clicking a button and then just fetching the new release and doing all the work. This can be achieved by creating the generic installer class and making the core installer inherit from it.
- Extension installer class and the special pages that provide an interface to it.
- Extension support for the core installer: installation and upgrade. This can be done by re-using the code of the special pages.
- CLI support for extension management
This is a list of the work I have so far done during this project, oldest first.
- I researched all involved components and created the above draft.
- I ported the WordPress filesystem abstraction classes (base class, FTP and direct one).
- I got core commit access (yay!), so I now can make changes to the new installer.
A rather loose planning of what I’m planning to do next:
- Finish porting SSH2 filesystem abstraction class.
- Figure out how to make the whole system secure.
- Create installer class, adapt to core installer to work with this, and also create the extension installer class.
- Take care of the fetching stuff.
- Create the interfaces.