From 3c34cdce5adf0c54c700fa6e94611aeeef5689db Mon Sep 17 00:00:00 2001 From: David Cramer Date: Wed, 2 Oct 2013 16:28:03 -0700 Subject: [PATCH] Abstract raw diff rendering into DifferentialRawDiffRenderer Test Plan: Enable inline patches: ``` bin/config set metamta.differential.patch-format 'unified' bin/config set metamta.differential.inline-patches 100000000 ``` Create a new diff and confirm it renders correctly via email. Reviewers: epriestley Reviewed By: epriestley CC: Korvin, aran Differential Revision: https://secure.phabricator.com/D7198 --- src/__phutil_library_map__.php | 1 + .../mail/DifferentialReviewRequestMail.php | 34 ++------- .../render/DifferentialRawDiffRenderer.php | 69 +++++++++++++++++++ 3 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 src/applications/differential/render/DifferentialRawDiffRenderer.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 99b39faa49..7fc1ec5e13 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -391,6 +391,7 @@ phutil_register_library_map(array( 'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php', 'DifferentialPeopleMenuEventListener' => 'applications/differential/events/DifferentialPeopleMenuEventListener.php', 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', + 'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php', 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', 'DifferentialReplyHandler' => 'applications/differential/mail/DifferentialReplyHandler.php', diff --git a/src/applications/differential/mail/DifferentialReviewRequestMail.php b/src/applications/differential/mail/DifferentialReviewRequestMail.php index 2c858de252..82a58c8c70 100644 --- a/src/applications/differential/mail/DifferentialReviewRequestMail.php +++ b/src/applications/differential/mail/DifferentialReviewRequestMail.php @@ -104,38 +104,16 @@ abstract class DifferentialReviewRequestMail extends DifferentialMail { } private function buildPatch() { - $diff = new DifferentialDiff(); - $diff->attachChangesets($this->getChangesets()); - foreach ($diff->getChangesets() as $changeset) { - $changeset->attachHunks( - $changeset->loadRelatives(new DifferentialHunk(), 'changesetID')); - } - - $raw_changes = $diff->buildChangesList(); - $changes = array(); - foreach ($raw_changes as $changedict) { - $changes[] = ArcanistDiffChange::newFromDictionary($changedict); - } + $renderer = new DifferentialRawDiffRenderer(); + $renderer->setChangesets($this->getChangesets()); + $renderer->setFormat( + PhabricatorEnv::getEnvConfig('metamta.differential.patch-format')); // TODO: It would be nice to have a real viewer here eventually, but // in the meantime anyone we're sending mail to can certainly see the // patch. - $loader = id(new PhabricatorFileBundleLoader()) - ->setViewer(PhabricatorUser::getOmnipotentUser()); - - $bundle = ArcanistBundle::newFromChanges($changes); - $bundle->setLoadFileDataCallback(array($loader, 'loadFileData')); - - $format = PhabricatorEnv::getEnvConfig('metamta.differential.patch-format'); - switch ($format) { - case 'git': - return $bundle->toGitPatch(); - break; - case 'unified': - default: - return $bundle->toUnifiedDiff(); - break; - } + $renderer->setViewer(PhabricatorUser::getOmnipotentUser()); + return $renderer->buildPatch(); } protected function getMailTags() { diff --git a/src/applications/differential/render/DifferentialRawDiffRenderer.php b/src/applications/differential/render/DifferentialRawDiffRenderer.php new file mode 100644 index 0000000000..e8a1d09a60 --- /dev/null +++ b/src/applications/differential/render/DifferentialRawDiffRenderer.php @@ -0,0 +1,69 @@ +format = $format; + return $this; + } + + public function getFormat() { + return $this->format; + } + + public function setChangesets(array $changesets) { + assert_instances_of($changesets, 'DifferentialChangeset'); + + $this->changesets = $changesets; + return $this; + } + + public function getChangesets() { + return $this->changesets; + } + + public function setViewer(PhabricatorUser $viewer) { + $this->viewer = $viewer; + return $this; + } + + public function getViewer() { + return $this->viewer; + } + + public function buildPatch() { + $diff = new DifferentialDiff(); + $diff->attachChangesets($this->getChangesets()); + foreach ($diff->getChangesets() as $changeset) { + $changeset->attachHunks( + $changeset->loadRelatives(new DifferentialHunk(), 'changesetID')); + } + + $raw_changes = $diff->buildChangesList(); + $changes = array(); + foreach ($raw_changes as $changedict) { + $changes[] = ArcanistDiffChange::newFromDictionary($changedict); + } + + $viewer = $this->getViewer(); + $loader = id(new PhabricatorFileBundleLoader()) + ->setViewer($viewer); + + $bundle = ArcanistBundle::newFromChanges($changes); + $bundle->setLoadFileDataCallback(array($loader, 'loadFileData')); + + $format = $this->getFormat(); + switch ($format) { + case 'git': + return $bundle->toGitPatch(); + break; + case 'unified': + default: + return $bundle->toUnifiedDiff(); + break; + } + } +}