Changeset View
Changeset View
Standalone View
Standalone View
src/workflow/ArcanistBrowseWorkflow.php
| <?php | <?php | ||||
| /** | /** | ||||
| * Browse files in the Diffusion web interface. | * Browse files or objects in the Phabricator web interface. | ||||
| */ | */ | ||||
| final class ArcanistBrowseWorkflow extends ArcanistWorkflow { | final class ArcanistBrowseWorkflow extends ArcanistWorkflow { | ||||
| public function getWorkflowName() { | public function getWorkflowName() { | ||||
| return 'browse'; | return 'browse'; | ||||
| } | } | ||||
| public function getCommandSynopses() { | public function getCommandSynopses() { | ||||
| return phutil_console_format(<<<EOTEXT | return phutil_console_format(<<<EOTEXT | ||||
| **browse** [__options__] __path__ ... | **browse** [__options__] __path__ ... | ||||
| **browse** [__options__] __object__ ... | |||||
| EOTEXT | EOTEXT | ||||
| ); | ); | ||||
| } | } | ||||
| public function getCommandHelp() { | public function getCommandHelp() { | ||||
| return phutil_console_format(<<<EOTEXT | return phutil_console_format(<<<EOTEXT | ||||
| Supports: git, hg, svn | Supports: git, hg, svn | ||||
| Browse files in the Diffusion web interface. | Open a file or object (like a task or revision) in your web browser. | ||||
| $ arc browse README # Open a file in Diffusion. | |||||
| $ arc browse T123 # View a task. | |||||
| Set the 'browser' value using 'arc set-config' to select a browser. If | Set the 'browser' value using 'arc set-config' to select a browser. If | ||||
| no browser is set, the command will try to guess which browser to use. | no browser is set, the command will try to guess which browser to use. | ||||
| EOTEXT | EOTEXT | ||||
| ); | ); | ||||
| } | } | ||||
| public function getArguments() { | public function getArguments() { | ||||
| return array( | return array( | ||||
| 'branch' => array( | 'branch' => array( | ||||
| 'param' => 'branch_name', | 'param' => 'branch_name', | ||||
| 'help' => pht( | 'help' => pht( | ||||
| 'Default branch name to view on server. Defaults to "master".'), | 'Default branch name to view on server. Defaults to "master".'), | ||||
| ), | ), | ||||
| 'force' => array( | |||||
| 'help' => pht( | |||||
| 'Open arguments as paths, even if they do not exist in the '. | |||||
| 'working copy.'), | |||||
| ), | |||||
| '*' => 'paths', | '*' => 'paths', | ||||
| ); | ); | ||||
| } | } | ||||
| public function requiresWorkingCopy() { | public function desiresWorkingCopy() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function requiresConduit() { | public function requiresConduit() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function requiresAuthentication() { | public function requiresAuthentication() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function requiresRepositoryAPI() { | public function desiresRepositoryAPI() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function run() { | public function run() { | ||||
| $repository_api = $this->getRepositoryAPI(); | $console = PhutilConsole::getConsole(); | ||||
| $project_root = $this->getWorkingCopy()->getProjectRoot(); | |||||
| $is_force = $this->getArgument('force'); | |||||
| $in_paths = $this->getArgument('paths'); | $things = $this->getArgument('paths'); | ||||
| if (!$in_paths) { | if (!$things) { | ||||
| throw new ArcanistUsageException( | throw new ArcanistUsageException( | ||||
| pht( | pht( | ||||
| 'Specify one or more paths to browse. Use the command '. | 'Specify one or more paths or objects to browse. Use the command '. | ||||
| '"arc browse ." if you want to browse this directory.')); | '"arc browse ." if you want to browse this directory.')); | ||||
| } | } | ||||
| $things = array_fuse($things); | |||||
| $objects = $this->getConduit()->callMethodSynchronous( | |||||
| 'phid.lookup', | |||||
| array( | |||||
| 'names' => array_keys($things), | |||||
| )); | |||||
| $uris = array(); | |||||
| foreach ($objects as $name => $object) { | |||||
| $uris[] = $object['uri']; | |||||
| $console->writeOut( | |||||
| pht( | |||||
| 'Opening **%s** as an object.', | |||||
| $name)."\n"); | |||||
| unset($things[$name]); | |||||
| } | |||||
| if ($this->hasRepositoryAPI()) { | |||||
| $repository_api = $this->getRepositoryAPI(); | |||||
| $project_root = $this->getWorkingCopy()->getProjectRoot(); | |||||
| $paths = array(); | foreach ($things as $key => $path) { | ||||
| foreach ($in_paths as $key => $path) { | |||||
| $path = preg_replace('/:([0-9]+)$/', '$\1', $path); | $path = preg_replace('/:([0-9]+)$/', '$\1', $path); | ||||
| $full_path = Filesystem::resolvePath($path); | $full_path = Filesystem::resolvePath($path); | ||||
| if (!$is_force && !Filesystem::pathExists($full_path)) { | |||||
| continue; | |||||
| } | |||||
| $console->writeOut( | |||||
| pht( | |||||
| 'Opening **%s** as a repository path.', | |||||
| $key)."\n"); | |||||
| unset($things[$key]); | |||||
| if ($full_path == $project_root) { | if ($full_path == $project_root) { | ||||
| $paths[$key] = ''; | $path = ''; | ||||
| } else { | } else { | ||||
| $paths[$key] = Filesystem::readablePath($full_path, $project_root); | $path = Filesystem::readablePath($full_path, $project_root); | ||||
| } | |||||
| } | } | ||||
| $base_uri = $this->getBaseURI(); | $base_uri = $this->getBaseURI(); | ||||
| $browser = $this->getBrowserCommand(); | $uris[] = $base_uri.$path; | ||||
| } | |||||
| } else { | |||||
| if ($things) { | |||||
| $console->writeOut( | |||||
| pht( | |||||
| "The current working directory is not a repository working ". | |||||
| "copy, so remaining arguments can not be resolved as paths. ". | |||||
| "To browse paths in Diffusion, run 'arc browse' from inside ". | |||||
| "a working copy.")."\n"); | |||||
| } | |||||
| } | |||||
| foreach ($things as $thing) { | |||||
| $console->writeOut( | |||||
| pht( | |||||
| 'Unable to find an object named **%s**, and no such path exists '. | |||||
| 'in the working copy. Use __--force__ to treat this as a path '. | |||||
| 'anyway.', | |||||
| $thing)."\n"); | |||||
| } | |||||
| foreach ($paths as $path) { | if ($uris) { | ||||
| $ret_code = phutil_passthru('%s %s', $browser, $base_uri.$path); | $browser = $this->getBrowserCommand(); | ||||
| if ($ret_code) { | foreach ($uris as $uri) { | ||||
| $err = phutil_passthru('%s %s', $browser, $uri); | |||||
| if ($err) { | |||||
| throw new ArcanistUsageException( | throw new ArcanistUsageException( | ||||
| "It seems we failed to open the browser; perhaps you should try to ". | pht( | ||||
| "set the 'browser' config option. The command we tried to use was: ". | "Failed to execute browser ('%s'). Check your 'browser' config ". | ||||
| $browser); | "option.")); | ||||
| } | |||||
| } | } | ||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| private function getBaseURI() { | private function getBaseURI() { | ||||
| $repo_uri = $this->getRepositoryURI(); | $repo_uri = $this->getRepositoryURI(); | ||||
| ▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines | |||||