<?<span php
</span><span /*</span><span *
* SVN 外部命令 类
*
* @author rubekid
*
* @todo comment need addslashes for svn commit
*
</span><span */</span>
<span class</span><span SvnUtils {
</span><span /*</span><span *
*
* svn 账号
</span><span */</span>
<span const</span> SVN_USERNAME = "robot"<span ;
</span><span /*</span><span *
* svn 密码
</span><span */</span>
<span const</span> SVN_PASSWORD = "robot2013"<span ;
</span><span /*</span><span *
* 配置文件目录 (任意指定一个临时目录,解决svn: warning: Can't open file '/root/.subversion/servers': Permission denied)
</span><span */</span>
<span const</span> SVN_CONFIG_DIR = "/var/tmp/"<span ;
</span><span /*</span><span *
* svn list
*
* @param $repository string
* @return boolean
*
</span><span */</span>
<span public</span> <span static</span> <span function</span> ls(<span $repository</span><span ) {
</span><span $command</span> = "sudo svn ls " . <span $repository</span><span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( "<br />", <span $output</span><span );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'non-existent in that revision'<span )) {
</span><span return</span> <span false</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn copy
*
* @param $src string
* @param $dst string
* @param $comment string
* @return boolean
*
</span><span */</span>
<span public</span> <span static</span> <span function</span> <span copy</span>(<span $src</span>, <span $dst</span>, <span $comment</span><span ) {
</span><span $command</span> = "sudo svn cp <span $src</span> <span $dst</span> -m '<span $comment</span>'"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( "<br />", <span $output</span><span );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn delete
*
* @param $url string
* @param $comment string
* @return boolean
*
</span><span */</span>
<span public</span> <span static</span> <span function</span> delete(<span $url</span>, <span $comment</span><span ) {
</span><span $command</span> = "sudo svn del <span $url</span> -m '<span $comment</span>'"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn move
*
* @param $src string
* @param $dst string
* @param $comment string
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> move(<span $src</span>, <span $dst</span>, <span $comment</span><span ) {
</span><span $command</span> = "sudo svn mv <span $src</span> <span $dst</span> -m '<span $comment</span>'"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn mkdir
*
* @param $url string
* @param $comment string
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> <span mkdir</span>(<span $url</span>, <span $comment</span><span ) {
</span><span $command</span> = "sudo svn mkdir <span $url</span> -m '<span $comment</span>'"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn diff
* @param $pathA string
* @param $pathB string
* @return string
</span><span */</span>
<span public</span> <span static</span> <span function</span> diff(<span $pathA</span>, <span $pathB</span><span ) {
</span><span $output</span> = self::runCmd ( "sudo svn diff <span $pathA</span> <span $pathB</span>"<span );
</span><span return</span> <span implode</span> ( '<br />', <span $output</span><span );
}
</span><span /*</span><span *
* svn checkout
* @param $url string
* @param $dir string
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> checkout(<span $url</span>, <span $dir</span><span ) {
</span><span $command</span> = "cd <span $dir</span> && sudo svn co <span $url</span>"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span if</span> (<span strstr</span> ( <span $output</span>, 'Checked out revision'<span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span /*</span><span *
* svn update
* @param $path string
</span><span */</span>
<span public</span> <span static</span> <span function</span> update(<span $path</span><span ) {
</span><span $command</span> = "cd <span $path</span> && sudo svn up"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span preg_match_all</span> ( "/[0-9]+/", <span $output</span>, <span $ret</span><span );
</span><span if</span> (! <span $ret</span> [0] [0<span ]) {
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span return</span> <span $ret</span> [0] [0<span ];
}
</span><span /*</span><span *
* svn merge
*
* @param $revision string
* @param $url string
* @param $dir string
*
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> merge(<span $revision</span>, <span $url</span>, <span $dir</span><span ) {
</span><span $command</span> = "cd <span $dir</span> && sudo svn merge -r1:<span $revision</span> <span $url</span>"<span ;
</span><span $output</span> = <span implode</span> ( '<br />', self::runCmd ( <span $command</span><span ) );
</span><span if</span> (<span strstr</span> ( <span $output</span>, 'Text conflicts'<span )) {
</span><span return</span> 'Command: ' . <span $command</span> . '<br />' . <span $output</span><span ;
}
</span><span return</span> <span true</span><span ;
}
</span><span /*</span><span *
* svn commit
*
* @param $dir string
* @param $comment string
*
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> commit(<span $dir</span>, <span $comment</span><span ) {
</span><span $command</span> = "cd <span $dir</span> && sudo svn commit -m'<span $comment</span>'"<span ;
</span><span $output</span> = <span implode</span> ( '<br />', self::runCmd ( <span $command</span><span ) );
</span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision' ) || <span empty</span> ( <span $output</span><span )) {
</span><span return</span> <span true</span><span ;
}
</span><span return</span> <span $output</span><span ;
}
</span><span /*</span><span *
* svn status (输出WC中文件和目录的状态)
*
* @param $dir string
</span><span */</span>
<span public</span> <span static</span> <span function</span> getStatus(<span $dir</span><span ) {
</span><span $command</span> = "cd <span $dir</span> && sudo svn st"<span ;
</span><span return</span> self::runCmd ( <span $command</span><span );
}
</span><span /*</span><span *
* svn 冲突
*
* @param $dir string
* @return boolean
</span><span */</span>
<span public</span> <span static</span> <span function</span> hasConflict(<span $dir</span><span ) {
</span><span $output</span> = self::getStatus ( <span $dir</span><span );
</span><span foreach</span> ( <span $output</span> <span as</span> <span $line</span><span ) {
</span><span if</span> ( <span substr</span> ( <span trim</span> ( <span $line</span> ), 0, 1 ) == 'C' || (<span substr</span> ( <span trim</span> ( <span $line</span> ), 0, 1 ) == '!'<span )) {
</span><span return</span> <span true</span><span ;
}
}
</span><span return</span> <span false</span><span ;
}
</span><span /*</span><span *
* svn log
*
* @param $path string
* @return string
*
</span><span */</span>
<span public</span> <span static</span> <span function</span> getLog(<span $path</span><span ) {
</span><span $command</span> = "sudo svn log <span $path</span> --xml"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span return</span> <span implode</span> ( '', <span $output</span><span );
}
</span><span /*</span><span *
* svn info
* @param $path string
</span><span */</span>
<span public</span> <span static</span> <span function</span> getPathRevision(<span $path</span><span ) {
</span><span $command</span> = "sudo svn info <span $path</span> --xml"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $string</span> = <span implode</span> ( '', <span $output</span><span );
</span><span $xml</span> = <span new</span> SimpleXMLElement ( <span $string</span><span );
</span><span foreach</span> ( <span $xml</span>->entry [0]->attributes () <span as</span> <span $key</span> => <span $value</span><span ) {
</span><span if</span> ( <span $key</span> == 'revision'<span ) {
</span><span return</span> <span $value</span><span ;
}
}
}
</span><span /*</span><span *
* 获取最新版本号
* @param $path string
</span><span */</span>
<span public</span> <span static</span> <span function</span> getHeadRevision(<span $path</span><span ) {
</span><span $command</span> = "cd <span $path</span> && sudo svn up"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span );
</span><span preg_match_all</span> ( "/[0-9]+/", <span $output</span>, <span $ret</span><span );
</span><span if</span> (! <span $ret</span> [0] [0<span ]) {
</span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ;
}
</span><span return</span> <span $ret</span> [0] [0<span ];
}
</span><span /*</span><span *
* 获取某文件最早版本号
*
* @param $filePath string
*
</span><span */</span>
<span public</span> <span static</span> <span function</span> getFileFirstVersion(<span $filePath</span><span ){
</span><span $command</span> = "sudo svn log {<span $filePath</span>}"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span> , "|grep -i ^r[0-9]* |awk '{print $1}'"<span );
</span><span if</span>(<span empty</span>(<span $output</span><span )){
</span><span return</span> <span false</span><span ;
}
</span><span return</span> <span str_replace</span>("r", '', <span $output</span>[<span count</span>(<span $output</span>)-1<span ]);
}
</span><span /*</span><span *
* 获取两个版本间修改的文件信息列表
*
* @param $fromVersion int
* @param $headRevision int
* @param $$path string
*
* @return array
</span><span */</span>
<span public</span> <span static</span> <span function</span> getChangedFiles(<span $path</span>, <span $fromVersion</span>, <span $headRevision</span><span ){
</span><span $files</span> = <span array</span><span ();
</span><span $pipe</span> = "|grep -i ^Index:|awk -F : '{print $2}'"<span ;
</span><span $command</span> = "svn diff -r {<span $fromVersion</span>}:{<span $headRevision</span>} <span $path</span>"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span> ,<span $pipe</span><span );
</span><span $files</span> = <span array_merge</span>(<span $files</span>, <span $output</span><span );
</span><span $command</span> = "svn diff -r {<span $headRevision</span>}:{<span $fromVersion</span>} <span $path</span>"; <span //</span><span 文件删除可用逆向对比</span>
<span $output</span> = self::runCmd ( <span $command</span> ,<span $pipe</span><span );
</span><span $files</span> = <span array_merge</span>(<span $files</span>, <span $output</span><span );
</span><span return</span> <span array_unique</span>(<span $files</span><span );
}
</span><span /*</span><span *
* 获取两个版本间某文件修改 的内容
*
* @param $filePath string
* @param $fromVersion int
* @param $headRevision int
*
* @return array
</span><span */</span>
<span public</span> <span static</span> <span function</span> getChangedInfo( <span $filePath</span>, <span $fromVersion</span>, <span $headRevision</span><span ){
</span><span $command</span> = "sudo svn diff -r {<span $fromVersion</span>}:{<span $headRevision</span>} <span $filePath</span>"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span return</span> <span $output</span><span ;
}
</span><span /*</span><span *
* 查看文件内容
*
* @param $filePath string
* @param $version int
*
* @return array
</span><span */</span>
<span public</span> <span static</span> <span function</span> getFileContent(<span $filePath</span>, <span $version</span><span ){
</span><span $command</span> = "sudo svn cat -r {<span $version</span>} <span $filePath</span>"<span ;
</span><span $output</span> = self::runCmd ( <span $command</span><span );
</span><span return</span> <span $output</span><span ;
}
</span><span /*</span><span *
* Run a cmd and return result
* @param $command string
* @param $pipe string (可以增加管道对返回数据进行预筛选)
* @return array
</span><span */</span>
<span protected</span> <span static</span> <span function</span> runCmd(<span $command</span> , <span $pipe</span> =""<span ) {
</span><span $authCommand</span> = ' --username ' . self::SVN_USERNAME . ' --password ' . self::SVN_PASSWORD . ' --no-auth-cache --non-interactive --config-dir ' . self::SVN_CONFIG_DIR . '.subversion'<span ;
</span><span exec</span> ( <span $command</span> . <span $authCommand</span> . " 2>&1" . <span $pipe</span>, <span $output</span><span );
</span><span return</span> <span $output</span><span ;
}
}</span>
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号