diff --git a/src/parser/ArcanistDiffParser.php b/src/parser/ArcanistDiffParser.php index 3116570d..54a40361 100644 --- a/src/parser/ArcanistDiffParser.php +++ b/src/parser/ArcanistDiffParser.php @@ -116,8 +116,9 @@ final class ArcanistDiffParser { $root = $rinfo['URL'].'/'; } $cpath = $info['Copied From URL']; - $cpath = substr($cpath, strlen($root)); - if ($info['Copied From Rev']) { + $root_len = strlen($root); + if (!strncmp($cpath, $root, $root_len)) { + $cpath = substr($cpath, $root_len); // The user can "svn cp /path/to/file@12345 x", which pulls a file out // of version history at a specific revision. If we just use the path, // we'll collide with possible changes to that path in the working @@ -129,13 +130,17 @@ final class ArcanistDiffParser { // TODO: In theory, you could have an '@' in your path and this could // cause a collision, e.g. two files named 'f' and 'f@12345'. This is // at least somewhat the user's fault, though. - if ($info['Copied From Rev'] != $info['Revision']) { - $cpath .= '@'.$info['Copied From Rev']; + if ($info['Copied From Rev']) { + if ($info['Copied From Rev'] != $info['Revision']) { + $cpath .= '@'.$info['Copied From Rev']; + } } + $change->setOldPath($cpath); + $from[$path] = $cpath; } - $change->setOldPath($cpath); - - $from[$path] = $cpath; + } else { + // file was merged from another branch, treat it as a new file + $change->setType(ArcanistDiffChangeType::TYPE_ADD); } $type = $change->getType(); if (($type === ArcanistDiffChangeType::TYPE_MOVE_AWAY ||