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 |