Summary: - Store project members in edges. - Migrate existing members to edge storage. - Delete PhabricatorProjectAffiliation. - I left the actual underlying data around just in case something goes wrong; we can delete it evenutally. Test Plan: - Ran migration. - Created a new project. - Joined and left a project. - Added and removed project members. - Manually called PhabricatorOwnersOwner::loadAffiliatedUserPHIDs() to verify its behavior. Reviewers: vrana, btrahan Reviewed By: vrana CC: aran Maniphest Tasks: T603 Differential Revision: https://secure.phabricator.com/D3186
107 lines
3.8 KiB
PHP
107 lines
3.8 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Copyright 2012 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 PhabricatorEdgeConfig extends PhabricatorEdgeConstants {
|
|
|
|
const TABLE_NAME_EDGE = 'edge';
|
|
const TABLE_NAME_EDGEDATA = 'edgedata';
|
|
|
|
const TYPE_TASK_HAS_COMMIT = 1;
|
|
const TYPE_COMMIT_HAS_TASK = 2;
|
|
|
|
const TYPE_TASK_DEPENDS_ON_TASK = 3;
|
|
const TYPE_TASK_DEPENDED_ON_BY_TASK = 4;
|
|
|
|
const TYPE_DREV_DEPENDS_ON_DREV = 5;
|
|
const TYPE_DREV_DEPENDED_ON_BY_DREV = 6;
|
|
|
|
const TYPE_BLOG_HAS_POST = 7;
|
|
const TYPE_POST_HAS_BLOG = 8;
|
|
const TYPE_BLOG_HAS_BLOGGER = 9;
|
|
const TYPE_BLOGGER_HAS_BLOG = 10;
|
|
|
|
const TYPE_TASK_HAS_RELATED_DREV = 11;
|
|
const TYPE_DREV_HAS_RELATED_TASK = 12;
|
|
|
|
const TYPE_PROJ_MEMBER = 13;
|
|
const TYPE_MEMBER_OF_PROJ = 14;
|
|
|
|
const TYPE_TEST_NO_CYCLE = 9000;
|
|
|
|
public static function getInverse($edge_type) {
|
|
static $map = array(
|
|
self::TYPE_TASK_HAS_COMMIT => self::TYPE_COMMIT_HAS_TASK,
|
|
self::TYPE_COMMIT_HAS_TASK => self::TYPE_TASK_HAS_COMMIT,
|
|
|
|
self::TYPE_TASK_DEPENDS_ON_TASK => self::TYPE_TASK_DEPENDED_ON_BY_TASK,
|
|
self::TYPE_TASK_DEPENDED_ON_BY_TASK => self::TYPE_TASK_DEPENDS_ON_TASK,
|
|
|
|
self::TYPE_DREV_DEPENDS_ON_DREV => self::TYPE_DREV_DEPENDED_ON_BY_DREV,
|
|
self::TYPE_DREV_DEPENDED_ON_BY_DREV => self::TYPE_DREV_DEPENDS_ON_DREV,
|
|
|
|
self::TYPE_BLOG_HAS_POST => self::TYPE_POST_HAS_BLOG,
|
|
self::TYPE_POST_HAS_BLOG => self::TYPE_BLOG_HAS_POST,
|
|
self::TYPE_BLOG_HAS_BLOGGER => self::TYPE_BLOGGER_HAS_BLOG,
|
|
self::TYPE_BLOGGER_HAS_BLOG => self::TYPE_BLOG_HAS_BLOGGER,
|
|
|
|
self::TYPE_TASK_HAS_RELATED_DREV => self::TYPE_DREV_HAS_RELATED_TASK,
|
|
self::TYPE_DREV_HAS_RELATED_TASK => self::TYPE_TASK_HAS_RELATED_DREV,
|
|
|
|
self::TYPE_PROJ_MEMBER => self::TYPE_MEMBER_OF_PROJ,
|
|
self::TYPE_MEMBER_OF_PROJ => self::TYPE_PROJ_MEMBER,
|
|
);
|
|
|
|
return idx($map, $edge_type);
|
|
}
|
|
|
|
public static function shouldPreventCycles($edge_type) {
|
|
static $map = array(
|
|
self::TYPE_TEST_NO_CYCLE => true,
|
|
self::TYPE_TASK_DEPENDS_ON_TASK => true,
|
|
self::TYPE_DREV_DEPENDS_ON_DREV => true,
|
|
);
|
|
return isset($map[$edge_type]);
|
|
}
|
|
|
|
public static function establishConnection($phid_type, $conn_type) {
|
|
static $class_map = array(
|
|
PhabricatorPHIDConstants::PHID_TYPE_TASK => 'ManiphestTask',
|
|
PhabricatorPHIDConstants::PHID_TYPE_CMIT => 'PhabricatorRepository',
|
|
PhabricatorPHIDConstants::PHID_TYPE_DREV => 'DifferentialRevision',
|
|
PhabricatorPHIDConstants::PHID_TYPE_FILE => 'PhabricatorFile',
|
|
PhabricatorPHIDConstants::PHID_TYPE_USER => 'PhabricatorUser',
|
|
PhabricatorPHIDConstants::PHID_TYPE_PROJ => 'PhabricatorProject',
|
|
PhabricatorPHIDConstants::PHID_TYPE_MLST =>
|
|
'PhabricatorMetaMTAMailingList',
|
|
PhabricatorPHIDConstants::PHID_TYPE_TOBJ => 'HarbormasterObject',
|
|
PhabricatorPHIDConstants::PHID_TYPE_BLOG => 'PhameBlog',
|
|
PhabricatorPHIDConstants::PHID_TYPE_POST => 'PhamePost',
|
|
);
|
|
|
|
$class = idx($class_map, $phid_type);
|
|
|
|
if (!$class) {
|
|
throw new Exception(
|
|
"Edges are not available for objects of type '{$phid_type}'!");
|
|
}
|
|
|
|
return newv($class, array())->establishConnection($conn_type);
|
|
}
|
|
|
|
}
|