Refactored the Managed Daemons to take callbacks instead, and adjusted all known daemons to match. There are still a few bugs in this commit, which will be caught shortly.
Updated pm-server to work with the managed daemon changes.
Disconnect from the jobs backend before shutting down. This prevents exceptions during shutdown.
Added an integration test framework and example integration test.
Protected the actions in the version controller with a new permission.
Add more default plugins to the Multipaas.
Apply license to new files.
On the front end, only show the application deploy buttons if you have permissions. Also fixed a bug in the workspace lister on the base controller based on permissions.
Hide create application buttons when you don't have permissions to do so.
In pm-command, show the help without trying to process other required arguments.
Add the ability to follow a specific job via the command line (and exits with the tree if the job has already finished).
Gave the command line tool the ability to dump the router table.
Added the ability for the command line client to be able to stream router stats.
Enabled the ability to delete workspaces. Workspaces can only be deleted if there are no applications in them.
Allow the command line tool to be able to delete the workspace.
The YAML dumper in the installer uses the safe dumper, to prevent any issues with dumping Python serialized versions of objects.
Sort the list of handlebars templates, to try to ensure that the compiled version is in the same order each time.
Added some notes about upgrading to the installation document.
Improve error handling in pm.data.js: if a JSON API request returns an HTTP error code (e.g. 403 due to a permissions error), hide the loading spinner and display the message(s) at the top of the page.
Add a simple event-handler registration system to pm.history so other bits of code can submit functions for the "user goes to another (ajaxified) page" event. In the upload widget, use this to cancel any uploads in progress. Also, pass workspace ID in to the constructor for the upload widget and use it to make sure the user has FILE_UPLOAD permission. (If not, show a message rather than the upload button.)