X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=d06aa28973b166ad5a87ffed3618957cb3ee1778;hp=9761bfb0c1cc913c7b628c3a9464a9fe02c8780f;hb=fe73542fbcd2129069890ffe107639eaf26b1066;hpb=5c6804f291a63f978e328aeddcc8448e3443b45e diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index 9761bfb0..d06aa289 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -34,7 +34,8 @@ #include "types.h" #include "syncableobject.h" -#if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#if defined(HAVE_EXECINFO) && !defined(Q_OS_MAC) +# define BUILD_CRASHHANDLER # include # include # include @@ -45,17 +46,20 @@ CliParser *Quassel::_cliParser = 0; Quassel::RunMode Quassel::_runMode; bool Quassel::_initialized = false; bool Quassel::DEBUG = false; +QString Quassel::_coreDumpFileName; Quassel::Quassel() { + Q_INIT_RESOURCE(i18n); + // We catch SIGTERM and SIGINT (caused by Ctrl+C) to graceful shutdown Quassel. signal(SIGTERM, handleSignal); signal(SIGINT, handleSignal); -#if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#ifdef BUILD_CRASHHANDLER signal(SIGABRT, handleSignal); signal(SIGBUS, handleSignal); signal(SIGSEGV, handleSignal); -#endif // #if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#endif // #if defined(HAVE_EXECINFO) && !defined(Q_OS_MAC) _cliParser = new CliParser(); @@ -69,13 +73,13 @@ Quassel::~Quassel() { } bool Quassel::init() { - if(_initialized) return true; // allow multiple invocations because of MonolithicApplication + if(_initialized) + return true; // allow multiple invocations because of MonolithicApplication + _initialized = true; qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); registerMetaTypes(); - setupBuildInfo(); - Global::setupVersion(); setupTranslations(); QCoreApplication::setApplicationName(buildInfo().applicationName); @@ -144,30 +148,60 @@ void Quassel::setupTranslations() { qApp->installTranslator(quasselTranslator); } -void Quassel::setupBuildInfo() { +void Quassel::setupBuildInfo(const QString &generated) { _buildInfo.applicationName = "Quassel IRC"; _buildInfo.coreApplicationName = "Quassel Core"; _buildInfo.clientApplicationName = "Quassel Client"; _buildInfo.organizationName = "Quassel Project"; _buildInfo.organizationDomain = "quassel-irc.org"; -/* -# include "version.inc" -# include "version.gen" - - if(quasselGeneratedVersion.isEmpty()) { - if(quasselCommit.isEmpty()) - quasselVersion = QString("v%1 (unknown rev)").arg(quasselBaseVersion); - else - quasselVersion = QString("v%1 (dist-%2, %3)").arg(quasselBaseVersion).arg(quasselCommit.left(7)) - .arg(QDateTime::fromTime_t(quasselArchiveDate).toLocalTime().toString("yyyy-MM-dd")); + + QStringList gen = generated.split(','); + Q_ASSERT(gen.count() == 10); + _buildInfo.baseVersion = gen[0]; + _buildInfo.generatedVersion = gen[1]; + _buildInfo.isSourceDirty = !gen[2].isEmpty(); + _buildInfo.commitHash = gen[3]; + _buildInfo.commitDate = gen[4].toUInt(); + _buildInfo.protocolVersion = gen[5].toUInt(); + _buildInfo.clientNeedsProtocol = gen[6].toUInt(); + _buildInfo.coreNeedsProtocol = gen[7].toUInt(); + _buildInfo.buildDate = QString("%1 %2").arg(gen[8], gen[9]); + // create a nice version string + if(_buildInfo.generatedVersion.isEmpty()) { + if(!_buildInfo.commitHash.isEmpty()) { + // dist version + _buildInfo.plainVersionString = QString("v%1 (dist-%2)") + .arg(_buildInfo.baseVersion) + .arg(_buildInfo.commitHash.left(7)); + _buildInfo.fancyVersionString + = QString("v%1 (dist-%2)") + .arg(_buildInfo.baseVersion) + .arg(_buildInfo.commitHash.left(7)) + .arg(_buildInfo.commitHash); + } else { + // we only have a base version :( + _buildInfo.plainVersionString = QString("v%1 (unknown rev)").arg(_buildInfo.baseVersion); + } } else { - QStringList parts = quasselGeneratedVersion.split(':'); - quasselVersion = QString("v%1").arg(parts[0]); - if(parts.count() >= 2) quasselVersion.append(QString(" (%1)").arg(parts[1])); + // analyze what we got from git-describe + QRegExp rx("(.*)-(\\d+)-g([0-9a-f]+)$"); + if(rx.exactMatch(_buildInfo.generatedVersion)) { + QString distance = rx.cap(2) == "0" ? QString() : QString(" [+%1]").arg(rx.cap(2)); + _buildInfo.plainVersionString = QString("v%1%2 (git-%3%4)") + .arg(rx.cap(1), distance, rx.cap(3)) + .arg(_buildInfo.isSourceDirty ? "*" : ""); + if(!_buildInfo.commitHash.isEmpty()) { + _buildInfo.fancyVersionString = QString("v%1%2 (git-%3%4)") + .arg(rx.cap(1), distance, rx.cap(3)) + .arg(_buildInfo.isSourceDirty ? "*" : "") + .arg(_buildInfo.commitHash); + } + } else { + _buildInfo.plainVersionString = QString("v%1 (invalid rev)").arg(_buildInfo.baseVersion); + } } - quasselBuildDate = __DATE__; - quasselBuildTime = __TIME__; - */ + if(_buildInfo.fancyVersionString.isEmpty()) + _buildInfo.fancyVersionString = _buildInfo.plainVersionString; } //! Signal handler for graceful shutdown. @@ -179,25 +213,45 @@ void Quassel::handleSignal(int sig) { QCoreApplication::quit(); break; +#ifdef BUILD_CRASHHANDLER case SIGABRT: case SIGBUS: case SIGSEGV: handleCrash(); +#endif break; default: break; } } +void Quassel::logFatalMessage(const char *msg) { +#ifndef Q_OS_MAC + QFile dumpFile(coreDumpFileName()); + dumpFile.open(QIODevice::WriteOnly); + QTextStream dumpStream(&dumpFile); +#else + QTextStream dumpStream(stderr); +#endif + + dumpStream << "Fatal: " << msg << '\n'; + dumpStream.flush(); + + qInstallMsgHandler(0); + abort(); +} + void Quassel::handleCrash() { -#if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#ifdef BUILD_CRASHHANDLER void* callstack[128]; int i, frames = backtrace(callstack, 128); - QFile dumpFile(QString("Quassel-Crash-%1").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm.log"))); - dumpFile.open(QIODevice::WriteOnly); + QFile dumpFile(coreDumpFileName()); + dumpFile.open(QIODevice::Append); QTextStream dumpStream(&dumpFile); + dumpStream << "Quassel IRC: " << _buildInfo.baseVersion << ' ' << _buildInfo.commitHash << '\n'; + for (i = 0; i < frames; ++i) { Dl_info info; dladdr (callstack[i], &info); @@ -250,38 +304,12 @@ void Quassel::handleCrash() { } dumpFile.close(); exit(27); -#endif // #if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#endif /* BUILD_CRASHHANDLER */ } -// FIXME temporary +const QString &Quassel::coreDumpFileName() { + if(_coreDumpFileName.isEmpty()) + _coreDumpFileName = QString("Quassel-Crash-%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm")); -void Global::setupVersion() { - - # include "version.inc" - # include "version.gen" - - if(quasselGeneratedVersion.isEmpty()) { - if(quasselCommit.isEmpty()) - quasselVersion = QString("v%1 (unknown rev)").arg(quasselBaseVersion); - else - quasselVersion = QString("v%1 (dist-%2, %3)").arg(quasselBaseVersion).arg(quasselCommit.left(7)) - .arg(QDateTime::fromTime_t(quasselArchiveDate).toLocalTime().toString("yyyy-MM-dd")); - } else { - QStringList parts = quasselGeneratedVersion.split(':'); - quasselVersion = QString("v%1").arg(parts[0]); - if(parts.count() >= 2) quasselVersion.append(QString(" (%1)").arg(parts[1])); - } - quasselBuildDate = __DATE__; - quasselBuildTime = __TIME__; + return _coreDumpFileName; } - -QString Global::quasselVersion; -QString Global::quasselBaseVersion; -QString Global::quasselGeneratedVersion; -QString Global::quasselBuildDate; -QString Global::quasselBuildTime; -QString Global::quasselCommit; -uint Global::quasselArchiveDate; -uint Global::protocolVersion; -uint Global::clientNeedsProtocol; -uint Global::coreNeedsProtocol;