33
0
mirror of https://github.com/joomla-extensions/patchtester.git synced 2024-12-22 19:09:00 +00:00

Implement Github labels and NPM filter

Signed-off-by: Roland Dalmulder <contact@rolandd.com>
This commit is contained in:
Roland Dalmulder 2020-07-25 16:16:38 +02:00
parent 409e5d9aa6
commit 5508865fc2
No known key found for this signature in database
GPG Key ID: FD49814C56AE3AF9
9 changed files with 240 additions and 82 deletions

View File

@ -107,6 +107,7 @@ class DisplayController extends AbstractController
$state->set('filter.applied', $app->getUserStateFromRequest($this->context . '.filter.applied', 'filter_applied', ''));
$state->set('filter.branch', $app->getUserStateFromRequest($this->context . '.filter.branch', 'filter_branch', ''));
$state->set('filter.rtc', $app->getUserStateFromRequest($this->context . '.filter.rtc', 'filter_rtc', ''));
$state->set('filter.npm', $app->getUserStateFromRequest($this->context . '.filter.npm', 'filter_npm', ''));
// Pre-fill the limits.
$limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->get('list_limit', 20), 'uint');
@ -128,7 +129,7 @@ class DisplayController extends AbstractController
// The 2nd part will be considered the direction
$direction = $orderingParts[array_key_last($orderingParts)];
if (in_array(strtoupper($direction), array('ASC', 'DESC', '')))
if (in_array(strtoupper($direction), ['ASC', 'DESC', '']))
{
$state->set('list.direction', $direction);
}

View File

