protected function buildMailTemplate(PhabricatorLiskDAO $object)
 {
     $identifier = $object->getCommitIdentifier();
     $repository = $object->getRepository();
     $monogram = $repository->getMonogram();
     $summary = $object->getSummary();
     $name = $repository->formatCommitName($identifier);
     $subject = "{$name}: {$summary}";
     $thread_topic = "Commit {$monogram}{$identifier}";
     return id(new PhabricatorMetaMTAMail())->setSubject($subject)->addHeader('Thread-Topic', $thread_topic);
 }
 private function shouldPublishRepositoryActivity(PhabricatorLiskDAO $object, array $xactions)
 {
     // not every code path loads the repository so tread carefully
     // TODO: They should, and then we should simplify this.
     $repository = $object->getRepository($assert_attached = false);
     if ($repository != PhabricatorLiskDAO::ATTACHABLE) {
         if (!$repository->shouldPublish()) {
             return false;
         }
     }
     return $this->isCommitMostlyImported($object);
 }
 protected function didApplyHeraldRules(PhabricatorLiskDAO $object, HeraldAdapter $adapter, HeraldTranscript $transcript)
 {
     $repository = $object->getRepository();
     if (!$repository) {
         return array();
     }
     if (!$this->affectedPaths) {
         return array();
     }
     $packages = PhabricatorOwnersPackage::loadAffectedPackages($repository, $this->affectedPaths);
     if (!$packages) {
         return array();
     }
     // Remove packages that the revision author is an owner of. If you own
     // code, you don't need another owner to review it.
     $authority = id(new PhabricatorOwnersPackageQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withPHIDs(mpull($packages, 'getPHID'))->withAuthorityPHIDs(array($object->getAuthorPHID()))->execute();
     $authority = mpull($authority, null, 'getPHID');
     foreach ($packages as $key => $package) {
         $package_phid = $package->getPHID();
         if (isset($authority[$package_phid])) {
             unset($packages[$key]);
             continue;
         }
     }
     if (!$packages) {
         return array();
     }
     $auto_subscribe = array();
     $auto_review = array();
     $auto_block = array();
     foreach ($packages as $package) {
         switch ($package->getAutoReview()) {
             case PhabricatorOwnersPackage::AUTOREVIEW_SUBSCRIBE:
                 $auto_subscribe[] = $package;
                 break;
             case PhabricatorOwnersPackage::AUTOREVIEW_REVIEW:
                 $auto_review[] = $package;
                 break;
             case PhabricatorOwnersPackage::AUTOREVIEW_BLOCK:
                 $auto_block[] = $package;
                 break;
             case PhabricatorOwnersPackage::AUTOREVIEW_NONE:
             default:
                 break;
         }
     }
     $owners_phid = id(new PhabricatorOwnersApplication())->getPHID();
     $xactions = array();
     if ($auto_subscribe) {
         $xactions[] = $object->getApplicationTransactionTemplate()->setAuthorPHID($owners_phid)->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS)->setNewValue(array('+' => mpull($auto_subscribe, 'getPHID')));
     }
     $specs = array(array($auto_review, false), array($auto_block, true));
     foreach ($specs as $spec) {
         list($reviewers, $blocking) = $spec;
         if (!$reviewers) {
             continue;
         }
         $phids = mpull($reviewers, 'getPHID');
         $xaction = $this->newAutoReviewTransaction($object, $phids, $blocking);
         if ($xaction) {
             $xactions[] = $xaction;
         }
     }
     return $xactions;
 }
 protected function applyFinalEffects(PhabricatorLiskDAO $object, array $xactions)
 {
     // Synchronize the repository state based on the presence of an "Observe"
     // URI.
     $repository = $object->getRepository();
     $uris = id(new PhabricatorRepositoryURIQuery())->setViewer(PhabricatorUser::getOmnipotentUser())->withRepositories(array($repository))->execute();
     $observe_uri = null;
     foreach ($uris as $uri) {
         if ($uri->getIoType() != PhabricatorRepositoryURI::IO_OBSERVE) {
             continue;
         }
         $observe_uri = $uri;
         break;
     }
     $was_hosted = $repository->isHosted();
     if ($observe_uri) {
         $repository->setHosted(false)->setDetail('remote-uri', (string) $observe_uri->getEffectiveURI())->setCredentialPHID($observe_uri->getCredentialPHID());
     } else {
         $repository->setHosted(true)->setDetail('remote-uri', null)->setCredentialPHID(null);
     }
     $repository->save();
     $is_hosted = $repository->isHosted();
     // If we've swapped the repository from hosted to observed or vice versa,
     // reset all the cluster version clocks.
     if ($was_hosted != $is_hosted) {
         $cluster_engine = id(new DiffusionRepositoryClusterEngine())->setViewer($this->getActor())->setRepository($repository)->synchronizeWorkingCopyAfterHostingChange();
     }
     return $xactions;
 }