processMonotoneCreate($params['project']); break; } } /** * Four steps to setup a new monotone project: * * 1) run mtn db init to initialize a new database underknees * 'mtn_repositories' * 2) create a new server key in the same directory * 3) write monotonerc for access control * 4) add the database as new local server in the usher configuration * 5) reload the running usher instance so it acknowledges the new * server * * @param IDF_Project */ function processMonotoneCreate($project) { if ($project->getConf()->getVal('scm') != 'mtn') { return; } $projecttempl = Pluf::f('mtn_repositories', false); if ($projecttempl === false) { throw new IDF_Scm_Exception( '"mtn_repositories" must be defined in your configuration file.' ); } $usher_config = Pluf::f('mtn_usher_conf', false); if (!$usher_config || !is_writable($usher_config)) { throw new IDF_Scm_Exception( '"mtn_usher_conf" does not exist or is not writable.' ); } $shortname = $project->shortname; $projectpath = sprintf($projecttempl, $shortname); if (file_exists($projectpath)) { throw new IDF_Scm_Exception(sprintf( __('The project path %s already exists.'), $projectpath )); } if (!mkdir($projectpath)) { throw new IDF_Scm_Exception(sprintf( __('The project path %s could not be created.'), $projectpath )); } // // step 1) create a new database // $dbfile = $projectpath.'/database.mtn'; $cmd = sprintf( Pluf::f('mtn_path', 'mtn').' db init -d %s', escapeshellarg($dbfile) ); $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; $ll = exec($cmd, $output = array(), $return = 0); if ($return != 0) { throw new IDF_Scm_Exception(sprintf( __('The database file %s could not be created.'), $dbfile )); } // // step 2) create a server key // // try to parse the key's domain part from the remote_url's host // name, otherwise fall back to the configured Apache server name $server = $_SERVER['SERVER_NAME']; $remote_url = Pluf::f('mtn_remote_url'); if (($parsed = parse_url($remote_url)) !== false && !empty($parsed['host'])) { $server = $parsed['host']; } $keyname = $shortname.'-server@'.$server; $cmd = sprintf( Pluf::f('mtn_path', 'mtn').' au genkey --confdir=%s %s ""', escapeshellarg($projectpath), escapeshellarg($keyname) ); $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; $ll = exec($cmd, $output = array(), $return = 0); if ($return != 0) { throw new IDF_Scm_Exception(sprintf( __('The server key %s could not be created.'), $keyname )); } // // step 3) write monotonerc for access control // FIXME: netsync access control is still missing! // $monotonerc =<<getMessage() )); } // ensure we haven't configured a server with this name already foreach ($parsed_config as $stanzas) { foreach ($stanzas as $stanza_line) { if ($stanza_line['key'] == 'server' && $stanza_line['values'][0] == $shortname) { throw new IDF_Scm_Exception(sprintf( __('usher configuration already contains a server '. 'entry named "%s"'), $shortname )); } } } $new_server = array( array('key' => 'server', 'values' => array($shortname)), array('key' => 'local', 'values' => array( '--confdir', $projectpath, '-d', $dbfile )), ); $parsed_config[] = $new_server; $usher_rc = IDF_Scm_Monotone_BasicIO::compile($parsed_config); // FIXME: more sanity - what happens on failing writes? $fp = fopen($usher_config, 'w'); fwrite($fp, $usher_rc); fclose($fp); // // step 5) reload usher to pick up the new configuration // IDF_Scm_Monotone_Usher::reload(); } }