protected function execute(ConduitAPIRequest $request) { if (!$request->getUser()->getIsAdmin()) { throw new ConduitException('ERR-PERMISSIONS'); } // TODO: This has some duplication with (and lacks some of the validation // of) the web workflow; refactor things so they can share more code as this // stabilizes. $repository = new PhabricatorRepository(); $repository->setName($request->getValue('name')); $callsign = $request->getValue('callsign'); if (!preg_match('/[A-Z]+$/', $callsign)) { throw new ConduitException('ERR-BAD-CALLSIGN'); } $repository->setCallsign($callsign); $vcs = $request->getValue('vcs'); $map = array('git' => PhabricatorRepositoryType::REPOSITORY_TYPE_GIT, 'hg' => PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL, 'svn' => PhabricatorRepositoryType::REPOSITORY_TYPE_SVN); if (empty($map[$vcs])) { throw new ConduitException('ERR-UNKNOWN-REPOSITORY-VCS'); } $repository->setVersionControlSystem($map[$vcs]); $details = array('encoding' => $request->getValue('encoding'), 'description' => $request->getValue('description'), 'tracking-enabled' => (bool) $request->getValue('tracking', true), 'remote-uri' => $request->getValue('uri'), 'local-path' => $request->getValue('localPath'), 'branch-filter' => array_fill_keys($request->getValue('branchFilter', array()), true), 'close-commits-filter' => array_fill_keys($request->getValue('closeCommitsFilter', array()), true), 'pull-frequency' => $request->getValue('pullFrequency'), 'default-branch' => $request->getValue('defaultBranch'), 'ssh-login' => $request->getValue('sshUser'), 'ssh-key' => $request->getValue('sshKey'), 'ssh-keyfile' => $request->getValue('sshKeyFile'), 'herald-disabled' => !$request->getValue('heraldEnabled', true), 'svn-subpath' => $request->getValue('svnSubpath'), 'disable-autoclose' => !$request->getValue('autocloseEnabled', true)); foreach ($details as $key => $value) { $repository->setDetail($key, $value); } try { $repository->save(); } catch (AphrontQueryDuplicateKeyException $ex) { throw new ConduitException('ERR-DUPLICATE'); } return $this->buildDictForRepository($repository); }
public function testBranchFilter() { $git = PhabricatorRepositoryType::REPOSITORY_TYPE_GIT; $repo = new PhabricatorRepository(); $repo->setVersionControlSystem($git); $this->assertEqual(true, $repo->shouldTrackBranch('imaginary'), 'Track all branches by default.'); $repo->setDetail('branch-filter', array('master' => true)); $this->assertEqual(true, $repo->shouldTrackBranch('master'), 'Track listed branches.'); $this->assertEqual(false, $repo->shouldTrackBranch('imaginary'), 'Do not track unlisted branches.'); }
public function testSubversionPathInfo() { $svn = PhabricatorRepositoryType::REPOSITORY_TYPE_SVN; $repo = new PhabricatorRepository(); $repo->setVersionControlSystem($svn); $repo->setDetail('remote-uri', 'http://svn.example.com/repo'); $this->assertEqual('http://svn.example.com/repo', $repo->getSubversionPathURI()); $repo->setDetail('remote-uri', 'http://svn.example.com/repo/'); $this->assertEqual('http://svn.example.com/repo', $repo->getSubversionPathURI()); $repo->setDetail('hosting-enabled', true); $repo->setLocalPath('/var/repo/SVN'); $this->assertEqual('file:///var/repo/SVN', $repo->getSubversionPathURI()); $repo->setLocalPath('/var/repo/SVN/'); $this->assertEqual('file:///var/repo/SVN', $repo->getSubversionPathURI()); $this->assertEqual('file:///var/repo/SVN/a@', $repo->getSubversionPathURI('a')); $this->assertEqual('file:///var/repo/SVN/a@1', $repo->getSubversionPathURI('a', 1)); $this->assertEqual('file:///var/repo/SVN/%3F@22', $repo->getSubversionPathURI('?', 22)); $repo->setDetail('svn-subpath', 'quack/trunk/'); $this->assertEqual('file:///var/repo/SVN/quack/trunk/@', $repo->getSubversionBaseURI()); $this->assertEqual('file:///var/repo/SVN/quack/trunk/@HEAD', $repo->getSubversionBaseURI('HEAD')); }