mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-02-17 01:08:40 +01:00
Properly handle file moves in arc patch
under SVN
Summary: If the file has no changes (probably because it has been moved or copied) then we fail. Fixes T1708, fixes T1559. Test Plan: $ svn mv a b $ arc diff --only $ svn revert a b $ arc patch --diff # of created diff Reviewers: epriestley, btrahan Reviewed By: btrahan CC: aran, Korvin Maniphest Tasks: T1559, T1708 Differential Revision: https://secure.phabricator.com/D3526
This commit is contained in:
parent
6929f4e57e
commit
6bd2b372f5
2 changed files with 29 additions and 13 deletions
|
@ -212,6 +212,11 @@ final class ArcanistBundle {
|
||||||
$changes = $this->getChanges();
|
$changes = $this->getChanges();
|
||||||
foreach ($changes as $change) {
|
foreach ($changes as $change) {
|
||||||
|
|
||||||
|
$hunk_changes = $this->buildHunkChanges($change->getHunks());
|
||||||
|
if (!$hunk_changes) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$old_path = $this->getOldPath($change);
|
$old_path = $this->getOldPath($change);
|
||||||
$cur_path = $this->getCurrentPath($change);
|
$cur_path = $this->getCurrentPath($change);
|
||||||
|
|
||||||
|
@ -245,7 +250,11 @@ final class ArcanistBundle {
|
||||||
$result[] = '--- '.$old_path;
|
$result[] = '--- '.$old_path;
|
||||||
$result[] = '+++ '.$cur_path;
|
$result[] = '+++ '.$cur_path;
|
||||||
|
|
||||||
$result[] = $this->buildHunkChanges($change->getHunks());
|
$result[] = $hunk_changes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$result) {
|
||||||
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$diff = implode("\n", $result)."\n";
|
$diff = implode("\n", $result)."\n";
|
||||||
|
|
|
@ -532,10 +532,8 @@ EOTEXT
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ($should_patch) {
|
if ($should_patch) {
|
||||||
if ($change->getHunks()) {
|
$cbundle = ArcanistBundle::newFromChanges(array($change));
|
||||||
$cbundle = ArcanistBundle::newFromChanges(array($change));
|
$patches[$change->getCurrentPath()] = $cbundle->toUnifiedDiff();
|
||||||
$patches[$change->getCurrentPath()] = $cbundle->toUnifiedDiff();
|
|
||||||
}
|
|
||||||
$prop_old = $change->getOldProperties();
|
$prop_old = $change->getOldProperties();
|
||||||
$prop_new = $change->getNewProperties();
|
$prop_new = $change->getNewProperties();
|
||||||
$props = $prop_old + $prop_new;
|
$props = $prop_old + $prop_new;
|
||||||
|
@ -601,15 +599,24 @@ EOTEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($patches as $path => $patch) {
|
foreach ($patches as $path => $patch) {
|
||||||
$tmp = new TempFile();
|
|
||||||
Filesystem::writeFile($tmp, $patch);
|
|
||||||
$err = null;
|
$err = null;
|
||||||
passthru(
|
if ($patch) {
|
||||||
csprintf(
|
$tmp = new TempFile();
|
||||||
'(cd %s; patch -p0 < %s)',
|
Filesystem::writeFile($tmp, $patch);
|
||||||
$repository_api->getPath(),
|
passthru(
|
||||||
$tmp),
|
csprintf(
|
||||||
$err);
|
'(cd %s; patch -p0 < %s)',
|
||||||
|
$repository_api->getPath(),
|
||||||
|
$tmp),
|
||||||
|
$err);
|
||||||
|
} else {
|
||||||
|
passthru(
|
||||||
|
csprintf(
|
||||||
|
'(cd %s; touch %s)',
|
||||||
|
$repository_api->getPath(),
|
||||||
|
$path),
|
||||||
|
$err);
|
||||||
|
}
|
||||||
if ($err) {
|
if ($err) {
|
||||||
$patch_err = max($patch_err, $err);
|
$patch_err = max($patch_err, $err);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue