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'));
 }