<?<span php
</span><span
</span>
<span
class
</span><span SvnUtils {
</span><span
</span>
<span
const
</span> SVN_USERNAME =
"robot"
<span ;
</span><span
</span>
<span
const
</span> SVN_PASSWORD =
"robot2013"
<span ;
</span><span
</span>
<span
const
</span> SVN_CONFIG_DIR =
"/var/tmp/"
<span ;
</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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
$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
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
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
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>