mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 08:42:41 +01:00
Allow commits to be marked as 'bad' so they won't be parsed. Useful if you work
at a company where someone deleted the entire repository *cough cough*.
This commit is contained in:
parent
1a11297dd6
commit
fa8f168bd0
8 changed files with 110 additions and 10 deletions
44
resources/sql/patches/011.badcommit.sql
Normal file
44
resources/sql/patches/011.badcommit.sql
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
CREATE DATABASE phabricator_herald;
|
||||||
|
|
||||||
|
CREATE TABLE phabricator_herald.herald_action (
|
||||||
|
id int unsigned not null auto_increment primary key,
|
||||||
|
ruleID int unsigned not null,
|
||||||
|
action varchar(255) not null,
|
||||||
|
target text not null
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE phabricator_herald.herald_rule (
|
||||||
|
id int unsigned not null auto_increment primary key,
|
||||||
|
name varchar(255) not null,
|
||||||
|
authorPHID varchar(64) binary not null,
|
||||||
|
contentType varchar(255) not null,
|
||||||
|
mustMatchAll bool not null,
|
||||||
|
configVersion int unsigned not null default '1',
|
||||||
|
dateCreated int unsigned not null,
|
||||||
|
dateModified int unsigned not null,
|
||||||
|
unique key (authorPHID, name)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE phabricator_herald.herald_condition (
|
||||||
|
id int unsigned not null auto_increment primary key,
|
||||||
|
ruleID int unsigned not null,
|
||||||
|
fieldName varchar(255) not null,
|
||||||
|
fieldCondition varchar(255) not null,
|
||||||
|
value text not null
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE phabricator_herald.herald_transcript (
|
||||||
|
id int unsigned not null auto_increment primary key,
|
||||||
|
phid varchar(64) binary not null,
|
||||||
|
time int unsigned not null,
|
||||||
|
host varchar(255) not null,
|
||||||
|
psth varchar(255) not null,
|
||||||
|
duration float not null,
|
||||||
|
objectPHID varchar(64) binary not null,
|
||||||
|
dryRun bool not null,
|
||||||
|
objectTranscript longblob not null,
|
||||||
|
ruleTranscripts longblob not null,
|
||||||
|
conditionTranscripts longblob not null,
|
||||||
|
applyTranscripts longblob not null,
|
||||||
|
unique key (phid)
|
||||||
|
);
|
|
@ -30,6 +30,12 @@ class DiffusionCommitController extends DiffusionController {
|
||||||
|
|
||||||
$repository = $drequest->getRepository();
|
$repository = $drequest->getRepository();
|
||||||
$commit = $drequest->loadCommit();
|
$commit = $drequest->loadCommit();
|
||||||
|
|
||||||
|
if (!$commit) {
|
||||||
|
// TODO: Make more user-friendly.
|
||||||
|
throw new Exception('This commit has not parsed yet.');
|
||||||
|
}
|
||||||
|
|
||||||
$commit_data = $drequest->loadCommitData();
|
$commit_data = $drequest->loadCommitData();
|
||||||
|
|
||||||
require_celerity_resource('diffusion-commit-view-css');
|
require_celerity_resource('diffusion-commit-view-css');
|
||||||
|
@ -70,19 +76,38 @@ class DiffusionCommitController extends DiffusionController {
|
||||||
|
|
||||||
$count = number_format(count($changes));
|
$count = number_format(count($changes));
|
||||||
|
|
||||||
$change_panel = new AphrontPanelView();
|
$bad_commit = null;
|
||||||
$change_panel->setHeader("Changes ({$count})");
|
if ($count == 0) {
|
||||||
$change_panel->appendChild($change_table);
|
$bad_commit = queryfx_one(
|
||||||
|
id(new PhabricatorRepository())->establishConnection('r'),
|
||||||
|
'SELECT * FROM %T WHERE fullCommitName = %s',
|
||||||
|
PhabricatorRepository::TABLE_BADCOMMIT,
|
||||||
|
'r'.$repository->getCallsign().$commit->getCommitIdentifier());
|
||||||
|
}
|
||||||
|
|
||||||
$content[] = $change_panel;
|
if ($bad_commit) {
|
||||||
|
$error_panel = new AphrontErrorView();
|
||||||
|
$error_panel->setWidth(AphrontErrorView::WIDTH_WIDE);
|
||||||
|
$error_panel->setTitle('Bad Commit');
|
||||||
|
$error_panel->appendChild(
|
||||||
|
phutil_escape_html($bad_commit['description']));
|
||||||
|
|
||||||
|
$content[] = $error_panel;
|
||||||
|
} else {
|
||||||
|
$change_panel = new AphrontPanelView();
|
||||||
|
$change_panel->setHeader("Changes ({$count})");
|
||||||
|
$change_panel->appendChild($change_table);
|
||||||
|
|
||||||
$change_list =
|
$content[] = $change_panel;
|
||||||
'<div style="margin: 2em; color: #666; padding: 1em; background: #eee;">'.
|
|
||||||
'(list of changes goes here)'.
|
|
||||||
'</div>';
|
|
||||||
|
|
||||||
$content[] = $change_list;
|
$change_list =
|
||||||
|
'<div style="margin: 2em; color: #666; padding: 1em;
|
||||||
|
background: #eee;">'.
|
||||||
|
'(list of changes goes here)'.
|
||||||
|
'</div>';
|
||||||
|
|
||||||
|
$content[] = $change_list;
|
||||||
|
}
|
||||||
|
|
||||||
return $this->buildStandardPageResponse(
|
return $this->buildStandardPageResponse(
|
||||||
$content,
|
$content,
|
||||||
|
|
|
@ -9,10 +9,14 @@
|
||||||
phutil_require_module('phabricator', 'applications/diffusion/controller/base');
|
phutil_require_module('phabricator', 'applications/diffusion/controller/base');
|
||||||
phutil_require_module('phabricator', 'applications/diffusion/query/pathchange/base');
|
phutil_require_module('phabricator', 'applications/diffusion/query/pathchange/base');
|
||||||
phutil_require_module('phabricator', 'applications/diffusion/view/commitchangetable');
|
phutil_require_module('phabricator', 'applications/diffusion/view/commitchangetable');
|
||||||
|
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
||||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||||
|
phutil_require_module('phabricator', 'storage/queryfx');
|
||||||
|
phutil_require_module('phabricator', 'view/form/error');
|
||||||
phutil_require_module('phabricator', 'view/layout/panel');
|
phutil_require_module('phabricator', 'view/layout/panel');
|
||||||
|
|
||||||
phutil_require_module('phutil', 'markup');
|
phutil_require_module('phutil', 'markup');
|
||||||
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
phutil_require_source('DiffusionCommitController.php');
|
phutil_require_source('DiffusionCommitController.php');
|
||||||
|
|
|
@ -22,6 +22,7 @@ class PhabricatorRepository extends PhabricatorRepositoryDAO {
|
||||||
const TABLE_PATHCHANGE = 'repository_pathchange';
|
const TABLE_PATHCHANGE = 'repository_pathchange';
|
||||||
const TABLE_FILESYSTEM = 'repository_filesystem';
|
const TABLE_FILESYSTEM = 'repository_filesystem';
|
||||||
const TABLE_SUMMARY = 'repository_summary';
|
const TABLE_SUMMARY = 'repository_summary';
|
||||||
|
const TABLE_BADCOMMIT = 'repository_badcommit';
|
||||||
|
|
||||||
protected $phid;
|
protected $phid;
|
||||||
protected $name;
|
protected $name;
|
||||||
|
|
|
@ -84,4 +84,16 @@ abstract class PhabricatorRepositoryCommitParserWorker
|
||||||
return new SimpleXMLElement($xml);
|
return new SimpleXMLElement($xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function isBadCommit($full_commit_name) {
|
||||||
|
$repository = new PhabricatorRepository();
|
||||||
|
|
||||||
|
$bad_commit = queryfx_one(
|
||||||
|
$repository->establishConnection('w'),
|
||||||
|
'SELECT * FROM %T WHERE fullCommitName = %s',
|
||||||
|
PhabricatorRepository::TABLE_BADCOMMIT,
|
||||||
|
$full_commit_name);
|
||||||
|
|
||||||
|
return (bool)$bad_commit;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
phutil_require_module('phabricator', 'applications/repository/storage/commit');
|
phutil_require_module('phabricator', 'applications/repository/storage/commit');
|
||||||
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
phutil_require_module('phabricator', 'applications/repository/storage/repository');
|
||||||
phutil_require_module('phabricator', 'infrastructure/daemon/workers/worker');
|
phutil_require_module('phabricator', 'infrastructure/daemon/workers/worker');
|
||||||
|
phutil_require_module('phabricator', 'storage/queryfx');
|
||||||
|
|
||||||
phutil_require_module('phutil', 'future/exec');
|
phutil_require_module('phutil', 'future/exec');
|
||||||
phutil_require_module('phutil', 'parser/uri');
|
phutil_require_module('phutil', 'parser/uri');
|
||||||
|
|
|
@ -23,6 +23,13 @@ class PhabricatorRepositoryGitCommitChangeParserWorker
|
||||||
PhabricatorRepository $repository,
|
PhabricatorRepository $repository,
|
||||||
PhabricatorRepositoryCommit $commit) {
|
PhabricatorRepositoryCommit $commit) {
|
||||||
|
|
||||||
|
$full_name = 'r'.$repository->getCallsign().$commit->getCommitIdentifier();
|
||||||
|
echo "Parsing {$full_name}...\n";
|
||||||
|
if ($this->isBadCommit($full_name)) {
|
||||||
|
echo "This commit is marked bad!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$local_path = $repository->getDetail('local-path');
|
$local_path = $repository->getDetail('local-path');
|
||||||
|
|
||||||
list($raw) = execx(
|
list($raw) = execx(
|
||||||
|
|
|
@ -44,7 +44,13 @@ class PhabricatorRepositorySvnCommitChangeParserWorker
|
||||||
$svn_commit = $commit->getCommitIdentifier();
|
$svn_commit = $commit->getCommitIdentifier();
|
||||||
|
|
||||||
$callsign = $repository->getCallsign();
|
$callsign = $repository->getCallsign();
|
||||||
echo "Parsing r{$callsign}{$svn_commit}...\n";
|
$full_name = 'r'.$callsign.$svn_commit;
|
||||||
|
echo "Parsing {$full_name}...\n";
|
||||||
|
|
||||||
|
if ($this->isBadCommit($full_name)) {
|
||||||
|
echo "This commit is marked bad!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Pull the top-level path changes out of "svn log". This is pretty
|
// Pull the top-level path changes out of "svn log". This is pretty
|
||||||
// straightforward; just parse the XML log.
|
// straightforward; just parse the XML log.
|
||||||
|
|
Loading…
Reference in a new issue