public function execute(PhutilArgumentParser $args)
 {
     $names = $args->getArg('repos');
     $repos = PhabricatorRepository::loadAllByPHIDOrCallsign($names);
     if (!$repos) {
         throw new PhutilArgumentUsageException("Specify one or more repositories to pull, by callsign or PHID.");
     }
     $console = PhutilConsole::getConsole();
     foreach ($repos as $repo) {
         $console->writeOut("Pulling '%s'...\n", $repo->getCallsign());
         $daemon = new PhabricatorRepositoryPullLocalDaemon(array());
         $daemon->setVerbose($args->getArg('verbose'));
         $daemon->pullRepository($repo);
     }
     $console->writeOut("Done.\n");
     return 0;
 }
 public function testExecuteGitVerifySameOrigin()
 {
     $cases = array(array('ssh://user@domain.com/path.git', 'ssh://user@domain.com/path.git', true, 'Identical paths should pass.'), array('ssh://user@domain.com/path.git', 'https://user@domain.com/path.git', true, 'Protocol changes should pass.'), array('ssh://user@domain.com/path.git', 'git@domain.com:path.git', true, 'Git implicit SSH should pass.'), array('ssh://user@gitserv001.com/path.git', 'ssh://user@gitserv002.com/path.git', true, 'Domain changes should pass.'), array('ssh://alincoln@domain.com/path.git', 'ssh://htaft@domain.com/path.git', true, 'User/auth changes should pass.'), array('ssh://user@domain.com/apples.git', 'ssh://user@domain.com/bananas.git', false, 'Path changes should fail.'), array('ssh://user@domain.com/apples.git', 'git@domain.com:bananas.git', false, 'Git implicit SSH path changes should fail.'), array('user@domain.com:path/repo.git', 'user@domain.com:path/repo', true, 'Optional .git extension should not prevent matches.'), array('user@domain.com:path/repo/', 'user@domain.com:path/repo', true, 'Optional trailing slash should not prevent matches.'), array('file:///path/to/local/repo.git', 'file:///path/to/local/repo.git', true, 'file:// protocol should be supported.'), array('/path/to/local/repo.git', 'file:///path/to/local/repo.git', true, 'Implicit file:// protocol should be recognized.'));
     foreach ($cases as $case) {
         list($remote, $config, $expect, $message) = $case;
         $ex = null;
         try {
             PhabricatorRepositoryPullLocalDaemon::executeGitverifySameOrigin($remote, $config, '(a test case)');
         } catch (Exception $exception) {
             $ex = $exception;
         }
         $this->assertEqual($expect, !$ex, "Verification that '{$remote}' and '{$config}' are the same origin " . "had a different outcome than expected: {$message}");
     }
 }