You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
6.6 KiB
185 lines
6.6 KiB
/******************************************************************* |
|
* productmapping.cpp |
|
* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com> |
|
* |
|
* This program is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU General Public License as |
|
* published by the Free Software Foundation; either version 2 of |
|
* the License, or (at your option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
* |
|
******************************************************************/ |
|
|
|
#include "productmapping.h" |
|
|
|
#include <KConfig> |
|
#include <KConfigGroup> |
|
#include <QDebug> |
|
#include <QStandardPaths> |
|
|
|
#include "bugzillalib.h" |
|
#include "crashedapplication.h" |
|
|
|
ProductMapping::ProductMapping(const CrashedApplication * crashedApp, BugzillaManager * bzManager, QObject * parent) |
|
: QObject(parent) |
|
, m_crashedAppPtr(crashedApp) |
|
, m_bugzillaManagerPtr(bzManager) |
|
, m_bugzillaProductDisabled(false) |
|
, m_bugzillaVersionDisabled(false) |
|
|
|
{ |
|
//Default "fallback" values |
|
m_bugzillaProduct = crashedApp->fakeExecutableBaseName(); |
|
m_bugzillaComponent = QLatin1String("general"); |
|
m_bugzillaVersionString = QLatin1String("unspecified"); |
|
m_relatedBugzillaProducts = QStringList() << m_bugzillaProduct; |
|
|
|
map(crashedApp->fakeExecutableBaseName()); |
|
|
|
//Get valid versions |
|
connect(m_bugzillaManagerPtr, &BugzillaManager::productInfoFetched, this, &ProductMapping::checkProductInfo); |
|
|
|
m_bugzillaManagerPtr->fetchProductInfo(m_bugzillaProduct); |
|
} |
|
|
|
void ProductMapping::map(const QString & appName) |
|
{ |
|
mapUsingInternalFile(appName); |
|
getRelatedProductsUsingInternalFile(m_bugzillaProduct); |
|
} |
|
|
|
void ProductMapping::mapUsingInternalFile(const QString & appName) |
|
{ |
|
KConfig mappingsFile(QString::fromLatin1("mappings"), KConfig::NoGlobals, QStandardPaths::DataLocation); |
|
const KConfigGroup mappings = mappingsFile.group("Mappings"); |
|
if (mappings.hasKey(appName)) { |
|
QString mappingString = mappings.readEntry(appName); |
|
if (!mappingString.isEmpty()) { |
|
QStringList list = mappingString.split('|', QString::SkipEmptyParts); |
|
if (list.count()==2) { |
|
m_bugzillaProduct = list.at(0); |
|
m_bugzillaComponent = list.at(1); |
|
m_relatedBugzillaProducts = QStringList() << m_bugzillaProduct; |
|
} else { |
|
qWarning() << "Error while reading mapping entry. Sections found " << list.count(); |
|
} |
|
} else { |
|
qWarning() << "Error while reading mapping entry. Entry exists but it is empty " |
|
"(or there was an error when reading)"; |
|
} |
|
} |
|
} |
|
|
|
void ProductMapping::getRelatedProductsUsingInternalFile(const QString & bugzillaProduct) |
|
{ |
|
//ProductGroup -> kontact=kdepim |
|
//Groups -> kdepim=kontact|kmail|korganizer|akonadi|pimlibs..etc |
|
|
|
KConfig mappingsFile(QString::fromLatin1("mappings"), KConfig::NoGlobals, QStandardPaths::DataLocation); |
|
const KConfigGroup productGroup = mappingsFile.group("ProductGroup"); |
|
|
|
//Get groups of the application |
|
QStringList groups; |
|
if (productGroup.hasKey(bugzillaProduct)) { |
|
QString group = productGroup.readEntry(bugzillaProduct); |
|
if (group.isEmpty()) { |
|
qWarning() << "Error while reading mapping entry. Entry exists but it is empty " |
|
"(or there was an error when reading)"; |
|
return; |
|
} |
|
groups = group.split('|', QString::SkipEmptyParts); |
|
} |
|
|
|
//All KDE apps use the KDE Platform (basic libs) |
|
groups << QLatin1String("kdeplatform"); |
|
|
|
//Add the product itself |
|
m_relatedBugzillaProducts = QStringList() << m_bugzillaProduct; |
|
|
|
//Get related products of each related group |
|
Q_FOREACH( const QString & group, groups ) { |
|
const KConfigGroup bzGroups = mappingsFile.group("BZGroups"); |
|
if (bzGroups.hasKey(group)) { |
|
QString bzGroup = bzGroups.readEntry(group); |
|
if (!bzGroup.isEmpty()) { |
|
QStringList relatedGroups = bzGroup.split('|', QString::SkipEmptyParts); |
|
if (relatedGroups.size()>0) { |
|
m_relatedBugzillaProducts.append(relatedGroups); |
|
} |
|
} else { |
|
qWarning() << "Error while reading mapping entry. Entry exists but it is empty " |
|
"(or there was an error when reading)"; |
|
} |
|
} |
|
} |
|
} |
|
|
|
void ProductMapping::checkProductInfo(const Product & product) |
|
{ |
|
// check whether the product itself is disabled for new reports, |
|
// which usually means that product/application is unmaintained. |
|
m_bugzillaProductDisabled = !product.isActive(); |
|
|
|
// check whether the product on bugzilla contains the expected component |
|
if (! product.components().contains(m_bugzillaComponent)) { |
|
m_bugzillaComponent = QLatin1String("general"); |
|
} |
|
|
|
// find the appropriate version to use on bugzilla |
|
const QString version = m_crashedAppPtr->version(); |
|
const QStringList& allVersions = product.allVersions(); |
|
|
|
if (allVersions.contains(version)) { |
|
//The version the crash application provided is a valid bugzilla version: use it ! |
|
m_bugzillaVersionString = version; |
|
} else if (version.endsWith(QLatin1String(".00"))) { |
|
//check if there is a version on bugzilla with just ".0" |
|
const QString shorterVersion = version.left(version.size() - 1); |
|
if (allVersions.contains(shorterVersion)) { |
|
m_bugzillaVersionString = shorterVersion; |
|
} |
|
} |
|
|
|
// check whether that verions is disabled for new reports, which |
|
// usually means that version is outdated and not supported anymore. |
|
const QStringList& inactiveVersions = product.inactiveVersions(); |
|
m_bugzillaVersionDisabled = inactiveVersions.contains(m_bugzillaVersionString); |
|
|
|
} |
|
|
|
QStringList ProductMapping::relatedBugzillaProducts() const |
|
{ |
|
return m_relatedBugzillaProducts; |
|
} |
|
|
|
QString ProductMapping::bugzillaProduct() const |
|
{ |
|
return m_bugzillaProduct; |
|
} |
|
|
|
QString ProductMapping::bugzillaComponent() const |
|
{ |
|
return m_bugzillaComponent; |
|
} |
|
|
|
QString ProductMapping::bugzillaVersion() const |
|
{ |
|
return m_bugzillaVersionString; |
|
} |
|
|
|
bool ProductMapping::bugzillaProductDisabled() const |
|
{ |
|
return m_bugzillaProductDisabled; |
|
} |
|
|
|
bool ProductMapping::bugzillaVersionDisabled() const |
|
{ |
|
return m_bugzillaVersionDisabled; |
|
}
|
|
|