Merge lp:~manchicken/kubuntu-debug-installer/kubuntu-debug-installer into lp:kubuntu-debug-installer

Proposed by Michael D. Stemle, Jr.
Status: Superseded
Proposed branch: lp:~manchicken/kubuntu-debug-installer/kubuntu-debug-installer
Merge into: lp:kubuntu-debug-installer
Diff against target: 573 lines (+407/-9)
9 files modified
CMakeLists.txt (+2/-0)
src/CMakeLists.txt (+2/-0)
src/DebugFinder.cpp (+146/-3)
src/DebugFinder.h (+31/-4)
src/DebugInstaller.cpp (+3/-2)
src/LSBRelease.cpp (+66/-0)
src/LSBRelease.h (+43/-0)
src/QAptDecorator.cpp (+80/-0)
src/QAptDecorator.h (+34/-0)
To merge this branch: bzr merge lp:~manchicken/kubuntu-debug-installer/kubuntu-debug-installer
Reviewer Review Type Date Requested Status
Jonathan Thomas Pending
Review via email: mp+174915@code.launchpad.net

This proposal has been superseded by a proposal from 2013-07-17.

Description of the change

NOW we're ready for merging. This implements https://wiki.ubuntu.com/DebuggingProgramCrash#Debug_Symbol_Packages.

To post a comment you must log in.
Revision history for this message
Philip Muškovac (yofel) wrote :

I only took a quick glance on the merge, but I think you missed the "release" repository. You have X-updates, X-security and X-proposed, but I see no place where you add X without a suffix

103. By Michael D. Stemle, Jr. <email address hidden>

Added the base repo.

104. By Michael D. Stemle, Jr. <email address hidden>

Made change per JT's recommendation.

105. By Michael D. Stemle, Jr. <email address hidden>

Made a series of changes requested by Harold.

106. By Michael D. Stemle, Jr. <email address hidden>

Fixed some text formatting.

107. By Michael D. Stemle, Jr. <email address hidden>

Fixed some code indentation.

108. By Michael D. Stemle, Jr. <email address hidden>

Made a number of changes per Harald's list: https://code.launchpad.net/~manchicken/kubuntu-debug-installer/kubuntu-debug-installer/+merge/177273/comments/399863

Unmerged revisions

108. By Michael D. Stemle, Jr. <email address hidden>

Made a number of changes per Harald's list: https://code.launchpad.net/~manchicken/kubuntu-debug-installer/kubuntu-debug-installer/+merge/177273/comments/399863

107. By Michael D. Stemle, Jr. <email address hidden>

Fixed some code indentation.

106. By Michael D. Stemle, Jr. <email address hidden>

Fixed some text formatting.

105. By Michael D. Stemle, Jr. <email address hidden>

Made a series of changes requested by Harold.

104. By Michael D. Stemle, Jr. <email address hidden>

Made change per JT's recommendation.

103. By Michael D. Stemle, Jr. <email address hidden>

Added the base repo.

102. By Michael D. Stemle, Jr. <email address hidden>

Fixed a small bug when debug packages weren't found.

101. By Michael D. Stemle, Jr. <email address hidden>

Added the changes for sources.list and refreshing cache: https://wiki.ubuntu.com/DebuggingProgramCrash#Debug_Symbol_Packages

100. By Michael D. Stemle, Jr. <email address hidden>

I now have the sources add working.

99. By Michael D. Stemle, Jr. <email address hidden>

