mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-13 18:32:41 +01:00
e84f9f9ec9
Summary: Works this way: - Select users' language with multiplexing. - Select default language otherwise (it can be different from current user's language). - Build body and subject for each user individually. - Set the original language after sending the mails. Test Plan: - Comment on a diff of user with custom translation. - Set default to a custom translation. Comment on a diff of user with default translation. - Set default to a default translation. Comment on a diff of user with default translation. Repeat with/without multiplexing. Reviewers: epriestley Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T1139 Differential Revision: https://secure.phabricator.com/D2774
152 lines
3.9 KiB
PHP
152 lines
3.9 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright 2012 Facebook, Inc.
|
|
*
|
|
* 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;
|
|
|
|
private $patch;
|
|
|
|
public function setComments($comments) {
|
|
$this->comments = $comments;
|
|
return $this;
|
|
}
|
|
|
|
public function getComments() {
|
|
return $this->comments;
|
|
}
|
|
|
|
public function __construct(
|
|
DifferentialRevision $revision,
|
|
PhabricatorObjectHandle $actor,
|
|
array $changesets) {
|
|
assert_instances_of($changesets, 'DifferentialChangeset');
|
|
|
|
$this->setRevision($revision);
|
|
$this->setActorHandle($actor);
|
|
$this->setChangesets($changesets);
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function renderReviewRequestBody() {
|
|
$revision = $this->getRevision();
|
|
|
|
$body = array();
|
|
if (!$this->isFirstMailToRecipients()) {
|
|
if (strlen($this->getComments())) {
|
|
$body[] = $this->formatText($this->getComments());
|
|
$body[] = null;
|
|
}
|
|
}
|
|
|
|
$phase = ($this->isFirstMailToRecipients() ?
|
|
DifferentialMailPhase::WELCOME :
|
|
DifferentialMailPhase::UPDATE);
|
|
$body[] = $this->renderAuxFields($phase);
|
|
|
|
$changesets = $this->getChangesets();
|
|
if ($changesets) {
|
|
$body[] = 'AFFECTED FILES';
|
|
foreach ($changesets as $changeset) {
|
|
$body[] = ' '.$changeset->getFilename();
|
|
}
|
|
$body[] = null;
|
|
}
|
|
|
|
if ($this->patch) {
|
|
$body[] = 'CHANGE DETAILS';
|
|
$body[] = $this->patch;
|
|
}
|
|
|
|
return implode("\n", $body);
|
|
}
|
|
|
|
protected function buildAttachments() {
|
|
$attachments = array();
|
|
|
|
if (PhabricatorEnv::getEnvConfig('metamta.differential.attach-patches')) {
|
|
|
|
$revision = $this->getRevision();
|
|
$revision_id = $revision->getID();
|
|
|
|
$diffs = $revision->loadDiffs();
|
|
$diff_number = count($diffs);
|
|
|
|
$attachments[] = new PhabricatorMetaMTAAttachment(
|
|
$this->buildPatch(),
|
|
"D{$revision_id}.{$diff_number}.patch",
|
|
'text/x-patch; charset=utf-8'
|
|
);
|
|
}
|
|
|
|
return $attachments;
|
|
}
|
|
|
|
public function loadFileByPHID($phid) {
|
|
$file = id(new PhabricatorFile())->loadOneWhere(
|
|
'phid = %s',
|
|
$phid);
|
|
if (!$file) {
|
|
return null;
|
|
}
|
|
return $file->loadFileData();
|
|
}
|
|
|
|
private function buildPatch() {
|
|
$diff = new DifferentialDiff();
|
|
|
|
$diff->attachChangesets($this->getChangesets());
|
|
// TODO: We could batch this to improve performance.
|
|
foreach ($diff->getChangesets() as $changeset) {
|
|
$changeset->attachHunks($changeset->loadHunks());
|
|
}
|
|
$diff_dict = $diff->getDiffDict();
|
|
|
|
$changes = array();
|
|
foreach ($diff_dict['changes'] as $changedict) {
|
|
$changes[] = ArcanistDiffChange::newFromDictionary($changedict);
|
|
}
|
|
$bundle = ArcanistBundle::newFromChanges($changes);
|
|
|
|
$bundle->setLoadFileDataCallback(array($this, 'loadFileByPHID'));
|
|
|
|
$format = PhabricatorEnv::getEnvConfig('metamta.differential.patch-format');
|
|
switch ($format) {
|
|
case 'git':
|
|
return $bundle->toGitPatch();
|
|
break;
|
|
case 'unified':
|
|
default:
|
|
return $bundle->toUnifiedDiff();
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|