Commit: 44706d2e93c7d334710b9f1b202005fea6f9a770
Author: Peter Kokot <[email protected]> Wed, 5 Dec 2018 17:19:08
+0100
Parents: 73062503a65bfa62d5f2f365ee99269225580bb9
Branches: master
Link:
http://git.php.net/?p=web/bugs.git;a=commitdiff;h=44706d2e93c7d334710b9f1b202005fea6f9a770
Log:
Refactor pull requests service class
Changes:
- Class moved to src under App namespace
- Code refactored into repository class and GitHub client for managing
pull requests
- When new pull request is attached to a bug report the info comment is
also added to bug activity as is practice with other activities
already.
Changed paths:
D include/classes/bug_ghpulltracker.php
A src/Repository/PullRequestRepository.php
A src/Utils/GitHub.php
M www/bug.php
M www/gh-pull-add.php
diff --git a/include/classes/bug_ghpulltracker.php
b/include/classes/bug_ghpulltracker.php
deleted file mode 100644
index 6ed0540..0000000
--- a/include/classes/bug_ghpulltracker.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-class Bug_Pulltracker
-{
- private $dbh;
- private $userAgent = 'bugs.php.net Pulltracker';
-
- public function __construct()
- {
- $this->dbh = $GLOBALS['dbh'];
- }
-
- private function getDataFromGithub($repo, $pull_id)
- {
- $ctxt = stream_context_create([
- 'http' => [
- 'ignore_errors' => '1',
- 'user_agent' => $this->userAgent,
- ]
- ]);
- $data =
@json_decode(file_get_contents("https://api.github.com/repos/php/".urlencode($repo).'/pulls/'.((int)$pull_id),
null, $ctxt));
- if (!is_object($data)) {
- return false;
- }
- return $data;
- }
-
- /**
- * Attach a pull request to this bug
- */
- public function attach($bugid, $repo, $pull_id, $developer)
- {
- $data = $this->getDataFromGithub($repo, $pull_id);
-
- if (!$data) {
- throw new \Exception('Failed to retrieve pull request
from GitHub');
- }
-
- $sql = 'INSERT INTO bugdb_pulls
- (bugdb_id, github_repo, github_pull_id,
github_title, github_html_url, developer)
- VALUES (?, ?, ?, ?, ?, ?)
- ';
-
- $arguments = [
- $bugid,
- $repo,
- $pull_id,
- $data->title,
- $data->html_url,
- $developer,
- ];
-
- $this->dbh->prepare($sql)->execute($arguments);
-
- return $data;
- }
-
- /**
- * Remove a pull request from this bug
- */
- public function detach($bugid, $repo, $pull_id)
- {
- $this->dbh->prepare('DELETE FROM bugdb_pulls
- WHERE bugdb_id = ? and github_repo = ? and
github_pull_id = ?')->execute(
- [$bugid, $repo, $pull_id]);
- }
-
- /**
- * Retrieve a listing of all pull requests
- *
- * @param int $bugid
- * @return array
- */
- public function listPulls($bugid)
- {
- $query = '
- SELECT github_repo, github_pull_id, github_title,
github_html_url, developer
- FROM bugdb_pulls
- WHERE bugdb_id = ?
- ORDER BY github_repo, github_pull_id DESC
- ';
-
- return
$this->dbh->prepare($query)->execute([$bugid])->fetchAll(PDO::FETCH_ASSOC);
- }
-}
diff --git a/src/Repository/PullRequestRepository.php
b/src/Repository/PullRequestRepository.php
new file mode 100644
index 0000000..64ab66a
--- /dev/null
+++ b/src/Repository/PullRequestRepository.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Repository;
+
+/**
+ * Repository class for retrieving data from the bugdb_pulls database table.
+ */
+class PullRequestRepository
+{
+ /**
+ * Database handler.
+ */
+ private $dbh;
+
+ /**
+ * Class constructor.
+ */
+ public function __construct($dbh)
+ {
+ $this->dbh = $dbh;
+ }
+
+ /**
+ * Retrieve all pull requests by bug id.
+ *
+ * @param int $bugId
+ * @return array
+ */
+ public function findAllByBugId(int $bugId)
+ {
+ $sql = 'SELECT github_repo, github_pull_id, github_title,
github_html_url, developer
+ FROM bugdb_pulls
+ WHERE bugdb_id = ?
+ ORDER BY github_repo, github_pull_id DESC
+ ';
+
+ return $this->dbh->prepare($sql)->execute([$bugId])->fetchAll();
+ }
+}
diff --git a/src/Utils/GitHub.php b/src/Utils/GitHub.php
new file mode 100644
index 0000000..c551959
--- /dev/null
+++ b/src/Utils/GitHub.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace App\Utils;
+
+/**
+ * GitHub pull requests tracker client.
+ */
+class GitHub
+{
+ /**
+ * Database handler.
+ */
+ private $dbh;
+
+ /**
+ * API URL.
+ */
+ private $url = 'https://api.github.com';
+
+ /**
+ * User agent string when establishing stream context with remote GitHub
URL.
+ */
+ private $userAgent = 'bugs.php.net Pulltracker';
+
+ /**
+ * Username or organization name on GitHub.
+ */
+ private $organization = 'php';
+
+ /**
+ * Class constructor
+ */
+ public function __construct($dbh)
+ {
+ $this->dbh = $dbh;
+ }
+
+ /**
+ * Retrieve data from remote GitHub URL.
+ */
+ private function getDataFromGithub(string $repo, int $pullId)
+ {
+ $context = stream_context_create([
+ 'http' => [
+ 'ignore_errors' => '1',
+ 'user_agent' => $this->userAgent,
+ ]
+ ]);
+
+ $url =
$this->url.'/repos/'.$this->organization.'/'.urlencode($repo).'/pulls/'.$pullId;
+ $data = @json_decode(file_get_contents($url, null, $context));
+
+ if (!is_object($data)) {
+ return false;
+ }
+
+ return $data;
+ }
+
+ /**
+ * Attach a pull request to bug.
+ */
+ public function attach($bugId, $repo, $pullId, $developer)
+ {
+ $data = $this->getDataFromGithub($repo, (int)$pullId);
+
+ if (!$data) {
+ throw new \Exception('Failed to retrieve pull request from
GitHub');
+ }
+
+ $sql = 'INSERT INTO bugdb_pulls
+ (bugdb_id, github_repo, github_pull_id, github_title,
github_html_url, developer)
+ VALUES (?, ?, ?, ?, ?, ?)
+ ';
+
+ $arguments = [
+ $bugId,
+ $repo,
+ $pullId,
+ $data->title,
+ $data->html_url,
+ $developer,
+ ];
+
+ $this->dbh->prepare($sql)->execute($arguments);
+
+ return $data;
+ }
+
+ /**
+ * Remove a pull request from given bug.
+ */
+ public function detach(int $bugId, string $repo, int $pullId)
+ {
+ $sql = 'DELETE FROM bugdb_pulls
+ WHERE bugdb_id = ? AND github_repo = ? AND github_pull_id = ?
+ ';
+
+ $this->dbh->prepare($sql)->execute([$bugId, $repo, $pullId]);
+ }
+}
diff --git a/www/bug.php b/www/bug.php
index e2c6576..c676d13 100644
--- a/www/bug.php
+++ b/www/bug.php
@@ -2,6 +2,7 @@
/* User interface for viewing and editing bug details */
use App\Utils\Captcha;
+use App\Repository\PullRequestRepository;
// Obtain common includes
require_once '../include/prepend.php';
@@ -1085,9 +1086,8 @@ OUTPUT;
}
echo "<p><a href='patch-add.php?bug_id={$bug_id}'>Add a Patch</a></p>";
- require_once "{$ROOT_DIR}/include/classes/bug_ghpulltracker.php";
- $pulltracker = new Bug_Pulltracker();
- $pulls = $pulltracker->listPulls($bug_id);
+ $pullRequestRepository = new PullRequestRepository($dbh);
+ $pulls = $pullRequestRepository->findAllByBugId($bug_id);
echo "<h2>Pull Requests</h2>\n";
require "{$ROOT_DIR}/templates/listpulls.php";
diff --git a/www/gh-pull-add.php b/www/gh-pull-add.php
index 93e147a..c86d4bd 100644
--- a/www/gh-pull-add.php
+++ b/www/gh-pull-add.php
@@ -1,6 +1,8 @@
<?php
+use App\Repository\PullRequestRepository;
use App\Utils\Captcha;
+use App\Utils\GitHub;
// Obtain common includes
require_once '../include/prepend.php';
@@ -50,8 +52,8 @@ if (!$show_bug_info) {
exit;
}
-require_once "{$ROOT_DIR}/include/classes/bug_ghpulltracker.php";
-$pullinfo = new Bug_Pulltracker;
+$pullinfo = new GitHub($dbh);
+$pullRequestRepository = new PullRequestRepository($dbh);
if (isset($_POST['addpull'])) {
$errors = [];
@@ -84,7 +86,7 @@ if (isset($_POST['addpull'])) {
}
} catch (Exception $e) {
- $pulls = $pullinfo->listPulls($bug_id);
+ $pulls =
$pullRequestRepository->findAllByBugId($bug_id);
include "{$ROOT_DIR}/templates/addghpull.php";
exit;
}
@@ -109,12 +111,11 @@ if (isset($_POST['addpull'])) {
}
if (count($errors)) {
- $pulls = $pullinfo->listPulls($bug_id);
+ $pulls = $pullRequestRepository->findAllByBugId($bug_id);
include "{$ROOT_DIR}/templates/addghpull.php";
exit;
}
-/*
// Add a comment to the bug report.
$text = <<<TXT
The following pull request has been associated:
@@ -127,15 +128,16 @@ TXT;
$res = bugs_add_comment($bug_id, $auth_user->email, $auth_user->name,
$text, 'patch');
// Send emails
- mail_bug_updates($buginfo, $buginfo, $auth_user->email, $text, 4,
$bug_id);
- */
- $pulls = $pullinfo->listPulls($bug_id);
+ // TODO: enable also mailing
+ //mail_bug_updates($buginfo, $buginfo, $auth_user->email, $text, 4,
$bug_id);
+
+ $pulls = $pullRequestRepository->findAllByBugId($bug_id);
$errors = [];
include "{$ROOT_DIR}/templates/addghpull.php";
exit;
}
$email = isset($_GET['email']) ? $_GET['email'] : '';
-$pulls = $pullinfo->listPulls($bug_id);
+$pulls = $pullRequestRepository->findAllByBugId($bug_id);
include "{$ROOT_DIR}/templates/addghpull.php";
--
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php