Fixed issue 204, deleting a project does not remove the repository
This commit is contained in:
		
				
					committed by
					
						
						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