Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/engine/DifferentialChangesetEngine.php
| <?php | <?php | ||||
| final class DifferentialChangesetEngine extends Phobject { | final class DifferentialChangesetEngine extends Phobject { | ||||
| private $viewer; | |||||
| public function setViewer(PhabricatorUser $viewer) { | |||||
| $this->viewer = $viewer; | |||||
| return $this; | |||||
| } | |||||
| public function getViewer() { | |||||
| return $this->viewer; | |||||
| } | |||||
| public function rebuildChangesets(array $changesets) { | public function rebuildChangesets(array $changesets) { | ||||
| assert_instances_of($changesets, 'DifferentialChangeset'); | assert_instances_of($changesets, 'DifferentialChangeset'); | ||||
| $changesets = $this->loadChangesetFiles($changesets); | |||||
| foreach ($changesets as $changeset) { | foreach ($changesets as $changeset) { | ||||
| $this->detectGeneratedCode($changeset); | $this->detectGeneratedCode($changeset); | ||||
| $this->computeHashes($changeset); | $this->computeHashes($changeset); | ||||
| } | } | ||||
| $this->detectCopiedCode($changesets); | $this->detectCopiedCode($changesets); | ||||
| } | } | ||||
| private function loadChangesetFiles(array $changesets) { | |||||
| $viewer = $this->getViewer(); | |||||
| $file_phids = array(); | |||||
| foreach ($changesets as $changeset) { | |||||
| $file_phid = $changeset->getNewFileObjectPHID(); | |||||
| if ($file_phid !== null) { | |||||
| $file_phids[] = $file_phid; | |||||
| } | |||||
| } | |||||
| if ($file_phids) { | |||||
| $files = id(new PhabricatorFileQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withPHIDs($file_phids) | |||||
| ->execute(); | |||||
| $files = mpull($files, null, 'getPHID'); | |||||
| } else { | |||||
| $files = array(); | |||||
| } | |||||
| foreach ($changesets as $changeset_key => $changeset) { | |||||
| $file_phid = $changeset->getNewFileObjectPHID(); | |||||
| if ($file_phid === null) { | |||||
| continue; | |||||
| } | |||||
| $file = idx($files, $file_phid); | |||||
| if (!$file) { | |||||
| unset($changesets[$changeset_key]); | |||||
| continue; | |||||
| } | |||||
| $changeset->attachNewFileObject($file); | |||||
| } | |||||
| return $changesets; | |||||
| } | |||||
| /* -( Generated Code )----------------------------------------------------- */ | /* -( Generated Code )----------------------------------------------------- */ | ||||
| private function detectGeneratedCode(DifferentialChangeset $changeset) { | private function detectGeneratedCode(DifferentialChangeset $changeset) { | ||||
| $is_generated_trusted = $this->isTrustedGeneratedCode($changeset); | $is_generated_trusted = $this->isTrustedGeneratedCode($changeset); | ||||
| if ($is_generated_trusted) { | if ($is_generated_trusted) { | ||||
| $changeset->setTrustedChangesetAttribute( | $changeset->setTrustedChangesetAttribute( | ||||
| ▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | /* -( Content Hashes )----------------------------------------------------- */ | ||||
| private function newEffectHash(DifferentialChangeset $changeset) { | private function newEffectHash(DifferentialChangeset $changeset) { | ||||
| if ($changeset->getHunks()) { | if ($changeset->getHunks()) { | ||||
| $new_data = $changeset->makeNewFile(); | $new_data = $changeset->makeNewFile(); | ||||
| return PhabricatorHash::digestForIndex($new_data); | return PhabricatorHash::digestForIndex($new_data); | ||||
| } | } | ||||
| if ($changeset->getNewFileObjectPHID()) { | |||||
| $file = $changeset->getNewFileObject(); | |||||
| // See T13522. For now, the "contentHash" is not really a content hash | |||||
| // for files >4MB. This is okay: we will just always detect them as | |||||
| // changed, which is the safer behavior. | |||||
| $hash = $file->getContentHash(); | |||||
| if ($hash !== null) { | |||||
| $hash = sprintf('file-hash:%s', $hash); | |||||
| return PhabricatorHash::digestForIndex($hash); | |||||
| } | |||||
| } | |||||
| return null; | return null; | ||||
| } | } | ||||
| /* -( Copied Code )-------------------------------------------------------- */ | /* -( Copied Code )-------------------------------------------------------- */ | ||||
| private function detectCopiedCode(array $changesets) { | private function detectCopiedCode(array $changesets) { | ||||
| ▲ Show 20 Lines • Show All 172 Lines • Show Last 20 Lines | |||||