2011-01-24 20:01:53 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
2012-01-09 20:42:37 +01:00
|
|
|
* Copyright 2012 Facebook, Inc.
|
2011-01-24 20:01:53 +01:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
class DifferentialDiff extends DifferentialDAO {
|
|
|
|
|
|
|
|
protected $revisionID;
|
2011-01-30 19:37:36 +01:00
|
|
|
protected $authorPHID;
|
2011-01-24 20:01:53 +01:00
|
|
|
|
|
|
|
protected $sourceMachine;
|
|
|
|
protected $sourcePath;
|
|
|
|
|
|
|
|
protected $sourceControlSystem;
|
|
|
|
protected $sourceControlBaseRevision;
|
|
|
|
protected $sourceControlPath;
|
|
|
|
|
|
|
|
protected $lintStatus;
|
|
|
|
protected $unitStatus;
|
|
|
|
|
|
|
|
protected $lineCount;
|
|
|
|
|
|
|
|
protected $branch;
|
|
|
|
|
|
|
|
protected $parentRevisionID;
|
2011-04-06 05:49:31 +02:00
|
|
|
protected $arcanistProjectPHID;
|
2011-01-24 20:01:53 +01:00
|
|
|
protected $creationMethod;
|
2011-04-06 05:49:31 +02:00
|
|
|
protected $repositoryUUID;
|
2011-01-24 20:01:53 +01:00
|
|
|
|
2011-02-05 02:53:14 +01:00
|
|
|
protected $description;
|
|
|
|
|
2011-01-24 20:36:53 +01:00
|
|
|
private $unsavedChangesets = array();
|
2011-01-25 00:52:35 +01:00
|
|
|
private $changesets;
|
2011-01-24 20:36:53 +01:00
|
|
|
|
|
|
|
public function addUnsavedChangeset(DifferentialChangeset $changeset) {
|
2011-01-25 00:52:35 +01:00
|
|
|
if ($this->changesets === null) {
|
|
|
|
$this->changesets = array();
|
|
|
|
}
|
2011-01-24 20:36:53 +01:00
|
|
|
$this->unsavedChangesets[] = $changeset;
|
2011-01-25 00:52:35 +01:00
|
|
|
$this->changesets[] = $changeset;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function attachChangesets(array $changesets) {
|
|
|
|
$this->changesets = $changesets;
|
2011-01-24 20:36:53 +01:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2011-01-25 00:52:35 +01:00
|
|
|
public function getChangesets() {
|
|
|
|
if ($this->changesets === null) {
|
|
|
|
throw new Exception("Must load and attach changesets first!");
|
|
|
|
}
|
|
|
|
return $this->changesets;
|
|
|
|
}
|
|
|
|
|
2011-01-24 20:01:53 +01:00
|
|
|
public function loadChangesets() {
|
|
|
|
if (!$this->getID()) {
|
|
|
|
return array();
|
|
|
|
}
|
|
|
|
return id(new DifferentialChangeset())->loadAllWhere(
|
|
|
|
'diffID = %d',
|
|
|
|
$this->getID());
|
|
|
|
}
|
|
|
|
|
2011-09-14 19:59:52 +02:00
|
|
|
public function loadArcanistProject() {
|
|
|
|
if (!$this->getArcanistProjectPHID()) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return id(new PhabricatorRepositoryArcanistProject())->loadOneWhere(
|
|
|
|
'phid = %s',
|
|
|
|
$this->getArcanistProjectPHID());
|
|
|
|
}
|
|
|
|
|
2011-01-24 20:36:53 +01:00
|
|
|
public function save() {
|
|
|
|
// TODO: sort out transactions
|
|
|
|
// $this->openTransaction();
|
|
|
|
$ret = parent::save();
|
|
|
|
foreach ($this->unsavedChangesets as $changeset) {
|
2011-01-24 21:07:34 +01:00
|
|
|
$changeset->setDiffID($this->getID());
|
|
|
|
$changeset->save();
|
2011-01-24 20:36:53 +01:00
|
|
|
}
|
|
|
|
// $this->saveTransaction();
|
|
|
|
return $ret;
|
|
|
|
}
|
|
|
|
|
2011-01-24 20:01:53 +01:00
|
|
|
public function delete() {
|
2011-01-24 20:36:53 +01:00
|
|
|
// $this->openTransaction();
|
2011-01-24 20:01:53 +01:00
|
|
|
foreach ($this->loadChangesets() as $changeset) {
|
|
|
|
$changeset->delete();
|
|
|
|
}
|
|
|
|
$ret = parent::delete();
|
2011-01-24 20:36:53 +01:00
|
|
|
// $this->saveTransaction();
|
2011-01-24 20:01:53 +01:00
|
|
|
return $ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function newFromRawChanges(array $changes) {
|
|
|
|
$diff = new DifferentialDiff();
|
|
|
|
|
|
|
|
$lines = 0;
|
|
|
|
foreach ($changes as $change) {
|
|
|
|
$changeset = new DifferentialChangeset();
|
|
|
|
$add_lines = 0;
|
|
|
|
$del_lines = 0;
|
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
2011-10-23 23:33:53 +02:00
|
|
|
$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());
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
$changeset->setOldFile($change->getOldPath());
|
|
|
|
$changeset->setFilename($change->getCurrentPath());
|
|
|
|
$changeset->setChangeType($change->getType());
|
|
|
|
|
|
|
|
$changeset->setFileType($change->getFileType());
|
|
|
|
$changeset->setMetadata($change->getAllMetadata());
|
|
|
|
$changeset->setOldProperties($change->getOldProperties());
|
|
|
|
$changeset->setNewProperties($change->getNewProperties());
|
|
|
|
$changeset->setAwayPaths($change->getAwayPaths());
|
|
|
|
$changeset->setAddLines($add_lines);
|
|
|
|
$changeset->setDelLines($del_lines);
|
|
|
|
|
2011-01-24 20:36:53 +01:00
|
|
|
$diff->addUnsavedChangeset($changeset);
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
$diff->setLineCount($lines);
|
|
|
|
|
|
|
|
return $diff;
|
|
|
|
}
|
|
|
|
|
2011-10-14 21:08:31 +02:00
|
|
|
public function getDiffDict() {
|
|
|
|
$dict = array(
|
|
|
|
'id' => $this->getID(),
|
|
|
|
'parent' => $this->getParentRevisionID(),
|
|
|
|
'revisionID' => $this->getRevisionID(),
|
|
|
|
'sourceControlBaseRevision' => $this->getSourceControlBaseRevision(),
|
|
|
|
'sourceControlPath' => $this->getSourceControlPath(),
|
2012-01-09 20:42:37 +01:00
|
|
|
'sourceControlSystem' => $this->getSourceControlSystem(),
|
|
|
|
'branch' => $this->getBranch(),
|
2011-10-14 21:08:31 +02:00
|
|
|
'unitStatus' => $this->getUnitStatus(),
|
|
|
|
'lintStatus' => $this->getLintStatus(),
|
|
|
|
'changes' => array(),
|
|
|
|
'properties' => array(),
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach ($this->getChangesets() as $changeset) {
|
|
|
|
$hunks = array();
|
|
|
|
foreach ($changeset->getHunks() as $hunk) {
|
|
|
|
$hunks[] = array(
|
|
|
|
'oldOffset' => $hunk->getOldOffset(),
|
|
|
|
'newOffset' => $hunk->getNewOffset(),
|
|
|
|
'oldLength' => $hunk->getOldLen(),
|
|
|
|
'newLength' => $hunk->getNewLen(),
|
|
|
|
'addLines' => null,
|
|
|
|
'delLines' => null,
|
|
|
|
'isMissingOldNewline' => null,
|
|
|
|
'isMissingNewNewline' => null,
|
|
|
|
'corpus' => $hunk->getChanges(),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$change = array(
|
|
|
|
'metadata' => $changeset->getMetadata(),
|
|
|
|
'oldPath' => $changeset->getOldFile(),
|
2012-01-17 08:05:44 +01:00
|
|
|
'currentPath' => $changeset->getFilename(),
|
2011-10-14 21:08:31 +02:00
|
|
|
'awayPaths' => $changeset->getAwayPaths(),
|
|
|
|
'oldProperties' => $changeset->getOldProperties(),
|
|
|
|
'newProperties' => $changeset->getNewProperties(),
|
|
|
|
'type' => $changeset->getChangeType(),
|
|
|
|
'fileType' => $changeset->getFileType(),
|
|
|
|
'commitHash' => null,
|
2011-12-14 20:52:28 +01:00
|
|
|
'addLines' => $changeset->getAddLines(),
|
|
|
|
'delLines' => $changeset->getDelLines(),
|
2011-10-14 21:08:31 +02:00
|
|
|
'hunks' => $hunks,
|
|
|
|
);
|
|
|
|
$dict['changes'][] = $change;
|
|
|
|
}
|
|
|
|
|
|
|
|
$properties = id(new DifferentialDiffProperty())->loadAllWhere(
|
|
|
|
'diffID = %d',
|
|
|
|
$this->getID());
|
|
|
|
foreach ($properties as $property) {
|
|
|
|
$dict['properties'][$property->getName()] = $property->getData();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $dict;
|
|
|
|
}
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|