mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-29 00:40:57 +01:00
Add a relation table for Revisions to local commit hashes
Summary: This allows us to performantly query for diffs related to a given local hash. Immediate applications are: - Commit detection in Mercurial and Git-Immutable workflows. - Some async unit test stuff @mgummelt was doing. Test Plan: Diffed locally under SVN/Git/hg, checked the table, got sensible output. mysql> select * from differential_revisionhash; +------------+------+------------------------------------------+ | revisionID | type | hash | +------------+------+------------------------------------------+ | 40 | gtcm | 8c6fb2f95598a50f7aac64a5f4cc6c12b5db42f5 | | 40 | gttr | 54710e361a465f4ff39565a93b2a221b6e7dd07c | | 41 | hgcm | c29cb69aec14 | | 41 | hgcm | e7309be4eabb | | 41 | hgcm | 4e885caeff60 | | 41 | hgcm | 213ee1cd30ea | | 41 | hgcm | b4050fb3490f | | 41 | hgcm | 72a76bd7ffa2 | | 41 | hgcm | 06c2687e63fb | | 41 | hgcm | 2b464bde6b48 | +------------+------+------------------------------------------+ 10 rows in set (0.00 sec) NOTE: Mercurial hashes are short-form but I'll shoot out a separate Arcanist diff to fix this. Reviewers: Makinde, fratrik, mgummelt, jungejason, nh, tuomaspelkonen, aran Reviewed By: Makinde CC: aran, Makinde Differential Revision: 961
This commit is contained in:
parent
d0b6602e29
commit
016b060aea
7 changed files with 132 additions and 3 deletions
7
resources/sql/patches/075.revisionhash.sql
Normal file
7
resources/sql/patches/075.revisionhash.sql
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
CREATE TABLE phabricator_differential.differential_revisionhash (
|
||||||
|
revisionID INT UNSIGNED NOT NULL,
|
||||||
|
type CHAR(4) BINARY NOT NULL,
|
||||||
|
hash VARCHAR(40) BINARY NOT NULL,
|
||||||
|
KEY (type, hash),
|
||||||
|
KEY (revisionID)
|
||||||
|
) ENGINE=InnoDB;
|
|
@ -215,6 +215,7 @@ phutil_register_library_map(array(
|
||||||
'DifferentialRevisionDetailView' => 'applications/differential/view/revisiondetail',
|
'DifferentialRevisionDetailView' => 'applications/differential/view/revisiondetail',
|
||||||
'DifferentialRevisionEditController' => 'applications/differential/controller/revisionedit',
|
'DifferentialRevisionEditController' => 'applications/differential/controller/revisionedit',
|
||||||
'DifferentialRevisionEditor' => 'applications/differential/editor/revision',
|
'DifferentialRevisionEditor' => 'applications/differential/editor/revision',
|
||||||
|
'DifferentialRevisionHash' => 'applications/differential/constants/revisionhash',
|
||||||
'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/revisionid',
|
'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/revisionid',
|
||||||
'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist',
|
'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist',
|
||||||
'DifferentialRevisionListData' => 'applications/differential/data/revisionlist',
|
'DifferentialRevisionListData' => 'applications/differential/data/revisionlist',
|
||||||
|
|
|
@ -16,9 +16,11 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// TODO: Unify with similar Repository constants
|
||||||
final class DifferentialRevisionControlSystem {
|
final class DifferentialRevisionControlSystem {
|
||||||
|
|
||||||
const SVN = 'svn';
|
const SVN = 'svn';
|
||||||
const GIT = 'git';
|
const GIT = 'git';
|
||||||
|
const MERCURIAL = 'hg';
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
final class DifferentialRevisionHash {
|
||||||
|
|
||||||
|
const TABLE_NAME = 'differential_revisionhash';
|
||||||
|
|
||||||
|
const HASH_GIT_COMMIT = 'gtcm';
|
||||||
|
const HASH_GIT_TREE = 'gttr';
|
||||||
|
const HASH_MERCURIAL_COMMIT = 'hgcm';
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('DifferentialRevisionHash.php');
|
|
@ -365,6 +365,7 @@ class DifferentialRevisionEditor {
|
||||||
$diff->save();
|
$diff->save();
|
||||||
|
|
||||||
$this->updateAffectedPathTable($revision, $diff, $changesets);
|
$this->updateAffectedPathTable($revision, $diff, $changesets);
|
||||||
|
$this->updateRevisionHashTable($revision, $diff);
|
||||||
|
|
||||||
// An updated diff should require review, as long as it's not committed
|
// An updated diff should require review, as long as it's not committed
|
||||||
// or accepted. The "accepted" status is "sticky" to encourage courtesy
|
// or accepted. The "accepted" status is "sticky" to encourage courtesy
|
||||||
|
@ -722,7 +723,7 @@ class DifferentialRevisionEditor {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updated the table which links Differential revisions to paths they affect,
|
* Update the table which links Differential revisions to paths they affect,
|
||||||
* so Diffusion can efficiently find pending revisions for a given file.
|
* so Diffusion can efficiently find pending revisions for a given file.
|
||||||
*/
|
*/
|
||||||
private function updateAffectedPathTable(
|
private function updateAffectedPathTable(
|
||||||
|
@ -810,5 +811,83 @@ class DifferentialRevisionEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the table connecting revisions to DVCS local hashes, so we can
|
||||||
|
* identify revisions by commit/tree hashes.
|
||||||
|
*/
|
||||||
|
private function updateRevisionHashTable(
|
||||||
|
DifferentialRevision $revision,
|
||||||
|
DifferentialDiff $diff) {
|
||||||
|
|
||||||
|
$vcs = $diff->getSourceControlSystem();
|
||||||
|
if ($vcs == DifferentialRevisionControlSystem::SVN) {
|
||||||
|
// Subversion has no local commit or tree hash information, so we don't
|
||||||
|
// have to do anything.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$property = id(new DifferentialDiffProperty())->loadOneWhere(
|
||||||
|
'diffID = %d AND name = %s',
|
||||||
|
$diff->getID(),
|
||||||
|
'local:commits');
|
||||||
|
if (!$property) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$hashes = array();
|
||||||
|
|
||||||
|
$data = $property->getData();
|
||||||
|
switch ($vcs) {
|
||||||
|
case DifferentialRevisionControlSystem::GIT:
|
||||||
|
foreach ($data as $commit) {
|
||||||
|
$hashes[] = array(
|
||||||
|
DifferentialRevisionHash::HASH_GIT_COMMIT,
|
||||||
|
$commit['commit'],
|
||||||
|
);
|
||||||
|
$hashes[] = array(
|
||||||
|
DifferentialRevisionHash::HASH_GIT_TREE,
|
||||||
|
$commit['tree'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DifferentialRevisionControlSystem::MERCURIAL:
|
||||||
|
foreach ($data as $commit) {
|
||||||
|
$hashes[] = array(
|
||||||
|
DifferentialRevisionHash::HASH_MERCURIAL_COMMIT,
|
||||||
|
$commit['rev'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn_w = $revision->establishConnection('w');
|
||||||
|
|
||||||
|
$sql = array();
|
||||||
|
foreach ($hashes as $info) {
|
||||||
|
list($type, $hash) = $info;
|
||||||
|
$sql[] = qsprintf(
|
||||||
|
$conn_w,
|
||||||
|
'(%d, %s, %s)',
|
||||||
|
$revision->getID(),
|
||||||
|
$type,
|
||||||
|
$hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
queryfx(
|
||||||
|
$conn_w,
|
||||||
|
'DELETE FROM %T WHERE revisionID = %d',
|
||||||
|
DifferentialRevisionHash::TABLE_NAME,
|
||||||
|
$revision->getID());
|
||||||
|
|
||||||
|
if ($sql) {
|
||||||
|
queryfx(
|
||||||
|
$conn_w,
|
||||||
|
'INSERT INTO %T (revisionID, type, hash) VALUES %Q',
|
||||||
|
DifferentialRevisionHash::TABLE_NAME,
|
||||||
|
implode(', ', $sql));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
|
|
||||||
phutil_require_module('phabricator', 'applications/differential/constants/action');
|
phutil_require_module('phabricator', 'applications/differential/constants/action');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/constants/revisioncontrolsystem');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/constants/revisionhash');
|
||||||
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
|
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/selector/base');
|
phutil_require_module('phabricator', 'applications/differential/field/selector/base');
|
||||||
phutil_require_module('phabricator', 'applications/differential/mail/ccwelcome');
|
phutil_require_module('phabricator', 'applications/differential/mail/ccwelcome');
|
||||||
|
@ -14,6 +16,7 @@ phutil_require_module('phabricator', 'applications/differential/mail/newdiff');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/affectedpath');
|
phutil_require_module('phabricator', 'applications/differential/storage/affectedpath');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/auxiliaryfield');
|
phutil_require_module('phabricator', 'applications/differential/storage/auxiliaryfield');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/comment');
|
phutil_require_module('phabricator', 'applications/differential/storage/comment');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/storage/diffproperty');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/revision');
|
phutil_require_module('phabricator', 'applications/differential/storage/revision');
|
||||||
phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base');
|
phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base');
|
||||||
phutil_require_module('phabricator', 'applications/feed/constants/story');
|
phutil_require_module('phabricator', 'applications/feed/constants/story');
|
||||||
|
|
Loading…
Reference in a new issue