From 4f54d483d5bfbbf915ae8586cff18f6093422bec Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 11 Oct 2018 08:20:13 -0700 Subject: [PATCH] Support export of revisions to Excel/CSV/JSON/etc Summary: Ref T13210. See PHI806. This enables basic export of revisions into flat data formats. This isn't too fancy, but just covers the basics since the driving use case isn't especially concerned about getting all the fields and details. Test Plan: Exported some revisions into JSON, got sensible output. Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13210 Differential Revision: https://secure.phabricator.com/D19743 --- .../PhabricatorDifferentialApplication.php | 6 +- .../DifferentialRevisionSearchEngine.php | 73 +++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/applications/differential/application/PhabricatorDifferentialApplication.php b/src/applications/differential/application/PhabricatorDifferentialApplication.php index 52b222301a..c27d0da820 100644 --- a/src/applications/differential/application/PhabricatorDifferentialApplication.php +++ b/src/applications/differential/application/PhabricatorDifferentialApplication.php @@ -1,6 +1,7 @@ new)/' => 'DifferentialRevisionViewController', ), '/differential/' => array( - '(?:query/(?P[^/]+)/)?' - => 'DifferentialRevisionListController', + $this->getQueryRoutePattern() => 'DifferentialRevisionListController', 'diff/' => array( '(?P[1-9]\d*)/' => array( '' => 'DifferentialDiffViewController', diff --git a/src/applications/differential/query/DifferentialRevisionSearchEngine.php b/src/applications/differential/query/DifferentialRevisionSearchEngine.php index 557ca23078..be753c5e17 100644 --- a/src/applications/differential/query/DifferentialRevisionSearchEngine.php +++ b/src/applications/differential/query/DifferentialRevisionSearchEngine.php @@ -289,4 +289,77 @@ final class DifferentialRevisionSearchEngine return $result; } + protected function newExportFields() { + $fields = array( + id(new PhabricatorStringExportField()) + ->setKey('monogram') + ->setLabel(pht('Monogram')), + id(new PhabricatorPHIDExportField()) + ->setKey('authorPHID') + ->setLabel(pht('Author PHID')), + id(new PhabricatorStringExportField()) + ->setKey('author') + ->setLabel(pht('Author')), + id(new PhabricatorStringExportField()) + ->setKey('status') + ->setLabel(pht('Status')), + id(new PhabricatorStringExportField()) + ->setKey('statusName') + ->setLabel(pht('Status Name')), + id(new PhabricatorURIExportField()) + ->setKey('uri') + ->setLabel(pht('URI')), + id(new PhabricatorStringExportField()) + ->setKey('title') + ->setLabel(pht('Title')), + id(new PhabricatorStringExportField()) + ->setKey('summary') + ->setLabel(pht('Summary')), + id(new PhabricatorStringExportField()) + ->setKey('testPlan') + ->setLabel(pht('Test Plan')), + ); + + return $fields; + } + + protected function newExportData(array $revisions) { + $viewer = $this->requireViewer(); + + $phids = array(); + foreach ($revisions as $revision) { + $phids[] = $revision->getAuthorPHID(); + } + $handles = $viewer->loadHandles($phids); + + $export = array(); + foreach ($revisions as $revision) { + + $author_phid = $revision->getAuthorPHID(); + if ($author_phid) { + $author_name = $handles[$author_phid]->getName(); + } else { + $author_name = null; + } + + $status = $revision->getStatusObject(); + $status_name = $status->getDisplayName(); + $status_value = $status->getKey(); + + $export[] = array( + 'monogram' => $revision->getMonogram(), + 'authorPHID' => $author_phid, + 'author' => $author_name, + 'status' => $status_value, + 'statusName' => $status_name, + 'uri' => PhabricatorEnv::getProductionURI($revision->getURI()), + 'title' => (string)$revision->getTitle(), + 'summary' => (string)$revision->getSummary(), + 'testPlan' => (string)$revision->getTestPlan(), + ); + } + + return $export; + } + }