2011-01-24 20:01:53 +01:00
|
|
|
<?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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
class DifferentialRevision extends DifferentialDAO {
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
protected $title;
|
2011-01-24 20:01:53 +01:00
|
|
|
protected $status;
|
|
|
|
|
|
|
|
protected $summary;
|
|
|
|
protected $testPlan;
|
2011-01-25 22:26:09 +01:00
|
|
|
protected $revertPlan;
|
|
|
|
protected $blameRevision;
|
2011-01-24 20:01:53 +01:00
|
|
|
|
|
|
|
protected $phid;
|
2011-01-30 19:37:36 +01:00
|
|
|
protected $authorPHID;
|
2011-01-24 20:01:53 +01:00
|
|
|
|
|
|
|
protected $dateCommitted;
|
|
|
|
|
|
|
|
protected $lineCount;
|
2011-01-27 03:46:34 +01:00
|
|
|
|
|
|
|
private $related;
|
|
|
|
private $forbidden;
|
|
|
|
|
|
|
|
const RELATIONSHIP_TABLE = 'differential_relationship';
|
|
|
|
|
|
|
|
const RELATION_REVIEWER = 'revw';
|
|
|
|
const RELATION_SUBSCRIBED = 'subd';
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
public function getConfiguration() {
|
|
|
|
return array(
|
|
|
|
self::CONFIG_AUX_PHID => true,
|
|
|
|
) + parent::getConfiguration();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function generatePHID() {
|
|
|
|
return PhabricatorPHID::generateNewPHID('DREV');
|
|
|
|
}
|
2011-01-27 03:46:34 +01:00
|
|
|
|
2011-01-27 23:55:52 +01:00
|
|
|
public function loadDiffs() {
|
|
|
|
if (!$this->getID()) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
return id(new DifferentialDiff())->loadAllWhere(
|
|
|
|
'revisionID = %d',
|
|
|
|
$this->getID());
|
|
|
|
}
|
|
|
|
|
2011-01-30 19:37:36 +01:00
|
|
|
public function loadComments() {
|
|
|
|
if (!$this->getID()) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
return id(new DifferentialComment())->loadAllWhere(
|
|
|
|
'revisionID = %d',
|
|
|
|
$this->getID());
|
|
|
|
}
|
|
|
|
|
2011-01-30 22:20:56 +01:00
|
|
|
public function loadActiveDiff() {
|
|
|
|
return id(new DifferentialDiff())->loadOneWhere(
|
|
|
|
'revisionID = %d ORDER BY id DESC LIMIT 1',
|
|
|
|
$this->getID());
|
|
|
|
}
|
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
public function loadRelationships() {
|
2011-01-27 03:46:34 +01:00
|
|
|
if (!$this->getID()) {
|
|
|
|
$this->relationships = array();
|
|
|
|
$this->related = array();
|
|
|
|
$this->forbidden = array();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$data = queryfx_all(
|
|
|
|
$this->establishConnection('r'),
|
|
|
|
'SELECT * FROM %T WHERE revisionID = %d ORDER BY sequence',
|
|
|
|
self::RELATIONSHIP_TABLE,
|
|
|
|
$this->getID());
|
|
|
|
|
|
|
|
$related = array();
|
|
|
|
$forbidden = array();
|
|
|
|
|
|
|
|
foreach ($data as $row) {
|
|
|
|
if ($row['forbidden']) {
|
|
|
|
$forbidden[] = $row;
|
|
|
|
} else {
|
|
|
|
$related[] = $row;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->related = igroup($related, 'relation');
|
|
|
|
$this->forbidden = igroup($related, 'relation');
|
|
|
|
$this->relationships = igroup($data, 'relation');
|
|
|
|
|
|
|
|
return $this;
|
2011-01-26 02:17:19 +01:00
|
|
|
}
|
2011-01-27 03:46:34 +01:00
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
public function getReviewers() {
|
2011-01-27 03:46:34 +01:00
|
|
|
return $this->getRelatedPHIDs(self::RELATION_REVIEWER);
|
2011-01-26 02:17:19 +01:00
|
|
|
}
|
2011-01-27 03:46:34 +01:00
|
|
|
|
2011-01-26 02:17:19 +01:00
|
|
|
public function getCCPHIDs() {
|
2011-01-27 03:46:34 +01:00
|
|
|
return $this->getRelatedPHIDs(self::RELATION_SUBSCRIBED);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getRelatedPHIDs($relation) {
|
|
|
|
if ($this->related === null) {
|
|
|
|
throw new Exception("Must load relationships!");
|
|
|
|
}
|
|
|
|
|
|
|
|
$related = idx($this->related, $relation, array());
|
|
|
|
|
|
|
|
return ipull($related, 'objectPHID');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getRawRelations($relation) {
|
|
|
|
return idx($this->relationships, $relation, array());
|
|
|
|
}
|
|
|
|
|
|
|
|
public function writeRelatedPHIDs(
|
|
|
|
$relation,
|
|
|
|
$phids,
|
|
|
|
$reason_phid,
|
|
|
|
$forbidden) {
|
|
|
|
|
|
|
|
$conn_w = $this->establishConnection('w');
|
|
|
|
|
|
|
|
$sql = array();
|
|
|
|
$phids = array_values($phids);
|
|
|
|
foreach ($phids as $key => $phid) {
|
|
|
|
$sql[] = qsprintf(
|
|
|
|
$conn_w,
|
|
|
|
'(%d, %s, %d, %s, %d)',
|
|
|
|
$this->getRevisionID(),
|
|
|
|
$phid,
|
|
|
|
$key,
|
|
|
|
$reason_phid,
|
|
|
|
$forbidden);
|
|
|
|
}
|
|
|
|
|
|
|
|
$conn_w->openTransaction();
|
|
|
|
queryfx(
|
|
|
|
$conn_w,
|
|
|
|
'DELETE FROM %T WHERE revisionID = %d AND relation = %s
|
|
|
|
AND forbidden = %d
|
|
|
|
AND relatedPHID NOT IN (%Ls)',
|
|
|
|
self::RELATIONSHIP_TABLE,
|
|
|
|
$this->getID(),
|
|
|
|
$relation,
|
|
|
|
$forbidden,
|
|
|
|
$phids);
|
|
|
|
queryfx(
|
|
|
|
$conn_w,
|
|
|
|
'INSERT INTO %T
|
|
|
|
(revisionID, relatedPHID, sequence, reason_phid, forbidden)
|
|
|
|
VALUES %Q
|
|
|
|
ON DUPLICATE KEY UPDATE sequence = VALUES(sequence)',
|
|
|
|
self::RELATIONSHIP_TABLE,
|
|
|
|
implode(', ', $sql));
|
|
|
|
$conn_w->saveTransaction();
|
2011-01-26 02:17:19 +01:00
|
|
|
}
|
2011-01-24 20:01:53 +01:00
|
|
|
|
|
|
|
}
|