protected function loadPage()
 {
     $table = new PhabricatorRepositoryMirror();
     $conn_r = $table->establishConnection('r');
     $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r));
     return $table->loadAllFromArray($data);
 }
 private function pushRepositoryToMirror(PhabricatorRepository $repository, PhabricatorRepositoryMirror $mirror)
 {
     // TODO: This is a little bit janky, but we don't have first-class
     // infrastructure for running remote commands against an arbitrary remote
     // right now. Just make an emphemeral copy of the repository and muck with
     // it a little bit. In the medium term, we should pull this command stuff
     // out and use it here and for "Land to ...".
     $proxy = clone $repository;
     $proxy->makeEphemeral();
     $proxy->setDetail('hosting-enabled', false);
     $proxy->setDetail('remote-uri', $mirror->getRemoteURI());
     $proxy->setCredentialPHID($mirror->getCredentialPHID());
     $this->log(pht('Pushing to remote "%s"...', $mirror->getRemoteURI()));
     if ($proxy->isGit()) {
         $this->pushToGitRepository($proxy);
     } else {
         if ($proxy->isHg()) {
             $this->pushToHgRepository($proxy);
         } else {
             throw new Exception(pht('Unsupported VCS!'));
         }
     }
 }
 public function processRequest()
 {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->diffusionRequest;
     $repository = $drequest->getRepository();
     if ($this->id) {
         $mirror = id(new PhabricatorRepositoryMirrorQuery())->setViewer($viewer)->withIDs(array($this->id))->executeOne();
         if (!$mirror) {
             return new Aphront404Response();
         }
         $is_new = false;
     } else {
         $mirror = PhabricatorRepositoryMirror::initializeNewMirror($viewer)->setRepositoryPHID($repository->getPHID())->attachRepository($repository);
         $is_new = true;
     }
     $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/#mirrors');
     $v_remote = $mirror->getRemoteURI();
     $e_remote = true;
     $v_credentials = $mirror->getCredentialPHID();
     $e_credentials = null;
     $credentials = id(new PassphraseCredentialQuery())->setViewer($viewer)->withIsDestroyed(false)->execute();
     $errors = array();
     if ($request->isFormPost()) {
         $v_remote = $request->getStr('remoteURI');
         if (strlen($v_remote)) {
             try {
                 PhabricatorRepository::assertValidRemoteURI($v_remote);
                 $e_remote = null;
             } catch (Exception $ex) {
                 $e_remote = pht('Invalid');
                 $errors[] = $ex->getMessage();
             }
         } else {
             $e_remote = pht('Required');
             $errors[] = pht('You must provide a remote URI.');
         }
         $v_credentials = $request->getStr('credential');
         if ($v_credentials) {
             $phids = mpull($credentials, null, 'getPHID');
             if (empty($phids[$v_credentials])) {
                 $e_credentials = pht('Invalid');
                 $errors[] = pht('You do not have permission to use those credentials.');
             }
         }
         if (!$errors) {
             $mirror->setRemoteURI($v_remote)->setCredentialPHID($v_credentials)->save();
             return id(new AphrontReloadResponse())->setURI($edit_uri);
         }
     }
     $form_errors = null;
     if ($errors) {
         $form_errors = id(new AphrontErrorView())->setErrors($errors);
     }
     if ($is_new) {
         $title = pht('Create Mirror');
         $submit = pht('Create Mirror');
     } else {
         $title = pht('Edit Mirror');
         $submit = pht('Save Changes');
     }
     $form = id(new PHUIFormLayoutView())->appendChild(id(new AphrontFormTextControl())->setLabel(pht('Remote URI'))->setName('remoteURI')->setValue($v_remote)->setError($e_remote))->appendChild(id(new PassphraseCredentialControl())->setLabel(pht('Credentials'))->setName('credential')->setAllowNull(true)->setValue($v_credentials)->setError($e_credentials)->setOptions($credentials));
     $dialog = id(new AphrontDialogView())->setUser($viewer)->setTitle($title)->setWidth(AphrontDialogView::WIDTH_FORM)->appendChild($form_errors)->appendChild($form)->addSubmitButton($submit)->addCancelButton($edit_uri);
     return id(new AphrontDialogResponse())->setDialog($dialog);
 }