php svn客户端

<?php
/**
 * For svn use by php
 * 
 * This class allow you checkout svn files through web
 * And allow you update files
 * I hope in the later version, it can handle commit and other actions
 * 
 * @example
 * <code>
 * $phpsvn = new phpsvn();
 * $phpsvn->setOptions(array(
 * 	'username' => 'yourname',
 * 	'password' => 'yourpassword'
 * ));
 * $phpsvn->setPath($svnpath, $localpath);
 * $r = $phpsvn->checkout();
 * if($r === false){
 * 	echo $phpsvn->error();
 * }else{
 * 	print_r($r);
 * }
 * </code>
 * @author hufeng<[email protected]>
 * @version v1.0
 * @access sflib
 * @package sflib
 * @category phpsvn
 * @copyright 2012-2013@copyright sflib 
 */


class phpsvn
{
	/**
	 * svn command options
	 * 
	 * @var array
	 */
	private $opts = array(
		'username' => '',
		'password' => '',
		'config-dir' => '',	///usr/home/finance/.subversion
	);
	
	/**
	 * error log file
	 * 
	 * Will not save data in this file
	 * Just a tmp file store tmp error message
	 * @var string
	 */
	private $errorfile = '/tmp/phpsvn.err';
	
	/**
	 * Error message
	 * 
	 * If no error, error = ''
	 * @var string
	 */
	private $error = '';
	
	/**
	 * The value to return
	 * 
	 * @var array
	 */
	private $retValue = array();
	
	/**
	 * Svn path
	 * 
	 * @var string
	 */
	private $svnpath = '';
	
	/**
	 * Local file path where file stored
	 * 
	 * @var string
	 */
	private $targetPath = '.';
	
	/**
	 * actions tags
	 * 
	 * @var array
	 */
	private $shortTags = array('a', 'u', 'd');
	
	/**
	 * Set opts of svn command
	 * 
	 * allow opts:
	 * username : your svn username
	 * password : your svn password
	 * config-dir : your execute user config dir
	 * @param array $options
	 */
	public function setOptions($options = array()){
		$this->opts = array_merge($this->opts, $options);
	}
	
	/**
	 * Set svn path & localpath
	 * 
	 * @param string $svnpath svn path
	 * @param string $targetpath local path
	 * @return void
	 */
	public function setPath($svnpath, $targetpath = '.'){
		$this->svnpath = $svnpath;
		$this->targetPath = realpath($targetpath);
	}
	
	/**
	 * update from server
	 * 
	 * @return mixed array on success or false on error
	 */
	public function update(){
		return $this->doCmd('up');
	}
	
	/**
	 * commit file to server
	 * 
	 * @return mixed array on success or false on error
	 */
	public function commit(){
		return $this->doCmd('ci');
	}
	
	/**
	 * Add file to svn
	 * 
	 * @param string $file filename
	 * @return mixed array on success or false on error
	 */
	public function add($file){
		return $this->doCmd('add', $file);
	}

	/**
	 * Chectout file from svn to local
	 * 
	 * @return mixed array on success or false on error
	 */
	public function checkout(){
		return $this->doCmd('co', $this->svnpath);
		//Checked out revision 240772
	}
	
	/**
	 * Execute command for svn
	 * 
	 * support commands:add/checkout(co)/cleanup/commit(ci)/copy(cp)/delete(del,remove,rm)/diff(di)/update (up)
	 * todo commands:export
     * help (?, h)
     * import
     * info
     * list (ls)
     * lock
     * log
     * merge
     * mkdir
     * move (mv, rename, ren)
     * propdel (pdel, pd)
     * propedit (pedit, pe)
     * propget (pget, pg)
     * proplist (plist, pl)
     * propset (pset, ps)
     * resolved
     * revert
     * status (stat, st)
   	 * switch (sw)
	 * @param string $cmd
	 * @param string $param
	 */
	public function doCmd($cmd, $param = ''){
		chdir($this->targetPath);
		$cmd = "{$cmd} {$param}";
		$result = $this->shell($cmd);
		return $this->result($result);
	}
	
	/**
	 * Error message last time
	 * 
	 * @return string error message
	 */
	public function error(){
		return $this->error;
	}
	
	/**
	 * Format the result handle
	 * 
	 * @param string $result result string
	 * @return string
	 */
	private function result($result){
		if($result === false){
			return false;
		}
		foreach(explode("\n", $result) as $line){
			$line = trim($line);
			$this->retLine($line);
		}
		return $this->retValue;
	}
	
	private function retLine($line){
		$line = strtolower($line);
		if(empty($line)){
			return;
		}
		$retValue = array();
		if(in_array($line[0], $this->shortTags)){
			$retValue['a'] = $line[0];
			$retValue['v'] = trim(substr($line, 2));
		}else{
			preg_match('/([0-9]+)/', $line, $match);
			$num = intval($match[0]);
			if($num > 0){
				$retValue['a'] = 'v';
				$retValue['v'] = $num;
			}
		}
		$this->retValue[] = $retValue;
	}
	
	/**
	 * Get svn file version from result line
	 * 
	 * @param string $line result line
	 * @return mixed version number or false if on error
	 */
	private function getVersionByLine($line){
		$line = trim(strtolower($line));
		if(preg_match('/([0-9]+)/', $line, $match)){
			return $match[0];
		}
		return false;
	}
	/**
	 * Exec shell command
	 * 
	 * @access private
	 * @param string $cmd command to be executed
	 * @return string result string should been displayed on stdout, 
	 * @return return false if on error
	 */
	private function shell($cmd){
		$opts = '';
		foreach($this->opts as $key => $item){
			if(!empty($item)){
				$opts .= "--{$key} {$item} ";
			}
		}
		$result = @shell_exec("svn {$opts}" . $cmd . ' 2> ' . $this->errorfile);
		if($this->isResultError()){
			return false;
		}
		return $result;
	}
	
	/**
	 * Check if on error
	 * 
	 * @param string $result shell result string
	 * @return boolen
	 */
	private function isResultError(){
		$this->error = file_get_contents($this->errorfile);
		if(empty($this->error)){
			return false;
		}
		return true;
	}
}

?>

你可能感兴趣的:(PHP,SVN)