mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-28 16:30:59 +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',
|
||||
'DifferentialRevisionEditController' => 'applications/differential/controller/revisionedit',
|
||||
'DifferentialRevisionEditor' => 'applications/differential/editor/revision',
|
||||
'DifferentialRevisionHash' => 'applications/differential/constants/revisionhash',
|
||||
'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/revisionid',
|
||||
'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist',
|
||||
'DifferentialRevisionListData' => 'applications/differential/data/revisionlist',
|
||||
|
|
|
@ -16,9 +16,11 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// TODO: Unify with similar Repository constants
|
||||
final class DifferentialRevisionControlSystem {
|
||||
|
||||
const SVN = 'svn';
|
||||
const GIT = 'git';
|
||||
const SVN = 'svn';
|
||||
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();
|
||||
|
||||
$this->updateAffectedPathTable($revision, $diff, $changesets);
|
||||
$this->updateRevisionHashTable($revision, $diff);
|
||||
|
||||
// An updated diff should require review, as long as it's not committed
|
||||
// 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.
|
||||
*/
|
||||
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/revisioncontrolsystem');
|
||||
phutil_require_module('phabricator', 'applications/differential/constants/revisionhash');
|
||||
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
|
||||
phutil_require_module('phabricator', 'applications/differential/field/selector/base');
|
||||
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/auxiliaryfield');
|
||||
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/diffusion/query/pathid/base');
|
||||
phutil_require_module('phabricator', 'applications/feed/constants/story');
|
||||
|
|
Loading…
Reference in a new issue