Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13985137
D8615.id20440.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
22 KB
Referenced Files
None
Subscribers
None
D8615.id20440.diff
View Options
diff --git a/resources/sql/autopatches/20140325.push.1.event.sql b/resources/sql/autopatches/20140325.push.1.event.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140325.push.1.event.sql
@@ -0,0 +1,15 @@
+CREATE TABLE {$NAMESPACE}_repository.repository_pushevent (
+ id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ repositoryPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ epoch INT UNSIGNED NOT NULL,
+ pusherPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
+ remoteAddress INT UNSIGNED,
+ remoteProtocol VARCHAR(32),
+ rejectCode INT UNSIGNED NOT NULL,
+ rejectDetails VARCHAR(64) COLLATE utf8_bin,
+
+ UNIQUE KEY `key_phid` (phid),
+ KEY `key_repository` (repositoryPHID)
+
+) ENGINE=InnoDB, COLLATE=utf8_general_ci;
diff --git a/resources/sql/autopatches/20140325.push.2.eventphid.sql b/resources/sql/autopatches/20140325.push.2.eventphid.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140325.push.2.eventphid.sql
@@ -0,0 +1,5 @@
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ ADD pushEventPHID VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER epoch;
+
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ ADD KEY `key_event` (pushEventPHID);
diff --git a/resources/sql/autopatches/20140325.push.3.groups.php b/resources/sql/autopatches/20140325.push.3.groups.php
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140325.push.3.groups.php
@@ -0,0 +1,43 @@
+<?php
+
+$conn_w = id(new PhabricatorRepository())->establishConnection('w');
+
+echo "Adding transaction log event groups...\n";
+
+$logs = queryfx_all(
+ $conn_w,
+ 'SELECT * FROM %T GROUP BY transactionKey ORDER BY id ASC',
+ 'repository_pushlog');
+foreach ($logs as $log) {
+ $id = $log['id'];
+ echo "Migrating log {$id}...\n";
+ if ($log['pushEventPHID']) {
+ continue;
+ }
+
+ $event_phid = id(new PhabricatorRepositoryPushEvent())->generatePHID();
+
+ queryfx(
+ $conn_w,
+ 'INSERT INTO %T (phid, repositoryPHID, epoch, pusherPHID, remoteAddress,
+ remoteProtocol, rejectCode, rejectDetails)
+ VALUES (%s, %s, %d, %s, %d, %s, %d, %s)',
+ 'repository_pushevent',
+ $event_phid,
+ $log['repositoryPHID'],
+ $log['epoch'],
+ $log['pusherPHID'],
+ $log['remoteAddress'],
+ $log['remoteProtocol'],
+ $log['rejectCode'],
+ $log['rejectDetails']);
+
+ queryfx(
+ $conn_w,
+ 'UPDATE %T SET pushEventPHID = %s WHERE transactionKey = %s',
+ 'repository_pushlog',
+ $event_phid,
+ $log['transactionKey']);
+}
+
+echo "Done.\n";
diff --git a/resources/sql/autopatches/20140325.push.4.prune.sql b/resources/sql/autopatches/20140325.push.4.prune.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20140325.push.4.prune.sql
@@ -0,0 +1,14 @@
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ DROP remoteAddress;
+
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ DROP remoteProtocol;
+
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ DROP transactionKey;
+
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ DROP rejectCode;
+
+ALTER TABLE {$NAMESPACE}_repository.repository_pushlog
+ DROP rejectDetails;
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1958,11 +1958,14 @@
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php',
'PhabricatorRepositoryPHIDTypeCommit' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php',
'PhabricatorRepositoryPHIDTypeMirror' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeMirror.php',
+ 'PhabricatorRepositoryPHIDTypePushEvent' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php',
'PhabricatorRepositoryPHIDTypePushLog' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypePushLog.php',
'PhabricatorRepositoryPHIDTypeRepository' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php',
'PhabricatorRepositoryParsedChange' => 'applications/repository/data/PhabricatorRepositoryParsedChange.php',
'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php',
'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php',
+ 'PhabricatorRepositoryPushEvent' => 'applications/repository/storage/PhabricatorRepositoryPushEvent.php',
+ 'PhabricatorRepositoryPushEventQuery' => 'applications/repository/query/PhabricatorRepositoryPushEventQuery.php',
'PhabricatorRepositoryPushLog' => 'applications/repository/storage/PhabricatorRepositoryPushLog.php',
'PhabricatorRepositoryPushLogQuery' => 'applications/repository/query/PhabricatorRepositoryPushLogQuery.php',
'PhabricatorRepositoryPushLogSearchEngine' => 'applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php',
@@ -4792,11 +4795,18 @@
'PhabricatorRepositoryPHIDTypeArcanistProject' => 'PhabricatorPHIDType',
'PhabricatorRepositoryPHIDTypeCommit' => 'PhabricatorPHIDType',
'PhabricatorRepositoryPHIDTypeMirror' => 'PhabricatorPHIDType',
+ 'PhabricatorRepositoryPHIDTypePushEvent' => 'PhabricatorPHIDType',
'PhabricatorRepositoryPHIDTypePushLog' => 'PhabricatorPHIDType',
'PhabricatorRepositoryPHIDTypeRepository' => 'PhabricatorPHIDType',
'PhabricatorRepositoryParsedChange' => 'Phobject',
'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine',
'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon',
+ 'PhabricatorRepositoryPushEvent' =>
+ array(
+ 0 => 'PhabricatorRepositoryDAO',
+ 1 => 'PhabricatorPolicyInterface',
+ ),
+ 'PhabricatorRepositoryPushEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorRepositoryPushLog' =>
array(
0 => 'PhabricatorRepositoryDAO',
diff --git a/src/applications/diffusion/controller/DiffusionPushLogListController.php b/src/applications/diffusion/controller/DiffusionPushLogListController.php
--- a/src/applications/diffusion/controller/DiffusionPushLogListController.php
+++ b/src/applications/diffusion/controller/DiffusionPushLogListController.php
@@ -52,7 +52,7 @@
// Reveal this if it's valid and the user can edit the repository.
$remote_addr = '-';
if (isset($editable_repos[$log->getRepositoryPHID()])) {
- $remote_long = $log->getRemoteAddress();
+ $remote_long = $log->getPushEvent()->getRemoteAddress();
if ($remote_long) {
$remote_addr = long2ip($remote_long);
}
@@ -60,6 +60,7 @@
$callsign = $log->getRepository()->getCallsign();
$rows[] = array(
+ $log->getPushEvent()->getID(),
phutil_tag(
'a',
array(
@@ -68,7 +69,7 @@
$callsign),
$this->getHandle($log->getPusherPHID())->renderLink(),
$remote_addr,
- $log->getRemoteProtocol(),
+ $log->getPushEvent()->getRemoteProtocol(),
$log->getRefType(),
$log->getRefName(),
phutil_tag(
@@ -86,7 +87,7 @@
// TODO: Make these human-readable.
$log->getChangeFlags(),
- $log->getRejectCode(),
+ $log->getPushEvent()->getRejectCode(),
phabricator_datetime($log->getEpoch(), $viewer),
);
}
@@ -94,6 +95,7 @@
$table = id(new AphrontTableView($rows))
->setHeaders(
array(
+ pht('Push'),
pht('Repository'),
pht('Pusher'),
pht('From'),
@@ -113,6 +115,7 @@
'',
'',
'',
+ '',
'wide',
'n',
'n',
diff --git a/src/applications/diffusion/engine/DiffusionCommitHookEngine.php b/src/applications/diffusion/engine/DiffusionCommitHookEngine.php
--- a/src/applications/diffusion/engine/DiffusionCommitHookEngine.php
+++ b/src/applications/diffusion/engine/DiffusionCommitHookEngine.php
@@ -30,6 +30,8 @@
private $gitCommits = array();
private $heraldViewerProjects;
+ private $rejectCode = PhabricatorRepositoryPushLog::REJECT_BROKEN;
+ private $rejectDetails;
/* -( Config )------------------------------------------------------------- */
@@ -62,14 +64,6 @@
return $remote_address;
}
- private function getTransactionKey() {
- if (!$this->transactionKey) {
- $entropy = Filesystem::readRandomBytes(64);
- $this->transactionKey = PhabricatorHash::digestForIndex($entropy);
- }
- return $this->transactionKey;
- }
-
public function setSubversionTransactionInfo($transaction, $repository) {
$this->subversionTransaction = $transaction;
$this->subversionRepository = $repository;
@@ -137,10 +131,7 @@
} catch (DiffusionCommitHookRejectException $ex) {
// If we're rejecting dangerous changes, flag everything that we've
// seen as rejected so it's clear that none of it was accepted.
- foreach ($all_updates as $update) {
- $update->setRejectCode(
- PhabricatorRepositoryPushLog::REJECT_DANGEROUS);
- }
+ $this->rejectCode = PhabricatorRepositoryPushLog::REJECT_DANGEROUS;
throw $ex;
}
@@ -156,9 +147,7 @@
// If we make it this far, we're accepting these changes. Mark all the
// logs as accepted.
- foreach ($all_updates as $update) {
- $update->setRejectCode(PhabricatorRepositoryPushLog::REJECT_ACCEPT);
- }
+ $this->rejectCode = PhabricatorRepositoryPushLog::REJECT_ACCEPT;
} catch (Exception $ex) {
// We'll throw this again in a minute, but we want to save all the logs
// first.
@@ -166,9 +155,18 @@
}
// Save all the logs no matter what the outcome was.
- foreach ($all_updates as $update) {
- $update->save();
- }
+ $event = $this->newPushEvent();
+
+ $event->setRejectCode($this->rejectCode);
+ $event->setRejectDetails($this->rejectDetails);
+
+ $event->openTransaction();
+ $event->save();
+ foreach ($all_updates as $update) {
+ $update->setPushEventPHID($event->getPHID());
+ $update->save();
+ }
+ $event->saveTransaction();
if ($caught) {
throw $caught;
@@ -296,10 +294,8 @@
}
if ($blocking_effect) {
- foreach ($all_updates as $update) {
- $update->setRejectCode(PhabricatorRepositoryPushLog::REJECT_HERALD);
- $update->setRejectDetails($blocking_effect->getRulePHID());
- }
+ $this->rejectCode = PhabricatorRepositoryPushLog::REJECT_HERALD;
+ $this->rejectDetails = $blocking_effect->getRulePHID();
$message = $blocking_effect->getTarget();
if (!strlen($message)) {
@@ -596,12 +592,8 @@
continue;
}
- // Mark everything as rejected by this hook.
- foreach ($updates as $update) {
- $update->setRejectCode(
- PhabricatorRepositoryPushLog::REJECT_EXTERNAL);
- $update->setRejectDetails(basename($hook));
- }
+ $this->rejectCode = PhabricatorRepositoryPushLog::REJECT_EXTERNAL;
+ $this->rejectDetails = basename($hook);
throw new DiffusionCommitHookRejectException(
pht(
@@ -983,24 +975,23 @@
private function newPushLog() {
- // NOTE: By default, we create these with REJECT_BROKEN as the reject
- // code. This indicates a broken hook, and covers the case where we
- // encounter some unexpected exception and consequently reject the changes.
-
// NOTE: We generate PHIDs up front so the Herald transcripts can pick them
// up.
$phid = id(new PhabricatorRepositoryPushLog())->generatePHID();
return PhabricatorRepositoryPushLog::initializeNewLog($this->getViewer())
->setPHID($phid)
- ->attachRepository($this->getRepository())
->setRepositoryPHID($this->getRepository()->getPHID())
- ->setEpoch(time())
+ ->setEpoch(time());
+ }
+
+ private function newPushEvent() {
+ $viewer = $this->getViewer();
+ return PhabricatorRepositoryPushEvent::initializeNewEvent($viewer)
+ ->setRepositoryPHID($this->getRepository()->getPHID())
->setRemoteAddress($this->getRemoteAddressForLog())
->setRemoteProtocol($this->getRemoteProtocol())
- ->setTransactionKey($this->getTransactionKey())
- ->setRejectCode(PhabricatorRepositoryPushLog::REJECT_BROKEN)
- ->setRejectDetails(null);
+ ->setEpoch(time());
}
public function loadChangesetsForCommit($identifier) {
diff --git a/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php
new file mode 100644
--- /dev/null
+++ b/src/applications/repository/phid/PhabricatorRepositoryPHIDTypePushEvent.php
@@ -0,0 +1,40 @@
+<?php
+
+final class PhabricatorRepositoryPHIDTypePushEvent
+ extends PhabricatorPHIDType {
+
+ const TYPECONST = 'PSHE';
+
+ public function getTypeConstant() {
+ return self::TYPECONST;
+ }
+
+ public function getTypeName() {
+ return pht('Push Event');
+ }
+
+ public function newObject() {
+ return new PhabricatorRepositoryPushEvent();
+ }
+
+ protected function buildQueryForObjects(
+ PhabricatorObjectQuery $query,
+ array $phids) {
+
+ return id(new PhabricatorRepositoryPushEventQuery())
+ ->withPHIDs($phids);
+ }
+
+ public function loadHandles(
+ PhabricatorHandleQuery $query,
+ array $handles,
+ array $objects) {
+
+ foreach ($handles as $phid => $handle) {
+ $event = $objects[$phid];
+
+ $handle->setName(pht('Push Event %d', $event->getID()));
+ }
+ }
+
+}
diff --git a/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php b/src/applications/repository/query/PhabricatorRepositoryPushEventQuery.php
copy from src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php
copy to src/applications/repository/query/PhabricatorRepositoryPushEventQuery.php
--- a/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php
+++ b/src/applications/repository/query/PhabricatorRepositoryPushEventQuery.php
@@ -1,14 +1,12 @@
<?php
-final class PhabricatorRepositoryPushLogQuery
+final class PhabricatorRepositoryPushEventQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $ids;
private $phids;
private $repositoryPHIDs;
private $pusherPHIDs;
- private $refTypes;
- private $newRefs;
public function withIDs(array $ids) {
$this->ids = $ids;
@@ -30,18 +28,8 @@
return $this;
}
- public function withRefTypes(array $ref_types) {
- $this->refTypes = $ref_types;
- return $this;
- }
-
- public function withNewRefs(array $new_refs) {
- $this->newRefs = $new_refs;
- return $this;
- }
-
protected function loadPage() {
- $table = new PhabricatorRepositoryPushLog();
+ $table = new PhabricatorRepositoryPushEvent();
$conn_r = $table->establishConnection('r');
$data = queryfx_all(
@@ -55,28 +43,24 @@
return $table->loadAllFromArray($data);
}
- public function willFilterPage(array $logs) {
- $repository_phids = mpull($logs, 'getRepositoryPHID');
- if ($repository_phids) {
- $repositories = id(new PhabricatorRepositoryQuery())
- ->setViewer($this->getViewer())
- ->withPHIDs($repository_phids)
- ->execute();
- $repositories = mpull($repositories, null, 'getPHID');
- } else {
- $repositories = array();
- }
+ public function willFilterPage(array $events) {
+ $repository_phids = mpull($events, 'getRepositoryPHID');
+ $repositories = id(new PhabricatorRepositoryQuery())
+ ->setViewer($this->getViewer())
+ ->withPHIDs($repository_phids)
+ ->execute();
+ $repositories = mpull($repositories, null, 'getPHID');
- foreach ($logs as $key => $log) {
- $phid = $log->getRepositoryPHID();
+ foreach ($events as $key => $event) {
+ $phid = $event->getRepositoryPHID();
if (empty($repositories[$phid])) {
- unset($logs[$key]);
+ unset($events[$key]);
continue;
}
- $log->attachRepository($repositories[$phid]);
+ $event->attachRepository($repositories[$phid]);
}
- return $logs;
+ return $events;
}
@@ -111,20 +95,6 @@
$this->pusherPHIDs);
}
- if ($this->refTypes) {
- $where[] = qsprintf(
- $conn_r,
- 'refType IN (%Ls)',
- $this->refTypes);
- }
-
- if ($this->newRefs) {
- $where[] = qsprintf(
- $conn_r,
- 'refNew IN (%Ls)',
- $this->newRefs);
- }
-
$where[] = $this->buildPagingClause($conn_r);
return $this->formatWhereClause($where);
diff --git a/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php b/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php
--- a/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php
+++ b/src/applications/repository/query/PhabricatorRepositoryPushLogQuery.php
@@ -56,24 +56,20 @@
}
public function willFilterPage(array $logs) {
- $repository_phids = mpull($logs, 'getRepositoryPHID');
- if ($repository_phids) {
- $repositories = id(new PhabricatorRepositoryQuery())
- ->setViewer($this->getViewer())
- ->withPHIDs($repository_phids)
- ->execute();
- $repositories = mpull($repositories, null, 'getPHID');
- } else {
- $repositories = array();
- }
+ $event_phids = mpull($logs, 'getPushEventPHID');
+ $events = id(new PhabricatorRepositoryPushEventQuery())
+ ->setViewer($this->getViewer())
+ ->withPHIDs($event_phids)
+ ->execute();
+ $events = mpull($events, null, 'getPHID');
foreach ($logs as $key => $log) {
- $phid = $log->getRepositoryPHID();
- if (empty($repositories[$phid])) {
+ $event = idx($events, $log->getPushEventPHID());
+ if (!$event) {
unset($logs[$key]);
continue;
}
- $log->attachRepository($repositories[$phid]);
+ $log->attachPushEvent($event);
}
return $logs;
diff --git a/src/applications/repository/storage/PhabricatorRepositoryPushEvent.php b/src/applications/repository/storage/PhabricatorRepositoryPushEvent.php
new file mode 100644
--- /dev/null
+++ b/src/applications/repository/storage/PhabricatorRepositoryPushEvent.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Groups a set of push logs corresponding to changes which were all pushed in
+ * the same transaction.
+ */
+final class PhabricatorRepositoryPushEvent
+ extends PhabricatorRepositoryDAO
+ implements PhabricatorPolicyInterface {
+
+ protected $repositoryPHID;
+ protected $epoch;
+ protected $pusherPHID;
+ protected $remoteAddress;
+ protected $remoteProtocol;
+ protected $rejectCode;
+ protected $rejectDetails;
+
+ private $repository = self::ATTACHABLE;
+
+ public static function initializeNewEvent(PhabricatorUser $viewer) {
+ return id(new PhabricatorRepositoryPushEvent())
+ ->setPusherPHID($viewer->getPHID());
+ }
+
+ public function getConfiguration() {
+ return array(
+ self::CONFIG_AUX_PHID => true,
+ self::CONFIG_TIMESTAMPS => false,
+ ) + parent::getConfiguration();
+ }
+
+ public function generatePHID() {
+ return PhabricatorPHID::generateNewPHID(
+ PhabricatorRepositoryPHIDTypePushEvent::TYPECONST);
+ }
+
+ public function attachRepository(PhabricatorRepository $repository) {
+ $this->repository = $repository;
+ return $this;
+ }
+
+ public function getRepository() {
+ return $this->assertAttached($this->repository);
+ }
+
+
+/* -( PhabricatorPolicyInterface )----------------------------------------- */
+
+
+ public function getCapabilities() {
+ return array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ );
+ }
+
+ public function getPolicy($capability) {
+ return $this->getRepository()->getPolicy($capability);
+ }
+
+ public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
+ return $this->getRepository()->hasAutomaticCapability($capability, $viewer);
+ }
+
+ public function describeAutomaticCapability($capability) {
+ return pht(
+ "A repository's push events are visible to users who can see the ".
+ "repository.");
+ }
+
+}
diff --git a/src/applications/repository/storage/PhabricatorRepositoryPushLog.php b/src/applications/repository/storage/PhabricatorRepositoryPushLog.php
--- a/src/applications/repository/storage/PhabricatorRepositoryPushLog.php
+++ b/src/applications/repository/storage/PhabricatorRepositoryPushLog.php
@@ -33,9 +33,7 @@
protected $repositoryPHID;
protected $epoch;
protected $pusherPHID;
- protected $remoteAddress;
- protected $remoteProtocol;
- protected $transactionKey;
+ protected $pushEventPHID;
protected $refType;
protected $refNameHash;
protected $refNameRaw;
@@ -44,11 +42,9 @@
protected $refNew;
protected $mergeBase;
protected $changeFlags;
- protected $rejectCode;
- protected $rejectDetails;
private $dangerousChangeDescription = self::ATTACHABLE;
- private $repository = self::ATTACHABLE;
+ private $pushEvent = self::ATTACHABLE;
public static function initializeNewLog(PhabricatorUser $viewer) {
return id(new PhabricatorRepositoryPushLog())
@@ -70,13 +66,17 @@
PhabricatorRepositoryPHIDTypePushLog::TYPECONST);
}
- public function attachRepository(PhabricatorRepository $repository) {
- $this->repository = $repository;
+ public function getRepository() {
+ return $this->getPushEvent()->getRepository();
+ }
+
+ public function attachPushEvent(PhabricatorRepositoryPushEvent $push_event) {
+ $this->pushEvent = $push_event;
return $this;
}
- public function getRepository() {
- return $this->assertAttached($this->repository);
+ public function getPushEvent() {
+ return $this->assertAttached($this->pushEvent);
}
public function getRefName() {
@@ -131,11 +131,11 @@
}
public function getPolicy($capability) {
- return $this->getRepository()->getPolicy($capability);
+ return $this->getPushEvent()->getPolicy($capability);
}
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
- return $this->getRepository()->hasAutomaticCapability($capability, $viewer);
+ return $this->getPushEvent()->hasAutomaticCapability($capability, $viewer);
}
public function describeAutomaticCapability($capability) {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Oct 21, 6:14 PM (3 w, 1 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6738426
Default Alt Text
D8615.id20440.diff (22 KB)
Attached To
Mode
D8615: Provide a real object ("PhabricatorRepositoryPushEvent") to represent an entire push transaction
Attached
Detach File
Event Timeline
Log In to Comment