From f763c314e1070d5cb508e5e577bfc37dc9bcb465 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Sun, 19 Jun 2016 07:59:35 -0700 Subject: [PATCH 01/26] Fix external blog images Summary: Reading the code, this seems correct, but I don't have a local test. Ref T9897 Test Plan: read carefully Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T9897 Differential Revision: https://secure.phabricator.com/D16148 --- src/applications/phame/site/PhameBlogSite.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/applications/phame/site/PhameBlogSite.php b/src/applications/phame/site/PhameBlogSite.php index 67ecdb0465..6a5eebaf31 100644 --- a/src/applications/phame/site/PhameBlogSite.php +++ b/src/applications/phame/site/PhameBlogSite.php @@ -39,6 +39,7 @@ final class PhameBlogSite extends PhameSite { ->setViewer(new PhabricatorUser()) ->withDomain($host) ->needProfileImage(true) + ->needHeaderImage(true) ->withStatuses( array( PhameBlog::STATUS_ACTIVE, From 9a2c2505a013b2328889390cd0f2a3c3ea5569f4 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 20 Jun 2016 11:07:00 -0700 Subject: [PATCH 02/26] Handle tag tags properly in discovery Summary: Fixes T11180. In Git, it's possible to tag a tag (????). When you do, we try to log the tag-object, which automatically resolves to the commit and fails. Just skip these. If "A" points at "B" which points at "C", it's fine to ignore "A" and "B" since we'll get the same stuff when we process "C". Test Plan: - Tagged a tag. - Pushed it. - Discovered it. - Before patch: got exception similar to the one in T11180. - After patch: got tag-tag skipped. Also got slightly better error messages. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11180 Differential Revision: https://secure.phabricator.com/D16149 --- .../daemon/PhabricatorGitGraphStream.php | 18 ++++++++++++++---- .../PhabricatorRepositoryDiscoveryEngine.php | 16 +++++++++++++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/applications/repository/daemon/PhabricatorGitGraphStream.php b/src/applications/repository/daemon/PhabricatorGitGraphStream.php index 669cf9c105..b175053528 100644 --- a/src/applications/repository/daemon/PhabricatorGitGraphStream.php +++ b/src/applications/repository/daemon/PhabricatorGitGraphStream.php @@ -5,6 +5,7 @@ final class PhabricatorGitGraphStream private $repository; private $iterator; + private $startCommit; private $parents = array(); private $dates = array(); @@ -14,6 +15,7 @@ final class PhabricatorGitGraphStream $start_commit = null) { $this->repository = $repository; + $this->startCommit = $start_commit; if ($start_commit !== null) { $future = $repository->getLocalCommandFuture( @@ -82,10 +84,18 @@ final class PhabricatorGitGraphStream } } - throw new Exception( - pht( - "No such commit '%s' in repository!", - $commit)); + if ($this->startCommit !== null) { + throw new Exception( + pht( + 'Commit "%s" is not a reachable ancestor of "%s".', + $commit, + $this->startCommit)); + } else { + throw new Exception( + pht( + 'Commit "%s" is not a reachable ancestor of any ref.', + $commit)); + } } private function isParsed($commit) { diff --git a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php index cdb7e11d03..fd8c57e9b4 100644 --- a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php @@ -157,7 +157,12 @@ final class PhabricatorRepositoryDiscoveryEngine $name = $ref->getShortName(); $commit = $ref->getCommitIdentifier(); - $this->log(pht('Examining ref "%s", at "%s".', $name, $commit)); + $this->log( + pht( + 'Examining "%s" (%s) at "%s".', + $name, + $ref->getRefType(), + $commit)); if (!$repository->shouldTrackRef($ref)) { $this->log(pht('Skipping, ref is untracked.')); @@ -169,6 +174,15 @@ final class PhabricatorRepositoryDiscoveryEngine continue; } + // In Git, it's possible to tag a tag. We just skip these, we'll discover + // them when we process the target tag. See T11180. + $fields = $ref->getRawFields(); + $tag_type = idx($fields, '*objecttype'); + if ($tag_type == 'tag') { + $this->log(pht('Skipping, this is a tag of a tag.')); + continue; + } + $this->log(pht('Looking for new commits.')); $head_refs = $this->discoverStreamAncestry( From 967945e4b4e9c2f2c41ffe5672ab3a4f80c7abd1 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Mon, 20 Jun 2016 12:42:53 -0700 Subject: [PATCH 03/26] Add ability to link back to parent site in external phame blogs Summary: Ref T9897. Adds a Parent Site and Parent Domain field to allow external sites to link back to parent. Test Plan: Set up ```local.blog.phacility.com```, set parent site to "Phacility" and parent domain to "local.www.phacility.com". Get new crumbs at Blog and Post levels. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T9897 Differential Revision: https://secure.phabricator.com/D16150 --- .../20160620.phame.blog.parentdomain.2.sql | 2 + .../20160620.phame.blog.parentsite.1.sql | 2 + .../phame/controller/PhameLiveController.php | 6 +++ .../blog/PhameBlogManageController.php | 21 ++++++--- .../phame/editor/PhameBlogEditEngine.php | 16 +++++++ .../phame/editor/PhameBlogEditor.php | 33 ++++++++++++++ src/applications/phame/storage/PhameBlog.php | 11 ++++- .../phame/storage/PhameBlogTransaction.php | 44 ++++++++++++++++++- 8 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql create mode 100644 resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql diff --git a/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql b/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql new file mode 100644 index 0000000000..3ad4b0d040 --- /dev/null +++ b/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD parentDomain VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql b/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql new file mode 100644 index 0000000000..cfb4f157b1 --- /dev/null +++ b/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD parentSite VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/src/applications/phame/controller/PhameLiveController.php b/src/applications/phame/controller/PhameLiveController.php index 3fd9f64600..ba2b65d9f8 100644 --- a/src/applications/phame/controller/PhameLiveController.php +++ b/src/applications/phame/controller/PhameLiveController.php @@ -159,6 +159,12 @@ abstract class PhameLiveController extends PhameController { // "Blogs" crumb into the crumbs list. if ($is_external) { $crumbs = new PHUICrumbsView(); + // Link back to parent site + if ($blog->getParentSite() && $blog->getParentDomain()) { + $crumbs->addTextCrumb( + $blog->getParentSite(), + $blog->getExternalParentURI()); + } } else { $crumbs = parent::buildApplicationCrumbs(); $crumbs->addTextCrumb( diff --git a/src/applications/phame/controller/blog/PhameBlogManageController.php b/src/applications/phame/controller/blog/PhameBlogManageController.php index bcd9c9456b..a87b02070d 100644 --- a/src/applications/phame/controller/blog/PhameBlogManageController.php +++ b/src/applications/phame/controller/blog/PhameBlogManageController.php @@ -95,8 +95,7 @@ final class PhameBlogManageController extends PhameBlogController { Javelin::initBehavior('phabricator-tooltips'); $properties = id(new PHUIPropertyListView()) - ->setUser($viewer) - ->setObject($blog); + ->setUser($viewer); $domain = $blog->getDomain(); if (!$domain) { @@ -105,6 +104,20 @@ final class PhameBlogManageController extends PhameBlogController { $properties->addProperty(pht('Domain'), $domain); + $parent_site = $blog->getParentSite(); + if (!$parent_site) { + $parent_site = phutil_tag('em', array(), pht('No parent site')); + } + + $properties->addProperty(pht('Parent Site'), $parent_site); + + $parent_domain = $blog->getParentDomain(); + if (!$parent_domain) { + $parent_domain = phutil_tag('em', array(), pht('No parent domain')); + } + + $properties->addProperty(pht('Parent Domain'), $parent_domain); + $feed_uri = PhabricatorEnv::getProductionURI( $this->getApplicationURI('blog/feed/'.$blog->getID().'/')); $properties->addProperty( @@ -133,8 +146,6 @@ final class PhameBlogManageController extends PhameBlogController { ->addObject($blog, PhameBlog::MARKUP_FIELD_DESCRIPTION) ->process(); - $properties->invokeWillRenderEvent(); - $description = $blog->getDescription(); if (strlen($description)) { $description = new PHUIRemarkupView($viewer, $description); @@ -150,7 +161,7 @@ final class PhameBlogManageController extends PhameBlogController { private function buildCurtain(PhameBlog $blog) { $viewer = $this->getViewer(); - $curtain = $this->newCurtainView($viewer); + $curtain = $this->newCurtainView($blog); $actions = id(new PhabricatorActionListView()) ->setObject($blog) diff --git a/src/applications/phame/editor/PhameBlogEditEngine.php b/src/applications/phame/editor/PhameBlogEditEngine.php index 9cc7217147..70d878e15a 100644 --- a/src/applications/phame/editor/PhameBlogEditEngine.php +++ b/src/applications/phame/editor/PhameBlogEditEngine.php @@ -101,6 +101,22 @@ final class PhameBlogEditEngine ->setConduitTypeDescription(pht('New blog domain.')) ->setValue($object->getDomain()) ->setTransactionType(PhameBlogTransaction::TYPE_DOMAIN), + id(new PhabricatorTextEditField()) + ->setKey('parentSite') + ->setLabel(pht('Parent Site')) + ->setDescription(pht('Blog parent site name.')) + ->setConduitDescription(pht('Change the blog parent site name.')) + ->setConduitTypeDescription(pht('New blog parent site name.')) + ->setValue($object->getParentSite()) + ->setTransactionType(PhameBlogTransaction::TYPE_PARENTSITE), + id(new PhabricatorTextEditField()) + ->setKey('parentDomain') + ->setLabel(pht('Parent Domain')) + ->setDescription(pht('Blog parent domain name.')) + ->setConduitDescription(pht('Change the blog parent domain.')) + ->setConduitTypeDescription(pht('New blog parent domain.')) + ->setValue($object->getParentDomain()) + ->setTransactionType(PhameBlogTransaction::TYPE_PARENTDOMAIN), id(new PhabricatorSelectEditField()) ->setKey('status') ->setLabel(pht('Status')) diff --git a/src/applications/phame/editor/PhameBlogEditor.php b/src/applications/phame/editor/PhameBlogEditor.php index ec0cbe9e06..d2a9fcbc1f 100644 --- a/src/applications/phame/editor/PhameBlogEditor.php +++ b/src/applications/phame/editor/PhameBlogEditor.php @@ -18,6 +18,8 @@ final class PhameBlogEditor $types[] = PhameBlogTransaction::TYPE_SUBTITLE; $types[] = PhameBlogTransaction::TYPE_DESCRIPTION; $types[] = PhameBlogTransaction::TYPE_DOMAIN; + $types[] = PhameBlogTransaction::TYPE_PARENTSITE; + $types[] = PhameBlogTransaction::TYPE_PARENTDOMAIN; $types[] = PhameBlogTransaction::TYPE_STATUS; $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; @@ -38,6 +40,10 @@ final class PhameBlogEditor return $object->getDescription(); case PhameBlogTransaction::TYPE_DOMAIN: return $object->getDomain(); + case PhameBlogTransaction::TYPE_PARENTSITE: + return $object->getParentSite(); + case PhameBlogTransaction::TYPE_PARENTDOMAIN: + return $object->getParentDomain(); case PhameBlogTransaction::TYPE_STATUS: return $object->getStatus(); } @@ -52,6 +58,8 @@ final class PhameBlogEditor case PhameBlogTransaction::TYPE_SUBTITLE: case PhameBlogTransaction::TYPE_DESCRIPTION: case PhameBlogTransaction::TYPE_STATUS: + case PhameBlogTransaction::TYPE_PARENTSITE: + case PhameBlogTransaction::TYPE_PARENTDOMAIN: return $xaction->getNewValue(); case PhameBlogTransaction::TYPE_DOMAIN: $domain = $xaction->getNewValue(); @@ -77,6 +85,10 @@ final class PhameBlogEditor return $object->setDomain($xaction->getNewValue()); case PhameBlogTransaction::TYPE_STATUS: return $object->setStatus($xaction->getNewValue()); + case PhameBlogTransaction::TYPE_PARENTSITE: + return $object->setParentSite($xaction->getNewValue()); + case PhameBlogTransaction::TYPE_PARENTDOMAIN: + return $object->setParentDomain($xaction->getNewValue()); } return parent::applyCustomInternalTransaction($object, $xaction); @@ -91,6 +103,8 @@ final class PhameBlogEditor case PhameBlogTransaction::TYPE_SUBTITLE: case PhameBlogTransaction::TYPE_DESCRIPTION: case PhameBlogTransaction::TYPE_DOMAIN: + case PhameBlogTransaction::TYPE_PARENTSITE: + case PhameBlogTransaction::TYPE_PARENTDOMAIN: case PhameBlogTransaction::TYPE_STATUS: return; } @@ -123,6 +137,25 @@ final class PhameBlogEditor $errors[] = $error; } break; + case PhameBlogTransaction::TYPE_PARENTDOMAIN: + if (!$xactions) { + continue; + } + $parent_domain = last($xactions)->getNewValue(); + if (empty($parent_domain)) { + continue; + } + try { + PhabricatorEnv::requireValidRemoteURIForLink($parent_domain); + } catch (Exception $ex) { + $error = new PhabricatorApplicationTransactionValidationError( + $type, + pht('Invalid URI'), + pht('Parent Domain must be set to a valid Remote URI.'), + nonempty(last($xactions), null)); + $errors[] = $error; + } + break; case PhameBlogTransaction::TYPE_DOMAIN: if (!$xactions) { continue; diff --git a/src/applications/phame/storage/PhameBlog.php b/src/applications/phame/storage/PhameBlog.php index b956eaa1c6..4f092cd3f1 100644 --- a/src/applications/phame/storage/PhameBlog.php +++ b/src/applications/phame/storage/PhameBlog.php @@ -18,6 +18,8 @@ final class PhameBlog extends PhameDAO protected $subtitle; protected $description; protected $domain; + protected $parentSite; + protected $parentDomain; protected $configData; protected $creatorPHID; protected $viewPolicy; @@ -44,6 +46,8 @@ final class PhameBlog extends PhameDAO 'subtitle' => 'text64', 'description' => 'text', 'domain' => 'text128?', + 'parentSite' => 'text128', + 'parentDomain' => 'text128', 'status' => 'text32', 'mailKey' => 'bytes20', 'profileImagePHID' => 'phid?', @@ -187,11 +191,16 @@ final class PhameBlog extends PhameDAO } public function getExternalLiveURI() { - $domain = $this->getDomain(); $uri = new PhutilURI('http://'.$this->getDomain().'/'); return (string)$uri; } + public function getExternalParentURI() { + $uri = $this->getParentDomain(); + PhabricatorEnv::requireValidRemoteURIForLink($uri); + return (string)$uri; + } + public function getInternalLiveURI() { return '/phame/live/'.$this->getID().'/'; } diff --git a/src/applications/phame/storage/PhameBlogTransaction.php b/src/applications/phame/storage/PhameBlogTransaction.php index 8d71fa0ee9..91c6552666 100644 --- a/src/applications/phame/storage/PhameBlogTransaction.php +++ b/src/applications/phame/storage/PhameBlogTransaction.php @@ -8,6 +8,8 @@ final class PhameBlogTransaction const TYPE_DESCRIPTION = 'phame.blog.description'; const TYPE_DOMAIN = 'phame.blog.domain'; const TYPE_STATUS = 'phame.blog.status'; + const TYPE_PARENTSITE = 'phame.blog.parent.site'; + const TYPE_PARENTDOMAIN = 'phame.blog.parent.domain'; const MAILTAG_DETAILS = 'phame-blog-details'; const MAILTAG_SUBSCRIBERS = 'phame-blog-subscribers'; @@ -65,7 +67,7 @@ final class PhameBlogTransaction switch ($this->getTransactionType()) { case self::TYPE_STATUS: if ($new == PhameBlog::STATUS_ARCHIVED) { - return 'red'; + return 'violet'; } else { return 'green'; } @@ -84,6 +86,8 @@ final class PhameBlogTransaction case self::TYPE_SUBTITLE: case self::TYPE_DESCRIPTION: case self::TYPE_DOMAIN: + case self::TYPE_PARENTSITE: + case self::TYPE_PARENTDOMAIN: $tags[] = self::MAILTAG_DETAILS; break; default: @@ -142,6 +146,32 @@ final class PhameBlogTransaction $this->renderHandleLink($author_phid), $new); break; + case self::TYPE_PARENTSITE: + if ($old === null) { + return pht( + '%s set this blog\'s parent site to "%s".', + $this->renderHandleLink($author_phid), + $new); + } else { + return pht( + '%s updated the blog\'s parent site to "%s".', + $this->renderHandleLink($author_phid), + $new); + } + break; + case self::TYPE_PARENTDOMAIN: + if ($old === null) { + return pht( + '%s set this blog\'s parent domain to "%s".', + $this->renderHandleLink($author_phid), + $new); + } else { + return pht( + '%s updated the blog\'s parent domain to "%s".', + $this->renderHandleLink($author_phid), + $new); + } + break; case self::TYPE_STATUS: switch ($new) { case PhameBlog::STATUS_ACTIVE: @@ -206,6 +236,18 @@ final class PhameBlogTransaction $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); break; + case self::TYPE_PARENTSITE: + return pht( + '%s updated the parent site for %s.', + $this->renderHandleLink($author_phid), + $this->renderHandleLink($object_phid)); + break; + case self::TYPE_PARENTDOMAIN: + return pht( + '%s updated the parent domain for %s.', + $this->renderHandleLink($author_phid), + $this->renderHandleLink($object_phid)); + break; case self::TYPE_STATUS: switch ($new) { case PhameBlog::STATUS_ACTIVE: From 851aba80ce063d6101f70d3557155a67db0dab4e Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 20 Jun 2016 11:49:11 -0700 Subject: [PATCH 04/26] Render dropdown metadata earlier Summary: Ref T11179. One issue I'm getting with trying to turn actions into dropdowns is that we currently render this menu very late, which can cause us to try to add more metadata after we start resolving metadata. This won't work right now (and making it work seems unreasonably complicated), so stop doing it and fatal if something tries. (This might make some things fatal but //should// be safe -- anything that fatals should have been broken already.) Test Plan: Browsed around looking for fatals, didn't see any. (This primarily avoids a broken state / fatal in a future diff.) Reviewers: chad Reviewed By: chad Maniphest Tasks: T11179 Differential Revision: https://secure.phabricator.com/D16151 --- .../celerity/CelerityStaticResourceResponse.php | 10 ++++++++++ src/view/layout/PhabricatorActionListView.php | 6 ++++++ src/view/phui/PHUIButtonView.php | 5 +---- src/view/phui/PHUIListItemView.php | 5 +---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/applications/celerity/CelerityStaticResourceResponse.php b/src/applications/celerity/CelerityStaticResourceResponse.php index f81b8d5957..7db6c2741b 100644 --- a/src/applications/celerity/CelerityStaticResourceResponse.php +++ b/src/applications/celerity/CelerityStaticResourceResponse.php @@ -13,6 +13,7 @@ final class CelerityStaticResourceResponse extends Phobject { private $packaged; private $metadata = array(); private $metadataBlock = 0; + private $metadataLocked; private $behaviors = array(); private $hasRendered = array(); private $postprocessorKey; @@ -24,6 +25,13 @@ final class CelerityStaticResourceResponse extends Phobject { } public function addMetadata($metadata) { + if ($this->metadataLocked) { + throw new Exception( + pht( + 'Attempting to add more metadata after metadata has been '. + 'locked.')); + } + $id = count($this->metadata); $this->metadata[$id] = $metadata; return $this->metadataBlock.'_'.$id; @@ -189,6 +197,8 @@ final class CelerityStaticResourceResponse extends Phobject { } public function renderHTMLFooter() { + $this->metadataLocked = true; + $data = array(); if ($this->metadata) { $json_metadata = AphrontResponse::encodeJSONForHTTPResponse( diff --git a/src/view/layout/PhabricatorActionListView.php b/src/view/layout/PhabricatorActionListView.php index 4965f02793..5c3facbf42 100644 --- a/src/view/layout/PhabricatorActionListView.php +++ b/src/view/layout/PhabricatorActionListView.php @@ -53,5 +53,11 @@ final class PhabricatorActionListView extends AphrontView { $actions); } + public function getDropdownMenuMetadata() { + return array( + 'items' => (string)hsprintf('%s', $this), + ); + } + } diff --git a/src/view/phui/PHUIButtonView.php b/src/view/phui/PHUIButtonView.php index 9b9d4f0293..f9266a170a 100644 --- a/src/view/phui/PHUIButtonView.php +++ b/src/view/phui/PHUIButtonView.php @@ -105,10 +105,7 @@ final class PHUIButtonView extends AphrontTagView { Javelin::initBehavior('phui-dropdown-menu'); $this->addSigil('phui-dropdown-menu'); - $this->setMetadata( - array( - 'items' => $actions, - )); + $this->setMetadata($actions->getDropdownMenuMetadata()); return $this; } diff --git a/src/view/phui/PHUIListItemView.php b/src/view/phui/PHUIListItemView.php index 33c511c9c0..4af02e572e 100644 --- a/src/view/phui/PHUIListItemView.php +++ b/src/view/phui/PHUIListItemView.php @@ -43,10 +43,7 @@ final class PHUIListItemView extends AphrontTagView { Javelin::initBehavior('phui-dropdown-menu'); $this->addSigil('phui-dropdown-menu'); - $this->setMetadata( - array( - 'items' => $actions, - )); + $this->setMetadata($actions->getDropdownMenuMetadata()); return $this; } From 6f275ba1441f39fbd34ea454cf28c18ca016bab0 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 20 Jun 2016 13:52:18 -0700 Subject: [PATCH 05/26] Render browse results with global result style Summary: Ref T11034. This seems a little more promising. Two problems at the moment: - This doesn't actually provide any useful information at all right now. - Many object types have no profile images. Test Plan: {F1695254} {F1695255} Reviewers: chad Reviewed By: chad Maniphest Tasks: T11034 Differential Revision: https://secure.phabricator.com/D16155 --- resources/celerity/map.php | 4 +- .../DiffusionRepositoryDatasource.php | 46 ++++++++++---- ...onTaggedRepositoriesFunctionDatasource.php | 5 +- .../typeahead/DrydockBlueprintDatasource.php | 7 +++ .../ManiphestTaskClosedStatusDatasource.php | 3 +- .../ManiphestTaskOpenStatusDatasource.php | 3 +- .../ManiphestTaskPriorityDatasource.php | 3 +- .../ManiphestTaskStatusDatasource.php | 6 ++ .../PhabricatorPeopleAnyOwnerDatasource.php | 3 +- .../typeahead/PhabricatorPeopleDatasource.php | 42 +++++++------ .../PhabricatorPeopleNoOwnerDatasource.php | 3 +- .../typeahead/PhabricatorViewerDatasource.php | 3 +- .../PhabricatorProjectDatasource.php | 30 +++++++++- ...abricatorProjectLogicalOrNotDatasource.php | 10 +++- ...bricatorProjectLogicalViewerDatasource.php | 3 +- .../PhabricatorProjectMembersDatasource.php | 5 +- ...PhabricatorProjectNoProjectsDatasource.php | 3 +- .../typeahead/PhabricatorSearchDatasource.php | 12 +++- ...orTypeaheadModularDatasourceController.php | 60 +++++++++++++++++-- ...habricatorTypeaheadCompositeDatasource.php | 5 ++ .../PhabricatorTypeaheadDatasource.php | 13 +++- .../storage/PhabricatorTypeaheadResult.php | 23 +++++++ webroot/rsrc/css/aphront/typeahead-browse.css | 18 +++++- 23 files changed, 258 insertions(+), 52 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 90183aaf6e..3aef57ca61 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -28,7 +28,7 @@ return array( 'rsrc/css/aphront/table-view.css' => '9258e19f', 'rsrc/css/aphront/tokenizer.css' => '056da01b', 'rsrc/css/aphront/tooltip.css' => '1a07aea8', - 'rsrc/css/aphront/typeahead-browse.css' => 'd8581d2c', + 'rsrc/css/aphront/typeahead-browse.css' => '8904346a', 'rsrc/css/aphront/typeahead.css' => 'd4f16145', 'rsrc/css/application/almanac/almanac.css' => 'dbb9b3af', 'rsrc/css/application/auth/auth.css' => '0877ed6e', @@ -889,7 +889,7 @@ return array( 'syntax-default-css' => '9923583c', 'syntax-highlighting-css' => '9fc496d5', 'tokens-css' => '3d0f239e', - 'typeahead-browse-css' => 'd8581d2c', + 'typeahead-browse-css' => '8904346a', 'unhandled-exception-css' => '4c96257a', ), 'requires' => array( diff --git a/src/applications/diffusion/typeahead/DiffusionRepositoryDatasource.php b/src/applications/diffusion/typeahead/DiffusionRepositoryDatasource.php index bd702baaee..0b3f191563 100644 --- a/src/applications/diffusion/typeahead/DiffusionRepositoryDatasource.php +++ b/src/applications/diffusion/typeahead/DiffusionRepositoryDatasource.php @@ -31,24 +31,50 @@ final class DiffusionRepositoryDatasource "phabricator-search-icon phui-font-fa phui-icon-view {$type_icon}"; $results = array(); - foreach ($repos as $repo) { - $display_name = $repo->getMonogram().' '.$repo->getName(); + foreach ($repos as $repository) { + $monogram = $repository->getMonogram(); + $name = $repository->getName(); - $name = $display_name; - $slug = $repo->getRepositorySlug(); + $display_name = "{$monogram} {$name}"; + + $parts = array(); + $parts[] = $name; + + $slug = $repository->getRepositorySlug(); if (strlen($slug)) { - $name = "{$name} {$slug}"; + $parts[] = $slug; } - $results[] = id(new PhabricatorTypeaheadResult()) + $callsign = $repository->getCallsign(); + if ($callsign) { + $parts[] = $callsign; + } + + foreach ($repository->getAllMonograms() as $monogram) { + $parts[] = $monogram; + } + + $name = implode(' ', $parts); + + $vcs = $repository->getVersionControlSystem(); + $vcs_type = PhabricatorRepositoryType::getNameForRepositoryType($vcs); + + $result = id(new PhabricatorTypeaheadResult()) ->setName($name) ->setDisplayName($display_name) - ->setURI($repo->getURI()) - ->setPHID($repo->getPHID()) - ->setPriorityString($repo->getMonogram()) + ->setURI($repository->getURI()) + ->setPHID($repository->getPHID()) + ->setPriorityString($repository->getMonogram()) ->setPriorityType('repo') ->setImageSprite($image_sprite) - ->setDisplayType(pht('Repository')); + ->setDisplayType(pht('Repository')) + ->addAttribute($vcs_type); + + if (!$repository->isTracked()) { + $result->setClosed(pht('Inactive')); + } + + $results[] = $result; } return $results; diff --git a/src/applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php b/src/applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php index bdf89bca0c..6c6fdeaf79 100644 --- a/src/applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php +++ b/src/applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php @@ -43,7 +43,10 @@ final class DiffusionTaggedRepositoriesFunctionDatasource ->setColor(null) ->setPHID('tagged('.$result->getPHID().')') ->setDisplayName(pht('Tagged: %s', $result->getDisplayName())) - ->setName('tagged '.$result->getName()); + ->setName('tagged '.$result->getName()) + ->resetAttributes() + ->addAttribute(pht('Function')) + ->addAttribute(pht('Select repositories tagged with this project.')); } return $results; diff --git a/src/applications/drydock/typeahead/DrydockBlueprintDatasource.php b/src/applications/drydock/typeahead/DrydockBlueprintDatasource.php index 79229bfab5..d36a2bc64b 100644 --- a/src/applications/drydock/typeahead/DrydockBlueprintDatasource.php +++ b/src/applications/drydock/typeahead/DrydockBlueprintDatasource.php @@ -7,6 +7,10 @@ final class DrydockBlueprintDatasource return pht('Type a blueprint name...'); } + public function getBrowseTitle() { + return pht('Browse Blueprints'); + } + public function getDatasourceApplicationClass() { return 'PhabricatorDrydockApplication'; } @@ -37,6 +41,9 @@ final class DrydockBlueprintDatasource $result->setClosed(pht('Disabled')); } + $result->addAttribute( + $blueprint->getImplementation()->getBlueprintName()); + $results[] = $result; } diff --git a/src/applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php b/src/applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php index b8ca35cbfb..68fb521980 100644 --- a/src/applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php +++ b/src/applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php @@ -67,7 +67,8 @@ final class ManiphestTaskClosedStatusDatasource ->setName($name.' closed') ->setDisplayName($name) ->setPHID(self::FUNCTION_TOKEN) - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select any closed status.')); } } diff --git a/src/applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php b/src/applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php index ffc2801bc6..85a201fdba 100644 --- a/src/applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php +++ b/src/applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php @@ -67,7 +67,8 @@ final class ManiphestTaskOpenStatusDatasource ->setName($name.' open') ->setDisplayName($name) ->setPHID(self::FUNCTION_TOKEN) - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select any open status.')); } } diff --git a/src/applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php b/src/applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php index 217267b8cb..c4530f9bb3 100644 --- a/src/applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php +++ b/src/applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php @@ -32,7 +32,8 @@ final class ManiphestTaskPriorityDatasource $result = id(new PhabricatorTypeaheadResult()) ->setIcon(ManiphestTaskPriority::getTaskPriorityIcon($value)) ->setPHID($value) - ->setName($name); + ->setName($name) + ->addAttribute(pht('Priority')); if (ManiphestTaskPriority::isDisabledPriority($value)) { $result->setClosed(pht('Disabled')); diff --git a/src/applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php b/src/applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php index fe59c974e6..9d73ca994f 100644 --- a/src/applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php +++ b/src/applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php @@ -35,6 +35,12 @@ final class ManiphestTaskStatusDatasource ->setPHID($value) ->setName($name); + if (ManiphestTaskStatus::isOpenStatus($value)) { + $result->addAttribute(pht('Open Status')); + } else { + $result->addAttribute(pht('Closed Status')); + } + if (ManiphestTaskStatus::isDisabledStatus($value)) { $result->setClosed(pht('Disabled')); } diff --git a/src/applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php b/src/applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php index 803ecc59d2..2a2a451a49 100644 --- a/src/applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php +++ b/src/applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php @@ -62,7 +62,8 @@ final class PhabricatorPeopleAnyOwnerDatasource ->setDisplayName($name) ->setIcon('fa-certificate') ->setPHID(self::FUNCTION_TOKEN) - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select results with any owner.')); } } diff --git a/src/applications/people/typeahead/PhabricatorPeopleDatasource.php b/src/applications/people/typeahead/PhabricatorPeopleDatasource.php index 2cd337cacc..494b68dbfb 100644 --- a/src/applications/people/typeahead/PhabricatorPeopleDatasource.php +++ b/src/applications/people/typeahead/PhabricatorPeopleDatasource.php @@ -3,18 +3,6 @@ final class PhabricatorPeopleDatasource extends PhabricatorTypeaheadDatasource { - private $enrichResults; - - /** - * Controls enriched rendering, for global search. This is a bit hacky and - * should probably be handled in a more general way, but is fairly reasonable - * for now. - */ - public function setEnrichResults($enrich) { - $this->enrichResults = $enrich; - return $this; - } - public function getBrowseTitle() { return pht('Browse Users'); } @@ -40,7 +28,9 @@ final class PhabricatorPeopleDatasource $users = $this->executeQuery($query); - if ($this->enrichResults && $users) { + $is_browse = $this->getIsBrowse(); + + if ($is_browse && $users) { $phids = mpull($users, 'getPHID'); $handles = id(new PhabricatorHandleQuery()) ->setViewer($viewer) @@ -50,6 +40,8 @@ final class PhabricatorPeopleDatasource $results = array(); foreach ($users as $user) { + $phid = $user->getPHID(); + $closed = null; if ($user->getIsDisabled()) { $closed = pht('Disabled'); @@ -64,7 +56,7 @@ final class PhabricatorPeopleDatasource $result = id(new PhabricatorTypeaheadResult()) ->setName($user->getFullName()) ->setURI('/p/'.$username.'/') - ->setPHID($user->getPHID()) + ->setPHID($phid) ->setPriorityString($username) ->setPriorityType('user') ->setAutocomplete('@'.$username) @@ -74,13 +66,29 @@ final class PhabricatorPeopleDatasource $result->setIcon('fa-envelope-o'); } - if ($this->enrichResults) { - $display_type = pht('User'); + if ($is_browse) { + $handle = $handles[$phid]; + + $result + ->setIcon($handle->getIcon()) + ->setImageURI($handle->getImageURI()) + ->addAttribute($handle->getSubtitle()); + + if ($user->getIsAdmin()) { + $result->addAttribute( + array( + id(new PHUIIconView())->setIcon('fa-star'), + ' ', + pht('Administrator'), + )); + } + if ($user->getIsAdmin()) { $display_type = pht('Administrator'); + } else { + $display_type = pht('User'); } $result->setDisplayType($display_type); - $result->setImageURI($handles[$user->getPHID()]->getImageURI()); } $results[] = $result; diff --git a/src/applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php b/src/applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php index 35f62e31dc..fb3a6226d9 100644 --- a/src/applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php +++ b/src/applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php @@ -69,7 +69,8 @@ final class PhabricatorPeopleNoOwnerDatasource ->setDisplayName($name) ->setIcon('fa-ban') ->setPHID('none()') - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select results with no owner.')); } } diff --git a/src/applications/people/typeahead/PhabricatorViewerDatasource.php b/src/applications/people/typeahead/PhabricatorViewerDatasource.php index 1c9276ae8d..e29fd4586b 100644 --- a/src/applications/people/typeahead/PhabricatorViewerDatasource.php +++ b/src/applications/people/typeahead/PhabricatorViewerDatasource.php @@ -74,7 +74,8 @@ final class PhabricatorViewerDatasource ->setName(pht('Current Viewer')) ->setPHID('viewer()') ->setIcon('fa-user') - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select current viewer.')); } } diff --git a/src/applications/project/typeahead/PhabricatorProjectDatasource.php b/src/applications/project/typeahead/PhabricatorProjectDatasource.php index e0b277c2ad..03c2424f4a 100644 --- a/src/applications/project/typeahead/PhabricatorProjectDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectDatasource.php @@ -55,9 +55,25 @@ final class PhabricatorProjectDatasource $has_cols = array_fill_keys(array_keys($projs), true); } + $is_browse = $this->getIsBrowse(); + if ($is_browse && $projs) { + // TODO: This is a little ad-hoc, but we don't currently have + // infrastructure for bulk querying custom fields efficiently. + $table = new PhabricatorProjectCustomFieldStorage(); + $descriptions = $table->loadAllWhere( + 'objectPHID IN (%Ls) AND fieldIndex = %s', + array_keys($projs), + PhabricatorHash::digestForIndex('std:project:internal:description')); + $descriptions = mpull($descriptions, 'getFieldValue', 'getObjectPHID'); + } else { + $descriptions = array(); + } + $results = array(); foreach ($projs as $proj) { - if (!isset($has_cols[$proj->getPHID()])) { + $phid = $proj->getPHID(); + + if (!isset($has_cols[$phid])) { continue; } @@ -99,7 +115,7 @@ final class PhabricatorProjectDatasource ->setDisplayName($proj->getDisplayName()) ->setDisplayType($proj->getDisplayIconName()) ->setURI($proj->getURI()) - ->setPHID($proj->getPHID()) + ->setPHID($phid) ->setIcon($proj->getDisplayIconIcon()) ->setColor($proj->getColor()) ->setPriorityType('proj') @@ -111,6 +127,16 @@ final class PhabricatorProjectDatasource $proj_result->setImageURI($proj->getProfileImageURI()); + if ($is_browse) { + $proj_result->addAttribute($proj->getDisplayIconName()); + + $description = idx($descriptions, $phid); + if (strlen($description)) { + $summary = PhabricatorMarkupEngine::summarize($description); + $proj_result->addAttribute($summary); + } + } + $results[] = $proj_result; } diff --git a/src/applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php b/src/applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php index b9984efb05..026c7ed2ee 100644 --- a/src/applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php @@ -86,20 +86,24 @@ final class PhabricatorProjectLogicalOrNotDatasource $result ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) ->setIcon('fa-asterisk') - ->setColor(null); + ->setColor(null) + ->resetAttributes() + ->addAttribute(pht('Function')); if ($return_any) { $return[] = id(clone $result) ->setPHID('any('.$result->getPHID().')') ->setDisplayName(pht('In Any: %s', $result->getDisplayName())) - ->setName('any '.$result->getName()); + ->setName('any '.$result->getName()) + ->addAttribute(pht('Include results tagged with this project.')); } if ($return_not) { $return[] = id(clone $result) ->setPHID('not('.$result->getPHID().')') ->setDisplayName(pht('Not In: %s', $result->getDisplayName())) - ->setName('not '.$result->getName()); + ->setName('not '.$result->getName()) + ->addAttribute(pht('Exclude results tagged with this project.')); } } diff --git a/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php b/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php index 1c472dc474..9bb15ed180 100644 --- a/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php @@ -96,7 +96,8 @@ final class PhabricatorProjectLogicalViewerDatasource ->setName(pht('Current Viewer\'s Projects')) ->setPHID('viewerprojects()') ->setIcon('fa-asterisk') - ->setUnique(true); + ->setUnique(true) + ->addAttribute(pht('Select projects current viewer is a member of.')); } } diff --git a/src/applications/project/typeahead/PhabricatorProjectMembersDatasource.php b/src/applications/project/typeahead/PhabricatorProjectMembersDatasource.php index 0b4a33f7a2..524ced454d 100644 --- a/src/applications/project/typeahead/PhabricatorProjectMembersDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectMembersDatasource.php @@ -44,7 +44,10 @@ final class PhabricatorProjectMembersDatasource ->setColor(null) ->setPHID('members('.$result->getPHID().')') ->setDisplayName(pht('Members: %s', $result->getDisplayName())) - ->setName($result->getName().' members'); + ->setName($result->getName().' members') + ->resetAttributes() + ->addAttribute(pht('Function')) + ->addAttribute(pht('Select project members.')); } return $results; diff --git a/src/applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php b/src/applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php index d7d22f2417..d3b5e484e9 100644 --- a/src/applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php +++ b/src/applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php @@ -68,7 +68,8 @@ final class PhabricatorProjectNoProjectsDatasource ->setPHID('null()') ->setIcon('fa-ban') ->setName('null '.$name) - ->setDisplayName($name); + ->setDisplayName($name) + ->addAttribute(pht('Select results with no tags.')); } } diff --git a/src/applications/search/typeahead/PhabricatorSearchDatasource.php b/src/applications/search/typeahead/PhabricatorSearchDatasource.php index 11fb0afdf4..2a17ad01eb 100644 --- a/src/applications/search/typeahead/PhabricatorSearchDatasource.php +++ b/src/applications/search/typeahead/PhabricatorSearchDatasource.php @@ -16,14 +16,22 @@ final class PhabricatorSearchDatasource } public function getComponentDatasources() { - return array( - id(new PhabricatorPeopleDatasource())->setEnrichResults(true), + $sources = array( + new PhabricatorPeopleDatasource(), new PhabricatorProjectDatasource(), new PhabricatorApplicationDatasource(), new PhabricatorTypeaheadMonogramDatasource(), new DiffusionRepositoryDatasource(), new DiffusionSymbolDatasource(), ); + + // These results are always rendered in the full browse display mode, so + // set the browse flag on all component sources. + foreach ($sources as $source) { + $source->setIsBrowse(true); + } + + return $sources; } } diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php index 15650a33fd..569b1d088e 100644 --- a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php +++ b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php @@ -65,7 +65,8 @@ final class PhabricatorTypeaheadModularDatasourceController } $composite - ->setOffset($offset); + ->setOffset($offset) + ->setIsBrowse(true); } $results = $composite->loadResults(); @@ -142,8 +143,7 @@ final class PhabricatorTypeaheadModularDatasourceController $items = array(); foreach ($results as $result) { - $token = PhabricatorTypeaheadTokenView::newFromTypeaheadResult( - $result); + $information = $this->renderBrowseResult($result); // Disable already-selected tokens. $disabled = isset($exclude[$result->getPHID()]); @@ -167,8 +167,8 @@ final class PhabricatorTypeaheadModularDatasourceController 'class' => 'typeahead-browse-item grouped', ), array( - $token, $button, + $information, )); } @@ -350,4 +350,56 @@ final class PhabricatorTypeaheadModularDatasourceController ->appendChild($view); } + private function renderBrowseResult(PhabricatorTypeaheadResult $result) { + $class = array(); + $style = array(); + $separator = " \xC2\xB7 "; + + $class[] = 'phabricator-main-search-typeahead-result'; + + $name = phutil_tag( + 'div', + array( + 'class' => 'result-name', + ), + $result->getDisplayName()); + + $icon = $result->getIcon(); + $icon = id(new PHUIIconView())->setIcon($icon); + + $attributes = $result->getAttributes(); + $attributes = phutil_implode_html($separator, $attributes); + $attributes = array($icon, ' ', $attributes); + + $closed = $result->getClosed(); + if ($closed) { + $class[] = 'result-closed'; + $attributes = array($closed, $separator, $attributes); + } + + $attributes = phutil_tag( + 'div', + array( + 'class' => 'result-type', + ), + $attributes); + + $image = $result->getImageURI(); + if ($image) { + $style[] = 'background-image: url('.$image.');'; + $class[] = 'has-image'; + } + + return phutil_tag( + 'div', + array( + 'class' => implode(' ', $class), + 'style' => implode(' ', $style), + ), + array( + $name, + $attributes, + )); + } + } diff --git a/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php b/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php index 5726a4b6dd..306b33b497 100644 --- a/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php +++ b/src/applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php @@ -37,6 +37,7 @@ abstract class PhabricatorTypeaheadCompositeDatasource } $stack = $this->getFunctionStack(); + $is_browse = $this->getIsBrowse(); $results = array(); foreach ($this->getUsableDatasources() as $source) { @@ -70,6 +71,10 @@ abstract class PhabricatorTypeaheadCompositeDatasource $source->setLimit($offset + $limit); } + if ($is_browse) { + $source->setIsBrowse(true); + } + $source_results = $source->loadResults(); $source_results = $source->didLoadResults($source_results); $results[] = $source_results; diff --git a/src/applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php b/src/applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php index c1d1e96540..9fee4b2434 100644 --- a/src/applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php +++ b/src/applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php @@ -12,6 +12,7 @@ abstract class PhabricatorTypeaheadDatasource extends Phobject { private $limit; private $parameters = array(); private $functionStack = array(); + private $isBrowse; public function setLimit($limit) { $this->limit = $limit; @@ -71,6 +72,15 @@ abstract class PhabricatorTypeaheadDatasource extends Phobject { return idx($this->parameters, $name, $default); } + public function setIsBrowse($is_browse) { + $this->isBrowse = $is_browse; + return $this; + } + + public function getIsBrowse() { + return $this->isBrowse; + } + public function getDatasourceURI() { $uri = new PhutilURI('/typeahead/class/'.get_class($this).'/'); $uri->setQueryParams($this->parameters); @@ -199,7 +209,8 @@ abstract class PhabricatorTypeaheadDatasource extends Phobject { protected function newFunctionResult() { return id(new PhabricatorTypeaheadResult()) ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) - ->setIcon('fa-asterisk'); + ->setIcon('fa-asterisk') + ->addAttribute(pht('Function')); } public function newInvalidToken($name) { diff --git a/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php b/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php index f5c84766b7..4c5c079734 100644 --- a/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php +++ b/src/applications/typeahead/storage/PhabricatorTypeaheadResult.php @@ -17,6 +17,7 @@ final class PhabricatorTypeaheadResult extends Phobject { private $tokenType; private $unique; private $autocomplete; + private $attributes = array(); public function setIcon($icon) { $this->icon = $icon; @@ -188,4 +189,26 @@ final class PhabricatorTypeaheadResult extends Phobject { return null; } + public function getImageURI() { + return $this->imageURI; + } + + public function getClosed() { + return $this->closed; + } + + public function resetAttributes() { + $this->attributes = array(); + return $this; + } + + public function getAttributes() { + return $this->attributes; + } + + public function addAttribute($attribute) { + $this->attributes[] = $attribute; + return $this; + } + } diff --git a/webroot/rsrc/css/aphront/typeahead-browse.css b/webroot/rsrc/css/aphront/typeahead-browse.css index fd3cb8b482..625354bb71 100644 --- a/webroot/rsrc/css/aphront/typeahead-browse.css +++ b/webroot/rsrc/css/aphront/typeahead-browse.css @@ -57,10 +57,26 @@ input.typeahead-browse-input { .typeahead-browse-item button { float: right; - margin: 2px 6px; + margin: 8px 6px 0; } .typeahead-browse-item a.jx-tokenizer-token { margin-top: 1px; margin-left: 6px; } + +.typeahead-browse-item .phabricator-main-search-typeahead-result { + margin: 2px 0; + padding: 0 8px; +} + +.typeahead-browse-item .phabricator-main-search-typeahead-result.has-image { + padding-left: 48px; +} + +.typeahead-browse-item + .phabricator-main-search-typeahead-result.result-closed + .result-name { + text-decoration: line-through; + color: {$lightgreytext}; +} From 3198aa1659ae9f46d3d5adc93a0c650338810df5 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 20 Jun 2016 17:29:56 -0700 Subject: [PATCH 06/26] Allow dialogs to opt in to being resizable Summary: Ref T11034. Ref T4788. This allows you to resize the typeahead browse dialog if you want. I plan to let you resize the object selector dialog in the future. Test Plan: {F1695433} Reviewers: chad Reviewed By: chad Maniphest Tasks: T4788, T11034 Differential Revision: https://secure.phabricator.com/D16156 --- resources/celerity/map.php | 35 ++++---- ...orTypeaheadModularDatasourceController.php | 2 + src/view/AphrontDialogView.php | 35 ++++++++ webroot/rsrc/css/aphront/dialog-view.css | 18 ++++ .../rsrc/externals/javelin/lib/Workflow.js | 83 ++++++++++++++++++ webroot/rsrc/image/resize.png | Bin 0 -> 288 bytes 6 files changed, 156 insertions(+), 17 deletions(-) create mode 100644 webroot/rsrc/image/resize.png diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 3aef57ca61..43c3f83408 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,8 +7,8 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'c7fc5aec', - 'core.pkg.js' => '10275c16', + 'core.pkg.css' => 'b9e2e1e5', + 'core.pkg.js' => '80f86a0a', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', 'differential.pkg.js' => '4b7d8f19', @@ -18,7 +18,7 @@ return array( 'maniphest.pkg.js' => '949a7498', 'rsrc/css/aphront/aphront-bars.css' => '231ac33c', 'rsrc/css/aphront/dark-console.css' => 'f54bf286', - 'rsrc/css/aphront/dialog-view.css' => 'b4334e08', + 'rsrc/css/aphront/dialog-view.css' => '913c172e', 'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d', 'rsrc/css/aphront/list-filter-view.css' => '5d6f0526', 'rsrc/css/aphront/multi-column.css' => 'fd18389d', @@ -245,7 +245,7 @@ return array( 'rsrc/externals/javelin/lib/URI.js' => 'c989ade3', 'rsrc/externals/javelin/lib/Vector.js' => '2caa8fb8', 'rsrc/externals/javelin/lib/WebSocket.js' => 'e292eaf4', - 'rsrc/externals/javelin/lib/Workflow.js' => '0eb34d1d', + 'rsrc/externals/javelin/lib/Workflow.js' => '1e911d0f', 'rsrc/externals/javelin/lib/__tests__/Cookie.js' => '5ed109e8', 'rsrc/externals/javelin/lib/__tests__/DOM.js' => 'c984504b', 'rsrc/externals/javelin/lib/__tests__/JSON.js' => '837a7d68', @@ -339,6 +339,7 @@ return array( 'rsrc/image/people/washington.png' => '40dd301c', 'rsrc/image/phrequent_active.png' => 'a466a8ed', 'rsrc/image/phrequent_inactive.png' => 'bfc15a69', + 'rsrc/image/resize.png' => 'fd476de4', 'rsrc/image/sprite-login-X2.png' => 'e3991e37', 'rsrc/image/sprite-login.png' => '03d5af29', 'rsrc/image/sprite-menu-X2.png' => 'cfd8fca5', @@ -530,7 +531,7 @@ return array( 'almanac-css' => 'dbb9b3af', 'aphront-bars' => '231ac33c', 'aphront-dark-console-css' => 'f54bf286', - 'aphront-dialog-view-css' => 'b4334e08', + 'aphront-dialog-view-css' => '913c172e', 'aphront-list-filter-view-css' => '5d6f0526', 'aphront-multi-column-view-css' => 'fd18389d', 'aphront-panel-view-css' => '8427b78d', @@ -749,7 +750,7 @@ return array( 'javelin-workboard-card' => 'c587b80f', 'javelin-workboard-column' => 'bae58312', 'javelin-workboard-controller' => '55baf5ed', - 'javelin-workflow' => '0eb34d1d', + 'javelin-workflow' => '1e911d0f', 'lightbox-attachment-css' => '7acac05d', 'maniphest-batch-editor' => 'b0f0b6d5', 'maniphest-report-css' => '9b9580b7', @@ -981,17 +982,6 @@ return array( 'javelin-dom', 'javelin-router', ), - '0eb34d1d' => array( - 'javelin-stratcom', - 'javelin-request', - 'javelin-dom', - 'javelin-vector', - 'javelin-install', - 'javelin-util', - 'javelin-mask', - 'javelin-uri', - 'javelin-routable', - ), '0f764c35' => array( 'javelin-install', 'javelin-util', @@ -1071,6 +1061,17 @@ return array( 'javelin-dom', 'javelin-reactor-dom', ), + '1e911d0f' => array( + 'javelin-stratcom', + 'javelin-request', + 'javelin-dom', + 'javelin-vector', + 'javelin-install', + 'javelin-util', + 'javelin-mask', + 'javelin-uri', + 'javelin-routable', + ), '21ba5861' => array( 'javelin-behavior', 'javelin-dom', diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php index 569b1d088e..fd1473aee9 100644 --- a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php +++ b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php @@ -250,6 +250,8 @@ final class PhabricatorTypeaheadModularDatasourceController ->setRenderDialogAsDiv(true) ->setTitle($source->getBrowseTitle()) ->appendChild($browser) + ->setResizeX(true) + ->setResizeY($frame_id) ->addFooter($function_help) ->addCancelButton('/', pht('Close')); } diff --git a/src/view/AphrontDialogView.php b/src/view/AphrontDialogView.php index 218839ef6e..4616393813 100644 --- a/src/view/AphrontDialogView.php +++ b/src/view/AphrontDialogView.php @@ -24,6 +24,8 @@ final class AphrontDialogView private $flush; private $validationException; private $objectList; + private $resizeX; + private $resizeY; const WIDTH_DEFAULT = 'default'; @@ -72,6 +74,24 @@ final class AphrontDialogView return $this->shortTitle; } + public function setResizeY($resize_y) { + $this->resizeY = $resize_y; + return $this; + } + + public function getResizeY() { + return $this->resizeY; + } + + public function setResizeX($resize_x) { + $this->resizeX = $resize_x; + return $this; + } + + public function getResizeX() { + return $this->resizeX; + } + public function addSubmitButton($text = null) { if (!$text) { $text = pht('Okay'); @@ -347,6 +367,20 @@ final class AphrontDialogView $this->footers); } + $resize = null; + if ($this->resizeX || $this->resizeY) { + $resize = javelin_tag( + 'div', + array( + 'class' => 'aphront-dialog-resize', + 'sigil' => 'jx-dialog-resize', + 'meta' => array( + 'resizeX' => $this->resizeX, + 'resizeY' => $this->resizeY, + ), + )); + } + $tail = null; if ($buttons || $footer) { $tail = phutil_tag( @@ -357,6 +391,7 @@ final class AphrontDialogView array( $buttons, $footer, + $resize, )); } diff --git a/webroot/rsrc/css/aphront/dialog-view.css b/webroot/rsrc/css/aphront/dialog-view.css index 8909368beb..7328cda5ea 100644 --- a/webroot/rsrc/css/aphront/dialog-view.css +++ b/webroot/rsrc/css/aphront/dialog-view.css @@ -48,6 +48,7 @@ .aphront-dialog-tail { border: none; + position: relative; background: {$lightgreybackground}; padding: 8px 16px; border-top: 1px solid {$thinblueborder}; @@ -55,6 +56,23 @@ border-bottom-right-radius: 3px; } +.device .aphront-dialog-resize { + /* No resizing on devices. */ + display: none; +} + +.aphront-dialog-resize { + position: absolute; + right: -4px; + bottom: -4px; + width: 18px; + height: 18px; + background-image: url(/rsrc/image/resize.png); + background-size: 100%; + cursor: nwse-resize; + pointer-events: all; +} + .aphront-dialog-foot { padding: 6px 0; float: left; diff --git a/webroot/rsrc/externals/javelin/lib/Workflow.js b/webroot/rsrc/externals/javelin/lib/Workflow.js index 2ee7ef1ff0..7f0818d4e0 100644 --- a/webroot/rsrc/externals/javelin/lib/Workflow.js +++ b/webroot/rsrc/externals/javelin/lib/Workflow.js @@ -157,6 +157,80 @@ JX.install('Workflow', { _getActiveWorkflow : function() { var stack = JX.Workflow._stack; return stack[stack.length - 1]; + }, + + _onresizestart: function(e) { + var self = JX.Workflow; + if (self._resizing) { + return; + } + + var workflow = self._getActiveWorkflow(); + if (!workflow) { + return; + } + + e.kill(); + + var form = JX.DOM.find(workflow._root, 'div', 'jx-dialog'); + var resize = e.getNodeData('jx-dialog-resize'); + var node_y = JX.$(resize.resizeY); + + var dim = JX.Vector.getDim(form); + dim.y = JX.Vector.getDim(node_y).y; + + if (!form._minimumSize) { + form._minimumSize = dim; + } + + self._resizing = { + min: form._minimumSize, + form: form, + startPos: JX.$V(e), + startDim: dim, + resizeY: node_y, + resizeX: resize.resizeX + }; + }, + + _onmousemove: function(e) { + var self = JX.Workflow; + if (!self._resizing) { + return; + } + + var spec = self._resizing; + var form = spec.form; + var min = spec.min; + + var delta = JX.$V(e).add(-spec.startPos.x, -spec.startPos.y); + var src_dim = spec.startDim; + var dst_dim = JX.$V(src_dim.x + delta.x, src_dim.y + delta.y); + + if (dst_dim.x < min.x) { + dst_dim.x = min.x; + } + + if (dst_dim.y < min.y) { + dst_dim.y = min.y; + } + + if (spec.resizeX) { + JX.$V(dst_dim.x, null).setDim(form); + } + + if (spec.resizeY) { + JX.$V(null, dst_dim.y).setDim(spec.resizeY); + } + }, + + _onmouseup: function() { + var self = JX.Workflow; + if (!self._resizing) { + return; + } + + self._resizing = false; } }, @@ -220,6 +294,12 @@ JX.install('Workflow', { [], JX.Workflow._onsyntheticsubmit); + JX.DOM.listen( + this._root, + 'mousedown', + 'jx-dialog-resize', + JX.Workflow._onresizestart); + // Note that even in the presence of a content frame, we're doing // everything here at top level: dialogs are fully modal and cover // the entire window. @@ -413,6 +493,9 @@ JX.install('Workflow', { } JX.Stratcom.listen('keydown', null, close_dialog_when_user_presses_escape); + + JX.Stratcom.listen('mousemove', null, JX.Workflow._onmousemove); + JX.Stratcom.listen('mouseup', null, JX.Workflow._onmouseup); } }); diff --git a/webroot/rsrc/image/resize.png b/webroot/rsrc/image/resize.png new file mode 100644 index 0000000000000000000000000000000000000000..da44a55cd1ad40feda04da594506358e0882a0c5 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%9rAQ>45_&F=K4XdW&<9!2d4V3Z|L2gTp{&i+sv;9U1f7U z|6e#D#L?mPd!od}BWJ|@9mTri-uss^zdCrpkyVYCUD3cmfQy;&s=?`OIcBHiT@GRr zrZ05dK65GfOBi}IdcNMs>(Oku`a<1gp3KB+*{|5=noP~Sd%gLlS!QjW$L)}$2g&wK zpG8}acpRT^lgOvQ-Lqxt6VA_!l?VUGRA*WX3cJrUh$%19lC@FG_Wuav k320yvS-`;fSoZ(}6O)kJk2OqZfxcnzboFyt=akR{0J+d>jQ{`u literal 0 HcmV?d00001 From 56d3197fe0da50e4a4ddb3d6bcf323386644e2ff Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 20 Jun 2016 17:49:38 -0700 Subject: [PATCH 07/26] Fold task-relationship actions into an accordion dropdown Summary: Ref T11179. Alternative to D16152. I think this turned out a bit better than the other one did. Currently, we render two copies of the menu (one for mobile, one for desktop). A big chunk of this is sharing the nodes instead: when you open the mobile dropdown menu, it steals the nodes from the document. When you close it, it puts them back. Magic! Sneaky! Test Plan: {F1695499} {F1695500} Reviewers: chad Reviewed By: chad Maniphest Tasks: T11179 Differential Revision: https://secure.phabricator.com/D16157 --- resources/celerity/map.php | 49 ++++---- .../base/controller/PhabricatorController.php | 5 +- .../ManiphestTaskDetailController.php | 50 ++++---- src/view/layout/PhabricatorActionListView.php | 13 ++- src/view/layout/PhabricatorActionView.php | 110 +++++++++++++++++- src/view/phui/PHUIButtonView.php | 12 ++ src/view/phui/PHUIHeaderView.php | 18 ++- src/view/phui/PHUITimelineEventView.php | 4 +- src/view/phui/PHUITwoColumnView.php | 2 +- webroot/rsrc/css/phui/phui-button.css | 36 ++++++ .../js/phui/behavior-phui-dropdown-menu.js | 29 ++++- webroot/rsrc/js/phui/behavior-phui-submenu.js | 44 +++++++ webroot/rsrc/js/phuix/PHUIXDropdownMenu.js | 4 +- 13 files changed, 318 insertions(+), 58 deletions(-) create mode 100644 webroot/rsrc/js/phui/behavior-phui-submenu.js diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 43c3f83408..07c9873003 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,8 +7,8 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'b9e2e1e5', - 'core.pkg.js' => '80f86a0a', + 'core.pkg.css' => 'f577cd20', + 'core.pkg.js' => 'f2139810', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', 'differential.pkg.js' => '4b7d8f19', @@ -124,7 +124,7 @@ return array( 'rsrc/css/phui/phui-badge.css' => '3baef8db', 'rsrc/css/phui/phui-big-info-view.css' => 'bd903741', 'rsrc/css/phui/phui-box.css' => '5c8387cf', - 'rsrc/css/phui/phui-button.css' => 'a64a8de6', + 'rsrc/css/phui/phui-button.css' => 'e266e0bc', 'rsrc/css/phui/phui-chart.css' => '6bf6f78e', 'rsrc/css/phui/phui-crumbs-view.css' => '6b813619', 'rsrc/css/phui/phui-curtain-view.css' => '7148ae25', @@ -516,14 +516,15 @@ return array( 'rsrc/js/core/behavior-watch-anchor.js' => '9f36c42d', 'rsrc/js/core/behavior-workflow.js' => '0a3f3021', 'rsrc/js/core/phtize.js' => 'd254d646', - 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => '54733475', + 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => '1aa4c968', 'rsrc/js/phui/behavior-phui-file-upload.js' => 'b003d4fb', 'rsrc/js/phui/behavior-phui-object-box-tabs.js' => '2bfa2836', 'rsrc/js/phui/behavior-phui-profile-menu.js' => '12884df9', + 'rsrc/js/phui/behavior-phui-submenu.js' => 'a6f7a73b', 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', 'rsrc/js/phuix/PHUIXActionView.js' => '8cf6d262', 'rsrc/js/phuix/PHUIXAutocomplete.js' => '9196fb06', - 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca', + 'rsrc/js/phuix/PHUIXDropdownMenu.js' => '82e270da', 'rsrc/js/phuix/PHUIXFormControl.js' => 'e15869a8', 'rsrc/js/phuix/PHUIXIconView.js' => 'bff6884b', ), @@ -669,11 +670,12 @@ return array( 'javelin-behavior-phabricator-watch-anchor' => '9f36c42d', 'javelin-behavior-pholio-mock-edit' => 'bee502c8', 'javelin-behavior-pholio-mock-view' => 'fbe497e7', - 'javelin-behavior-phui-dropdown-menu' => '54733475', + 'javelin-behavior-phui-dropdown-menu' => '1aa4c968', 'javelin-behavior-phui-file-upload' => 'b003d4fb', 'javelin-behavior-phui-hovercards' => 'bcaccd64', 'javelin-behavior-phui-object-box-tabs' => '2bfa2836', 'javelin-behavior-phui-profile-menu' => '12884df9', + 'javelin-behavior-phui-submenu' => 'a6f7a73b', 'javelin-behavior-policy-control' => 'd0c516d5', 'javelin-behavior-policy-rule-editor' => '5e9f347c', 'javelin-behavior-project-boards' => '14a1faae', @@ -822,7 +824,7 @@ return array( 'phui-badge-view-css' => '3baef8db', 'phui-big-info-view-css' => 'bd903741', 'phui-box-css' => '5c8387cf', - 'phui-button-css' => 'a64a8de6', + 'phui-button-css' => 'e266e0bc', 'phui-calendar-css' => 'ccabe893', 'phui-calendar-day-css' => 'd1cf6f93', 'phui-calendar-list-css' => '56e6381a', @@ -870,7 +872,7 @@ return array( 'phuix-action-list-view' => 'b5c256b8', 'phuix-action-view' => '8cf6d262', 'phuix-autocomplete' => '9196fb06', - 'phuix-dropdown-menu' => 'bd4c8dca', + 'phuix-dropdown-menu' => '82e270da', 'phuix-form-control-view' => 'e15869a8', 'phuix-icon-view' => 'bff6884b', 'policy-css' => '957ea14c', @@ -1024,6 +1026,12 @@ return array( 'javelin-workflow', 'javelin-workboard-controller', ), + '1aa4c968' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phuix-dropdown-menu', + ), '1ad0a787' => array( 'javelin-install', 'javelin-reactor', @@ -1275,12 +1283,6 @@ return array( 'javelin-leader', 'javelin-json', ), - 54733475 => array( - 'javelin-behavior', - 'javelin-stratcom', - 'javelin-dom', - 'phuix-dropdown-menu', - ), '54b612ba' => array( 'javelin-color', 'javelin-install', @@ -1529,6 +1531,13 @@ return array( 'javelin-vector', 'javelin-stratcom', ), + '82e270da' => array( + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-vector', + 'javelin-stratcom', + ), '834a1173' => array( 'javelin-behavior', 'javelin-scrollbar', @@ -1693,6 +1702,11 @@ return array( 'javelin-uri', 'phabricator-notification', ), + 'a6f7a73b' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), 'a80d0378' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1846,13 +1860,6 @@ return array( 'javelin-vector', 'phui-hovercard', ), - 'bd4c8dca' => array( - 'javelin-install', - 'javelin-util', - 'javelin-dom', - 'javelin-vector', - 'javelin-stratcom', - ), 'bdaf4d04' => array( 'javelin-behavior', 'javelin-dom', diff --git a/src/applications/base/controller/PhabricatorController.php b/src/applications/base/controller/PhabricatorController.php index 08966f29a5..0cb8182776 100644 --- a/src/applications/base/controller/PhabricatorController.php +++ b/src/applications/base/controller/PhabricatorController.php @@ -474,8 +474,11 @@ abstract class PhabricatorController extends AphrontController { public function newCurtainView($object) { $viewer = $this->getViewer(); + $action_id = celerity_generate_unique_node_id(); + $action_list = id(new PhabricatorActionListView()) - ->setViewer($viewer); + ->setViewer($viewer) + ->setID($action_id); // NOTE: Applications (objects of class PhabricatorApplication) can't // currently be set here, although they don't need any of the extensions diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php index 1007672e23..2195089d24 100644 --- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php +++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php @@ -166,15 +166,6 @@ final class ManiphestTaskDetailController extends ManiphestController { ->setDisabled(!$can_edit) ->setWorkflow(!$can_edit)); - $curtain->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Merge Duplicates In')) - ->setHref("/search/attach/{$phid}/TASK/merge/") - ->setWorkflow(true) - ->setIcon('fa-compress') - ->setDisabled(!$can_edit) - ->setWorkflow(true)); - $edit_config = $edit_engine->loadDefaultEditConfiguration(); $can_create = (bool)$edit_config; @@ -195,23 +186,36 @@ final class ManiphestTaskDetailController extends ManiphestController { $edit_uri = $this->getApplicationURI($edit_uri); } - $curtain->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Create Subtask')) - ->setHref($edit_uri) - ->setIcon('fa-level-down') - ->setDisabled(!$can_create) - ->setWorkflow(!$can_create)); + $task_submenu = array(); + + $task_submenu[] = id(new PhabricatorActionView()) + ->setName(pht('Create Subtask')) + ->setHref($edit_uri) + ->setIcon('fa-level-down') + ->setDisabled(!$can_create) + ->setWorkflow(!$can_create); + + $task_submenu[] = id(new PhabricatorActionView()) + ->setName(pht('Edit Blocking Tasks')) + ->setHref("/search/attach/{$phid}/TASK/blocks/") + ->setWorkflow(true) + ->setIcon('fa-link') + ->setDisabled(!$can_edit) + ->setWorkflow(true); + + $task_submenu[] = id(new PhabricatorActionView()) + ->setName(pht('Merge Duplicates In')) + ->setHref("/search/attach/{$phid}/TASK/merge/") + ->setWorkflow(true) + ->setIcon('fa-compress') + ->setDisabled(!$can_edit) + ->setWorkflow(true); $curtain->addAction( id(new PhabricatorActionView()) - ->setName(pht('Edit Blocking Tasks')) - ->setHref("/search/attach/{$phid}/TASK/blocks/") - ->setWorkflow(true) - ->setIcon('fa-link') - ->setDisabled(!$can_edit) - ->setWorkflow(true)); - + ->setName(pht('Edit Related Tasks...')) + ->setIcon('fa-anchor') + ->setSubmenu($task_submenu)); $owner_phid = $task->getOwnerPHID(); $author_phid = $task->getAuthorPHID(); diff --git a/src/view/layout/PhabricatorActionListView.php b/src/view/layout/PhabricatorActionListView.php index 5c3facbf42..fd18e7f429 100644 --- a/src/view/layout/PhabricatorActionListView.php +++ b/src/view/layout/PhabricatorActionListView.php @@ -21,6 +21,10 @@ final class PhabricatorActionListView extends AphrontView { return $this; } + public function getID() { + return $this->id; + } + public function render() { $viewer = $this->getViewer(); @@ -44,13 +48,20 @@ final class PhabricatorActionListView extends AphrontView { require_celerity_resource('phabricator-action-list-view-css'); + $items = array(); + foreach ($actions as $action) { + foreach ($action->getItems() as $item) { + $items[] = $item; + } + } + return phutil_tag( 'ul', array( 'class' => 'phabricator-action-list-view', 'id' => $this->id, ), - $actions); + $items); } public function getDropdownMenuMetadata() { diff --git a/src/view/layout/PhabricatorActionView.php b/src/view/layout/PhabricatorActionView.php index 3efa32071d..a936b36e47 100644 --- a/src/view/layout/PhabricatorActionView.php +++ b/src/view/layout/PhabricatorActionView.php @@ -14,6 +14,10 @@ final class PhabricatorActionView extends AphrontView { private $metadata; private $selected; private $openInNewWindow; + private $submenu = array(); + private $hidden; + private $depth; + private $id; public function setSelected($selected) { $this->selected = $selected; @@ -95,7 +99,60 @@ final class PhabricatorActionView extends AphrontView { return $this->openInNewWindow; } + public function getID() { + if (!$this->id) { + $this->id = celerity_generate_unique_node_id(); + } + return $this->id; + } + + public function setSubmenu(array $submenu) { + $this->submenu = $submenu; + + if (!$this->getHref()) { + $this->setHref('#'); + } + + return $this; + } + + public function getItems($depth = 0) { + $items = array(); + + $items[] = $this; + foreach ($this->submenu as $action) { + foreach ($action->getItems($depth + 1) as $item) { + $item + ->setHidden(true) + ->setDepth($depth + 1); + + $items[] = $item; + } + } + + return $items; + } + + public function setHidden($hidden) { + $this->hidden = $hidden; + return $this; + } + + public function getHidden() { + return $this->hidden; + } + + public function setDepth($depth) { + $this->depth = $depth; + return $this; + } + + public function getDepth() { + return $this->depth; + } + public function render() { + $caret_id = celerity_generate_unique_node_id(); $icon = null; if ($this->icon) { @@ -155,6 +212,18 @@ final class PhabricatorActionView extends AphrontView { $target = null; } + if ($this->submenu) { + $caret = javelin_tag( + 'span', + array( + 'class' => 'caret-right', + 'id' => $caret_id, + ), + ''); + } else { + $caret = null; + } + $item = javelin_tag( 'a', array( @@ -164,7 +233,7 @@ final class PhabricatorActionView extends AphrontView { 'sigil' => $sigils, 'meta' => $this->metadata, ), - array($icon, $this->name)); + array($icon, $this->name, $caret)); } } else { $item = phutil_tag( @@ -190,10 +259,47 @@ final class PhabricatorActionView extends AphrontView { $classes[] = 'phabricator-action-view-selected'; } - return phutil_tag( + if ($this->submenu) { + $classes[] = 'phabricator-action-view-submenu'; + } + + $style = array(); + + if ($this->hidden) { + $style[] = 'display: none;'; + } + + if ($this->depth) { + $indent = ($this->depth * 16); + $style[] = "margin-left: {$indent}px;"; + } + + $sigil = null; + $meta = null; + + if ($this->submenu) { + Javelin::initBehavior('phui-submenu'); + $sigil = 'phui-submenu'; + + $item_ids = array(); + foreach ($this->submenu as $subitem) { + $item_ids[] = $subitem->getID(); + } + + $meta = array( + 'itemIDs' => $item_ids, + 'caretID' => $caret_id, + ); + } + + return javelin_tag( 'li', array( + 'id' => $this->getID(), 'class' => implode(' ', $classes), + 'style' => implode(' ', $style), + 'sigil' => $sigil, + 'meta' => $meta, ), $item); } diff --git a/src/view/phui/PHUIButtonView.php b/src/view/phui/PHUIButtonView.php index f9266a170a..bda7723ef1 100644 --- a/src/view/phui/PHUIButtonView.php +++ b/src/view/phui/PHUIButtonView.php @@ -110,6 +110,18 @@ final class PHUIButtonView extends AphrontTagView { return $this; } + public function setDropdownMenuID($id) { + Javelin::initBehavior('phui-dropdown-menu'); + + $this->addSigil('phui-dropdown-menu'); + $this->setMetadata( + array( + 'menuID' => $id, + )); + + return $this; + } + protected function getTagAttributes() { require_celerity_resource('phui-button-css'); diff --git a/src/view/phui/PHUIHeaderView.php b/src/view/phui/PHUIHeaderView.php index 8111944c4d..e5e834bef5 100644 --- a/src/view/phui/PHUIHeaderView.php +++ b/src/view/phui/PHUIHeaderView.php @@ -24,6 +24,7 @@ final class PHUIHeaderView extends AphrontTagView { private $badges = array(); private $href; private $actionList; + private $actionListID; public function setHeader($header) { $this->header = $header; @@ -90,6 +91,11 @@ final class PHUIHeaderView extends AphrontTagView { return $this; } + public function setActionListID($action_list_id) { + $this->actionListID = $action_list_id; + return $this; + } + public function setPolicyObject(PhabricatorPolicyInterface $object) { $this->policyObject = $object; return $this; @@ -189,14 +195,20 @@ final class PHUIHeaderView extends AphrontTagView { protected function getTagContent() { - if ($this->actionList) { + if ($this->actionList || $this->actionListID) { $action_button = id(new PHUIButtonView()) ->setTag('a') ->setText(pht('Actions')) ->setHref('#') ->setIcon('fa-bars') - ->addClass('phui-mobile-menu') - ->setDropdownMenu($this->actionList); + ->addClass('phui-mobile-menu'); + + if ($this->actionList) { + $action_button->setDropdownMenu($this->actionList); + } else if ($this->actionListID) { + $action_button->setDropdownMenuID($this->actionListID); + } + $this->addActionLink($action_button); } diff --git a/src/view/phui/PHUITimelineEventView.php b/src/view/phui/PHUITimelineEventView.php index 08b6cc2aaf..87fee5cfa6 100644 --- a/src/view/phui/PHUITimelineEventView.php +++ b/src/view/phui/PHUITimelineEventView.php @@ -327,9 +327,7 @@ final class PHUITimelineEventView extends AphrontView { 'sigil' => $sigil, 'aria-haspopup' => 'true', 'aria-expanded' => 'false', - 'meta' => array( - 'items' => hsprintf('%s', $action_list), - ), + 'meta' => $action_list->getDropdownMenuMetadata(), ), array( $aural, diff --git a/src/view/phui/PHUITwoColumnView.php b/src/view/phui/PHUITwoColumnView.php index 819e726309..4ada03240d 100644 --- a/src/view/phui/PHUITwoColumnView.php +++ b/src/view/phui/PHUITwoColumnView.php @@ -114,7 +114,7 @@ final class PHUITwoColumnView extends AphrontTagView { $curtain = $this->getCurtain(); if ($curtain) { $action_list = $curtain->getActionList(); - $this->header->setActionList($action_list); + $this->header->setActionListID($action_list->getID()); } $header = phutil_tag_div( diff --git a/webroot/rsrc/css/phui/phui-button.css b/webroot/rsrc/css/phui/phui-button.css index 0e7cfd3ecc..1566585919 100644 --- a/webroot/rsrc/css/phui/phui-button.css +++ b/webroot/rsrc/css/phui/phui-button.css @@ -264,6 +264,42 @@ a.policy-control .caret { border-top-color: #000; } +.phabricator-action-view-submenu .caret-right { + float: right; + margin-top: 4px; + margin-right: 6px; + border-left-color: {$lightgreytext}; +} + +.phabricator-action-view-submenu .caret { + float: right; + margin-top: 5px; + margin-right: 4px; + border-top: 7px solid {$lightgreytext}; +} + +.phabricator-action-view-submenu.phui-submenu-open { + background: {$greybackground}; +} + +.phui-submenu-animate { + animation: phui-submenu-summon 0.25s; +} + +@keyframes phui-submenu-summon { + 0% { + color: {$lightgreytext}; + margin-left: 0; + transform: rotate(12deg); + } + 60% { + margin-left: 24px; + transform: rotate(-5deg); + margin-top: 18px; + } +} + + /* Icons */ .button.has-icon { position: relative; diff --git a/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js b/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js index d841c87670..4bde14a307 100644 --- a/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js +++ b/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js @@ -16,17 +16,42 @@ JX.behavior('phui-dropdown-menu', function() { e.kill(); - var list = JX.$H(data.items).getFragment().firstChild; + var list; + var placeholder; + if (data.items) { + list = JX.$H(data.items).getFragment().firstChild; + } else { + list = JX.$(data.menuID); + placeholder = JX.$N('span'); + } var icon = e.getNode('phui-dropdown-menu'); data.menu = new JX.PHUIXDropdownMenu(icon); - data.menu.setContent(list); + + data.menu.listen('open', function() { + if (placeholder) { + JX.DOM.replace(list, placeholder); + } + data.menu.setContent(list); + }); + + data.menu.listen('close', function() { + if (placeholder) { + JX.DOM.replace(placeholder, list); + } + }); + data.menu.open(); JX.DOM.listen(list, 'click', 'tag:a', function(e) { if (!e.isNormalClick()) { return; } + + if (JX.Stratcom.pass()) { + return; + } + data.menu.close(); }); }); diff --git a/webroot/rsrc/js/phui/behavior-phui-submenu.js b/webroot/rsrc/js/phui/behavior-phui-submenu.js new file mode 100644 index 0000000000..b391174052 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-submenu.js @@ -0,0 +1,44 @@ +/** + * @provides javelin-behavior-phui-submenu + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('phui-submenu', function() { + + JX.Stratcom.listen('click', 'phui-submenu', function(e) { + if (!e.isNormalClick()) { + return; + } + + var node = e.getNode('phui-submenu'); + var data = e.getNodeData('phui-submenu'); + + e.kill(); + + data.open = !data.open; + + for (var ii = 0; ii < data.itemIDs.length; ii++) { + var id = data.itemIDs[ii]; + var item = JX.$(id); + if (data.open) { + JX.DOM.show(item); + } else { + JX.DOM.hide(item); + } + + // Add a class so we can animate zany effects. + JX.DOM.alterClass(item, 'phui-submenu-animate', data.open); + } + + JX.DOM.alterClass(node, 'phui-submenu-open', data.open); + + // Toggle the caret from ">" to "V" when opening the menu, and back again + // when closing it. + var caret = JX.$(data.caretID); + JX.DOM.alterClass(caret, 'caret', data.open); + JX.DOM.alterClass(caret, 'caret-right', !data.open); + }); + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js index 3c93af21d2..d9fd1877b8 100644 --- a/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js +++ b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js @@ -42,7 +42,7 @@ JX.install('PHUIXDropdownMenu', { JX.Stratcom.listen('keydown', null, JX.bind(this, this._onkey)); }, - events: ['open'], + events: ['open', 'close'], properties: { width: null, @@ -83,6 +83,8 @@ JX.install('PHUIXDropdownMenu', { this._open = false; this._hide(); + this.invoke('close'); + return this; }, From ee77c5c8f16351a691bbfac75a912efdf85c0b60 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Tue, 21 Jun 2016 12:54:35 -0700 Subject: [PATCH 08/26] Clean up menu folding in action list Summary: Just removing the animation for now, can't find anything decent, I think that the issue is the animation is applying to all items in the list, and not just as a list as a single block. That is, I'd like to slide down all three at one. Any animation that slides them down when attached to each item makes them overlap at the first frame and it's a little distracting. Not a big deal to leave this out for now. Whatever we come up with should likely be applied to phuix-dropdown as well. Test Plan: Clicky Clicky. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D16159 --- resources/celerity/map.php | 6 +++--- webroot/rsrc/css/phui/phui-button.css | 28 +++++++++------------------ 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 07c9873003..2944634334 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'f577cd20', + 'core.pkg.css' => '2168daaf', 'core.pkg.js' => 'f2139810', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', @@ -124,7 +124,7 @@ return array( 'rsrc/css/phui/phui-badge.css' => '3baef8db', 'rsrc/css/phui/phui-big-info-view.css' => 'bd903741', 'rsrc/css/phui/phui-box.css' => '5c8387cf', - 'rsrc/css/phui/phui-button.css' => 'e266e0bc', + 'rsrc/css/phui/phui-button.css' => '4a5fbe3d', 'rsrc/css/phui/phui-chart.css' => '6bf6f78e', 'rsrc/css/phui/phui-crumbs-view.css' => '6b813619', 'rsrc/css/phui/phui-curtain-view.css' => '7148ae25', @@ -824,7 +824,7 @@ return array( 'phui-badge-view-css' => '3baef8db', 'phui-big-info-view-css' => 'bd903741', 'phui-box-css' => '5c8387cf', - 'phui-button-css' => 'e266e0bc', + 'phui-button-css' => '4a5fbe3d', 'phui-calendar-css' => 'ccabe893', 'phui-calendar-day-css' => 'd1cf6f93', 'phui-calendar-list-css' => '56e6381a', diff --git a/webroot/rsrc/css/phui/phui-button.css b/webroot/rsrc/css/phui/phui-button.css index 1566585919..51807fa48e 100644 --- a/webroot/rsrc/css/phui/phui-button.css +++ b/webroot/rsrc/css/phui/phui-button.css @@ -268,7 +268,7 @@ a.policy-control .caret { float: right; margin-top: 4px; margin-right: 6px; - border-left-color: {$lightgreytext}; + border-left-color: {$alphablue}; } .phabricator-action-view-submenu .caret { @@ -278,28 +278,18 @@ a.policy-control .caret { border-top: 7px solid {$lightgreytext}; } -.phabricator-action-view-submenu.phui-submenu-open { - background: {$greybackground}; +.phabricator-action-list-view .phabricator-action-view-submenu.phui-submenu-open + .phabricator-action-view-item { + background-color: rgba({$alphablue}, 0.07); + color: {$sky}; + border-radius: 3px; } -.phui-submenu-animate { - animation: phui-submenu-summon 0.25s; +.phabricator-action-list-view .phabricator-action-view-submenu.phui-submenu-open + .phabricator-action-view-item .phui-icon-view { + color: {$sky}; } -@keyframes phui-submenu-summon { - 0% { - color: {$lightgreytext}; - margin-left: 0; - transform: rotate(12deg); - } - 60% { - margin-left: 24px; - transform: rotate(-5deg); - margin-top: 18px; - } -} - - /* Icons */ .button.has-icon { position: relative; From f38730aab88ead84c7c0df924f5923e0935ef91d Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 21 Jun 2016 09:19:59 -0700 Subject: [PATCH 09/26] Allow Herald text list fields to use "Exists" / "Does not exist" conditions Summary: This makes it more natural to write Herald rules about commits that appear on any or no branches. Test Plan: Wrote a commit rule for commits on any branch, ran it with `bin/repository reparse --herald `, saw expected results in web UI. Reviewers: chad Reviewed By: chad Differential Revision: https://secure.phabricator.com/D16158 --- src/applications/herald/field/HeraldField.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/applications/herald/field/HeraldField.php b/src/applications/herald/field/HeraldField.php index 98d6d8ffc4..2abed0ff1d 100644 --- a/src/applications/herald/field/HeraldField.php +++ b/src/applications/herald/field/HeraldField.php @@ -80,6 +80,8 @@ abstract class HeraldField extends Phobject { HeraldAdapter::CONDITION_NOT_CONTAINS, HeraldAdapter::CONDITION_REGEXP, HeraldAdapter::CONDITION_NOT_REGEXP, + HeraldAdapter::CONDITION_EXISTS, + HeraldAdapter::CONDITION_NOT_EXISTS, ); case self::STANDARD_TEXT_MAP: return array( @@ -107,7 +109,13 @@ abstract class HeraldField extends Phobject { case self::STANDARD_TEXT: case self::STANDARD_TEXT_LIST: case self::STANDARD_TEXT_MAP: - return new HeraldTextFieldValue(); + switch ($condition) { + case HeraldAdapter::CONDITION_EXISTS: + case HeraldAdapter::CONDITION_NOT_EXISTS: + return new HeraldEmptyFieldValue(); + default: + return new HeraldTextFieldValue(); + } case self::STANDARD_PHID: case self::STANDARD_PHID_NULLABLE: case self::STANDARD_PHID_LIST: From 921a5b49414788418523cfb558a7ee0e3560b95a Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 21 Jun 2016 15:11:04 -0700 Subject: [PATCH 10/26] Push typehead browse result selector button down one
Summary: Fixes T11190. The div with all the stuff in it was sometimes ending up on top of the "select" button, making it unclickable. Test Plan: Clicked "select" in several browsers. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11190 Differential Revision: https://secure.phabricator.com/D16160 --- ...icatorTypeaheadModularDatasourceController.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php index fd1473aee9..a7c8381bfd 100644 --- a/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php +++ b/src/applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php @@ -143,8 +143,6 @@ final class PhabricatorTypeaheadModularDatasourceController $items = array(); foreach ($results as $result) { - $information = $this->renderBrowseResult($result); - // Disable already-selected tokens. $disabled = isset($exclude[$result->getPHID()]); @@ -161,15 +159,14 @@ final class PhabricatorTypeaheadModularDatasourceController ), pht('Select')); + $information = $this->renderBrowseResult($result, $button); + $items[] = phutil_tag( 'div', array( 'class' => 'typeahead-browse-item grouped', ), - array( - $button, - $information, - )); + $information); } $markup = array( @@ -352,7 +349,10 @@ final class PhabricatorTypeaheadModularDatasourceController ->appendChild($view); } - private function renderBrowseResult(PhabricatorTypeaheadResult $result) { + private function renderBrowseResult( + PhabricatorTypeaheadResult $result, + $button) { + $class = array(); $style = array(); $separator = " \xC2\xB7 "; @@ -399,6 +399,7 @@ final class PhabricatorTypeaheadModularDatasourceController 'style' => implode(' ', $style), ), array( + $button, $name, $attributes, )); From 83c4701231512587b259cf7dfed0f849076abddb Mon Sep 17 00:00:00 2001 From: Chad Little Date: Wed, 22 Jun 2016 14:00:37 +0000 Subject: [PATCH 11/26] Check CAN_VIEW and CAN_EDIT at SearchAttachController Summary: Fixes T11193. Assume this is the correct place to check for permissions before attaching edges. Test Plan: Create a task and set edit policy to Admins, log into test account. Try to Edit Subtasks, Merge Duplicates, Attach a Diff, or Attach a Mock, get a Policy Dialog explaing why. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T11193 Differential Revision: https://secure.phabricator.com/D16161 --- .../maniphest/controller/ManiphestTaskDetailController.php | 2 -- .../pholio/event/PholioActionMenuEventListener.php | 1 - .../search/controller/PhabricatorSearchAttachController.php | 5 +++++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php index 2195089d24..c29c7ee9a1 100644 --- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php +++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php @@ -198,7 +198,6 @@ final class ManiphestTaskDetailController extends ManiphestController { $task_submenu[] = id(new PhabricatorActionView()) ->setName(pht('Edit Blocking Tasks')) ->setHref("/search/attach/{$phid}/TASK/blocks/") - ->setWorkflow(true) ->setIcon('fa-link') ->setDisabled(!$can_edit) ->setWorkflow(true); @@ -206,7 +205,6 @@ final class ManiphestTaskDetailController extends ManiphestController { $task_submenu[] = id(new PhabricatorActionView()) ->setName(pht('Merge Duplicates In')) ->setHref("/search/attach/{$phid}/TASK/merge/") - ->setWorkflow(true) ->setIcon('fa-compress') ->setDisabled(!$can_edit) ->setWorkflow(true); diff --git a/src/applications/pholio/event/PholioActionMenuEventListener.php b/src/applications/pholio/event/PholioActionMenuEventListener.php index cfa6e39c32..0b563537fa 100644 --- a/src/applications/pholio/event/PholioActionMenuEventListener.php +++ b/src/applications/pholio/event/PholioActionMenuEventListener.php @@ -42,7 +42,6 @@ final class PholioActionMenuEventListener return id(new PhabricatorActionView()) ->setName(pht('Edit Pholio Mocks')) ->setHref("/search/attach/{$phid}/MOCK/edge/") - ->setWorkflow(true) ->setIcon('fa-camera-retro') ->setDisabled(!$can_edit) ->setWorkflow(true); diff --git a/src/applications/search/controller/PhabricatorSearchAttachController.php b/src/applications/search/controller/PhabricatorSearchAttachController.php index 2d00ac8bda..a3238cb50d 100644 --- a/src/applications/search/controller/PhabricatorSearchAttachController.php +++ b/src/applications/search/controller/PhabricatorSearchAttachController.php @@ -18,6 +18,11 @@ final class PhabricatorSearchAttachController $object = id(new PhabricatorObjectQuery()) ->setViewer($user) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) ->withPHIDs(array($phid)) ->executeOne(); From bf62badfdaeccb8be2d28243d39521661e9dde55 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 05:35:40 -0700 Subject: [PATCH 12/26] Modularize "related objects" menu items in Maniphest Summary: Ref T11179. This generates the Maniphest menu items in a modular way. It doesn't change any of the underlying code yet. Searching for commits doesn't work particularly well so I've just hidden that for now, but the item itself works fine. Test Plan: {F1696849} Reviewers: chad Reviewed By: chad Maniphest Tasks: T11179 Differential Revision: https://secure.phabricator.com/D16162 --- src/__phutil_library_map__.php | 16 +++- .../PhabricatorDifferentialApplication.php | 1 - .../DifferentialActionMenuEventListener.php | 50 ---------- .../ManiphestTaskDetailController.php | 9 ++ .../ManiphestTaskHasCommitRelationship.php | 27 ++++++ .../ManiphestTaskHasMockRelationship.php | 20 ++++ .../ManiphestTaskHasRevisionRelationship.php | 20 ++++ .../ManiphestTaskRelationship.php | 19 ++++ .../PhabricatorPholioApplication.php | 6 -- .../event/PholioActionMenuEventListener.php | 50 ---------- .../PhabricatorObjectRelationship.php | 81 ++++++++++++++++ .../PhabricatorObjectRelationshipList.php | 95 +++++++++++++++++++ src/view/layout/PhabricatorActionView.php | 4 + 13 files changed, 287 insertions(+), 111 deletions(-) delete mode 100644 src/applications/differential/event/DifferentialActionMenuEventListener.php create mode 100644 src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php create mode 100644 src/applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php create mode 100644 src/applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php create mode 100644 src/applications/maniphest/relationship/ManiphestTaskRelationship.php delete mode 100644 src/applications/pholio/event/PholioActionMenuEventListener.php create mode 100644 src/applications/search/relationship/PhabricatorObjectRelationship.php create mode 100644 src/applications/search/relationship/PhabricatorObjectRelationshipList.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 6a518c2244..c0e6166baf 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -350,7 +350,6 @@ phutil_register_library_map(array( 'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php', 'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php', 'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php', - 'DifferentialActionMenuEventListener' => 'applications/differential/event/DifferentialActionMenuEventListener.php', 'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php', 'DifferentialAdjustmentMapTestCase' => 'applications/differential/storage/__tests__/DifferentialAdjustmentMapTestCase.php', 'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php', @@ -1420,8 +1419,11 @@ phutil_register_library_map(array( 'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php', 'ManiphestTaskFulltextEngine' => 'applications/maniphest/search/ManiphestTaskFulltextEngine.php', 'ManiphestTaskHasCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasCommitEdgeType.php', + 'ManiphestTaskHasCommitRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php', 'ManiphestTaskHasMockEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasMockEdgeType.php', + 'ManiphestTaskHasMockRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php', 'ManiphestTaskHasRevisionEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasRevisionEdgeType.php', + 'ManiphestTaskHasRevisionRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php', 'ManiphestTaskHeraldField' => 'applications/maniphest/herald/ManiphestTaskHeraldField.php', 'ManiphestTaskHeraldFieldGroup' => 'applications/maniphest/herald/ManiphestTaskHeraldFieldGroup.php', 'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.php', @@ -1437,6 +1439,7 @@ phutil_register_library_map(array( 'ManiphestTaskPriorityHeraldAction' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldAction.php', 'ManiphestTaskPriorityHeraldField' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldField.php', 'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.php', + 'ManiphestTaskRelationship' => 'applications/maniphest/relationship/ManiphestTaskRelationship.php', 'ManiphestTaskResultListView' => 'applications/maniphest/view/ManiphestTaskResultListView.php', 'ManiphestTaskSearchEngine' => 'applications/maniphest/query/ManiphestTaskSearchEngine.php', 'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php', @@ -2860,6 +2863,8 @@ phutil_register_library_map(array( 'PhabricatorObjectMentionedByObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionedByObjectEdgeType.php', 'PhabricatorObjectMentionsObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionsObjectEdgeType.php', 'PhabricatorObjectQuery' => 'applications/phid/query/PhabricatorObjectQuery.php', + 'PhabricatorObjectRelationship' => 'applications/search/relationship/PhabricatorObjectRelationship.php', + 'PhabricatorObjectRelationshipList' => 'applications/search/relationship/PhabricatorObjectRelationshipList.php', 'PhabricatorObjectRemarkupRule' => 'infrastructure/markup/rule/PhabricatorObjectRemarkupRule.php', 'PhabricatorObjectSelectorDialog' => 'view/control/PhabricatorObjectSelectorDialog.php', 'PhabricatorOffsetPagedQuery' => 'infrastructure/query/PhabricatorOffsetPagedQuery.php', @@ -3834,7 +3839,6 @@ phutil_register_library_map(array( 'PhluxVariablePHIDType' => 'applications/phlux/phid/PhluxVariablePHIDType.php', 'PhluxVariableQuery' => 'applications/phlux/query/PhluxVariableQuery.php', 'PhluxViewController' => 'applications/phlux/controller/PhluxViewController.php', - 'PholioActionMenuEventListener' => 'applications/pholio/event/PholioActionMenuEventListener.php', 'PholioController' => 'applications/pholio/controller/PholioController.php', 'PholioDAO' => 'applications/pholio/storage/PholioDAO.php', 'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php', @@ -4662,7 +4666,6 @@ phutil_register_library_map(array( ), 'DifferentialAction' => 'Phobject', 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand', - 'DifferentialActionMenuEventListener' => 'PhabricatorEventListener', 'DifferentialAddCommentView' => 'AphrontView', 'DifferentialAdjustmentMapTestCase' => 'PhutilTestCase', 'DifferentialAffectedPath' => 'DifferentialDAO', @@ -5906,8 +5909,11 @@ phutil_register_library_map(array( 'ManiphestTaskEditController' => 'ManiphestController', 'ManiphestTaskFulltextEngine' => 'PhabricatorFulltextEngine', 'ManiphestTaskHasCommitEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasCommitRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHasMockEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasMockRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHasRevisionEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasRevisionRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHeraldField' => 'HeraldField', 'ManiphestTaskHeraldFieldGroup' => 'HeraldFieldGroup', 'ManiphestTaskListController' => 'ManiphestController', @@ -5923,6 +5929,7 @@ phutil_register_library_map(array( 'ManiphestTaskPriorityHeraldAction' => 'HeraldAction', 'ManiphestTaskPriorityHeraldField' => 'ManiphestTaskHeraldField', 'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'ManiphestTaskRelationship' => 'PhabricatorObjectRelationship', 'ManiphestTaskResultListView' => 'ManiphestView', 'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine', 'ManiphestTaskStatus' => 'ManiphestConstants', @@ -7547,6 +7554,8 @@ phutil_register_library_map(array( 'PhabricatorObjectMentionedByObjectEdgeType' => 'PhabricatorEdgeType', 'PhabricatorObjectMentionsObjectEdgeType' => 'PhabricatorEdgeType', 'PhabricatorObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorObjectRelationship' => 'Phobject', + 'PhabricatorObjectRelationshipList' => 'Phobject', 'PhabricatorObjectRemarkupRule' => 'PhutilRemarkupRule', 'PhabricatorObjectSelectorDialog' => 'Phobject', 'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery', @@ -8730,7 +8739,6 @@ phutil_register_library_map(array( 'PhluxVariablePHIDType' => 'PhabricatorPHIDType', 'PhluxVariableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhluxViewController' => 'PhluxController', - 'PholioActionMenuEventListener' => 'PhabricatorEventListener', 'PholioController' => 'PhabricatorController', 'PholioDAO' => 'PhabricatorLiskDAO', 'PholioDefaultEditCapability' => 'PhabricatorPolicyCapability', diff --git a/src/applications/differential/application/PhabricatorDifferentialApplication.php b/src/applications/differential/application/PhabricatorDifferentialApplication.php index ed0053061b..589dfe239d 100644 --- a/src/applications/differential/application/PhabricatorDifferentialApplication.php +++ b/src/applications/differential/application/PhabricatorDifferentialApplication.php @@ -43,7 +43,6 @@ final class PhabricatorDifferentialApplication extends PhabricatorApplication { public function getEventListeners() { return array( - new DifferentialActionMenuEventListener(), new DifferentialLandingActionMenuEventListener(), ); } diff --git a/src/applications/differential/event/DifferentialActionMenuEventListener.php b/src/applications/differential/event/DifferentialActionMenuEventListener.php deleted file mode 100644 index a35f834136..0000000000 --- a/src/applications/differential/event/DifferentialActionMenuEventListener.php +++ /dev/null @@ -1,50 +0,0 @@ -listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); - } - - public function handleEvent(PhutilEvent $event) { - switch ($event->getType()) { - case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: - $this->handleActionsEvent($event); - break; - } - } - - private function handleActionsEvent(PhutilEvent $event) { - $object = $event->getValue('object'); - - $actions = null; - if ($object instanceof ManiphestTask) { - $actions = $this->renderTaskItems($event); - $this->addActionMenuItems($event, $actions); - } - - } - - private function renderTaskItems(PhutilEvent $event) { - if (!$this->canUseApplication($event->getUser())) { - return null; - } - - $task = $event->getValue('object'); - $phid = $task->getPHID(); - - $can_edit = PhabricatorPolicyFilter::hasCapability( - $event->getUser(), - $task, - PhabricatorPolicyCapability::CAN_EDIT); - - return id(new PhabricatorActionView()) - ->setName(pht('Edit Differential Revisions')) - ->setHref("/search/attach/{$phid}/DREV/") - ->setIcon('fa-cog') - ->setDisabled(!$can_edit) - ->setWorkflow(true); - } - -} diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php index c29c7ee9a1..a2de17c341 100644 --- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php +++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php @@ -215,6 +215,15 @@ final class ManiphestTaskDetailController extends ManiphestController { ->setIcon('fa-anchor') ->setSubmenu($task_submenu)); + $relationship_list = PhabricatorObjectRelationshipList::newForObject( + $viewer, + $task); + + $relationship_submenu = $relationship_list->newActionMenu(); + if ($relationship_submenu) { + $curtain->addAction($relationship_submenu); + } + $owner_phid = $task->getOwnerPHID(); $author_phid = $task->getAuthorPHID(); $handles = $viewer->loadHandles(array($owner_phid, $author_phid)); diff --git a/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php b/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php new file mode 100644 index 0000000000..e4195e3626 --- /dev/null +++ b/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php @@ -0,0 +1,27 @@ +getViewer(); + + $has_app = PhabricatorApplication::isClassInstalledForViewer( + 'PhabricatorManiphestApplication', + $viewer); + if (!$has_app) { + return false; + } + + return ($object instanceof ManiphestTask); + } + +} diff --git a/src/applications/pholio/application/PhabricatorPholioApplication.php b/src/applications/pholio/application/PhabricatorPholioApplication.php index e7c841b68a..4d80dd12ae 100644 --- a/src/applications/pholio/application/PhabricatorPholioApplication.php +++ b/src/applications/pholio/application/PhabricatorPholioApplication.php @@ -26,12 +26,6 @@ final class PhabricatorPholioApplication extends PhabricatorApplication { return pht('Things before they were cool.'); } - public function getEventListeners() { - return array( - new PholioActionMenuEventListener(), - ); - } - public function getRemarkupRules() { return array( new PholioRemarkupRule(), diff --git a/src/applications/pholio/event/PholioActionMenuEventListener.php b/src/applications/pholio/event/PholioActionMenuEventListener.php deleted file mode 100644 index 0b563537fa..0000000000 --- a/src/applications/pholio/event/PholioActionMenuEventListener.php +++ /dev/null @@ -1,50 +0,0 @@ -listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); - } - - public function handleEvent(PhutilEvent $event) { - switch ($event->getType()) { - case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: - $this->handleActionsEvent($event); - break; - } - } - - private function handleActionsEvent(PhutilEvent $event) { - $object = $event->getValue('object'); - - $actions = null; - if ($object instanceof ManiphestTask) { - $actions = $this->renderTaskItems($event); - } - - $this->addActionMenuItems($event, $actions); - } - - private function renderTaskItems(PhutilEvent $event) { - if (!$this->canUseApplication($event->getUser())) { - return; - } - - $task = $event->getValue('object'); - $phid = $task->getPHID(); - - $can_edit = PhabricatorPolicyFilter::hasCapability( - $event->getUser(), - $task, - PhabricatorPolicyCapability::CAN_EDIT); - - return id(new PhabricatorActionView()) - ->setName(pht('Edit Pholio Mocks')) - ->setHref("/search/attach/{$phid}/MOCK/edge/") - ->setIcon('fa-camera-retro') - ->setDisabled(!$can_edit) - ->setWorkflow(true); - } - -} diff --git a/src/applications/search/relationship/PhabricatorObjectRelationship.php b/src/applications/search/relationship/PhabricatorObjectRelationship.php new file mode 100644 index 0000000000..1cc28e6a1d --- /dev/null +++ b/src/applications/search/relationship/PhabricatorObjectRelationship.php @@ -0,0 +1,81 @@ +viewer = $viewer; + return $this; + } + + public function getViewer() { + return $this->viewer; + } + + final public function getRelationshipConstant() { + return $this->getPhobjectClassConstant('RELATIONSHIPKEY'); + } + + abstract public function isEnabledForObject($object); + + abstract public function getEdgeConstant(); + + abstract protected function getActionName(); + abstract protected function getActionIcon(); + + public function shouldAppearInActionMenu() { + return true; + } + + protected function isActionEnabled($object) { + $viewer = $this->getViewer(); + + return PhabricatorPolicyFilter::hasCapability( + $viewer, + $object, + PhabricatorPolicyCapability::CAN_EDIT); + } + + final public function newAction($object) { + $is_enabled = $this->isActionEnabled($object); + $action_uri = $this->getActionURI($object); + + return id(new PhabricatorActionView()) + ->setName($this->getActionName()) + ->setHref($action_uri) + ->setIcon($this->getActionIcon()) + ->setDisabled(!$is_enabled) + ->setWorkflow(true); + } + + final public static function getAllRelationships() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getRelationshipConstant') + ->execute(); + } + + private function getActionURI($object) { + $phid = $object->getPHID(); + + // TODO: Remove this, this is just legacy support for the current + // controller until a new one gets built. + $legacy_kinds = array( + ManiphestTaskHasCommitEdgeType::EDGECONST => 'CMIT', + ManiphestTaskHasMockEdgeType::EDGECONST => 'MOCK', + ManiphestTaskHasRevisionEdgeType::EDGECONST => 'DREV', + ); + + $edge_type = $this->getEdgeConstant(); + $legacy_kind = idx($legacy_kinds, $edge_type); + if (!$legacy_kind) { + throw new Exception( + pht( + 'Only specific legacy relationships are supported!')); + } + + return "/search/attach/{$phid}/{$legacy_kind}/"; + } + +} diff --git a/src/applications/search/relationship/PhabricatorObjectRelationshipList.php b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php new file mode 100644 index 0000000000..36d2ab2d1b --- /dev/null +++ b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php @@ -0,0 +1,95 @@ +viewer = $viewer; + return $this; + } + + public function getViewer() { + if ($this->viewer === null) { + throw new PhutilInvalidStateException('setViewer'); + } + + return $this->viewer; + } + + public function setObject($object) { + $this->object = $object; + return $this; + } + + public function getObject() { + if ($this->object === null) { + throw new PhutilInvalidStateException('setObject'); + } + + return $this->object; + } + + public function setRelationships(array $relationships) { + assert_instances_of($relationships, 'PhabricatorObjectRelationship'); + $this->relationships = $relationships; + return $this; + } + + public function getRelationships() { + if ($this->relationships === null) { + throw new PhutilInvalidStateException('setRelationships'); + } + + return $this->relationships; + } + + public function newActionMenu() { + $relationships = $this->getRelationships(); + $object = $this->getObject(); + + $actions = array(); + foreach ($relationships as $key => $relationship) { + if (!$relationship->shouldAppearInActionMenu()) { + continue; + } + + $actions[$key] = $relationship->newAction($object); + } + + if (!$actions) { + return null; + } + + $actions = msort($actions, 'getName'); + + return id(new PhabricatorActionView()) + ->setName(pht('Edit Related Objects...')) + ->setIcon('fa-link') + ->setSubmenu($actions); + } + + public static function newForObject(PhabricatorUser $viewer, $object) { + $relationships = PhabricatorObjectRelationship::getAllRelationships(); + + $results = array(); + foreach ($relationships as $key => $relationship) { + $relationship = clone $relationship; + + $relationship->setViewer($viewer); + if (!$relationship->isEnabledForObject($object)) { + continue; + } + + $results[$key] = $relationship; + } + + return id(new self()) + ->setViewer($viewer) + ->setObject($object) + ->setRelationships($results); + } + +} diff --git a/src/view/layout/PhabricatorActionView.php b/src/view/layout/PhabricatorActionView.php index a936b36e47..7a7cc64c3b 100644 --- a/src/view/layout/PhabricatorActionView.php +++ b/src/view/layout/PhabricatorActionView.php @@ -70,6 +70,10 @@ final class PhabricatorActionView extends AphrontView { return $this; } + public function getName() { + return $this->name; + } + public function setLabel($label) { $this->label = $label; return $this; From b5d90b4714b2c92fd3d834da25f1ea2b11e9a284 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 08:04:14 -0700 Subject: [PATCH 13/26] Drive modular task relationships through a new "relationships" controller Summary: Ref T11179. This is basically a "pro" controller to replace the SearchAttach controller. It does basically the same stuff, just in a (mostly) more modern and modular way. Test Plan: - Added and removed mocks. - Added and removed revisions. - Everything worked just like it did before. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11179 Differential Revision: https://secure.phabricator.com/D16163 --- src/__phutil_library_map__.php | 2 + .../ManiphestTaskHasCommitRelationship.php | 16 ++ .../ManiphestTaskHasMockRelationship.php | 16 ++ .../ManiphestTaskHasRevisionRelationship.php | 16 ++ .../PhabricatorSearchApplication.php | 2 + ...habricatorSearchRelationshipController.php | 198 ++++++++++++++++++ .../PhabricatorObjectRelationship.php | 30 ++- .../PhabricatorObjectRelationshipList.php | 4 + 8 files changed, 266 insertions(+), 18 deletions(-) create mode 100644 src/applications/search/controller/PhabricatorSearchRelationshipController.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index c0e6166baf..9f2625db8f 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -3394,6 +3394,7 @@ phutil_register_library_map(array( 'PhabricatorSearchOrderController' => 'applications/search/controller/PhabricatorSearchOrderController.php', 'PhabricatorSearchOrderField' => 'applications/search/field/PhabricatorSearchOrderField.php', 'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php', + 'PhabricatorSearchRelationshipController' => 'applications/search/controller/PhabricatorSearchRelationshipController.php', 'PhabricatorSearchResultBucket' => 'applications/search/buckets/PhabricatorSearchResultBucket.php', 'PhabricatorSearchResultBucketGroup' => 'applications/search/buckets/PhabricatorSearchResultBucketGroup.php', 'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php', @@ -8213,6 +8214,7 @@ phutil_register_library_map(array( 'PhabricatorSearchOrderController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchOrderField' => 'PhabricatorSearchField', 'PhabricatorSearchRelationship' => 'Phobject', + 'PhabricatorSearchRelationshipController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchResultBucket' => 'Phobject', 'PhabricatorSearchResultBucketGroup' => 'Phobject', 'PhabricatorSearchResultView' => 'AphrontView', diff --git a/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php b/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php index e4195e3626..4fb35e46c9 100644 --- a/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php +++ b/src/applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php @@ -24,4 +24,20 @@ final class ManiphestTaskHasCommitRelationship return false; } + public function canRelateObjects($src, $dst) { + return ($dst instanceof PhabricatorRepositoryCommit); + } + + public function getDialogTitleText() { + return pht('Edit Related Commits'); + } + + public function getDialogHeaderText() { + return pht('Current Commits'); + } + + public function getDialogButtonText() { + return pht('Save Related Commits'); + } + } diff --git a/src/applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php b/src/applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php index d391e5c486..4425d1c3e9 100644 --- a/src/applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php +++ b/src/applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php @@ -17,4 +17,20 @@ final class ManiphestTaskHasMockRelationship return 'fa-camera-retro'; } + public function canRelateObjects($src, $dst) { + return ($dst instanceof PholioMock); + } + + public function getDialogTitleText() { + return pht('Edit Related Mocks'); + } + + public function getDialogHeaderText() { + return pht('Current Mocks'); + } + + public function getDialogButtonText() { + return pht('Save Related Mocks'); + } + } diff --git a/src/applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php b/src/applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php index eee0325aff..4530940191 100644 --- a/src/applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php +++ b/src/applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php @@ -17,4 +17,20 @@ final class ManiphestTaskHasRevisionRelationship return 'fa-cog'; } + public function canRelateObjects($src, $dst) { + return ($dst instanceof DifferentialRevision); + } + + public function getDialogTitleText() { + return pht('Edit Related Revisions'); + } + + public function getDialogHeaderText() { + return pht('Current Revisions'); + } + + public function getDialogButtonText() { + return pht('Save Related Revisions'); + } + } diff --git a/src/applications/search/application/PhabricatorSearchApplication.php b/src/applications/search/application/PhabricatorSearchApplication.php index bd3f78359e..36ad59764c 100644 --- a/src/applications/search/application/PhabricatorSearchApplication.php +++ b/src/applications/search/application/PhabricatorSearchApplication.php @@ -41,6 +41,8 @@ final class PhabricatorSearchApplication extends PhabricatorApplication { 'delete/(?P[^/]+)/(?P[^/]+)/' => 'PhabricatorSearchDeleteController', 'order/(?P[^/]+)/' => 'PhabricatorSearchOrderController', + 'rel/(?P[^/]+)/(?P[^/]+)/' + => 'PhabricatorSearchRelationshipController', ), ); } diff --git a/src/applications/search/controller/PhabricatorSearchRelationshipController.php b/src/applications/search/controller/PhabricatorSearchRelationshipController.php new file mode 100644 index 0000000000..12e4d16216 --- /dev/null +++ b/src/applications/search/controller/PhabricatorSearchRelationshipController.php @@ -0,0 +1,198 @@ +getViewer(); + + $phid = $request->getURIData('sourcePHID'); + $object = id(new PhabricatorObjectQuery()) + ->setViewer($viewer) + ->withPHIDs(array($phid)) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) + ->executeOne(); + if (!$object) { + return new Aphront404Response(); + } + + $list = PhabricatorObjectRelationshipList::newForObject( + $viewer, + $object); + + $relationship_key = $request->getURIData('relationshipKey'); + $relationship = $list->getRelationship($relationship_key); + if (!$relationship) { + return new Aphront404Response(); + } + + $src_phid = $object->getPHID(); + $edge_type = $relationship->getEdgeConstant(); + + $dst_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( + $src_phid, + $edge_type); + + $all_phids = $dst_phids; + $all_phids[] = $src_phid; + + $handles = $viewer->loadHandles($all_phids); + $src_handle = $handles[$src_phid]; + + $done_uri = $src_handle->getURI(); + + if ($request->isFormPost()) { + $phids = explode(';', $request->getStr('phids')); + $phids = array_filter($phids); + $phids = array_values($phids); + + // TODO: Embed these in the form instead, to gracefully resolve + // concurrent edits like we do for subscribers and projects. + $old_phids = $dst_phids; + + $add_phids = $phids; + $rem_phids = array_diff($old_phids, $add_phids); + + if ($add_phids) { + $dst_objects = id(new PhabricatorObjectQuery()) + ->setViewer($viewer) + ->withPHIDs($phids) + ->setRaisePolicyExceptions(true) + ->execute(); + $dst_objects = mpull($dst_objects, null, 'getPHID'); + } else { + $dst_objects = array(); + } + + try { + foreach ($add_phids as $add_phid) { + $dst_object = idx($dst_objects, $add_phid); + if (!$dst_object) { + throw new Exception( + pht( + 'You can not create a relationship to object "%s" because '. + 'the object does not exist or could not be loaded.', + $add_phid)); + } + + if (!$relationship->canRelateObjects($object, $dst_object)) { + throw new Exception( + pht( + 'You can not create a relationship (of type "%s") to object '. + '"%s" because it is not the right type of object for this '. + 'relationship.', + $relationship->getRelationshipConstant(), + $add_phid)); + } + } + } catch (Exception $ex) { + return $this->newUnrelatableObjectResponse($ex, $done_uri); + } + + $editor = $object->getApplicationTransactionEditor() + ->setActor($viewer) + ->setContentSourceFromRequest($request) + ->setContinueOnMissingFields(true) + ->setContinueOnNoEffect(true); + + $xactions = array(); + $xactions[] = $object->getApplicationTransactionTemplate() + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array( + '+' => array_fuse($add_phids), + '-' => array_fuse($rem_phids), + )); + + try { + $editor->applyTransactions($object, $xactions); + + return id(new AphrontRedirectResponse())->setURI($done_uri); + } catch (PhabricatorEdgeCycleException $ex) { + return $this->newGraphCycleResponse($ex, $done_uri); + } + } + + $handles = iterator_to_array($handles); + $handles = array_select_keys($handles, $dst_phids); + + // TODO: These are hard-coded for now. + $filters = array( + 'assigned' => pht('Assigned to Me'), + 'created' => pht('Created By Me'), + 'open' => pht('All Open Objects'), + 'all' => pht('All Objects'), + ); + + $dialog_title = $relationship->getDialogTitleText(); + $dialog_header = $relationship->getDialogHeaderText(); + $dialog_button = $relationship->getDialogButtonText(); + $dialog_instructions = $relationship->getDialogInstructionsText(); + + // TODO: Remove this, this is just legacy support. + $legacy_kinds = array( + ManiphestTaskHasCommitEdgeType::EDGECONST => 'CMIT', + ManiphestTaskHasMockEdgeType::EDGECONST => 'MOCK', + ManiphestTaskHasRevisionEdgeType::EDGECONST => 'DREV', + ); + + $edge_type = $relationship->getEdgeConstant(); + $legacy_kind = idx($legacy_kinds, $edge_type); + if (!$legacy_kind) { + throw new Exception( + pht('Only specific legacy relationships are supported!')); + } + + return id(new PhabricatorObjectSelectorDialog()) + ->setUser($viewer) + ->setHandles($handles) + ->setFilters($filters) + ->setSelectedFilter('created') + ->setExcluded($phid) + ->setCancelURI($done_uri) + ->setSearchURI("/search/select/{$legacy_kind}/edge/") + ->setTitle($dialog_title) + ->setHeader($dialog_header) + ->setButtonText($dialog_button) + ->setInstructions($dialog_instructions) + ->buildDialog(); + } + + private function newGraphCycleResponse( + PhabricatorEdgeCycleException $ex, + $done_uri) { + + $viewer = $this->getViewer(); + $cycle = $ex->getCycle(); + + $handles = $this->loadViewerHandles($cycle); + $names = array(); + foreach ($cycle as $cycle_phid) { + $names[] = $handles[$cycle_phid]->getFullName(); + } + + $message = pht( + 'You can not create that relationship because it would create a '. + 'circular dependency: %s.', + implode(" \xE2\x86\x92 ", $names)); + + return $this->newDialog() + ->setTitle(pht('Circular Dependency')) + ->appendParagraph($message) + ->addCancelButton($done_uri); + } + + private function newUnrelatableObjectResponse(Exception $ex, $done_uri) { + $message = $ex->getMessage(); + + return $this->newDialog() + ->setTitle(pht('Invalid Relationship')) + ->appendParagraph($message) + ->addCancelButton($done_uri); + } + +} diff --git a/src/applications/search/relationship/PhabricatorObjectRelationship.php b/src/applications/search/relationship/PhabricatorObjectRelationship.php index 1cc28e6a1d..9742a35adf 100644 --- a/src/applications/search/relationship/PhabricatorObjectRelationship.php +++ b/src/applications/search/relationship/PhabricatorObjectRelationship.php @@ -24,6 +24,16 @@ abstract class PhabricatorObjectRelationship extends Phobject { abstract protected function getActionName(); abstract protected function getActionIcon(); + abstract public function canRelateObjects($src, $dst); + + abstract public function getDialogTitleText(); + abstract public function getDialogHeaderText(); + abstract public function getDialogButtonText(); + + public function getDialogInstructionsText() { + return null; + } + public function shouldAppearInActionMenu() { return true; } @@ -58,24 +68,8 @@ abstract class PhabricatorObjectRelationship extends Phobject { private function getActionURI($object) { $phid = $object->getPHID(); - - // TODO: Remove this, this is just legacy support for the current - // controller until a new one gets built. - $legacy_kinds = array( - ManiphestTaskHasCommitEdgeType::EDGECONST => 'CMIT', - ManiphestTaskHasMockEdgeType::EDGECONST => 'MOCK', - ManiphestTaskHasRevisionEdgeType::EDGECONST => 'DREV', - ); - - $edge_type = $this->getEdgeConstant(); - $legacy_kind = idx($legacy_kinds, $edge_type); - if (!$legacy_kind) { - throw new Exception( - pht( - 'Only specific legacy relationships are supported!')); - } - - return "/search/attach/{$phid}/{$legacy_kind}/"; + $type = $this->getRelationshipConstant(); + return "/search/rel/{$type}/{$phid}/"; } } diff --git a/src/applications/search/relationship/PhabricatorObjectRelationshipList.php b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php index 36d2ab2d1b..a43bbaa571 100644 --- a/src/applications/search/relationship/PhabricatorObjectRelationshipList.php +++ b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php @@ -71,6 +71,10 @@ final class PhabricatorObjectRelationshipList extends Phobject { ->setSubmenu($actions); } + public function getRelationship($key) { + return idx($this->relationships, $key); + } + public static function newForObject(PhabricatorUser $viewer, $object) { $relationships = PhabricatorObjectRelationship::getAllRelationships(); From 4bbe6f307a7a0800cfd31f5014c0292250703210 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 08:20:50 -0700 Subject: [PATCH 14/26] Resolve relationship edit conflicts more naturally Summary: Ref T11179. Ref T4768. Currently, on `master`, if two users open "Edit Revisions" at the same time, then add revisions A and B, only the last state wins (just "B"). Instead, apply these as "add A" and "add B" so they merge in a natural way. Test Plan: - Opened edit dialog in two windows. - Added "A" in one, "B" in the other. - Saved both. - Saw "Added A" and "Added B" transactions, instead of "Added A" and "Removed A, added B". Reviewers: chad Reviewed By: chad Maniphest Tasks: T4768, T11179 Differential Revision: https://secure.phabricator.com/D16164 --- resources/celerity/map.php | 18 +++++++++--------- ...PhabricatorSearchRelationshipController.php | 13 ++++++++----- .../PhabricatorObjectSelectorDialog.php | 16 ++++++++++++++++ .../rsrc/js/core/behavior-object-selector.js | 13 ++++++++++++- 4 files changed, 45 insertions(+), 15 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 2944634334..dee9bd423d 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -11,7 +11,7 @@ return array( 'core.pkg.js' => 'f2139810', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', - 'differential.pkg.js' => '4b7d8f19', + 'differential.pkg.js' => '01a010d6', 'diffusion.pkg.css' => '91c5d3a6', 'diffusion.pkg.js' => '3a9a8bfa', 'maniphest.pkg.css' => '4845691a', @@ -495,7 +495,7 @@ return array( 'rsrc/js/core/behavior-lightbox-attachments.js' => 'f8ba29d7', 'rsrc/js/core/behavior-line-linker.js' => '1499a8cb', 'rsrc/js/core/behavior-more.js' => 'a80d0378', - 'rsrc/js/core/behavior-object-selector.js' => '49b73b36', + 'rsrc/js/core/behavior-object-selector.js' => '9030ebef', 'rsrc/js/core/behavior-oncopy.js' => '2926fff2', 'rsrc/js/core/behavior-phabricator-nav.js' => '56a1ca03', 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '116cf19b', @@ -658,7 +658,7 @@ return array( 'javelin-behavior-phabricator-line-linker' => '1499a8cb', 'javelin-behavior-phabricator-nav' => '56a1ca03', 'javelin-behavior-phabricator-notification-example' => '8ce821c5', - 'javelin-behavior-phabricator-object-selector' => '49b73b36', + 'javelin-behavior-phabricator-object-selector' => '9030ebef', 'javelin-behavior-phabricator-oncopy' => '2926fff2', 'javelin-behavior-phabricator-remarkup-assist' => '116cf19b', 'javelin-behavior-phabricator-reveal-content' => '60821bc7', @@ -1214,12 +1214,6 @@ return array( 'javelin-uri', 'phabricator-notification', ), - '49b73b36' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-request', - 'javelin-util', - ), '4b700e9e' => array( 'javelin-behavior', 'javelin-dom', @@ -1608,6 +1602,12 @@ return array( 'javelin-dom', 'javelin-request', ), + '9030ebef' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-request', + 'javelin-util', + ), '9196fb06' => array( 'javelin-install', 'javelin-dom', diff --git a/src/applications/search/controller/PhabricatorSearchRelationshipController.php b/src/applications/search/controller/PhabricatorSearchRelationshipController.php index 12e4d16216..c97c020b0a 100644 --- a/src/applications/search/controller/PhabricatorSearchRelationshipController.php +++ b/src/applications/search/controller/PhabricatorSearchRelationshipController.php @@ -44,18 +44,20 @@ final class PhabricatorSearchRelationshipController $src_handle = $handles[$src_phid]; $done_uri = $src_handle->getURI(); + $initial_phids = $dst_phids; if ($request->isFormPost()) { $phids = explode(';', $request->getStr('phids')); $phids = array_filter($phids); $phids = array_values($phids); - // TODO: Embed these in the form instead, to gracefully resolve - // concurrent edits like we do for subscribers and projects. - $old_phids = $dst_phids; + $initial_phids = $request->getStrList('initialPHIDs'); - $add_phids = $phids; - $rem_phids = array_diff($old_phids, $add_phids); + // Apply the changes as adds and removes relative to the original state + // of the object when the dialog was rendered so that two users adding + // relationships at the same time don't race and overwrite one another. + $add_phids = array_diff($phids, $initial_phids); + $rem_phids = array_diff($initial_phids, $phids); if ($add_phids) { $dst_objects = id(new PhabricatorObjectQuery()) @@ -149,6 +151,7 @@ final class PhabricatorSearchRelationshipController return id(new PhabricatorObjectSelectorDialog()) ->setUser($viewer) + ->setInitialPHIDs($initial_phids) ->setHandles($handles) ->setFilters($filters) ->setSelectedFilter('created') diff --git a/src/view/control/PhabricatorObjectSelectorDialog.php b/src/view/control/PhabricatorObjectSelectorDialog.php index eaa51e5111..52729846c8 100644 --- a/src/view/control/PhabricatorObjectSelectorDialog.php +++ b/src/view/control/PhabricatorObjectSelectorDialog.php @@ -10,6 +10,7 @@ final class PhabricatorObjectSelectorDialog extends Phobject { private $searchURI; private $selectedFilter; private $excluded; + private $initialPHIDs; private $title; private $header; @@ -77,6 +78,15 @@ final class PhabricatorObjectSelectorDialog extends Phobject { return $this; } + public function setInitialPHIDs(array $initial_phids) { + $this->initialPHIDs = $initial_phids; + return $this; + } + + public function getInitialPHIDs() { + return $this->initialPHIDs; + } + public function buildDialog() { $user = $this->user; @@ -171,8 +181,14 @@ final class PhabricatorObjectSelectorDialog extends Phobject { $view = new PhabricatorHandleObjectSelectorDataView($handle); $handle_views[$phid] = $view->renderData(); } + $dialog->addHiddenInput('phids', implode(';', array_keys($this->handles))); + $initial_phids = $this->getInitialPHIDs(); + if ($initial_phids) { + $initial_phids = implode(', ', $initial_phids); + $dialog->addHiddenInput('initialPHIDs', $initial_phids); + } Javelin::initBehavior( 'phabricator-object-selector', diff --git a/webroot/rsrc/js/core/behavior-object-selector.js b/webroot/rsrc/js/core/behavior-object-selector.js index d219883ff7..d4a542c840 100644 --- a/webroot/rsrc/js/core/behavior-object-selector.js +++ b/webroot/rsrc/js/core/behavior-object-selector.js @@ -18,10 +18,21 @@ JX.behavior('phabricator-object-selector', function(config) { var query_timer = null; var query_delay = 50; - var phid_input = JX.DOM.find( + // TODO: This is fairly grotesque, but the dialog has two different forms + // inside it and there's no way to sigil the inputs in the "real" form right + // now. Clean this up when the dialog as a whole gets cleaned up. + + var inputs = JX.DOM.scry( JX.$(config.form), 'input', 'aphront-dialog-application-input'); + var phid_input; + for (var ii = 0; ii < inputs.length; ii++) { + if (inputs[ii].name == 'phids') { + phid_input = inputs[ii]; + break; + } + } var last_value = JX.$(config.query).value; From dbf13f79e99e0db6000d3ab6b248ef8c7f29771b Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 09:05:57 -0700 Subject: [PATCH 15/26] Allow the object selector dialog to be resized Summary: Ref T11179. Test Plan: Dragged the resize handle around, saw the dialog change size. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11179 Differential Revision: https://secure.phabricator.com/D16165 --- src/view/control/PhabricatorObjectSelectorDialog.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/view/control/PhabricatorObjectSelectorDialog.php b/src/view/control/PhabricatorObjectSelectorDialog.php index 52729846c8..09d9582e8b 100644 --- a/src/view/control/PhabricatorObjectSelectorDialog.php +++ b/src/view/control/PhabricatorObjectSelectorDialog.php @@ -204,7 +204,10 @@ final class PhabricatorObjectSelectorDialog extends Phobject { 'handles' => $handle_views, )); - return $dialog; + $dialog->setResizeX(true); + $dialog->setResizeY($results_id); + + return $dialog; } } From 2cb779575dd593bfdae8d751da90022479d530a8 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 10:24:54 -0700 Subject: [PATCH 16/26] Split "Edit Blocking Tasks" into "Edit Parent Tasks" and "Edit Subtasks" Summary: Ref T11179. This splits "Edit Blocking Tasks" into two options now that we have more room ("Edit Parent Tasks", "Edit Subtasks"). This also renames "Blocking" tasks to "Subtasks", and "Blocked" tasks to "Parent" tasks. My goals here are: - Make the relationship direction more clear: it's more clear which way is up with "parent" and "subtask" at a glance than with "blocking" and "blocked" or "dependent" and "dependency". - Align language with "Create Subtask". - To some small degree, use more flexible/general-purpose language, although I haven't seen any real confusion here. Fixes T6815. I think I narrowed this down to two issues: - Just throwing a bare exeception (we now return a dialog explicitly). - Not killing open transactions when the cyclec check fails (we now kill them). Test Plan: - Edited parent tasks. - Edited subtasks. - Tried to introduce graph cycles, got a nice error dialog. {F1697087} {F1697088} Reviewers: chad Reviewed By: chad Maniphest Tasks: T6815, T11179 Differential Revision: https://secure.phabricator.com/D16166 --- src/__phutil_library_map__.php | 4 ++ .../PhabricatorAuthStartController.php | 8 +-- .../ManiphestTaskDetailController.php | 26 ++++---- .../ManiphestTaskDependedOnByTaskEdgeType.php | 12 ++-- .../ManiphestTaskDependsOnTaskEdgeType.php | 12 ++-- .../editor/ManiphestTransactionEditor.php | 2 +- .../ManiphestTaskHasParentRelationship.php | 40 ++++++++++++ .../ManiphestTaskHasSubtaskRelationship.php | 40 ++++++++++++ .../storage/ManiphestTransaction.php | 14 ++-- ...habricatorSearchRelationshipController.php | 8 ++- ...habricatorApplicationTransactionEditor.php | 9 ++- .../edges/editor/PhabricatorEdgeEditor.php | 1 - .../PhabricatorUSEnglishTranslation.php | 64 +++++++++---------- 13 files changed, 166 insertions(+), 74 deletions(-) create mode 100644 src/applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php create mode 100644 src/applications/maniphest/relationship/ManiphestTaskHasSubtaskRelationship.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 9f2625db8f..68fab974c6 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1422,8 +1422,10 @@ phutil_register_library_map(array( 'ManiphestTaskHasCommitRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php', 'ManiphestTaskHasMockEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasMockEdgeType.php', 'ManiphestTaskHasMockRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php', + 'ManiphestTaskHasParentRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php', 'ManiphestTaskHasRevisionEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasRevisionEdgeType.php', 'ManiphestTaskHasRevisionRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php', + 'ManiphestTaskHasSubtaskRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasSubtaskRelationship.php', 'ManiphestTaskHeraldField' => 'applications/maniphest/herald/ManiphestTaskHeraldField.php', 'ManiphestTaskHeraldFieldGroup' => 'applications/maniphest/herald/ManiphestTaskHeraldFieldGroup.php', 'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.php', @@ -5913,8 +5915,10 @@ phutil_register_library_map(array( 'ManiphestTaskHasCommitRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHasMockEdgeType' => 'PhabricatorEdgeType', 'ManiphestTaskHasMockRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasParentRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHasRevisionEdgeType' => 'PhabricatorEdgeType', 'ManiphestTaskHasRevisionRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasSubtaskRelationship' => 'ManiphestTaskRelationship', 'ManiphestTaskHeraldField' => 'HeraldField', 'ManiphestTaskHeraldFieldGroup' => 'HeraldFieldGroup', 'ManiphestTaskListController' => 'ManiphestController', diff --git a/src/applications/auth/controller/PhabricatorAuthStartController.php b/src/applications/auth/controller/PhabricatorAuthStartController.php index 982252d29f..5cfcb9b9ef 100644 --- a/src/applications/auth/controller/PhabricatorAuthStartController.php +++ b/src/applications/auth/controller/PhabricatorAuthStartController.php @@ -225,10 +225,10 @@ final class PhabricatorAuthStartController } // Often, users end up here by clicking a disabled action link in the UI - // (for example, they might click "Edit Blocking Tasks" on a Maniphest - // task page). After they log in we want to send them back to that main - // object page if we can, since it's confusing to end up on a standalone - // page with only a dialog (particularly if that dialog is another error, + // (for example, they might click "Edit Subtasks" on a Maniphest task + // page). After they log in we want to send them back to that main object + // page if we can, since it's confusing to end up on a standalone page with + // only a dialog (particularly if that dialog is another error, // like a policy exception). $via_header = AphrontRequest::getViaHeaderName(); diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php index a2de17c341..bc862a1122 100644 --- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php +++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php @@ -195,12 +195,18 @@ final class ManiphestTaskDetailController extends ManiphestController { ->setDisabled(!$can_create) ->setWorkflow(!$can_create); - $task_submenu[] = id(new PhabricatorActionView()) - ->setName(pht('Edit Blocking Tasks')) - ->setHref("/search/attach/{$phid}/TASK/blocks/") - ->setIcon('fa-link') - ->setDisabled(!$can_edit) - ->setWorkflow(true); + $relationship_list = PhabricatorObjectRelationshipList::newForObject( + $viewer, + $task); + + $parent_key = ManiphestTaskHasParentRelationship::RELATIONSHIPKEY; + $subtask_key = ManiphestTaskHasSubtaskRelationship::RELATIONSHIPKEY; + + $task_submenu[] = $relationship_list->getRelationship($parent_key) + ->newAction($task); + + $task_submenu[] = $relationship_list->getRelationship($subtask_key) + ->newAction($task); $task_submenu[] = id(new PhabricatorActionView()) ->setName(pht('Merge Duplicates In')) @@ -215,10 +221,6 @@ final class ManiphestTaskDetailController extends ManiphestController { ->setIcon('fa-anchor') ->setSubmenu($task_submenu)); - $relationship_list = PhabricatorObjectRelationshipList::newForObject( - $viewer, - $task); - $relationship_submenu = $relationship_list->newActionMenu(); if ($relationship_submenu) { $curtain->addAction($relationship_submenu); @@ -288,9 +290,9 @@ final class ManiphestTaskDetailController extends ManiphestController { $edge_types = array( ManiphestTaskDependedOnByTaskEdgeType::EDGECONST - => pht('Blocks'), + => pht('Parent Tasks'), ManiphestTaskDependsOnTaskEdgeType::EDGECONST - => pht('Blocked By'), + => pht('Subtasks'), ManiphestTaskHasRevisionEdgeType::EDGECONST => pht('Differential Revisions'), ManiphestTaskHasMockEdgeType::EDGECONST diff --git a/src/applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php b/src/applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php index a16f1ac530..1688eddace 100644 --- a/src/applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php +++ b/src/applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php @@ -17,7 +17,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $add_edges) { return pht( - '%s added %s blocked task(s): %s.', + '%s added %s parent task(s): %s.', $actor, $add_count, $add_edges); @@ -29,7 +29,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s removed %s blocked task(s): %s.', + '%s removed %s parent task(s): %s.', $actor, $rem_count, $rem_edges); @@ -44,7 +44,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s edited blocked task(s), added %s: %s; removed %s: %s.', + '%s edited parent task(s), added %s: %s; removed %s: %s.', $actor, $add_count, $add_edges, @@ -59,7 +59,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $add_edges) { return pht( - '%s added %s blocked task(s) for %s: %s.', + '%s added %s parent task(s) for %s: %s.', $actor, $add_count, $object, @@ -73,7 +73,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s removed %s blocked task(s) for %s: %s.', + '%s removed %s parent task(s) for %s: %s.', $actor, $rem_count, $object, @@ -90,7 +90,7 @@ final class ManiphestTaskDependedOnByTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s edited blocked task(s) for %s, added %s: %s; removed %s: %s.', + '%s edited parent task(s) for %s, added %s: %s; removed %s: %s.', $actor, $object, $add_count, diff --git a/src/applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php b/src/applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php index e49e428add..62ef49be90 100644 --- a/src/applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php +++ b/src/applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php @@ -22,7 +22,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $add_edges) { return pht( - '%s added %s blocking task(s): %s.', + '%s added %s subtask(s): %s.', $actor, $add_count, $add_edges); @@ -34,7 +34,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s removed %s blocking task(s): %s.', + '%s removed %s subtask(s): %s.', $actor, $rem_count, $rem_edges); @@ -49,7 +49,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s edited blocking task(s), added %s: %s; removed %s: %s.', + '%s edited subtask(s), added %s: %s; removed %s: %s.', $actor, $add_count, $add_edges, @@ -64,7 +64,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $add_edges) { return pht( - '%s added %s blocking task(s) for %s: %s.', + '%s added %s subtask(s) for %s: %s.', $actor, $add_count, $object, @@ -78,7 +78,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s removed %s blocking task(s) for %s: %s.', + '%s removed %s subtask(s) for %s: %s.', $actor, $rem_count, $object, @@ -95,7 +95,7 @@ final class ManiphestTaskDependsOnTaskEdgeType extends PhabricatorEdgeType { $rem_edges) { return pht( - '%s edited blocking task(s) for %s, added %s: %s; removed %s: %s.', + '%s edited subtask(s) for %s, added %s: %s; removed %s: %s.', $actor, $object, $add_count, diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditor.php b/src/applications/maniphest/editor/ManiphestTransactionEditor.php index da0d12db1c..0a4ea8469a 100644 --- a/src/applications/maniphest/editor/ManiphestTransactionEditor.php +++ b/src/applications/maniphest/editor/ManiphestTransactionEditor.php @@ -325,7 +325,7 @@ final class ManiphestTransactionEditor ManiphestTransaction::MAILTAG_PROJECTS => pht("A task's associated projects change."), ManiphestTransaction::MAILTAG_UNBLOCK => - pht('One of the tasks a task is blocked by changes status.'), + pht("One of a task's subtasks changes status."), ManiphestTransaction::MAILTAG_COLUMN => pht('A task is moved between columns on a workboard.'), ManiphestTransaction::MAILTAG_COMMENT => diff --git a/src/applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php b/src/applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php new file mode 100644 index 0000000000..8d7d3a539f --- /dev/null +++ b/src/applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php @@ -0,0 +1,40 @@ +getMetadataValue('blocker.new')) { return pht( - '%s created blocking task %s.', + '%s created subtask %s.', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid)); } else if ($old_closed && !$new_closed) { return pht( - '%s reopened blocking task %s as "%s".', + '%s reopened subtask %s as "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), $new_name); } else if (!$old_closed && $new_closed) { return pht( - '%s closed blocking task %s as "%s".', + '%s closed subtask %s as "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), $new_name); } else { return pht( - '%s changed the status of blocking task %s from "%s" to "%s".', + '%s changed the status of subtask %s from "%s" to "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), $old_name, @@ -753,21 +753,21 @@ final class ManiphestTransaction if ($old_closed && !$new_closed) { return pht( - '%s reopened %s, a task blocking %s, as "%s".', + '%s reopened %s, a subtask of %s, as "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), $this->renderHandleLink($object_phid), $new_name); } else if (!$old_closed && $new_closed) { return pht( - '%s closed %s, a task blocking %s, as "%s".', + '%s closed %s, a subtask of %s, as "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), $this->renderHandleLink($object_phid), $new_name); } else { return pht( - '%s changed the status of %s, a task blocking %s, '. + '%s changed the status of %s, a subtasktask of %s, '. 'from "%s" to "%s".', $this->renderHandleLink($author_phid), $this->renderHandleLink($blocker_phid), diff --git a/src/applications/search/controller/PhabricatorSearchRelationshipController.php b/src/applications/search/controller/PhabricatorSearchRelationshipController.php index c97c020b0a..6af121d1ba 100644 --- a/src/applications/search/controller/PhabricatorSearchRelationshipController.php +++ b/src/applications/search/controller/PhabricatorSearchRelationshipController.php @@ -140,6 +140,8 @@ final class PhabricatorSearchRelationshipController ManiphestTaskHasCommitEdgeType::EDGECONST => 'CMIT', ManiphestTaskHasMockEdgeType::EDGECONST => 'MOCK', ManiphestTaskHasRevisionEdgeType::EDGECONST => 'DREV', + ManiphestTaskDependsOnTaskEdgeType::EDGECONST => 'TASK', + ManiphestTaskDependedOnByTaskEdgeType::EDGECONST => 'TASK', ); $edge_type = $relationship->getEdgeConstant(); @@ -180,12 +182,14 @@ final class PhabricatorSearchRelationshipController $message = pht( 'You can not create that relationship because it would create a '. - 'circular dependency: %s.', - implode(" \xE2\x86\x92 ", $names)); + 'circular dependency:'); + + $list = implode(" \xE2\x86\x92 ", $names); return $this->newDialog() ->setTitle(pht('Circular Dependency')) ->appendParagraph($message) + ->appendParagraph($list) ->addCancelButton($done_uri); } diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php index 7443de7edc..1a3dd1c89e 100644 --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -931,6 +931,7 @@ abstract class PhabricatorApplicationTransactionEditor $object->openTransaction(); } + try { foreach ($xactions as $xaction) { $this->applyInternalEffects($object, $xaction); } @@ -940,8 +941,6 @@ abstract class PhabricatorApplicationTransactionEditor try { $object->save(); } catch (AphrontDuplicateKeyQueryException $ex) { - $object->killTransaction(); - // This callback has an opportunity to throw a better exception, // so execution may end here. $this->didCatchDuplicateKeyException($object, $xactions, $ex); @@ -973,7 +972,11 @@ abstract class PhabricatorApplicationTransactionEditor $read_locking = false; } - $object->saveTransaction(); + $object->saveTransaction(); + } catch (Exception $ex) { + $object->killTransaction(); + throw $ex; + } // Now that we've completely applied the core transaction set, try to apply // Herald rules. Herald rules are allowed to either take direct actions on diff --git a/src/infrastructure/edges/editor/PhabricatorEdgeEditor.php b/src/infrastructure/edges/editor/PhabricatorEdgeEditor.php index 42909ee6e2..700a11ea36 100644 --- a/src/infrastructure/edges/editor/PhabricatorEdgeEditor.php +++ b/src/infrastructure/edges/editor/PhabricatorEdgeEditor.php @@ -134,7 +134,6 @@ final class PhabricatorEdgeEditor extends Phobject { $caught = $ex; } - if ($caught) { $this->killTransactions(); } diff --git a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php index c49069fcae..23cb079297 100644 --- a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php +++ b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php @@ -206,73 +206,73 @@ final class PhabricatorUSEnglishTranslation ), ), - '%s added %s blocking task(s): %s.' => array( + '%s added %s subtask(s): %s.' => array( array( - '%s added a blocking task: %3$s.', - '%s added blocking tasks: %3$s.', + '%s added a subtask: %3$s.', + '%s added subtasks: %3$s.', ), ), - '%s added %s blocked task(s): %s.' => array( + '%s added %s parent task(s): %s.' => array( array( - '%s added a blocked task: %3$s.', - '%s added blocked tasks: %3$s.', + '%s added a parent task: %3$s.', + '%s added parent tasks: %3$s.', ), ), - '%s removed %s blocking task(s): %s.' => array( + '%s removed %s subtask(s): %s.' => array( array( - '%s removed a blocking task: %3$s.', - '%s removed blocking tasks: %3$s.', + '%s removed a subtask: %3$s.', + '%s removed subtasks: %3$s.', ), ), - '%s removed %s blocked task(s): %s.' => array( + '%s removed %s parent task(s): %s.' => array( array( - '%s removed a blocked task: %3$s.', - '%s removed blocked tasks: %3$s.', + '%s removed a parent task: %3$s.', + '%s removed parent tasks: %3$s.', ), ), - '%s added %s blocking task(s) for %s: %s.' => array( + '%s added %s subtask(s) for %s: %s.' => array( array( - '%s added a blocking task for %3$s: %4$s.', - '%s added blocking tasks for %3$s: %4$s.', + '%s added a subtask for %3$s: %4$s.', + '%s added subtasks for %3$s: %4$s.', ), ), - '%s added %s blocked task(s) for %s: %s.' => array( + '%s added %s parent task(s) for %s: %s.' => array( array( - '%s added a blocked task for %3$s: %4$s.', - '%s added blocked tasks for %3$s: %4$s.', + '%s added a parent task for %3$s: %4$s.', + '%s added parent tasks for %3$s: %4$s.', ), ), - '%s removed %s blocking task(s) for %s: %s.' => array( + '%s removed %s subtask(s) for %s: %s.' => array( array( - '%s removed a blocking task for %3$s: %4$s.', - '%s removed blocking tasks for %3$s: %4$s.', + '%s removed a subtask for %3$s: %4$s.', + '%s removed subtasks for %3$s: %4$s.', ), ), - '%s removed %s blocked task(s) for %s: %s.' => array( + '%s removed %s parent task(s) for %s: %s.' => array( array( - '%s removed a blocked task for %3$s: %4$s.', - '%s removed blocked tasks for %3$s: %4$s.', + '%s removed a parent task for %3$s: %4$s.', + '%s removed parent tasks for %3$s: %4$s.', ), ), - '%s edited blocking task(s), added %s: %s; removed %s: %s.' => - '%s edited blocking tasks, added: %3$s; removed: %5$s.', + '%s edited subtask(s), added %s: %s; removed %s: %s.' => + '%s edited subtasks, added: %3$s; removed: %5$s.', - '%s edited blocking task(s) for %s, added %s: %s; removed %s: %s.' => - '%s edited blocking tasks for %s, added: %4$s; removed: %6$s.', + '%s edited subtask(s) for %s, added %s: %s; removed %s: %s.' => + '%s edited subtasks for %s, added: %4$s; removed: %6$s.', - '%s edited blocked task(s), added %s: %s; removed %s: %s.' => - '%s edited blocked tasks, added: %3$s; removed: %5$s.', + '%s edited parent task(s), added %s: %s; removed %s: %s.' => + '%s edited parent tasks, added: %3$s; removed: %5$s.', - '%s edited blocked task(s) for %s, added %s: %s; removed %s: %s.' => - '%s edited blocked tasks for %s, added: %4$s; removed: %6$s.', + '%s edited parent task(s) for %s, added %s: %s; removed %s: %s.' => + '%s edited parent tasks for %s, added: %4$s; removed: %6$s.', '%s edited answer(s), added %s: %s; removed %d: %s.' => '%s edited answers, added: %3$s; removed: %5$s.', From 60c55387ab3b717eec855bf050616cee175dda55 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 11:42:58 -0700 Subject: [PATCH 17/26] Don't show client-side setup prompts until user accounts activate Summary: Fixes T11198. These are confusing or premature if you aren't an activated user: disabled or unapproved accounts won't be able to act on them. Test Plan: Changed timezone, went through flow to correct it Reviewers: chad Reviewed By: chad Maniphest Tasks: T11198 Differential Revision: https://secure.phabricator.com/D16167 --- src/applications/people/storage/PhabricatorUser.php | 4 ++++ src/view/page/PhabricatorStandardPageView.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/applications/people/storage/PhabricatorUser.php b/src/applications/people/storage/PhabricatorUser.php index 5e8cb77a72..81a5126474 100644 --- a/src/applications/people/storage/PhabricatorUser.php +++ b/src/applications/people/storage/PhabricatorUser.php @@ -94,6 +94,10 @@ final class PhabricatorUser * @return bool True if this is a standard, usable account. */ public function isUserActivated() { + if (!$this->isLoggedIn()) { + return false; + } + if ($this->isOmnipotent()) { return true; } diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php index e37da7c5ea..866268c710 100644 --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -222,7 +222,7 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView } if ($user) { - if ($user->isLoggedIn()) { + if ($user->isUserActivated()) { $offset = $user->getTimeZoneOffset(); $ignore_key = PhabricatorTimezoneIgnoreOffsetSetting::SETTINGKEY; From 3bb3170a2c7cd234bfa10b76a6c91a08b456df3a Mon Sep 17 00:00:00 2001 From: Chad Little Date: Wed, 22 Jun 2016 12:14:48 -0700 Subject: [PATCH 18/26] Add space under comment previews Summary: Fixes T11166. Adds some class, and space to the preview widget. Test Plan: Test Maniphest, Ponder, etc, without a footer. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T11166 Differential Revision: https://secure.phabricator.com/D16168 --- resources/celerity/map.php | 6 +++--- .../view/PhabricatorApplicationTransactionCommentView.php | 1 + webroot/rsrc/css/phui/phui-timeline-view.css | 4 ++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index dee9bd423d..a26edbf755 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ */ return array( 'names' => array( - 'core.pkg.css' => '2168daaf', + 'core.pkg.css' => 'cf375d17', 'core.pkg.js' => 'f2139810', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', @@ -155,7 +155,7 @@ return array( 'rsrc/css/phui/phui-spacing.css' => '042804d6', 'rsrc/css/phui/phui-status.css' => 'd5263e49', 'rsrc/css/phui/phui-tag-view.css' => '6bbd83e2', - 'rsrc/css/phui/phui-timeline-view.css' => '8ea41b25', + 'rsrc/css/phui/phui-timeline-view.css' => 'c3782437', 'rsrc/css/phui/phui-two-column-view.css' => '9fb86c85', 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'ac6fe6a7', 'rsrc/css/phui/workboards/phui-workboard.css' => 'e6d89647', @@ -863,7 +863,7 @@ return array( 'phui-status-list-view-css' => 'd5263e49', 'phui-tag-view-css' => '6bbd83e2', 'phui-theme-css' => '027ba77e', - 'phui-timeline-view-css' => '8ea41b25', + 'phui-timeline-view-css' => 'c3782437', 'phui-two-column-view-css' => '9fb86c85', 'phui-workboard-color-css' => 'ac6fe6a7', 'phui-workboard-view-css' => 'e6d89647', diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php index ff1eaae553..9741e15124 100644 --- a/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php +++ b/src/applications/transactions/view/PhabricatorApplicationTransactionCommentView.php @@ -343,6 +343,7 @@ class PhabricatorApplicationTransactionCommentView extends AphrontView { array( 'id' => $this->getPreviewPanelID(), 'style' => 'display: none', + 'class' => 'phui-comment-preview-view', ), $preview); } diff --git a/webroot/rsrc/css/phui/phui-timeline-view.css b/webroot/rsrc/css/phui/phui-timeline-view.css index 5394f75303..e6f43f70ad 100644 --- a/webroot/rsrc/css/phui/phui-timeline-view.css +++ b/webroot/rsrc/css/phui/phui-timeline-view.css @@ -417,3 +417,7 @@ a.phui-timeline-menu .phui-icon-view { .phui-timeline-badges .phui-badge-mini .phui-icon-view { font-size: 10px; } + +.phui-comment-preview-view { + margin-bottom: 20px; +} From a75eea7637707e6ee7e0106d4c2ce6f784f71651 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Wed, 22 Jun 2016 13:23:11 -0700 Subject: [PATCH 19/26] Fix spurious timeline entry for badges Summary: Fixes T11164. At least, this fixes it locally for me. I don't know how to code. Copy Pasta! Test Plan: Change name, don't see extra timeline entry on quality set anymore. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T11164 Differential Revision: https://secure.phabricator.com/D16169 --- src/applications/badges/editor/PhabricatorBadgesEditor.php | 2 +- .../badges/storage/PhabricatorBadgesTransaction.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/applications/badges/editor/PhabricatorBadgesEditor.php b/src/applications/badges/editor/PhabricatorBadgesEditor.php index e71dd622c8..45a42a3362 100644 --- a/src/applications/badges/editor/PhabricatorBadgesEditor.php +++ b/src/applications/badges/editor/PhabricatorBadgesEditor.php @@ -47,7 +47,7 @@ final class PhabricatorBadgesEditor case PhabricatorBadgesTransaction::TYPE_ICON: return $object->getIcon(); case PhabricatorBadgesTransaction::TYPE_QUALITY: - return $object->getQuality(); + return (int)$object->getQuality(); case PhabricatorBadgesTransaction::TYPE_STATUS: return $object->getStatus(); case PhabricatorBadgesTransaction::TYPE_AWARD: diff --git a/src/applications/badges/storage/PhabricatorBadgesTransaction.php b/src/applications/badges/storage/PhabricatorBadgesTransaction.php index f088c2d973..22505b247e 100644 --- a/src/applications/badges/storage/PhabricatorBadgesTransaction.php +++ b/src/applications/badges/storage/PhabricatorBadgesTransaction.php @@ -105,14 +105,14 @@ final class PhabricatorBadgesTransaction } break; case self::TYPE_QUALITY: + $qual_new = PhabricatorBadgesQuality::getQualityName($new); + $qual_old = PhabricatorBadgesQuality::getQualityName($old); if ($old === null) { return pht( '%s set the quality for this badge as "%s".', $this->renderHandleLink($author_phid), - $new); + $qual_new); } else { - $qual_new = PhabricatorBadgesQuality::getQualityName($new); - $qual_old = PhabricatorBadgesQuality::getQualityName($old); return pht( '%s updated the quality for this badge from "%s" to "%s".', $this->renderHandleLink($author_phid), From 72588d2eaaa01608d271be39e547a95b0f89b4e4 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 22 Jun 2016 13:36:16 -0700 Subject: [PATCH 20/26] Allow device-to-device SSH to establish SSH sessions Summary: In D16167 I required users to be logged in to be "activated", but this logic doesn't account for that properly when the user is an Almanac device (a cluster host connecting to another cluster host). Don't do this check for device connections, they can always establish sessions. Test Plan: Will push. Reviewers: chad Reviewed By: chad Differential Revision: https://secure.phabricator.com/D16170 --- scripts/ssh/ssh-exec.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/ssh/ssh-exec.php b/scripts/ssh/ssh-exec.php index 56b13ff142..5748e371cf 100755 --- a/scripts/ssh/ssh-exec.php +++ b/scripts/ssh/ssh-exec.php @@ -190,12 +190,14 @@ try { 'P' => $user->getPHID(), )); - if (!$user->canEstablishSSHSessions()) { - throw new Exception( - pht( - 'Your account ("%s") does not have permission to establish SSH '. - 'sessions. Visit the web interface for more information.', - $user_name)); + if (!$device) { + if (!$user->canEstablishSSHSessions()) { + throw new Exception( + pht( + 'Your account ("%s") does not have permission to establish SSH '. + 'sessions. Visit the web interface for more information.', + $user_name)); + } } $workflows = id(new PhutilClassMapQuery()) From a2cb5e1347556d89eeb9c74a46c5ae6587d949c6 Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 23 Jun 2016 05:14:52 -0700 Subject: [PATCH 21/26] Log and continue when trying to destroy edges with no edge definition Summary: Fixes T11201. Test Plan: Created bogus edges like this: ``` INSERT INTO edge (src, type, dst, dateCreated, seq) values ('PHID-TASK-vnddativbialb5p6ymis', 999999, 'quack', UNIX_TIMESTAMP(), 1); ``` Then ran `bin/remove destroy` on the relevant object. Before the patch, destruction halted after hittin the bad edge. After the patch, a warning is emitted but destruction continues. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11201 Differential Revision: https://secure.phabricator.com/D16171 --- .../PhabricatorEdgesDestructionEngineExtension.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php b/src/infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php index b2e41b1575..8993282f59 100644 --- a/src/infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php +++ b/src/infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php @@ -28,10 +28,20 @@ final class PhabricatorEdgesDestructionEngineExtension foreach ($edges as $type => $type_edges) { foreach ($type_edges as $src => $src_edges) { foreach ($src_edges as $dst => $edge) { - $editor->removeEdge($edge['src'], $edge['type'], $edge['dst']); + try { + $editor->removeEdge($edge['src'], $edge['type'], $edge['dst']); + } catch (Exception $ex) { + // We can run into an exception while removing the edge if the + // edge type no longer exists. This prevents us from figuring out + // if there's an inverse type. Just ignore any errors here and + // continue, since the best we can do is clean up all the edges + // we still have information about. See T11201. + phlog($ex); + } } } } + $editor->save(); } From 70463e8a16d4cbe0c83b23b9328c4a359072c506 Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 23 Jun 2016 06:40:03 -0700 Subject: [PATCH 22/26] Handle Subversion SSH on nonstandard ports Summary: Fixes T11203. Subversion handling of `SVN_SSH` commands requires some additional finesse for nonstandard remote SSH ports. We get `domain.com:port` in the command, so parse it out if it's present. Test Plan: @enckse confirmed this locally in T11203. Reviewers: chad Reviewed By: chad Subscribers: enckse Maniphest Tasks: T11203 Differential Revision: https://secure.phabricator.com/D16172 --- scripts/ssh/ssh-connect.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/scripts/ssh/ssh-connect.php b/scripts/ssh/ssh-connect.php index d42a542140..a9bc921e69 100755 --- a/scripts/ssh/ssh-connect.php +++ b/scripts/ssh/ssh-connect.php @@ -88,7 +88,22 @@ if ($as_device) { $arguments[] = AlmanacKeys::getKeyPath('device.key'); } +// Subversion passes us a host in the form "domain.com:port", which is not +// valid for normal SSH but which we can parse into a valid "-p" flag. + +$passthru_args = $unconsumed_argv; +$host = array_shift($passthru_args); +$parts = explode(':', $host, 2); +$host = $parts[0]; + $port = $args->getArg('port'); + +if (!$port) { + if (count($parts) == 2) { + $port = $parts[1]; + } +} + if ($port) { $pattern[] = '-p %d'; $arguments[] = $port; @@ -96,7 +111,9 @@ if ($port) { $pattern[] = '--'; -$passthru_args = $unconsumed_argv; +$pattern[] = '%s'; +$arguments[] = $host; + foreach ($passthru_args as $passthru_arg) { $pattern[] = '%s'; $arguments[] = $passthru_arg; From fd20b89b56d1a954a7a4c86aac735262882c2a79 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Fri, 24 Jun 2016 12:10:20 -0700 Subject: [PATCH 23/26] Break white-space on tags in any property list Summary: Fixes T11209. We want to always break tags when displaying them in a list, but not in general (remarkup). Test Plan: Fake a tag on a differental revision with a really long name. See wrapping. Reviewers: avivey, epriestley Reviewed By: avivey, epriestley Subscribers: avivey, Korvin Maniphest Tasks: T11209 Differential Revision: https://secure.phabricator.com/D16175 --- resources/celerity/map.php | 6 +++--- webroot/rsrc/css/phui/phui-property-list-view.css | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index a26edbf755..a3aadfe9d7 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'cf375d17', + 'core.pkg.css' => 'b6b40555', 'core.pkg.js' => 'f2139810', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => 'b3eea3f5', @@ -149,7 +149,7 @@ return array( 'rsrc/css/phui/phui-pager.css' => 'bea33d23', 'rsrc/css/phui/phui-pinboard-view.css' => '2495140e', 'rsrc/css/phui/phui-profile-menu.css' => 'c8557f33', - 'rsrc/css/phui/phui-property-list-view.css' => 'd4bbd0cb', + 'rsrc/css/phui/phui-property-list-view.css' => '6d8e58ac', 'rsrc/css/phui/phui-remarkup-preview.css' => '1a8f2591', 'rsrc/css/phui/phui-segment-bar-view.css' => '46342871', 'rsrc/css/phui/phui-spacing.css' => '042804d6', @@ -856,7 +856,7 @@ return array( 'phui-pager-css' => 'bea33d23', 'phui-pinboard-view-css' => '2495140e', 'phui-profile-menu-css' => 'c8557f33', - 'phui-property-list-view-css' => 'd4bbd0cb', + 'phui-property-list-view-css' => '6d8e58ac', 'phui-remarkup-preview-css' => '1a8f2591', 'phui-segment-bar-view-css' => '46342871', 'phui-spacing-css' => '042804d6', diff --git a/webroot/rsrc/css/phui/phui-property-list-view.css b/webroot/rsrc/css/phui/phui-property-list-view.css index 373a65d153..769a139664 100644 --- a/webroot/rsrc/css/phui/phui-property-list-view.css +++ b/webroot/rsrc/css/phui/phui-property-list-view.css @@ -169,8 +169,9 @@ /* When tags appear in property lists, give them a little more vertical spacing. */ -.phui-property-list-view .phui-tag-view { +.phui-property-list-value .phui-tag-view { margin: 2px 0; + white-space: pre-wrap; } .phui-property-list-has-actions .phui-property-list-properties-wrap { From 89f9f97159b7188ebc1f445b6be9a58977c1dac5 Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 24 Jun 2016 08:48:06 -0700 Subject: [PATCH 24/26] Provide basic support for Subversion revprops Summary: Ref T11208. See that task for a more detailed description of revprops. This allows revprop changes in a hosted Subversion repository if the repository has the "allow dangerous changes" flag set. In the future, we could expand this into real Herald support, but the only use case we have for now is letting `svnsync` work. Test Plan: Edited revprops with `svn propset --revprop -r 2 propkey propvalue repositoryuri`: - Tried before patch, got a "configure a commit hook" error. - Tried after patch, got a "dangerous change" error. - Allowed dangerous changes. - Did a revprop edit. - Prevented dangerous changes. - Got an error again. - Made a normal commit to an SVN repository. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11208 Differential Revision: https://secure.phabricator.com/D16174 --- scripts/repository/commit_hook.php | 54 +++++++++++++++- ...usionRepositoryEditDangerousController.php | 61 ++++++++++--------- .../PhabricatorRepositoryPullEngine.php | 17 ++++-- .../storage/PhabricatorRepository.php | 7 +-- 4 files changed, 102 insertions(+), 37 deletions(-) diff --git a/scripts/repository/commit_hook.php b/scripts/repository/commit_hook.php index 4f6997c52a..44c772225c 100755 --- a/scripts/repository/commit_hook.php +++ b/scripts/repository/commit_hook.php @@ -54,10 +54,62 @@ if (!$repository->isHosted()) { $engine->setRepository($repository); +$args = new PhutilArgumentParser($argv); +$args->parsePartial( + array( + array( + 'name' => 'hook-mode', + 'param' => 'mode', + 'help' => pht('Hook execution mode.'), + ), + )); + +$argv = array_merge( + array($argv[0]), + $args->getUnconsumedArgumentVector()); // Figure out which user is writing the commit. +$hook_mode = $args->getArg('hook-mode'); +if ($hook_mode !== null) { + $known_modes = array( + 'svn-revprop' => true, + ); -if ($repository->isGit() || $repository->isHg()) { + if (empty($known_modes[$hook_mode])) { + throw new Exception( + pht( + 'Invalid Hook Mode: This hook was invoked in "%s" mode, but this '. + 'is not a recognized hook mode. Valid modes are: %s.', + $hook_mode, + implode(', ', array_keys($known_modes)))); + } +} + +$is_svnrevprop = ($hook_mode == 'svn-revprop'); + +if ($is_svnrevprop) { + // For now, we let these through if the repository allows dangerous changes + // and prevent them if it doesn't. See T11208 for discussion. + + $revprop_key = $argv[5]; + + if ($repository->shouldAllowDangerousChanges()) { + $err = 0; + } else { + $err = 1; + + $console = PhutilConsole::getConsole(); + $console->writeErr( + pht( + "DANGEROUS CHANGE: Dangerous change protection is enabled for this ". + "repository, so you can not change revision properties (you are ". + "attempting to edit \"%s\").\n". + "Edit the repository configuration before making dangerous changes.", + $revprop_key)); + } + + exit($err); +} else if ($repository->isGit() || $repository->isHg()) { $username = getenv(DiffusionCommitHookEngine::ENV_USER); if (!strlen($username)) { throw new Exception( diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php index d0dd2cc2e9..1088733cfc 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php @@ -18,25 +18,14 @@ final class DiffusionRepositoryEditDangerousController ->getPanelURI(); if (!$repository->canAllowDangerousChanges()) { - if ($repository->isSVN()) { - return $this->newDialog() - ->setTitle(pht('Not in Danger')) - ->appendParagraph( - pht( - 'It is not possible for users to push any dangerous changes '. - 'to a Subversion repository. Pushes to a Subversion repository '. - 'can always be reverted and never destroy data.')) - ->addCancelButton($panel_uri); - } else { - return $this->newDialog() - ->setTitle(pht('Unprotectable Repository')) - ->appendParagraph( - pht( - 'This repository can not be protected from dangerous changes '. - 'because Phabricator does not control what users are allowed '. - 'to push to it.')) - ->addCancelButton($panel_uri); - } + return $this->newDialog() + ->setTitle(pht('Unprotectable Repository')) + ->appendParagraph( + pht( + 'This repository can not be protected from dangerous changes '. + 'because Phabricator does not control what users are allowed '. + 'to push to it.')) + ->addCancelButton($panel_uri); } if ($request->isFormPost()) { @@ -57,18 +46,34 @@ final class DiffusionRepositoryEditDangerousController if ($repository->shouldAllowDangerousChanges()) { $title = pht('Prevent Dangerous Changes'); - $body = pht( - 'It will no longer be possible to delete branches from this '. - 'repository, or %s push to this repository.', - $force); + + if ($repository->isSVN()) { + $body = pht( + 'It will no longer be possible to edit revprops in this '. + 'repository.'); + } else { + $body = pht( + 'It will no longer be possible to delete branches from this '. + 'repository, or %s push to this repository.', + $force); + } + $submit = pht('Prevent Dangerous Changes'); } else { $title = pht('Allow Dangerous Changes'); - $body = pht( - 'If you allow dangerous changes, it will be possible to delete '. - 'branches and %s push this repository. These operations can '. - 'alter a repository in a way that is difficult to recover from.', - $force); + if ($repository->isSVN()) { + $body = pht( + 'If you allow dangerous changes, it will be possible to edit '. + 'reprops in this repository, including arbitrarily rewriting '. + 'commit messages. These operations can alter a repository in a '. + 'way that is difficult to recover from.'); + } else { + $body = pht( + 'If you allow dangerous changes, it will be possible to delete '. + 'branches and %s push this repository. These operations can '. + 'alter a repository in a way that is difficult to recover from.', + $force); + } $submit = pht('Allow Dangerous Changes'); } diff --git a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php index 7e54bf4620..08fe8ea224 100644 --- a/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryPullEngine.php @@ -191,7 +191,7 @@ final class PhabricatorRepositoryPullEngine )); } - private function installHook($path) { + private function installHook($path, array $hook_argv = array()) { $this->log('%s', pht('Installing commit hook to "%s"...', $path)); $repository = $this->getRepository(); @@ -202,10 +202,11 @@ final class PhabricatorRepositoryPullEngine $full_php_path = Filesystem::resolveBinary('php'); $cmd = csprintf( - 'exec %s -f %s -- %s "$@"', + 'exec %s -f %s -- %s %Ls "$@"', $full_php_path, $bin, - $identifier); + $identifier, + $hook_argv); $hook = "#!/bin/sh\nexport TERM=dumb\n{$cmd}\n"; @@ -585,8 +586,16 @@ final class PhabricatorRepositoryPullEngine $root = $repository->getLocalPath(); $path = '/hooks/pre-commit'; - $this->installHook($root.$path); + + $revprop_path = '/hooks/pre-revprop-change'; + + $revprop_argv = array( + '--hook-mode', + 'svn-revprop', + ); + + $this->installHook($root.$revprop_path, $revprop_argv); } diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php index d0f3f9f4d8..4a7e3d4681 100644 --- a/src/applications/repository/storage/PhabricatorRepository.php +++ b/src/applications/repository/storage/PhabricatorRepository.php @@ -1623,11 +1623,10 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO return false; } - if ($this->isGit() || $this->isHg()) { - return true; - } + // In Git and Mercurial, ref deletions and rewrites are dangerous. + // In Subversion, editing revprops is dangerous. - return false; + return true; } public function shouldAllowDangerousChanges() { From af5001db642d2546bcc8e5af79f0d0c6a79eb75d Mon Sep 17 00:00:00 2001 From: Chad Little Date: Fri, 24 Jun 2016 14:09:49 -0700 Subject: [PATCH 25/26] Allow PhameBlog to take a full URI instead of just a domain name Summary: Ref T9897. This moves "Domain" to "DomainFullURI" to allow setting of https or for some reason, a port. I guess. Test Plan: Try to break by setting a path, or fake protocol. Set to http, or https, see correct redirects. Verify domain still gets written. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T9897 Differential Revision: https://secure.phabricator.com/D16173 --- .../20160623.phame.blog.fulldomain.1.sql | 2 + .../20160623.phame.blog.fulldomain.2.sql | 3 ++ .../20160623.phame.blog.fulldomain.3.sql | 3 ++ .../blog/PhameBlogManageController.php | 9 ++--- .../phame/editor/PhameBlogEditEngine.php | 14 +++---- .../phame/editor/PhameBlogEditor.php | 29 +++++++++----- src/applications/phame/storage/PhameBlog.php | 38 +++++++++---------- .../phame/storage/PhameBlogTransaction.php | 14 +++---- 8 files changed, 64 insertions(+), 48 deletions(-) create mode 100644 resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql create mode 100644 resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql create mode 100644 resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql new file mode 100644 index 0000000000..96fc3b27ba --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD domainFullURI VARCHAR(128) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql new file mode 100644 index 0000000000..a323333c85 --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_phame.phame_blog + SET domainFullURI = CONCAT('http://', domain, '/') + WHERE domain IS NOT NULL; diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql new file mode 100644 index 0000000000..05f6009de1 --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_phame.phame_blogtransaction + SET transactionType = 'phame.blog.full.domain' + WHERE transactionType = 'phame.blog.domain'; diff --git a/src/applications/phame/controller/blog/PhameBlogManageController.php b/src/applications/phame/controller/blog/PhameBlogManageController.php index a87b02070d..4085d3ef6b 100644 --- a/src/applications/phame/controller/blog/PhameBlogManageController.php +++ b/src/applications/phame/controller/blog/PhameBlogManageController.php @@ -97,12 +97,11 @@ final class PhameBlogManageController extends PhameBlogController { $properties = id(new PHUIPropertyListView()) ->setUser($viewer); - $domain = $blog->getDomain(); - if (!$domain) { - $domain = phutil_tag('em', array(), pht('No external domain')); + $full_domain = $blog->getDomainFullURI(); + if (!$full_domain) { + $full_domain = phutil_tag('em', array(), pht('No external domain')); } - - $properties->addProperty(pht('Domain'), $domain); + $properties->addProperty(pht('Full Domain'), $full_domain); $parent_site = $blog->getParentSite(); if (!$parent_site) { diff --git a/src/applications/phame/editor/PhameBlogEditEngine.php b/src/applications/phame/editor/PhameBlogEditEngine.php index 70d878e15a..5f96309e8b 100644 --- a/src/applications/phame/editor/PhameBlogEditEngine.php +++ b/src/applications/phame/editor/PhameBlogEditEngine.php @@ -94,13 +94,13 @@ final class PhameBlogEditEngine ->setTransactionType(PhameBlogTransaction::TYPE_DESCRIPTION) ->setValue($object->getDescription()), id(new PhabricatorTextEditField()) - ->setKey('domain') - ->setLabel(pht('Custom Domain')) - ->setDescription(pht('Blog domain name.')) - ->setConduitDescription(pht('Change the blog domain.')) - ->setConduitTypeDescription(pht('New blog domain.')) - ->setValue($object->getDomain()) - ->setTransactionType(PhameBlogTransaction::TYPE_DOMAIN), + ->setKey('domainFullURI') + ->setLabel(pht('Full Domain URI')) + ->setDescription(pht('Blog full domain URI.')) + ->setConduitDescription(pht('Change the blog full domain URI.')) + ->setConduitTypeDescription(pht('New blog full domain URI.')) + ->setValue($object->getDomainFullURI()) + ->setTransactionType(PhameBlogTransaction::TYPE_FULLDOMAIN), id(new PhabricatorTextEditField()) ->setKey('parentSite') ->setLabel(pht('Parent Site')) diff --git a/src/applications/phame/editor/PhameBlogEditor.php b/src/applications/phame/editor/PhameBlogEditor.php index d2a9fcbc1f..197387985b 100644 --- a/src/applications/phame/editor/PhameBlogEditor.php +++ b/src/applications/phame/editor/PhameBlogEditor.php @@ -17,7 +17,7 @@ final class PhameBlogEditor $types[] = PhameBlogTransaction::TYPE_NAME; $types[] = PhameBlogTransaction::TYPE_SUBTITLE; $types[] = PhameBlogTransaction::TYPE_DESCRIPTION; - $types[] = PhameBlogTransaction::TYPE_DOMAIN; + $types[] = PhameBlogTransaction::TYPE_FULLDOMAIN; $types[] = PhameBlogTransaction::TYPE_PARENTSITE; $types[] = PhameBlogTransaction::TYPE_PARENTDOMAIN; $types[] = PhameBlogTransaction::TYPE_STATUS; @@ -38,8 +38,8 @@ final class PhameBlogEditor return $object->getSubtitle(); case PhameBlogTransaction::TYPE_DESCRIPTION: return $object->getDescription(); - case PhameBlogTransaction::TYPE_DOMAIN: - return $object->getDomain(); + case PhameBlogTransaction::TYPE_FULLDOMAIN: + return $object->getDomainFullURI(); case PhameBlogTransaction::TYPE_PARENTSITE: return $object->getParentSite(); case PhameBlogTransaction::TYPE_PARENTDOMAIN: @@ -61,7 +61,7 @@ final class PhameBlogEditor case PhameBlogTransaction::TYPE_PARENTSITE: case PhameBlogTransaction::TYPE_PARENTDOMAIN: return $xaction->getNewValue(); - case PhameBlogTransaction::TYPE_DOMAIN: + case PhameBlogTransaction::TYPE_FULLDOMAIN: $domain = $xaction->getNewValue(); if (!strlen($xaction->getNewValue())) { return null; @@ -81,8 +81,17 @@ final class PhameBlogEditor return $object->setSubtitle($xaction->getNewValue()); case PhameBlogTransaction::TYPE_DESCRIPTION: return $object->setDescription($xaction->getNewValue()); - case PhameBlogTransaction::TYPE_DOMAIN: - return $object->setDomain($xaction->getNewValue()); + case PhameBlogTransaction::TYPE_FULLDOMAIN: + $new_value = $xaction->getNewValue(); + if (strlen($new_value)) { + $uri = new PhutilURI($new_value); + $domain = $uri->getDomain(); + $object->setDomain($domain); + } else { + $object->setDomain(null); + } + $object->setDomainFullURI($new_value); + return; case PhameBlogTransaction::TYPE_STATUS: return $object->setStatus($xaction->getNewValue()); case PhameBlogTransaction::TYPE_PARENTSITE: @@ -102,7 +111,7 @@ final class PhameBlogEditor case PhameBlogTransaction::TYPE_NAME: case PhameBlogTransaction::TYPE_SUBTITLE: case PhameBlogTransaction::TYPE_DESCRIPTION: - case PhameBlogTransaction::TYPE_DOMAIN: + case PhameBlogTransaction::TYPE_FULLDOMAIN: case PhameBlogTransaction::TYPE_PARENTSITE: case PhameBlogTransaction::TYPE_PARENTDOMAIN: case PhameBlogTransaction::TYPE_STATUS: @@ -156,7 +165,7 @@ final class PhameBlogEditor $errors[] = $error; } break; - case PhameBlogTransaction::TYPE_DOMAIN: + case PhameBlogTransaction::TYPE_FULLDOMAIN: if (!$xactions) { continue; } @@ -185,9 +194,11 @@ final class PhameBlogEditor nonempty(last($xactions), null)); $errors[] = $error; } + $domain = new PhutilURI($custom_domain); + $domain = $domain->getDomain(); $duplicate_blog = id(new PhameBlogQuery()) ->setViewer(PhabricatorUser::getOmnipotentUser()) - ->withDomain($custom_domain) + ->withDomain($domain) ->executeOne(); if ($duplicate_blog && $duplicate_blog->getID() != $object->getID()) { $error = new PhabricatorApplicationTransactionValidationError( diff --git a/src/applications/phame/storage/PhameBlog.php b/src/applications/phame/storage/PhameBlog.php index 4f092cd3f1..6d9c51071a 100644 --- a/src/applications/phame/storage/PhameBlog.php +++ b/src/applications/phame/storage/PhameBlog.php @@ -18,6 +18,7 @@ final class PhameBlog extends PhameDAO protected $subtitle; protected $description; protected $domain; + protected $domainFullURI; protected $parentSite; protected $parentDomain; protected $configData; @@ -46,6 +47,7 @@ final class PhameBlog extends PhameDAO 'subtitle' => 'text64', 'description' => 'text', 'domain' => 'text128?', + 'domainFullURI' => 'text128?', 'parentSite' => 'text128', 'parentDomain' => 'text128', 'status' => 'text32', @@ -112,34 +114,29 @@ final class PhameBlog extends PhameDAO * * @return string */ - public function validateCustomDomain($custom_domain) { - $example_domain = 'blog.example.com'; + public function validateCustomDomain($domain_full_uri) { + $example_domain = 'http://blog.example.com/'; $label = pht('Invalid'); // note this "uri" should be pretty busted given the desired input // so just use it to test if there's a protocol specified - $uri = new PhutilURI($custom_domain); - if ($uri->getProtocol()) { + $uri = new PhutilURI($domain_full_uri); + $domain = $uri->getDomain(); + $protocol = $uri->getProtocol(); + $path = $uri->getPath(); + $supported_protocols = array('http', 'https'); + + if (!in_array($protocol, $supported_protocols)) { return array( $label, pht( - 'The custom domain should not include a protocol. Just provide '. - 'the bare domain name (for example, "%s").', + 'The custom domain should include a valid protocol in the URI '. + '(for example, "%s"). Valid protocols are "http" or "https".', $example_domain), - ); + ); } - if ($uri->getPort()) { - return array( - $label, - pht( - 'The custom domain should not include a port number. Just provide '. - 'the bare domain name (for example, "%s").', - $example_domain), - ); - } - - if (strpos($custom_domain, '/') !== false) { + if (strlen($path) && $path != '/') { return array( $label, pht( @@ -150,7 +147,7 @@ final class PhameBlog extends PhameDAO ); } - if (strpos($custom_domain, '.') === false) { + if (strpos($domain, '.') === false) { return array( $label, pht( @@ -191,7 +188,8 @@ final class PhameBlog extends PhameDAO } public function getExternalLiveURI() { - $uri = new PhutilURI('http://'.$this->getDomain().'/'); + $uri = new PhutilURI($this->getDomainFullURI()); + PhabricatorEnv::requireValidRemoteURIForLink($uri); return (string)$uri; } diff --git a/src/applications/phame/storage/PhameBlogTransaction.php b/src/applications/phame/storage/PhameBlogTransaction.php index 91c6552666..2d74ca5cc6 100644 --- a/src/applications/phame/storage/PhameBlogTransaction.php +++ b/src/applications/phame/storage/PhameBlogTransaction.php @@ -6,7 +6,7 @@ final class PhameBlogTransaction const TYPE_NAME = 'phame.blog.name'; const TYPE_SUBTITLE = 'phame.blog.subtitle'; const TYPE_DESCRIPTION = 'phame.blog.description'; - const TYPE_DOMAIN = 'phame.blog.domain'; + const TYPE_FULLDOMAIN = 'phame.blog.full.domain'; const TYPE_STATUS = 'phame.blog.status'; const TYPE_PARENTSITE = 'phame.blog.parent.site'; const TYPE_PARENTDOMAIN = 'phame.blog.parent.domain'; @@ -46,7 +46,7 @@ final class PhameBlogTransaction } break; case self::TYPE_DESCRIPTION: - case self::TYPE_DOMAIN: + case self::TYPE_FULLDOMAIN: return 'fa-pencil'; case self::TYPE_STATUS: if ($new == PhameBlog::STATUS_ARCHIVED) { @@ -85,7 +85,7 @@ final class PhameBlogTransaction case self::TYPE_NAME: case self::TYPE_SUBTITLE: case self::TYPE_DESCRIPTION: - case self::TYPE_DOMAIN: + case self::TYPE_FULLDOMAIN: case self::TYPE_PARENTSITE: case self::TYPE_PARENTDOMAIN: $tags[] = self::MAILTAG_DETAILS; @@ -140,9 +140,9 @@ final class PhameBlogTransaction '%s updated the blog\'s description.', $this->renderHandleLink($author_phid)); break; - case self::TYPE_DOMAIN: + case self::TYPE_FULLDOMAIN: return pht( - '%s updated the blog\'s domain to "%s".', + '%s updated the blog\'s full domain to "%s".', $this->renderHandleLink($author_phid), $new); break; @@ -230,9 +230,9 @@ final class PhameBlogTransaction $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); break; - case self::TYPE_DOMAIN: + case self::TYPE_FULLDOMAIN: return pht( - '%s updated the domain for %s.', + '%s updated the full domain for %s.', $this->renderHandleLink($author_phid), $this->renderHandleLink($object_phid)); break; From e984f0eb76fea6e6777706e9f16105208d112f43 Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 24 Jun 2016 14:15:35 -0700 Subject: [PATCH 26/26] Update quickstart.sql Summary: We haven't refreshed this in a while. Test Plan: Saw unit test times drop about 1.5 seconds locally. Reviewers: chad Reviewed By: chad Differential Revision: https://secure.phabricator.com/D16176 --- resources/sql/quickstart.sql | 548 ++++++++++++++++++++++++++++------- 1 file changed, 450 insertions(+), 98 deletions(-) diff --git a/resources/sql/quickstart.sql b/resources/sql/quickstart.sql index 1d1defd6de..0574c57c8e 100644 --- a/resources/sql/quickstart.sql +++ b/resources/sql/quickstart.sql @@ -269,6 +269,8 @@ CREATE TABLE `countdown` ( `mailKey` binary(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), + KEY `key_epoch` (`epoch`), + KEY `key_author` (`authorPHID`,`epoch`), KEY `key_space` (`spacePHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; @@ -713,6 +715,15 @@ CREATE TABLE `drydock_blueprint` ( UNIQUE KEY `key_phid` (`phid`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `drydock_blueprintname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `drydock_blueprinttransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -825,6 +836,24 @@ CREATE TABLE `drydock_slotlock` ( KEY `key_owner` (`ownerPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_feed` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; USE `{$NAMESPACE}_feed`; @@ -1149,10 +1178,12 @@ CREATE TABLE `harbormaster_buildartifact` ( `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, `buildTargetPHID` varbinary(64) NOT NULL, + `isReleased` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_artifact` (`artifactType`,`artifactIndex`), UNIQUE KEY `key_phid` (`phid`), - KEY `key_garbagecollect` (`artifactType`,`dateCreated`) + KEY `key_garbagecollect` (`artifactType`,`dateCreated`), + KEY `key_target` (`buildTargetPHID`,`artifactType`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `harbormaster_buildcommand` ( @@ -1236,6 +1267,15 @@ CREATE TABLE `harbormaster_buildplan` ( KEY `key_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `harbormaster_buildplanname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `harbormaster_buildplantransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -1577,7 +1617,6 @@ CREATE TABLE `maniphest_task` ( `phid` varbinary(64) NOT NULL, `authorPHID` varbinary(64) NOT NULL, `ownerPHID` varbinary(64) DEFAULT NULL, - `attached` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `status` varchar(12) COLLATE {$COLLATE_TEXT} NOT NULL, `priority` int(10) unsigned NOT NULL, `title` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, @@ -1585,7 +1624,6 @@ CREATE TABLE `maniphest_task` ( `description` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `projectPHIDs` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `mailKey` binary(20) NOT NULL, `ownerOrdering` varchar(64) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `originalEmailSource` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, @@ -1593,8 +1631,12 @@ CREATE TABLE `maniphest_task` ( `viewPolicy` varbinary(64) NOT NULL, `editPolicy` varbinary(64) NOT NULL, `spacePHID` varbinary(64) DEFAULT NULL, + `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `points` double DEFAULT NULL, + `bridgedObjectPHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_bridgedobject` (`bridgedObjectPHID`), KEY `priority` (`priority`,`status`), KEY `status` (`status`), KEY `ownerPHID` (`ownerPHID`,`status`), @@ -1657,7 +1699,7 @@ CREATE TABLE `patch_status` ( PRIMARY KEY (`patch`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -INSERT INTO `patch_status` VALUES ('phabricator:000.project.sql',1453226118,NULL),('phabricator:0000.legacy.sql',1453226118,NULL),('phabricator:001.maniphest_projects.sql',1453226118,NULL),('phabricator:002.oauth.sql',1453226118,NULL),('phabricator:003.more_oauth.sql',1453226118,NULL),('phabricator:004.daemonrepos.sql',1453226118,NULL),('phabricator:005.workers.sql',1453226118,NULL),('phabricator:006.repository.sql',1453226118,NULL),('phabricator:007.daemonlog.sql',1453226118,NULL),('phabricator:008.repoopt.sql',1453226118,NULL),('phabricator:009.repo_summary.sql',1453226118,NULL),('phabricator:010.herald.sql',1453226118,NULL),('phabricator:011.badcommit.sql',1453226118,NULL),('phabricator:012.dropphidtype.sql',1453226118,NULL),('phabricator:013.commitdetail.sql',1453226118,NULL),('phabricator:014.shortcuts.sql',1453226118,NULL),('phabricator:015.preferences.sql',1453226118,NULL),('phabricator:016.userrealnameindex.sql',1453226118,NULL),('phabricator:017.sessionkeys.sql',1453226118,NULL),('phabricator:018.owners.sql',1453226118,NULL),('phabricator:019.arcprojects.sql',1453226118,NULL),('phabricator:020.pathcapital.sql',1453226118,NULL),('phabricator:021.xhpastview.sql',1453226118,NULL),('phabricator:022.differentialcommit.sql',1453226118,NULL),('phabricator:023.dxkeys.sql',1453226118,NULL),('phabricator:024.mlistkeys.sql',1453226118,NULL),('phabricator:025.commentopt.sql',1453226118,NULL),('phabricator:026.diffpropkey.sql',1453226118,NULL),('phabricator:027.metamtakeys.sql',1453226118,NULL),('phabricator:028.systemagent.sql',1453226118,NULL),('phabricator:029.cursors.sql',1453226118,NULL),('phabricator:030.imagemacro.sql',1453226118,NULL),('phabricator:031.workerrace.sql',1453226118,NULL),('phabricator:032.viewtime.sql',1453226118,NULL),('phabricator:033.privtest.sql',1453226118,NULL),('phabricator:034.savedheader.sql',1453226118,NULL),('phabricator:035.proxyimage.sql',1453226118,NULL),('phabricator:036.mailkey.sql',1453226119,NULL),('phabricator:037.setuptest.sql',1453226119,NULL),('phabricator:038.admin.sql',1453226119,NULL),('phabricator:039.userlog.sql',1453226119,NULL),('phabricator:040.transform.sql',1453226119,NULL),('phabricator:041.heraldrepetition.sql',1453226119,NULL),('phabricator:042.commentmetadata.sql',1453226119,NULL),('phabricator:043.pastebin.sql',1453226119,NULL),('phabricator:044.countdown.sql',1453226119,NULL),('phabricator:045.timezone.sql',1453226119,NULL),('phabricator:046.conduittoken.sql',1453226119,NULL),('phabricator:047.projectstatus.sql',1453226119,NULL),('phabricator:048.relationshipkeys.sql',1453226119,NULL),('phabricator:049.projectowner.sql',1453226119,NULL),('phabricator:050.taskdenormal.sql',1453226119,NULL),('phabricator:051.projectfilter.sql',1453226119,NULL),('phabricator:052.pastelanguage.sql',1453226119,NULL),('phabricator:053.feed.sql',1453226119,NULL),('phabricator:054.subscribers.sql',1453226119,NULL),('phabricator:055.add_author_to_files.sql',1453226119,NULL),('phabricator:056.slowvote.sql',1453226119,NULL),('phabricator:057.parsecache.sql',1453226119,NULL),('phabricator:058.missingkeys.sql',1453226119,NULL),('phabricator:059.engines.php',1453226120,NULL),('phabricator:060.phriction.sql',1453226120,NULL),('phabricator:061.phrictioncontent.sql',1453226120,NULL),('phabricator:062.phrictionmenu.sql',1453226120,NULL),('phabricator:063.pasteforks.sql',1453226120,NULL),('phabricator:064.subprojects.sql',1453226120,NULL),('phabricator:065.sshkeys.sql',1453226120,NULL),('phabricator:066.phrictioncontent.sql',1453226120,NULL),('phabricator:067.preferences.sql',1453226120,NULL),('phabricator:068.maniphestauxiliarystorage.sql',1453226120,NULL),('phabricator:069.heraldxscript.sql',1453226120,NULL),('phabricator:070.differentialaux.sql',1453226120,NULL),('phabricator:071.contentsource.sql',1453226120,NULL),('phabricator:072.blamerevert.sql',1453226120,NULL),('phabricator:073.reposymbols.sql',1453226120,NULL),('phabricator:074.affectedpath.sql',1453226120,NULL),('phabricator:075.revisionhash.sql',1453226120,NULL),('phabricator:076.indexedlanguages.sql',1453226120,NULL),('phabricator:077.originalemail.sql',1453226120,NULL),('phabricator:078.nametoken.sql',1453226120,NULL),('phabricator:079.nametokenindex.php',1453226120,NULL),('phabricator:080.filekeys.sql',1453226120,NULL),('phabricator:081.filekeys.php',1453226120,NULL),('phabricator:082.xactionkey.sql',1453226120,NULL),('phabricator:083.dxviewtime.sql',1453226120,NULL),('phabricator:084.pasteauthorkey.sql',1453226120,NULL),('phabricator:085.packagecommitrelationship.sql',1453226120,NULL),('phabricator:086.formeraffil.sql',1453226120,NULL),('phabricator:087.phrictiondelete.sql',1453226120,NULL),('phabricator:088.audit.sql',1453226120,NULL),('phabricator:089.projectwiki.sql',1453226120,NULL),('phabricator:090.forceuniqueprojectnames.php',1453226120,NULL),('phabricator:091.uniqueslugkey.sql',1453226120,NULL),('phabricator:092.dropgithubnotification.sql',1453226120,NULL),('phabricator:093.gitremotes.php',1453226120,NULL),('phabricator:094.phrictioncolumn.sql',1453226120,NULL),('phabricator:095.directory.sql',1453226120,NULL),('phabricator:096.filename.sql',1453226120,NULL),('phabricator:097.heraldruletypes.sql',1453226120,NULL),('phabricator:098.heraldruletypemigration.php',1453226120,NULL),('phabricator:099.drydock.sql',1453226120,NULL),('phabricator:100.projectxaction.sql',1453226120,NULL),('phabricator:101.heraldruleapplied.sql',1453226120,NULL),('phabricator:102.heraldcleanup.php',1453226120,NULL),('phabricator:103.heraldedithistory.sql',1453226120,NULL),('phabricator:104.searchkey.sql',1453226120,NULL),('phabricator:105.mimetype.sql',1453226120,NULL),('phabricator:106.chatlog.sql',1453226120,NULL),('phabricator:107.oauthserver.sql',1453226120,NULL),('phabricator:108.oauthscope.sql',1453226120,NULL),('phabricator:109.oauthclientphidkey.sql',1453226120,NULL),('phabricator:110.commitaudit.sql',1453226121,NULL),('phabricator:111.commitauditmigration.php',1453226121,NULL),('phabricator:112.oauthaccesscoderedirecturi.sql',1453226121,NULL),('phabricator:113.lastreviewer.sql',1453226121,NULL),('phabricator:114.auditrequest.sql',1453226121,NULL),('phabricator:115.prepareutf8.sql',1453226121,NULL),('phabricator:116.utf8-backup-first-expect-wait.sql',1453226122,NULL),('phabricator:117.repositorydescription.php',1453226122,NULL),('phabricator:118.auditinline.sql',1453226122,NULL),('phabricator:119.filehash.sql',1453226123,NULL),('phabricator:120.noop.sql',1453226123,NULL),('phabricator:121.drydocklog.sql',1453226123,NULL),('phabricator:122.flag.sql',1453226123,NULL),('phabricator:123.heraldrulelog.sql',1453226123,NULL),('phabricator:124.subpriority.sql',1453226123,NULL),('phabricator:125.ipv6.sql',1453226123,NULL),('phabricator:126.edges.sql',1453226123,NULL),('phabricator:127.userkeybody.sql',1453226123,NULL),('phabricator:128.phabricatorcom.sql',1453226123,NULL),('phabricator:129.savedquery.sql',1453226123,NULL),('phabricator:130.denormalrevisionquery.sql',1453226123,NULL),('phabricator:131.migraterevisionquery.php',1453226123,NULL),('phabricator:132.phame.sql',1453226123,NULL),('phabricator:133.imagemacro.sql',1453226123,NULL),('phabricator:134.emptysearch.sql',1453226123,NULL),('phabricator:135.datecommitted.sql',1453226123,NULL),('phabricator:136.sex.sql',1453226123,NULL),('phabricator:137.auditmetadata.sql',1453226123,NULL),('phabricator:138.notification.sql',1453226123,NULL),('phabricator:20121209.pholioxactions.sql',1453226124,NULL),('phabricator:20121209.xmacroadd.sql',1453226124,NULL),('phabricator:20121209.xmacromigrate.php',1453226124,NULL),('phabricator:20121209.xmacromigratekey.sql',1453226124,NULL),('phabricator:20121220.generalcache.sql',1453226124,NULL),('phabricator:20121226.config.sql',1453226124,NULL),('phabricator:20130101.confxaction.sql',1453226124,NULL),('phabricator:20130102.metamtareceivedmailmessageidhash.sql',1453226124,NULL),('phabricator:20130103.filemetadata.sql',1453226124,NULL),('phabricator:20130111.conpherence.sql',1453226124,NULL),('phabricator:20130127.altheraldtranscript.sql',1453226124,NULL),('phabricator:20130131.conpherencepics.sql',1453226124,NULL),('phabricator:20130201.revisionunsubscribed.php',1453226124,NULL),('phabricator:20130201.revisionunsubscribed.sql',1453226124,NULL),('phabricator:20130214.chatlogchannel.sql',1453226124,NULL),('phabricator:20130214.chatlogchannelid.sql',1453226124,NULL),('phabricator:20130214.token.sql',1453226124,NULL),('phabricator:20130215.phabricatorfileaddttl.sql',1453226124,NULL),('phabricator:20130217.cachettl.sql',1453226124,NULL),('phabricator:20130218.longdaemon.sql',1453226124,NULL),('phabricator:20130218.updatechannelid.php',1453226124,NULL),('phabricator:20130219.commitsummary.sql',1453226124,NULL),('phabricator:20130219.commitsummarymig.php',1453226124,NULL),('phabricator:20130222.dropchannel.sql',1453226124,NULL),('phabricator:20130226.commitkey.sql',1453226124,NULL),('phabricator:20130304.lintauthor.sql',1453226124,NULL),('phabricator:20130310.xactionmeta.sql',1453226124,NULL),('phabricator:20130317.phrictionedge.sql',1453226124,NULL),('phabricator:20130319.conpherence.sql',1453226124,NULL),('phabricator:20130319.phabricatorfileexplicitupload.sql',1453226124,NULL),('phabricator:20130320.phlux.sql',1453226124,NULL),('phabricator:20130321.token.sql',1453226124,NULL),('phabricator:20130322.phortune.sql',1453226124,NULL),('phabricator:20130323.phortunepayment.sql',1453226124,NULL),('phabricator:20130324.phortuneproduct.sql',1453226124,NULL),('phabricator:20130330.phrequent.sql',1453226124,NULL),('phabricator:20130403.conpherencecache.sql',1453226124,NULL),('phabricator:20130403.conpherencecachemig.php',1453226124,NULL),('phabricator:20130409.commitdrev.php',1453226124,NULL),('phabricator:20130417.externalaccount.sql',1453226124,NULL),('phabricator:20130423.conpherenceindices.sql',1453226125,NULL),('phabricator:20130423.phortunepaymentrevised.sql',1453226125,NULL),('phabricator:20130423.updateexternalaccount.sql',1453226124,NULL),('phabricator:20130426.search_savedquery.sql',1453226125,NULL),('phabricator:20130502.countdownrevamp1.sql',1453226125,NULL),('phabricator:20130502.countdownrevamp2.php',1453226125,NULL),('phabricator:20130502.countdownrevamp3.sql',1453226125,NULL),('phabricator:20130507.releephrqmailkey.sql',1453226125,NULL),('phabricator:20130507.releephrqmailkeypop.php',1453226125,NULL),('phabricator:20130507.releephrqsimplifycols.sql',1453226125,NULL),('phabricator:20130508.releephtransactions.sql',1453226125,NULL),('phabricator:20130508.releephtransactionsmig.php',1453226125,NULL),('phabricator:20130508.search_namedquery.sql',1453226125,NULL),('phabricator:20130513.receviedmailstatus.sql',1453226125,NULL),('phabricator:20130519.diviner.sql',1453226125,NULL),('phabricator:20130521.dropconphimages.sql',1453226125,NULL),('phabricator:20130523.maniphest_owners.sql',1453226125,NULL),('phabricator:20130524.repoxactions.sql',1453226125,NULL),('phabricator:20130529.macroauthor.sql',1453226125,NULL),('phabricator:20130529.macroauthormig.php',1453226125,NULL),('phabricator:20130530.macrodatekey.sql',1453226125,NULL),('phabricator:20130530.pastekeys.sql',1453226125,NULL),('phabricator:20130530.sessionhash.php',1453226125,NULL),('phabricator:20130531.filekeys.sql',1453226125,NULL),('phabricator:20130602.morediviner.sql',1453226125,NULL),('phabricator:20130602.namedqueries.sql',1453226125,NULL),('phabricator:20130606.userxactions.sql',1453226125,NULL),('phabricator:20130607.xaccount.sql',1453226125,NULL),('phabricator:20130611.migrateoauth.php',1453226125,NULL),('phabricator:20130611.nukeldap.php',1453226125,NULL),('phabricator:20130613.authdb.sql',1453226125,NULL),('phabricator:20130619.authconf.php',1453226125,NULL),('phabricator:20130620.diffxactions.sql',1453226125,NULL),('phabricator:20130621.diffcommentphid.sql',1453226125,NULL),('phabricator:20130621.diffcommentphidmig.php',1453226125,NULL),('phabricator:20130621.diffcommentunphid.sql',1453226125,NULL),('phabricator:20130622.doorkeeper.sql',1453226125,NULL),('phabricator:20130628.legalpadv0.sql',1453226125,NULL),('phabricator:20130701.conduitlog.sql',1453226125,NULL),('phabricator:20130703.legalpaddocdenorm.php',1453226125,NULL),('phabricator:20130703.legalpaddocdenorm.sql',1453226125,NULL),('phabricator:20130709.droptimeline.sql',1453226125,NULL),('phabricator:20130709.legalpadsignature.sql',1453226125,NULL),('phabricator:20130711.pholioimageobsolete.php',1453226126,NULL),('phabricator:20130711.pholioimageobsolete.sql',1453226126,NULL),('phabricator:20130711.pholioimageobsolete2.sql',1453226126,NULL),('phabricator:20130711.trimrealnames.php',1453226125,NULL),('phabricator:20130714.votexactions.sql',1453226125,NULL),('phabricator:20130715.votecomments.php',1453226125,NULL),('phabricator:20130715.voteedges.sql',1453226125,NULL),('phabricator:20130716.archivememberlessprojects.php',1453226126,NULL),('phabricator:20130722.pholioreplace.sql',1453226126,NULL),('phabricator:20130723.taskstarttime.sql',1453226126,NULL),('phabricator:20130726.ponderxactions.sql',1453226126,NULL),('phabricator:20130727.ponderquestionstatus.sql',1453226126,NULL),('phabricator:20130728.ponderunique.php',1453226126,NULL),('phabricator:20130728.ponderuniquekey.sql',1453226126,NULL),('phabricator:20130728.ponderxcomment.php',1453226126,NULL),('phabricator:20130731.releephcutpointidentifier.sql',1453226126,NULL),('phabricator:20130731.releephproject.sql',1453226126,NULL),('phabricator:20130731.releephrepoid.sql',1453226126,NULL),('phabricator:20130801.pastexactions.php',1453226126,NULL),('phabricator:20130801.pastexactions.sql',1453226126,NULL),('phabricator:20130802.heraldphid.sql',1453226126,NULL),('phabricator:20130802.heraldphids.php',1453226126,NULL),('phabricator:20130802.heraldphidukey.sql',1453226126,NULL),('phabricator:20130802.heraldxactions.sql',1453226126,NULL),('phabricator:20130805.pasteedges.sql',1453226126,NULL),('phabricator:20130805.pastemailkey.sql',1453226126,NULL),('phabricator:20130805.pastemailkeypop.php',1453226126,NULL),('phabricator:20130814.usercustom.sql',1453226126,NULL),('phabricator:20130820.file-mailkey-populate.php',1453226126,NULL),('phabricator:20130820.filemailkey.sql',1453226126,NULL),('phabricator:20130820.filexactions.sql',1453226126,NULL),('phabricator:20130820.releephxactions.sql',1453226126,NULL),('phabricator:20130826.divinernode.sql',1453226126,NULL),('phabricator:20130912.maniphest.1.touch.sql',1453226126,NULL),('phabricator:20130912.maniphest.2.created.sql',1453226126,NULL),('phabricator:20130912.maniphest.3.nameindex.sql',1453226126,NULL),('phabricator:20130912.maniphest.4.fillindex.php',1453226126,NULL),('phabricator:20130913.maniphest.1.migratesearch.php',1453226126,NULL),('phabricator:20130914.usercustom.sql',1453226126,NULL),('phabricator:20130915.maniphestcustom.sql',1453226126,NULL),('phabricator:20130915.maniphestmigrate.php',1453226126,NULL),('phabricator:20130915.maniphestqdrop.sql',1453226126,NULL),('phabricator:20130919.mfieldconf.php',1453226126,NULL),('phabricator:20130920.repokeyspolicy.sql',1453226126,NULL),('phabricator:20130921.mtransactions.sql',1453226126,NULL),('phabricator:20130921.xmigratemaniphest.php',1453226126,NULL),('phabricator:20130923.mrename.sql',1453226126,NULL),('phabricator:20130924.mdraftkey.sql',1453226126,NULL),('phabricator:20130925.mpolicy.sql',1453226126,NULL),('phabricator:20130925.xpolicy.sql',1453226126,NULL),('phabricator:20130926.dcustom.sql',1453226126,NULL),('phabricator:20130926.dinkeys.sql',1453226126,NULL),('phabricator:20130926.dinline.php',1453226126,NULL),('phabricator:20130927.audiomacro.sql',1453226126,NULL),('phabricator:20130929.filepolicy.sql',1453226126,NULL),('phabricator:20131004.dxedgekey.sql',1453226126,NULL),('phabricator:20131004.dxreviewers.php',1453226126,NULL),('phabricator:20131006.hdisable.sql',1453226126,NULL),('phabricator:20131010.pstorage.sql',1453226126,NULL),('phabricator:20131015.cpolicy.sql',1453226126,NULL),('phabricator:20131020.col1.sql',1453226126,NULL),('phabricator:20131020.harbormaster.sql',1453226126,NULL),('phabricator:20131020.pcustom.sql',1453226126,NULL),('phabricator:20131020.pxaction.sql',1453226126,NULL),('phabricator:20131020.pxactionmig.php',1453226126,NULL),('phabricator:20131025.repopush.sql',1453226127,NULL),('phabricator:20131026.commitstatus.sql',1453226127,NULL),('phabricator:20131030.repostatusmessage.sql',1453226127,NULL),('phabricator:20131031.vcspassword.sql',1453226127,NULL),('phabricator:20131105.buildstep.sql',1453226127,NULL),('phabricator:20131106.diffphid.1.col.sql',1453226127,NULL),('phabricator:20131106.diffphid.2.mig.php',1453226127,NULL),('phabricator:20131106.diffphid.3.key.sql',1453226127,NULL),('phabricator:20131106.nuance-v0.sql',1453226127,NULL),('phabricator:20131107.buildlog.sql',1453226127,NULL),('phabricator:20131112.userverified.1.col.sql',1453226127,NULL),('phabricator:20131112.userverified.2.mig.php',1453226127,NULL),('phabricator:20131118.ownerorder.php',1453226127,NULL),('phabricator:20131119.passphrase.sql',1453226127,NULL),('phabricator:20131120.nuancesourcetype.sql',1453226127,NULL),('phabricator:20131121.passphraseedge.sql',1453226127,NULL),('phabricator:20131121.repocredentials.1.col.sql',1453226127,NULL),('phabricator:20131121.repocredentials.2.mig.php',1453226127,NULL),('phabricator:20131122.repomirror.sql',1453226127,NULL),('phabricator:20131123.drydockblueprintpolicy.sql',1453226127,NULL),('phabricator:20131129.drydockresourceblueprint.sql',1453226127,NULL),('phabricator:20131204.pushlog.sql',1453226127,NULL),('phabricator:20131205.buildsteporder.sql',1453226127,NULL),('phabricator:20131205.buildstepordermig.php',1453226127,NULL),('phabricator:20131205.buildtargets.sql',1453226127,NULL),('phabricator:20131206.phragment.sql',1453226127,NULL),('phabricator:20131206.phragmentnull.sql',1453226127,NULL),('phabricator:20131208.phragmentsnapshot.sql',1453226127,NULL),('phabricator:20131211.phragmentedges.sql',1453226127,NULL),('phabricator:20131217.pushlogphid.1.col.sql',1453226127,NULL),('phabricator:20131217.pushlogphid.2.mig.php',1453226127,NULL),('phabricator:20131217.pushlogphid.3.key.sql',1453226127,NULL),('phabricator:20131219.pxdrop.sql',1453226127,NULL),('phabricator:20131224.harbormanual.sql',1453226127,NULL),('phabricator:20131227.heraldobject.sql',1453226127,NULL),('phabricator:20131231.dropshortcut.sql',1453226127,NULL),('phabricator:20131302.maniphestvalue.sql',1453226124,NULL),('phabricator:20140104.harbormastercmd.sql',1453226127,NULL),('phabricator:20140106.macromailkey.1.sql',1453226127,NULL),('phabricator:20140106.macromailkey.2.php',1453226127,NULL),('phabricator:20140108.ddbpname.1.sql',1453226127,NULL),('phabricator:20140108.ddbpname.2.php',1453226127,NULL),('phabricator:20140109.ddxactions.sql',1453226127,NULL),('phabricator:20140109.projectcolumnsdates.sql',1453226127,NULL),('phabricator:20140113.legalpadsig.1.sql',1453226127,NULL),('phabricator:20140113.legalpadsig.2.php',1453226127,NULL),('phabricator:20140115.auth.1.id.sql',1453226128,NULL),('phabricator:20140115.auth.2.expires.sql',1453226128,NULL),('phabricator:20140115.auth.3.unlimit.php',1453226128,NULL),('phabricator:20140115.legalpadsigkey.sql',1453226128,NULL),('phabricator:20140116.reporefcursor.sql',1453226128,NULL),('phabricator:20140126.diff.1.parentrevisionid.sql',1453226128,NULL),('phabricator:20140126.diff.2.repositoryphid.sql',1453226128,NULL),('phabricator:20140130.dash.1.board.sql',1453226128,NULL),('phabricator:20140130.dash.2.panel.sql',1453226128,NULL),('phabricator:20140130.dash.3.boardxaction.sql',1453226128,NULL),('phabricator:20140130.dash.4.panelxaction.sql',1453226128,NULL),('phabricator:20140130.mail.1.retry.sql',1453226128,NULL),('phabricator:20140130.mail.2.next.sql',1453226128,NULL),('phabricator:20140201.gc.1.mailsent.sql',1453226128,NULL),('phabricator:20140201.gc.2.mailreceived.sql',1453226128,NULL),('phabricator:20140205.cal.1.rename.sql',1453226128,NULL),('phabricator:20140205.cal.2.phid-col.sql',1453226128,NULL),('phabricator:20140205.cal.3.phid-mig.php',1453226128,NULL),('phabricator:20140205.cal.4.phid-key.sql',1453226128,NULL),('phabricator:20140210.herald.rule-condition-mig.php',1453226128,NULL),('phabricator:20140210.projcfield.1.blurb.php',1453226128,NULL),('phabricator:20140210.projcfield.2.piccol.sql',1453226128,NULL),('phabricator:20140210.projcfield.3.picmig.sql',1453226128,NULL),('phabricator:20140210.projcfield.4.memmig.sql',1453226128,NULL),('phabricator:20140210.projcfield.5.dropprofile.sql',1453226128,NULL),('phabricator:20140211.dx.1.nullablechangesetid.sql',1453226128,NULL),('phabricator:20140211.dx.2.migcommenttext.php',1453226128,NULL),('phabricator:20140211.dx.3.migsubscriptions.sql',1453226128,NULL),('phabricator:20140211.dx.999.drop.relationships.sql',1453226128,NULL),('phabricator:20140212.dx.1.armageddon.php',1453226128,NULL),('phabricator:20140214.clean.1.legacycommentid.sql',1453226128,NULL),('phabricator:20140214.clean.2.dropcomment.sql',1453226128,NULL),('phabricator:20140214.clean.3.dropinline.sql',1453226128,NULL),('phabricator:20140218.differentialdraft.sql',1453226128,NULL),('phabricator:20140218.passwords.1.extend.sql',1453226128,NULL),('phabricator:20140218.passwords.2.prefix.sql',1453226128,NULL),('phabricator:20140218.passwords.3.vcsextend.sql',1453226128,NULL),('phabricator:20140218.passwords.4.vcs.php',1453226128,NULL),('phabricator:20140223.bigutf8scratch.sql',1453226128,NULL),('phabricator:20140224.dxclean.1.datecommitted.sql',1453226128,NULL),('phabricator:20140226.dxcustom.1.fielddata.php',1453226128,NULL),('phabricator:20140226.dxcustom.99.drop.sql',1453226128,NULL),('phabricator:20140228.dxcomment.1.sql',1453226128,NULL),('phabricator:20140305.diviner.1.slugcol.sql',1453226128,NULL),('phabricator:20140305.diviner.2.slugkey.sql',1453226128,NULL),('phabricator:20140311.mdroplegacy.sql',1453226128,NULL),('phabricator:20140314.projectcolumn.1.statuscol.sql',1453226128,NULL),('phabricator:20140314.projectcolumn.2.statuskey.sql',1453226128,NULL),('phabricator:20140317.mupdatedkey.sql',1453226128,NULL),('phabricator:20140321.harbor.1.bxaction.sql',1453226128,NULL),('phabricator:20140321.mstatus.1.col.sql',1453226128,NULL),('phabricator:20140321.mstatus.2.mig.php',1453226128,NULL),('phabricator:20140323.harbor.1.renames.php',1453226128,NULL),('phabricator:20140323.harbor.2.message.sql',1453226128,NULL),('phabricator:20140325.push.1.event.sql',1453226128,NULL),('phabricator:20140325.push.2.eventphid.sql',1453226128,NULL),('phabricator:20140325.push.3.groups.php',1453226128,NULL),('phabricator:20140325.push.4.prune.sql',1453226128,NULL),('phabricator:20140326.project.1.colxaction.sql',1453226128,NULL),('phabricator:20140328.releeph.1.productxaction.sql',1453226128,NULL),('phabricator:20140330.flagtext.sql',1453226128,NULL),('phabricator:20140402.actionlog.sql',1453226128,NULL),('phabricator:20140410.accountsecret.1.sql',1453226128,NULL),('phabricator:20140410.accountsecret.2.php',1453226128,NULL),('phabricator:20140416.harbor.1.sql',1453226128,NULL),('phabricator:20140420.rel.1.objectphid.sql',1453226128,NULL),('phabricator:20140420.rel.2.objectmig.php',1453226128,NULL),('phabricator:20140421.slowvotecolumnsisclosed.sql',1453226128,NULL),('phabricator:20140423.session.1.hisec.sql',1453226128,NULL),('phabricator:20140427.mfactor.1.sql',1453226128,NULL),('phabricator:20140430.auth.1.partial.sql',1453226128,NULL),('phabricator:20140430.dash.1.paneltype.sql',1453226128,NULL),('phabricator:20140430.dash.2.edge.sql',1453226128,NULL),('phabricator:20140501.passphraselockcredential.sql',1453226128,NULL),('phabricator:20140501.remove.1.dlog.sql',1453226128,NULL),('phabricator:20140507.smstable.sql',1453226128,NULL),('phabricator:20140509.coverage.1.sql',1453226128,NULL),('phabricator:20140509.dashboardlayoutconfig.sql',1453226128,NULL),('phabricator:20140512.dparents.1.sql',1453226128,NULL),('phabricator:20140514.harbormasterbuildabletransaction.sql',1453226128,NULL),('phabricator:20140514.pholiomockclose.sql',1453226129,NULL),('phabricator:20140515.trust-emails.sql',1453226129,NULL),('phabricator:20140517.dxbinarycache.sql',1453226129,NULL),('phabricator:20140518.dxmorebinarycache.sql',1453226129,NULL),('phabricator:20140519.dashboardinstall.sql',1453226129,NULL),('phabricator:20140520.authtemptoken.sql',1453226129,NULL),('phabricator:20140521.projectslug.1.create.sql',1453226129,NULL),('phabricator:20140521.projectslug.2.mig.php',1453226129,NULL),('phabricator:20140522.projecticon.sql',1453226129,NULL),('phabricator:20140524.auth.mfa.cache.sql',1453226129,NULL),('phabricator:20140525.hunkmodern.sql',1453226129,NULL),('phabricator:20140615.pholioedit.1.sql',1453226129,NULL),('phabricator:20140615.pholioedit.2.sql',1453226129,NULL),('phabricator:20140617.daemon.explicit-argv.sql',1453226129,NULL),('phabricator:20140617.daemonlog.sql',1453226129,NULL),('phabricator:20140624.projcolor.1.sql',1453226129,NULL),('phabricator:20140624.projcolor.2.sql',1453226129,NULL),('phabricator:20140629.dasharchive.1.sql',1453226129,NULL),('phabricator:20140629.legalsig.1.sql',1453226129,NULL),('phabricator:20140629.legalsig.2.php',1453226129,NULL),('phabricator:20140701.legalexemption.1.sql',1453226129,NULL),('phabricator:20140701.legalexemption.2.sql',1453226129,NULL),('phabricator:20140703.legalcorp.1.sql',1453226129,NULL),('phabricator:20140703.legalcorp.2.sql',1453226129,NULL),('phabricator:20140703.legalcorp.3.sql',1453226129,NULL),('phabricator:20140703.legalcorp.4.sql',1453226129,NULL),('phabricator:20140703.legalcorp.5.sql',1453226129,NULL),('phabricator:20140704.harbormasterstep.1.sql',1453226129,NULL),('phabricator:20140704.harbormasterstep.2.sql',1453226129,NULL),('phabricator:20140704.legalpreamble.1.sql',1453226129,NULL),('phabricator:20140706.harbormasterdepend.1.php',1453226129,NULL),('phabricator:20140706.pedge.1.sql',1453226129,NULL),('phabricator:20140711.pnames.1.sql',1453226129,NULL),('phabricator:20140711.pnames.2.php',1453226129,NULL),('phabricator:20140711.workerpriority.sql',1453226129,NULL),('phabricator:20140712.projcoluniq.sql',1453226129,NULL),('phabricator:20140721.phortune.1.cart.sql',1453226129,NULL),('phabricator:20140721.phortune.2.purchase.sql',1453226129,NULL),('phabricator:20140721.phortune.3.charge.sql',1453226129,NULL),('phabricator:20140721.phortune.4.cartstatus.sql',1453226129,NULL),('phabricator:20140721.phortune.5.cstatusdefault.sql',1453226129,NULL),('phabricator:20140721.phortune.6.onetimecharge.sql',1453226129,NULL),('phabricator:20140721.phortune.7.nullmethod.sql',1453226129,NULL),('phabricator:20140722.appname.php',1453226129,NULL),('phabricator:20140722.audit.1.xactions.sql',1453226129,NULL),('phabricator:20140722.audit.2.comments.sql',1453226129,NULL),('phabricator:20140722.audit.3.miginlines.php',1453226129,NULL),('phabricator:20140722.audit.4.migtext.php',1453226129,NULL),('phabricator:20140722.renameauth.php',1453226129,NULL),('phabricator:20140723.apprenamexaction.sql',1453226129,NULL),('phabricator:20140725.audit.1.migxactions.php',1453226129,NULL),('phabricator:20140731.audit.1.subscribers.php',1453226129,NULL),('phabricator:20140731.cancdn.php',1453226129,NULL),('phabricator:20140731.harbormasterstepdesc.sql',1453226129,NULL),('phabricator:20140805.boardcol.1.sql',1453226129,NULL),('phabricator:20140805.boardcol.2.php',1453226129,NULL),('phabricator:20140807.harbormastertargettime.sql',1453226129,NULL),('phabricator:20140808.boardprop.1.sql',1453226129,NULL),('phabricator:20140808.boardprop.2.sql',1453226129,NULL),('phabricator:20140808.boardprop.3.php',1453226129,NULL),('phabricator:20140811.blob.1.sql',1453226129,NULL),('phabricator:20140811.blob.2.sql',1453226129,NULL),('phabricator:20140812.projkey.1.sql',1453226129,NULL),('phabricator:20140812.projkey.2.sql',1453226129,NULL),('phabricator:20140814.passphrasecredentialconduit.sql',1453226129,NULL),('phabricator:20140815.cancdncase.php',1453226129,NULL),('phabricator:20140818.harbormasterindex.1.sql',1453226129,NULL),('phabricator:20140821.harbormasterbuildgen.1.sql',1453226129,NULL),('phabricator:20140822.daemonenvhash.sql',1453226129,NULL),('phabricator:20140902.almanacdevice.1.sql',1453226129,NULL),('phabricator:20140904.macroattach.php',1453226129,NULL),('phabricator:20140911.fund.1.initiative.sql',1453226129,NULL),('phabricator:20140911.fund.2.xaction.sql',1453226129,NULL),('phabricator:20140911.fund.3.edge.sql',1453226129,NULL),('phabricator:20140911.fund.4.backer.sql',1453226129,NULL),('phabricator:20140911.fund.5.backxaction.sql',1453226129,NULL),('phabricator:20140914.betaproto.php',1453226129,NULL),('phabricator:20140917.project.canlock.sql',1453226129,NULL),('phabricator:20140918.schema.1.dropaudit.sql',1453226129,NULL),('phabricator:20140918.schema.2.dropauditinline.sql',1453226129,NULL),('phabricator:20140918.schema.3.wipecache.sql',1453226129,NULL),('phabricator:20140918.schema.4.cachetype.sql',1453226129,NULL),('phabricator:20140918.schema.5.slowvote.sql',1453226129,NULL),('phabricator:20140919.schema.01.calstatus.sql',1453226129,NULL),('phabricator:20140919.schema.02.calname.sql',1453226129,NULL),('phabricator:20140919.schema.03.dropaux.sql',1453226129,NULL),('phabricator:20140919.schema.04.droptaskproj.sql',1453226129,NULL),('phabricator:20140926.schema.01.droprelev.sql',1453226129,NULL),('phabricator:20140926.schema.02.droprelreqev.sql',1453226129,NULL),('phabricator:20140926.schema.03.dropldapinfo.sql',1453226129,NULL),('phabricator:20140926.schema.04.dropoauthinfo.sql',1453226129,NULL),('phabricator:20140926.schema.05.dropprojaffil.sql',1453226129,NULL),('phabricator:20140926.schema.06.dropsubproject.sql',1453226129,NULL),('phabricator:20140926.schema.07.droppondcom.sql',1453226129,NULL),('phabricator:20140927.schema.01.dropsearchq.sql',1453226129,NULL),('phabricator:20140927.schema.02.pholio1.sql',1453226129,NULL),('phabricator:20140927.schema.03.pholio2.sql',1453226129,NULL),('phabricator:20140927.schema.04.pholio3.sql',1453226129,NULL),('phabricator:20140927.schema.05.phragment1.sql',1453226130,NULL),('phabricator:20140927.schema.06.releeph1.sql',1453226130,NULL),('phabricator:20141001.schema.01.version.sql',1453226130,NULL),('phabricator:20141001.schema.02.taskmail.sql',1453226130,NULL),('phabricator:20141002.schema.01.liskcounter.sql',1453226130,NULL),('phabricator:20141002.schema.02.draftnull.sql',1453226130,NULL),('phabricator:20141004.currency.01.sql',1453226130,NULL),('phabricator:20141004.currency.02.sql',1453226130,NULL),('phabricator:20141004.currency.03.sql',1453226130,NULL),('phabricator:20141004.currency.04.sql',1453226130,NULL),('phabricator:20141004.currency.05.sql',1453226130,NULL),('phabricator:20141004.currency.06.sql',1453226130,NULL),('phabricator:20141004.harborliskcounter.sql',1453226130,NULL),('phabricator:20141005.phortuneproduct.sql',1453226130,NULL),('phabricator:20141006.phortunecart.sql',1453226130,NULL),('phabricator:20141006.phortunemerchant.sql',1453226130,NULL),('phabricator:20141006.phortunemerchantx.sql',1453226130,NULL),('phabricator:20141007.fundmerchant.sql',1453226130,NULL),('phabricator:20141007.fundrisks.sql',1453226130,NULL),('phabricator:20141007.fundtotal.sql',1453226130,NULL),('phabricator:20141007.phortunecartmerchant.sql',1453226130,NULL),('phabricator:20141007.phortunecharge.sql',1453226130,NULL),('phabricator:20141007.phortunepayment.sql',1453226130,NULL),('phabricator:20141007.phortuneprovider.sql',1453226130,NULL),('phabricator:20141007.phortuneproviderx.sql',1453226130,NULL),('phabricator:20141008.phortunemerchdesc.sql',1453226130,NULL),('phabricator:20141008.phortuneprovdis.sql',1453226130,NULL),('phabricator:20141008.phortunerefund.sql',1453226130,NULL),('phabricator:20141010.fundmailkey.sql',1453226130,NULL),('phabricator:20141011.phortunemerchedit.sql',1453226130,NULL),('phabricator:20141012.phortunecartxaction.sql',1453226130,NULL),('phabricator:20141013.phortunecartkey.sql',1453226130,NULL),('phabricator:20141016.almanac.device.sql',1453226130,NULL),('phabricator:20141016.almanac.dxaction.sql',1453226130,NULL),('phabricator:20141016.almanac.interface.sql',1453226130,NULL),('phabricator:20141016.almanac.network.sql',1453226130,NULL),('phabricator:20141016.almanac.nxaction.sql',1453226130,NULL),('phabricator:20141016.almanac.service.sql',1453226130,NULL),('phabricator:20141016.almanac.sxaction.sql',1453226130,NULL),('phabricator:20141017.almanac.binding.sql',1453226130,NULL),('phabricator:20141017.almanac.bxaction.sql',1453226130,NULL),('phabricator:20141025.phriction.1.xaction.sql',1453226130,NULL),('phabricator:20141025.phriction.2.xaction.sql',1453226130,NULL),('phabricator:20141025.phriction.mailkey.sql',1453226130,NULL),('phabricator:20141103.almanac.1.delprop.sql',1453226130,NULL),('phabricator:20141103.almanac.2.addprop.sql',1453226131,NULL),('phabricator:20141104.almanac.3.edge.sql',1453226131,NULL),('phabricator:20141105.ssh.1.rename.sql',1453226131,NULL),('phabricator:20141106.dropold.sql',1453226131,NULL),('phabricator:20141106.uniqdrafts.php',1453226131,NULL),('phabricator:20141107.phriction.policy.1.sql',1453226131,NULL),('phabricator:20141107.phriction.policy.2.php',1453226131,NULL),('phabricator:20141107.phriction.popkeys.php',1453226131,NULL),('phabricator:20141107.ssh.1.colname.sql',1453226131,NULL),('phabricator:20141107.ssh.2.keyhash.sql',1453226131,NULL),('phabricator:20141107.ssh.3.keyindex.sql',1453226131,NULL),('phabricator:20141107.ssh.4.keymig.php',1453226131,NULL),('phabricator:20141107.ssh.5.indexnull.sql',1453226131,NULL),('phabricator:20141107.ssh.6.indexkey.sql',1453226131,NULL),('phabricator:20141107.ssh.7.colnull.sql',1453226131,NULL),('phabricator:20141113.auditdupes.php',1453226131,NULL),('phabricator:20141118.diffxaction.sql',1453226131,NULL),('phabricator:20141119.commitpedge.sql',1453226131,NULL),('phabricator:20141119.differential.diff.policy.sql',1453226131,NULL),('phabricator:20141119.sshtrust.sql',1453226131,NULL),('phabricator:20141123.taskpriority.1.sql',1453226131,NULL),('phabricator:20141123.taskpriority.2.sql',1453226131,NULL),('phabricator:20141210.maniphestsubscribersmig.1.sql',1453226131,NULL),('phabricator:20141210.maniphestsubscribersmig.2.sql',1453226131,NULL),('phabricator:20141210.reposervice.sql',1453226131,NULL),('phabricator:20141212.conduittoken.sql',1453226131,NULL),('phabricator:20141215.almanacservicetype.sql',1453226131,NULL),('phabricator:20141217.almanacdevicelock.sql',1453226131,NULL),('phabricator:20141217.almanaclock.sql',1453226131,NULL),('phabricator:20141218.maniphestcctxn.php',1453226131,NULL),('phabricator:20141222.maniphestprojtxn.php',1453226131,NULL),('phabricator:20141223.daemonloguser.sql',1453226131,NULL),('phabricator:20141223.daemonobjectphid.sql',1453226131,NULL),('phabricator:20141230.pasteeditpolicycolumn.sql',1453226131,NULL),('phabricator:20141230.pasteeditpolicyexisting.sql',1453226131,NULL),('phabricator:20150102.policyname.php',1453226131,NULL),('phabricator:20150102.tasksubscriber.sql',1453226131,NULL),('phabricator:20150105.conpsearch.sql',1453226131,NULL),('phabricator:20150114.oauthserver.client.policy.sql',1453226131,NULL),('phabricator:20150115.applicationemails.sql',1453226131,NULL),('phabricator:20150115.trigger.1.sql',1453226131,NULL),('phabricator:20150115.trigger.2.sql',1453226131,NULL),('phabricator:20150116.maniphestapplicationemails.php',1453226131,NULL),('phabricator:20150120.maniphestdefaultauthor.php',1453226131,NULL),('phabricator:20150124.subs.1.sql',1453226131,NULL),('phabricator:20150129.pastefileapplicationemails.php',1453226131,NULL),('phabricator:20150130.phortune.1.subphid.sql',1453226131,NULL),('phabricator:20150130.phortune.2.subkey.sql',1453226131,NULL),('phabricator:20150131.phortune.1.defaultpayment.sql',1453226131,NULL),('phabricator:20150205.authprovider.autologin.sql',1453226131,NULL),('phabricator:20150205.daemonenv.sql',1453226131,NULL),('phabricator:20150209.invite.sql',1453226131,NULL),('phabricator:20150209.oauthclient.trust.sql',1453226131,NULL),('phabricator:20150210.invitephid.sql',1453226131,NULL),('phabricator:20150212.legalpad.session.1.sql',1453226131,NULL),('phabricator:20150212.legalpad.session.2.sql',1453226131,NULL),('phabricator:20150219.scratch.nonmutable.sql',1453226131,NULL),('phabricator:20150223.daemon.1.id.sql',1453226131,NULL),('phabricator:20150223.daemon.2.idlegacy.sql',1453226131,NULL),('phabricator:20150223.daemon.3.idkey.sql',1453226131,NULL),('phabricator:20150312.filechunk.1.sql',1453226131,NULL),('phabricator:20150312.filechunk.2.sql',1453226131,NULL),('phabricator:20150312.filechunk.3.sql',1453226131,NULL),('phabricator:20150317.conpherence.isroom.1.sql',1453226131,NULL),('phabricator:20150317.conpherence.isroom.2.sql',1453226131,NULL),('phabricator:20150317.conpherence.policy.sql',1453226131,NULL),('phabricator:20150410.nukeruleedit.sql',1453226131,NULL),('phabricator:20150420.invoice.1.sql',1453226131,NULL),('phabricator:20150420.invoice.2.sql',1453226131,NULL),('phabricator:20150425.isclosed.sql',1453226131,NULL),('phabricator:20150427.calendar.1.edge.sql',1453226131,NULL),('phabricator:20150427.calendar.1.xaction.sql',1453226131,NULL),('phabricator:20150427.calendar.2.xaction.sql',1453226131,NULL),('phabricator:20150428.calendar.1.iscancelled.sql',1453226131,NULL),('phabricator:20150428.calendar.1.name.sql',1453226131,NULL),('phabricator:20150429.calendar.1.invitee.sql',1453226131,NULL),('phabricator:20150430.calendar.1.policies.sql',1453226132,NULL),('phabricator:20150430.multimeter.1.sql',1453226132,NULL),('phabricator:20150430.multimeter.2.host.sql',1453226132,NULL),('phabricator:20150430.multimeter.3.viewer.sql',1453226132,NULL),('phabricator:20150430.multimeter.4.context.sql',1453226132,NULL),('phabricator:20150430.multimeter.5.label.sql',1453226132,NULL),('phabricator:20150501.calendar.1.reply.sql',1453226132,NULL),('phabricator:20150501.calendar.2.reply.php',1453226132,NULL),('phabricator:20150501.conpherencepics.sql',1453226132,NULL),('phabricator:20150503.repositorysymbols.1.sql',1453226132,NULL),('phabricator:20150503.repositorysymbols.2.php',1453226132,NULL),('phabricator:20150503.repositorysymbols.3.sql',1453226132,NULL),('phabricator:20150504.symbolsproject.1.php',1453226132,NULL),('phabricator:20150504.symbolsproject.2.sql',1453226132,NULL),('phabricator:20150506.calendarunnamedevents.1.php',1453226132,NULL),('phabricator:20150507.calendar.1.isallday.sql',1453226132,NULL),('phabricator:20150513.user.cache.1.sql',1453226132,NULL),('phabricator:20150514.calendar.status.sql',1453226132,NULL),('phabricator:20150514.phame.blog.xaction.sql',1453226132,NULL),('phabricator:20150514.user.cache.2.sql',1453226132,NULL),('phabricator:20150515.phame.post.xaction.sql',1453226132,NULL),('phabricator:20150515.project.mailkey.1.sql',1453226132,NULL),('phabricator:20150515.project.mailkey.2.php',1453226132,NULL),('phabricator:20150519.calendar.calendaricon.sql',1453226132,NULL),('phabricator:20150521.releephrepository.sql',1453226132,NULL),('phabricator:20150525.diff.hidden.1.sql',1453226132,NULL),('phabricator:20150526.owners.mailkey.1.sql',1453226132,NULL),('phabricator:20150526.owners.mailkey.2.php',1453226132,NULL),('phabricator:20150526.owners.xaction.sql',1453226132,NULL),('phabricator:20150527.calendar.recurringevents.sql',1453226132,NULL),('phabricator:20150601.spaces.1.namespace.sql',1453226132,NULL),('phabricator:20150601.spaces.2.xaction.sql',1453226132,NULL),('phabricator:20150602.mlist.1.sql',1453226132,NULL),('phabricator:20150602.mlist.2.php',1453226132,NULL),('phabricator:20150604.spaces.1.sql',1453226132,NULL),('phabricator:20150605.diviner.edges.sql',1453226132,NULL),('phabricator:20150605.diviner.editPolicy.sql',1453226132,NULL),('phabricator:20150605.diviner.xaction.sql',1453226132,NULL),('phabricator:20150606.mlist.1.php',1453226132,NULL),('phabricator:20150609.inline.sql',1453226132,NULL),('phabricator:20150609.spaces.1.pholio.sql',1453226132,NULL),('phabricator:20150609.spaces.2.maniphest.sql',1453226132,NULL),('phabricator:20150610.spaces.1.desc.sql',1453226132,NULL),('phabricator:20150610.spaces.2.edge.sql',1453226132,NULL),('phabricator:20150610.spaces.3.archive.sql',1453226132,NULL),('phabricator:20150611.spaces.1.mailxaction.sql',1453226132,NULL),('phabricator:20150611.spaces.2.appmail.sql',1453226132,NULL),('phabricator:20150616.divinerrepository.sql',1453226132,NULL),('phabricator:20150617.harbor.1.lint.sql',1453226132,NULL),('phabricator:20150617.harbor.2.unit.sql',1453226132,NULL),('phabricator:20150618.harbor.1.planauto.sql',1453226132,NULL),('phabricator:20150618.harbor.2.stepauto.sql',1453226132,NULL),('phabricator:20150618.harbor.3.buildauto.sql',1453226132,NULL),('phabricator:20150619.conpherencerooms.1.sql',1453226132,NULL),('phabricator:20150619.conpherencerooms.2.sql',1453226132,NULL),('phabricator:20150619.conpherencerooms.3.sql',1453226132,NULL),('phabricator:20150621.phrase.1.sql',1453226132,NULL),('phabricator:20150621.phrase.2.sql',1453226132,NULL),('phabricator:20150622.bulk.1.job.sql',1453226132,NULL),('phabricator:20150622.bulk.2.task.sql',1453226132,NULL),('phabricator:20150622.bulk.3.xaction.sql',1453226132,NULL),('phabricator:20150622.bulk.4.edge.sql',1453226132,NULL),('phabricator:20150622.metamta.1.phid-col.sql',1453226132,NULL),('phabricator:20150622.metamta.2.phid-mig.php',1453226132,NULL),('phabricator:20150622.metamta.3.phid-key.sql',1453226132,NULL),('phabricator:20150622.metamta.4.actor-phid-col.sql',1453226132,NULL),('phabricator:20150622.metamta.5.actor-phid-mig.php',1453226132,NULL),('phabricator:20150622.metamta.6.actor-phid-key.sql',1453226132,NULL),('phabricator:20150624.spaces.1.repo.sql',1453226132,NULL),('phabricator:20150626.spaces.1.calendar.sql',1453226132,NULL),('phabricator:20150630.herald.1.sql',1453226132,NULL),('phabricator:20150630.herald.2.sql',1453226132,NULL),('phabricator:20150701.herald.1.sql',1453226132,NULL),('phabricator:20150701.herald.2.sql',1453226132,NULL),('phabricator:20150702.spaces.1.slowvote.sql',1453226133,NULL),('phabricator:20150706.herald.1.sql',1453226133,NULL),('phabricator:20150707.herald.1.sql',1453226133,NULL),('phabricator:20150708.arcanistproject.sql',1453226133,NULL),('phabricator:20150708.herald.1.sql',1453226133,NULL),('phabricator:20150708.herald.2.sql',1453226133,NULL),('phabricator:20150708.herald.3.sql',1453226133,NULL),('phabricator:20150712.badges.1.sql',1453226133,NULL),('phabricator:20150714.spaces.countdown.1.sql',1453226133,NULL),('phabricator:20150717.herald.1.sql',1453226133,NULL),('phabricator:20150719.countdown.1.sql',1453226133,NULL),('phabricator:20150719.countdown.2.sql',1453226133,NULL),('phabricator:20150719.countdown.3.sql',1453226133,NULL),('phabricator:20150721.phurl.1.url.sql',1453226133,NULL),('phabricator:20150721.phurl.2.xaction.sql',1453226133,NULL),('phabricator:20150721.phurl.3.xactioncomment.sql',1453226133,NULL),('phabricator:20150721.phurl.4.url.sql',1453226133,NULL),('phabricator:20150721.phurl.5.edge.sql',1453226133,NULL),('phabricator:20150721.phurl.6.alias.sql',1453226133,NULL),('phabricator:20150721.phurl.7.authorphid.sql',1453226133,NULL),('phabricator:20150722.dashboard.1.sql',1453226133,NULL),('phabricator:20150722.dashboard.2.sql',1453226133,NULL),('phabricator:20150723.countdown.1.sql',1453226133,NULL),('phabricator:20150724.badges.comments.1.sql',1453226133,NULL),('phabricator:20150724.countdown.comments.1.sql',1453226133,NULL),('phabricator:20150725.badges.mailkey.1.sql',1453226133,NULL),('phabricator:20150725.badges.mailkey.2.php',1453226133,NULL),('phabricator:20150725.badges.viewpolicy.3.sql',1453226133,NULL),('phabricator:20150725.countdown.mailkey.1.sql',1453226133,NULL),('phabricator:20150725.countdown.mailkey.2.php',1453226133,NULL),('phabricator:20150725.slowvote.mailkey.1.sql',1453226133,NULL),('phabricator:20150725.slowvote.mailkey.2.php',1453226133,NULL),('phabricator:20150727.heraldaction.1.sql',1453226133,NULL),('phabricator:20150730.herald.1.sql',1453226133,NULL),('phabricator:20150730.herald.2.sql',1453226133,NULL),('phabricator:20150730.herald.3.sql',1453226133,NULL),('phabricator:20150730.herald.4.sql',1453226133,NULL),('phabricator:20150730.herald.5.sql',1453226133,NULL),('phabricator:20150730.herald.6.sql',1453226133,NULL),('phabricator:20150730.herald.7.sql',1453226133,NULL),('phabricator:20150803.herald.1.sql',1453226133,NULL),('phabricator:20150803.herald.2.sql',1453226133,NULL),('phabricator:20150804.ponder.answer.mailkey.1.sql',1453226133,NULL),('phabricator:20150804.ponder.answer.mailkey.2.php',1453226133,NULL),('phabricator:20150804.ponder.question.1.sql',1453226133,NULL),('phabricator:20150804.ponder.question.2.sql',1453226133,NULL),('phabricator:20150804.ponder.question.3.sql',1453226133,NULL),('phabricator:20150804.ponder.spaces.4.sql',1453226133,NULL),('phabricator:20150805.paste.status.1.sql',1453226133,NULL),('phabricator:20150805.paste.status.2.sql',1453226133,NULL),('phabricator:20150806.ponder.answer.1.sql',1453226133,NULL),('phabricator:20150806.ponder.editpolicy.2.sql',1453226133,NULL),('phabricator:20150806.ponder.status.1.sql',1453226133,NULL),('phabricator:20150806.ponder.status.2.sql',1453226133,NULL),('phabricator:20150806.ponder.status.3.sql',1453226133,NULL),('phabricator:20150808.ponder.vote.1.sql',1453226133,NULL),('phabricator:20150808.ponder.vote.2.sql',1453226133,NULL),('phabricator:20150812.ponder.answer.1.sql',1453226133,NULL),('phabricator:20150812.ponder.answer.2.sql',1453226133,NULL),('phabricator:20150814.harbormater.artifact.phid.sql',1453226133,NULL),('phabricator:20150815.owners.status.1.sql',1453226133,NULL),('phabricator:20150815.owners.status.2.sql',1453226133,NULL),('phabricator:20150823.nuance.queue.1.sql',1453226133,NULL),('phabricator:20150823.nuance.queue.2.sql',1453226133,NULL),('phabricator:20150823.nuance.queue.3.sql',1453226133,NULL),('phabricator:20150823.nuance.queue.4.sql',1453226133,NULL),('phabricator:20150828.ponder.wiki.1.sql',1453226133,NULL),('phabricator:20150829.ponder.dupe.1.sql',1453226133,NULL),('phabricator:20150904.herald.1.sql',1453226133,NULL),('phabricator:20150906.mailinglist.sql',1453226133,NULL),('phabricator:20150910.owners.custom.1.sql',1453226133,NULL),('phabricator:20150916.drydock.slotlocks.1.sql',1453226133,NULL),('phabricator:20150922.drydock.commands.1.sql',1453226133,NULL),('phabricator:20150923.drydock.resourceid.1.sql',1453226133,NULL),('phabricator:20150923.drydock.resourceid.2.sql',1453226133,NULL),('phabricator:20150923.drydock.resourceid.3.sql',1453226133,NULL),('phabricator:20150923.drydock.taskid.1.sql',1453226133,NULL),('phabricator:20150924.drydock.disable.1.sql',1453226133,NULL),('phabricator:20150924.drydock.status.1.sql',1453226133,NULL),('phabricator:20150928.drydock.rexpire.1.sql',1453226133,NULL),('phabricator:20150930.drydock.log.1.sql',1453226134,NULL),('phabricator:20151001.drydock.rname.1.sql',1453226134,NULL),('phabricator:20151002.dashboard.status.1.sql',1453226134,NULL),('phabricator:20151002.harbormaster.bparam.1.sql',1453226134,NULL),('phabricator:20151009.drydock.auth.1.sql',1453226134,NULL),('phabricator:20151010.drydock.auth.2.sql',1453226134,NULL),('phabricator:20151013.drydock.op.1.sql',1453226134,NULL),('phabricator:20151023.harborpolicy.1.sql',1453226134,NULL),('phabricator:20151023.harborpolicy.2.php',1453226134,NULL),('phabricator:20151023.patchduration.sql',1453226134,14142),('phabricator:20151030.harbormaster.initiator.sql',1453226134,35726),('phabricator:20151106.editengine.1.table.sql',1453226134,8030),('phabricator:20151106.editengine.2.xactions.sql',1453226134,7392),('phabricator:20151106.phame.post.mailkey.1.sql',1453226134,18595),('phabricator:20151106.phame.post.mailkey.2.php',1453226134,1616),('phabricator:20151107.phame.blog.mailkey.1.sql',1453226134,19832),('phabricator:20151107.phame.blog.mailkey.2.php',1453226134,1389),('phabricator:20151108.phame.blog.joinpolicy.sql',1453226134,16415),('phabricator:20151108.xhpast.stderr.sql',1453226134,24424),('phabricator:20151109.phame.post.comments.1.sql',1453226134,8007),('phabricator:20151109.repository.coverage.1.sql',1453226134,1405),('phabricator:20151109.xhpast.db.1.sql',1453226134,1559),('phabricator:20151109.xhpast.db.2.sql',1453226134,599),('phabricator:20151110.daemonenvhash.sql',1453226134,39904),('phabricator:20151111.phame.blog.archive.1.sql',1453226134,15720),('phabricator:20151111.phame.blog.archive.2.sql',1453226134,534),('phabricator:20151112.herald.edge.sql',1453226134,13618),('phabricator:20151116.owners.edge.sql',1453226134,13570),('phabricator:20151128.phame.blog.picture.1.sql',1453226134,15964),('phabricator:20151130.phurl.mailkey.1.sql',1453226134,10402),('phabricator:20151130.phurl.mailkey.2.php',1453226134,1457),('phabricator:20151202.versioneddraft.1.sql',1453226134,8923),('phabricator:20151207.editengine.1.sql',1453226134,76111),('phabricator:20151210.land.1.refphid.sql',1453226134,19463),('phabricator:20151210.land.2.refphid.php',1453226134,833),('phabricator:20151215.phame.1.autotitle.sql',1453226134,21510),('phabricator:20151218.key.1.keyphid.sql',1453226134,14834),('phabricator:20151218.key.2.keyphid.php',1453226134,429),('phabricator:20151219.proj.01.prislug.sql',1453226134,21059),('phabricator:20151219.proj.02.prislugkey.sql',1453226134,16233),('phabricator:20151219.proj.03.copyslug.sql',1453226134,474),('phabricator:20151219.proj.04.dropslugkey.sql',1453226134,7782),('phabricator:20151219.proj.05.dropslug.sql',1453226134,20865),('phabricator:20151219.proj.06.defaultpolicy.php',1453226134,1358),('phabricator:20151219.proj.07.viewnull.sql',1453226134,16753),('phabricator:20151219.proj.08.editnull.sql',1453226134,13683),('phabricator:20151219.proj.09.joinnull.sql',1453226134,10924),('phabricator:20151219.proj.10.subcolumns.sql',1453226134,129879),('phabricator:20151219.proj.11.subprojectphids.sql',1453226135,26586),('phabricator:20151221.search.1.version.sql',1453226135,14029),('phabricator:20151221.search.2.ownersngrams.sql',1453226135,7390),('phabricator:20151221.search.3.reindex.php',1453226135,436),('phabricator:20151223.proj.01.paths.sql',1453226135,22387),('phabricator:20151223.proj.02.depths.sql',1453226135,28069),('phabricator:20151223.proj.03.pathkey.sql',1453226135,12562),('phabricator:20151223.proj.04.keycol.sql',1453226135,24719),('phabricator:20151223.proj.05.updatekeys.php',1453226135,463),('phabricator:20151223.proj.06.uniq.sql',1453226135,12857),('phabricator:20151226.reop.1.sql',1453226135,19351),('phabricator:20151227.proj.01.materialize.sql',1453226135,697),('phabricator:20151231.proj.01.icon.php',1453226135,3273),('phabricator:20160110.repo.01.slug.sql',1453226135,31556),('phabricator:20160110.repo.02.slug.php',1453226135,461),('phabricator:20160111.repo.01.slugx.sql',1453226135,745),('phabricator:20160112.repo.01.uri.sql',1453226135,7698),('phabricator:20160112.repo.02.uri.index.php',1453226135,437),('phabricator:20160113.propanel.1.storage.sql',1453226135,6273),('phabricator:20160113.propanel.2.xaction.sql',1453226135,7608),('phabricator:daemonstatus.sql',1453226123,NULL),('phabricator:daemonstatuskey.sql',1453226123,NULL),('phabricator:daemontaskarchive.sql',1453226124,NULL),('phabricator:db.almanac',1453226117,NULL),('phabricator:db.audit',1453226117,NULL),('phabricator:db.auth',1453226117,NULL),('phabricator:db.badges',1453226117,NULL),('phabricator:db.cache',1453226117,NULL),('phabricator:db.calendar',1453226117,NULL),('phabricator:db.chatlog',1453226117,NULL),('phabricator:db.conduit',1453226117,NULL),('phabricator:db.config',1453226117,NULL),('phabricator:db.conpherence',1453226117,NULL),('phabricator:db.countdown',1453226117,NULL),('phabricator:db.daemon',1453226117,NULL),('phabricator:db.dashboard',1453226117,NULL),('phabricator:db.differential',1453226117,NULL),('phabricator:db.diviner',1453226117,NULL),('phabricator:db.doorkeeper',1453226117,NULL),('phabricator:db.draft',1453226117,NULL),('phabricator:db.drydock',1453226117,NULL),('phabricator:db.fact',1453226117,NULL),('phabricator:db.feed',1453226117,NULL),('phabricator:db.file',1453226117,NULL),('phabricator:db.flag',1453226117,NULL),('phabricator:db.fund',1453226117,NULL),('phabricator:db.harbormaster',1453226117,NULL),('phabricator:db.herald',1453226117,NULL),('phabricator:db.legalpad',1453226117,NULL),('phabricator:db.maniphest',1453226117,NULL),('phabricator:db.meta_data',1453226117,NULL),('phabricator:db.metamta',1453226117,NULL),('phabricator:db.multimeter',1453226117,NULL),('phabricator:db.nuance',1453226117,NULL),('phabricator:db.oauth_server',1453226117,NULL),('phabricator:db.owners',1453226117,NULL),('phabricator:db.passphrase',1453226117,NULL),('phabricator:db.pastebin',1453226117,NULL),('phabricator:db.phame',1453226117,NULL),('phabricator:db.phlux',1453226117,NULL),('phabricator:db.pholio',1453226117,NULL),('phabricator:db.phortune',1453226117,NULL),('phabricator:db.phragment',1453226117,NULL),('phabricator:db.phrequent',1453226117,NULL),('phabricator:db.phriction',1453226117,NULL),('phabricator:db.phurl',1453226117,NULL),('phabricator:db.policy',1453226117,NULL),('phabricator:db.ponder',1453226117,NULL),('phabricator:db.project',1453226117,NULL),('phabricator:db.releeph',1453226117,NULL),('phabricator:db.repository',1453226117,NULL),('phabricator:db.search',1453226117,NULL),('phabricator:db.slowvote',1453226117,NULL),('phabricator:db.spaces',1453226117,NULL),('phabricator:db.system',1453226117,NULL),('phabricator:db.timeline',1453226117,NULL),('phabricator:db.token',1453226117,NULL),('phabricator:db.user',1453226117,NULL),('phabricator:db.worker',1453226117,NULL),('phabricator:db.xhpast',1453226117,NULL),('phabricator:db.xhpastview',1453226117,NULL),('phabricator:db.xhprof',1453226117,NULL),('phabricator:differentialbookmarks.sql',1453226123,NULL),('phabricator:draft-metadata.sql',1453226123,NULL),('phabricator:dropfileproxyimage.sql',1453226124,NULL),('phabricator:drydockresoucetype.sql',1453226124,NULL),('phabricator:drydocktaskid.sql',1453226124,NULL),('phabricator:edgetype.sql',1453226123,NULL),('phabricator:emailtable.sql',1453226123,NULL),('phabricator:emailtableport.sql',1453226123,NULL),('phabricator:emailtableremove.sql',1453226123,NULL),('phabricator:fact-raw.sql',1453226123,NULL),('phabricator:harbormasterobject.sql',1453226123,NULL),('phabricator:holidays.sql',1453226123,NULL),('phabricator:ldapinfo.sql',1453226123,NULL),('phabricator:legalpad-mailkey-populate.php',1453226125,NULL),('phabricator:legalpad-mailkey.sql',1453226125,NULL),('phabricator:liskcounters-task.sql',1453226124,NULL),('phabricator:liskcounters.php',1453226124,NULL),('phabricator:liskcounters.sql',1453226124,NULL),('phabricator:maniphestxcache.sql',1453226123,NULL),('phabricator:markupcache.sql',1453226123,NULL),('phabricator:migrate-differential-dependencies.php',1453226123,NULL),('phabricator:migrate-maniphest-dependencies.php',1453226123,NULL),('phabricator:migrate-maniphest-revisions.php',1453226123,NULL),('phabricator:migrate-project-edges.php',1453226123,NULL),('phabricator:owners-exclude.sql',1453226124,NULL),('phabricator:pastepolicy.sql',1453226123,NULL),('phabricator:phameblog.sql',1453226123,NULL),('phabricator:phamedomain.sql',1453226123,NULL),('phabricator:phameoneblog.sql',1453226123,NULL),('phabricator:phamepolicy.sql',1453226123,NULL),('phabricator:phiddrop.sql',1453226123,NULL),('phabricator:pholio.sql',1453226124,NULL),('phabricator:policy-project.sql',1453226123,NULL),('phabricator:ponder-comments.sql',1453226123,NULL),('phabricator:ponder-mailkey-populate.php',1453226123,NULL),('phabricator:ponder-mailkey.sql',1453226123,NULL),('phabricator:ponder.sql',1453226123,NULL),('phabricator:releeph.sql',1453226124,NULL),('phabricator:repository-lint.sql',1453226124,NULL),('phabricator:statustxt.sql',1453226124,NULL),('phabricator:symbolcontexts.sql',1453226123,NULL),('phabricator:testdatabase.sql',1453226123,NULL),('phabricator:threadtopic.sql',1453226123,NULL),('phabricator:userstatus.sql',1453226123,NULL),('phabricator:usertranslation.sql',1453226123,NULL),('phabricator:xhprof.sql',1453226123,NULL); +INSERT INTO `patch_status` VALUES ('phabricator:000.project.sql',1466802850,NULL),('phabricator:0000.legacy.sql',1466802850,NULL),('phabricator:001.maniphest_projects.sql',1466802850,NULL),('phabricator:002.oauth.sql',1466802850,NULL),('phabricator:003.more_oauth.sql',1466802851,NULL),('phabricator:004.daemonrepos.sql',1466802851,NULL),('phabricator:005.workers.sql',1466802851,NULL),('phabricator:006.repository.sql',1466802851,NULL),('phabricator:007.daemonlog.sql',1466802851,NULL),('phabricator:008.repoopt.sql',1466802851,NULL),('phabricator:009.repo_summary.sql',1466802851,NULL),('phabricator:010.herald.sql',1466802851,NULL),('phabricator:011.badcommit.sql',1466802851,NULL),('phabricator:012.dropphidtype.sql',1466802851,NULL),('phabricator:013.commitdetail.sql',1466802851,NULL),('phabricator:014.shortcuts.sql',1466802851,NULL),('phabricator:015.preferences.sql',1466802851,NULL),('phabricator:016.userrealnameindex.sql',1466802851,NULL),('phabricator:017.sessionkeys.sql',1466802851,NULL),('phabricator:018.owners.sql',1466802851,NULL),('phabricator:019.arcprojects.sql',1466802851,NULL),('phabricator:020.pathcapital.sql',1466802851,NULL),('phabricator:021.xhpastview.sql',1466802851,NULL),('phabricator:022.differentialcommit.sql',1466802851,NULL),('phabricator:023.dxkeys.sql',1466802851,NULL),('phabricator:024.mlistkeys.sql',1466802851,NULL),('phabricator:025.commentopt.sql',1466802851,NULL),('phabricator:026.diffpropkey.sql',1466802851,NULL),('phabricator:027.metamtakeys.sql',1466802851,NULL),('phabricator:028.systemagent.sql',1466802851,NULL),('phabricator:029.cursors.sql',1466802851,NULL),('phabricator:030.imagemacro.sql',1466802851,NULL),('phabricator:031.workerrace.sql',1466802851,NULL),('phabricator:032.viewtime.sql',1466802851,NULL),('phabricator:033.privtest.sql',1466802851,NULL),('phabricator:034.savedheader.sql',1466802851,NULL),('phabricator:035.proxyimage.sql',1466802851,NULL),('phabricator:036.mailkey.sql',1466802851,NULL),('phabricator:037.setuptest.sql',1466802851,NULL),('phabricator:038.admin.sql',1466802851,NULL),('phabricator:039.userlog.sql',1466802851,NULL),('phabricator:040.transform.sql',1466802851,NULL),('phabricator:041.heraldrepetition.sql',1466802851,NULL),('phabricator:042.commentmetadata.sql',1466802852,NULL),('phabricator:043.pastebin.sql',1466802852,NULL),('phabricator:044.countdown.sql',1466802852,NULL),('phabricator:045.timezone.sql',1466802852,NULL),('phabricator:046.conduittoken.sql',1466802852,NULL),('phabricator:047.projectstatus.sql',1466802852,NULL),('phabricator:048.relationshipkeys.sql',1466802852,NULL),('phabricator:049.projectowner.sql',1466802852,NULL),('phabricator:050.taskdenormal.sql',1466802852,NULL),('phabricator:051.projectfilter.sql',1466802852,NULL),('phabricator:052.pastelanguage.sql',1466802852,NULL),('phabricator:053.feed.sql',1466802852,NULL),('phabricator:054.subscribers.sql',1466802852,NULL),('phabricator:055.add_author_to_files.sql',1466802852,NULL),('phabricator:056.slowvote.sql',1466802852,NULL),('phabricator:057.parsecache.sql',1466802852,NULL),('phabricator:058.missingkeys.sql',1466802852,NULL),('phabricator:059.engines.php',1466802852,NULL),('phabricator:060.phriction.sql',1466802852,NULL),('phabricator:061.phrictioncontent.sql',1466802852,NULL),('phabricator:062.phrictionmenu.sql',1466802852,NULL),('phabricator:063.pasteforks.sql',1466802852,NULL),('phabricator:064.subprojects.sql',1466802852,NULL),('phabricator:065.sshkeys.sql',1466802852,NULL),('phabricator:066.phrictioncontent.sql',1466802852,NULL),('phabricator:067.preferences.sql',1466802852,NULL),('phabricator:068.maniphestauxiliarystorage.sql',1466802852,NULL),('phabricator:069.heraldxscript.sql',1466802852,NULL),('phabricator:070.differentialaux.sql',1466802852,NULL),('phabricator:071.contentsource.sql',1466802852,NULL),('phabricator:072.blamerevert.sql',1466802852,NULL),('phabricator:073.reposymbols.sql',1466802852,NULL),('phabricator:074.affectedpath.sql',1466802852,NULL),('phabricator:075.revisionhash.sql',1466802852,NULL),('phabricator:076.indexedlanguages.sql',1466802852,NULL),('phabricator:077.originalemail.sql',1466802852,NULL),('phabricator:078.nametoken.sql',1466802852,NULL),('phabricator:079.nametokenindex.php',1466802852,NULL),('phabricator:080.filekeys.sql',1466802852,NULL),('phabricator:081.filekeys.php',1466802852,NULL),('phabricator:082.xactionkey.sql',1466802852,NULL),('phabricator:083.dxviewtime.sql',1466802852,NULL),('phabricator:084.pasteauthorkey.sql',1466802852,NULL),('phabricator:085.packagecommitrelationship.sql',1466802852,NULL),('phabricator:086.formeraffil.sql',1466802852,NULL),('phabricator:087.phrictiondelete.sql',1466802853,NULL),('phabricator:088.audit.sql',1466802853,NULL),('phabricator:089.projectwiki.sql',1466802853,NULL),('phabricator:090.forceuniqueprojectnames.php',1466802853,NULL),('phabricator:091.uniqueslugkey.sql',1466802853,NULL),('phabricator:092.dropgithubnotification.sql',1466802853,NULL),('phabricator:093.gitremotes.php',1466802853,NULL),('phabricator:094.phrictioncolumn.sql',1466802853,NULL),('phabricator:095.directory.sql',1466802853,NULL),('phabricator:096.filename.sql',1466802853,NULL),('phabricator:097.heraldruletypes.sql',1466802853,NULL),('phabricator:098.heraldruletypemigration.php',1466802853,NULL),('phabricator:099.drydock.sql',1466802853,NULL),('phabricator:100.projectxaction.sql',1466802853,NULL),('phabricator:101.heraldruleapplied.sql',1466802853,NULL),('phabricator:102.heraldcleanup.php',1466802853,NULL),('phabricator:103.heraldedithistory.sql',1466802853,NULL),('phabricator:104.searchkey.sql',1466802853,NULL),('phabricator:105.mimetype.sql',1466802853,NULL),('phabricator:106.chatlog.sql',1466802853,NULL),('phabricator:107.oauthserver.sql',1466802853,NULL),('phabricator:108.oauthscope.sql',1466802853,NULL),('phabricator:109.oauthclientphidkey.sql',1466802853,NULL),('phabricator:110.commitaudit.sql',1466802853,NULL),('phabricator:111.commitauditmigration.php',1466802853,NULL),('phabricator:112.oauthaccesscoderedirecturi.sql',1466802853,NULL),('phabricator:113.lastreviewer.sql',1466802853,NULL),('phabricator:114.auditrequest.sql',1466802853,NULL),('phabricator:115.prepareutf8.sql',1466802853,NULL),('phabricator:116.utf8-backup-first-expect-wait.sql',1466802855,NULL),('phabricator:117.repositorydescription.php',1466802855,NULL),('phabricator:118.auditinline.sql',1466802855,NULL),('phabricator:119.filehash.sql',1466802855,NULL),('phabricator:120.noop.sql',1466802855,NULL),('phabricator:121.drydocklog.sql',1466802855,NULL),('phabricator:122.flag.sql',1466802855,NULL),('phabricator:123.heraldrulelog.sql',1466802855,NULL),('phabricator:124.subpriority.sql',1466802855,NULL),('phabricator:125.ipv6.sql',1466802855,NULL),('phabricator:126.edges.sql',1466802855,NULL),('phabricator:127.userkeybody.sql',1466802855,NULL),('phabricator:128.phabricatorcom.sql',1466802855,NULL),('phabricator:129.savedquery.sql',1466802855,NULL),('phabricator:130.denormalrevisionquery.sql',1466802855,NULL),('phabricator:131.migraterevisionquery.php',1466802855,NULL),('phabricator:132.phame.sql',1466802855,NULL),('phabricator:133.imagemacro.sql',1466802855,NULL),('phabricator:134.emptysearch.sql',1466802855,NULL),('phabricator:135.datecommitted.sql',1466802855,NULL),('phabricator:136.sex.sql',1466802855,NULL),('phabricator:137.auditmetadata.sql',1466802855,NULL),('phabricator:138.notification.sql',1466802855,NULL),('phabricator:20121209.pholioxactions.sql',1466802856,NULL),('phabricator:20121209.xmacroadd.sql',1466802856,NULL),('phabricator:20121209.xmacromigrate.php',1466802856,NULL),('phabricator:20121209.xmacromigratekey.sql',1466802856,NULL),('phabricator:20121220.generalcache.sql',1466802856,NULL),('phabricator:20121226.config.sql',1466802856,NULL),('phabricator:20130101.confxaction.sql',1466802856,NULL),('phabricator:20130102.metamtareceivedmailmessageidhash.sql',1466802856,NULL),('phabricator:20130103.filemetadata.sql',1466802856,NULL),('phabricator:20130111.conpherence.sql',1466802856,NULL),('phabricator:20130127.altheraldtranscript.sql',1466802856,NULL),('phabricator:20130131.conpherencepics.sql',1466802857,NULL),('phabricator:20130201.revisionunsubscribed.php',1466802856,NULL),('phabricator:20130201.revisionunsubscribed.sql',1466802857,NULL),('phabricator:20130214.chatlogchannel.sql',1466802857,NULL),('phabricator:20130214.chatlogchannelid.sql',1466802857,NULL),('phabricator:20130214.token.sql',1466802857,NULL),('phabricator:20130215.phabricatorfileaddttl.sql',1466802857,NULL),('phabricator:20130217.cachettl.sql',1466802857,NULL),('phabricator:20130218.longdaemon.sql',1466802857,NULL),('phabricator:20130218.updatechannelid.php',1466802857,NULL),('phabricator:20130219.commitsummary.sql',1466802857,NULL),('phabricator:20130219.commitsummarymig.php',1466802857,NULL),('phabricator:20130222.dropchannel.sql',1466802857,NULL),('phabricator:20130226.commitkey.sql',1466802857,NULL),('phabricator:20130304.lintauthor.sql',1466802857,NULL),('phabricator:20130310.xactionmeta.sql',1466802857,NULL),('phabricator:20130317.phrictionedge.sql',1466802857,NULL),('phabricator:20130319.conpherence.sql',1466802857,NULL),('phabricator:20130319.phabricatorfileexplicitupload.sql',1466802857,NULL),('phabricator:20130320.phlux.sql',1466802857,NULL),('phabricator:20130321.token.sql',1466802857,NULL),('phabricator:20130322.phortune.sql',1466802857,NULL),('phabricator:20130323.phortunepayment.sql',1466802857,NULL),('phabricator:20130324.phortuneproduct.sql',1466802857,NULL),('phabricator:20130330.phrequent.sql',1466802857,NULL),('phabricator:20130403.conpherencecache.sql',1466802857,NULL),('phabricator:20130403.conpherencecachemig.php',1466802857,NULL),('phabricator:20130409.commitdrev.php',1466802857,NULL),('phabricator:20130417.externalaccount.sql',1466802857,NULL),('phabricator:20130423.conpherenceindices.sql',1466802857,NULL),('phabricator:20130423.phortunepaymentrevised.sql',1466802857,NULL),('phabricator:20130423.updateexternalaccount.sql',1466802857,NULL),('phabricator:20130426.search_savedquery.sql',1466802857,NULL),('phabricator:20130502.countdownrevamp1.sql',1466802857,NULL),('phabricator:20130502.countdownrevamp2.php',1466802857,NULL),('phabricator:20130502.countdownrevamp3.sql',1466802857,NULL),('phabricator:20130507.releephrqmailkey.sql',1466802857,NULL),('phabricator:20130507.releephrqmailkeypop.php',1466802857,NULL),('phabricator:20130507.releephrqsimplifycols.sql',1466802857,NULL),('phabricator:20130508.releephtransactions.sql',1466802857,NULL),('phabricator:20130508.releephtransactionsmig.php',1466802857,NULL),('phabricator:20130508.search_namedquery.sql',1466802857,NULL),('phabricator:20130513.receviedmailstatus.sql',1466802857,NULL),('phabricator:20130519.diviner.sql',1466802857,NULL),('phabricator:20130521.dropconphimages.sql',1466802857,NULL),('phabricator:20130523.maniphest_owners.sql',1466802857,NULL),('phabricator:20130524.repoxactions.sql',1466802857,NULL),('phabricator:20130529.macroauthor.sql',1466802857,NULL),('phabricator:20130529.macroauthormig.php',1466802857,NULL),('phabricator:20130530.macrodatekey.sql',1466802857,NULL),('phabricator:20130530.pastekeys.sql',1466802857,NULL),('phabricator:20130530.sessionhash.php',1466802857,NULL),('phabricator:20130531.filekeys.sql',1466802857,NULL),('phabricator:20130602.morediviner.sql',1466802858,NULL),('phabricator:20130602.namedqueries.sql',1466802858,NULL),('phabricator:20130606.userxactions.sql',1466802858,NULL),('phabricator:20130607.xaccount.sql',1466802858,NULL),('phabricator:20130611.migrateoauth.php',1466802858,NULL),('phabricator:20130611.nukeldap.php',1466802858,NULL),('phabricator:20130613.authdb.sql',1466802858,NULL),('phabricator:20130619.authconf.php',1466802858,NULL),('phabricator:20130620.diffxactions.sql',1466802858,NULL),('phabricator:20130621.diffcommentphid.sql',1466802858,NULL),('phabricator:20130621.diffcommentphidmig.php',1466802858,NULL),('phabricator:20130621.diffcommentunphid.sql',1466802858,NULL),('phabricator:20130622.doorkeeper.sql',1466802858,NULL),('phabricator:20130628.legalpadv0.sql',1466802858,NULL),('phabricator:20130701.conduitlog.sql',1466802858,NULL),('phabricator:20130703.legalpaddocdenorm.php',1466802858,NULL),('phabricator:20130703.legalpaddocdenorm.sql',1466802858,NULL),('phabricator:20130709.droptimeline.sql',1466802858,NULL),('phabricator:20130709.legalpadsignature.sql',1466802858,NULL),('phabricator:20130711.pholioimageobsolete.php',1466802858,NULL),('phabricator:20130711.pholioimageobsolete.sql',1466802858,NULL),('phabricator:20130711.pholioimageobsolete2.sql',1466802858,NULL),('phabricator:20130711.trimrealnames.php',1466802858,NULL),('phabricator:20130714.votexactions.sql',1466802858,NULL),('phabricator:20130715.votecomments.php',1466802858,NULL),('phabricator:20130715.voteedges.sql',1466802858,NULL),('phabricator:20130716.archivememberlessprojects.php',1466802858,NULL),('phabricator:20130722.pholioreplace.sql',1466802858,NULL),('phabricator:20130723.taskstarttime.sql',1466802858,NULL),('phabricator:20130726.ponderxactions.sql',1466802858,NULL),('phabricator:20130727.ponderquestionstatus.sql',1466802858,NULL),('phabricator:20130728.ponderunique.php',1466802858,NULL),('phabricator:20130728.ponderuniquekey.sql',1466802858,NULL),('phabricator:20130728.ponderxcomment.php',1466802858,NULL),('phabricator:20130731.releephcutpointidentifier.sql',1466802858,NULL),('phabricator:20130731.releephproject.sql',1466802858,NULL),('phabricator:20130731.releephrepoid.sql',1466802858,NULL),('phabricator:20130801.pastexactions.php',1466802858,NULL),('phabricator:20130801.pastexactions.sql',1466802858,NULL),('phabricator:20130802.heraldphid.sql',1466802858,NULL),('phabricator:20130802.heraldphids.php',1466802858,NULL),('phabricator:20130802.heraldphidukey.sql',1466802858,NULL),('phabricator:20130802.heraldxactions.sql',1466802858,NULL),('phabricator:20130805.pasteedges.sql',1466802858,NULL),('phabricator:20130805.pastemailkey.sql',1466802858,NULL),('phabricator:20130805.pastemailkeypop.php',1466802858,NULL),('phabricator:20130814.usercustom.sql',1466802858,NULL),('phabricator:20130820.file-mailkey-populate.php',1466802859,NULL),('phabricator:20130820.filemailkey.sql',1466802859,NULL),('phabricator:20130820.filexactions.sql',1466802859,NULL),('phabricator:20130820.releephxactions.sql',1466802858,NULL),('phabricator:20130826.divinernode.sql',1466802859,NULL),('phabricator:20130912.maniphest.1.touch.sql',1466802859,NULL),('phabricator:20130912.maniphest.2.created.sql',1466802859,NULL),('phabricator:20130912.maniphest.3.nameindex.sql',1466802859,NULL),('phabricator:20130912.maniphest.4.fillindex.php',1466802859,NULL),('phabricator:20130913.maniphest.1.migratesearch.php',1466802859,NULL),('phabricator:20130914.usercustom.sql',1466802859,NULL),('phabricator:20130915.maniphestcustom.sql',1466802859,NULL),('phabricator:20130915.maniphestmigrate.php',1466802859,NULL),('phabricator:20130915.maniphestqdrop.sql',1466802859,NULL),('phabricator:20130919.mfieldconf.php',1466802859,NULL),('phabricator:20130920.repokeyspolicy.sql',1466802859,NULL),('phabricator:20130921.mtransactions.sql',1466802859,NULL),('phabricator:20130921.xmigratemaniphest.php',1466802859,NULL),('phabricator:20130923.mrename.sql',1466802859,NULL),('phabricator:20130924.mdraftkey.sql',1466802859,NULL),('phabricator:20130925.mpolicy.sql',1466802859,NULL),('phabricator:20130925.xpolicy.sql',1466802859,NULL),('phabricator:20130926.dcustom.sql',1466802859,NULL),('phabricator:20130926.dinkeys.sql',1466802859,NULL),('phabricator:20130926.dinline.php',1466802859,NULL),('phabricator:20130927.audiomacro.sql',1466802859,NULL),('phabricator:20130929.filepolicy.sql',1466802859,NULL),('phabricator:20131004.dxedgekey.sql',1466802859,NULL),('phabricator:20131004.dxreviewers.php',1466802859,NULL),('phabricator:20131006.hdisable.sql',1466802859,NULL),('phabricator:20131010.pstorage.sql',1466802859,NULL),('phabricator:20131015.cpolicy.sql',1466802859,NULL),('phabricator:20131020.col1.sql',1466802859,NULL),('phabricator:20131020.harbormaster.sql',1466802859,NULL),('phabricator:20131020.pcustom.sql',1466802859,NULL),('phabricator:20131020.pxaction.sql',1466802859,NULL),('phabricator:20131020.pxactionmig.php',1466802859,NULL),('phabricator:20131025.repopush.sql',1466802859,NULL),('phabricator:20131026.commitstatus.sql',1466802859,NULL),('phabricator:20131030.repostatusmessage.sql',1466802859,NULL),('phabricator:20131031.vcspassword.sql',1466802859,NULL),('phabricator:20131105.buildstep.sql',1466802859,NULL),('phabricator:20131106.diffphid.1.col.sql',1466802859,NULL),('phabricator:20131106.diffphid.2.mig.php',1466802859,NULL),('phabricator:20131106.diffphid.3.key.sql',1466802859,NULL),('phabricator:20131106.nuance-v0.sql',1466802859,NULL),('phabricator:20131107.buildlog.sql',1466802859,NULL),('phabricator:20131112.userverified.1.col.sql',1466802859,NULL),('phabricator:20131112.userverified.2.mig.php',1466802859,NULL),('phabricator:20131118.ownerorder.php',1466802859,NULL),('phabricator:20131119.passphrase.sql',1466802859,NULL),('phabricator:20131120.nuancesourcetype.sql',1466802860,NULL),('phabricator:20131121.passphraseedge.sql',1466802860,NULL),('phabricator:20131121.repocredentials.1.col.sql',1466802860,NULL),('phabricator:20131121.repocredentials.2.mig.php',1466802860,NULL),('phabricator:20131122.repomirror.sql',1466802860,NULL),('phabricator:20131123.drydockblueprintpolicy.sql',1466802860,NULL),('phabricator:20131129.drydockresourceblueprint.sql',1466802860,NULL),('phabricator:20131204.pushlog.sql',1466802860,NULL),('phabricator:20131205.buildsteporder.sql',1466802860,NULL),('phabricator:20131205.buildstepordermig.php',1466802860,NULL),('phabricator:20131205.buildtargets.sql',1466802860,NULL),('phabricator:20131206.phragment.sql',1466802860,NULL),('phabricator:20131206.phragmentnull.sql',1466802860,NULL),('phabricator:20131208.phragmentsnapshot.sql',1466802860,NULL),('phabricator:20131211.phragmentedges.sql',1466802860,NULL),('phabricator:20131217.pushlogphid.1.col.sql',1466802860,NULL),('phabricator:20131217.pushlogphid.2.mig.php',1466802860,NULL),('phabricator:20131217.pushlogphid.3.key.sql',1466802860,NULL),('phabricator:20131219.pxdrop.sql',1466802860,NULL),('phabricator:20131224.harbormanual.sql',1466802860,NULL),('phabricator:20131227.heraldobject.sql',1466802860,NULL),('phabricator:20131231.dropshortcut.sql',1466802860,NULL),('phabricator:20131302.maniphestvalue.sql',1466802857,NULL),('phabricator:20140104.harbormastercmd.sql',1466802860,NULL),('phabricator:20140106.macromailkey.1.sql',1466802860,NULL),('phabricator:20140106.macromailkey.2.php',1466802860,NULL),('phabricator:20140108.ddbpname.1.sql',1466802860,NULL),('phabricator:20140108.ddbpname.2.php',1466802860,NULL),('phabricator:20140109.ddxactions.sql',1466802860,NULL),('phabricator:20140109.projectcolumnsdates.sql',1466802860,NULL),('phabricator:20140113.legalpadsig.1.sql',1466802860,NULL),('phabricator:20140113.legalpadsig.2.php',1466802860,NULL),('phabricator:20140115.auth.1.id.sql',1466802860,NULL),('phabricator:20140115.auth.2.expires.sql',1466802860,NULL),('phabricator:20140115.auth.3.unlimit.php',1466802860,NULL),('phabricator:20140115.legalpadsigkey.sql',1466802860,NULL),('phabricator:20140116.reporefcursor.sql',1466802860,NULL),('phabricator:20140126.diff.1.parentrevisionid.sql',1466802860,NULL),('phabricator:20140126.diff.2.repositoryphid.sql',1466802860,NULL),('phabricator:20140130.dash.1.board.sql',1466802860,NULL),('phabricator:20140130.dash.2.panel.sql',1466802860,NULL),('phabricator:20140130.dash.3.boardxaction.sql',1466802860,NULL),('phabricator:20140130.dash.4.panelxaction.sql',1466802860,NULL),('phabricator:20140130.mail.1.retry.sql',1466802860,NULL),('phabricator:20140130.mail.2.next.sql',1466802860,NULL),('phabricator:20140201.gc.1.mailsent.sql',1466802860,NULL),('phabricator:20140201.gc.2.mailreceived.sql',1466802860,NULL),('phabricator:20140205.cal.1.rename.sql',1466802860,NULL),('phabricator:20140205.cal.2.phid-col.sql',1466802860,NULL),('phabricator:20140205.cal.3.phid-mig.php',1466802860,NULL),('phabricator:20140205.cal.4.phid-key.sql',1466802860,NULL),('phabricator:20140210.herald.rule-condition-mig.php',1466802860,NULL),('phabricator:20140210.projcfield.1.blurb.php',1466802860,NULL),('phabricator:20140210.projcfield.2.piccol.sql',1466802860,NULL),('phabricator:20140210.projcfield.3.picmig.sql',1466802860,NULL),('phabricator:20140210.projcfield.4.memmig.sql',1466802860,NULL),('phabricator:20140210.projcfield.5.dropprofile.sql',1466802860,NULL),('phabricator:20140211.dx.1.nullablechangesetid.sql',1466802860,NULL),('phabricator:20140211.dx.2.migcommenttext.php',1466802860,NULL),('phabricator:20140211.dx.3.migsubscriptions.sql',1466802860,NULL),('phabricator:20140211.dx.999.drop.relationships.sql',1466802860,NULL),('phabricator:20140212.dx.1.armageddon.php',1466802860,NULL),('phabricator:20140214.clean.1.legacycommentid.sql',1466802860,NULL),('phabricator:20140214.clean.2.dropcomment.sql',1466802860,NULL),('phabricator:20140214.clean.3.dropinline.sql',1466802860,NULL),('phabricator:20140218.differentialdraft.sql',1466802860,NULL),('phabricator:20140218.passwords.1.extend.sql',1466802860,NULL),('phabricator:20140218.passwords.2.prefix.sql',1466802860,NULL),('phabricator:20140218.passwords.3.vcsextend.sql',1466802860,NULL),('phabricator:20140218.passwords.4.vcs.php',1466802860,NULL),('phabricator:20140223.bigutf8scratch.sql',1466802860,NULL),('phabricator:20140224.dxclean.1.datecommitted.sql',1466802860,NULL),('phabricator:20140226.dxcustom.1.fielddata.php',1466802860,NULL),('phabricator:20140226.dxcustom.99.drop.sql',1466802860,NULL),('phabricator:20140228.dxcomment.1.sql',1466802860,NULL),('phabricator:20140305.diviner.1.slugcol.sql',1466802861,NULL),('phabricator:20140305.diviner.2.slugkey.sql',1466802861,NULL),('phabricator:20140311.mdroplegacy.sql',1466802861,NULL),('phabricator:20140314.projectcolumn.1.statuscol.sql',1466802861,NULL),('phabricator:20140314.projectcolumn.2.statuskey.sql',1466802861,NULL),('phabricator:20140317.mupdatedkey.sql',1466802861,NULL),('phabricator:20140321.harbor.1.bxaction.sql',1466802861,NULL),('phabricator:20140321.mstatus.1.col.sql',1466802861,NULL),('phabricator:20140321.mstatus.2.mig.php',1466802861,NULL),('phabricator:20140323.harbor.1.renames.php',1466802861,NULL),('phabricator:20140323.harbor.2.message.sql',1466802861,NULL),('phabricator:20140325.push.1.event.sql',1466802861,NULL),('phabricator:20140325.push.2.eventphid.sql',1466802861,NULL),('phabricator:20140325.push.3.groups.php',1466802861,NULL),('phabricator:20140325.push.4.prune.sql',1466802861,NULL),('phabricator:20140326.project.1.colxaction.sql',1466802861,NULL),('phabricator:20140328.releeph.1.productxaction.sql',1466802861,NULL),('phabricator:20140330.flagtext.sql',1466802861,NULL),('phabricator:20140402.actionlog.sql',1466802861,NULL),('phabricator:20140410.accountsecret.1.sql',1466802861,NULL),('phabricator:20140410.accountsecret.2.php',1466802861,NULL),('phabricator:20140416.harbor.1.sql',1466802861,NULL),('phabricator:20140420.rel.1.objectphid.sql',1466802861,NULL),('phabricator:20140420.rel.2.objectmig.php',1466802861,NULL),('phabricator:20140421.slowvotecolumnsisclosed.sql',1466802861,NULL),('phabricator:20140423.session.1.hisec.sql',1466802861,NULL),('phabricator:20140427.mfactor.1.sql',1466802861,NULL),('phabricator:20140430.auth.1.partial.sql',1466802861,NULL),('phabricator:20140430.dash.1.paneltype.sql',1466802861,NULL),('phabricator:20140430.dash.2.edge.sql',1466802861,NULL),('phabricator:20140501.passphraselockcredential.sql',1466802861,NULL),('phabricator:20140501.remove.1.dlog.sql',1466802861,NULL),('phabricator:20140507.smstable.sql',1466802861,NULL),('phabricator:20140509.coverage.1.sql',1466802861,NULL),('phabricator:20140509.dashboardlayoutconfig.sql',1466802861,NULL),('phabricator:20140512.dparents.1.sql',1466802861,NULL),('phabricator:20140514.harbormasterbuildabletransaction.sql',1466802861,NULL),('phabricator:20140514.pholiomockclose.sql',1466802861,NULL),('phabricator:20140515.trust-emails.sql',1466802861,NULL),('phabricator:20140517.dxbinarycache.sql',1466802861,NULL),('phabricator:20140518.dxmorebinarycache.sql',1466802861,NULL),('phabricator:20140519.dashboardinstall.sql',1466802861,NULL),('phabricator:20140520.authtemptoken.sql',1466802861,NULL),('phabricator:20140521.projectslug.1.create.sql',1466802861,NULL),('phabricator:20140521.projectslug.2.mig.php',1466802861,NULL),('phabricator:20140522.projecticon.sql',1466802861,NULL),('phabricator:20140524.auth.mfa.cache.sql',1466802861,NULL),('phabricator:20140525.hunkmodern.sql',1466802861,NULL),('phabricator:20140615.pholioedit.1.sql',1466802861,NULL),('phabricator:20140615.pholioedit.2.sql',1466802861,NULL),('phabricator:20140617.daemon.explicit-argv.sql',1466802861,NULL),('phabricator:20140617.daemonlog.sql',1466802861,NULL),('phabricator:20140624.projcolor.1.sql',1466802861,NULL),('phabricator:20140624.projcolor.2.sql',1466802861,NULL),('phabricator:20140629.dasharchive.1.sql',1466802861,NULL),('phabricator:20140629.legalsig.1.sql',1466802861,NULL),('phabricator:20140629.legalsig.2.php',1466802861,NULL),('phabricator:20140701.legalexemption.1.sql',1466802861,NULL),('phabricator:20140701.legalexemption.2.sql',1466802861,NULL),('phabricator:20140703.legalcorp.1.sql',1466802861,NULL),('phabricator:20140703.legalcorp.2.sql',1466802861,NULL),('phabricator:20140703.legalcorp.3.sql',1466802861,NULL),('phabricator:20140703.legalcorp.4.sql',1466802861,NULL),('phabricator:20140703.legalcorp.5.sql',1466802861,NULL),('phabricator:20140704.harbormasterstep.1.sql',1466802861,NULL),('phabricator:20140704.harbormasterstep.2.sql',1466802861,NULL),('phabricator:20140704.legalpreamble.1.sql',1466802861,NULL),('phabricator:20140706.harbormasterdepend.1.php',1466802861,NULL),('phabricator:20140706.pedge.1.sql',1466802861,NULL),('phabricator:20140711.pnames.1.sql',1466802861,NULL),('phabricator:20140711.pnames.2.php',1466802861,NULL),('phabricator:20140711.workerpriority.sql',1466802862,NULL),('phabricator:20140712.projcoluniq.sql',1466802862,NULL),('phabricator:20140721.phortune.1.cart.sql',1466802862,NULL),('phabricator:20140721.phortune.2.purchase.sql',1466802862,NULL),('phabricator:20140721.phortune.3.charge.sql',1466802862,NULL),('phabricator:20140721.phortune.4.cartstatus.sql',1466802862,NULL),('phabricator:20140721.phortune.5.cstatusdefault.sql',1466802862,NULL),('phabricator:20140721.phortune.6.onetimecharge.sql',1466802862,NULL),('phabricator:20140721.phortune.7.nullmethod.sql',1466802862,NULL),('phabricator:20140722.appname.php',1466802862,NULL),('phabricator:20140722.audit.1.xactions.sql',1466802862,NULL),('phabricator:20140722.audit.2.comments.sql',1466802862,NULL),('phabricator:20140722.audit.3.miginlines.php',1466802862,NULL),('phabricator:20140722.audit.4.migtext.php',1466802862,NULL),('phabricator:20140722.renameauth.php',1466802862,NULL),('phabricator:20140723.apprenamexaction.sql',1466802862,NULL),('phabricator:20140725.audit.1.migxactions.php',1466802862,NULL),('phabricator:20140731.audit.1.subscribers.php',1466802862,NULL),('phabricator:20140731.cancdn.php',1466802862,NULL),('phabricator:20140731.harbormasterstepdesc.sql',1466802862,NULL),('phabricator:20140805.boardcol.1.sql',1466802862,NULL),('phabricator:20140805.boardcol.2.php',1466802862,NULL),('phabricator:20140807.harbormastertargettime.sql',1466802862,NULL),('phabricator:20140808.boardprop.1.sql',1466802862,NULL),('phabricator:20140808.boardprop.2.sql',1466802862,NULL),('phabricator:20140808.boardprop.3.php',1466802862,NULL),('phabricator:20140811.blob.1.sql',1466802862,NULL),('phabricator:20140811.blob.2.sql',1466802862,NULL),('phabricator:20140812.projkey.1.sql',1466802862,NULL),('phabricator:20140812.projkey.2.sql',1466802862,NULL),('phabricator:20140814.passphrasecredentialconduit.sql',1466802862,NULL),('phabricator:20140815.cancdncase.php',1466802862,NULL),('phabricator:20140818.harbormasterindex.1.sql',1466802862,NULL),('phabricator:20140821.harbormasterbuildgen.1.sql',1466802862,NULL),('phabricator:20140822.daemonenvhash.sql',1466802862,NULL),('phabricator:20140902.almanacdevice.1.sql',1466802862,NULL),('phabricator:20140904.macroattach.php',1466802862,NULL),('phabricator:20140911.fund.1.initiative.sql',1466802862,NULL),('phabricator:20140911.fund.2.xaction.sql',1466802862,NULL),('phabricator:20140911.fund.3.edge.sql',1466802862,NULL),('phabricator:20140911.fund.4.backer.sql',1466802862,NULL),('phabricator:20140911.fund.5.backxaction.sql',1466802862,NULL),('phabricator:20140914.betaproto.php',1466802862,NULL),('phabricator:20140917.project.canlock.sql',1466802862,NULL),('phabricator:20140918.schema.1.dropaudit.sql',1466802862,NULL),('phabricator:20140918.schema.2.dropauditinline.sql',1466802862,NULL),('phabricator:20140918.schema.3.wipecache.sql',1466802862,NULL),('phabricator:20140918.schema.4.cachetype.sql',1466802862,NULL),('phabricator:20140918.schema.5.slowvote.sql',1466802862,NULL),('phabricator:20140919.schema.01.calstatus.sql',1466802862,NULL),('phabricator:20140919.schema.02.calname.sql',1466802862,NULL),('phabricator:20140919.schema.03.dropaux.sql',1466802862,NULL),('phabricator:20140919.schema.04.droptaskproj.sql',1466802862,NULL),('phabricator:20140926.schema.01.droprelev.sql',1466802862,NULL),('phabricator:20140926.schema.02.droprelreqev.sql',1466802862,NULL),('phabricator:20140926.schema.03.dropldapinfo.sql',1466802862,NULL),('phabricator:20140926.schema.04.dropoauthinfo.sql',1466802862,NULL),('phabricator:20140926.schema.05.dropprojaffil.sql',1466802862,NULL),('phabricator:20140926.schema.06.dropsubproject.sql',1466802862,NULL),('phabricator:20140926.schema.07.droppondcom.sql',1466802862,NULL),('phabricator:20140927.schema.01.dropsearchq.sql',1466802862,NULL),('phabricator:20140927.schema.02.pholio1.sql',1466802862,NULL),('phabricator:20140927.schema.03.pholio2.sql',1466802862,NULL),('phabricator:20140927.schema.04.pholio3.sql',1466802862,NULL),('phabricator:20140927.schema.05.phragment1.sql',1466802862,NULL),('phabricator:20140927.schema.06.releeph1.sql',1466802862,NULL),('phabricator:20141001.schema.01.version.sql',1466802862,NULL),('phabricator:20141001.schema.02.taskmail.sql',1466802862,NULL),('phabricator:20141002.schema.01.liskcounter.sql',1466802862,NULL),('phabricator:20141002.schema.02.draftnull.sql',1466802862,NULL),('phabricator:20141004.currency.01.sql',1466802862,NULL),('phabricator:20141004.currency.02.sql',1466802862,NULL),('phabricator:20141004.currency.03.sql',1466802862,NULL),('phabricator:20141004.currency.04.sql',1466802862,NULL),('phabricator:20141004.currency.05.sql',1466802862,NULL),('phabricator:20141004.currency.06.sql',1466802862,NULL),('phabricator:20141004.harborliskcounter.sql',1466802862,NULL),('phabricator:20141005.phortuneproduct.sql',1466802862,NULL),('phabricator:20141006.phortunecart.sql',1466802862,NULL),('phabricator:20141006.phortunemerchant.sql',1466802863,NULL),('phabricator:20141006.phortunemerchantx.sql',1466802863,NULL),('phabricator:20141007.fundmerchant.sql',1466802863,NULL),('phabricator:20141007.fundrisks.sql',1466802863,NULL),('phabricator:20141007.fundtotal.sql',1466802863,NULL),('phabricator:20141007.phortunecartmerchant.sql',1466802863,NULL),('phabricator:20141007.phortunecharge.sql',1466802863,NULL),('phabricator:20141007.phortunepayment.sql',1466802863,NULL),('phabricator:20141007.phortuneprovider.sql',1466802863,NULL),('phabricator:20141007.phortuneproviderx.sql',1466802863,NULL),('phabricator:20141008.phortunemerchdesc.sql',1466802863,NULL),('phabricator:20141008.phortuneprovdis.sql',1466802863,NULL),('phabricator:20141008.phortunerefund.sql',1466802863,NULL),('phabricator:20141010.fundmailkey.sql',1466802863,NULL),('phabricator:20141011.phortunemerchedit.sql',1466802863,NULL),('phabricator:20141012.phortunecartxaction.sql',1466802863,NULL),('phabricator:20141013.phortunecartkey.sql',1466802863,NULL),('phabricator:20141016.almanac.device.sql',1466802863,NULL),('phabricator:20141016.almanac.dxaction.sql',1466802863,NULL),('phabricator:20141016.almanac.interface.sql',1466802863,NULL),('phabricator:20141016.almanac.network.sql',1466802863,NULL),('phabricator:20141016.almanac.nxaction.sql',1466802863,NULL),('phabricator:20141016.almanac.service.sql',1466802863,NULL),('phabricator:20141016.almanac.sxaction.sql',1466802863,NULL),('phabricator:20141017.almanac.binding.sql',1466802863,NULL),('phabricator:20141017.almanac.bxaction.sql',1466802863,NULL),('phabricator:20141025.phriction.1.xaction.sql',1466802863,NULL),('phabricator:20141025.phriction.2.xaction.sql',1466802863,NULL),('phabricator:20141025.phriction.mailkey.sql',1466802863,NULL),('phabricator:20141103.almanac.1.delprop.sql',1466802863,NULL),('phabricator:20141103.almanac.2.addprop.sql',1466802863,NULL),('phabricator:20141104.almanac.3.edge.sql',1466802863,NULL),('phabricator:20141105.ssh.1.rename.sql',1466802863,NULL),('phabricator:20141106.dropold.sql',1466802863,NULL),('phabricator:20141106.uniqdrafts.php',1466802863,NULL),('phabricator:20141107.phriction.policy.1.sql',1466802863,NULL),('phabricator:20141107.phriction.policy.2.php',1466802863,NULL),('phabricator:20141107.phriction.popkeys.php',1466802863,NULL),('phabricator:20141107.ssh.1.colname.sql',1466802863,NULL),('phabricator:20141107.ssh.2.keyhash.sql',1466802863,NULL),('phabricator:20141107.ssh.3.keyindex.sql',1466802863,NULL),('phabricator:20141107.ssh.4.keymig.php',1466802863,NULL),('phabricator:20141107.ssh.5.indexnull.sql',1466802863,NULL),('phabricator:20141107.ssh.6.indexkey.sql',1466802863,NULL),('phabricator:20141107.ssh.7.colnull.sql',1466802863,NULL),('phabricator:20141113.auditdupes.php',1466802863,NULL),('phabricator:20141118.diffxaction.sql',1466802863,NULL),('phabricator:20141119.commitpedge.sql',1466802863,NULL),('phabricator:20141119.differential.diff.policy.sql',1466802863,NULL),('phabricator:20141119.sshtrust.sql',1466802863,NULL),('phabricator:20141123.taskpriority.1.sql',1466802863,NULL),('phabricator:20141123.taskpriority.2.sql',1466802863,NULL),('phabricator:20141210.maniphestsubscribersmig.1.sql',1466802863,NULL),('phabricator:20141210.maniphestsubscribersmig.2.sql',1466802863,NULL),('phabricator:20141210.reposervice.sql',1466802863,NULL),('phabricator:20141212.conduittoken.sql',1466802863,NULL),('phabricator:20141215.almanacservicetype.sql',1466802863,NULL),('phabricator:20141217.almanacdevicelock.sql',1466802864,NULL),('phabricator:20141217.almanaclock.sql',1466802864,NULL),('phabricator:20141218.maniphestcctxn.php',1466802864,NULL),('phabricator:20141222.maniphestprojtxn.php',1466802864,NULL),('phabricator:20141223.daemonloguser.sql',1466802864,NULL),('phabricator:20141223.daemonobjectphid.sql',1466802864,NULL),('phabricator:20141230.pasteeditpolicycolumn.sql',1466802864,NULL),('phabricator:20141230.pasteeditpolicyexisting.sql',1466802864,NULL),('phabricator:20150102.policyname.php',1466802864,NULL),('phabricator:20150102.tasksubscriber.sql',1466802864,NULL),('phabricator:20150105.conpsearch.sql',1466802864,NULL),('phabricator:20150114.oauthserver.client.policy.sql',1466802864,NULL),('phabricator:20150115.applicationemails.sql',1466802864,NULL),('phabricator:20150115.trigger.1.sql',1466802864,NULL),('phabricator:20150115.trigger.2.sql',1466802864,NULL),('phabricator:20150116.maniphestapplicationemails.php',1466802864,NULL),('phabricator:20150120.maniphestdefaultauthor.php',1466802864,NULL),('phabricator:20150124.subs.1.sql',1466802864,NULL),('phabricator:20150129.pastefileapplicationemails.php',1466802864,NULL),('phabricator:20150130.phortune.1.subphid.sql',1466802864,NULL),('phabricator:20150130.phortune.2.subkey.sql',1466802864,NULL),('phabricator:20150131.phortune.1.defaultpayment.sql',1466802864,NULL),('phabricator:20150205.authprovider.autologin.sql',1466802864,NULL),('phabricator:20150205.daemonenv.sql',1466802864,NULL),('phabricator:20150209.invite.sql',1466802864,NULL),('phabricator:20150209.oauthclient.trust.sql',1466802864,NULL),('phabricator:20150210.invitephid.sql',1466802864,NULL),('phabricator:20150212.legalpad.session.1.sql',1466802864,NULL),('phabricator:20150212.legalpad.session.2.sql',1466802864,NULL),('phabricator:20150219.scratch.nonmutable.sql',1466802864,NULL),('phabricator:20150223.daemon.1.id.sql',1466802864,NULL),('phabricator:20150223.daemon.2.idlegacy.sql',1466802864,NULL),('phabricator:20150223.daemon.3.idkey.sql',1466802864,NULL),('phabricator:20150312.filechunk.1.sql',1466802864,NULL),('phabricator:20150312.filechunk.2.sql',1466802864,NULL),('phabricator:20150312.filechunk.3.sql',1466802864,NULL),('phabricator:20150317.conpherence.isroom.1.sql',1466802864,NULL),('phabricator:20150317.conpherence.isroom.2.sql',1466802864,NULL),('phabricator:20150317.conpherence.policy.sql',1466802864,NULL),('phabricator:20150410.nukeruleedit.sql',1466802864,NULL),('phabricator:20150420.invoice.1.sql',1466802864,NULL),('phabricator:20150420.invoice.2.sql',1466802864,NULL),('phabricator:20150425.isclosed.sql',1466802864,NULL),('phabricator:20150427.calendar.1.edge.sql',1466802864,NULL),('phabricator:20150427.calendar.1.xaction.sql',1466802864,NULL),('phabricator:20150427.calendar.2.xaction.sql',1466802864,NULL),('phabricator:20150428.calendar.1.iscancelled.sql',1466802864,NULL),('phabricator:20150428.calendar.1.name.sql',1466802864,NULL),('phabricator:20150429.calendar.1.invitee.sql',1466802864,NULL),('phabricator:20150430.calendar.1.policies.sql',1466802864,NULL),('phabricator:20150430.multimeter.1.sql',1466802864,NULL),('phabricator:20150430.multimeter.2.host.sql',1466802864,NULL),('phabricator:20150430.multimeter.3.viewer.sql',1466802864,NULL),('phabricator:20150430.multimeter.4.context.sql',1466802864,NULL),('phabricator:20150430.multimeter.5.label.sql',1466802864,NULL),('phabricator:20150501.calendar.1.reply.sql',1466802864,NULL),('phabricator:20150501.calendar.2.reply.php',1466802864,NULL),('phabricator:20150501.conpherencepics.sql',1466802865,NULL),('phabricator:20150503.repositorysymbols.1.sql',1466802865,NULL),('phabricator:20150503.repositorysymbols.2.php',1466802865,NULL),('phabricator:20150503.repositorysymbols.3.sql',1466802865,NULL),('phabricator:20150504.symbolsproject.1.php',1466802865,NULL),('phabricator:20150504.symbolsproject.2.sql',1466802865,NULL),('phabricator:20150506.calendarunnamedevents.1.php',1466802865,NULL),('phabricator:20150507.calendar.1.isallday.sql',1466802865,NULL),('phabricator:20150513.user.cache.1.sql',1466802865,NULL),('phabricator:20150514.calendar.status.sql',1466802865,NULL),('phabricator:20150514.phame.blog.xaction.sql',1466802865,NULL),('phabricator:20150514.user.cache.2.sql',1466802865,NULL),('phabricator:20150515.phame.post.xaction.sql',1466802865,NULL),('phabricator:20150515.project.mailkey.1.sql',1466802865,NULL),('phabricator:20150515.project.mailkey.2.php',1466802865,NULL),('phabricator:20150519.calendar.calendaricon.sql',1466802865,NULL),('phabricator:20150521.releephrepository.sql',1466802865,NULL),('phabricator:20150525.diff.hidden.1.sql',1466802865,NULL),('phabricator:20150526.owners.mailkey.1.sql',1466802865,NULL),('phabricator:20150526.owners.mailkey.2.php',1466802865,NULL),('phabricator:20150526.owners.xaction.sql',1466802865,NULL),('phabricator:20150527.calendar.recurringevents.sql',1466802865,NULL),('phabricator:20150601.spaces.1.namespace.sql',1466802865,NULL),('phabricator:20150601.spaces.2.xaction.sql',1466802865,NULL),('phabricator:20150602.mlist.1.sql',1466802865,NULL),('phabricator:20150602.mlist.2.php',1466802865,NULL),('phabricator:20150604.spaces.1.sql',1466802865,NULL),('phabricator:20150605.diviner.edges.sql',1466802865,NULL),('phabricator:20150605.diviner.editPolicy.sql',1466802865,NULL),('phabricator:20150605.diviner.xaction.sql',1466802865,NULL),('phabricator:20150606.mlist.1.php',1466802865,NULL),('phabricator:20150609.inline.sql',1466802865,NULL),('phabricator:20150609.spaces.1.pholio.sql',1466802865,NULL),('phabricator:20150609.spaces.2.maniphest.sql',1466802865,NULL),('phabricator:20150610.spaces.1.desc.sql',1466802865,NULL),('phabricator:20150610.spaces.2.edge.sql',1466802865,NULL),('phabricator:20150610.spaces.3.archive.sql',1466802865,NULL),('phabricator:20150611.spaces.1.mailxaction.sql',1466802865,NULL),('phabricator:20150611.spaces.2.appmail.sql',1466802865,NULL),('phabricator:20150616.divinerrepository.sql',1466802865,NULL),('phabricator:20150617.harbor.1.lint.sql',1466802865,NULL),('phabricator:20150617.harbor.2.unit.sql',1466802865,NULL),('phabricator:20150618.harbor.1.planauto.sql',1466802866,NULL),('phabricator:20150618.harbor.2.stepauto.sql',1466802866,NULL),('phabricator:20150618.harbor.3.buildauto.sql',1466802866,NULL),('phabricator:20150619.conpherencerooms.1.sql',1466802866,NULL),('phabricator:20150619.conpherencerooms.2.sql',1466802866,NULL),('phabricator:20150619.conpherencerooms.3.sql',1466802866,NULL),('phabricator:20150621.phrase.1.sql',1466802866,NULL),('phabricator:20150621.phrase.2.sql',1466802866,NULL),('phabricator:20150622.bulk.1.job.sql',1466802866,NULL),('phabricator:20150622.bulk.2.task.sql',1466802866,NULL),('phabricator:20150622.bulk.3.xaction.sql',1466802866,NULL),('phabricator:20150622.bulk.4.edge.sql',1466802866,NULL),('phabricator:20150622.metamta.1.phid-col.sql',1466802866,NULL),('phabricator:20150622.metamta.2.phid-mig.php',1466802866,NULL),('phabricator:20150622.metamta.3.phid-key.sql',1466802866,NULL),('phabricator:20150622.metamta.4.actor-phid-col.sql',1466802866,NULL),('phabricator:20150622.metamta.5.actor-phid-mig.php',1466802866,NULL),('phabricator:20150622.metamta.6.actor-phid-key.sql',1466802866,NULL),('phabricator:20150624.spaces.1.repo.sql',1466802866,NULL),('phabricator:20150626.spaces.1.calendar.sql',1466802866,NULL),('phabricator:20150630.herald.1.sql',1466802866,NULL),('phabricator:20150630.herald.2.sql',1466802866,NULL),('phabricator:20150701.herald.1.sql',1466802866,NULL),('phabricator:20150701.herald.2.sql',1466802866,NULL),('phabricator:20150702.spaces.1.slowvote.sql',1466802866,NULL),('phabricator:20150706.herald.1.sql',1466802866,NULL),('phabricator:20150707.herald.1.sql',1466802866,NULL),('phabricator:20150708.arcanistproject.sql',1466802866,NULL),('phabricator:20150708.herald.1.sql',1466802866,NULL),('phabricator:20150708.herald.2.sql',1466802866,NULL),('phabricator:20150708.herald.3.sql',1466802866,NULL),('phabricator:20150712.badges.1.sql',1466802866,NULL),('phabricator:20150714.spaces.countdown.1.sql',1466802866,NULL),('phabricator:20150717.herald.1.sql',1466802866,NULL),('phabricator:20150719.countdown.1.sql',1466802866,NULL),('phabricator:20150719.countdown.2.sql',1466802866,NULL),('phabricator:20150719.countdown.3.sql',1466802866,NULL),('phabricator:20150721.phurl.1.url.sql',1466802866,NULL),('phabricator:20150721.phurl.2.xaction.sql',1466802866,NULL),('phabricator:20150721.phurl.3.xactioncomment.sql',1466802866,NULL),('phabricator:20150721.phurl.4.url.sql',1466802866,NULL),('phabricator:20150721.phurl.5.edge.sql',1466802866,NULL),('phabricator:20150721.phurl.6.alias.sql',1466802866,NULL),('phabricator:20150721.phurl.7.authorphid.sql',1466802866,NULL),('phabricator:20150722.dashboard.1.sql',1466802866,NULL),('phabricator:20150722.dashboard.2.sql',1466802866,NULL),('phabricator:20150723.countdown.1.sql',1466802866,NULL),('phabricator:20150724.badges.comments.1.sql',1466802866,NULL),('phabricator:20150724.countdown.comments.1.sql',1466802866,NULL),('phabricator:20150725.badges.mailkey.1.sql',1466802866,NULL),('phabricator:20150725.badges.mailkey.2.php',1466802866,NULL),('phabricator:20150725.badges.viewpolicy.3.sql',1466802866,NULL),('phabricator:20150725.countdown.mailkey.1.sql',1466802866,NULL),('phabricator:20150725.countdown.mailkey.2.php',1466802866,NULL),('phabricator:20150725.slowvote.mailkey.1.sql',1466802866,NULL),('phabricator:20150725.slowvote.mailkey.2.php',1466802866,NULL),('phabricator:20150727.heraldaction.1.sql',1466802866,NULL),('phabricator:20150730.herald.1.sql',1466802866,NULL),('phabricator:20150730.herald.2.sql',1466802866,NULL),('phabricator:20150730.herald.3.sql',1466802866,NULL),('phabricator:20150730.herald.4.sql',1466802866,NULL),('phabricator:20150730.herald.5.sql',1466802866,NULL),('phabricator:20150730.herald.6.sql',1466802866,NULL),('phabricator:20150730.herald.7.sql',1466802866,NULL),('phabricator:20150803.herald.1.sql',1466802866,NULL),('phabricator:20150803.herald.2.sql',1466802866,NULL),('phabricator:20150804.ponder.answer.mailkey.1.sql',1466802866,NULL),('phabricator:20150804.ponder.answer.mailkey.2.php',1466802866,NULL),('phabricator:20150804.ponder.question.1.sql',1466802867,NULL),('phabricator:20150804.ponder.question.2.sql',1466802867,NULL),('phabricator:20150804.ponder.question.3.sql',1466802867,NULL),('phabricator:20150804.ponder.spaces.4.sql',1466802867,NULL),('phabricator:20150805.paste.status.1.sql',1466802867,NULL),('phabricator:20150805.paste.status.2.sql',1466802867,NULL),('phabricator:20150806.ponder.answer.1.sql',1466802867,NULL),('phabricator:20150806.ponder.editpolicy.2.sql',1466802867,NULL),('phabricator:20150806.ponder.status.1.sql',1466802867,NULL),('phabricator:20150806.ponder.status.2.sql',1466802867,NULL),('phabricator:20150806.ponder.status.3.sql',1466802867,NULL),('phabricator:20150808.ponder.vote.1.sql',1466802867,NULL),('phabricator:20150808.ponder.vote.2.sql',1466802867,NULL),('phabricator:20150812.ponder.answer.1.sql',1466802867,NULL),('phabricator:20150812.ponder.answer.2.sql',1466802867,NULL),('phabricator:20150814.harbormater.artifact.phid.sql',1466802867,NULL),('phabricator:20150815.owners.status.1.sql',1466802867,NULL),('phabricator:20150815.owners.status.2.sql',1466802867,NULL),('phabricator:20150823.nuance.queue.1.sql',1466802867,NULL),('phabricator:20150823.nuance.queue.2.sql',1466802867,NULL),('phabricator:20150823.nuance.queue.3.sql',1466802867,NULL),('phabricator:20150823.nuance.queue.4.sql',1466802867,NULL),('phabricator:20150828.ponder.wiki.1.sql',1466802867,NULL),('phabricator:20150829.ponder.dupe.1.sql',1466802867,NULL),('phabricator:20150904.herald.1.sql',1466802867,NULL),('phabricator:20150906.mailinglist.sql',1466802867,NULL),('phabricator:20150910.owners.custom.1.sql',1466802867,NULL),('phabricator:20150916.drydock.slotlocks.1.sql',1466802867,NULL),('phabricator:20150922.drydock.commands.1.sql',1466802867,NULL),('phabricator:20150923.drydock.resourceid.1.sql',1466802867,NULL),('phabricator:20150923.drydock.resourceid.2.sql',1466802867,NULL),('phabricator:20150923.drydock.resourceid.3.sql',1466802867,NULL),('phabricator:20150923.drydock.taskid.1.sql',1466802867,NULL),('phabricator:20150924.drydock.disable.1.sql',1466802867,NULL),('phabricator:20150924.drydock.status.1.sql',1466802867,NULL),('phabricator:20150928.drydock.rexpire.1.sql',1466802867,NULL),('phabricator:20150930.drydock.log.1.sql',1466802867,NULL),('phabricator:20151001.drydock.rname.1.sql',1466802867,NULL),('phabricator:20151002.dashboard.status.1.sql',1466802867,NULL),('phabricator:20151002.harbormaster.bparam.1.sql',1466802867,NULL),('phabricator:20151009.drydock.auth.1.sql',1466802867,NULL),('phabricator:20151010.drydock.auth.2.sql',1466802867,NULL),('phabricator:20151013.drydock.op.1.sql',1466802867,NULL),('phabricator:20151023.harborpolicy.1.sql',1466802867,NULL),('phabricator:20151023.harborpolicy.2.php',1466802867,NULL),('phabricator:20151023.patchduration.sql',1466802867,16373),('phabricator:20151030.harbormaster.initiator.sql',1466802867,21600),('phabricator:20151106.editengine.1.table.sql',1466802867,9430),('phabricator:20151106.editengine.2.xactions.sql',1466802867,7174),('phabricator:20151106.phame.post.mailkey.1.sql',1466802867,19922),('phabricator:20151106.phame.post.mailkey.2.php',1466802867,1343),('phabricator:20151107.phame.blog.mailkey.1.sql',1466802867,17107),('phabricator:20151107.phame.blog.mailkey.2.php',1466802867,1049),('phabricator:20151108.phame.blog.joinpolicy.sql',1466802867,16781),('phabricator:20151108.xhpast.stderr.sql',1466802867,23962),('phabricator:20151109.phame.post.comments.1.sql',1466802867,8796),('phabricator:20151109.repository.coverage.1.sql',1466802867,1058),('phabricator:20151109.xhpast.db.1.sql',1466802867,1587),('phabricator:20151109.xhpast.db.2.sql',1466802867,561),('phabricator:20151110.daemonenvhash.sql',1466802867,36237),('phabricator:20151111.phame.blog.archive.1.sql',1466802867,16500),('phabricator:20151111.phame.blog.archive.2.sql',1466802867,479),('phabricator:20151112.herald.edge.sql',1466802867,14091),('phabricator:20151116.owners.edge.sql',1466802867,11769),('phabricator:20151128.phame.blog.picture.1.sql',1466802867,15526),('phabricator:20151130.phurl.mailkey.1.sql',1466802868,10082),('phabricator:20151130.phurl.mailkey.2.php',1466802868,1190),('phabricator:20151202.versioneddraft.1.sql',1466802868,8290),('phabricator:20151207.editengine.1.sql',1466802868,76502),('phabricator:20151210.land.1.refphid.sql',1466802868,15998),('phabricator:20151210.land.2.refphid.php',1466802868,751),('phabricator:20151215.phame.1.autotitle.sql',1466802868,20074),('phabricator:20151218.key.1.keyphid.sql',1466802868,15772),('phabricator:20151218.key.2.keyphid.php',1466802868,454),('phabricator:20151219.proj.01.prislug.sql',1466802868,22082),('phabricator:20151219.proj.02.prislugkey.sql',1466802868,15591),('phabricator:20151219.proj.03.copyslug.sql',1466802868,581),('phabricator:20151219.proj.04.dropslugkey.sql',1466802868,8692),('phabricator:20151219.proj.05.dropslug.sql',1466802868,21494),('phabricator:20151219.proj.06.defaultpolicy.php',1466802868,1250),('phabricator:20151219.proj.07.viewnull.sql',1466802868,14942),('phabricator:20151219.proj.08.editnull.sql',1466802868,11831),('phabricator:20151219.proj.09.joinnull.sql',1466802868,10583),('phabricator:20151219.proj.10.subcolumns.sql',1466802868,201986),('phabricator:20151219.proj.11.subprojectphids.sql',1466802868,23604),('phabricator:20151221.search.1.version.sql',1466802868,9540),('phabricator:20151221.search.2.ownersngrams.sql',1466802868,7522),('phabricator:20151221.search.3.reindex.php',1466802868,415),('phabricator:20151223.proj.01.paths.sql',1466802868,22569),('phabricator:20151223.proj.02.depths.sql',1466802868,25408),('phabricator:20151223.proj.03.pathkey.sql',1466802868,13193),('phabricator:20151223.proj.04.keycol.sql',1466802868,27276),('phabricator:20151223.proj.05.updatekeys.php',1466802868,451),('phabricator:20151223.proj.06.uniq.sql',1466802868,11754),('phabricator:20151226.reop.1.sql',1466802868,19139),('phabricator:20151227.proj.01.materialize.sql',1466802868,535),('phabricator:20151231.proj.01.icon.php',1466802868,1991),('phabricator:20160102.badges.award.sql',1466802868,10113),('phabricator:20160110.repo.01.slug.sql',1466802868,32438),('phabricator:20160110.repo.02.slug.php',1466802868,459),('phabricator:20160111.repo.01.slugx.sql',1466802868,627),('phabricator:20160112.repo.01.uri.sql',1466802868,8500),('phabricator:20160112.repo.02.uri.index.php',1466802868,64),('phabricator:20160113.propanel.1.storage.sql',1466802868,6858),('phabricator:20160113.propanel.2.xaction.sql',1466802868,7710),('phabricator:20160119.project.1.silence.sql',1466802868,579),('phabricator:20160122.project.1.boarddefault.php',1466802868,904),('phabricator:20160124.people.1.icon.sql',1466802868,12728),('phabricator:20160124.people.2.icondefault.sql',1466802868,477),('phabricator:20160128.repo.1.pull.sql',1466802868,9886),('phabricator:20160202.board.1.proxy.sql',1466802868,17041),('phabricator:20160202.ipv6.1.sql',1466802868,22960),('phabricator:20160202.ipv6.2.php',1466802868,1991),('phabricator:20160206.cover.1.sql',1466802868,29137),('phabricator:20160208.task.1.sql',1466802868,32546),('phabricator:20160208.task.2.sql',1466802868,33818),('phabricator:20160208.task.3.sql',1466802868,34881),('phabricator:20160212.proj.1.sql',1466802868,28365),('phabricator:20160212.proj.2.sql',1466802868,504),('phabricator:20160215.owners.policy.1.sql',1466802868,18780),('phabricator:20160215.owners.policy.2.sql',1466802868,17029),('phabricator:20160215.owners.policy.3.sql',1466802868,432),('phabricator:20160215.owners.policy.4.sql',1466802868,361),('phabricator:20160218.callsigns.1.sql',1466802869,12331),('phabricator:20160221.almanac.1.devicen.sql',1466802869,9432),('phabricator:20160221.almanac.2.devicei.php',1466802869,1470),('phabricator:20160221.almanac.3.servicen.sql',1466802869,7845),('phabricator:20160221.almanac.4.servicei.php',1466802869,916),('phabricator:20160221.almanac.5.networkn.sql',1466802869,8044),('phabricator:20160221.almanac.6.networki.php',1466802869,903),('phabricator:20160221.almanac.7.namespacen.sql',1466802869,7463),('phabricator:20160221.almanac.8.namespace.sql',1466802869,7462),('phabricator:20160221.almanac.9.namespacex.sql',1466802869,7400),('phabricator:20160222.almanac.1.properties.php',1466802869,1750),('phabricator:20160223.almanac.1.bound.sql',1466802869,16093),('phabricator:20160223.almanac.2.lockbind.sql',1466802869,447),('phabricator:20160223.almanac.3.devicelock.sql',1466802869,19320),('phabricator:20160223.almanac.4.servicelock.sql',1466802869,23933),('phabricator:20160223.paste.fileedges.php',1466802869,654),('phabricator:20160225.almanac.1.disablebinding.sql',1466802869,24011),('phabricator:20160225.almanac.2.stype.sql',1466802869,7243),('phabricator:20160225.almanac.3.stype.php',1466802869,464),('phabricator:20160227.harbormaster.1.plann.sql',1466802869,7447),('phabricator:20160227.harbormaster.2.plani.php',1466802869,367),('phabricator:20160303.drydock.1.bluen.sql',1466802869,6561),('phabricator:20160303.drydock.2.bluei.php',1466802869,323),('phabricator:20160303.drydock.3.edge.sql',1466802869,12513),('phabricator:20160308.nuance.01.disabled.sql',1466802869,14286),('phabricator:20160308.nuance.02.cursordata.sql',1466802869,14221),('phabricator:20160308.nuance.03.sourcen.sql',1466802869,7121),('phabricator:20160308.nuance.04.sourcei.php',1466802869,1214),('phabricator:20160308.nuance.05.sourcename.sql',1466802869,10244),('phabricator:20160308.nuance.06.label.sql',1466802869,18965),('phabricator:20160308.nuance.07.itemtype.sql',1466802869,25794),('phabricator:20160308.nuance.08.itemkey.sql',1466802869,21958),('phabricator:20160308.nuance.09.itemcontainer.sql',1466802869,22612),('phabricator:20160308.nuance.10.itemkeyu.sql',1466802869,552),('phabricator:20160308.nuance.11.requestor.sql',1466802869,14556),('phabricator:20160308.nuance.12.queue.sql',1466802869,19884),('phabricator:20160316.lfs.01.token.resource.sql',1466802869,13284),('phabricator:20160316.lfs.02.token.user.sql',1466802869,15555),('phabricator:20160316.lfs.03.token.properties.sql',1466802869,16563),('phabricator:20160316.lfs.04.token.default.sql',1466802869,581),('phabricator:20160317.lfs.01.ref.sql',1466802869,8120),('phabricator:20160321.nuance.01.taskbridge.sql',1466802869,28702),('phabricator:20160322.nuance.01.itemcommand.sql',1466802869,11727),('phabricator:20160323.badgemigrate.sql',1466802869,873),('phabricator:20160329.nuance.01.requestor.sql',1466802869,1313),('phabricator:20160329.nuance.02.requestorsource.sql',1466802869,1704),('phabricator:20160329.nuance.03.requestorxaction.sql',1466802869,1686),('phabricator:20160329.nuance.04.requestorcomment.sql',1466802869,1374),('phabricator:20160330.badges.migratequality.sql',1466802869,9959),('phabricator:20160330.badges.qualityxaction.mig.sql',1466802869,2022),('phabricator:20160331.fund.comments.1.sql',1466802869,6337),('phabricator:20160404.oauth.1.xaction.sql',1466802869,6577),('phabricator:20160405.oauth.2.disable.sql',1466802869,15800),('phabricator:20160406.badges.ngrams.php',1466802869,678),('phabricator:20160406.badges.ngrams.sql',1466802869,8117),('phabricator:20160406.columns.1.php',1466802869,543),('phabricator:20160411.repo.1.version.sql',1466802869,7060),('phabricator:20160418.repouri.1.sql',1466802869,6372),('phabricator:20160418.repouri.2.sql',1466802869,13856),('phabricator:20160418.repoversion.1.sql',1466802869,15751),('phabricator:20160419.pushlog.1.sql',1466802869,25118),('phabricator:20160424.locks.1.sql',1466802869,15525),('phabricator:20160426.searchedge.sql',1466802869,15875),('phabricator:20160428.repo.1.urixaction.sql',1466802869,7234),('phabricator:20160503.repo.01.lpath.sql',1466802869,23546),('phabricator:20160503.repo.02.lpathkey.sql',1466802869,12838),('phabricator:20160503.repo.03.lpathmigrate.php',1466802869,473),('phabricator:20160503.repo.04.mirrormigrate.php',1466802869,540),('phabricator:20160503.repo.05.urimigrate.php',1466802869,355),('phabricator:20160510.repo.01.uriindex.php',1466802869,4261),('phabricator:20160513.owners.01.autoreview.sql',1466802869,17537),('phabricator:20160513.owners.02.autoreviewnone.sql',1466802869,514),('phabricator:20160516.owners.01.dominion.sql',1466802869,16006),('phabricator:20160516.owners.02.dominionstrong.sql',1466802869,563),('phabricator:20160517.oauth.01.edge.sql',1466802869,13998),('phabricator:20160518.ssh.01.activecol.sql',1466802869,15647),('phabricator:20160518.ssh.02.activeval.sql',1466802869,485),('phabricator:20160518.ssh.03.activekey.sql',1466802869,10420),('phabricator:20160519.ssh.01.xaction.sql',1466802869,9024),('phabricator:20160531.pref.01.xaction.sql',1466802869,7837),('phabricator:20160531.pref.02.datecreatecol.sql',1466802869,11848),('phabricator:20160531.pref.03.datemodcol.sql',1466802869,13814),('phabricator:20160531.pref.04.datecreateval.sql',1466802869,429),('phabricator:20160531.pref.05.datemodval.sql',1466802869,305),('phabricator:20160531.pref.06.phidcol.sql',1466802869,12896),('phabricator:20160531.pref.07.phidval.php',1466802869,679),('phabricator:20160601.user.01.cache.sql',1466802869,9294),('phabricator:20160601.user.02.copyprefs.php',1466802869,1552),('phabricator:20160601.user.03.removetime.sql',1466802869,18764),('phabricator:20160601.user.04.removetranslation.sql',1466802869,20404),('phabricator:20160601.user.05.removesex.sql',1466802869,23968),('phabricator:20160603.user.01.removedcenabled.sql',1466802869,25907),('phabricator:20160603.user.02.removedctab.sql',1466802869,20792),('phabricator:20160603.user.03.removedcvisible.sql',1466802869,22140),('phabricator:20160604.user.01.stringmailprefs.php',1466802869,683),('phabricator:20160604.user.02.removeimagecache.sql',1466802870,22776),('phabricator:20160605.user.01.prefnulluser.sql',1466802870,12931),('phabricator:20160605.user.02.prefbuiltin.sql',1466802870,13598),('phabricator:20160605.user.03.builtinunique.sql',1466802870,12068),('phabricator:20160616.phame.blog.header.1.sql',1466802870,21493),('phabricator:20160616.repo.01.oldref.sql',1466802870,9001),('phabricator:20160617.harbormaster.01.arelease.sql',1466802870,16927),('phabricator:20160618.phame.blog.subtitle.sql',1466802870,28832),('phabricator:20160620.phame.blog.parentdomain.2.sql',1466802870,32443),('phabricator:20160620.phame.blog.parentsite.1.sql',1466802870,35279),('phabricator:20160623.phame.blog.fulldomain.1.sql',1466802870,37279),('phabricator:20160623.phame.blog.fulldomain.2.sql',1466802870,500),('phabricator:20160623.phame.blog.fulldomain.3.sql',1466802870,589),('phabricator:daemonstatus.sql',1466802856,NULL),('phabricator:daemonstatuskey.sql',1466802856,NULL),('phabricator:daemontaskarchive.sql',1466802856,NULL),('phabricator:db.almanac',1466802850,NULL),('phabricator:db.audit',1466802850,NULL),('phabricator:db.auth',1466802850,NULL),('phabricator:db.badges',1466802850,NULL),('phabricator:db.cache',1466802850,NULL),('phabricator:db.calendar',1466802850,NULL),('phabricator:db.chatlog',1466802850,NULL),('phabricator:db.conduit',1466802850,NULL),('phabricator:db.config',1466802850,NULL),('phabricator:db.conpherence',1466802850,NULL),('phabricator:db.countdown',1466802850,NULL),('phabricator:db.daemon',1466802850,NULL),('phabricator:db.dashboard',1466802850,NULL),('phabricator:db.differential',1466802850,NULL),('phabricator:db.diviner',1466802850,NULL),('phabricator:db.doorkeeper',1466802850,NULL),('phabricator:db.draft',1466802850,NULL),('phabricator:db.drydock',1466802850,NULL),('phabricator:db.fact',1466802850,NULL),('phabricator:db.feed',1466802850,NULL),('phabricator:db.file',1466802850,NULL),('phabricator:db.flag',1466802850,NULL),('phabricator:db.fund',1466802850,NULL),('phabricator:db.harbormaster',1466802850,NULL),('phabricator:db.herald',1466802850,NULL),('phabricator:db.legalpad',1466802850,NULL),('phabricator:db.maniphest',1466802850,NULL),('phabricator:db.meta_data',1466802850,NULL),('phabricator:db.metamta',1466802850,NULL),('phabricator:db.multimeter',1466802850,NULL),('phabricator:db.nuance',1466802850,NULL),('phabricator:db.oauth_server',1466802850,NULL),('phabricator:db.owners',1466802850,NULL),('phabricator:db.passphrase',1466802850,NULL),('phabricator:db.pastebin',1466802850,NULL),('phabricator:db.phame',1466802850,NULL),('phabricator:db.phlux',1466802850,NULL),('phabricator:db.pholio',1466802850,NULL),('phabricator:db.phortune',1466802850,NULL),('phabricator:db.phragment',1466802850,NULL),('phabricator:db.phrequent',1466802850,NULL),('phabricator:db.phriction',1466802850,NULL),('phabricator:db.phurl',1466802850,NULL),('phabricator:db.policy',1466802850,NULL),('phabricator:db.ponder',1466802850,NULL),('phabricator:db.project',1466802850,NULL),('phabricator:db.releeph',1466802850,NULL),('phabricator:db.repository',1466802850,NULL),('phabricator:db.search',1466802850,NULL),('phabricator:db.slowvote',1466802850,NULL),('phabricator:db.spaces',1466802850,NULL),('phabricator:db.system',1466802850,NULL),('phabricator:db.timeline',1466802850,NULL),('phabricator:db.token',1466802850,NULL),('phabricator:db.user',1466802850,NULL),('phabricator:db.worker',1466802850,NULL),('phabricator:db.xhpast',1466802850,NULL),('phabricator:db.xhpastview',1466802850,NULL),('phabricator:db.xhprof',1466802850,NULL),('phabricator:differentialbookmarks.sql',1466802856,NULL),('phabricator:draft-metadata.sql',1466802856,NULL),('phabricator:dropfileproxyimage.sql',1466802856,NULL),('phabricator:drydockresoucetype.sql',1466802856,NULL),('phabricator:drydocktaskid.sql',1466802856,NULL),('phabricator:edgetype.sql',1466802856,NULL),('phabricator:emailtable.sql',1466802855,NULL),('phabricator:emailtableport.sql',1466802855,NULL),('phabricator:emailtableremove.sql',1466802855,NULL),('phabricator:fact-raw.sql',1466802856,NULL),('phabricator:harbormasterobject.sql',1466802856,NULL),('phabricator:holidays.sql',1466802855,NULL),('phabricator:ldapinfo.sql',1466802855,NULL),('phabricator:legalpad-mailkey-populate.php',1466802858,NULL),('phabricator:legalpad-mailkey.sql',1466802858,NULL),('phabricator:liskcounters-task.sql',1466802856,NULL),('phabricator:liskcounters.php',1466802856,NULL),('phabricator:liskcounters.sql',1466802856,NULL),('phabricator:maniphestxcache.sql',1466802856,NULL),('phabricator:markupcache.sql',1466802856,NULL),('phabricator:migrate-differential-dependencies.php',1466802856,NULL),('phabricator:migrate-maniphest-dependencies.php',1466802856,NULL),('phabricator:migrate-maniphest-revisions.php',1466802856,NULL),('phabricator:migrate-project-edges.php',1466802856,NULL),('phabricator:owners-exclude.sql',1466802856,NULL),('phabricator:pastepolicy.sql',1466802856,NULL),('phabricator:phameblog.sql',1466802856,NULL),('phabricator:phamedomain.sql',1466802856,NULL),('phabricator:phameoneblog.sql',1466802856,NULL),('phabricator:phamepolicy.sql',1466802856,NULL),('phabricator:phiddrop.sql',1466802855,NULL),('phabricator:pholio.sql',1466802856,NULL),('phabricator:policy-project.sql',1466802856,NULL),('phabricator:ponder-comments.sql',1466802856,NULL),('phabricator:ponder-mailkey-populate.php',1466802856,NULL),('phabricator:ponder-mailkey.sql',1466802856,NULL),('phabricator:ponder.sql',1466802856,NULL),('phabricator:releeph.sql',1466802857,NULL),('phabricator:repository-lint.sql',1466802856,NULL),('phabricator:statustxt.sql',1466802856,NULL),('phabricator:symbolcontexts.sql',1466802856,NULL),('phabricator:testdatabase.sql',1466802855,NULL),('phabricator:threadtopic.sql',1466802855,NULL),('phabricator:userstatus.sql',1466802855,NULL),('phabricator:usertranslation.sql',1466802855,NULL),('phabricator:xhprof.sql',1466802856,NULL); CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_metamta` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; @@ -1773,6 +1815,24 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_oauth_server` /*!40100 DE USE `{$NAMESPACE}_oauth_server`; +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `oauth_server_oauthclientauthorization` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -1822,11 +1882,33 @@ CREATE TABLE `oauth_server_oauthserverclient` ( `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `isDisabled` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_phid` (`phid`), KEY `creatorPHID` (`creatorPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `oauth_server_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_owners` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; USE `{$NAMESPACE}_owners`; @@ -1906,6 +1988,10 @@ CREATE TABLE `owners_package` ( `auditingEnabled` tinyint(1) NOT NULL DEFAULT '0', `mailKey` binary(20) NOT NULL, `status` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `autoReview` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `dominion` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; @@ -2065,6 +2151,11 @@ CREATE TABLE `phame_blog` ( `mailKey` binary(20) NOT NULL, `status` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, `profileImagePHID` varbinary(64) DEFAULT NULL, + `headerImagePHID` varbinary(64) DEFAULT NULL, + `subtitle` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `parentDomain` varchar(128) COLLATE {$COLLATE_TEXT} NOT NULL, + `parentSite` varchar(128) COLLATE {$COLLATE_TEXT} NOT NULL, + `domainFullURI` varchar(128) COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `phid` (`phid`), UNIQUE KEY `domain` (`domain`) @@ -2292,6 +2383,7 @@ CREATE TABLE `project` ( `projectPath` varbinary(64) NOT NULL, `projectDepth` int(10) unsigned NOT NULL, `projectPathKey` binary(4) NOT NULL, + `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_pathkey` (`projectPathKey`), UNIQUE KEY `key_phid` (`phid`), @@ -2312,8 +2404,10 @@ CREATE TABLE `project_column` ( `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `proxyPHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_proxy` (`projectPHID`,`proxyPHID`), KEY `key_status` (`projectPHID`,`status`,`sequence`), KEY `key_sequence` (`projectPHID`,`sequence`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; @@ -2447,7 +2541,7 @@ CREATE TABLE `repository` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, - `callsign` varchar(32) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `callsign` varchar(32) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, `versionControlSystem` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, `details` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, @@ -2460,10 +2554,12 @@ CREATE TABLE `repository` ( `almanacServicePHID` varbinary(64) DEFAULT NULL, `spacePHID` varbinary(64) DEFAULT NULL, `repositorySlug` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `localPath` varchar(128) COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `callsign` (`callsign`), UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `callsign` (`callsign`), UNIQUE KEY `key_slug` (`repositorySlug`), + UNIQUE KEY `key_local` (`localPath`), KEY `key_vcs` (`versionControlSystem`), KEY `key_name` (`name`(128)), KEY `key_space` (`spacePHID`) @@ -2550,6 +2646,19 @@ CREATE TABLE `repository_filesystem` ( KEY `repositoryID` (`repositoryID`,`svnCommit`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_gitlfsref` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `objectHash` binary(64) NOT NULL, + `byteSize` bigint(20) unsigned NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `filePHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`repositoryPHID`,`objectHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `repository_lintmessage` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `branchID` int(10) unsigned NOT NULL, @@ -2579,6 +2688,14 @@ CREATE TABLE `repository_mirror` ( KEY `key_repository` (`repositoryPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_oldref` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `commitIdentifier` varchar(40) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_repository` (`repositoryPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `repository_parents` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `childCommitID` int(10) unsigned NOT NULL, @@ -2610,13 +2727,30 @@ CREATE TABLE `repository_pathchange` ( KEY `repositoryID` (`repositoryID`,`pathID`,`commitSequence`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_pullevent` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `epoch` int(10) unsigned NOT NULL, + `pullerPHID` varbinary(64) DEFAULT NULL, + `remoteAddress` varbinary(64) DEFAULT NULL, + `remoteProtocol` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `resultType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `resultCode` int(10) unsigned NOT NULL, + `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `repository_pushevent` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, `repositoryPHID` varbinary(64) NOT NULL, `epoch` int(10) unsigned NOT NULL, `pusherPHID` varbinary(64) NOT NULL, - `remoteAddress` int(10) unsigned DEFAULT NULL, + `remoteAddress` varbinary(64) DEFAULT NULL, `remoteProtocol` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `rejectCode` int(10) unsigned NOT NULL, `rejectDetails` varchar(64) COLLATE {$COLLATE_TEXT} DEFAULT NULL, @@ -2640,6 +2774,7 @@ CREATE TABLE `repository_pushlog` ( `refNew` varchar(40) COLLATE {$COLLATE_TEXT} NOT NULL, `mergeBase` varchar(40) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `changeFlags` int(10) unsigned NOT NULL, + `devicePHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), KEY `key_repository` (`repositoryPHID`), @@ -2716,6 +2851,24 @@ CREATE TABLE `repository_transaction` ( KEY `key_object` (`objectPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_uri` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `uri` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `builtinProtocol` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `builtinIdentifier` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `ioType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `displayType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `credentialPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_builtin` (`repositoryPHID`,`builtinProtocol`,`builtinIdentifier`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `repository_uriindex` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `repositoryPHID` varbinary(64) NOT NULL, @@ -2725,6 +2878,27 @@ CREATE TABLE `repository_uriindex` ( KEY `key_uri` (`repositoryURI`(128)) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_uritransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `repository_vcspassword` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `userPHID` varbinary(64) NOT NULL, @@ -2735,10 +2909,40 @@ CREATE TABLE `repository_vcspassword` ( UNIQUE KEY `key_phid` (`userPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `repository_workingcopyversion` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `devicePHID` varbinary(64) NOT NULL, + `repositoryVersion` int(10) unsigned NOT NULL, + `isWriting` tinyint(1) NOT NULL, + `writeProperties` longtext COLLATE {$COLLATE_TEXT}, + `lockOwner` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_workingcopy` (`repositoryPHID`,`devicePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_search` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; USE `{$NAMESPACE}_search`; +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `search_document` ( `phid` varbinary(64) NOT NULL, `documentType` varchar(4) COLLATE {$COLLATE_TEXT} NOT NULL, @@ -3031,26 +3235,19 @@ CREATE TABLE `user` ( `phid` varbinary(64) NOT NULL, `userName` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, `realName` varchar(128) COLLATE {$COLLATE_TEXT} NOT NULL, - `sex` varchar(4) COLLATE {$COLLATE_TEXT} DEFAULT NULL, - `translation` varchar(64) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `passwordSalt` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `passwordHash` varchar(128) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, `profileImagePHID` varbinary(64) DEFAULT NULL, - `consoleEnabled` tinyint(1) NOT NULL, - `consoleVisible` tinyint(1) NOT NULL, - `consoleTab` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, `conduitCertificate` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, `isSystemAgent` tinyint(1) NOT NULL DEFAULT '0', `isDisabled` tinyint(1) NOT NULL, `isAdmin` tinyint(1) NOT NULL, - `timezoneIdentifier` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, `isEmailVerified` int(10) unsigned NOT NULL, `isApproved` int(10) unsigned NOT NULL, `accountSecret` binary(64) NOT NULL, `isEnrolledInMultiFactor` tinyint(1) NOT NULL DEFAULT '0', - `profileImageCache` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `availabilityCache` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, `availabilityCacheTTL` int(10) unsigned DEFAULT NULL, `isMailingList` tinyint(1) NOT NULL, @@ -3076,6 +3273,19 @@ CREATE TABLE `user_authinvite` ( UNIQUE KEY `key_phid` (`phid`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `user_cache` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `cacheIndex` binary(12) NOT NULL, + `cacheKey` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheData` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_usercache` (`userPHID`,`cacheIndex`), + KEY `key_cachekey` (`cacheIndex`), + KEY `key_cachetype` (`cacheType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `user_configuredcustomfieldstorage` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `objectPHID` varbinary(64) NOT NULL, @@ -3138,8 +3348,9 @@ CREATE TABLE `user_externalaccount` ( `profileImagePHID` varbinary(64) DEFAULT NULL, `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `account_details` (`accountType`,`accountDomain`,`accountID`) + UNIQUE KEY `account_details` (`accountType`,`accountDomain`,`accountID`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_user` (`userPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `user_log` ( @@ -3172,10 +3383,37 @@ CREATE TABLE `user_nametoken` ( CREATE TABLE `user_preferences` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varbinary(64) NOT NULL, + `userPHID` varbinary(64) DEFAULT NULL, `preferences` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + `builtinKey` varchar(32) COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `userPHID` (`userPHID`) + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_builtin` (`builtinKey`), + UNIQUE KEY `key_user` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `user_preferencestransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `user_profile` ( @@ -3186,6 +3424,7 @@ CREATE TABLE `user_profile` ( `profileImagePHID` varbinary(64) DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `icon` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `userPHID` (`userPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; @@ -4512,21 +4751,47 @@ CREATE TABLE `auth_sshkey` ( `dateModified` int(10) unsigned NOT NULL, `keyIndex` binary(12) NOT NULL, `isTrusted` tinyint(1) NOT NULL, + `isActive` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_activeunique` (`keyIndex`,`isActive`), + KEY `key_object` (`objectPHID`), + KEY `key_active` (`isActive`,`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `auth_sshkeytransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `key_unique` (`keyIndex`), UNIQUE KEY `key_phid` (`phid`), KEY `key_object` (`objectPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `auth_temporarytoken` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `objectPHID` varbinary(64) NOT NULL, + `tokenResource` varbinary(64) NOT NULL, `tokenType` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, `tokenExpires` int(10) unsigned NOT NULL, `tokenCode` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `userPHID` varbinary(64) DEFAULT NULL, + `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `key_token` (`objectPHID`,`tokenType`,`tokenCode`), - KEY `key_expires` (`tokenExpires`) + UNIQUE KEY `key_token` (`tokenResource`,`tokenType`,`tokenCode`), + KEY `key_expires` (`tokenExpires`), + KEY `key_user` (`userPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_doorkeeper` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; @@ -4735,25 +5000,53 @@ CREATE TABLE `edgedata` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `nuance_importcursordata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `sourcePHID` varbinary(64) NOT NULL, + `cursorKey` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `cursorType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_source` (`sourcePHID`,`cursorKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `nuance_item` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, `ownerPHID` varbinary(64) DEFAULT NULL, - `requestorPHID` varbinary(64) NOT NULL, + `requestorPHID` varbinary(64) DEFAULT NULL, `sourcePHID` varbinary(64) NOT NULL, - `sourceLabel` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, - `status` int(10) unsigned NOT NULL, + `status` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `mailKey` binary(20) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `queuePHID` varbinary(64) NOT NULL, + `queuePHID` varbinary(64) DEFAULT NULL, + `itemType` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `itemKey` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `itemContainerKey` varchar(64) COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_item` (`sourcePHID`,`itemKey`), KEY `key_source` (`sourcePHID`,`status`), KEY `key_owner` (`ownerPHID`,`status`), KEY `key_requestor` (`requestorPHID`,`status`), - KEY `key_queue` (`queuePHID`,`status`) + KEY `key_queue` (`queuePHID`,`status`), + KEY `key_container` (`sourcePHID`,`itemContainerKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `nuance_itemcommand` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `itemPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `command` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_item` (`itemPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `nuance_itemtransaction` ( @@ -4847,73 +5140,10 @@ CREATE TABLE `nuance_queuetransaction_comment` ( UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE TABLE `nuance_requestor` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varbinary(64) NOT NULL, - `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `key_phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; - -CREATE TABLE `nuance_requestorsource` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `requestorPHID` varbinary(64) NOT NULL, - `sourcePHID` varbinary(64) NOT NULL, - `sourceKey` varchar(128) COLLATE {$COLLATE_TEXT} NOT NULL, - `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `key_source_key` (`sourcePHID`,`sourceKey`), - KEY `key_requestor` (`requestorPHID`,`id`), - KEY `key_source` (`sourcePHID`,`id`) -) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; - -CREATE TABLE `nuance_requestortransaction` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varbinary(64) NOT NULL, - `authorPHID` varbinary(64) NOT NULL, - `objectPHID` varbinary(64) NOT NULL, - `viewPolicy` varbinary(64) NOT NULL, - `editPolicy` varbinary(64) NOT NULL, - `commentPHID` varbinary(64) DEFAULT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, - `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `key_phid` (`phid`), - KEY `key_object` (`objectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; - -CREATE TABLE `nuance_requestortransaction_comment` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varbinary(64) NOT NULL, - `transactionPHID` varbinary(64) DEFAULT NULL, - `authorPHID` varbinary(64) NOT NULL, - `viewPolicy` varbinary(64) NOT NULL, - `editPolicy` varbinary(64) NOT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `content` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, - `isDeleted` tinyint(1) NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `key_phid` (`phid`), - UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) -) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; - CREATE TABLE `nuance_source` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, - `name` varchar(255) COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, `type` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, `data` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `mailKey` binary(20) NOT NULL, @@ -4922,11 +5152,21 @@ CREATE TABLE `nuance_source` ( `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, `defaultQueuePHID` varbinary(64) NOT NULL, + `isDisabled` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), KEY `key_type` (`type`,`dateModified`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `nuance_sourcename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `nuance_sourcetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -5347,6 +5587,24 @@ CREATE TABLE `fund_initiativetransaction` ( KEY `key_object` (`objectPHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `fund_initiativetransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_almanac` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; USE `{$NAMESPACE}_almanac`; @@ -5360,6 +5618,7 @@ CREATE TABLE `almanac_binding` ( `mailKey` binary(20) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `isDisabled` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), UNIQUE KEY `key_service` (`servicePHID`,`interfacePHID`), @@ -5398,13 +5657,22 @@ CREATE TABLE `almanac_device` ( `mailKey` binary(20) NOT NULL, `viewPolicy` varbinary(64) NOT NULL, `editPolicy` varbinary(64) NOT NULL, - `isLocked` tinyint(1) NOT NULL, + `isBoundToClusterService` tinyint(1) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), UNIQUE KEY `key_name` (`nameIndex`), KEY `key_nametext` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `almanac_devicename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `almanac_devicetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -5441,6 +5709,52 @@ CREATE TABLE `almanac_interface` ( KEY `key_device` (`devicePHID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `almanac_namespace` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) COLLATE {$COLLATE_TEXT} NOT NULL, + `nameIndex` binary(12) NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_nameindex` (`nameIndex`), + KEY `key_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `almanac_namespacename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `almanac_namespacetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `almanac_network` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -5454,6 +5768,15 @@ CREATE TABLE `almanac_network` ( UNIQUE KEY `key_phid` (`phid`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `almanac_networkname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `almanac_networktransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, @@ -5495,13 +5818,21 @@ CREATE TABLE `almanac_service` ( `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `serviceClass` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, - `isLocked` tinyint(1) NOT NULL, + `serviceType` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), UNIQUE KEY `key_name` (`nameIndex`), KEY `key_nametext` (`name`), - KEY `key_class` (`serviceClass`) + KEY `key_servicetype` (`serviceType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE TABLE `almanac_servicename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; CREATE TABLE `almanac_servicetransaction` ( @@ -5740,14 +6071,26 @@ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_badges` /*!40100 DEFAULT USE `{$NAMESPACE}_badges`; +CREATE TABLE `badges_award` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `badgePHID` varbinary(64) NOT NULL, + `recipientPHID` varbinary(64) NOT NULL, + `awarderPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_badge` (`badgePHID`,`recipientPHID`), + KEY `key_recipient` (`recipientPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `badges_badge` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL, - `name` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, `flavor` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, `description` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `icon` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, - `quality` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `quality` int(10) unsigned NOT NULL, `status` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, @@ -5759,6 +6102,15 @@ CREATE TABLE `badges_badge` ( KEY `key_creator` (`creatorPHID`,`dateModified`) ) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE TABLE `badges_badgename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + CREATE TABLE `badges_transaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varbinary(64) NOT NULL,