2011-01-26 02:17:19 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
2012-01-31 19:30:40 +01:00
|
|
|
* Copyright 2012 Facebook, Inc.
|
2011-01-26 02:17:19 +01:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
abstract class DifferentialReviewRequestMail extends DifferentialMail {
|
|
|
|
|
|
|
|
protected $comments;
|
|
|
|
|
2012-06-16 08:21:25 +02:00
|
|
|
private $patch;
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
public function setComments($comments) {
|
|
|
|
$this->comments = $comments;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getComments() {
|
|
|
|
return $this->comments;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __construct(
|
|
|
|
DifferentialRevision $revision,
|
2011-02-09 18:58:48 +01:00
|
|
|
PhabricatorObjectHandle $actor,
|
2011-01-26 02:17:19 +01:00
|
|
|
array $changesets) {
|
2012-04-04 22:13:08 +02:00
|
|
|
assert_instances_of($changesets, 'DifferentialChangeset');
|
2011-01-26 02:17:19 +01:00
|
|
|
|
|
|
|
$this->setRevision($revision);
|
2011-02-09 18:58:48 +01:00
|
|
|
$this->setActorHandle($actor);
|
2011-01-26 02:17:19 +01:00
|
|
|
$this->setChangesets($changesets);
|
|
|
|
}
|
|
|
|
|
2012-06-16 08:21:25 +02:00
|
|
|
protected function prepareBody() {
|
|
|
|
parent::prepareBody();
|
|
|
|
|
|
|
|
$inline_max_length = PhabricatorEnv::getEnvConfig(
|
|
|
|
'metamta.differential.inline-patches');
|
|
|
|
if ($inline_max_length) {
|
|
|
|
$patch = $this->buildPatch();
|
|
|
|
if (count(explode("\n", $patch)) <= $inline_max_length) {
|
|
|
|
$this->patch = $patch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
protected function renderReviewRequestBody() {
|
|
|
|
$revision = $this->getRevision();
|
|
|
|
|
|
|
|
$body = array();
|
2012-06-06 19:52:17 +02:00
|
|
|
if (!$this->isFirstMailToRecipients()) {
|
2011-01-26 02:17:19 +01:00
|
|
|
if (strlen($this->getComments())) {
|
|
|
|
$body[] = $this->formatText($this->getComments());
|
|
|
|
$body[] = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-06 19:52:17 +02:00
|
|
|
$phase = ($this->isFirstMailToRecipients() ?
|
|
|
|
DifferentialMailPhase::WELCOME :
|
|
|
|
DifferentialMailPhase::UPDATE);
|
|
|
|
$body[] = $this->renderAuxFields($phase);
|
2012-04-17 20:40:26 +02:00
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
$changesets = $this->getChangesets();
|
|
|
|
if ($changesets) {
|
|
|
|
$body[] = 'AFFECTED FILES';
|
|
|
|
foreach ($changesets as $changeset) {
|
|
|
|
$body[] = ' '.$changeset->getFilename();
|
|
|
|
}
|
|
|
|
$body[] = null;
|
|
|
|
}
|
|
|
|
|
2012-06-16 08:21:25 +02:00
|
|
|
if ($this->patch) {
|
|
|
|
$body[] = 'CHANGE DETAILS';
|
|
|
|
$body[] = $this->patch;
|
2012-03-03 20:05:19 +01:00
|
|
|
}
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
return implode("\n", $body);
|
|
|
|
}
|
2011-10-14 21:08:31 +02:00
|
|
|
|
|
|
|
protected function buildAttachments() {
|
|
|
|
$attachments = array();
|
2012-03-03 20:05:19 +01:00
|
|
|
|
2011-10-14 21:08:31 +02:00
|
|
|
if (PhabricatorEnv::getEnvConfig('metamta.differential.attach-patches')) {
|
2012-03-06 01:44:11 +01:00
|
|
|
|
2012-03-07 19:20:17 +01:00
|
|
|
$revision = $this->getRevision();
|
|
|
|
$revision_id = $revision->getID();
|
2012-03-06 01:44:11 +01:00
|
|
|
|
|
|
|
$diffs = $revision->loadDiffs();
|
|
|
|
$diff_number = count($diffs);
|
|
|
|
|
2012-03-03 20:05:19 +01:00
|
|
|
$attachments[] = new PhabricatorMetaMTAAttachment(
|
|
|
|
$this->buildPatch(),
|
|
|
|
"D{$revision_id}.{$diff_number}.patch",
|
|
|
|
'text/x-patch; charset=utf-8'
|
|
|
|
);
|
|
|
|
}
|
2011-10-14 21:08:31 +02:00
|
|
|
|
2012-03-03 20:05:19 +01:00
|
|
|
return $attachments;
|
|
|
|
}
|
2011-10-14 21:08:31 +02:00
|
|
|
|
2012-04-10 02:35:01 +02:00
|
|
|
public function loadFileByPHID($phid) {
|
|
|
|
$file = id(new PhabricatorFile())->loadOneWhere(
|
|
|
|
'phid = %s',
|
|
|
|
$phid);
|
|
|
|
if (!$file) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return $file->loadFileData();
|
|
|
|
}
|
|
|
|
|
2012-03-03 20:05:19 +01:00
|
|
|
private function buildPatch() {
|
2012-06-16 08:21:25 +02:00
|
|
|
$diff = new DifferentialDiff();
|
2011-10-14 21:08:31 +02:00
|
|
|
|
2012-06-16 08:21:25 +02:00
|
|
|
$diff->attachChangesets($this->getChangesets());
|
2012-03-03 20:05:19 +01:00
|
|
|
// TODO: We could batch this to improve performance.
|
|
|
|
foreach ($diff->getChangesets() as $changeset) {
|
|
|
|
$changeset->attachHunks($changeset->loadHunks());
|
|
|
|
}
|
|
|
|
$diff_dict = $diff->getDiffDict();
|
2011-10-14 21:08:31 +02:00
|
|
|
|
2012-03-03 20:05:19 +01:00
|
|
|
$changes = array();
|
|
|
|
foreach ($diff_dict['changes'] as $changedict) {
|
|
|
|
$changes[] = ArcanistDiffChange::newFromDictionary($changedict);
|
|
|
|
}
|
|
|
|
$bundle = ArcanistBundle::newFromChanges($changes);
|
|
|
|
|
2012-04-10 02:35:01 +02:00
|
|
|
$bundle->setLoadFileDataCallback(array($this, 'loadFileByPHID'));
|
|
|
|
|
2012-03-03 20:05:19 +01:00
|
|
|
$format = PhabricatorEnv::getEnvConfig('metamta.differential.patch-format');
|
|
|
|
switch ($format) {
|
|
|
|
case 'git':
|
|
|
|
return $bundle->toGitPatch();
|
|
|
|
break;
|
|
|
|
case 'unified':
|
|
|
|
default:
|
|
|
|
return $bundle->toUnifiedDiff();
|
|
|
|
break;
|
2011-10-14 21:08:31 +02:00
|
|
|
}
|
|
|
|
}
|
2012-03-03 20:05:19 +01:00
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
}
|