add support of github

This commit is contained in:
arcan1s
2014-07-27 22:50:18 +04:00
parent 04f998554d
commit 800bb7375b
5 changed files with 162 additions and 10 deletions

View File

@ -25,7 +25,7 @@ if (USE_QT5)
add_executable (${SUBPROJECT} ${UI_HEADERS} ${HEADERS} ${SOURCES} ${MOC_SOURCES})
target_link_libraries (${SUBPROJECT} ${Qt5Widgets_LIBRARIES} ${Qt5Core_LIBRARIES})
else ()
find_package (Qt4 REQUIRED)
find_package(Qt4 COMPONENTS QtCore QtGui QtNetwork REQUIRED)
include (${QT_USE_FILE})
qt4_wrap_cpp (MOC_SOURCES ${HEADERS})
qt4_wrap_ui (UI_HEADERS ${FORMS})

View File

@ -41,12 +41,12 @@
#define TAG_ASSIGNEE "$OWNER"
#define TAG_MILESTONE ""
// comma separated
#define TAG_LABELS "auto"
#define TAG_LABELS "auto,bug"
/*
* configuration of creating an issue using GitReports
*
* please, visit the following site: https://gitreports.com/
* please, visit https://gitreports.com/
* and set up it for your repository
*/
// enable this function

View File

