mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 14:52:40 +01:00
Decompose TYPE_MULTICOPY changes into a MOVE_HERE plus one or more COPY_HERE
Summary: See T419 for some philosophical musing on this. The "ideal" way to represent these changes is two or more COPY_HERE plus a DELETE, but we can't build the DELETE patch yet. Just turn one of the COPY_HERE changes into a MOVE_HERE. While less idealistic, I think this should always work. Test Plan: This seemed to cleanly apply TenXer D265. TenXer guys, can you confirm that this makes it actually patch correctly? Reviewers: jonathanhester, bizrad6, kdeggelman, jungejason, btrahan Reviewed By: jungejason CC: aran, jonathanhester, jungejason, epriestley Maniphest Tasks: T419 Differential Revision: https://secure.phabricator.com/D1270
This commit is contained in:
parent
ecc8fb13a8
commit
cf00c44cc3
1 changed files with 44 additions and 0 deletions
|
@ -207,6 +207,50 @@ class ArcanistBundle {
|
||||||
public function toGitPatch() {
|
public function toGitPatch() {
|
||||||
$result = array();
|
$result = array();
|
||||||
$changes = $this->getChanges();
|
$changes = $this->getChanges();
|
||||||
|
|
||||||
|
foreach (array_keys($changes) as $multicopy_key) {
|
||||||
|
$multicopy_change = $changes[$multicopy_key];
|
||||||
|
|
||||||
|
$type = $multicopy_change->getType();
|
||||||
|
if ($type != ArcanistDiffChangeType::TYPE_MULTICOPY) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decompose MULTICOPY into one MOVE_HERE and several COPY_HERE because
|
||||||
|
// we need more information than we have in order to build a delete patch
|
||||||
|
// and represent it as a bunch of COPY_HERE plus a delete. For details,
|
||||||
|
// see T419.
|
||||||
|
|
||||||
|
// Basically, MULTICOPY means there are 2 or more corresponding COPY_HERE
|
||||||
|
// changes, so find one of them arbitrariy and turn it into a MOVE_HERE.
|
||||||
|
|
||||||
|
// TODO: We might be able to do this more cleanly after T230 is resolved.
|
||||||
|
|
||||||
|
$decompose_okay = false;
|
||||||
|
foreach ($changes as $change_key => $change) {
|
||||||
|
if ($change->getType() != ArcanistDiffChangeType::TYPE_COPY_HERE) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($change->getOldPath() != $multicopy_change->getCurrentPath()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$decompose_okay = true;
|
||||||
|
$change = clone $change;
|
||||||
|
$change->setType(ArcanistDiffChangeType::TYPE_MOVE_HERE);
|
||||||
|
$changes[$change_key] = $change;
|
||||||
|
|
||||||
|
// The multicopy is now fully represented by MOVE_HERE plus one or more
|
||||||
|
// COPY_HERE, so throw it away.
|
||||||
|
unset($changes[$multicopy_key]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$decompose_okay) {
|
||||||
|
throw new Exception(
|
||||||
|
"Failed to decompose multicopy changeset in order to generate diff.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($changes as $change) {
|
foreach ($changes as $change) {
|
||||||
$type = $change->getType();
|
$type = $change->getType();
|
||||||
$file_type = $change->getFileType();
|
$file_type = $change->getFileType();
|
||||||
|
|
Loading…
Reference in a new issue