Adding LSB stuff from Herald Sitter (THANKS!) and adding some code to set up repos.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2010-09-16 13:06:47 +0000
3+++ CMakeLists.txt 2013-07-17 00:34:26 +0000
4@@ -4,6 +4,8 @@
5 find_package(QApt REQUIRED)
6 include (KDE4Defaults)
7
8+add_definitions(-DKDE_DEFAULT_DEBUG_AREA=8675309)
9+
10 macro_log_feature(QAPT_FOUND "QApt" "High-level Qt wrapper/Apt implementation around the Apt-pkg library"
11 "http://kubuntu.org" FALSE "" "Used to look up packages")
12
13
14=== modified file 'src/CMakeLists.txt'
15--- src/CMakeLists.txt 2010-09-16 14:19:01 +0000
16+++ src/CMakeLists.txt 2013-07-17 00:34:26 +0000
17@@ -2,6 +2,8 @@
18 include_directories(${CMAKE_CURRENT_BINARY_DIR})
19
20 set(installdbgsymbols_SRCS
21+ QAptDecorator.cpp
22+ LSBRelease.cpp
23 DebugFinder.cpp
24 DebugInstaller.cpp
25 main.cpp
26
27=== modified file 'src/DebugFinder.cpp'
28--- src/DebugFinder.cpp 2012-10-30 15:16:47 +0000
29+++ src/DebugFinder.cpp 2013-07-17 00:34:26 +0000
30@@ -2,6 +2,7 @@
31 Copyright © 2010 Harald Sitter <apachelogger@ubuntu.com>
32 Copyright © 2010 Felix Geyer <debfx@fobos.de>
33 Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org>
34+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
35
36 This program is free software; you can redistribute it and/or
37 modify it under the terms of the GNU General Public License as
38@@ -21,18 +22,35 @@
39 */
40
41 #include "DebugFinder.h"
42+#include "LSBRelease.h"
43+#include "QAptDecorator.h"
44
45 #include <QtCore/QStringList>
46 #include <QtCore/QThread>
47+#include <QtCore/QFile>
48+#include <QtCore/QDir>
49+#include <QtCore/QDirIterator>
50+#include <QtCore/QTextStream>
51
52 #include <LibQApt/Backend>
53+#include <LibQApt/SourceEntry>
54+#include <LibQApt/SourcesList>
55+#include <LibQApt/Transaction>
56+#include <iostream>
57+
58+#include <KDebug>
59+#include <KLocalizedString>
60+#include <KMessageBox>
61
62 DebugFinder::DebugFinder(QObject *parent) :
63 QObject(parent),
64 m_backend(new QApt::Backend(this)),
65 m_stop(false)
66 {
67+ kDebug() << "INIT!!!!!\n";
68 m_backend->init();
69+
70+ m_txn = NULL;
71 }
72
73 QApt::Package *DebugFinder::getDbgPkg(QApt::Package *package)
74@@ -69,17 +87,18 @@
75 return 0;
76 }
77
78-void DebugFinder::find(const QString &file)
79+void DebugFinder::find()
80 {
81 if (m_stop) {
82 return;
83 }
84
85- QApt::Package *package = m_backend->packageForFile(file);
86+ QApt::Package *package = m_backend->packageForFile(m_file);
87
88 QApt::Package *dbgPkg = getDbgPkg(package);
89 if (!dbgPkg) {
90- emit foundNoDbgPkg(file);
91+ kDebug() << "No debug package found for: " << m_file;
92+ emit foundNoDbgPkg(m_file);
93 } else if (dbgPkg->isInstalled()) {
94 emit alreadyInstalled();
95 } else {
96@@ -91,3 +110,127 @@
97 {
98 m_stop = true;
99 }
100+
101+void DebugFinder::startFinding(const QString &file)
102+{
103+ QString headerText = i18n("<b>Adding debug symbol sources</b>");
104+ m_progress.setLabelText(headerText);
105+ m_file = file;
106+ connect(this, SIGNAL(updateFinishing()), this, SLOT(onUpdateFinished()));
107+// connect(this, SIGNAL(sourcesModificationFinished()), m_backend, SLOT(updateCache()));
108+
109+ // Construct our list hard-coded sources...
110+ LSBRelease lsb;
111+ QString codename(lsb.codename());
112+ QApt::SourceEntryList hcRepoList;
113+ hcRepoList.append(QApt::SourceEntry(QString(REPO_ARG_BASE).arg(codename), QString(DDEB_REPO_FILE)));
114+ hcRepoList.append(QApt::SourceEntry(QString(REPO_ARG_UPDATES).arg(codename), QString(DDEB_REPO_FILE)));
115+ hcRepoList.append(QApt::SourceEntry(QString(REPO_ARG_SECURITY).arg(codename), QString(DDEB_REPO_FILE)));
116+ hcRepoList.append(QApt::SourceEntry(QString(REPO_ARG_PROPOSED).arg(codename), QString(DDEB_REPO_FILE)));
117+
118+ // First, see if the source exists...
119+ QApt::SourcesList sourceList(this);
120+
121+ int sourceCount = sourceList.entries().count();
122+
123+ foreach (QApt::SourceEntry repo, hcRepoList)
124+ {
125+ sourceList.addEntry(repo); // This method has a dup check
126+ }
127+ m_progress.progressBar()->setMaximum(100);
128+
129+ // If we affected the list, save!
130+ if (sourceList.entries().count() > sourceCount) {
131+ m_srcUpdated = 0;
132+ sourceList.save();
133+ kDebug() << "Entries saved, updating backend cache...";
134+
135+ m_txn = m_backend->updateCache();
136+
137+ m_txn->setLocale(QLatin1String(setlocale(LC_MESSAGES, 0)));
138+
139+ connect(&m_progress, SIGNAL(cancelClicked()), m_txn, SLOT(cancel()));
140+ connect(m_txn, SIGNAL(errorOccurred(QApt::ErrorCode)), this, SLOT(onAptError(QApt::ErrorCode)));
141+ connect(m_txn, SIGNAL(statusChanged(QApt::TransactionStatus)), this, SLOT(onTxnStatusChanged(QApt::TransactionStatus)));
142+ connect(m_txn, SIGNAL(progressChanged(int)), this, SLOT(onProgressChanged(int)));
143+ connect(m_txn, SIGNAL(finished(QApt::ExitStatus)), this, SLOT(onUpdateFinished()));
144+
145+ m_txn->run();
146+ kDebug() << "FinishedStatus: " << QApt::FinishedStatus;
147+ } else {
148+ emit updateFinishing();
149+ }
150+
151+ kDebug() << "Done with startFinding()!";
152+}
153+
154+// The update is finished!
155+void DebugFinder::onUpdateFinished()
156+{
157+ kDebug() << "I'm done.";
158+ m_progress.progressBar()->setValue(100);
159+
160+ this->find();
161+
162+ return;
163+}
164+
165+void DebugFinder::onTxnStatusChanged(QApt::TransactionStatus status)
166+{
167+ QString headerText;
168+
169+ kDebug() << "cache widget: transaction status changed" << status;
170+
171+ if (this->m_txn == NULL) {
172+ kDebug() << "NULL transaction.";
173+ return;
174+ }
175+
176+ switch (status) {
177+ case QApt::DownloadingStatus:
178+ if (this->m_txn->role() == QApt::UpdateCacheRole)
179+ {
180+ headerText = i18n("<b>Updating software sources</b>");
181+ }
182+ else
183+ {
184+ headerText = i18n("<b>Downloading Packages</b>");
185+ }
186+
187+ m_progress.setLabelText(headerText);
188+ break;
189+
190+ case QApt::FinishedStatus:
191+ headerText = i18n("<b>Finished.</b>");
192+ m_progress.setLabelText(headerText);
193+ break;
194+
195+ default:
196+ break;
197+ }
198+}
199+
200+void DebugFinder::onAptError(QApt::ErrorCode errcode)
201+{
202+ QString errmsg = QAptDecorator::errorText(errcode, this->m_txn);
203+ kDebug() << "Got an error: " << errmsg;
204+
205+ KMessageBox::error(
206+ NULL,
207+ i18nc("@info Error message", "Error updating sources"
208+ " after configuring debug sources"),
209+ i18nc("@title:window", "Failed updating sources")
210+ );
211+}
212+
213+void DebugFinder::onProgressChanged(int progress)
214+{
215+ kDebug() << "Progress changed to " << progress;
216+
217+ int presentProgress = progress;
218+
219+ if (progress >= 100) {
220+ presentProgress = 0;
221+ }
222+ m_progress.progressBar()->setValue(presentProgress);
223+}
224
225=== modified file 'src/DebugFinder.h'
226--- src/DebugFinder.h 2012-10-30 15:16:47 +0000
227+++ src/DebugFinder.h 2013-07-17 00:34:26 +0000
228@@ -1,6 +1,7 @@
229 /*
230 Copyright © 2010 Harald Sitter <apachelogger@ubuntu.com>
231 Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org>
232+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
233
234 This program is free software; you can redistribute it and/or
235 modify it under the terms of the GNU General Public License as
236@@ -22,13 +23,25 @@
237 #ifndef DEBUGFINDER_H
238 #define DEBUGFINDER_H
239
240+#include <LibQApt/Globals>
241+
242 #include <QtCore/QObject>
243 #include <QtCore/QStringList>
244+#include <KProgressDialog>
245+
246+#define REPO_ARG_BASE "deb http://ddebs.ubuntu.com %1 main restricted universe multiverse"
247+#define REPO_ARG_UPDATES "deb http://ddebs.ubuntu.com %1-updates main restricted universe multiverse"
248+#define REPO_ARG_SECURITY "deb http://ddebs.ubuntu.com %1-security main restricted universe multiverse"
249+#define REPO_ARG_PROPOSED "deb http://ddebs.ubuntu.com %1-proposed main restricted universe multiverse"
250+#define DDEB_REPO_FILE "/etc/apt/sources.list.d/ddebs.list"
251
252 namespace QApt {
253 class Backend;
254 class Package;
255-}
256+ class SourceEntry;
257+ class SourcesList;
258+ class Transaction;
259+};
260
261 class DebugFinder : public QObject
262 {
263@@ -36,18 +49,32 @@
264 public:
265 explicit DebugFinder(QObject *parent = 0);
266
267+ void performUpdate();
268+
269 public slots:
270- void find(const QString &file);
271+ void startFinding(const QString &file);
272+ void find();
273 void stop();
274-
275+ void onTxnStatusChanged(QApt::TransactionStatus status);
276+ void onAptError(QApt::ErrorCode errcode);
277+ void onUpdateFinished();
278+ void onProgressChanged(int progress);
279+
280 signals:
281 void foundDbgPkg(const QString &dbgpkg);
282- void foundNoDbgPkg(const QString &file);
283+ void foundNoDbgPkg(const QString &dbgpkg);
284 void alreadyInstalled();
285+ void updateFinishing();
286
287 private:
288 QApt::Package *getDbgPkg(QApt::Package *package);
289 QApt::Backend *m_backend;
290+ QApt::Transaction *m_txn;
291+ KProgressDialog m_progress;
292+ QString m_file;
293+ int m_srcCount;
294+ int m_srcUpdated;
295+ int m_lastProgress;
296
297 bool m_stop;
298 };
299
300=== modified file 'src/DebugInstaller.cpp'
301--- src/DebugInstaller.cpp 2011-09-26 13:35:14 +0000
302+++ src/DebugInstaller.cpp 2013-07-17 00:34:26 +0000
303@@ -1,6 +1,7 @@
304 /*
305 Copyright © 2010 Harald Sitter <apachelogger@ubuntu.com>
306 Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org>
307+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
308
309 This program is free software; you can redistribute it and/or
310 modify it under the terms of the GNU General Public License as
311@@ -163,7 +164,7 @@
312 progressBar()->setMaximum(m_args.count());
313 incrementProgress();
314
315- m_finder = new DebugFinder;
316+ m_finder = new DebugFinder(this);
317 connect(m_finder, SIGNAL(foundDbgPkg(QString)), this, SLOT(foundDbgPkg(QString)));
318 connect(m_finder, SIGNAL(foundNoDbgPkg(QString)), this, SLOT(foundNoDbgPkg(QString)));
319 connect(m_finder, SIGNAL(alreadyInstalled()), this, SLOT(alreadyInstalled()));
320@@ -173,7 +174,7 @@
321 m_finderThread->start();
322
323 foreach (const QString &file, m_args) {
324- QMetaObject::invokeMethod(m_finder, "find", Qt::QueuedConnection,
325+ QMetaObject::invokeMethod(m_finder, "startFinding", Qt::QueuedConnection,
326 Q_ARG(QString, file));
327 }
328 }
329
330=== added file 'src/LSBRelease.cpp'
331--- src/LSBRelease.cpp 1970-01-01 00:00:00 +0000
332+++ src/LSBRelease.cpp 2013-07-17 00:34:26 +0000
333@@ -0,0 +1,66 @@
334+/*
335+ Copyright (C) 2012 Harald Sitter <apachelogger@ubuntu.com>
336+
337+ This program is free software; you can redistribute it and/or
338+ modify it under the terms of the GNU General Public License as
339+ published by the Free Software Foundation; either version 2 of
340+ the License or (at your option) version 3 or any later version
341+ accepted by the membership of KDE e.V. (or its successor approved
342+ by the membership of KDE e.V.), which shall act as a proxy
343+ defined in Section 14 of version 3 of the license.
344+
345+ This program is distributed in the hope that it will be useful,
346+ but WITHOUT ANY WARRANTY; without even the implied warranty of
347+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
348+ GNU General Public License for more details.
349+
350+ You should have received a copy of the GNU General Public License
351+ along with this program. If not, see <http://www.gnu.org/licenses/>.
352+*/
353+
354+#include "LSBRelease.h"
355+
356+#include <QtCore/QFile>
357+
358+#include <KDebug>
359+#include <KLocalizedString>
360+
361+LSBRelease::LSBRelease()
362+{
363+ QFile file("/etc/lsb-release");
364+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
365+ kDebug() << "Could not open /etc/lsb-release, aborting LSB";
366+ QString unknown = i18nc("@label", "Unknown");
367+ m_id = unknown;
368+ m_release = unknown;
369+ m_codename = unknown;
370+ m_description = unknown;
371+ return;
372+ }
373+
374+ // List of valid column identifiers
375+ QString line;
376+ QStringList comps;
377+ while (!file.atEnd()) {
378+ line = file.readLine();
379+ comps = line.split(QChar('='));
380+// #warning unknown set?
381+ Q_ASSERT(comps.size() == 2);
382+ QString key = comps.at(0);
383+ QString value = comps.at(1).trimmed();
384+ if (key == QLatin1String("DISTRIB_ID"))
385+ m_id = value;
386+ else if (key == QLatin1String("DISTRIB_RELEASE"))
387+ m_release = value;
388+ else if (key == QLatin1String("DISTRIB_CODENAME"))
389+ m_codename = value;
390+ else if (key == QLatin1String("DISTRIB_DESCRIPTION"))
391+ m_description = value;
392+ else
393+ Q_ASSERT(false); // Should not happen!
394+ }
395+
396+// #warning unknown set?
397+ if (m_id.isEmpty() || m_release.isEmpty())
398+ Q_ASSERT(false); // meh.
399+}
400\ No newline at end of file
401
402=== added file 'src/LSBRelease.h'
403--- src/LSBRelease.h 1970-01-01 00:00:00 +0000
404+++ src/LSBRelease.h 2013-07-17 00:34:26 +0000
405@@ -0,0 +1,43 @@
406+/*
407+ Copyright (C) 2012 Harald Sitter <apachelogger@ubuntu.com>
408+
409+ This program is free software; you can redistribute it and/or
410+ modify it under the terms of the GNU General Public License as
411+ published by the Free Software Foundation; either version 2 of
412+ the License or (at your option) version 3 or any later version
413+ accepted by the membership of KDE e.V. (or its successor approved
414+ by the membership of KDE e.V.), which shall act as a proxy
415+ defined in Section 14 of version 3 of the license.
416+
417+ This program is distributed in the hope that it will be useful,
418+ but WITHOUT ANY WARRANTY; without even the implied warranty of
419+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
420+ GNU General Public License for more details.
421+
422+ You should have received a copy of the GNU General Public License
423+ along with this program. If not, see <http://www.gnu.org/licenses/>.
424+*/
425+
426+#ifndef LSBRELEASE_H
427+#define LSBRELEASE_H
428+
429+#include <QtCore/QString>
430+
431+class LSBRelease
432+{
433+public:
434+ LSBRelease();
435+
436+ QString id() { return m_id; }
437+ QString release() { return m_release; }
438+ QString codename() { return m_codename; }
439+ QString description() { return m_description; }
440+
441+private:
442+ QString m_id;
443+ QString m_release;
444+ QString m_codename;
445+ QString m_description;
446+};
447+
448+#endif // LSBRELEASE_H
449
450=== added file 'src/QAptDecorator.cpp'
451--- src/QAptDecorator.cpp 1970-01-01 00:00:00 +0000
452+++ src/QAptDecorator.cpp 2013-07-17 00:34:26 +0000
453@@ -0,0 +1,80 @@
454+/*
455+ Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> (cacheupdate example in QApt)
456+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
457+
458+ This program is free software; you can redistribute it and/or
459+ modify it under the terms of the GNU General Public License as
460+ published by the Free Software Foundation; either version 2 of
461+ the License or (at your option) version 3 or any later version
462+ accepted by the membership of KDE e.V. (or its successor approved
463+ by the membership of KDE e.V.), which shall act as a proxy
464+ defined in Section 14 of version 3 of the license.
465+
466+ This program is distributed in the hope that it will be useful,
467+ but WITHOUT ANY WARRANTY; without even the implied warranty of
468+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
469+ GNU General Public License for more details.
470+
471+ You should have received a copy of the GNU General Public License
472+ along with this program. If not, see <http://www.gnu.org/licenses/>.
473+*/
474+
475+#include <QtCore/QString>
476+
477+#include <LibQApt/Globals>
478+#include <KLocalizedString>
479+#include "QAptDecorator.h"
480+
481+QString QAptDecorator::errorText(QApt::ErrorCode error, QApt::Transaction *trans)
482+{
483+ QString text;
484+
485+ switch (error) {
486+ case QApt::InitError:
487+ text = i18nc("@label", "The package system could not be initialized, your "
488+ "configuration may be broken.");
489+ break;
490+ case QApt::LockError:
491+ text = i18nc("@label",
492+ "Another application seems to be using the package "
493+ "system at this time. You must close all other package "
494+ "managers before you will be able to install or remove "
495+ "any packages.");
496+ break;
497+ case QApt::DiskSpaceError:
498+ text = i18nc("@label",
499+ "You do not have enough disk space in the directory "
500+ "at %1 to continue with this operation.", trans->errorDetails());
501+ break;
502+ case QApt::FetchError:
503+ text = i18nc("@label", "Could not download packages");
504+ break;
505+ case QApt::CommitError:
506+ text = i18nc("@label", "An error occurred while applying changes:");
507+ break;
508+ case QApt::AuthError:
509+ text = i18nc("@label",
510+ "This operation cannot continue since proper "
511+ "authorization was not provided");
512+ break;
513+ case QApt::WorkerDisappeared:
514+ text = i18nc("@label", "It appears that the QApt worker has either crashed "
515+ "or disappeared. Please report a bug to the QApt maintainers");
516+ break;
517+ case QApt::UntrustedError:
518+ text = i18ncp("@label",
519+ "The following package has not been verified by its author. "
520+ "Downloading untrusted packages has been disallowed "
521+ "by your current configuration.",
522+ "The following packages have not been verified by "
523+ "their authors. "
524+ "Downloading untrusted packages has "
525+ "been disallowed by your current configuration.",
526+ trans->untrustedPackages().size());
527+ break;
528+ default:
529+ break;
530+ }
531+
532+ return text;
533+}
534\ No newline at end of file
535
536=== added file 'src/QAptDecorator.h'
537--- src/QAptDecorator.h 1970-01-01 00:00:00 +0000
538+++ src/QAptDecorator.h 2013-07-17 00:34:26 +0000
539@@ -0,0 +1,34 @@
540+/*
541+ Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> (cacheupdate example in QApt)
542+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
543+
544+ This program is free software; you can redistribute it and/or
545+ modify it under the terms of the GNU General Public License as
546+ published by the Free Software Foundation; either version 2 of
547+ the License or (at your option) version 3 or any later version
548+ accepted by the membership of KDE e.V. (or its successor approved
549+ by the membership of KDE e.V.), which shall act as a proxy
550+ defined in Section 14 of version 3 of the license.
551+
552+ This program is distributed in the hope that it will be useful,
553+ but WITHOUT ANY WARRANTY; without even the implied warranty of
554+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
555+ GNU General Public License for more details.
556+
557+ You should have received a copy of the GNU General Public License
558+ along with this program. If not, see <http://www.gnu.org/licenses/>.
559+*/
560+
561+#ifndef QAPTDECORATOR_H
562+#define QAPTDECORATOR_H
563+
564+#include <LibQApt/Globals>
565+#include <LibQApt/Transaction>
566+
567+class QAptDecorator
568+{
569+public:
570+ static QString errorText(QApt::ErrorCode error, QApt::Transaction *trans);
571+};
572+
573+#endif // QAPTDECORATOR_H

Subscribers

People subscribed via source and target branches