diff --git a/src/workflow/ArcanistTasksWorkflow.php b/src/workflow/ArcanistTasksWorkflow.php --- a/src/workflow/ArcanistTasksWorkflow.php +++ b/src/workflow/ArcanistTasksWorkflow.php @@ -53,6 +53,11 @@ 'unassigned' => '--owner suppresses unassigned', ), ), + 'project' => array( + 'param' => 'project', + 'help' => 'Only show tasks associated with the given project,'. + 'also accepts project hastags.', + ), 'order' => array( 'param' => 'task_order', 'help' => @@ -75,6 +80,7 @@ $status = $this->getArgument('status'); $owner = $this->getArgument('owner'); + $project = $this->getArgument('project'); $order = $this->getArgument('order'); $limit = $this->getArgument('limit'); $unassigned = $this->getArgument('unassigned'); @@ -87,9 +93,16 @@ $owner_phid = $this->getUserPHID(); } + if ($project) { + $project_phid = $this->findProjectPHID($project); + } else { + $project_phid = null; + } + $this->tasks = $this->loadManiphestTasks( ($status == 'all' ? 'any' : $status), $owner_phid, + $project_phid, $order, $limit); @@ -189,7 +202,36 @@ return idx($user, 'phid'); } - private function loadManiphestTasks($status, $owner_phid, $order, $limit) { + private function findProjectPHID($project_name) { + $conduit = $this->getConduit(); + + // Converts "My Project" to slug-equivalent "my_project". + $project_slug = str_replace(' ', '_', $project_name); + $project_slug = phutil_utf8_strtolower($project_slug); + + $projects = $conduit->callMethodSynchronous( + 'project.query', + array( + 'slugs' => array($project_slug), + )); + + $project = head(head($projects)); + + if (!$project) { + $error = "Couldn't find project with name or hashtag \"$project_name\"."; + throw new ArcanistUsageException($error); + } + + return idx($project, 'phid'); + } + + private function loadManiphestTasks( + $status, + $owner_phid, + $project_phid, + $order, + $limit) { + $conduit = $this->getConduit(); $find_params = array(); @@ -197,6 +239,10 @@ $find_params['ownerPHIDs'] = array($owner_phid); } + if ($project_phid != null) { + $find_params['projectPHIDs'] = array($project_phid); + } + if ($limit !== false) { $find_params['limit'] = $limit; }