1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-09-20 08:58:55 +02:00

Correctly parse Mercurial output for "hg diff --git" when binary files are

removed

Summary: Mercurial output diverges from git output when binary files are
removed. Parse the Mercurial flavor.

Test Plan:
  - Unit test fails before this change and passes afterward.
  - Removed a binary file in my hg local and successfully "arc diff --only"'d
the change.

NOTE: Git can't apply these patches, and reports:

  $ git apply < ~/Desktop/patch.txt
  error: removal patch leaves file contents
  error: level.png: patch does not apply

Reviewers: Makinde, btrahan, jungejason, nh, tuomaspelkonen, aran

Reviewed By: jungejason

CC: aran, jungejason, Makinde

Differential Revision: 1126
This commit is contained in:
epriestley 2011-11-18 11:03:17 -08:00
parent 0f35d03d29
commit 18773682c7
3 changed files with 26 additions and 0 deletions

View file

@ -620,6 +620,19 @@ class ArcanistDiffParser {
return; return;
} }
// This occurs under "hg diff --git" when a binary file is removed. See
// test case "hg-binary-delete.hgdiff". (I believe it never occurs under
// git, which reports the "files X and /dev/null differ" string above. Git
// can not apply these patches.)
$is_hg_binary_delete = preg_match(
'/^Binary file .* has changed$/',
$line);
if ($is_hg_binary_delete) {
$this->nextNonemptyLine();
$this->markBinary($change);
return;
}
// With "git diff --binary" (not a normal mode, but one users may explicitly // With "git diff --binary" (not a normal mode, but one users may explicitly
// invoke and then, e.g., copy-paste into the web console) or "hg diff // invoke and then, e.g., copy-paste into the web console) or "hg diff
// --git" (normal under hg workflows), we may encounter a literal binary // --git" (normal under hg workflows), we may encounter a literal binary

View file

@ -488,6 +488,16 @@ EOTEXT
ArcanistDiffChangeType::FILE_BINARY, ArcanistDiffChangeType::FILE_BINARY,
$change->getFileType()); $change->getFileType());
break; break;
case 'hg-binary-delete.hgdiff':
$this->assertEqual(1, count($changes));
$change = reset($changes);
$this->assertEqual(
ArcanistDiffChangeType::TYPE_DELETE,
$change->getType());
$this->assertEqual(
ArcanistDiffChangeType::FILE_BINARY,
$change->getFileType());
break;
case 'git-replace-symlink.gitdiff': case 'git-replace-symlink.gitdiff':
$this->assertEqual(1, count($changes)); $this->assertEqual(1, count($changes));
$change = array_shift($changes); $change = array_shift($changes);

View file

@ -0,0 +1,3 @@
diff --git a/binary.png b/binary.png
deleted file mode 100755
Binary file binary.png has changed