Page MenuHomePhabricator

D8968.id21272.diff
No OneTemporary

D8968.id21272.diff

diff --git a/src/applications/differential/parser/DifferentialHunkParser.php b/src/applications/differential/parser/DifferentialHunkParser.php
--- a/src/applications/differential/parser/DifferentialHunkParser.php
+++ b/src/applications/differential/parser/DifferentialHunkParser.php
@@ -423,16 +423,41 @@
$lines = phutil_split_lines($lines);
$line_type_map = array();
+ $line_text = array();
foreach ($lines as $line_index => $line) {
if (isset($line[0])) {
$char = $line[0];
- if ($char == ' ') {
- $line_type_map[$line_index] = null;
- } else {
- $line_type_map[$line_index] = $char;
+ switch ($char) {
+ case " ":
+ $line_type_map[$line_index] = null;
+ $line_text[$line_index] = substr($line, 1);
+ break;
+ case "\r":
+ case "\n":
+ // NOTE: Normally, the first character is a space, plus, minus or
+ // backslash, but it may be a newline if it used to be a space and
+ // trailing whitespace has been stripped via email transmission or
+ // some similar mechanism. In these cases, we essentially pretend
+ // the missing space is still there.
+ $line_type_map[$line_index] = null;
+ $line_text[$line_index] = $line;
+ break;
+ case "+":
+ case "-":
+ case "\\":
+ $line_type_map[$line_index] = $char;
+ $line_text[$line_index] = substr($line, 1);
+ break;
+ default:
+ throw new Exception(
+ pht(
+ 'Unexpected leading character "%s" at line index %s!',
+ $char,
+ $line_index));
}
} else {
$line_type_map[$line_index] = null;
+ $line_text[$line_index] = '';
}
}
@@ -444,7 +469,7 @@
$type = $line_type_map[$cursor];
$data = array(
'type' => $type,
- 'text' => (string)substr($lines[$cursor], 1),
+ 'text' => $line_text[$cursor],
'line' => $new_line,
);
if ($type == '\\') {

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 4, 6:05 PM (1 w, 3 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7321410
Default Alt Text
D8968.id21272.diff (2 KB)

Event Timeline