@ -63,7 +63,6 @@ class PullsModel extends AbstractModel
*/
public function getBranches()
{
// Create a new query object.
$db = $this->getDb();
$query = $db->getQuery(true);
@ -85,17 +84,32 @@ class PullsModel extends AbstractModel
*/
public function getItems()
{
// Get a storage key.
$store = $this->getStoreId();
// Try to load the data from internal storage.
if (isset($this->cache[$store]))
{
return $this->cache[$store];
}
// Load the list items and add the items to the internal cache.
$this->cache[$store] = $this->getList($this->getListQueryCache(), $this->getStart(), $this->getState()->get('list.limit'));
$items = $this->getList($this->getListQueryCache(), $this->getStart(), $this->getState()->get('list.limit'));
$db = $this->getDb();
$query = $db->getQuery(true)
->select($db->quoteName(['name', 'color']))
->from($db->quoteName('#__patchtester_pulls_labels'));
array_walk(
$items,
static function ($item) use ($db, $query) {
$query->clear('where');
$query->where($db->quoteName('pull_id') . ' = ' . $item->pull_id);
$db->setQuery($query);
$item->labels = $db->loadObjectList();
}
);
$this->cache[$store] = $items;
return $this->cache[$store];
}
@ -146,7 +160,7 @@ class PullsModel extends AbstractModel
if (!empty($applied))
{
// Not applied patches have a NULL value, so build our value part of the query based on this
$value = $applied == 'no' ? ' IS NULL' : ' = 1';
$value = $applied === 'no' ? ' IS NULL' : ' = 1';
$query->where($db->quoteName('applied') . $value);
}
@ -165,11 +179,22 @@ class PullsModel extends AbstractModel
if (!empty($applied))
{
// Not applied patches have a NULL value, so build our value part of the query based on this
$value = $applied == 'no' ? '0' : '1';
$value = $applied === 'no' ? '0' : '1';
$query->where($db->quoteName('is_rtc') . ' = ' . $value);
}
// Filter for NPM patches
$npm = $this->getState()->get('filter.npm');
if (!empty($npm))
{
// Not applied patches have a NULL value, so build our value part of the query based on this
$value = $npm === 'no' ? '0' : '1';
$query->where($db->quoteName('is_npm') . ' = ' . $value);
}
// Handle the list ordering.
$ordering = $this->getState()->get('list.ordering', 'a.pull_id');
$direction = $this->getState()->get('list.direction', 'DESC');
@ -314,6 +339,7 @@ class PullsModel extends AbstractModel
if ($page === 1)
{
$this->getDb()->truncateTable('#__patchtester_pulls');
$this->getDb()->truncateTable('#__patchtester_pulls_labels');
}
try
@ -327,9 +353,9 @@ class PullsModel extends AbstractModel
$pulls = json_decode($pullsResponse->body);
}
catch (UnexpectedResponse $e)
catch (UnexpectedResponse $exception)
{
throw new \RuntimeException(Text::sprintf('COM_PATCHTESTER_ERROR_GITHUB_FETCH', $e->getMessage()), $e->getCode(), $e);
throw new \RuntimeException(Text::sprintf('COM_PATCHTESTER_ERROR_GITHUB_FETCH', $exception->getMessage()), $exception->getCode(), $exception);
}
// If this is page 1, let's check to see if we need to paginate
@ -363,10 +389,11 @@ class PullsModel extends AbstractModel
// If there are no pulls to insert then bail, assume we're finished
if (count($pulls) === 0)
{
return array('complete' => true);
return ['complete' => true];
}
$data = array();
$data = [];
$labels = [];
foreach ($pulls as $pull)
{
@ -374,29 +401,44 @@ class PullsModel extends AbstractModel
{
// Check if this PR is RTC and has a `PR-` branch label
$isRTC = false;
$isNPM = false;
$branch = '';
foreach ($pull->labels as $label)
{
if ($label->name === 'RTC')
if (strtolower($label->name) === 'rtc')
{
$isRTC = true;
}
elseif (substr($label->name, 0, 3) === 'PR-')
elseif (strpos($label->name, 'PR-') === 0)
{
$branch = substr($label->name, 3);
}
elseif (strtolower($label->name) === 'npm resource changed')
{
$isNPM = true;
}
$labels[] = implode(
',',
[
(int) $pull->number,
$this->getDb()->quote($label->name),
$this->getDb()->quote($label->color)
]
);
}
// Build the data object to store in the database
$pullData = array(
$pullData = [
(int) $pull->number,
$this->getDb()->quote(HTMLHelper::_('string.truncate', $pull->title, 150)),
$this->getDb()->quote(HTMLHelper::_('string.truncate', $pull->body, 100)),
$this->getDb()->quote($pull->pull_request->html_url),
(int) $isRTC,
(int) $isNPM,
$this->getDb()->quote($branch),
);
];
$data[] = implode(',', $pullData);
}
@ -411,7 +453,7 @@ class PullsModel extends AbstractModel
$this->getDb()->setQuery(
$this->getDb()->getQuery(true)
->insert('#__patchtester_pulls')
->columns(array('pull_id', 'title', 'description', 'pull_url', 'is_rtc', 'branch'))
->columns(['pull_id', 'title', 'description', 'pull_url', 'is_rtc', 'is_npm', 'branch'])
->values($data)
);
@ -419,13 +461,47 @@ class PullsModel extends AbstractModel
{
$this->getDb()->execute();
}
catch (\RuntimeException $e)
catch (\RuntimeException $exception)
{
throw new \RuntimeException(Text::sprintf('COM_PATCHTESTER_ERROR_INSERT_DATABASE', $e->getMessage()), $e->getCode(), $e);
throw new \RuntimeException(
Text::sprintf(
'COM_PATCHTESTER_ERROR_INSERT_DATABASE',
$exception->getMessage()
),
$exception->getCode(),
$exception
);
}
$this->getDb()->setQuery(
$this->getDb()->getQuery(true)
->insert('#__patchtester_pulls_labels')
->columns(['pull_id', 'name', 'color'])
->values($labels)
);
try
{
$this->getDb()->execute();
}
catch (\RuntimeException $exception)
{
throw new \RuntimeException(
Text::sprintf(
'COM_PATCHTESTER_ERROR_INSERT_DATABASE',
$exception->getMessage()
),
$exception->getCode(),
$exception
);
}
// Need to make another request
return array('complete' => false, 'page' => ($page + 1), 'lastPage' => isset($lastPage) ? $lastPage : false);
return [
'complete' => false,
'page' => ($page + 1),
'lastPage' => $lastPage ?? false
];
}
/**

View File

@ -36,6 +36,7 @@ $listLimit = (int) ($this->state->get('list.limit'));
$filterApplied = $this->escape($this->state->get('filter.applied'));
$filterBranch = $this->escape($this->state->get('filter.branch'));
$filterRtc = $this->escape($this->state->get('filter.rtc'));
$filterNpm = $this->escape($this->state->get('filter.npm'));
$visible = '';
if ($filterApplied || $filterBranch || $filterRtc)
@ -109,6 +110,13 @@ if ($filterApplied || $filterBranch || $filterRtc)
<option value="no"<?php echo $filterRtc === 'no' ? ' selected="selected"' : ''; ?>><?php echo Text::_('COM_PATCHTESTER_NOT_RTC'); ?></option>
</select>
</div>
<div class="js-stools-field-filter">
<select name="filter_npm" class="custom-select" onchange="this.form.submit();">
<option value=""><?php echo Text::_('COM_PATCHTESTER_FILTER_NPM_PATCHES'); ?></option>
<option value="yes"<?php echo $filterNpm === 'yes' ? ' selected="selected"' : ''; ?>><?php echo Text::_('COM_PATCHTESTER_NPM'); ?></option>
<option value="no"<?php echo $filterNpm === 'no' ? ' selected="selected"' : ''; ?>><?php echo Text::_('COM_PATCHTESTER_NOT_NPM'); ?></option>
</select>
</div>
<div class="js-stools-field-filter">
<select name="filter_branch" class="custom-select" onchange="this.form.submit();">
<option value=""><?php echo Text::_('COM_PATCHTESTER_FILTER_BRANCH'); ?></option>

View File

@ -45,6 +45,44 @@ foreach ($this->items as $i => $item) :
</div>
<?php endif; ?>
</div>
<?php if (count($item->labels) > 0) : ?>
<div class="row">
<div class="col-md-auto">
<?php foreach ($item->labels as $label): ?>
<?php
switch (strtolower($label->name))
{
case 'a11y':
case 'conflicting files':
case 'documentation required':
case 'information required':
case 'j3 issue':
case 'language change':
case 'mysql 5.7':
case 'needs new owner':
case 'no code attached yet':
case 'pbf':
case 'pr-3.9-dev':
case 'pr-3.10-dev':
case 'pr-4.1-dev':
case 'pr-i10n_4.0-dev':
case 'pr-staging':
case 'release blocker':
case 'rfc':
case 'test instructions missing':
case 'updates requested':
$textColor = '000000';
break;
default:
$textColor = 'FFFFFF';
break;
}
?>
<span class="badge" style="color: #<?php echo $textColor; ?>; background-color: #<?php echo $label->color; ?>"><?php echo $label->name; ?></span>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
</td>
<td class="d-none d-md-table-cell text-center">
<?php echo $this->escape($item->branch); ?>

View File

@ -1,16 +1,32 @@
CREATE TABLE IF NOT EXISTS `#__patchtester_pulls` (
CREATE TABLE IF NOT EXISTS `#__patchtester_pulls`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`pull_id` int(11) NOT NULL,
`title` varchar(200) NOT NULL,
`description` varchar(150) NOT NULL DEFAULT '',
`pull_url` varchar(255) NOT NULL,
`sha` varchar(40) NOT NULL DEFAULT '',
`title` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`pull_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`sha` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`is_rtc` tinyint(1) NOT NULL DEFAULT 0,
`branch` varchar(255) NOT NULL DEFAULT '',
`in_npm` tinyint(1) DEFAULT 0,
`branch` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `#__patchtester_tests` (
CREATE TABLE IF NOT EXISTS `#__patchtester_pulls_labels`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`pull_id` int(11) NOT NULL,
`name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`color` varchar(6) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `#__patchtester_tests`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`pull_id` int(11) NOT NULL,
`data` longtext NOT NULL,
@ -18,4 +34,6 @@ CREATE TABLE IF NOT EXISTS `#__patchtester_tests` (
`applied` int(11) NOT NULL,
`applied_version` varchar(25) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
DEFAULT COLLATE = utf8mb4_unicode_ci;

View File

@ -1,2 +1,3 @@
DROP TABLE IF EXISTS `#__patchtester_pulls`;
DROP TABLE IF EXISTS `#__patchtester_pulls_labels`;
DROP TABLE IF EXISTS `#__patchtester_tests`;

View File

@ -1,4 +1,5 @@
CREATE TABLE IF NOT EXISTS "#__patchtester_pulls" (
CREATE TABLE IF NOT EXISTS "#__patchtester_pulls"
(
"id" serial NOT NULL,
"pull_id" bigint NOT NULL,
"title" character varying(200) NOT NULL,
@ -6,11 +7,22 @@ CREATE TABLE IF NOT EXISTS "#__patchtester_pulls" (
"pull_url" character varying(255) NOT NULL,
"sha" character varying(40) DEFAULT '' NOT NULL,
"is_rtc" smallint DEFAULT 1 NOT NULL,
"is_npm" smallint DEFAULT 1 NOT NULL,
"branch" character varying(255) DEFAULT '' NOT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "#__patchtester_tests" (
CREATE TABLE IF NOT EXISTS "#__patchtester_pulls_labels"
(
"id" serial NOT NULL,
"pull_id" bigint NOT NULL,
"name" character varying(200) NOT NULL,
"color" character varying(6) NOT NULL,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "#__patchtester_tests"
(
"id" serial NOT NULL,
"pull_id" bigint NOT NULL,
"data" text NOT NULL,

View File

@ -1,2 +1,3 @@
DROP TABLE IF EXISTS "#__patchtester_pulls";
DROP TABLE IF EXISTS "#__patchtester_pulls_labels";
DROP TABLE IF EXISTS "#__patchtester_tests";

View File

@ -38,43 +38,44 @@ COM_PATCHTESTER_FETCH_PAGE_NUMBER="Processing page %s of GitHub data"
COM_PATCHTESTER_FETCH_PAGE_NUMBER_OF_TOTAL="Processing page %1$s of %2$s pages of GitHub data"
COM_PATCHTESTER_FETCH_PROCESSING="Processing data from GitHub"
COM_PATCHTESTER_FETCH_SUCCESSFUL="Successfully retrieved pull requests"
COM_PATCHTESTER_FIELD_GH_AUTH_DESC="Select 'Credentials' to use authentication through your GitHub Username and Password, or 'Token' for a GitHub API Token"
COM_PATCHTESTER_FIELD_GH_AUTH_LABEL="GitHub Authentication Method"
COM_PATCHTESTER_FIELD_GH_AUTH_OPTION_CREDENTIALS="Credentials"
COM_PATCHTESTER_FIELD_GH_AUTH_OPTION_TOKEN="Token"
COM_PATCHTESTER_FIELD_GH_PASSWORD_LABEL="GitHub Account Password"
COM_PATCHTESTER_FIELD_GH_PASSWORD_DESC="Password for the account entered in the 'GitHub Account Username' field. Note that accounts using Two Factor Authentication will not work with username and password authentication.<p><span class=""alert-danger"">GitHub will discontinue the use of username and password on of November 13, 2020 at 4:00 PM UTC. It is highly recommended to use the Token Authentication Method</span></p>"
COM_PATCHTESTER_FIELD_GH_TOKEN_DESC="Use this field to input a GitHub API Token in place of your username and password. Note that this is required if your account has Two Factor Authentication enabled.<p></p>To setup an access token, follow these steps.<ol><li><a href=""https://github.com/settings/tokens/new?description=Joomla%20Patch%20Tester&scopes=public_repo,repo:status"" target=""_blank"">Create a Personal Access Token</a></li><li>Click <span class=""font-weight-bold"">Generate token</span> at the bottom of the page</li><li>At the top in the green bar you will find your access token</li><li>Copy the token by selecting it or clicking on the clipboard</li><li>Paste the token in the <span class=""font-weight-bold"">GitHub Token</span> field above</li><li>Save the changes by clicking the <span class=""font-weight-bold"">Save & Close</span> button at the top</li><li>You can now use the Patch Tester with your token</li></ol><p>You can always revoke access by deleting the Personal access token from the <a href=""https://github.com/settings/tokens"" target=""_blank"">Personal access tokens on Github</a>.</p>"
COM_PATCHTESTER_FIELD_GH_TOKEN_LABEL="GitHub Token"
COM_PATCHTESTER_FIELD_GH_USER_LABEL="GitHub Account Username"
COM_PATCHTESTER_FIELD_GH_USER_DESC="Name of account on GitHub to use to authenticate to the API."
COM_PATCHTESTER_FIELD_ORG_LABEL="Custom Project Owner"
COM_PATCHTESTER_FIELD_ORG_DESC="A username or organisation on GitHub to monitor pull requests for."
COM_PATCHTESTER_FIELD_REPO_LABEL="Custom Project Repository"
COM_PATCHTESTER_FIELD_REPO_DESC="Name of a repository on GitHub to monitor pull requests for."
COM_PATCHTESTER_FIELD_REPOSITORY_DESC="Available Joomla! repositories. Select to autopopulate the organisation and repository fields values."
COM_PATCHTESTER_FIELD_REPOSITORY_LABEL="GitHub Repository"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_JOOMLA_CMS="Joomla! CMS"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_PATCHTESTER="Joomla! Patch Tester Component"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_INSTALL_FROM_WEB="Joomla! Install From Web Plugin"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_WEBLINKS="Joomla! Weblinks Package"
COM_PATCHTESTER_FIELD_REPOSITORY_CUSTOM="Custom"
COM_PATCHTESTER_FIELD_CI_SERVER_NAME="CI Server Address"
COM_PATCHTESTER_FIELD_CI_SERVER_NAME_DESC="Server address for obtaining compiled patches."
COM_PATCHTESTER_FIELD_CI_SERVER_SWITCH="Switch CI Integration"
COM_PATCHTESTER_FIELD_CI_SERVER_SWITCH_DESC="Turn CI integration on or off."
COM_PATCHTESTER_FIELD_CI_SERVER_SWITCH_OPTION_ON="On"
COM_PATCHTESTER_FIELD_CI_SERVER_SWITCH_OPTION_OFF="Off"
COM_PATCHTESTER_FIELDSET_REPOSITORIES_DESC="Configuration Values for GitHub Repository"
COM_PATCHTESTER_FIELDSET_REPOSITORIES_LABEL="GitHub Repository"
COM_PATCHTESTER_FIELD_CI_SERVER_SWITCH_OPTION_ON="On"
COM_PATCHTESTER_FIELD_GH_AUTH_DESC="Select 'Credentials' to use authentication through your GitHub Username and Password, or 'Token' for a GitHub API Token"
COM_PATCHTESTER_FIELD_GH_AUTH_LABEL="GitHub Authentication Method"
COM_PATCHTESTER_FIELD_GH_AUTH_OPTION_CREDENTIALS="Credentials"
COM_PATCHTESTER_FIELD_GH_AUTH_OPTION_TOKEN="Token"
COM_PATCHTESTER_FIELD_GH_PASSWORD_DESC="Password for the account entered in the 'GitHub Account Username' field. Note that accounts using Two Factor Authentication will not work with username and password authentication.<p><span class=""alert-danger"">GitHub will discontinue the use of username and password on of November 13, 2020 at 4:00 PM UTC. It is highly recommended to use the Token Authentication Method</span></p>"
COM_PATCHTESTER_FIELD_GH_PASSWORD_LABEL="GitHub Account Password"
COM_PATCHTESTER_FIELD_GH_TOKEN_DESC="Use this field to input a GitHub API Token in place of your username and password. Note that this is required if your account has Two Factor Authentication enabled.<p></p>To setup an access token, follow these steps.<ol><li><a href=""https://github.com/settings/tokens/new?description=Joomla%20Patch%20Tester&scopes=public_repo,repo:status"" target=""_blank"">Create a Personal Access Token</a></li><li>Click <span class=""font-weight-bold"">Generate token</span> at the bottom of the page</li><li>At the top in the green bar you will find your access token</li><li>Copy the token by selecting it or clicking on the clipboard</li><li>Paste the token in the <span class=""font-weight-bold"">GitHub Token</span> field above</li><li>Save the changes by clicking the <span class=""font-weight-bold"">Save & Close</span> button at the top</li><li>You can now use the Patch Tester with your token</li></ol><p>You can always revoke access by deleting the Personal access token from the <a href=""https://github.com/settings/tokens"" target=""_blank"">Personal access tokens on Github</a>.</p>"
COM_PATCHTESTER_FIELD_GH_TOKEN_LABEL="GitHub Token"
COM_PATCHTESTER_FIELD_GH_USER_DESC="Name of account on GitHub to use to authenticate to the API."
COM_PATCHTESTER_FIELD_GH_USER_LABEL="GitHub Account Username"
COM_PATCHTESTER_FIELD_ORG_DESC="A username or organisation on GitHub to monitor pull requests for."
COM_PATCHTESTER_FIELD_ORG_LABEL="Custom Project Owner"
COM_PATCHTESTER_FIELD_REPO_DESC="Name of a repository on GitHub to monitor pull requests for."
COM_PATCHTESTER_FIELD_REPO_LABEL="Custom Project Repository"
COM_PATCHTESTER_FIELD_REPOSITORY_CUSTOM="Custom"
COM_PATCHTESTER_FIELD_REPOSITORY_DESC="Available Joomla! repositories. Select to autopopulate the organisation and repository fields values."
COM_PATCHTESTER_FIELD_REPOSITORY_LABEL="GitHub Repository"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_INSTALL_FROM_WEB="Joomla! Install From Web Plugin"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_JOOMLA_CMS="Joomla! CMS"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_PATCHTESTER="Joomla! Patch Tester Component"
COM_PATCHTESTER_FIELD_REPOSITORY_OPTION_WEBLINKS="Joomla! Weblinks Package"
COM_PATCHTESTER_FIELDSET_AUTHENTICATION_DESC="Configuration Values for GitHub Authentication"
COM_PATCHTESTER_FIELDSET_AUTHENTICATION_LABEL="GitHub Authentication"
COM_PATCHTESTER_FIELDSET_CI_SETTINGS="CI Server Settings"
COM_PATCHTESTER_FIELDSET_CI_SETTINGS_DESC="Configuration Values for CI Server Patching"
COM_PATCHTESTER_FIELDSET_REPOSITORIES_DESC="Configuration Values for GitHub Repository"
COM_PATCHTESTER_FIELDSET_REPOSITORIES_LABEL="GitHub Repository"
COM_PATCHTESTER_FILE_DELETED_DOES_NOT_EXIST_S="The file marked for deletion does not exist: %s"
COM_PATCHTESTER_FILE_MODIFIED_DOES_NOT_EXIST_S="The file marked for modification does not exist: %s"
COM_PATCHTESTER_FILTER_APPLIED_PATCHES="Filter Applied Patches"
COM_PATCHTESTER_FILTER_BRANCH="Filter Target Branch"
COM_PATCHTESTER_FILTER_NPM_PATCHES="Filter NPM Patches"
COM_PATCHTESTER_FILTER_RTC_PATCHES="Filter RTC Patches"
COM_PATCHTESTER_FILTER_SEARCH_DESCRIPTION="Search the list by title or prefix with 'id:' to search by Pull ID."
COM_PATCHTESTER_GITHUB="GitHub"
@ -85,7 +86,9 @@ 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_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_NPM="Not NPM"
COM_PATCHTESTER_NOT_RTC="Not RTC"
COM_PATCHTESTER_NPM="NPM"
COM_PATCHTESTER_PATCH_BREAKS_SITE="The patch could not be applied because it would break the site. Check the pull request to see if it is up-to-date."
COM_PATCHTESTER_PULL_ID="Pull ID"
COM_PATCHTESTER_PULL_ID_ASC="Pull ID ascending"