| error_reporting($this->old_err_rep);␊ |
| }␊ |
| ␊ |
| private function _diagnoseProblem($msg)␊ |
| {␊ |
| $system_err = error_get_last();␊ |
| if (!empty($system_err)) {␊ |
| $msg .= ': '.$system_err['message'];␊ |
| }␊ |
| ␊ |
| error_reporting($this->old_err_rep);␊ |
| throw new IDF_Scm_Exception($msg);␊ |
| }␊ |
| ␊ |
| /**␊ |
| * Entry point of the plugin.␊ |
| */␊ |
|
| //␊ |
| $dbfile = $projectpath.'/database.mtn';␊ |
| $cmd = sprintf('db init -d %s', escapeshellarg($dbfile));␊ |
| self::_mtn_exec($cmd);␊ |
| $this->_mtn_exec($cmd);␊ |
| ␊ |
| //␊ |
| // step 2) create a server key␊ |
|
| escapeshellarg($projectpath),␊ |
| escapeshellarg($serverkey)␊ |
| );␊ |
| self::_mtn_exec($cmd);␊ |
| $this->_mtn_exec($cmd);␊ |
| ␊ |
| //␊ |
| // step 3) create a client key, and save it in IDF␊ |
|
| escapeshellarg($keydir),␊ |
| escapeshellarg($clientkey_name)␊ |
| );␊ |
| $keyinfo = self::_mtn_exec($cmd);␊ |
| $keyinfo = $this->_mtn_exec($cmd);␊ |
| ␊ |
| $parsed_keyinfo = array();␊ |
| try {␊ |
|
| escapeshellarg($keydir),␊ |
| escapeshellarg($clientkey_hash)␊ |
| );␊ |
| $clientkey_pubdata = self::_mtn_exec($cmd);␊ |
| $clientkey_pubdata = $this->_mtn_exec($cmd);␊ |
| ␊ |
| $cmd = sprintf('au put_public_key --db=%s %s',␊ |
| escapeshellarg($dbfile),␊ |
| escapeshellarg($clientkey_pubdata)␊ |
| );␊ |
| self::_mtn_exec($cmd);␊ |
| $this->_mtn_exec($cmd);␊ |
| ␊ |
| //␊ |
| // step 4) setup the configuration␊ |
|
| $mtn = IDF_Scm_Monotone::factory($project);␊ |
| $stdio = $mtn->getStdio();␊ |
| ␊ |
| $projectpath = self::_get_project_path($project);␊ |
| $auth_ids = self::_get_authorized_user_ids($project);␊ |
| $projectpath = $this->_get_project_path($project);␊ |
| $auth_ids = $this->_get_authorized_user_ids($project);␊ |
| $key_ids = array();␊ |
| foreach ($auth_ids as $auth_id) {␊ |
| $sql = new Pluf_SQL('user=%s', array($auth_id));␊ |
|
| ␊ |
| $projectpath = sprintf($projecttempl, $shortname);␊ |
| if (file_exists($projectpath)) {␊ |
| if (!self::_delete_recursive($projectpath)) {␊ |
| if (!$this->_delete_recursive($projectpath)) {␊ |
| $this->_diagnoseProblem(sprintf(␊ |
| __('One or more paths underneath %s could not be deleted'), $projectpath␊ |
| ));␊ |
|
| if ($scm != 'mtn')␊ |
| continue;␊ |
| ␊ |
| $projectpath = self::_get_project_path($project);␊ |
| $auth_ids = self::_get_authorized_user_ids($project);␊ |
| $projectpath = $this->_get_project_path($project);␊ |
| $auth_ids = $this->_get_authorized_user_ids($project);␊ |
| if (!in_array($key->user, $auth_ids))␊ |
| continue;␊ |
| ␊ |
|
| if ($scm != 'mtn')␊ |
| continue;␊ |
| ␊ |
| $projectpath = self::_get_project_path($project);␊ |
| $auth_ids = self::_get_authorized_user_ids($project);␊ |
| $projectpath = $this->_get_project_path($project);␊ |
| $auth_ids = $this->_get_authorized_user_ids($project);␊ |
| if (!in_array($key->user, $auth_ids))␊ |
| continue;␊ |
| ␊ |
|
| ));␊ |
| }␊ |
| ␊ |
| private static function _get_authorized_user_ids($project)␊ |
| {␊ |
| $mem = $project->getMembershipData();␊ |
| $members = array_merge((array)$mem['members'],␊ |
| (array)$mem['owners'],␊ |
| (array)$mem['authorized']);␊ |
| $userids = array();␊ |
| foreach ($members as $member) {␊ |
| $userids[] = $member->id;␊ |
| }␊ |
| return $userids;␊ |
| }␊ |
| ␊ |
| private static function _get_project_path($project)␊ |
| private function _get_project_path($project)␊ |
| {␊ |
| $projecttempl = Pluf::f('mtn_repositories', false);␊ |
| if ($projecttempl === false) {␊ |
|
| return $projectpath;␊ |
| }␊ |
| ␊ |
| private static function _mtn_exec($cmd)␊ |
| private function _mtn_exec($cmd)␊ |
| {␊ |
| $fullcmd = sprintf('%s %s %s',␊ |
| Pluf::f('idf_exec_cmd_prefix', ''),␊ |
|
| return implode("\n", $output);␊ |
| }␊ |
| ␊ |
| private static function _delete_recursive($path)␊ |
| private function _get_authorized_user_ids($project)␊ |
| {␊ |
| $mem = $project->getMembershipData();␊ |
| $members = array_merge((array)$mem['members'],␊ |
| (array)$mem['owners'],␊ |
| (array)$mem['authorized']);␊ |
| $userids = array();␊ |
| foreach ($members as $member) {␊ |
| $userids[] = $member->id;␊ |
| }␊ |
| return $userids;␊ |
| }␊ |
| ␊ |
| private function _delete_recursive($path)␊ |
| {␊ |
| if (is_file($path) || is_link($path)) {␊ |
| return @unlink($path);␊ |
|
| $scan = glob(rtrim($path, '/') . '/*');␊ |
| $status = 0;␊ |
| foreach ($scan as $subpath) {␊ |
| $status |= self::_delete_recursive($subpath);␊ |
| $status |= $this->_delete_recursive($subpath);␊ |
| }␊ |
| $status |= @rmdir($path);␊ |
| return $status;␊ |
| }␊ |
| }␊ |
| ␊ |
| private function _diagnoseProblem($msg)␊ |
| {␊ |
| $system_err = error_get_last();␊ |
| if (!empty($system_err)) {␊ |
| $msg .= ': '.$system_err['message'];␊ |
| }␊ |
| ␊ |
| error_reporting($this->old_err_rep);␊ |
| throw new IDF_Scm_Exception($msg);␊ |
| }␊ |
| }␊ |
| ␊ |
| /**␊ |