| # ***** END LICENSE BLOCK ***** */␊ | 
| ␊ | 
| /**␊ | 
| * SVN utils.␊ | 
| *␊ | 
| * Subversion backend.␊ | 
| * When a branch is not a branch.␊ | 
| * ␊ | 
| * Contrary to most other SCMs, Subversion is using folders to manage␊ | 
| * the branches and so what is either the commit or the branch in␊ | 
| * other SCMs is the revision number with Subversion. So, do not be␊ | 
| * surprised if you have the feeling that the methods are not really␊ | 
| * returning what could be expected from their names.␊ | 
| */␊ | 
| class IDF_Scm_Svn extends IDF_Scm␊ | 
| {␊ | 
|  | 
| $this->repo = $repo;␊ | 
| $this->username = $username;␊ | 
| $this->password = $password;␊ | 
| $this->cache['commitmess'] = array();␊ | 
| }␊ | 
| ␊ | 
| public function isAvailable()␊ | 
|  | 
| escapeshellarg($this->password),␊ | 
| escapeshellarg($this->repo.'/'.$folder),␊ | 
| escapeshellarg($rev));␊ | 
| $xmlLs = shell_exec($cmd);␊ | 
| $xml = simplexml_load_string($xmlLs);␊ | 
| $xml = simplexml_load_string(shell_exec($cmd));␊ | 
| $res = array();␊ | 
| $folder = (strlen($folder)) ? $folder.'/' : '';␊ | 
| foreach ($xml->list->entry as $entry) {␊ | 
|  | 
| $file['date'] = gmdate('Y-m-d H:i:s',␊ | 
| strtotime((string) $entry->commit->date));␊ | 
| $file['rev'] = (string) $entry->commit['revision'];␊ | 
| // Get commit message␊ | 
| $currentReposFile = $this->repo.'/'.$folder.$file['file'];␊ | 
| $file['log'] = $this->getCommitMessage($currentReposFile, $rev);␊ | 
| ␊ | 
| $file['log'] = $this->getCommitMessage($file['rev']);␊ | 
| // Get the size if the type is blob␊ | 
| if ($file['type'] == 'blob') {␊ | 
| $file['size'] = (string) $entry->size;␊ | 
|  | 
| ␊ | 
| ␊ | 
| /**␊ | 
| * Get a commit message for given file and revision.␊ | 
| * Get the commit message of a revision revision.␊ | 
| *␊ | 
| * @param string File␊ | 
| * @param string Commit ('HEAD')␊ | 
| *␊ | 
| * @return String commit message␊ | 
| */␊ | 
| private function getCommitMessage($file, $rev='HEAD')␊ | 
| private function getCommitMessage($rev='HEAD')␊ | 
| {␊ | 
| if (isset($commit[$rev])) return $commit[$rev];␊ | 
| if (isset($this->cache['commitmess'][$rev])) {␊ | 
| return $this->cache['commitmess'][$rev];␊ | 
| }␊ | 
| $cmd = sprintf(Pluf::f('svn_path', 'svn').' log --xml --limit 1 --username=%s --password=%s %s@%s',␊ | 
| escapeshellarg($this->username),␊ | 
| escapeshellarg($this->password),␊ | 
| escapeshellarg($file),␊ | 
| escapeshellarg($this->repo),␊ | 
| escapeshellarg($rev));␊ | 
| $xmlLog = shell_exec($cmd);␊ | 
| $xml = simplexml_load_string($xmlLog);␊ | 
| $commit[$rev]=(string) $xml->logentry->msg;␊ | 
| return (string) $xml->logentry->msg;␊ | 
| $xml = simplexml_load_string(shell_exec($cmd));␊ | 
| $this->cache['commitmess'][$rev] = (string) $xml->logentry->msg;␊ | 
| return $this->cache['commitmess'][$rev];␊ | 
| }␊ | 
| ␊ | 
| /**␊ | 
|  | 
| escapeshellarg($this->password),␊ | 
| escapeshellarg($this->repo.'/'.$totest),␊ | 
| escapeshellarg($rev));␊ | 
| $xmlInfo = shell_exec($cmd);␊ | 
| $xml = simplexml_load_string($xmlInfo);␊ | 
| $xml = simplexml_load_string(shell_exec($cmd));␊ | 
| $entry = $xml->entry;␊ | 
| $file = array();␊ | 
| $file['fullpath'] = $totest;␊ | 
| $file['hash'] = (string) $entry->repository->uuid;␊ | 
| $file['type'] = $this->assoc[(string) $entry['kind']];␊ | 
| $file['file'] = $totest;␊ | 
| $file['rev'] = (string) $entry->commit['revision'];␊ | 
| $file['rev'] = $rev; ␊ | 
| $file['author'] = (string) $entry->author;␊ | 
| $file['date'] = gmdate('Y-m-d H:i:s', strtotime((string) $entry->commit->date));␊ | 
| $file['size'] = (string) $entry->size;␊ | 
| $file['log'] = '';␊ | 
| ␊ | 
| return (object) $file;␊ | 
| }␊ | 
| ␊ | 
|  | 
| escapeshellarg($this->repo.'/trunk'));␊ | 
| exec($cmd, $out, $ret);␊ | 
| if ($ret == 0) {␊ | 
| $res = array_merge(array('trunk' => 'trunk'), $res);␊ | 
| $res = array('trunk' => 'trunk') + $res;␊ | 
| }␊ | 
| $this->cache['branches'] = $res;␊ | 
| return $res;␊ |