void DuplicateFinderJob::slotBugReportFetched(const BugReport &bug, QObject *owner)
{
    if (this != owner) {
        return;
    }

    ParseBugBacktraces parse(bug, this);
    parse.parse();

    BacktraceGenerator *btGenerator = DrKonqi::debuggerManager()->backtraceGenerator();
    const ParseBugBacktraces::DuplicateRating rating = parse.findDuplicate(btGenerator->parser()->parsedBacktraceLines());
    qDebug() << "Duplicate rating:" << rating;

    //TODO handle more cases here
    if (rating != ParseBugBacktraces::PerfectDuplicate) {
        qDebug() << "Bug" << bug.bugNumber() << "most likely not a duplicate:" << rating;
        analyzeNextBug();
        return;
    }

    //The Bug is a duplicate, now find out the status and resolution of the existing report
    if (bug.resolutionValue() == BugReport::Duplicate) {
        qDebug() << "Found duplicate is a duplicate itself.";
        if (!m_result.duplicate) {
            m_result.duplicate = bug.bugNumberAsInt();
        }
        fetchBug(bug.markedAsDuplicateOf());
    } else if ((bug.statusValue() == BugReport::UnknownStatus) || (bug.resolutionValue() == BugReport::UnknownResolution)) {
        qDebug() << "Either the status or the resolution is unknown.";
        qDebug() << "Status \"" << bug.bugStatus() << "\" known:" << (bug.statusValue() != BugReport::UnknownStatus);
        qDebug() << "Resolution \"" << bug.resolution() << "\" known:" << (bug.resolutionValue() != BugReport::UnknownResolution);
        analyzeNextBug();
    } else {
        if (!m_result.duplicate) {
            m_result.duplicate = bug.bugNumberAsInt();
        }
        m_result.parentDuplicate = bug.bugNumberAsInt();
        m_result.status = bug.statusValue();
        m_result.resolution = bug.resolutionValue();
        qDebug() << "Found duplicate information (id/status/resolution):" << bug.bugNumber() << bug.bugStatus() << bug.resolution();
        emitResult();
    }
}