Fixed issue 204, deleting a project does not remove the repository
This commit is contained in:
		
				
					committed by
					
						 Loic d'Anterroches
						Loic d'Anterroches
					
				
			
			
				
	
			
			
			
						parent
						
							9b39d63104
						
					
				
				
					commit
					e235242ea6
				
			| @@ -70,6 +70,9 @@ folder. Here is a configuration example: | ||||
|     $cfg['idf_plugin_syncgit_path_gitserve'] = '/home/www/indefero/scripts/gitserve.py'; # yes .py | ||||
|     $cfg['idf_plugin_syncgit_path_authorized_keys'] = '/home/git/.ssh/authorized_keys'; | ||||
|     $cfg['idf_plugin_syncgit_sync_file'] = '/tmp/SYNC-GIT'; | ||||
|     # Remove the git repositories which do not have a corresponding project | ||||
|     # This is run at cron time | ||||
|     $cfg['idf_plugin_syncgit_remove_orphans'] = false; | ||||
|  | ||||
| When someone will change his SSH key or add a new one, the | ||||
| `/tmp/SYNC-GIT` file will be created. The cron job | ||||
|   | ||||
| @@ -69,6 +69,44 @@ class IDF_Plugin_SyncGit_Cron | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove orphan repositories. | ||||
|      */ | ||||
|     public static function removeOrphanRepositories() | ||||
|     { | ||||
|         $path = Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'); | ||||
|         if (!is_dir($path) || is_link($path)) { | ||||
|             throw new Pluf_Exception_SettingError(sprintf( | ||||
|                 'Directory %s does not exist! Setting "idf_plugin_syncgit_base_repositories not set.', | ||||
|                 $path)); | ||||
|         } | ||||
|         if (!is_writable($path)) { | ||||
|             throw new Exception(sprintf('Repository %s is not writable.', $path)); | ||||
|         } | ||||
|         $projects = array(); | ||||
|         foreach (Pluf::factory('IDF_Project')->getList() as $project) { | ||||
|             $projects[] = $project->shortname; | ||||
|         } | ||||
|         unset($project); | ||||
|         $it = new DirectoryIterator($path); | ||||
|         $orphans = array(); | ||||
|         while ($it->valid()) { | ||||
|             if (!$it->isDot() && $it->isDir() && !in_array(basename($it->getFileName(), '.git'), $projects)) { | ||||
|                 $orphans[] = $it->getPathName(); | ||||
|             } | ||||
|             $it->next(); | ||||
|         } | ||||
|         if (count($orphans)) { | ||||
|             $cmd = Pluf::f('idf_exec_cmd_prefix', '').'rm -rf '.implode(' ', $orphans); | ||||
|             exec($cmd); | ||||
|             while (list(, $project) = each($orphans)) { | ||||
|                 if (is_dir($project)) { | ||||
|                     throw new Exception(sprintf('Cannot remove %s directory.', $project)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check if a sync is needed. | ||||
|      * | ||||
| @@ -79,6 +117,9 @@ class IDF_Plugin_SyncGit_Cron | ||||
|             @unlink(Pluf::f('idf_plugin_syncgit_sync_file')); | ||||
|             self::sync(); | ||||
|             self::markExport(); | ||||
|             if (Pluf::f('idf_plugin_syncgit_remove_orphans', false)) { | ||||
|                 self::removeOrphanRepositories(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user