mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-02 10:51:01 +01:00
HeraldCommitAdapter and some related junk.
This commit is contained in:
parent
e407b2311e
commit
2834e9f6ce
12 changed files with 458 additions and 1 deletions
|
@ -196,6 +196,7 @@ phutil_register_library_map(array(
|
||||||
'HeraldAction' => 'applications/herald/storage/action',
|
'HeraldAction' => 'applications/herald/storage/action',
|
||||||
'HeraldActionConfig' => 'applications/herald/config/action',
|
'HeraldActionConfig' => 'applications/herald/config/action',
|
||||||
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/apply',
|
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/apply',
|
||||||
|
'HeraldCommitAdapter' => 'applications/herald/adapter/commit',
|
||||||
'HeraldCondition' => 'applications/herald/storage/condition',
|
'HeraldCondition' => 'applications/herald/storage/condition',
|
||||||
'HeraldConditionConfig' => 'applications/herald/config/condition',
|
'HeraldConditionConfig' => 'applications/herald/config/condition',
|
||||||
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/condition',
|
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/condition',
|
||||||
|
@ -356,6 +357,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/base',
|
'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/base',
|
||||||
'PhabricatorRepositoryCommitData' => 'applications/repository/storage/commitdata',
|
'PhabricatorRepositoryCommitData' => 'applications/repository/storage/commitdata',
|
||||||
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/base',
|
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/base',
|
||||||
|
'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/herald',
|
||||||
'PhabricatorRepositoryCommitMessageDetailParser' => 'applications/repository/parser/base',
|
'PhabricatorRepositoryCommitMessageDetailParser' => 'applications/repository/parser/base',
|
||||||
'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/base',
|
'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/base',
|
||||||
'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/base',
|
'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/base',
|
||||||
|
@ -584,6 +586,7 @@ phutil_register_library_map(array(
|
||||||
'DiffusionView' => 'AphrontView',
|
'DiffusionView' => 'AphrontView',
|
||||||
'HeraldAction' => 'HeraldDAO',
|
'HeraldAction' => 'HeraldDAO',
|
||||||
'HeraldApplyTranscript' => 'HeraldDAO',
|
'HeraldApplyTranscript' => 'HeraldDAO',
|
||||||
|
'HeraldCommitAdapter' => 'HeraldObjectAdapter',
|
||||||
'HeraldCondition' => 'HeraldDAO',
|
'HeraldCondition' => 'HeraldDAO',
|
||||||
'HeraldController' => 'PhabricatorController',
|
'HeraldController' => 'PhabricatorController',
|
||||||
'HeraldDAO' => 'PhabricatorLiskDAO',
|
'HeraldDAO' => 'PhabricatorLiskDAO',
|
||||||
|
@ -714,6 +717,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||||
'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',
|
'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',
|
||||||
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'PhabricatorRepositoryDaemon',
|
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'PhabricatorRepositoryDaemon',
|
||||||
|
'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||||
'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||||
'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
|
'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
|
||||||
'PhabricatorRepositoryCommitTaskDaemon' => 'PhabricatorRepositoryDaemon',
|
'PhabricatorRepositoryCommitTaskDaemon' => 'PhabricatorRepositoryDaemon',
|
||||||
|
|
211
src/applications/herald/adapter/commit/HeraldCommitAdapter.php
Normal file
211
src/applications/herald/adapter/commit/HeraldCommitAdapter.php
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2011 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class HeraldCommitAdapter extends HeraldObjectAdapter {
|
||||||
|
|
||||||
|
protected $diff;
|
||||||
|
protected $revision;
|
||||||
|
|
||||||
|
protected $repository;
|
||||||
|
protected $commit;
|
||||||
|
protected $commitData;
|
||||||
|
|
||||||
|
protected $emailPHIDs = array();
|
||||||
|
|
||||||
|
protected $affectedPaths;
|
||||||
|
protected $affectedRevision;
|
||||||
|
protected $affectedPackages;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
PhabricatorRepository $repository,
|
||||||
|
PhabricatorRepositoryCommit $commit,
|
||||||
|
PhabricatorRepositoryCommitData $commit_data) {
|
||||||
|
|
||||||
|
$this->repository = $repository;
|
||||||
|
$this->commit = $commit;
|
||||||
|
$this->commitData = $commit_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPHID() {
|
||||||
|
return $this->commit->getPHID();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEmailPHIDs() {
|
||||||
|
return $this->emailPHIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeraldName() {
|
||||||
|
return
|
||||||
|
'r'.
|
||||||
|
$this->repository->getCallsign().
|
||||||
|
$this->commit->getCommitIdentifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeraldTypeName() {
|
||||||
|
return HeraldContentTypeConfig::CONTENT_TYPE_COMMIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadAffectedPaths() {
|
||||||
|
if ($this->affectedPaths === null) {
|
||||||
|
$drequest = $this->buildDiffusionRequest();
|
||||||
|
$path_query = DiffusionPathChangeQuery::newFromDiffusionRequest(
|
||||||
|
$drequest);
|
||||||
|
$paths = $path_query->loadChanges();
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
foreach ($paths as $path) {
|
||||||
|
$basic_path = '/'.$path->getPath();
|
||||||
|
if ($path->getFileType() == DifferentialChangeType::FILE_DIRECTORY) {
|
||||||
|
$basic_path = rtrim($basic_path, '/').'/';
|
||||||
|
}
|
||||||
|
$result[] = $basic_path;
|
||||||
|
}
|
||||||
|
$this->affectedPaths = $result;
|
||||||
|
}
|
||||||
|
return $this->affectedPaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadAffectedPackages() {
|
||||||
|
if ($this->affectedPackages === null) {
|
||||||
|
$packages = PhabricatorOwnersPackage::loadAffectedPackages(
|
||||||
|
$this->repository,
|
||||||
|
$this->loadAffectedPaths());
|
||||||
|
$this->affectedPackages = $packages;
|
||||||
|
}
|
||||||
|
return $this->affectedPackages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function loadDifferentialRevision() {
|
||||||
|
if ($this->affectedRevision === null) {
|
||||||
|
$this->affectedRevision = false;
|
||||||
|
$data = $this->commitData;
|
||||||
|
$revision_id = $data->getCommitDetail('differential.revisionID');
|
||||||
|
if ($revision_id) {
|
||||||
|
$revision = id(new DifferentialRevision())->load($revision_id);
|
||||||
|
if ($revision) {
|
||||||
|
$revision->loadRelationships();
|
||||||
|
$this->affectedRevision = $revision;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->affectedRevision;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildDiffusionRequest() {
|
||||||
|
return DiffusionRequest::newFromAphrontRequestDictionary(
|
||||||
|
array(
|
||||||
|
'callsign' => $this->repository->getCallsign(),
|
||||||
|
'commit' => $this->commit->getCommitIdentifier(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getHeraldField($field) {
|
||||||
|
$data = $this->commitData;
|
||||||
|
switch ($field) {
|
||||||
|
case HeraldFieldConfig::FIELD_BODY:
|
||||||
|
return $data->getCommitMessage();
|
||||||
|
case HeraldFieldConfig::FIELD_AUTHOR:
|
||||||
|
return $data->getCommitDetail('authorPHID');
|
||||||
|
case HeraldFieldConfig::FIELD_REVIEWER:
|
||||||
|
return $data->getCommitDetail('reviewerPHID');
|
||||||
|
case HeraldFieldConfig::FIELD_DIFF_FILE:
|
||||||
|
return $this->loadAffectedPaths();
|
||||||
|
case HeraldFieldConfig::FIELD_REPOSITORY:
|
||||||
|
return $this->repository->getPHID();
|
||||||
|
case HeraldFieldConfig::FIELD_DIFF_CONTENT:
|
||||||
|
// TODO!
|
||||||
|
return null;
|
||||||
|
/*
|
||||||
|
try {
|
||||||
|
$diff = $this->loadDiff();
|
||||||
|
} catch (Exception $ex) {
|
||||||
|
// See rE280053 for an example.
|
||||||
|
return array(
|
||||||
|
'<<< Failed to load diff, this usually means the change committed '.
|
||||||
|
'a binary file as text. >>>',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$dict = array();
|
||||||
|
$changes = $diff->getChangesets();
|
||||||
|
$lines = array();
|
||||||
|
foreach ($changes as $change) {
|
||||||
|
$lines = array();
|
||||||
|
foreach ($change->getHunks() as $hunk) {
|
||||||
|
$lines[] = $hunk->makeChanges();
|
||||||
|
}
|
||||||
|
$dict[$change->getTrueFilename()] = implode("\n", $lines);
|
||||||
|
}
|
||||||
|
return $dict;
|
||||||
|
*/
|
||||||
|
case HeraldFieldConfig::FIELD_AFFECTED_PACKAGE:
|
||||||
|
$packages = $this->loadAffectedPackages();
|
||||||
|
return mpull($packages, 'getPHID');
|
||||||
|
case HeraldFieldConfig::FIELD_AFFECTED_PACKAGE_OWNER:
|
||||||
|
$packages = $this->loadAffectedPackages();
|
||||||
|
$owners = PhabricatorOwnersOwner::loadAllForPackages($packages);
|
||||||
|
return mpull($owners, 'getUserPHID');
|
||||||
|
case HeraldFieldConfig::FIELD_DIFFERENTIAL_REVISION:
|
||||||
|
$revision = $this->loadDifferentialRevision();
|
||||||
|
if (!$revision) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return $revision->getID();
|
||||||
|
case HeraldFieldConfig::FIELD_DIFFERENTIAL_REVIEWERS:
|
||||||
|
$revision = $this->loadDifferentialRevision();
|
||||||
|
if (!$revision) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return $revision->getReviewers();
|
||||||
|
case HeraldFieldConfig::FIELD_DIFFERENTIAL_CCS:
|
||||||
|
$revision = $this->loadDifferentialRevision();
|
||||||
|
if (!$revision) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return $revision->getCCPHIDs();
|
||||||
|
default:
|
||||||
|
throw new Exception("Invalid field '{$field}'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function applyHeraldEffects(array $effects) {
|
||||||
|
$result = array();
|
||||||
|
foreach ($effects as $effect) {
|
||||||
|
$action = $effect->getAction();
|
||||||
|
switch ($action) {
|
||||||
|
case HeraldActionConfig::ACTION_NOTHING:
|
||||||
|
$result[] = new HeraldApplyTranscript(
|
||||||
|
$effect,
|
||||||
|
true,
|
||||||
|
'Great success at doing nothing.');
|
||||||
|
break;
|
||||||
|
case HeraldActionConfig::ACTION_EMAIL:
|
||||||
|
foreach ($effect->getTarget() as $fbid) {
|
||||||
|
$this->emailPHIDs[] = $fbid;
|
||||||
|
}
|
||||||
|
$result[] = new HeraldApplyTranscript(
|
||||||
|
$effect,
|
||||||
|
true,
|
||||||
|
'Added address to email targets.');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Exception("No rules to handle action '{$action}'.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
24
src/applications/herald/adapter/commit/__init__.php
Normal file
24
src/applications/herald/adapter/commit/__init__.php
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/constants/changetype');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/storage/revision');
|
||||||
|
phutil_require_module('phabricator', 'applications/diffusion/query/pathchange/base');
|
||||||
|
phutil_require_module('phabricator', 'applications/diffusion/request/base');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/adapter/base');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/config/action');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/config/contenttype');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/config/field');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/storage/transcript/apply');
|
||||||
|
phutil_require_module('phabricator', 'applications/owners/storage/owner');
|
||||||
|
phutil_require_module('phabricator', 'applications/owners/storage/package');
|
||||||
|
|
||||||
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('HeraldCommitAdapter.php');
|
|
@ -61,6 +61,7 @@ class HeraldTestConsoleController extends HeraldController {
|
||||||
$e_name = 'Invalid';
|
$e_name = 'Invalid';
|
||||||
$errors[] = 'There is no commit with that identifier.';
|
$errors[] = 'There is no commit with that identifier.';
|
||||||
}
|
}
|
||||||
|
$object = $commit;
|
||||||
} else {
|
} else {
|
||||||
$e_name = 'Invalid';
|
$e_name = 'Invalid';
|
||||||
$errors[] = 'This object name is not recognized.';
|
$errors[] = 'This object name is not recognized.';
|
||||||
|
@ -70,7 +71,13 @@ class HeraldTestConsoleController extends HeraldController {
|
||||||
if ($object instanceof DifferentialRevision) {
|
if ($object instanceof DifferentialRevision) {
|
||||||
$adapter = new HeraldDifferentialRevisionAdapter($object);
|
$adapter = new HeraldDifferentialRevisionAdapter($object);
|
||||||
} else if ($object instanceof PhabricatorRepositoryCommit) {
|
} else if ($object instanceof PhabricatorRepositoryCommit) {
|
||||||
$adapter = new HeraldDiffusionCommitAdapter($object);
|
$data = id(new PhabricatorRepositoryCommitData())->loadOneWhere(
|
||||||
|
'commitID = %d',
|
||||||
|
$object->getID());
|
||||||
|
$adapter = new HeraldCommitAdapter(
|
||||||
|
$repo,
|
||||||
|
$object,
|
||||||
|
$data);
|
||||||
} else {
|
} else {
|
||||||
throw new Exception("Can not build adapter for object!");
|
throw new Exception("Can not build adapter for object!");
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,14 @@
|
||||||
|
|
||||||
phutil_require_module('phabricator', 'aphront/response/redirect');
|
phutil_require_module('phabricator', 'aphront/response/redirect');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/revision');
|
phutil_require_module('phabricator', 'applications/differential/storage/revision');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/adapter/commit');
|
||||||
phutil_require_module('phabricator', 'applications/herald/adapter/differential');
|
phutil_require_module('phabricator', 'applications/herald/adapter/differential');
|
||||||
phutil_require_module('phabricator', 'applications/herald/adapter/dryrun');
|
phutil_require_module('phabricator', 'applications/herald/adapter/dryrun');
|
||||||
phutil_require_module('phabricator', 'applications/herald/controller/base');
|
phutil_require_module('phabricator', 'applications/herald/controller/base');
|
||||||
phutil_require_module('phabricator', 'applications/herald/engine/engine');
|
phutil_require_module('phabricator', 'applications/herald/engine/engine');
|
||||||
phutil_require_module('phabricator', 'applications/herald/storage/rule');
|
phutil_require_module('phabricator', 'applications/herald/storage/rule');
|
||||||
phutil_require_module('phabricator', 'applications/repository/storage/commit');
|
phutil_require_module('phabricator', 'applications/repository/storage/commit');
|
||||||
|
phutil_require_module('phabricator', 'applications/repository/storage/commitdata');
|
||||||
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
||||||
phutil_require_module('phabricator', 'view/form/base');
|
phutil_require_module('phabricator', 'view/form/base');
|
||||||
phutil_require_module('phabricator', 'view/form/control/submit');
|
phutil_require_module('phabricator', 'view/form/control/submit');
|
||||||
|
|
|
@ -30,6 +30,11 @@ class HeraldRule extends HeraldDAO {
|
||||||
$rules = id(new HeraldRule())->loadAllWhere(
|
$rules = id(new HeraldRule())->loadAllWhere(
|
||||||
'contentType = %s',
|
'contentType = %s',
|
||||||
$content_type);
|
$content_type);
|
||||||
|
|
||||||
|
if (!$rules) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
$rule_ids = mpull($rules, 'getID');
|
$rule_ids = mpull($rules, 'getID');
|
||||||
|
|
||||||
$conditions = id(new HeraldCondition())->loadAllWhere(
|
$conditions = id(new HeraldCondition())->loadAllWhere(
|
||||||
|
|
|
@ -27,4 +27,13 @@ class PhabricatorOwnersOwner extends PhabricatorOwnersDAO {
|
||||||
) + parent::getConfiguration();
|
) + parent::getConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function loadAllForPackages(array $packages) {
|
||||||
|
if (!$packages) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
return id(new PhabricatorOwnersOwner())->loadAllWhere(
|
||||||
|
'packageID IN (%Ls)',
|
||||||
|
mpull($packages, 'getID'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,5 +8,7 @@
|
||||||
|
|
||||||
phutil_require_module('phabricator', 'applications/owners/storage/base');
|
phutil_require_module('phabricator', 'applications/owners/storage/base');
|
||||||
|
|
||||||
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
phutil_require_source('PhabricatorOwnersOwner.php');
|
phutil_require_source('PhabricatorOwnersOwner.php');
|
||||||
|
|
|
@ -66,6 +66,44 @@ class PhabricatorOwnersPackage extends PhabricatorOwnersDAO {
|
||||||
$this->getID());
|
$this->getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function loadAffectedPackages(
|
||||||
|
PhabricatorRepository $repository,
|
||||||
|
array $paths) {
|
||||||
|
|
||||||
|
if (!$paths) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$fragments = array(
|
||||||
|
'/' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($paths as $path) {
|
||||||
|
$trailing_slash = preg_match('@/$@', $path) ? '/' : '';
|
||||||
|
$path = trim($path, '/');
|
||||||
|
$parts = explode('/', $path);
|
||||||
|
while (count($parts)) {
|
||||||
|
$fragments['/'.implode('/', $parts).$trailing_slash] = true;
|
||||||
|
$trailing_slash = '/';
|
||||||
|
array_pop($parts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$package = new PhabricatorOwnersPackage();
|
||||||
|
$path = new PhabricatorOwnersPath();
|
||||||
|
$data = queryfx_all(
|
||||||
|
$package->establishConnection('r'),
|
||||||
|
'SELECT pkg.* FROM %T pkg JOIN %T p ON p.packageID = pkg.id
|
||||||
|
WHERE p.repositoryPHID = %s
|
||||||
|
AND p.path IN (%Ls)',
|
||||||
|
$package->getTableName(),
|
||||||
|
$path->getTableName(),
|
||||||
|
$repository->getPHID(),
|
||||||
|
array_keys($fragments));
|
||||||
|
|
||||||
|
return $package->loadAllFromArray($data);
|
||||||
|
}
|
||||||
|
|
||||||
public function save() {
|
public function save() {
|
||||||
|
|
||||||
// TODO: Transactions!
|
// TODO: Transactions!
|
||||||
|
|
|
@ -10,6 +10,7 @@ phutil_require_module('phabricator', 'applications/owners/storage/base');
|
||||||
phutil_require_module('phabricator', 'applications/owners/storage/owner');
|
phutil_require_module('phabricator', 'applications/owners/storage/owner');
|
||||||
phutil_require_module('phabricator', 'applications/owners/storage/path');
|
phutil_require_module('phabricator', 'applications/owners/storage/path');
|
||||||
phutil_require_module('phabricator', 'applications/phid/storage/phid');
|
phutil_require_module('phabricator', 'applications/phid/storage/phid');
|
||||||
|
phutil_require_module('phabricator', 'storage/queryfx');
|
||||||
|
|
||||||
phutil_require_module('phutil', 'utils');
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2011 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PhabricatorRepositoryCommitHeraldWorker
|
||||||
|
extends PhabricatorRepositoryCommitParserWorker {
|
||||||
|
|
||||||
|
public function parseCommit(
|
||||||
|
PhabricatorRepository $repository,
|
||||||
|
PhabricatorRepositoryCommit $commit) {
|
||||||
|
|
||||||
|
$data = id(new PhabricatorRepositoryCommitData())->loadOneWhere(
|
||||||
|
'commitID = %d',
|
||||||
|
$commit->getID());
|
||||||
|
|
||||||
|
$rules = HeraldRule::loadAllByContentTypeWithFullData(
|
||||||
|
HeraldContentTypeConfig::CONTENT_TYPE_COMMIT);
|
||||||
|
|
||||||
|
$adapter = new HeraldCommitAdapter(
|
||||||
|
$repository,
|
||||||
|
$commit,
|
||||||
|
$data);
|
||||||
|
$engine = new HeraldEngine();
|
||||||
|
|
||||||
|
$effects = $engine->applyRules($this->rules, $adapter);
|
||||||
|
$engine->applyEffects($effects, $adapter);
|
||||||
|
|
||||||
|
$phids = $adapter->getEmailPHIDs();
|
||||||
|
if (!$phids) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$xscript = $engine->getTranscript();
|
||||||
|
|
||||||
|
$commit_name = $adapter->getHeraldName();
|
||||||
|
$revision = $adapter->loadDifferentialRevision();
|
||||||
|
|
||||||
|
$name = null;
|
||||||
|
if ($revision) {
|
||||||
|
$name = $revision->getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
$author_phid = $data->getCommitDetail('authorPHID');
|
||||||
|
$reviewer_phid = $data->getCommitDetail('reviewerPHID');
|
||||||
|
|
||||||
|
$phids = array_filter(array($author_phid, $reviewer_phid));
|
||||||
|
|
||||||
|
$handles = array();
|
||||||
|
if ($phids) {
|
||||||
|
$handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($author_phid) {
|
||||||
|
$author_name = $handles[$author_phid]->getName();
|
||||||
|
} else {
|
||||||
|
$author_name = $data->getAuthorName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($reviewer_phid) {
|
||||||
|
$reviewer_name = $handles[$reviewer_phid]->getName();
|
||||||
|
} else {
|
||||||
|
$reviewer_name = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$who = implode(', ', array_filter(array($author_name, $reviewer_name)));
|
||||||
|
|
||||||
|
$description = $data->getCommitMessage();
|
||||||
|
|
||||||
|
$details = PhabricatorEnv::getURI('/'.$commit_name);
|
||||||
|
$differential = $revision
|
||||||
|
? PhabricatorEnv::getURI('/D'.$revision->getID())
|
||||||
|
: 'No revision.';
|
||||||
|
|
||||||
|
$files = $adapter->loadAffectedPaths();
|
||||||
|
sort($files);
|
||||||
|
$files = implode("\n ", $files);
|
||||||
|
|
||||||
|
$xscript_id = $xscript->getID();
|
||||||
|
|
||||||
|
$manage_uri = PhabricatorEnv::getURI('/herald/view/commits/');
|
||||||
|
$why_uri = PhabricatorEnv::getURI('/herald/transcript/'.$xscript_id.'/');
|
||||||
|
|
||||||
|
$body = <<<EOBODY
|
||||||
|
DESCRIPTION
|
||||||
|
{$description}
|
||||||
|
|
||||||
|
DETAILS
|
||||||
|
{$details}
|
||||||
|
|
||||||
|
DIFFERENTIAL REVISION
|
||||||
|
{$differential}
|
||||||
|
|
||||||
|
AFFECTED FILES
|
||||||
|
{$files}
|
||||||
|
|
||||||
|
MANAGE HERALD RULES
|
||||||
|
{$manage_uri}
|
||||||
|
|
||||||
|
WHY DID I GET THIS EMAIL?
|
||||||
|
{$why_uri}
|
||||||
|
|
||||||
|
EOBODY;
|
||||||
|
|
||||||
|
$subject = "[Herald/Commit] {$commit_name} ({$who}){$name}";
|
||||||
|
|
||||||
|
$mailer = new PhabricatorMetaMTAMail();
|
||||||
|
$mailer->addTos($phids);
|
||||||
|
$mailer->setSubject($subject);
|
||||||
|
$mailer->setBody($body);
|
||||||
|
|
||||||
|
$mailer->addHeader('X-Herald-Rules', $xscript->getXHeraldRulesHeader());
|
||||||
|
if ($author_phid) {
|
||||||
|
$mailer->setFrom($author_phid);
|
||||||
|
}
|
||||||
|
|
||||||
|
$mailer->save();
|
||||||
|
}
|
||||||
|
}
|
22
src/applications/repository/worker/herald/__init__.php
Normal file
22
src/applications/repository/worker/herald/__init__.php
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/adapter/commit');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/config/contenttype');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/engine/engine');
|
||||||
|
phutil_require_module('phabricator', 'applications/herald/storage/rule');
|
||||||
|
phutil_require_module('phabricator', 'applications/metamta/storage/mail');
|
||||||
|
phutil_require_module('phabricator', 'applications/phid/handle/data');
|
||||||
|
phutil_require_module('phabricator', 'applications/repository/storage/commitdata');
|
||||||
|
phutil_require_module('phabricator', 'applications/repository/worker/base');
|
||||||
|
phutil_require_module('phabricator', 'infrastructure/env');
|
||||||
|
|
||||||
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('PhabricatorRepositoryCommitHeraldWorker.php');
|
Loading…
Reference in a new issue