Go to file
Thomas Keller e47d51d14c Add the possibility to save mtn public keys per user
* src/IDF/Key.php: new column "type" which is either "ssh" or "mtn";
  utility functions to query the mtn key name and id as well as
  all available key types for the current IDF installation
* src/IDF/Migrations/16KeyType.php: needed migration script
* src/IDF/Plugin/SyncGit/Cron.php: ensure only SSH keys are handled
* adapt forms and templates accordingly
2010-08-11 23:48:09 +02:00
doc Added a note to help with some Subversion errors when restarting Apache as root. 2010-05-17 10:02:56 +02:00
logo Updated the new logo. 2009-11-06 15:57:45 +01:00
scripts Fixed to get the scripts as executable by default. 2010-05-20 12:23:34 +02:00
src/IDF Add the possibility to save mtn public keys per user 2010-08-11 23:48:09 +02:00
www Fixed ticket 349, updated the prettify lib to the latest version. 2010-02-04 11:21:30 +01:00
.gitignore Exclude path.php from Git. 2009-11-09 21:43:45 +01:00
AUTHORS Fixed issue 467, exception when deleting an orphan git repo. 2010-05-17 19:40:26 +02:00
COPYING Added installation instructions and configuration example. 2008-08-02 15:13:21 +02:00
INSTALL.mdtext Fixed issue 319, unable to browse a remote subversion repository. 2010-03-01 19:59:32 +01:00
README add a README file which contains the first steps and some hints 2010-06-23 01:27:12 +02:00
release-script Added the release script. 2008-08-12 20:36:41 +02:00

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.