public function perform() { set_time_limit(0); if (!empty($this->args['logfile'])) { $this->log = new DeploynautLogFile($this->args['logfile']); } $this->project = DNProject::get()->byId($this->args['projectID']); if (!($this->project && $this->project->exists())) { throw new RuntimeException(sprintf('Project ID %s not found', $this->args['projectID'])); } $this->user = DNData::inst()->getGitUser() ?: null; // Disallow concurrent git fetches on the same project. // Only consider fetches started in the last 30 minutes (older jobs probably got stuck) try { if (!empty($this->args['fetchID'])) { $runningFetches = DNGitFetch::get()->filter(array('ProjectID' => $this->project->ID, 'Status' => array('Queued', 'Started'), 'Created:GreaterThan' => strtotime('-30 minutes')))->exclude('ID', $this->args['fetchID']); if ($runningFetches->count()) { $runningFetch = $runningFetches->first(); $message = sprintf('Another fetch is in progress (started at %s by %s)', $runningFetch->dbObject('Created')->Nice(), $runningFetch->Deployer()->Title); if ($this->log) { $this->log->write($message); } throw new RuntimeException($message); } } // Decide whether we need to just update what we already have // or initiate a clone if no local repo exists. if ($this->project->repoExists() && empty($this->args['forceClone'])) { $this->fetchRepo(); } else { $this->cloneRepo(); } } catch (Exception $e) { if ($this->log) { $this->log->write($e->getMessage()); } throw $e; } $this->project->clearGitCache(); $this->updateStatus('Finished'); }