| return self::shell_exec('IDF_Scm_Svn::getDiff', $cmd);␊ |
| }␊ |
| ␊ |
| /**␊ |
| * @see IDF_Scm::getChanges()␊ |
| */␊ |
| public function getChanges($commit)␊ |
| {␊ |
| if ($this->validateRevision($commit) != IDF_Scm::REVISION_VALID) {␊ |
| return null;␊ |
| }␊ |
| $cmd = sprintf(Pluf::f('svn_path', 'svn').' log --xml -v --no-auth-cache -r %s --username=%s --password=%s %s',␊ |
| escapeshellarg($commit),␊ |
| escapeshellarg($this->username),␊ |
| escapeshellarg($this->password),␊ |
| escapeshellarg($this->repo));␊ |
| $out = array();␊ |
| $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;␊ |
| $out = self::shell_exec('IDF_Scm_Svn::getChanges', $cmd);␊ |
| $xml = simplexml_load_string($out);␊ |
| if (count($xml) == 0) {␊ |
| return null;␊ |
| }␊ |
| $entry = current($xml);␊ |
| ␊ |
| $return = (object) array(␊ |
| 'additions' => array(),␊ |
| 'deletions' => array(),␊ |
| 'patches' => array(),␊ |
| // while SVN has support for attributes, we cannot see their changes␊ |
| // in the log's XML unfortunately␊ |
| 'properties' => array(),␊ |
| 'copies' => array(),␊ |
| 'renames' => array(),␊ |
| );␊ |
| ␊ |
| foreach ($entry->paths->path as $p) {␊ |
| $path = (string) $p;␊ |
| foreach ($p->attributes() as $k => $v) {␊ |
| $key = (string) $k;␊ |
| $val = (string) $v;␊ |
| if ($key != 'action')␊ |
| continue;␊ |
| if ($val == 'M')␊ |
| $return->patches[] = $path;␊ |
| else if ($val == 'A')␊ |
| $return->additions[] = $path;␊ |
| else if ($val == 'D')␊ |
| $return->deletions[] = $path;␊ |
| }␊ |
| }␊ |
| ␊ |
| // copies are treated as renames if they have an add _and_ a drop;␊ |
| // only if they only have an add, but no drop, they're treated as copies␊ |
| foreach ($xml->paths as $path) {␊ |
| $trg = (string) $path;␊ |
| $src = null;␊ |
| foreach ($path->attributes() as $k => $v) {␊ |
| if ((string) $k == 'copyfrom-path') {␊ |
| $src = (string) $v;␊ |
| break;␊ |
| }␊ |
| }␊ |
| ␊ |
| if ($src == null)␊ |
| continue;␊ |
| ␊ |
| $srcidx = array_search($src, $return->deletions);␊ |
| $trgidx = array_search($trg, $return->additions);␊ |
| if ($srcidx !== false && $trgidx !== false) {␊ |
| $return->renames[$src] = $trg;␊ |
| unset($return->deletions[$srcidx]);␊ |
| unset($return->additions[$trgidx]);␊ |
| continue;␊ |
| }␊ |
| if ($srcidx === false && $trgidx !== false) {␊ |
| $return->copies[$src] = $trg;␊ |
| unset($return->additions[$trgidx]);␊ |
| continue;␊ |
| }␊ |
| // file sutures (counter-operation to copy) not supported␊ |
| }␊ |
| ␊ |
| return $return;␊ |
| }␊ |
| ␊ |
| /**␊ |
| * Get latest changes.␊ |