xDiffs and Revisions Generating
Summary: Ref T2903 Test Plan: Revisions and Diffs are visually being generated Reviewers: epriestley, xask.linus Reviewed By: epriestley CC: AnhNhan, aran, Korvin Maniphest Tasks: T2903 Differential Revision: https://secure.phabricator.com/D5835
This commit is contained in:
parent
54b2953dec
commit
6eb82ebfd4
|
@ -899,6 +899,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php',
|
'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php',
|
||||||
'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php',
|
'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php',
|
||||||
'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php',
|
'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php',
|
||||||
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php',
|
||||||
'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php',
|
'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php',
|
||||||
'PhabricatorDirectoryController' => 'applications/directory/controller/PhabricatorDirectoryController.php',
|
'PhabricatorDirectoryController' => 'applications/directory/controller/PhabricatorDirectoryController.php',
|
||||||
'PhabricatorDirectoryMainController' => 'applications/directory/controller/PhabricatorDirectoryMainController.php',
|
'PhabricatorDirectoryMainController' => 'applications/directory/controller/PhabricatorDirectoryMainController.php',
|
||||||
|
@ -1314,7 +1315,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php',
|
'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php',
|
||||||
'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php',
|
'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php',
|
||||||
'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php',
|
'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php',
|
||||||
'PhabricatorRevisionTestDataGenerator' => 'applications/differential/lipsum/PhabricatorRevisionTestDataGenerator.php',
|
|
||||||
'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php',
|
'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php',
|
||||||
'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php',
|
'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php',
|
||||||
'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php',
|
'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php',
|
||||||
|
@ -2638,6 +2638,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector',
|
'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector',
|
||||||
'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
|
'PhabricatorDifferentialRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
||||||
'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
'PhabricatorDirectoryController' => 'PhabricatorController',
|
'PhabricatorDirectoryController' => 'PhabricatorController',
|
||||||
'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController',
|
'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController',
|
||||||
|
@ -3034,7 +3035,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
|
||||||
'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO',
|
'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO',
|
||||||
'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase',
|
'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase',
|
||||||
'PhabricatorRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator',
|
|
||||||
'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine',
|
'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine',
|
||||||
'PhabricatorSSHWorkflow' => 'PhutilArgumentWorkflow',
|
'PhabricatorSSHWorkflow' => 'PhutilArgumentWorkflow',
|
||||||
'PhabricatorSavedQuery' => 'PhabricatorSearchDAO',
|
'PhabricatorSavedQuery' => 'PhabricatorSearchDAO',
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorDifferentialRevisionTestDataGenerator
|
||||||
|
extends PhabricatorTestDataGenerator {
|
||||||
|
|
||||||
|
public function generate() {
|
||||||
|
$author = $this->loadPhabrictorUser();
|
||||||
|
$authorPHID = $author->getPHID();
|
||||||
|
$revision = new DifferentialRevision();
|
||||||
|
$revision->setTitle($this->generateTitle());
|
||||||
|
$revision->setSummary($this->generateDescription());
|
||||||
|
$revision->setTestPlan($this->generateDescription());
|
||||||
|
$revision->loadRelationships();
|
||||||
|
$aux_fields = $this->loadAuxiliaryFields($author, $revision);
|
||||||
|
$diff = $this->generateDiff($author);
|
||||||
|
// Add Diff
|
||||||
|
$editor = new DifferentialRevisionEditor($revision);
|
||||||
|
$editor->setActor($author);
|
||||||
|
$editor->addDiff($diff, $this->generateDescription());
|
||||||
|
$editor->setAuxiliaryFields($aux_fields);
|
||||||
|
$editor->save();
|
||||||
|
// Add Reviewers
|
||||||
|
$editor2 = new DifferentialCommentEditor($revision,
|
||||||
|
DifferentialAction::ACTION_ADDREVIEWERS);
|
||||||
|
$editor2->setActor($author);
|
||||||
|
$editor2->setAddedReviewers($this->getCCPHIDs());
|
||||||
|
$editor2->save();
|
||||||
|
// Add CCs
|
||||||
|
$editor3 = new DifferentialCommentEditor($revision,
|
||||||
|
DifferentialAction::ACTION_ADDCCS);
|
||||||
|
$editor3->setActor($author);
|
||||||
|
$editor3->setAddedCCs($this->getCCPHIDs());
|
||||||
|
$editor3->save();
|
||||||
|
return $revision->save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCCPHIDs() {
|
||||||
|
$ccs = array();
|
||||||
|
for ($i = 0; $i < rand(1, 4);$i++) {
|
||||||
|
$ccs[] = $this->loadPhabrictorUserPHID();
|
||||||
|
}
|
||||||
|
return $ccs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateDiff($author) {
|
||||||
|
$paste_generator = new PhabricatorPasteTestDataGenerator();
|
||||||
|
$languages = $paste_generator->supportedLanguages;
|
||||||
|
$lang = array_rand($languages);
|
||||||
|
$code = $paste_generator->generateContent($lang);
|
||||||
|
$altcode = $paste_generator->generateContent($lang);
|
||||||
|
$newcode = $this->randomlyModify($code, $altcode);
|
||||||
|
$diff = id(new PhabricatorDifferenceEngine())
|
||||||
|
->generateRawDiffFromFileContent($code, $newcode);
|
||||||
|
$call = new ConduitCall(
|
||||||
|
'differential.createrawdiff',
|
||||||
|
array(
|
||||||
|
'diff' => $diff,
|
||||||
|
));
|
||||||
|
$call->setUser($author);
|
||||||
|
$result = $call->execute();
|
||||||
|
$thediff = id(new DifferentialDiff())->load(
|
||||||
|
$result['id']);
|
||||||
|
$thediff->setDescription($this->generateTitle())->save();
|
||||||
|
return $thediff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateDescription() {
|
||||||
|
return id(new PhutilLipsumContextFreeGrammar())
|
||||||
|
->generate(10, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateTitle() {
|
||||||
|
return id(new PhutilLipsumContextFreeGrammar())
|
||||||
|
->generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function randomlyModify($code, $altcode) {
|
||||||
|
$codearr = explode("\n", $code);
|
||||||
|
$altcodearr = explode("\n", $altcode);
|
||||||
|
$no_lines_to_delete = rand(1,
|
||||||
|
min(count($codearr) - 2, 5));
|
||||||
|
$randomlines = array_rand($codearr,
|
||||||
|
count($codearr) - $no_lines_to_delete);
|
||||||
|
$newcode = array();
|
||||||
|
foreach ($randomlines as $lineno) {
|
||||||
|
$newcode[] = $codearr[$lineno];
|
||||||
|
}
|
||||||
|
$newlines_count = rand(2,
|
||||||
|
min(count($codearr) - 2, count($altcodearr) - 2, 5));
|
||||||
|
$randomlines_orig = array_rand($codearr, $newlines_count);
|
||||||
|
$randomlines_new = array_rand($altcodearr, $newlines_count);
|
||||||
|
$newcode2 = array();
|
||||||
|
$c = 0;
|
||||||
|
for ($i = 0; $i < count($newcode);$i++) {
|
||||||
|
$newcode2[] = $newcode[$i];
|
||||||
|
if (in_array($i, $randomlines_orig)) {
|
||||||
|
$newcode2[] = $altcodearr[$randomlines_new[$c++]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return implode($newcode2, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
private function loadAuxiliaryFields($user, DifferentialRevision $revision) {
|
||||||
|
$aux_fields = DifferentialFieldSelector::newSelector()
|
||||||
|
->getFieldSpecifications();
|
||||||
|
foreach ($aux_fields as $key => $aux_field) {
|
||||||
|
$aux_field->setRevision($revision);
|
||||||
|
if (!$aux_field->shouldAppearOnEdit()) {
|
||||||
|
unset($aux_fields[$key]);
|
||||||
|
} else {
|
||||||
|
$aux_field->setUser($user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DifferentialAuxiliaryField::loadFromStorage(
|
||||||
|
$revision,
|
||||||
|
$aux_fields);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,14 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorRevisionTestDataGenerator
|
|
||||||
extends PhabricatorTestDataGenerator {
|
|
||||||
|
|
||||||
public function generate() {
|
|
||||||
try {
|
|
||||||
$revision = new DifferentialRevision();
|
|
||||||
echo id(new PhutilLipsumContextFreeGrammar())->generate();
|
|
||||||
return $revision;
|
|
||||||
} catch (AphrontQueryDuplicateKeyException $ex) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -238,7 +238,6 @@ final class DifferentialRevision extends DifferentialDAO
|
||||||
'SELECT * FROM %T WHERE revisionID = %d ORDER BY sequence',
|
'SELECT * FROM %T WHERE revisionID = %d ORDER BY sequence',
|
||||||
self::RELATIONSHIP_TABLE,
|
self::RELATIONSHIP_TABLE,
|
||||||
$this->getID());
|
$this->getID());
|
||||||
|
|
||||||
return $this->attachRelationships($data);
|
return $this->attachRelationships($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ final class PhabricatorPasteTestDataGenerator
|
||||||
extends PhabricatorTestDataGenerator {
|
extends PhabricatorTestDataGenerator {
|
||||||
|
|
||||||
// Better Support for this in the future
|
// Better Support for this in the future
|
||||||
private $supportedLanguages = array(
|
public $supportedLanguages = array(
|
||||||
"Java" => "java",
|
"Java" => "java",
|
||||||
"PHP" => "php");
|
"PHP" => "php");
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ final class PhabricatorPholioMockTestDataGenerator
|
||||||
$images = newv("PhabricatorFile", array())
|
$images = newv("PhabricatorFile", array())
|
||||||
->loadAllWhere("mimeType = %s", "image/jpeg");
|
->loadAllWhere("mimeType = %s", "image/jpeg");
|
||||||
$rand_images = array();
|
$rand_images = array();
|
||||||
$quantity = rand(1, 10);
|
$quantity = rand(2, 10);
|
||||||
foreach (array_rand($images, $quantity) as $random) {
|
foreach (array_rand($images, $quantity) as $random) {
|
||||||
$rand_images[] = $images[$random]->getPHID();
|
$rand_images[] = $images[$random]->getPHID();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue