processMonotoneCreate($params['project']); break; } } /** * Run mtn init command to create the corresponding monotone * repository and add the database to the configured usher instance * * @param IDF_Project */ function processMonotoneCreate($project) { if ($project->getConf()->getVal('scm') != 'mtn') { return; } $repotempl = Pluf::f('mtn_repositories', false); if ($repotempl === false) { throw new IDF_Scm_Exception( '"mtn_repositories" must be defined in your configuration file.' ); } $usher_config = Pluf::f('mtn_usher', array()); if (!array_key_exists('rcfile', $usher_config) || !is_writable($usher_config['rcfile'])) { throw new IDF_Scm_Exception( '"rcfile" in "mtn_usher" does not exist or is not writable.' ); } $shortname = $project->shortname; $dbfile = sprintf($repotempl, $shortname); if (file_exists($dbfile)) { throw new IDF_Scm_Exception(sprintf( __('The repository %s already exists.'), $dbfile )); } $return = 0; $output = array(); $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, $return); if ($return != 0) { throw new IDF_Scm_Exception(sprintf( __('Could not create repository %s - please check '. 'your error log for details.'), $dbfile )); } $usher_rc = file_get_contents($usher_config['rcfile']); $parsed_config = array(); try { $parsed_config = IDF_Scm_Monotone_BasicIO::parse($usher_rc); } catch (Exception $e) { throw new IDF_Scm_Exception(sprintf( __('Could not parse usher configuration in "%s": %s'), $usher_config['rcfile'], $e->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('-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['rcfile'], 'w'); fwrite($fp, $usher_rc); fclose($fp); IDF_Scm_Monotone_Usher::reload(); } }