mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 08:52:39 +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',
|
||||
'HeraldActionConfig' => 'applications/herald/config/action',
|
||||
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/apply',
|
||||
'HeraldCommitAdapter' => 'applications/herald/adapter/commit',
|
||||
'HeraldCondition' => 'applications/herald/storage/condition',
|
||||
'HeraldConditionConfig' => 'applications/herald/config/condition',
|
||||
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/condition',
|
||||
|
@ -356,6 +357,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/base',
|
||||
'PhabricatorRepositoryCommitData' => 'applications/repository/storage/commitdata',
|
||||
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/base',
|
||||
'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/herald',
|
||||
'PhabricatorRepositoryCommitMessageDetailParser' => 'applications/repository/parser/base',
|
||||
'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/base',
|
||||
'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/base',
|
||||
|
@ -584,6 +586,7 @@ phutil_register_library_map(array(
|
|||
'DiffusionView' => 'AphrontView',
|
||||
'HeraldAction' => 'HeraldDAO',
|
||||
'HeraldApplyTranscript' => 'HeraldDAO',
|
||||
'HeraldCommitAdapter' => 'HeraldObjectAdapter',
|
||||
'HeraldCondition' => 'HeraldDAO',
|
||||
'HeraldController' => 'PhabricatorController',
|
||||
'HeraldDAO' => 'PhabricatorLiskDAO',
|
||||
|
@ -714,6 +717,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||
'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',
|
||||
'PhabricatorRepositoryCommitDiscoveryDaemon' => 'PhabricatorRepositoryDaemon',
|
||||
'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||
'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
|
||||
'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
|
||||
'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';
|
||||
$errors[] = 'There is no commit with that identifier.';
|
||||
}
|
||||
$object = $commit;
|
||||
} else {
|
||||
$e_name = 'Invalid';
|
||||
$errors[] = 'This object name is not recognized.';
|
||||
|
@ -70,7 +71,13 @@ class HeraldTestConsoleController extends HeraldController {
|
|||
if ($object instanceof DifferentialRevision) {
|
||||
$adapter = new HeraldDifferentialRevisionAdapter($object);
|
||||
} 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 {
|
||||
throw new Exception("Can not build adapter for object!");
|
||||
}
|
||||
|
|
|
@ -8,12 +8,14 @@
|
|||
|
||||
phutil_require_module('phabricator', 'aphront/response/redirect');
|
||||
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/dryrun');
|
||||
phutil_require_module('phabricator', 'applications/herald/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/herald/engine/engine');
|
||||
phutil_require_module('phabricator', 'applications/herald/storage/rule');
|
||||
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', 'view/form/base');
|
||||
phutil_require_module('phabricator', 'view/form/control/submit');
|
||||
|
|
|
@ -30,6 +30,11 @@ class HeraldRule extends HeraldDAO {
|
|||
$rules = id(new HeraldRule())->loadAllWhere(
|
||||
'contentType = %s',
|
||||
$content_type);
|
||||
|
||||
if (!$rules) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$rule_ids = mpull($rules, 'getID');
|
||||
|
||||
$conditions = id(new HeraldCondition())->loadAllWhere(
|
||||
|
|
|
@ -27,4 +27,13 @@ class PhabricatorOwnersOwner extends PhabricatorOwnersDAO {
|
|||
) + 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('phutil', 'utils');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorOwnersOwner.php');
|
||||
|
|
|
@ -66,6 +66,44 @@ class PhabricatorOwnersPackage extends PhabricatorOwnersDAO {
|
|||
$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() {
|
||||
|
||||
// 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/path');
|
||||
phutil_require_module('phabricator', 'applications/phid/storage/phid');
|
||||
phutil_require_module('phabricator', 'storage/queryfx');
|
||||
|
||||
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