33
0
mirror of https://github.com/joomla-extensions/patchtester.git synced 2024-12-23 11:29:00 +00:00

Remove the patch chain Fixed #234

This commit is contained in:
Roland Dalmulder 2020-03-31 20:19:05 +02:00
parent 34e4271a71
commit ab56101511
No known key found for this signature in database
GPG Key ID: FD49814C56AE3AF9
7 changed files with 10 additions and 156 deletions

View File

@ -31,7 +31,7 @@ class ResetController extends AbstractController
* *
* @since 2.0 * @since 2.0
*/ */
public function execute() public function execute(): void
{ {
try try
{ {
@ -43,12 +43,12 @@ class ResetController extends AbstractController
$testsModel = new TestsModel(null, Factory::getDbo()); $testsModel = new TestsModel(null, Factory::getDbo());
// Check the applied patches in the database first // Check the applied patches in the database first
$appliedPatches = $pullModel->getPatchesDividedInProcs(); $appliedPatches = $testsModel->getAppliedPatches();
if (count($appliedPatches['git'])) if (count($appliedPatches['git']))
{ {
// Let's try to cleanly revert all applied patches // Let's try to cleanly revert all applied patches
foreach ($appliedPatches['git'] as $patch) foreach ($appliedPatches as $patch)
{ {
try try
{ {

View File

@ -250,7 +250,7 @@ class PullModel extends AbstractModel
{ {
Folder::delete($tempPath); Folder::delete($tempPath);
Folder::move($backupsPath, $backupsPath . "_failed"); Folder::move($backupsPath, $backupsPath . '_failed');
throw new RuntimeException( throw new RuntimeException(
Text::sprintf('COM_PATCHTESTER_FAILED_APPLYING_PATCH', $file, $exception->getMessage()) Text::sprintf('COM_PATCHTESTER_FAILED_APPLYING_PATCH', $file, $exception->getMessage())
); );
@ -260,10 +260,7 @@ class PullModel extends AbstractModel
// Clear temp folder and store applied patch in database // Clear temp folder and store applied patch in database
Folder::delete($tempPath); Folder::delete($tempPath);
$lastInserted = $this->saveAppliedPatch($id, $files, $sha); $this->saveAppliedPatch($id, $files, $sha);
// Write or create patch chain for correct order of patching
$this->appendPatchChain($lastInserted, $id);
// Remove the autoloader file // Remove the autoloader file
if (file_exists(JPATH_CACHE . '/autoload_psr4.php')) if (file_exists(JPATH_CACHE . '/autoload_psr4.php'))
@ -375,30 +372,6 @@ class PullModel extends AbstractModel
return $insertId; return $insertId;
} }
/**
* Adds a value to the patch chain in the database
*
* @param integer $insertId ID of the patch in the database
* @param integer $pullId ID of the pull request
*
* @return integer $insertId last inserted element
*
* @since 3.0.0
*/
private function appendPatchChain(int $insertId, int $pullId): int
{
$record = (object) array(
'insert_id' => $insertId,
'pull_id' => $pullId,
);
$db = $this->getDb();
$db->insertObject('#__patchtester_chain', $record);
return $db->insertid();
}
/** /**
* Patches the code with the supplied pull request * Patches the code with the supplied pull request
* *
@ -697,42 +670,6 @@ class PullModel extends AbstractModel
return $this->revertWithGitHub($id); return $this->revertWithGitHub($id);
} }
/**
* Returns a chain by specific value, returns the last
* element on $id = -1 and the first on $id = null
*
* @param integer $id specific id of a pull
*
* @return stdClass $chain last chain of the table
*
* @since 3.0.0
*/
private function getPatchChain(int $id = null): stdClass
{
$db = $this->getDb();
$query = $db->getQuery(true)
->select('*')
->from('#__patchtester_chain');
if ($id !== null && $id !== -1)
{
$query = $query->where('insert_id =' . $id);
}
if ($id === -1)
{
$query = $query->order('id DESC');
}
if ($id === null)
{
$query = $query->order('id ASC');
}
return $db->setQuery($query, 0, 1)->loadObject();
}
/** /**
* Reverts the specified pull request with CIServer options * Reverts the specified pull request with CIServer options
* *
@ -750,19 +687,6 @@ class PullModel extends AbstractModel
$testRecord = $this->getTestRecord($id); $testRecord = $this->getTestRecord($id);
// Get PatchChain as array, remove any EOL set by php
$patchChain = $this->getPatchChain(-1);
// Allow only reverts in order of the patch chain
if ((int) $patchChain->insert_id !== $id)
{
throw new RuntimeException(
Text::sprintf('COM_PATCHTESTER_NOT_IN_ORDER_OF_PATCHCHAIN', $patchChain->pull_id)
);
}
$this->removeLastChain($patchChain->insert_id);
// We don't want to restore files from an older version // We don't want to restore files from an older version
if ($testRecord->applied_version !== JVERSION) if ($testRecord->applied_version !== JVERSION)
{ {
@ -864,26 +788,6 @@ class PullModel extends AbstractModel
)->loadObject(); )->loadObject();
} }
/**
* Removes the last value of the chain
*
* @param integer $insertId ID of the patch in the database
*
* @return void
*
* @since 3.0.0
*/
private function removeLastChain(int $insertId): void
{
$db = $this->getDb();
$db->setQuery(
$db->getQuery(true)
->delete('#__patchtester_chain')
->where('insert_id = ' . (int) $insertId)
)->execute();
}
/** /**
* Remove the database record for a test * Remove the database record for a test
* *
@ -1039,51 +943,4 @@ class PullModel extends AbstractModel
return $this->removeTest($testRecord); return $this->removeTest($testRecord);
} }
/**
* Returns a two dimensional array with applied patches
* by the github or ci procedure
*
* @return array two-dimensional array with github patches
* and ci patches
*
* @since 3.0.0
*/
public function getPatchesDividedInProcs(): array
{
$db = $this->getDb();
$appliedByGit = $db->setQuery(
$db->getQuery(true)
->select('tests.id, tests.pull_id')
->from('#__patchtester_tests tests')
->leftJoin('#__patchtester_chain chain', 'tests.id = chain.insert_id')
->where('chain.insert_id IS NULL')
)->loadObjectList('pull_id');
$appliedByCI = $this->getPatchChains();
return array('git' => $appliedByGit, 'ci' => $appliedByCI);
}
/**
* Retrieves a list of patches in chain
*
* @return array List of pull IDs
*
* @since 3.0
*/
private function getPatchChains(): array
{
$db = $this->getDb();
$db->setQuery(
$db->getQuery(true)
->select('*')
->from($db->quoteName('#__patchtester_chain'))
->order('id DESC')
);
return $db->loadObjectList('pull_id');
}
} }

View File

@ -18,11 +18,11 @@ class TestsModel extends AbstractModel
/** /**
* Retrieves a list of applied patches * Retrieves a list of applied patches
* *
* @return mixed * @return array List of applied patches
* *
* @since 2.0 * @since 2.0
*/ */
public function getAppliedPatches() public function getAppliedPatches(): array
{ {
$db = $this->getDb(); $db = $this->getDb();
@ -43,7 +43,7 @@ class TestsModel extends AbstractModel
* *
* @since 2.0 * @since 2.0
*/ */
public function truncateTable() public function truncateTable(): void
{ {
$this->getDb()->truncateTable('#__patchtester_tests'); $this->getDb()->truncateTable('#__patchtester_tests');
} }

View File

@ -87,7 +87,7 @@ class PullsHtmlView extends DefaultHtmlView
$this->envErrors[] = Text::_('COM_PATCHTESTER_REQUIREMENT_OPENSSL'); $this->envErrors[] = Text::_('COM_PATCHTESTER_REQUIREMENT_OPENSSL');
} }
if (!in_array('https', stream_get_wrappers())) if (!in_array('https', stream_get_wrappers(), true))
{ {
$this->envErrors[] = Text::_('COM_PATCHTESTER_REQUIREMENT_HTTPS'); $this->envErrors[] = Text::_('COM_PATCHTESTER_REQUIREMENT_HTTPS');
} }
@ -123,7 +123,7 @@ class PullsHtmlView extends DefaultHtmlView
* *
* @since 2.0 * @since 2.0
*/ */
protected function addToolbar() protected function addToolbar(): void
{ {
ToolbarHelper::title(Text::_('COM_PATCHTESTER'), 'patchtester icon-apply'); ToolbarHelper::title(Text::_('COM_PATCHTESTER'), 'patchtester icon-apply');

View File

@ -85,7 +85,6 @@ COM_PATCHTESTER_NO_CREDENTIALS="In den Optionen wurden noch keine Benutzerdaten
COM_PATCHTESTER_NO_FILES_TO_PATCH="Es sind keine Dateien aus diesem Pull Request zu patchen. Dies kann bedeuten, dass die Dateien des Pull Requests in Ihrer Installation nicht vorhanden sind." COM_PATCHTESTER_NO_FILES_TO_PATCH="Es sind keine Dateien aus diesem Pull Request zu patchen. Dies kann bedeuten, dass die Dateien des Pull Requests in Ihrer Installation nicht vorhanden sind."
COM_PATCHTESTER_NO_ITEMS="Es wurden noch keine Daten von Github abgerufen. Klicken Sie auf 'Daten abrufen' um die aktuellen Daten von Github zu holen." COM_PATCHTESTER_NO_ITEMS="Es wurden noch keine Daten von Github abgerufen. Klicken Sie auf 'Daten abrufen' um die aktuellen Daten von Github zu holen."
COM_PATCHTESTER_NOT_APPLIED="Nicht angewendet" COM_PATCHTESTER_NOT_APPLIED="Nicht angewendet"
COM_PATCHTESTER_NOT_IN_ORDER_OF_PATCHCHAIN="Der Patch kann nicht zurückgesetzt werden, es muss zunächst erstmal der Patch mit der Pull ID %s zurückgesetzt werden."
COM_PATCHTESTER_NOT_RTC="Nicht RTC" COM_PATCHTESTER_NOT_RTC="Nicht RTC"
COM_PATCHTESTER_PULL_ID="Pull-ID" COM_PATCHTESTER_PULL_ID="Pull-ID"
COM_PATCHTESTER_PULL_ID_ASC="Pull-ID aufsteigend" COM_PATCHTESTER_PULL_ID_ASC="Pull-ID aufsteigend"

View File

@ -84,7 +84,6 @@ COM_PATCHTESTER_NO_CREDENTIALS="You have not entered your user credentials in th
COM_PATCHTESTER_NO_FILES_TO_PATCH="There are no files to patch from this pull request. This may mean that the files in the pull request are not present in your installation." COM_PATCHTESTER_NO_FILES_TO_PATCH="There are no files to patch from this pull request. This may mean that the files in the pull request are not present in your installation."
COM_PATCHTESTER_NO_ITEMS="No data has been retrieved from GitHub, please click the 'Fetch Data' button in the toolbar to retrieve the open pull requests." COM_PATCHTESTER_NO_ITEMS="No data has been retrieved from GitHub, please click the 'Fetch Data' button in the toolbar to retrieve the open pull requests."
COM_PATCHTESTER_NOT_APPLIED="Not Applied" COM_PATCHTESTER_NOT_APPLIED="Not Applied"
COM_PATCHTESTER_NOT_IN_ORDER_OF_PATCHCHAIN="You can't revert this patch, you need to revert the patch with the pull id %s first."
COM_PATCHTESTER_NOT_RTC="Not RTC" COM_PATCHTESTER_NOT_RTC="Not RTC"
COM_PATCHTESTER_PULL_ID="Pull ID" COM_PATCHTESTER_PULL_ID="Pull ID"
COM_PATCHTESTER_PULL_ID_ASC="Pull ID ascending" COM_PATCHTESTER_PULL_ID_ASC="Pull ID ascending"

View File

@ -85,7 +85,6 @@ COM_PATCHTESTER_NO_CREDENTIALS="You have not entered your user credentials in th
COM_PATCHTESTER_NO_FILES_TO_PATCH="There are no files to patch from this pull request. This may mean that the files in the pull request are not present in your installation." COM_PATCHTESTER_NO_FILES_TO_PATCH="There are no files to patch from this pull request. This may mean that the files in the pull request are not present in your installation."
COM_PATCHTESTER_NO_ITEMS="No data has been retrieved from GitHub, please click the 'Fetch Data' button in the toolbar to retrieve the open pull requests." COM_PATCHTESTER_NO_ITEMS="No data has been retrieved from GitHub, please click the 'Fetch Data' button in the toolbar to retrieve the open pull requests."
COM_PATCHTESTER_NOT_APPLIED="Not Applied" COM_PATCHTESTER_NOT_APPLIED="Not Applied"
COM_PATCHTESTER_NOT_IN_ORDER_OF_PATCHCHAIN="You can't revert this patch, you need to revert the patch with the pull id %s first."
COM_PATCHTESTER_NOT_RTC="Not RTC" COM_PATCHTESTER_NOT_RTC="Not RTC"
COM_PATCHTESTER_PULL_ID="Pull ID" COM_PATCHTESTER_PULL_ID="Pull ID"
COM_PATCHTESTER_PULL_ID_ASC="Pull ID ascending" COM_PATCHTESTER_PULL_ID_ASC="Pull ID ascending"