PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/phpBB/develop/namespacify.php

http://github.com/phpbb/phpbb
PHP | 194 lines | 154 code | 22 blank | 18 comment | 26 complexity | 183688ba74a0ad10c62e53f95d089087 MD5 | raw file
Possible License(s): GPL-3.0, AGPL-1.0
  1. <?php
  2. /**
  3. *
  4. * This file is part of the phpBB Forum Software package.
  5. *
  6. * @copyright (c) phpBB Limited <https://www.phpbb.com>
  7. * @license GNU General Public License, version 2 (GPL-2.0)
  8. *
  9. * For full copyright and license information, please see
  10. * the docs/CREDITS.txt file.
  11. *
  12. */
  13. //
  14. // Security message:
  15. //
  16. // This script is potentially dangerous.
  17. // Remove or comment the next line (die(".... ) to enable this script.
  18. // Do NOT FORGET to either remove this script or disable it after you have used it.
  19. //
  20. die("Please read the first lines of this script for instructions on how to enable it");
  21. $namespace_dir = realpath(__DIR__ . '/../phpbb/');
  22. $code_dir = realpath(__DIR__ . '/../');
  23. $test_dir = realpath(__DIR__ . '/../../tests/');
  24. $config_dir = realpath(__DIR__ . '/../config/');
  25. function map_class_name($old_class_name, $code_dir)
  26. {
  27. $parts = explode('_', $old_class_name);
  28. $cur_dir = array();
  29. $cur_name = array();
  30. $in_name = false;
  31. foreach ($parts as $i => $part)
  32. {
  33. if (empty($part))
  34. {
  35. return null;
  36. }
  37. if (!$in_name)
  38. {
  39. $new_dir = array_merge($cur_dir, array($part));
  40. $path = $code_dir . '/' . implode('/', $new_dir);
  41. if (file_exists($path) && is_dir($path))
  42. {
  43. $cur_dir = $new_dir;
  44. }
  45. else
  46. {
  47. $in_name = true;
  48. $cur_name[] = $part;
  49. }
  50. }
  51. else
  52. {
  53. $cur_name[] = $part;
  54. }
  55. }
  56. if (empty($cur_name) && !empty($cur_dir))
  57. {
  58. $cur_name[] = $cur_dir[count($cur_dir) - 1];
  59. }
  60. if (file_exists($code_dir . '/' . implode('/', $cur_dir) . '/' . implode('_', $cur_name) . '.php'))
  61. {
  62. return implode('\\', $cur_dir) . '\\' . implode('_', $cur_name);
  63. }
  64. return null;
  65. }
  66. $iterator = new \AppendIterator();
  67. $iterator->append(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($code_dir)));
  68. $iterator->append(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($test_dir)));
  69. $iterator->append(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($config_dir)));
  70. foreach ($iterator as $file)
  71. {
  72. if (substr($file->getPath(), 0, 6) === 'vendor')
  73. {
  74. continue;
  75. }
  76. if ($file->getExtension() == 'php')
  77. {
  78. $code = file_get_contents($file->getPathname());
  79. $namespaced_file = false;
  80. if (preg_match('#^' . preg_quote($namespace_dir, '#') . '#', $file->getPath()))
  81. {
  82. if (preg_match('#^(?:interface|(?:abstract )?class) (phpbb_[a-z0-9_]+)#m', $code, $matches))
  83. {
  84. $old_class_name = $matches[1];
  85. $dirs = explode(DIRECTORY_SEPARATOR, preg_replace('#^' . preg_quote(dirname($namespace_dir) . DIRECTORY_SEPARATOR, '#') . '#', '', $file->getPath()));
  86. $namespace = implode('\\', $dirs);
  87. if ($dirs[count($dirs) - 1] == substr($file->getFilename(), 0, -4))
  88. {
  89. $class_name = preg_replace('#^' . preg_quote(implode('_', $dirs), '#') . '#', $dirs[count($dirs) - 1], $old_class_name);
  90. }
  91. else
  92. {
  93. $class_name = preg_replace('#^' . preg_quote(implode('_', $dirs), '#') . '_#', '', $old_class_name);
  94. }
  95. $code = preg_replace("#^\*/$#m", "*/\n\nnamespace $namespace;", $code, 1, $count);
  96. if ($count != 1)
  97. {
  98. die("Incorrect replacement count for namespace of $old_class_name");
  99. }
  100. $code = preg_replace("#^(interface|(?:abstract )?class) $old_class_name#m", "\\1 $class_name", $code, -1, $count);
  101. if ($count != 1)
  102. {
  103. die("Incorrect replacement count for $old_class_name");
  104. }
  105. $namespaced_file = true;
  106. }
  107. }
  108. if (preg_match_all('#[^a-z0-9_$](phpbb_[a-z0-9_]+)#', $code, $matches))
  109. {
  110. foreach ($matches[1] as $old_class_name)
  111. {
  112. $class_name = map_class_name($old_class_name, $code_dir);
  113. if ($class_name)
  114. {
  115. $code = preg_replace("#([^a-z0-9_\$>])$old_class_name([^a-z0-9_])#", '\\1\\\\' . $class_name . '\\2', $code);
  116. }
  117. }
  118. }
  119. if ($namespaced_file)
  120. {
  121. $code = preg_replace('#new ([a-zA-Z0-9_][a-zA-Z0-9_\\\\]+)#', 'new \\\\\\1', $code);
  122. $code = preg_replace('#([^a-zA-Z0-9_\\\\$])([a-zA-Z0-9_][a-zA-Z0-9_\\\\]+)::#', '\\1\\\\\\2::', $code);
  123. $code = preg_replace('#catch \(([a-zA-Z0-9_][a-zA-Z0-9_\\\\]+)#', 'catch (\\\\\\1', $code);
  124. $code = preg_replace('#(\(|, )([a-zA-Z0-9_][a-zA-Z0-9_\\\\]+)(\s\$)#', '\\1\\\\\\2\\3', $code);
  125. $code = preg_replace('#(implements |extends )([a-zA-Z0-9_][a-zA-Z0-9_\\\\]+)(?=\s*(?:,|\n))#', '\\1\\\\\\2', $code);
  126. $abs_classes = array(
  127. 'Countable',
  128. 'IteratorAggregate',
  129. 'ArrayAccess',
  130. );
  131. $code = preg_replace('#(\s+)(' . implode('|', $abs_classes) . ')#', '\\1\\\\\\2', $code);
  132. $rel_classes = array(
  133. 'ContainerBuilder',
  134. 'YamlFileLoader',
  135. 'FileLocator',
  136. 'Extension',
  137. 'CompilerPassInterface',
  138. 'EventSubscriberInterface',
  139. 'EventDispatcherInterface',
  140. 'ContainerAwareEventDispatcher',
  141. 'ContainerInterface',
  142. 'KernelEvents',
  143. 'RouteCollection',
  144. 'ControllerResolverInterface',
  145. 'Request',
  146. 'include',
  147. 'array',
  148. 'parent',
  149. 'self',
  150. );
  151. $code = preg_replace('#([^a-zA-Z0-9_])\\\\((?:' . implode('|', $rel_classes) . ')(?:\s|\(|::|;))#', '\\1\\2', $code);
  152. }
  153. file_put_contents($file->getPathname(), $code);
  154. }
  155. if ($file->getExtension() == 'yml')
  156. {
  157. $code = file_get_contents($file->getPathname());
  158. if (preg_match_all('#\s*class:\s*(phpbb_[a-z0-9_]+)\s+#', $code, $matches))
  159. {
  160. foreach ($matches[1] as $old_class_name)
  161. {
  162. $class_name = map_class_name($old_class_name, $code_dir);
  163. if ($class_name)
  164. {
  165. $code = preg_replace("#(\s*class:\s*)$old_class_name(\s+)#", "\\1$class_name\\2", $code);
  166. }
  167. }
  168. }
  169. file_put_contents($file->getPathname(), $code);
  170. }
  171. }