array( 'param' => 'branch_name', 'help' => "Select branch name to view (On server). Defaults to 'master'." ), '*' => 'paths', ); } public function requiresWorkingCopy() { return true; } public function requiresConduit() { return true; } public function requiresAuthentication() { return true; } public function requiresRepositoryAPI() { return true; } public function run() { $repository_api = $this->getRepositoryAPI(); $project_root = $this->getWorkingCopy()->getProjectRoot(); $in_paths = $this->getArgument('paths'); $paths = array(); foreach ($in_paths as $key => $path) { $full_path = Filesystem::resolvePath($path); $paths[$key] = Filesystem::readablePath( $full_path, $project_root); } if (!$paths) { throw new ArcanistUsageException("Specify a path to browse"); } $base_uri = $this->getBaseURI(); $browser = $this->getBrowserCommand(); foreach ($paths as $path) { $ret_code = phutil_passthru("%s %s", $browser, $base_uri . $path); if ($ret_code) { throw new ArcanistUsageException( "It seems we failed to open the browser; Perhaps you should try to ". "set the 'browser' config option. The command we tried to use was: ". $browser); } } return 0; } private function getBaseURI() { $conduit = $this->getConduit(); $project_id = $this->getWorkingCopy()->getProjectID(); $project_info = $this->getConduit()->callMethodSynchronous( 'arcanist.projectinfo', array( 'name' => $project_id, )); $repo_phid = $project_info['repositoryPHID']; $repo_info = $this->getConduit()->callMethodSynchronous( 'phid.query', array( 'phids' => array($repo_phid), )); $branch = $this->getArgument('branch', 'master'); return $repo_info[$repo_phid]['uri'].'browse/'.$branch.'/'; } private function getBrowserCommand() { $config = $this->getWorkingCopy()->getConfigFromAnySource('browser'); if ($config) { return $config; } if (phutil_is_windows()) { return "start"; } $candidates = array("sensible-browser", "xdg-open", "open"); // on many Linuxes, "open" exists and is not the right program. foreach ($candidates as $cmd) { list($ret_code) = exec_manual("which %s", $cmd); if ($ret_code == 0) { return $cmd; } } throw new ArcanistUsageException( "Could not find a browser to run; Try setting the 'browser' option " . "using arc set-config."); } }