elviss 2 年之前
父節點
當前提交
55ac035b6a
共有 3 個文件被更改,包括 141 次插入38 次删除
  1. 1 8
      src/HelperClass.php
  2. 63 26
      src/PackageClass.php
  3. 77 4
      src/Utility.php

+ 1 - 8
src/HelperClass.php

@@ -12,7 +12,7 @@ class HelperClass
     public static function postUpdate(Event $event)
     {
         $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
-		PackageClass::index($vendorDir,"");
+		PackageClass::postUpdate($vendorDir);
 		print("---postUpdate finished---");
     }
 
@@ -25,16 +25,9 @@ class HelperClass
 
     public static function postPackageInstall(PackageEvent $event)
     {      
-		$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
-		$package = $event->getOperation()->getPackage();
-		PackageClass::index($vendorDir, $package->getName());
     }
 
     public static function postPackageUpdate(PackageEvent $event)
     {
-		$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
-		$package = $event->getOperation()->getPackage();
-		PackageClass::index($vendorDir, $package->getName());
     }
-	
 }

+ 63 - 26
src/PackageClass.php

@@ -5,8 +5,52 @@ include "Utility.php";
 
 class PackageClass
 {
+	private static $config = null;     //配置信息
+	private static $repoNames = null;  //所有包名
+	private static $totalUseSpace = 0; //整体占用空间
 	//当所有包都安装完毕后
-	public static function index($vendorDir,$repoName){
+	public static function postUpdate($vendorDir){
+		//初始化数据
+		if(!self::initialize()){
+			exit();
+		}
+		
+		//逐个仓库操作
+		self::updateProgress(0);
+		foreach(self::$repoNames as $i=>$repoName){
+			//获取顶层包信息
+			$packageInfo = self::getPackageInfo(self::$config,$vendorDir,$repoName);
+			if(!$packageInfo){
+				exit();
+			}
+			
+			//获取当前包的module文件
+			self::fetchModuleFiles($packageInfo);
+			
+			//获取当前包的common文件
+			self::fetchCommonFiles($packageInfo);
+
+			//获取当前包的config文件
+			self::fetchConfigFiles($packageInfo);
+			
+			//顶层包的额外工作
+			if($repoName == "."){
+				//注册全局路径
+				self::registerPath($packageInfo);
+				//注册自启动程序
+				self::registerAutorun($packageInfo);
+			}
+			
+			//更新部署进度
+			$percent = intval(100.0 * ($i+1) / count(self::$repoNames));
+			self::updateProgress($percent);
+		}
+		self::updateProgress(100);
+	}
+	
+	
+	//初始化
+	private static initialize($vendorDir){
 		//创建.distribute目录
 		$distributeDir = getDistributeDir($vendorDir);
 		if( !file_exists($distributeDir) ){
@@ -17,43 +61,32 @@ class PackageClass
 		if(! defined(LOG_PATH)){
 			define('LOG_PATH',getLogPath($distributeDir))
 		}
-				
-		//获取配置信息
+
+		//获取部署配置信息
 		$cfgPath = getConfigPath($distributeDir);
 		$config = loadConfig($cfgPath);
 		if(!$config){
 			printf("Failed to load distribute config -- %s\n",$cfgPath);
-			exit();
-		}
-		
-		//获取当前包信息
-		$packageInfo = self::getPackageInfo($config,$vendorDir,$repoName);
-		if(!$packageInfo){
-			exit();
+			return false;
 		}
+		$config['progress.txt'] = pathJoin($distributeDir,'progress.txt');
 		
-		//获取当前包的module文件
-        self::fetchModuleFiles($packageInfo);
+		self::$config = $config;
+		//获取所有依赖仓库
+		self::$repoNames = scanRepoNames($vendorDir);
 		
-		//获取当前包的common文件
-		self::fetchCommonFiles($packageInfo);
-
-		//获取当前包的config文件
-		self::fetchConfigFiles($packageInfo);
+		//获取所有依赖仓库的配置信息
+		$repoConfigs = loadRepoConfigs($vendorDir,self::$repoNames);
 		
-		//顶层包的额外工作
-		if($repoName == ""){
-			//注册全局路径
-			self::registerPath($packageInfo);
-			//注册自启动程序
-			self::registerAutorun($packageInfo);
-		}
+		//统计总体所需空间
+		self::$totalUseSpace = getTotalUseSpace($repoConfigs);
+		return true;
 	}
 
 	//获取包相关信息
 	private static function getPackageInfo($config,$vendorDir, $repoName){
 		$rootDir = dirname($vendorDir);
-		if($repoName == ""){ 
+		if($repoName == "."){ 
 			$repoDir = $rootDir; //最上层包所在目录
 		}
 		else{
@@ -193,5 +226,9 @@ class PackageClass
 	}
 	
 	private static function registerAutorun($packageInfo){
-	}	
+	}
+	
+	private static function updateProgress($progress){
+		file_put_contents(self::$config['progress.txt'],strval($progress));
+	}
 }

+ 77 - 4
src/Utility.php

@@ -1,12 +1,27 @@
 <?php
-//记录普通日志
-function logInfo($content){
-	file_put_contents(LOG_PATH, $content.PHP_EOL, FILE_APPEND);
+//记录信息日志
+function logInfo(){
+	$content = '[INFO]';
+	$args = func_get_args();
+	$argc = func_num_args();
+	for($i=0;$i<$argc;$i++){
+		$content .= $args[$i] . ' ';
+	}
+	$content .= PHP_EOL;
+	file_put_contents(LOG_PATH, $content, FILE_APPEND);
 }
 //记录错误日志
 function logError($content){
-	file_put_contents(LOG_PATH, $content.PHP_EOL, FILE_APPEND);
+	$content = '[ERR]';
+	$args = func_get_args();
+	$argc = func_num_args();
+	for($i=0;$i<$argc;$i++){
+		$content .= $args[$i] . ' ';
+	}
+	$content .= PHP_EOL;
+	file_put_contents(LOG_PATH, $content, FILE_APPEND);
 }
+
 //获取操作系统名称
 function getOsName(){
 	if(substr(PHP_OS,0,3)==='WIN')
@@ -55,6 +70,64 @@ function pathJoin($base, $path) {
 	}
     return $newPath;
 }
+
+//枚举子目录
+function scanSubDir($dir,$exclude_names = array()){
+	$filelist = scandir($dir);
+	$subdirs = array();
+	foreach($filelist as $filename){
+		//过滤掉当前目录和上级目录
+		if($filename == "." || $filename ==".."){
+			continue;
+		}
+		//过滤掉排查的名称
+		if(in_array($filename,$exclude_names)){
+			continue;
+		}
+		//判断是否是文件夹
+		$filepath = pathJoin($dir,$filename);
+		if(is_dir($filepath) ){
+			array_push($subdirs,$filename);
+		}
+	}
+	return $subdirs;
+}
+
+//枚举所有仓库名
+function scanRepoNames($vendoDir){
+	$repos = array();
+	$users = scanSubDir($vendorDir);
+	foreach($users as $user){
+		$userdir = pathJoin($vendorDir,$user);
+		$names = scanSubDir($userdir);
+		foreach($names as $name){
+			array_push($repos,$user . '/' . $name);
+		}
+	}
+	array_push($repos,"."); //.名称表示顶层包,放最后
+	return $repos;
+}
+
+//解析所有仓库配置
+function loadRepoConfigs($vendorDir,$repoNames){
+	$configs = array();
+	foreach($repoNames as $repoName){
+		if($repoName == '.')
+			$cfgPath = pathJoin(dirname($vendorDir),'composer.json');
+		else
+			$cfgPath = pathJoin($vendorDir,$repoName,'composer.json');
+		$data = json_decode(file_get_contents($cfgPath), true);
+		if(!$data){
+			logError('invalid composer.json',$cfgPath);
+			return false;
+		}
+		$configs[$repoName] = $data;
+	}
+	return $configs;
+}
+function getTotalUseSpace($repoConfigs){
+	
+}
 //.distribute路径
 function getDistributeDir($vendorDir){
 	return pathJoin(dirname($vendorDir),'.distribute');