NOT work on a * repository, only on a checked out Subversion module * @package PEAR_PackageFileManager * @author Arnaud Limbour */ class PEAR_PackageFileManager_Svn extends PEAR_PackageFileManager_File { /** * Return a list of all files in the CVS repository * * This function is like {@link parent::dirList()} except * that instead of retrieving a regular filelist, it first * retrieves a listing of all the .svn/entries files in * $directory and all of the subdirectories. Then, it * reads the entries file, and creates a listing of files * that are a part of the Subversion checkout. No check is * made to see if they have been modified, but removed files * are ignored. * * @access protected * @return array list of files in a directory * @param string $directory full path to the directory you want the list of * @uses _recurDirList() * @uses _readSVNEntries() */ function dirList($directory) { static $in_recursion = false; if (!$in_recursion) { // include only .svn/entries files // since subversion keeps its data in a hidden // directory we must force PackageFileManager to // consider hidden directories. $this->_options['addhiddenfiles'] = true; $this->_setupIgnore(array('*/.svn/entries'), 0); $this->_setupIgnore(array(), 1); $in_recursion = true; $entries = parent::dirList($directory); $in_recursion = false; } else { return parent::dirList($directory); } if (!$entries || !is_array($entries)) { return PEAR_PackageFileManager::raiseError(PEAR_PACKAGEFILEMANAGER_NOSVNENTRIES, $directory); } return $this->_readSVNEntries($entries); } /** * Iterate over the SVN Entries files, and retrieve every * file in the repository * * @uses _getSVNEntries() * @param array array of full paths to .svn/entries files * @access private */ function _readSVNEntries($entries) { $ret = array(); $ignore = $this->_options['ignore']; // implicitly ignore packagefile $ignore[] = $this->_options['packagefile']; $include = $this->_options['include']; $this->ignore = array(false, false); $this->_setupIgnore($ignore, 1); $this->_setupIgnore($include, 0); foreach($entries as $cvsentry) { $directory = @dirname(@dirname($cvsentry)); if (!$directory) { continue; } $d = $this->_getSVNEntries($cvsentry); if (!is_array($d)) { continue; } foreach($d as $entry) { if ($ignore) { if ($this->_checkIgnore($entry, $directory . '/' . $entry, 1)) { continue; } } if ($include) { if ($this->_checkIgnore($entry, $directory . '/' . $entry, 0)) { continue; } } $ret[] = $directory . '/' . $entry; } } return $ret; } /** * Retrieve the entries in a .svn/entries file * * Uses XML_Tree to parse the XML subversion file * * It keeps only files, excluding directories. It also * makes sure no deleted file in included. * * @return array an array with full paths to files * @uses PEAR::XML_Tree * @param string full path to a .svn/entries file * @access private */ function _getSVNEntries($svnentriesfilename) { require_once 'XML/Tree.php'; $parser = &new XML_Tree($svnentriesfilename); $tree = &$parser->getTreeFromFile(); // loop through the xml tree and keep only valid entries being files $entries = array(); foreach ($tree->children as $entry) { if ($entry->name == 'entry' && $entry->attributes['kind'] == 'file') { if (isset($entry->attributes['deleted'])) { continue; } array_push($entries, $entry->attributes['name']); } } unset($parser, $tree); if (is_array($entries)) { return $entries; } else { return false; } } } ?>