| monotone implementation notes␊ |
| -----------------------------␊ |
| ␊ |
| 1. general␊ |
| ␊ |
| This branch contains an implementation of the monotone automation interface.␊ |
| It needs at least monotone version 0.47 (interface version 12.0) or␊ |
| newer. To set up a new project with monotone, all you need to do is␊ |
| to create a new monotone database with␊ |
| ␊ |
| $ mtn db init -d project.mtn␊ |
| ␊ |
| in the configured repository path ('mtn_repositories'). To have a really␊ |
| workable setup, this database needs an initial commit on the configured␊ |
| master branch of the project. This can be done easily with␊ |
| ␊ |
| $ mkdir tmp && touch tmp/remove_me␊ |
| $ mtn import -d project.mtn -b master.branch.name \␊ |
| -m "initial commit" tmp␊ |
| $ rm -rf tmp␊ |
| ␊ |
| ␊ |
| 2. current state / internals␊ |
| ␊ |
| The implementation should be fairly stable and fast, though some␊ |
| information, such as individual file sizes or last change information,␊ |
| won't scale well with the tree size. Its expected that the mtn␊ |
| automation interface improves in this area in the future and that␊ |
| these parts can then be rewritten with speed in mind.␊ |
| ␊ |
| Another area of improvement is the access pattern to the monotone␊ |
| database. While only one process is started per request, the time␊ |
| (and server resource) penalty for this could still be dramatic once␊ |
| many clients try to access the service. Luckily, monotone has an␊ |
| easy way to deliver its stdio protocol for automation usage over the␊ |
| network (mtn au remote_stdio), so the following scenarios are possible:␊ |
| ␊ |
| a) setup a single mtn server serving one database on a different␊ |
| (faster) server and let the stdio client connect to that␊ |
| ␊ |
| b) setup usher (available from branch net.venge.monotone.contrib.usher␊ |
| from the official mtn repository on monotone.ca) as proxy in␊ |
| front of several local monotone databases mirroring themselves␊ |
| ␊ |
| c) like b), but use usher as proxy in front of several other remote␊ |
| monotone databases (forwarding)␊ |
| ␊ |
| The scenario in a) might be needed anyways for a shared hosting␊ |
| environment, because a database which gets served via netsync cannot␊ |
| be accessed by another local process at the same time (its locked then),␊ |
| so ideally both, the network functionality as well as the indefero␊ |
| browsing functionality should be delivered from one single database␊ |
| per project via netsync.␊ |
| ␊ |
| The only alternative for this setup is a two-database approach, where one␊ |
| database acts as network node and the other as backend for indefero.␊ |
| The synchronization between these two would then have to happen via␊ |
| standard tools (cron...) or a sync request from one database to the other.␊ |
| ␊ |
| While the current implementation is ready for the two database approach,␊ |
| some code parts and configuration changes have to happen for the remote␊ |
| stdio usage. Bascially this is replacing the initial call to␊ |
| ␊ |
| mtn -d project.mtn au stdio (Monotone.php, around line 74)␊ |
| ␊ |
| with␊ |
| ␊ |
| mtn au remote_stdio HOSTNAME␊ |
| ␊ |
| which could be made configurable in conf/idf.php. But again, this heavily␊ |
| depends on the exact anticipated server setup.␊ |
| ␊ |
| To scale things up a bit, multiple projects should of course use␊ |
| separated databases. The main reason for that is that while read access␊ |
| can be granted on a branch level, write access gives total write␊ |
| possibilities on the whole database. One approach would be to start␊ |
| one serve process for each database, but the obvious downside here is␊ |
| that each of those processes would need to get bound to another␊ |
| (non-standard) port making it hard for users to "just clone" the␊ |
| project sources without knowing the exact port.␊ |
| ␊ |
| Usher comes to the rescue here as well. It has three ways␊ |
| to recognize the request for a particular database:␊ |
| ␊ |
| a) by looking at the requested host name (similar to SNI for Apache)␊ |
| ␊ |
| b) by evaluating the requested branch pattern␊ |
| ␊ |
| c) by evaluating the path part from an mtn:// uri (new in mtn 0.48)␊ |
| ␊ |
| The best way is probably to configure it with c) - instead of pulling␊ |
| a project like this␊ |
| ␊ |
| $ mtn pull hostname branchname␊ |
| ␊ |
| a user uses the URI syntax (which will, btw. be the default from␊ |
| mtn 0.99 onwards):␊ |
| ␊ |
| $ mtn pull mtn://hostname/database?branchname␊ |
| ␊ |
| Here, the "/database" part is used by usher to determine which backend␊ |
| database should be used for the network action. The "clone" command␊ |
| will also support this mtn:// uri syntax, but this didn't made it into␊ |
| 0.48, but will be available from 0.99 and later.␊ |
| ␊ |
| ␊ |
| 3. indefero critique:␊ |
| ␊ |
| It was not always 100% clear what some of the abstract SCM API method␊ |
| wanted in return. While it helped a lot to have prior art in form of the␊ |
| SVN and git implementation, the documentation of the abstract IDF_Scm␊ |
| should probably still be improved.␊ |
| ␊ |
| Since branch and tag names can be of arbitrary size, it was not possible␊ |
| to display them completely in the default layout. This might be a problem␊ |
| in other SCMs as well, in particular for the monotone implementation I␊ |
| introduced a special filter, called "IDF_Views_Source_ShortenString".␊ |
| ␊ |
| The API methods getPathInfo() and getTree() return similar VCS "objects"␊ |
| which unfortunately do not have a well-defined structure - this should␊ |
| probably addressed in future indefero releases.␊ |
| ␊ |
| While the returned objects from getTree() contain all the needed␊ |
| information, indefero doesn't seem to use them to sort the output␊ |
| f.e. alphabetically or in such a way that directories are outputted␊ |
| before files. It was unclear if the SCM implementor should do this␊ |
| task or not and what the admired default sorting should be.␊ |
| ␊ |