diff --git a/src/applications/audit/editor/PhabricatorAuditEditor.php b/src/applications/audit/editor/PhabricatorAuditEditor.php --- a/src/applications/audit/editor/PhabricatorAuditEditor.php +++ b/src/applications/audit/editor/PhabricatorAuditEditor.php @@ -366,7 +366,7 @@ return $reply_handler; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.diffusion.subject-prefix'); } diff --git a/src/applications/conpherence/editor/ConpherenceEditor.php b/src/applications/conpherence/editor/ConpherenceEditor.php --- a/src/applications/conpherence/editor/ConpherenceEditor.php +++ b/src/applications/conpherence/editor/ConpherenceEditor.php @@ -412,7 +412,7 @@ return $body; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.conpherence.subject-prefix'); } diff --git a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php --- a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php +++ b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php @@ -244,7 +244,11 @@ 'metamta.differential.subject-prefix', 'string', '[Differential]') - ->setDescription(pht('Subject prefix for Differential mail.')), + ->setSummary(pht('Subject prefix template for Differential mail.')) + ->setDescription(pht('Available keys: id, title, repository, branch')) + ->addExample( + '[${repository}/${branch}] [Differential]', + pht('Use repository and branch')), $this->newOption( 'metamta.differential.attach-patches', 'bool', diff --git a/src/applications/differential/editor/DifferentialTransactionEditor.php b/src/applications/differential/editor/DifferentialTransactionEditor.php --- a/src/applications/differential/editor/DifferentialTransactionEditor.php +++ b/src/applications/differential/editor/DifferentialTransactionEditor.php @@ -1095,8 +1095,24 @@ return $action; } - protected function getMailSubjectPrefix() { - return PhabricatorEnv::getEnvConfig('metamta.differential.subject-prefix'); + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { + $branch = nonempty($object->getActiveDiff()->getBranch(), '-'); + $repo_name = null; + + if ($object->getRepository()) { + $repo_name = $object->getRepository()->getName(); + } + + if ($repo_name === null) { + $repo_name = basename($object->getActiveDiff()->getSourcePath()); + } + + return $this->mergeVariables( + PhabricatorEnv::getEnvConfig('metamta.differential.subject-prefix'), + array( + 'branch' => $branch, + 'repository' => $repo_name, + )); } protected function getMailThreadID(PhabricatorLiskDAO $object) { @@ -1124,6 +1140,42 @@ ->addHeader('Thread-Topic', $thread_topic); } + /** + * Convert a user-provided string with variables in it, like: + * + * ${project}/${branch} + * + * ...into a string with variables merged into it safely: + * + * myproject/mybranch + * + * Maybe move to libphutil? + * @param string User-provided pattern string containing `${variables}`. + * @param dict List of available replacement variables. + * @return string String with variables replaced safely into it. + * + */ + protected function mergeVariables($pattern, array $variables) { + $regexp = '/\\$\\{(?P[a-z\\.]+)\\}/'; + + $matches = null; + preg_match_all($regexp, $pattern, $matches); + + $argv = array(); + foreach ($matches['name'] as $name) { + if (!array_key_exists($name, $variables)) { + throw new Exception(pht("No such variable '%s'!", $name)); + } + $argv[] = $variables[$name]; + } + + $pattern = str_replace('%', '%%', $pattern); + $pattern = preg_replace($regexp, '%s', $pattern); + + return vsprintf($pattern, $argv); + } + + protected function buildMailBody( PhabricatorLiskDAO $object, array $xactions) { diff --git a/src/applications/files/editor/PhabricatorFileEditor.php b/src/applications/files/editor/PhabricatorFileEditor.php --- a/src/applications/files/editor/PhabricatorFileEditor.php +++ b/src/applications/files/editor/PhabricatorFileEditor.php @@ -54,7 +54,7 @@ return true; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.files.subject-prefix'); } diff --git a/src/applications/legalpad/editor/LegalpadDocumentEditor.php b/src/applications/legalpad/editor/LegalpadDocumentEditor.php --- a/src/applications/legalpad/editor/LegalpadDocumentEditor.php +++ b/src/applications/legalpad/editor/LegalpadDocumentEditor.php @@ -201,7 +201,7 @@ return $body; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.legalpad.subject-prefix'); } diff --git a/src/applications/macro/editor/PhabricatorMacroEditor.php b/src/applications/macro/editor/PhabricatorMacroEditor.php --- a/src/applications/macro/editor/PhabricatorMacroEditor.php +++ b/src/applications/macro/editor/PhabricatorMacroEditor.php @@ -160,7 +160,7 @@ return $body; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.macro.subject-prefix'); } diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditor.php b/src/applications/maniphest/editor/ManiphestTransactionEditor.php --- a/src/applications/maniphest/editor/ManiphestTransactionEditor.php +++ b/src/applications/maniphest/editor/ManiphestTransactionEditor.php @@ -403,7 +403,7 @@ return $xactions; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.maniphest.subject-prefix'); } diff --git a/src/applications/paste/editor/PhabricatorPasteEditor.php b/src/applications/paste/editor/PhabricatorPasteEditor.php --- a/src/applications/paste/editor/PhabricatorPasteEditor.php +++ b/src/applications/paste/editor/PhabricatorPasteEditor.php @@ -136,7 +136,7 @@ return true; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.paste.subject-prefix'); } diff --git a/src/applications/pholio/editor/PholioMockEditor.php b/src/applications/pholio/editor/PholioMockEditor.php --- a/src/applications/pholio/editor/PholioMockEditor.php +++ b/src/applications/pholio/editor/PholioMockEditor.php @@ -416,7 +416,7 @@ return $body; } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.pholio.subject-prefix'); } diff --git a/src/applications/phriction/editor/PhrictionDocumentEditor.php b/src/applications/phriction/editor/PhrictionDocumentEditor.php --- a/src/applications/phriction/editor/PhrictionDocumentEditor.php +++ b/src/applications/phriction/editor/PhrictionDocumentEditor.php @@ -350,7 +350,7 @@ $body = implode("\n\n", $body); - $subject_prefix = $this->getMailSubjectPrefix(); + $subject_prefix = $this->getMailSubjectPrefix(null); $mail = new PhabricatorMetaMTAMail(); $mail->setSubject($name) @@ -368,7 +368,7 @@ /* --( For less copy-pasting when switching to ApplicationTransactions )--- */ - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return PhabricatorEnv::getEnvConfig('metamta.phriction.subject-prefix'); } diff --git a/src/applications/ponder/editor/PonderEditor.php b/src/applications/ponder/editor/PonderEditor.php --- a/src/applications/ponder/editor/PonderEditor.php +++ b/src/applications/ponder/editor/PonderEditor.php @@ -31,7 +31,7 @@ ); } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return '[Ponder]'; } diff --git a/src/applications/releeph/editor/ReleephRequestTransactionalEditor.php b/src/applications/releeph/editor/ReleephRequestTransactionalEditor.php --- a/src/applications/releeph/editor/ReleephRequestTransactionalEditor.php +++ b/src/applications/releeph/editor/ReleephRequestTransactionalEditor.php @@ -196,7 +196,7 @@ ->setMailReceiver($object); } - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { return '[Releeph]'; } diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -1858,7 +1858,7 @@ $template ->setFrom($this->getActingAsPHID()) - ->setSubjectPrefix($this->getMailSubjectPrefix()) + ->setSubjectPrefix($this->getMailSubjectPrefix($object)) ->setVarySubjectPrefix('['.$action.']') ->setThreadID($this->getMailThreadID($object), $this->getIsNewObject()) ->setRelatedPHID($object->getPHID()) @@ -1931,7 +1931,7 @@ /** * @task mail */ - protected function getMailSubjectPrefix() { + protected function getMailSubjectPrefix(PhabricatorLiskDAO $object) { throw new Exception('Capability not supported.'); }