Path: blob/master/src/applications/drydock/storage/DrydockRepositoryOperation.php
12256 views
<?php12/**3* Represents a request to perform a repository operation like a merge or4* cherry-pick.5*/6final class DrydockRepositoryOperation extends DrydockDAO7implements8PhabricatorPolicyInterface {910const STATE_WAIT = 'wait';11const STATE_WORK = 'work';12const STATE_DONE = 'done';13const STATE_FAIL = 'fail';1415protected $authorPHID;16protected $objectPHID;17protected $repositoryPHID;18protected $repositoryTarget;19protected $operationType;20protected $operationState;21protected $properties = array();22protected $isDismissed;2324private $repository = self::ATTACHABLE;25private $object = self::ATTACHABLE;26private $implementation = self::ATTACHABLE;27private $workingCopyLease = self::ATTACHABLE;2829public static function initializeNewOperation(30DrydockRepositoryOperationType $op) {3132return id(new DrydockRepositoryOperation())33->setOperationState(self::STATE_WAIT)34->setOperationType($op->getOperationConstant())35->setIsDismissed(0);36}3738protected function getConfiguration() {39return array(40self::CONFIG_AUX_PHID => true,41self::CONFIG_SERIALIZATION => array(42'properties' => self::SERIALIZATION_JSON,43),44self::CONFIG_COLUMN_SCHEMA => array(45'repositoryTarget' => 'bytes',46'operationType' => 'text32',47'operationState' => 'text32',48'isDismissed' => 'bool',49),50self::CONFIG_KEY_SCHEMA => array(51'key_object' => array(52'columns' => array('objectPHID'),53),54'key_repository' => array(55'columns' => array('repositoryPHID', 'operationState'),56),57'key_state' => array(58'columns' => array('operationState'),59),60'key_author' => array(61'columns' => array('authorPHID', 'operationState'),62),63),64) + parent::getConfiguration();65}6667public function generatePHID() {68return PhabricatorPHID::generateNewPHID(69DrydockRepositoryOperationPHIDType::TYPECONST);70}7172public function attachRepository(PhabricatorRepository $repository) {73$this->repository = $repository;74return $this;75}7677public function getRepository() {78return $this->assertAttached($this->repository);79}8081public function attachObject($object) {82$this->object = $object;83return $this;84}8586public function getObject() {87return $this->assertAttached($this->object);88}8990public function attachImplementation(DrydockRepositoryOperationType $impl) {91$this->implementation = $impl;92return $this;93}9495public function getImplementation() {96return $this->implementation;97}9899public function getWorkingCopyLease() {100return $this->assertAttached($this->workingCopyLease);101}102103public function attachWorkingCopyLease(DrydockLease $lease) {104$this->workingCopyLease = $lease;105return $this;106}107108public function hasWorkingCopyLease() {109return ($this->workingCopyLease !== self::ATTACHABLE);110}111112public function getProperty($key, $default = null) {113return idx($this->properties, $key, $default);114}115116public function setProperty($key, $value) {117$this->properties[$key] = $value;118return $this;119}120121public static function getOperationStateNameMap() {122return array(123self::STATE_WAIT => pht('Waiting'),124self::STATE_WORK => pht('Working'),125self::STATE_DONE => pht('Done'),126self::STATE_FAIL => pht('Failed'),127);128}129130public static function getOperationStateIcon($state) {131$map = array(132self::STATE_WAIT => 'fa-clock-o',133self::STATE_WORK => 'fa-plane ph-spin blue',134self::STATE_DONE => 'fa-check green',135self::STATE_FAIL => 'fa-times red',136);137138return idx($map, $state, null);139}140141public static function getOperationStateName($state) {142$map = self::getOperationStateNameMap();143return idx($map, $state, pht('<Unknown: %s>', $state));144}145146public function scheduleUpdate() {147PhabricatorWorker::scheduleTask(148'DrydockRepositoryOperationUpdateWorker',149array(150'operationPHID' => $this->getPHID(),151),152array(153'objectPHID' => $this->getPHID(),154'priority' => PhabricatorWorker::PRIORITY_ALERTS,155));156}157158public function applyOperation(DrydockInterface $interface) {159$impl = $this->getImplementation();160$impl->setInterface($interface);161return $impl->applyOperation($this, $interface);162}163164public function getOperationDescription(PhabricatorUser $viewer) {165return $this->getImplementation()->getOperationDescription(166$this,167$viewer);168}169170public function getOperationCurrentStatus(PhabricatorUser $viewer) {171return $this->getImplementation()->getOperationCurrentStatus(172$this,173$viewer);174}175176public function isUnderway() {177switch ($this->getOperationState()) {178case self::STATE_WAIT:179case self::STATE_WORK:180return true;181}182183return false;184}185186public function isDone() {187return ($this->getOperationState() === self::STATE_DONE);188}189190public function getWorkingCopyMerges() {191return $this->getImplementation()->getWorkingCopyMerges(192$this);193}194195public function setWorkingCopyLeasePHID($lease_phid) {196return $this->setProperty('exec.leasePHID', $lease_phid);197}198199public function getWorkingCopyLeasePHID() {200return $this->getProperty('exec.leasePHID');201}202203public function setCommandError(array $error) {204return $this->setProperty('exec.workingcopy.error', $error);205}206207public function getCommandError() {208return $this->getProperty('exec.workingcopy.error');209}210211public function logText($text) {212return $this->logEvent(213DrydockTextLogType::LOGCONST,214array(215'text' => $text,216));217}218219public function logEvent($type, array $data = array()) {220$log = id(new DrydockLog())221->setEpoch(PhabricatorTime::getNow())222->setType($type)223->setData($data);224225$log->setOperationPHID($this->getPHID());226227if ($this->hasWorkingCopyLease()) {228$lease = $this->getWorkingCopyLease();229$log->setLeasePHID($lease->getPHID());230231$resource_phid = $lease->getResourcePHID();232if ($resource_phid) {233$resource = $lease->getResource();234235$log->setResourcePHID($resource->getPHID());236$log->setBlueprintPHID($resource->getBlueprintPHID());237}238}239240return $log->save();241}242243244/* -( PhabricatorPolicyInterface )----------------------------------------- */245246247public function getCapabilities() {248return array(249PhabricatorPolicyCapability::CAN_VIEW,250PhabricatorPolicyCapability::CAN_EDIT,251);252}253254public function getPolicy($capability) {255$need_capability = $this->getRequiredRepositoryCapability($capability);256257return $this->getRepository()258->getPolicy($need_capability);259}260261public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {262$need_capability = $this->getRequiredRepositoryCapability($capability);263264return $this->getRepository()265->hasAutomaticCapability($need_capability, $viewer);266}267268public function describeAutomaticCapability($capability) {269return pht(270'A repository operation inherits the policies of the repository it '.271'affects.');272}273274private function getRequiredRepositoryCapability($capability) {275// To edit a RepositoryOperation, require that the user be able to push276// to the repository.277278$map = array(279PhabricatorPolicyCapability::CAN_EDIT =>280DiffusionPushCapability::CAPABILITY,281);282283return idx($map, $capability, $capability);284}285286287}288289290