PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/downloader/lib/Mage/Connect/Converter.php

https://bitbucket.org/claudiu_marginean/magento-hg-mirror
PHP | 336 lines | 245 code | 36 blank | 55 comment | 26 complexity | e2f9256df6736987daea1c66419d7ed1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magentocommerce.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magentocommerce.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Connect
  23. * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Class for convertiong old magento PEAR packages to new one
  28. *
  29. * @category Mage
  30. * @package Mage_Connect
  31. * @author Magento Core Team <core@magentocommerce.com>
  32. */
  33. final class Mage_Connect_Converter
  34. {
  35. protected $_archiver;
  36. /**
  37. *
  38. * @return Mage_Archive
  39. */
  40. public function arc()
  41. {
  42. if(!$this->_archiver) {
  43. $this->_archiver = new Mage_Archive();
  44. }
  45. return $this->_archiver;
  46. }
  47. public function newPackage()
  48. {
  49. return new Mage_Connect_Package();
  50. }
  51. /**
  52. *
  53. * @return Pear_Package_Parser_v2
  54. */
  55. public function oldPackageReader()
  56. {
  57. return new Pear_Package_Parser_v2();
  58. }
  59. public function __construct()
  60. {
  61. }
  62. public function convertChannelName($channel)
  63. {
  64. return str_replace("connect.magentocommerce.com/", "", $channel);
  65. }
  66. /**
  67. * Convert package dependencies - urls - by ref
  68. * @param array $deps ref to array
  69. * @return void
  70. */
  71. public function convertPackageDependencies($oldDeps)
  72. {
  73. $out = array();
  74. if(empty($oldDeps['required']['package'])) {
  75. return $out;
  76. }
  77. $deps = $oldDeps['required']['package'];
  78. if(!isset($deps[0])) {
  79. $deps = array($deps);
  80. }
  81. for($i=0, $c=count($deps); $i<$c; $i++) {
  82. $deps[$i]['min_version'] = isset($deps[$i]['min']) ? $deps[$i]['min'] : false;
  83. $deps[$i]['max_version'] = isset($deps[$i]['max']) ? $deps[$i]['max'] : false;
  84. $deps[$i]['channel'] = $this->convertChannelName($deps[$i]['channel']);
  85. $out[] = $deps[$i];
  86. }
  87. return $out;
  88. }
  89. public function convertLicense($oldLicense)
  90. {
  91. if(is_scalar($oldLicense)) {
  92. return $oldLicense;
  93. }
  94. return array($oldLicense['_content'], $oldLicense['attribs']['uri']);
  95. }
  96. public function convertMaintainers($maintainers)
  97. {
  98. if(!is_array($maintainers) || !count($maintainers)) {
  99. return array();
  100. }
  101. $out = array();
  102. foreach($maintainers as $row) {
  103. $out[] = array('name'=>$row['name'], 'email'=>$row['email'], 'user'=>'auto-converted');
  104. }
  105. return $out;
  106. }
  107. protected $fileMap = array();
  108. /**
  109. * Conver pear package object to magento object
  110. * @param Pear_Package_V2 $pearObject
  111. * @return Mage_Connect_Package
  112. */
  113. public function convertPackageObject($pearObject)
  114. {
  115. $data = array();
  116. $mageObject = $this->newPackage();
  117. $map = array (
  118. 'name' => null,
  119. 'version' => array('getterArgs' => array('release')
  120. ),
  121. 'package_deps' => array( 'getter'=>'getDependencies',
  122. 'converter'=>'convertPackageDependencies',
  123. 'setter'=>'setDependencyPackages',
  124. ),
  125. 'stability' => array( 'getter'=>'getState',
  126. 'getterArgs' => array('release'),
  127. ),
  128. 'license' => array( 'getterArgs' => array(true),
  129. 'converter' => 'convertLicense',
  130. 'noArrayWrap' => true,
  131. ),
  132. 'summary' => null,
  133. 'description' => null,
  134. 'notes' => null,
  135. 'date' => null,
  136. 'time' => null,
  137. 'authors' => array( 'converter' => 'convertMaintainers',
  138. 'getter' => 'getMaintainers',
  139. ),
  140. 'channel' => array( 'converter' => 'convertChannelName',
  141. ),
  142. );
  143. foreach($map as $field=>$rules) {
  144. if(empty($rules)) {
  145. $rules = array('setter'=> '', 'getter'=> '');
  146. }
  147. if(empty($rules['getter'])) {
  148. $rules['getter'] = 'get'. ucfirst($field);
  149. }
  150. $useSetter = empty($rules['noSetter']);
  151. $useGetter = empty($rules['noGetter']);
  152. if(empty($rules['setter'])) {
  153. $rules['setter'] = 'set'. ucfirst($field);
  154. }
  155. if(empty($rules['getterArgs'])) {
  156. $rules['getterArgs'] = array();
  157. } elseif(!is_array($rules['getterArgs'])) {
  158. throw new Exception("Invalid 'getterArgs' for '{$field}', should be array");
  159. }
  160. if($useGetter && !method_exists($pearObject, $rules['getter'])) {
  161. $mName = get_class($pearObject)."::".$rules['getter'];
  162. throw new Exception('No getter method exists: '.$mName);
  163. }
  164. if($useSetter && !method_exists($mageObject, $rules['setter'])) {
  165. $mName = get_class($mageObject)."::".$rules['setter'];
  166. throw new Exception('No setter method exists: '.$mName);
  167. }
  168. $useConverter = !empty($rules['converter']);
  169. if($useConverter && false === method_exists($this, $rules['converter'])) {
  170. $mName = get_class($this)."::".$rules['converter'];
  171. throw new Exception('No converter method exists: '.$mName);
  172. }
  173. if($useGetter) {
  174. $getData = call_user_func_array(array($pearObject, $rules['getter']), $rules['getterArgs']);
  175. } else {
  176. $getData = array();
  177. }
  178. if($useConverter) {
  179. $args = array();
  180. if(!$useGetter && !$useSetter) {
  181. $args = array($pearObject, $mageObject);
  182. } elseif(!$useSetter) {
  183. $args = array($mageObject, $getData);
  184. } else {
  185. $args = array($getData);
  186. }
  187. $getData = call_user_func_array(array($this, $rules['converter']), $args);
  188. }
  189. $noWrap = !empty($rules['noArrayWrap']);
  190. if($useSetter) {
  191. $setData = call_user_func_array(array($mageObject, $rules['setter']), $noWrap ? $getData : array($getData));
  192. }
  193. }
  194. return $mageObject;
  195. }
  196. /**
  197. * Convert PEAR package to Magento package
  198. * @param string $sourceFile path to PEAR .tgz
  199. * @param string|false $destFile path to newly-created Magento .tgz, false to specify auto
  200. * @return bool
  201. */
  202. public function convertPearToMage($sourceFile, $destFile = false)
  203. {
  204. try {
  205. if(!file_exists($sourceFile)) {
  206. throw new Exception("File doesn't exist: {$sourceFile}");
  207. }
  208. $arc = $this->arc();
  209. $tempDir = "tmp-".basename($sourceFile).uniqid();
  210. $outDir = "out-".basename($sourceFile).uniqid();
  211. $outDir = rtrim($outDir, "\\/");
  212. Mage_System_Dirs::mkdirStrict($outDir);
  213. Mage_System_Dirs::mkdirStrict($tempDir);
  214. $result = $arc->unpack($sourceFile, $tempDir);
  215. if(!$result) {
  216. throw new Exception("'{$sourceFile}' was not unpacked");
  217. }
  218. $result = rtrim($result, "\\/");
  219. $packageXml = $result . DS . "package.xml";
  220. if(!file_exists($packageXml)) {
  221. throw new Exception("No package.xml found inside '{$sourceFile}'");
  222. }
  223. $reader = $this->oldPackageReader();
  224. $data = file_get_contents($packageXml);
  225. $pearObject = $reader->parsePackage($data, $packageXml);
  226. $mageObject = $this->convertPackageObject($pearObject);
  227. if(!$mageObject->validate()) {
  228. throw new Exception("Package validation failed.\n". implode("\n", $mageObject->getErrors()));
  229. }
  230. /**
  231. * Calculate destination file if false
  232. */
  233. if(false === $destFile) {
  234. $pathinfo = pathinfo($sourceFile);
  235. $destFile = $pathinfo['dirname'] . DS .$pathinfo['filename'].'-converted';
  236. if(isset($pathinfo['extension'])) {
  237. $destFile .= ".".$pathinfo['extension'];
  238. }
  239. }
  240. $target = new Mage_Connect_Package_Target("target.xml");
  241. $targets = $target->getTargets();
  242. $mageObject->setTarget($target);
  243. $validRoles = array_keys($targets);
  244. $data = $pearObject->getFilelist();
  245. $pathSource = dirname($pearObject->getPackageFile()).DS.$pearObject->getName()."-".$pearObject->getVersion();
  246. $filesToDo = array();
  247. foreach($data as $file =>$row) {
  248. $name = $row['name'];
  249. $role = $row['role'];
  250. if(!in_array($role, $validRoles)) {
  251. $role = 'mage';
  252. }
  253. $baseName = ltrim($targets[$role], "\\/.");
  254. $baseName = rtrim($baseName, "\\/");
  255. $sourceFile = $pathSource.DS.$name;
  256. $targetFile = $outDir . DS . $baseName . DS. $name;
  257. if(file_exists($sourceFile)) {
  258. Mage_System_Dirs::mkdirStrict(dirname($targetFile));
  259. $copy = @copy($sourceFile, $targetFile);
  260. if(false === $copy) {
  261. throw new Exception("Cannot copy '{$sourceFile}' to '{$targetFile}'");
  262. }
  263. }
  264. $filesToDo[] = array ('name'=> $name, 'role'=>$role);
  265. }
  266. $cwd = getcwd();
  267. @chdir($outDir);
  268. foreach($filesToDo as $fileToDo) {
  269. $mageObject->addContent($fileToDo['name'], $fileToDo['role']);
  270. }
  271. $mageObject->save(getcwd());
  272. @chdir($cwd);
  273. $filename = $outDir. DS . $mageObject->getReleaseFilename().".tgz";
  274. if(@file_exists($targetArchive)) {
  275. @unlink($targetArchive);
  276. }
  277. Mage_System_Dirs::mkdirStrict(dirname($destFile));
  278. $copy = @copy($filename, $destFile);
  279. if(false === $copy) {
  280. throw new Exception("Cannot copy '{$filename}' to '{$targetArchive}'");
  281. }
  282. Mage_System_Dirs::rm($tempDir);
  283. Mage_System_Dirs::rm($outDir);
  284. } catch (Exception $e) {
  285. throw $e;
  286. }
  287. return $destFile;
  288. }
  289. }