@ -19,7 +19,12 @@
#include "ui_reportabug.h"
#include <QDebug>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QPushButton>
#include <QUrl>
#include "config.h"
@ -46,7 +51,6 @@ void Reportabug::createActions()
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTabs(int)));
connect(ui->buttonBox->button(QDialogButtonBox::Close), SIGNAL(clicked(bool)), this, SLOT(close()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(sendReport()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked(bool)), this, SLOT(close()));
}
@ -88,17 +92,72 @@ void Reportabug::keyPressEvent(QKeyEvent *pressedKey)
}
QString Reportabug::parseCmd(QString line,
const QString password,
const QString text,
const QString username)
{
if (line.contains(QString("$ISSUES_URL")))
line = line.split(QString("$ISSUES_URL"))[0] +
parseString(QString(ISSUES_URL)) +
line.split(QString("$ISSUES_URL"))[1];
if (line.contains(QString("$PASSWORD")))
line = line.split(QString("$PASSWORD"))[0] +
password +
line.split(QString("$PASSWORD"))[1];
if (line.contains(QString("$TEXT")))
line = line.split(QString("$TEXT"))[0] +
text +
line.split(QString("$TEXT"))[1];
if (line.contains(QString("$USERNAME")))
line = line.split(QString("$USERNAME"))[0] +
username +
line.split(QString("$USERNAME"))[1];
return line;
}
QString Reportabug::parseString(QString line)
{
if (line.contains(QString("$OWNER")))
line = line.split(QString("$OWNER"))[0] + QString(OWNER) + line.split(QString("$OWNER"))[1];
line = line.split(QString("$OWNER"))[0] +
QString(OWNER) +
line.split(QString("$OWNER"))[1];
if (line.contains(QString("$PROJECT")))
line = line.split(QString("$PROJECT"))[0] + QString(PROJECT) + line.split(QString("$PROJECT"))[1];
line = line.split(QString("$PROJECT"))[0] +
QString(PROJECT) +
line.split(QString("$PROJECT"))[1];
return line;
}
QByteArray Reportabug::prepareRequest(const QString title, const QString body)
{
QStringList requestList;
requestList.append(QString("\"title\":\"") + title + QString("\""));
requestList.append(QString("\"body\":\"") + body + QString("\""));
if (!QString(TAG_ASSIGNEE).isEmpty())
requestList.append(QString("\"assignee\":\"") + parseString(QString(TAG_ASSIGNEE)) + QString("\""));
if (!QString(TAG_MILESTONE).isEmpty())
requestList.append(QString("\"milestone\":") + QString(TAG_MILESTONE));
if (!QString(TAG_LABELS).isEmpty()) {
QStringList labels = QString(TAG_LABELS).split(QChar(','));
for (int i=0; i<labels.count(); i++)
labels[i] = QString("\"") + labels[i] + QString("\"");
requestList.append(QString("\"labels\":[") + labels.join(QChar(',')) + QString("]"));
}
QString request;
request += QString("{");
request += requestList.join(QChar(','));
request += QString("}");
return request.toLatin1();
}
void Reportabug::sendReport()
{
int number = getNumberByIndex(ui->comboBox->currentIndex());
@ -118,15 +177,18 @@ void Reportabug::updateTabs(const int index)
if (number == -1)
return;
else if (number == 0)
sendReportUsingGithub();
updateGithubTab();
else if (number == 1)
sendReportUsingGitreport();
updateGitreportTab();
}
void Reportabug::updateGithubTab()
{
ui->lineEdit_username->clear();
ui->lineEdit_password->clear();
ui->lineEdit_title->setText(QString(TAG_TITLE));
ui->plainTextEdit->setPlainText(QString(TAG_BODY));
}
@ -136,9 +198,85 @@ void Reportabug::updateGitreportTab()
}
void Reportabug::replyFinished(QNetworkReply *reply)
{
int state = true;
QString answer = reply->readAll();
QString messageBody, messageTitle;
QMessageBox::Icon icon = QMessageBox::NoIcon;
if (answer.contains(QString("\"html_url\":"))) {
QString url;
for (int i=0; i<answer.split(QChar(',')).count(); i++)
if (answer.split(QChar(','))[i].split(QChar(':'))[0] == QString("\"html_url\"")) {
url = answer.split(QChar(','))[i].split(QString("\"html_url\":"))[1].remove(QChar('"'));
break;
}
messageBody += QString("%1\n").arg(QApplication::translate("Reportabug", "Message has been sended"));
messageBody += QString("Url: %2").arg(url);
messageTitle = QApplication::translate("Reportabug", "Done!");
icon = QMessageBox::Information;
state = true;
}
else if (answer.contains(QString("\"Bad credentials\""))) {
messageBody += QApplication::translate("Reportabug", "Incorrect username or password");
messageTitle = QApplication::translate("Reportabug", "Error!");
icon = QMessageBox::Critical;
state = false;
}
else {
messageBody += QApplication::translate("Reportabug", "An error occurs");
messageTitle = QApplication::translate("Reportabug", "Error!");
icon = QMessageBox::Critical;
state = false;
}
QMessageBox messageBox;
messageBox.setText(messageTitle);
messageBox.setInformativeText(messageBody);
messageBox.setIcon(icon);
messageBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Retry);
messageBox.setDefaultButton(QMessageBox::Ok);
QSpacerItem *horizontalSpacer = new QSpacerItem(400, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
QGridLayout *layout = (QGridLayout *)messageBox.layout();
layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());
int ret = messageBox.exec();
switch (ret) {
case QMessageBox::Ok:
if (state) close();
break;
case QMessageBox::Retry:
if (state) updateTabs(ui->comboBox->currentIndex());
break;
default:
break;
}
}
void Reportabug::sendReportUsingGithub()
{
// authorization
QString username = ui->lineEdit_username->text();
QString password = ui->lineEdit_password->text();
QString concatenated = username + QString(":") + password;
QByteArray userData = concatenated.toLocal8Bit().toBase64();
QString headerData = QString("Basic ") + userData;
// text
QString title = ui->lineEdit_title->text();
QString body = ui->plainTextEdit->toPlainText();
QByteArray text = prepareRequest(title, body);
QByteArray textSize = QByteArray::number(text.size());
// sending request
QNetworkRequest request = QNetworkRequest(parseString(QString(ISSUES_URL)));
request.setRawHeader("Authorization", headerData.toLocal8Bit());
request.setRawHeader("User-Agent", "reportabug");
request.setRawHeader("Host", "api.github.com");
request.setRawHeader("Accept", "*/*");
request.setRawHeader("Content-Type", "application/vnd.github.VERSION.raw+json");
request.setRawHeader("Content-Length", textSize);
QNetworkAccessManager *manager = new QNetworkAccessManager;
manager->post(request, text);
connect(manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
}

View File

@ -22,6 +22,8 @@
#include <QMainWindow>
class QNetworkReply;
namespace Ui {
class Reportabug;
}
@ -45,6 +47,7 @@ public slots:
private slots:
void sendReportUsingGithub();
void sendReportUsingGitreport();
void replyFinished(QNetworkReply *reply);
private:
Ui::Reportabug *ui;
@ -53,7 +56,12 @@ private:
int getNumberByIndex(const int index);
// ESC pressed event
void keyPressEvent(QKeyEvent *pressedKey);
QString parseCmd(QString line,
const QString password = QString(),
const QString text = QString(),
const QString username = QString());
QString parseString(QString line);
QByteArray prepareRequest(const QString title, const QString body);
};

View File

@ -43,6 +43,9 @@
<property name="toolTip">
<string>Your GitHub account</string>
</property>
<property name="placeholderText">
<string>username</string>
</property>
</widget>
</item>
<item>
@ -66,6 +69,9 @@
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
<property name="placeholderText">
<string>password</string>
</property>
</widget>
</item>
</layout>