1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00

Allow saving lint errors to database

Summary: This saves lint errors to the path change of current commit. It requires pushed revision. It doesn't save difference from previous commit mentioned in T2038#comment-4 - I don't plan doing it after all, everything would be much more complicated and the amount of data saved with this approach isn't that bad.

Test Plan: Applied patch, ran script, verified DB.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2038

Differential Revision: https://secure.phabricator.com/D3899
This commit is contained in:
vrana 2012-11-05 23:09:36 -08:00
parent d91305e518
commit 23a046b3cd
6 changed files with 143 additions and 0 deletions

View file

@ -0,0 +1,24 @@
CREATE TABLE {$NAMESPACE}_repository.repository_branch (
id int unsigned NOT NULL AUTO_INCREMENT,
repositoryID int unsigned NOT NULL,
name varchar(255) NOT NULL,
lintCommit varchar(40),
dateCreated int unsigned NOT NULL,
dateModified int unsigned NOT NULL,
UNIQUE (repositoryID, name),
PRIMARY KEY (id)
);
CREATE TABLE {$NAMESPACE}_repository.repository_lintmessage (
id int unsigned NOT NULL AUTO_INCREMENT,
branchID int unsigned NOT NULL,
path varchar(512) NOT NULL,
line int unsigned NOT NULL,
code varchar(32) NOT NULL,
severity varchar(16) NOT NULL,
name varchar(255) NOT NULL,
description text NOT NULL,
INDEX (branchID, path(64)),
INDEX (branchID, code, path(64)),
PRIMARY KEY (id)
);

103
scripts/repository/save_lint.php Executable file
View file

@ -0,0 +1,103 @@
#!/usr/bin/env php
<?php
require_once dirname(__FILE__).'/../__init_script__.php';
if (function_exists('posix_isatty') && posix_isatty(STDIN)) {
$command = 'xargs -0 arc lint --output json | '.__FILE__;
echo "Usage: git ls-files -z | {$command}\n";
echo "Usage: git diff --name-only -z | {$command}\n"; // TODO: Handle deletes.
echo "Purpose: Save all lint errors to database.\n";
exit(1);
}
$working_copy = ArcanistWorkingCopyIdentity::newFromPath('.');
$api = ArcanistRepositoryAPI::newAPIFromWorkingCopyIdentity($working_copy);
$svn_root = id(new PhutilURI($api->getSourceControlPath()))->getPath();
$project_id = $working_copy->getProjectID();
$project = id(new PhabricatorRepositoryArcanistProject())
->loadOneWhere('name = %s', $project_id);
if (!$project || !$project->getRepositoryID()) {
throw new Exception("Couldn't find repository for {$project_id}.");
}
$branch_name = $api->getBranchName();
$branch = id(new PhabricatorRepositoryBranch())->loadOneWhere(
'repositoryID = %d AND name = %s',
$project->getRepositoryID(),
$branch_name);
if (!$branch) {
$branch = id(new PhabricatorRepositoryBranch())
->setRepositoryID($project->getRepositoryID())
->setName($branch_name);
}
$branch->setLintCommit($api->getWorkingCopyRevision());
$branch->save();
$conn = $branch->establishConnection('w');
$inserts = array();
while ($json = fgets(STDIN)) {
$paths = json_decode(rtrim($json, "\n"), true);
if (!is_array($paths)) {
throw new Exception("Invalid JSON: {$json}");
}
if (!$paths) {
continue;
}
$conn->openTransaction();
foreach (array_chunk(array_keys($paths), 1024) as $some_paths) {
$full_paths = array();
foreach ($some_paths as $path) {
$full_paths[] = $svn_root.'/'.$path;
}
queryfx(
$conn,
'DELETE FROM %T WHERE branchID = %d AND path IN (%Ls)',
PhabricatorRepository::TABLE_LINTMESSAGE,
$branch->getID(),
$full_paths);
}
foreach ($paths as $path => $messages) {
// TODO: Handle multiple $json for a single path. Don't save duplicates.
foreach ($messages as $message) {
$inserts[] = qsprintf(
$conn,
'(%d, %s, %d, %s, %s, %s, %s)',
$branch->getID(),
$svn_root.'/'.$path,
idx($message, 'line', 0),
idx($message, 'code', ''),
idx($message, 'severity', ''),
idx($message, 'name', ''),
idx($message, 'description', ''));
if (count($inserts) >= 256) {
save_lint_messages($conn, $inserts);
$inserts = array();
}
}
}
$conn->saveTransaction();
}
save_lint_messages($conn, $inserts);
function save_lint_messages($conn, array $inserts) {
if ($inserts) {
queryfx(
$conn,
'INSERT INTO %T
(branchID, path, line, code, severity, name, description)
VALUES %Q',
PhabricatorRepository::TABLE_LINTMESSAGE,
implode(', ', $inserts));
}
}

View file

@ -992,6 +992,7 @@ phutil_register_library_map(array(
'PhabricatorRepositoryArcanistProjectDeleteController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectDeleteController.php', 'PhabricatorRepositoryArcanistProjectDeleteController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectDeleteController.php',
'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectEditController.php', 'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectEditController.php',
'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php', 'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php',
'PhabricatorRepositoryBranch' => 'applications/repository/storage/PhabricatorRepositoryBranch.php',
'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php', 'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php',
'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php', 'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php',
'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php', 'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php',
@ -2175,6 +2176,7 @@ phutil_register_library_map(array(
'PhabricatorRepositoryArcanistProjectDeleteController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryArcanistProjectDeleteController' => 'PhabricatorRepositoryController',
'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController',
'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO',
'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO',
'PhabricatorRepositoryCommit' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryCommit' => 'PhabricatorRepositoryDAO',
'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',

View file

@ -10,6 +10,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO {
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'; const TABLE_BADCOMMIT = 'repository_badcommit';
const TABLE_LINTMESSAGE = 'repository_lintmessage';
protected $phid; protected $phid;
protected $name; protected $name;

View file

@ -0,0 +1,9 @@
<?php
final class PhabricatorRepositoryBranch extends PhabricatorRepositoryDAO {
protected $repositoryID;
protected $name;
protected $lintCommit;
}

View file

@ -1024,6 +1024,10 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList {
'type' => 'sql', 'type' => 'sql',
'name' => $this->getPatchPath('dropfileproxyimage.sql'), 'name' => $this->getPatchPath('dropfileproxyimage.sql'),
), ),
'repository-lint.sql' => array(
'type' => 'sql',
'name' => $this->getPatchPath('repository-lint.sql'),
),
); );
} }