Add a basic push log for recording repository push events
Summary:
Ref T4195. This log serves two purposes:
- It's a log, so you can see what happened. Particularly, in Git/Hg, there is no other way to tell:
- Who //pushed// a change (vs committed / authored)?
- When was a change pushed?
- What was the old value of some tag/branch before someone destroyed it?
- We can hand these objects off to Herald to implement pre-commit rules.
This is a very basic implementation, but gets some data written and has a basic UI for it.
Test Plan: {F87339}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T4195
Differential Revision: https://secure.phabricator.com/D7705
This commit is contained in:
@@ -46,6 +46,9 @@ final class PhabricatorApplicationDiffusion extends PhabricatorApplication {
|
||||
'new/' => 'DiffusionRepositoryNewController',
|
||||
'(?P<edit>create)/' => 'DiffusionRepositoryCreateController',
|
||||
'(?P<edit>import)/' => 'DiffusionRepositoryCreateController',
|
||||
'pushlog/(?:query/(?P<queryKey>[^/]+)/)?'
|
||||
=> 'DiffusionPushLogListController',
|
||||
|
||||
'(?P<callsign>[A-Z]+)/' => array(
|
||||
'' => 'DiffusionRepositoryController',
|
||||
|
||||
@@ -58,7 +61,6 @@ final class PhabricatorApplicationDiffusion extends PhabricatorApplication {
|
||||
'tags/(?P<dblob>.*)' => 'DiffusionTagListController',
|
||||
'branches/(?P<dblob>.*)' => 'DiffusionBranchTableController',
|
||||
'lint/(?P<dblob>.*)' => 'DiffusionLintController',
|
||||
|
||||
'commit/(?P<commit>[a-z0-9]+)/branches/'
|
||||
=> 'DiffusionCommitBranchesController',
|
||||
'commit/(?P<commit>[a-z0-9]+)/tags/'
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
final class DiffusionPushLogListController extends DiffusionController
|
||||
implements PhabricatorApplicationSearchResultsControllerInterface {
|
||||
|
||||
private $queryKey;
|
||||
|
||||
public function shouldAllowPublic() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function willProcessRequest(array $data) {
|
||||
$this->queryKey = idx($data, 'queryKey');
|
||||
}
|
||||
|
||||
public function processRequest() {
|
||||
$request = $this->getRequest();
|
||||
$controller = id(new PhabricatorApplicationSearchController($request))
|
||||
->setQueryKey($this->queryKey)
|
||||
->setSearchEngine(new PhabricatorRepositoryPushLogSearchEngine())
|
||||
->setNavigation($this->buildSideNavView());
|
||||
|
||||
return $this->delegateToController($controller);
|
||||
}
|
||||
|
||||
public function renderResultsList(
|
||||
array $logs,
|
||||
PhabricatorSavedQuery $query) {
|
||||
$viewer = $this->getRequest()->getUser();
|
||||
|
||||
$this->loadHandles(mpull($logs, 'getPusherPHID'));
|
||||
|
||||
$rows = array();
|
||||
foreach ($logs as $log) {
|
||||
$callsign = $log->getRepository()->getCallsign();
|
||||
$rows[] = array(
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $this->getApplicationURI($callsign.'/'),
|
||||
),
|
||||
$callsign),
|
||||
$this->getHandle($log->getPusherPHID())->renderLink(),
|
||||
$log->getRefType(),
|
||||
$log->getRefName(),
|
||||
$log->getRefOldShort(),
|
||||
$log->getRefNewShort(),
|
||||
phabricator_datetime($log->getEpoch(), $viewer),
|
||||
);
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setHeaders(
|
||||
array(
|
||||
pht('Repository'),
|
||||
pht('Pusher'),
|
||||
pht('Type'),
|
||||
pht('Name'),
|
||||
pht('Old'),
|
||||
pht('New'),
|
||||
pht('Date'),
|
||||
))
|
||||
->setColumnClasses(
|
||||
array(
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'wide',
|
||||
'n',
|
||||
'n',
|
||||
'date',
|
||||
));
|
||||
|
||||
$box = id(new PHUIBoxView())
|
||||
->addMargin(PHUI::MARGIN_LARGE)
|
||||
->appendChild($table);
|
||||
|
||||
return $box;
|
||||
}
|
||||
|
||||
public function buildSideNavView($for_app = false) {
|
||||
$viewer = $this->getRequest()->getUser();
|
||||
|
||||
$nav = new AphrontSideNavFilterView();
|
||||
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
|
||||
|
||||
id(new PhabricatorRepositoryPushLogSearchEngine())
|
||||
->setViewer($viewer)
|
||||
->addNavigationItems($nav->getMenu());
|
||||
|
||||
$nav->selectFilter(null);
|
||||
|
||||
return $nav;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @task git Git Hooks
|
||||
* @task hg Mercurial Hooks
|
||||
* @task svn Subversion Hooks
|
||||
*/
|
||||
final class DiffusionCommitHookEngine extends Phobject {
|
||||
|
||||
private $viewer;
|
||||
@@ -77,6 +82,48 @@ final class DiffusionCommitHookEngine extends Phobject {
|
||||
|
||||
// TODO: Now, do content checks.
|
||||
|
||||
// TODO: Generalize this; just getting some data in the database for now.
|
||||
$transaction_key = PhabricatorHash::digestForIndex(
|
||||
Filesystem::readRandomBytes(64));
|
||||
|
||||
$logs = array();
|
||||
foreach ($updates as $update) {
|
||||
$log = PhabricatorRepositoryPushLog::initializeNewLog($this->getViewer())
|
||||
->setRepositoryPHID($this->getRepository()->getPHID())
|
||||
->setEpoch(time())
|
||||
->setRemoteAddress(null) // TODO: Populate this where possible.
|
||||
->setRemoteProtocol(null) // TODO: Populate this where possible.
|
||||
->setTransactionKey($transaction_key)
|
||||
->setRefType($update['type'])
|
||||
->setRefNameHash(PhabricatorHash::digestForIndex($update['ref']))
|
||||
->setRefNameRaw($update['ref'])
|
||||
->setRefNameEncoding(phutil_is_utf8($update['ref']) ? 'utf8' : null)
|
||||
->setRefOld($update['old'])
|
||||
->setRefNew($update['new'])
|
||||
->setMergeBase(idx($update, 'merge-base'))
|
||||
->setRejectCode(PhabricatorRepositoryPushLog::REJECT_ACCEPT)
|
||||
->setRejectDetails(null);
|
||||
|
||||
$flags = 0;
|
||||
if ($update['operation'] == 'create') {
|
||||
$flags = $flags | PhabricatorRepositoryPushLog::CHANGEFLAG_ADD;
|
||||
} else if ($update['operation'] == 'delete') {
|
||||
$flags = $flags | PhabricatorRepositoryPushLog::CHANGEFLAG_DELETE;
|
||||
} else {
|
||||
// TODO: This isn't correct; these might be APPEND or REWRITE, and
|
||||
// if they're REWRITE they might be DANGEROUS. Fix this when this
|
||||
// gets generalized.
|
||||
$flags = $flags | PhabricatorRepositoryPushLog::CHANGEFLAG_APPEND;
|
||||
}
|
||||
|
||||
$log->setChangeFlags($flags);
|
||||
$logs[] = $log;
|
||||
}
|
||||
|
||||
foreach ($logs as $log) {
|
||||
$log->save();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user