| 
									
										
										
										
											2011-03-13 14:27:03 -07:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							|  |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Copyright 2011 Facebook, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $root = dirname(dirname(dirname(__FILE__))); | 
					
						
							|  |  |  | require_once $root.'/scripts/__init_script__.php'; | 
					
						
							|  |  |  | require_once $root.'/scripts/__init_env__.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  | phutil_require_module('phabricator', 'infrastructure/daemon/control'); | 
					
						
							|  |  |  | $control = new PhabricatorDaemonControl(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  | $phd_dir = PhabricatorEnv::getEnvConfig('phd.pid-directory'); | 
					
						
							|  |  |  | $pid_dir = $phd_dir.'/pid'; | 
					
						
							| 
									
										
										
										
											2011-03-13 14:27:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | switch (isset($argv[1]) ? $argv[1] : 'help') { | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |   case 'list': | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  |     $err = $control->executeListCommand(); | 
					
						
							|  |  |  |     exit($err); | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   case 'status': | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  |     $err = $control->executeStatusCommand(); | 
					
						
							|  |  |  |     exit($err); | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  |   case 'stop': | 
					
						
							|  |  |  |     $err = $control->executeStopCommand(); | 
					
						
							|  |  |  |     exit($err); | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |   case 'repository-launch-readonly': | 
					
						
							|  |  |  |     $need_launch = phd_load_tracked_repositories_of_type('git'); | 
					
						
							|  |  |  |     if (!$need_launch) { | 
					
						
							|  |  |  |       echo "There are no repositories with tracking enabled.\n"; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       foreach ($need_launch as $repository) { | 
					
						
							|  |  |  |         $name = $repository->getName(); | 
					
						
							|  |  |  |         $callsign = $repository->getCallsign(); | 
					
						
							|  |  |  |         $desc = "'{$name}' ({$callsign})"; | 
					
						
							|  |  |  |         $phid = $repository->getPHID(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         echo "Launching 'git pull' daemon on the {$desc} repository...\n"; | 
					
						
							|  |  |  |         $control->launchDaemon( | 
					
						
							|  |  |  |           'PhabricatorRepositoryGitPullDaemon', | 
					
						
							|  |  |  |           array( | 
					
						
							|  |  |  |             $phid, | 
					
						
							|  |  |  |           )); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   case 'repository-launch-master': | 
					
						
							|  |  |  |     $need_launch = phd_load_tracked_repositories(); | 
					
						
							|  |  |  |     if (!$need_launch) { | 
					
						
							|  |  |  |       echo "There are no repositories with tracking enabled.\n"; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       foreach ($need_launch as $repository) { | 
					
						
							|  |  |  |         $name = $repository->getName(); | 
					
						
							|  |  |  |         $callsign = $repository->getCallsign(); | 
					
						
							|  |  |  |         $desc = "'{$name}' ({$callsign})"; | 
					
						
							|  |  |  |         $phid = $repository->getPHID(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         switch ($repository->getVersionControlSystem()) { | 
					
						
							|  |  |  |           case 'git': | 
					
						
							|  |  |  |             echo "Launching 'git pull' daemon on the {$desc} repository...\n"; | 
					
						
							|  |  |  |             $control->launchDaemon( | 
					
						
							|  |  |  |               'PhabricatorRepositoryGitPullDaemon', | 
					
						
							|  |  |  |               array( | 
					
						
							|  |  |  |                 $phid, | 
					
						
							|  |  |  |               )); | 
					
						
							|  |  |  |             echo "Launching discovery daemon on the {$desc} repository...\n"; | 
					
						
							|  |  |  |             $control->launchDaemon( | 
					
						
							|  |  |  |               'PhabricatorRepositoryGitCommitDiscoveryDaemon', | 
					
						
							|  |  |  |               array( | 
					
						
							|  |  |  |                 $phid, | 
					
						
							|  |  |  |               )); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |           case 'svn': | 
					
						
							|  |  |  |             echo "Launching discovery daemon on the {$desc} repository...\n"; | 
					
						
							|  |  |  |             $control->launchDaemon( | 
					
						
							|  |  |  |               'PhabricatorRepositorySvnCommitDiscoveryDaemon', | 
					
						
							|  |  |  |               array( | 
					
						
							|  |  |  |                 $phid, | 
					
						
							|  |  |  |               )); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       echo "Launching CommitTask daemon...\n"; | 
					
						
							|  |  |  |       $control->launchDaemon( | 
					
						
							|  |  |  |         'PhabricatorRepositoryCommitTaskDaemon', | 
					
						
							|  |  |  |         array()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       echo "Done.\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     break; | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |   case 'launch': | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |     $daemon = idx($argv, 2); | 
					
						
							|  |  |  |     if (!$daemon) { | 
					
						
							|  |  |  |       throw new Exception("Daemon name required!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |     $pass_argv = array_slice($argv, 3); | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |     $n = 1; | 
					
						
							|  |  |  |     if (is_numeric($daemon)) { | 
					
						
							|  |  |  |       $n = $daemon; | 
					
						
							|  |  |  |       if ($n < 1) { | 
					
						
							|  |  |  |         throw new Exception("Count must be at least 1!"); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       $daemon = idx($argv, 3); | 
					
						
							|  |  |  |       if (!$daemon) { | 
					
						
							|  |  |  |         throw new Exception("Daemon name required!"); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |       $pass_argv = array_slice($argv, 4); | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $loader = new PhutilSymbolLoader(); | 
					
						
							|  |  |  |     $symbols = $loader | 
					
						
							|  |  |  |       ->setAncestorClass('PhutilDaemon') | 
					
						
							|  |  |  |       ->selectSymbolsWithoutLoading(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $symbols = ipull($symbols, 'name'); | 
					
						
							|  |  |  |     $match = array(); | 
					
						
							|  |  |  |     foreach ($symbols as $symbol) { | 
					
						
							|  |  |  |       if (stripos($symbol, $daemon) !== false) { | 
					
						
							|  |  |  |         if (strtolower($symbol) == strtolower($daemon)) { | 
					
						
							|  |  |  |           $match = array($symbol); | 
					
						
							|  |  |  |           break; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           $match[] = $symbol; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (count($match) == 0) { | 
					
						
							|  |  |  |       throw new Exception( | 
					
						
							|  |  |  |         "No daemons match! Use 'phd list' for a list of daemons."); | 
					
						
							|  |  |  |     } else if (count($match) > 1) { | 
					
						
							|  |  |  |       throw new Exception( | 
					
						
							|  |  |  |         "Which of these daemons did you mean?\n". | 
					
						
							|  |  |  |         "    ".implode("\n    ", $match)); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       $daemon = reset($match); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |     echo "Launching {$n} x {$daemon}"; | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |     for ($ii = 0; $ii < $n; $ii++) { | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  |       $control->launchDaemon($daemon, $pass_argv); | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |       echo "."; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-14 12:33:20 -07:00
										 |  |  |     echo "\n"; | 
					
						
							|  |  |  |     echo "Done.\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-13 14:27:03 -07:00
										 |  |  |   case 'parse-commit': | 
					
						
							|  |  |  |     $commit = isset($argv[2]) ? $argv[2] : null; | 
					
						
							|  |  |  |     if (!$commit) { | 
					
						
							|  |  |  |       throw new Exception("Provide a commit to parse!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $matches = null; | 
					
						
							|  |  |  |     if (!preg_match('/r([A-Z]+)([a-z0-9]+)/', $commit, $matches)) { | 
					
						
							|  |  |  |       throw new Exception("Can't parse commit identifier!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $repo = id(new PhabricatorRepository())->loadOneWhere( | 
					
						
							|  |  |  |       'callsign = %s', | 
					
						
							|  |  |  |       $matches[1]); | 
					
						
							|  |  |  |     if (!$repo) { | 
					
						
							|  |  |  |       throw new Exception("Unknown repository!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $commit = id(new PhabricatorRepositoryCommit())->loadOneWhere( | 
					
						
							|  |  |  |       'repositoryID = %d AND commitIdentifier = %s', | 
					
						
							|  |  |  |       $repo->getID(), | 
					
						
							|  |  |  |       $matches[2]); | 
					
						
							|  |  |  |     if (!$commit) { | 
					
						
							|  |  |  |       throw new Exception('Unknown commit.'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch ($repo->getVersionControlSystem()) { | 
					
						
							|  |  |  |       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: | 
					
						
							|  |  |  |         $worker = new PhabricatorRepositoryGitCommitChangeParserWorker( | 
					
						
							|  |  |  |           $commit->getID()); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: | 
					
						
							|  |  |  |         $worker = new PhabricatorRepositorySvnCommitChangeParserWorker( | 
					
						
							|  |  |  |           $commit->getID()); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         throw new Exception("Unknown repository type!"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ExecFuture::pushEchoMode(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $worker->doWork(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo "Done.\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case '--help': | 
					
						
							|  |  |  |   case 'help': | 
					
						
							|  |  |  |   default: | 
					
						
							| 
									
										
										
										
											2011-03-14 15:43:56 -07:00
										 |  |  |     $err = $control->executeHelpCommand(); | 
					
						
							|  |  |  |     exit($err); | 
					
						
							| 
									
										
										
										
											2011-03-13 14:27:03 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-15 13:38:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | function phd_load_tracked_repositories_of_type($type) { | 
					
						
							|  |  |  |   $repositories = phd_load_tracked_repositories(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   foreach ($repositories as $key => $repository) { | 
					
						
							|  |  |  |     if ($repository->getVersionControlSystem() != $type) { | 
					
						
							|  |  |  |       unset($repositories[$key]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return $repositories; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function phd_load_tracked_repositories() { | 
					
						
							|  |  |  |   phutil_require_module( | 
					
						
							|  |  |  |     'phabricator', | 
					
						
							|  |  |  |     'applications/repository/storage/repository'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   $repositories = id(new PhabricatorRepository())->loadAll(); | 
					
						
							|  |  |  |   foreach ($repositories as $key => $repository) { | 
					
						
							|  |  |  |     if (!$repository->getDetail('tracking-enabled')) { | 
					
						
							|  |  |  |       unset($repositories[$key]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return $repositories; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |