mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-22 05:20:56 +01:00
Improve performance of generating synthetic changesets
Summary: Ref T7776. This could get better, but I think I got most of the big stuff. It's ~4x faster now. Test Plan: Before: {F393338} After: {F393339} Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7776 Differential Revision: https://secure.phabricator.com/D12730
This commit is contained in:
parent
97d011d985
commit
abe28e628a
2 changed files with 42 additions and 15 deletions
|
@ -418,9 +418,7 @@ final class DifferentialHunkParser {
|
||||||
$old_lines = array();
|
$old_lines = array();
|
||||||
$new_lines = array();
|
$new_lines = array();
|
||||||
foreach ($hunks as $hunk) {
|
foreach ($hunks as $hunk) {
|
||||||
|
$lines = $hunk->getSplitLines();
|
||||||
$lines = $hunk->getChanges();
|
|
||||||
$lines = phutil_split_lines($lines);
|
|
||||||
|
|
||||||
$line_type_map = array();
|
$line_type_map = array();
|
||||||
$line_text = array();
|
$line_text = array();
|
||||||
|
@ -514,22 +512,32 @@ final class DifferentialHunkParser {
|
||||||
// Put changes side by side.
|
// Put changes side by side.
|
||||||
$olds = array();
|
$olds = array();
|
||||||
$news = array();
|
$news = array();
|
||||||
|
$olds_cursor = -1;
|
||||||
|
$news_cursor = -1;
|
||||||
foreach ($changeset_hunks as $hunk) {
|
foreach ($changeset_hunks as $hunk) {
|
||||||
$n_old = $hunk->getOldOffset();
|
$n_old = $hunk->getOldOffset();
|
||||||
$n_new = $hunk->getNewOffset();
|
$n_new = $hunk->getNewOffset();
|
||||||
$changes = phutil_split_lines($hunk->getChanges());
|
$changes = $hunk->getSplitLines();
|
||||||
foreach ($changes as $line) {
|
foreach ($changes as $line) {
|
||||||
$diff_type = $line[0]; // Change type in diff of diffs.
|
$diff_type = $line[0]; // Change type in diff of diffs.
|
||||||
$orig_type = $line[1]; // Change type in the original diff.
|
$orig_type = $line[1]; // Change type in the original diff.
|
||||||
if ($diff_type == ' ') {
|
if ($diff_type == ' ') {
|
||||||
// Use the same key for lines that are next to each other.
|
// Use the same key for lines that are next to each other.
|
||||||
$key = max(last_key($olds), last_key($news)) + 1;
|
if ($olds_cursor > $news_cursor) {
|
||||||
|
$key = $olds_cursor + 1;
|
||||||
|
} else {
|
||||||
|
$key = $news_cursor + 1;
|
||||||
|
}
|
||||||
$olds[$key] = null;
|
$olds[$key] = null;
|
||||||
$news[$key] = null;
|
$news[$key] = null;
|
||||||
|
$olds_cursor = $key;
|
||||||
|
$news_cursor = $key;
|
||||||
} else if ($diff_type == '-') {
|
} else if ($diff_type == '-') {
|
||||||
$olds[] = array($n_old, $orig_type);
|
$olds[] = array($n_old, $orig_type);
|
||||||
|
$olds_cursor++;
|
||||||
} else if ($diff_type == '+') {
|
} else if ($diff_type == '+') {
|
||||||
$news[] = array($n_new, $orig_type);
|
$news[] = array($n_new, $orig_type);
|
||||||
|
$news_cursor++;
|
||||||
}
|
}
|
||||||
if (($diff_type == '-' || $diff_type == ' ') && $orig_type != '-') {
|
if (($diff_type == '-' || $diff_type == ' ') && $orig_type != '-') {
|
||||||
$n_old++;
|
$n_old++;
|
||||||
|
@ -660,11 +668,15 @@ final class DifferentialHunkParser {
|
||||||
$offsets = array();
|
$offsets = array();
|
||||||
$n = 1;
|
$n = 1;
|
||||||
foreach ($hunks as $hunk) {
|
foreach ($hunks as $hunk) {
|
||||||
for ($i = 0; $i < $hunk->getNewLen(); $i++) {
|
$new_length = $hunk->getNewLen();
|
||||||
$offsets[$n] = $hunk->getNewOffset() + $i;
|
$new_offset = $hunk->getNewOffset();
|
||||||
|
|
||||||
|
for ($i = 0; $i < $new_length; $i++) {
|
||||||
|
$offsets[$n] = $new_offset + $i;
|
||||||
$n++;
|
$n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $offsets;
|
return $offsets;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ abstract class DifferentialHunk extends DifferentialDAO
|
||||||
protected $newLen;
|
protected $newLen;
|
||||||
|
|
||||||
private $changeset;
|
private $changeset;
|
||||||
|
private $splitLines;
|
||||||
private $structuredLines;
|
private $structuredLines;
|
||||||
private $structuredFiles = array();
|
private $structuredFiles = array();
|
||||||
|
|
||||||
|
@ -109,9 +110,16 @@ abstract class DifferentialHunk extends DifferentialDAO
|
||||||
return $this->structuredFiles[$kind];
|
return $this->structuredFiles[$kind];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSplitLines() {
|
||||||
|
if ($this->splitLines === null) {
|
||||||
|
$this->splitLines = phutil_split_lines($this->getChanges());
|
||||||
|
}
|
||||||
|
return $this->splitLines;
|
||||||
|
}
|
||||||
|
|
||||||
private function getStructuredLines() {
|
private function getStructuredLines() {
|
||||||
if ($this->structuredLines === null) {
|
if ($this->structuredLines === null) {
|
||||||
$lines = phutil_split_lines($this->getChanges());
|
$lines = $this->getSplitLines();
|
||||||
|
|
||||||
$structured = array();
|
$structured = array();
|
||||||
foreach ($lines as $line) {
|
foreach ($lines as $line) {
|
||||||
|
@ -154,13 +162,20 @@ abstract class DifferentialHunk extends DifferentialDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
final private function makeContent($include) {
|
final private function makeContent($include) {
|
||||||
|
$lines = $this->getSplitLines();
|
||||||
$results = array();
|
$results = array();
|
||||||
$lines = explode("\n", $this->getChanges());
|
|
||||||
|
|
||||||
|
$include_map = array();
|
||||||
|
for ($ii = 0; $ii < strlen($include); $ii++) {
|
||||||
|
$include_map[$include[$ii]] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($include_map['+'])) {
|
||||||
|
$n = $this->newOffset;
|
||||||
|
} else {
|
||||||
|
$n = $this->oldOffset;
|
||||||
|
}
|
||||||
|
|
||||||
$n = (strpos($include, '+') !== false ?
|
|
||||||
$this->newOffset :
|
|
||||||
$this->oldOffset);
|
|
||||||
$use_next_newline = false;
|
$use_next_newline = false;
|
||||||
foreach ($lines as $line) {
|
foreach ($lines as $line) {
|
||||||
if (!isset($line[0])) {
|
if (!isset($line[0])) {
|
||||||
|
@ -171,14 +186,14 @@ abstract class DifferentialHunk extends DifferentialDAO
|
||||||
if ($use_next_newline) {
|
if ($use_next_newline) {
|
||||||
$results[last_key($results)] = rtrim(end($results), "\n");
|
$results[last_key($results)] = rtrim(end($results), "\n");
|
||||||
}
|
}
|
||||||
} else if (strpos($include, $line[0]) === false) {
|
} else if (empty($include_map[$line[0]])) {
|
||||||
$use_next_newline = false;
|
$use_next_newline = false;
|
||||||
} else {
|
} else {
|
||||||
$use_next_newline = true;
|
$use_next_newline = true;
|
||||||
$results[$n] = substr($line, 1)."\n";
|
$results[$n] = substr($line, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($line[0] == ' ' || strpos($include, $line[0]) !== false) {
|
if ($line[0] == ' ' || isset($include_map[$line[0]])) {
|
||||||
$n++;
|
$n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue