From 88be49fd5fa292a176ea6303f8a8d6585a3ecc33 Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 23 Oct 2011 14:33:53 -0700 Subject: [PATCH] Allow DifferentialDiff to construct proper DifferentialChangeset objects from diffs which add empty files Summary: See T507 and some others. We now parse empty git diffs correctly, but the logic to build DifferentialDiffs out of them leaves the objects with 'null' for $changesets, when it should be array(). Further layers later throw, believing we have not loaded the changesets, when we actually have, there just aren't any. Test Plan: Viewed rJX05d493e17fbbb29f29e4880be6834d1d7415374e in Diffusion, which adds an empty README file. No exception thrown. Reviewers: jungejason, nh, tuomaspelkonen, aran Reviewed By: nh CC: aran, nh Differential Revision: 1038 --- .../storage/diff/DifferentialDiff.php | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/applications/differential/storage/diff/DifferentialDiff.php b/src/applications/differential/storage/diff/DifferentialDiff.php index 310ca810eb..f3940873cd 100644 --- a/src/applications/differential/storage/diff/DifferentialDiff.php +++ b/src/applications/differential/storage/diff/DifferentialDiff.php @@ -114,17 +114,23 @@ class DifferentialDiff extends DifferentialDAO { $changeset = new DifferentialChangeset(); $add_lines = 0; $del_lines = 0; - foreach ($change->getHunks() as $hunk) { - $dhunk = new DifferentialHunk(); - $dhunk->setOldOffset($hunk->getOldOffset()); - $dhunk->setOldLen($hunk->getOldLength()); - $dhunk->setNewOffset($hunk->getNewOffset()); - $dhunk->setNewLen($hunk->getNewLength()); - $dhunk->setChanges($hunk->getCorpus()); - $changeset->addUnsavedHunk($dhunk); - $add_lines += $hunk->getAddLines(); - $del_lines += $hunk->getDelLines(); - $lines += $add_lines + $del_lines; + $hunks = $change->getHunks(); + if ($hunks) { + foreach ($hunks as $hunk) { + $dhunk = new DifferentialHunk(); + $dhunk->setOldOffset($hunk->getOldOffset()); + $dhunk->setOldLen($hunk->getOldLength()); + $dhunk->setNewOffset($hunk->getNewOffset()); + $dhunk->setNewLen($hunk->getNewLength()); + $dhunk->setChanges($hunk->getCorpus()); + $changeset->addUnsavedHunk($dhunk); + $add_lines += $hunk->getAddLines(); + $del_lines += $hunk->getDelLines(); + $lines += $add_lines + $del_lines; + } + } else { + // This happens when you add empty files. + $changeset->attachHunks(array()); } $changeset->setOldFile($change->getOldPath());