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 |