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: 576 lines (+410/-9)
9 files modified
CMakeLists.txt (+2/-0)
src/CMakeLists.txt (+2/-0)
src/DebugFinder.cpp (+149/-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 Needs Fixing
Review via email: mp+175180@code.launchpad.net

This proposal supersedes a proposal from 2013-07-16.

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

Description of the change

NOW we're ready for merging. This implements https://wiki.ubuntu.com/DebuggingProgramCrash#Debug_Symbol_Packages. Added the base repo, too.

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

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

Revision history for this message
Michael D. Stemle, Jr. (manchicken) wrote :

I've added that base repository now, please re-review.

Revision history for this message
Jonathan Thomas (echidnaman) wrote :

One comment, when the cache update transaction finishes, you'll need to call m_backend->reload() to ensure the new package is available. (Build a new cache based on the new source info) Strange things can happen if you don't.

Looks good otherwise. Sorry for the delay in reviewing; real life has been a bit crazy lately...

review: Needs Fixing
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-22 19:46: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-22 19:46: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-22 19:46: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,130 @@
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() << "Done with updateCache(), reloading cache...";
158+ m_backend->reloadCache();
159+
160+ kDebug() << "I'm done.";
161+ m_progress.progressBar()->setValue(100);
162+
163+ this->find();
164+
165+ return;
166+}
167+
168+void DebugFinder::onTxnStatusChanged(QApt::TransactionStatus status)
169+{
170+ QString headerText;
171+
172+ kDebug() << "cache widget: transaction status changed" << status;
173+
174+ if (this->m_txn == NULL) {
175+ kDebug() << "NULL transaction.";
176+ return;
177+ }
178+
179+ switch (status) {
180+ case QApt::DownloadingStatus:
181+ if (this->m_txn->role() == QApt::UpdateCacheRole)
182+ {
183+ headerText = i18n("<b>Updating software sources</b>");
184+ }
185+ else
186+ {
187+ headerText = i18n("<b>Downloading Packages</b>");
188+ }
189+
190+ m_progress.setLabelText(headerText);
191+ break;
192+
193+ case QApt::FinishedStatus:
194+ headerText = i18n("<b>Finished.</b>");
195+ m_progress.setLabelText(headerText);
196+ break;
197+
198+ default:
199+ break;
200+ }
201+}
202+
203+void DebugFinder::onAptError(QApt::ErrorCode errcode)
204+{
205+ QString errmsg = QAptDecorator::errorText(errcode, this->m_txn);
206+ kDebug() << "Got an error: " << errmsg;
207+
208+ KMessageBox::error(
209+ NULL,
210+ i18nc("@info Error message", "Error updating sources"
211+ " after configuring debug sources"),
212+ i18nc("@title:window", "Failed updating sources")
213+ );
214+}
215+
216+void DebugFinder::onProgressChanged(int progress)
217+{
218+ kDebug() << "Progress changed to " << progress;
219+
220+ int presentProgress = progress;
221+
222+ if (progress >= 100) {
223+ presentProgress = 0;
224+ }
225+ m_progress.progressBar()->setValue(presentProgress);
226+}
227
228=== modified file 'src/DebugFinder.h'
229--- src/DebugFinder.h 2012-10-30 15:16:47 +0000
230+++ src/DebugFinder.h 2013-07-22 19:46:26 +0000
231@@ -1,6 +1,7 @@
232 /*
233 Copyright © 2010 Harald Sitter <apachelogger@ubuntu.com>
234 Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org>
235+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
236
237 This program is free software; you can redistribute it and/or
238 modify it under the terms of the GNU General Public License as
239@@ -22,13 +23,25 @@
240 #ifndef DEBUGFINDER_H
241 #define DEBUGFINDER_H
242
243+#include <LibQApt/Globals>
244+
245 #include <QtCore/QObject>
246 #include <QtCore/QStringList>
247+#include <KProgressDialog>
248+
249+#define REPO_ARG_BASE "deb http://ddebs.ubuntu.com %1 main restricted universe multiverse"
250+#define REPO_ARG_UPDATES "deb http://ddebs.ubuntu.com %1-updates main restricted universe multiverse"
251+#define REPO_ARG_SECURITY "deb http://ddebs.ubuntu.com %1-security main restricted universe multiverse"
252+#define REPO_ARG_PROPOSED "deb http://ddebs.ubuntu.com %1-proposed main restricted universe multiverse"
253+#define DDEB_REPO_FILE "/etc/apt/sources.list.d/ddebs.list"
254
255 namespace QApt {
256 class Backend;
257 class Package;
258-}
259+ class SourceEntry;
260+ class SourcesList;
261+ class Transaction;
262+};
263
264 class DebugFinder : public QObject
265 {
266@@ -36,18 +49,32 @@
267 public:
268 explicit DebugFinder(QObject *parent = 0);
269
270+ void performUpdate();
271+
272 public slots:
273- void find(const QString &file);
274+ void startFinding(const QString &file);
275+ void find();
276 void stop();
277-
278+ void onTxnStatusChanged(QApt::TransactionStatus status);
279+ void onAptError(QApt::ErrorCode errcode);
280+ void onUpdateFinished();
281+ void onProgressChanged(int progress);
282+
283 signals:
284 void foundDbgPkg(const QString &dbgpkg);
285- void foundNoDbgPkg(const QString &file);
286+ void foundNoDbgPkg(const QString &dbgpkg);
287 void alreadyInstalled();
288+ void updateFinishing();
289
290 private:
291 QApt::Package *getDbgPkg(QApt::Package *package);
292 QApt::Backend *m_backend;
293+ QApt::Transaction *m_txn;
294+ KProgressDialog m_progress;
295+ QString m_file;
296+ int m_srcCount;
297+ int m_srcUpdated;
298+ int m_lastProgress;
299
300 bool m_stop;
301 };
302
303=== modified file 'src/DebugInstaller.cpp'
304--- src/DebugInstaller.cpp 2011-09-26 13:35:14 +0000
305+++ src/DebugInstaller.cpp 2013-07-22 19:46:26 +0000
306@@ -1,6 +1,7 @@
307 /*
308 Copyright © 2010 Harald Sitter <apachelogger@ubuntu.com>
309 Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org>
310+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
311
312 This program is free software; you can redistribute it and/or
313 modify it under the terms of the GNU General Public License as
314@@ -163,7 +164,7 @@
315 progressBar()->setMaximum(m_args.count());
316 incrementProgress();
317
318- m_finder = new DebugFinder;
319+ m_finder = new DebugFinder(this);
320 connect(m_finder, SIGNAL(foundDbgPkg(QString)), this, SLOT(foundDbgPkg(QString)));
321 connect(m_finder, SIGNAL(foundNoDbgPkg(QString)), this, SLOT(foundNoDbgPkg(QString)));
322 connect(m_finder, SIGNAL(alreadyInstalled()), this, SLOT(alreadyInstalled()));
323@@ -173,7 +174,7 @@
324 m_finderThread->start();
325
326 foreach (const QString &file, m_args) {
327- QMetaObject::invokeMethod(m_finder, "find", Qt::QueuedConnection,
328+ QMetaObject::invokeMethod(m_finder, "startFinding", Qt::QueuedConnection,
329 Q_ARG(QString, file));
330 }
331 }
332
333=== added file 'src/LSBRelease.cpp'
334--- src/LSBRelease.cpp 1970-01-01 00:00:00 +0000
335+++ src/LSBRelease.cpp 2013-07-22 19:46:26 +0000
336@@ -0,0 +1,66 @@
337+/*
338+ Copyright (C) 2012 Harald Sitter <apachelogger@ubuntu.com>
339+
340+ This program is free software; you can redistribute it and/or
341+ modify it under the terms of the GNU General Public License as
342+ published by the Free Software Foundation; either version 2 of
343+ the License or (at your option) version 3 or any later version
344+ accepted by the membership of KDE e.V. (or its successor approved
345+ by the membership of KDE e.V.), which shall act as a proxy
346+ defined in Section 14 of version 3 of the license.
347+
348+ This program is distributed in the hope that it will be useful,
349+ but WITHOUT ANY WARRANTY; without even the implied warranty of
350+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
351+ GNU General Public License for more details.
352+
353+ You should have received a copy of the GNU General Public License
354+ along with this program. If not, see <http://www.gnu.org/licenses/>.
355+*/
356+
357+#include "LSBRelease.h"
358+
359+#include <QtCore/QFile>
360+
361+#include <KDebug>
362+#include <KLocalizedString>
363+
364+LSBRelease::LSBRelease()
365+{
366+ QFile file("/etc/lsb-release");
367+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
368+ kDebug() << "Could not open /etc/lsb-release, aborting LSB";
369+ QString unknown = i18nc("@label", "Unknown");
370+ m_id = unknown;
371+ m_release = unknown;
372+ m_codename = unknown;
373+ m_description = unknown;
374+ return;
375+ }
376+
377+ // List of valid column identifiers
378+ QString line;
379+ QStringList comps;
380+ while (!file.atEnd()) {
381+ line = file.readLine();
382+ comps = line.split(QChar('='));
383+// #warning unknown set?
384+ Q_ASSERT(comps.size() == 2);
385+ QString key = comps.at(0);
386+ QString value = comps.at(1).trimmed();
387+ if (key == QLatin1String("DISTRIB_ID"))
388+ m_id = value;
389+ else if (key == QLatin1String("DISTRIB_RELEASE"))
390+ m_release = value;
391+ else if (key == QLatin1String("DISTRIB_CODENAME"))
392+ m_codename = value;
393+ else if (key == QLatin1String("DISTRIB_DESCRIPTION"))
394+ m_description = value;
395+ else
396+ Q_ASSERT(false); // Should not happen!
397+ }
398+
399+// #warning unknown set?
400+ if (m_id.isEmpty() || m_release.isEmpty())
401+ Q_ASSERT(false); // meh.
402+}
403\ No newline at end of file
404
405=== added file 'src/LSBRelease.h'
406--- src/LSBRelease.h 1970-01-01 00:00:00 +0000
407+++ src/LSBRelease.h 2013-07-22 19:46:26 +0000
408@@ -0,0 +1,43 @@
409+/*
410+ Copyright (C) 2012 Harald Sitter <apachelogger@ubuntu.com>
411+
412+ This program is free software; you can redistribute it and/or
413+ modify it under the terms of the GNU General Public License as
414+ published by the Free Software Foundation; either version 2 of
415+ the License or (at your option) version 3 or any later version
416+ accepted by the membership of KDE e.V. (or its successor approved
417+ by the membership of KDE e.V.), which shall act as a proxy
418+ defined in Section 14 of version 3 of the license.
419+
420+ This program is distributed in the hope that it will be useful,
421+ but WITHOUT ANY WARRANTY; without even the implied warranty of
422+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
423+ GNU General Public License for more details.
424+
425+ You should have received a copy of the GNU General Public License
426+ along with this program. If not, see <http://www.gnu.org/licenses/>.
427+*/
428+
429+#ifndef LSBRELEASE_H
430+#define LSBRELEASE_H
431+
432+#include <QtCore/QString>
433+
434+class LSBRelease
435+{
436+public:
437+ LSBRelease();
438+
439+ QString id() { return m_id; }
440+ QString release() { return m_release; }
441+ QString codename() { return m_codename; }
442+ QString description() { return m_description; }
443+
444+private:
445+ QString m_id;
446+ QString m_release;
447+ QString m_codename;
448+ QString m_description;
449+};
450+
451+#endif // LSBRELEASE_H
452
453=== added file 'src/QAptDecorator.cpp'
454--- src/QAptDecorator.cpp 1970-01-01 00:00:00 +0000
455+++ src/QAptDecorator.cpp 2013-07-22 19:46:26 +0000
456@@ -0,0 +1,80 @@
457+/*
458+ Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> (cacheupdate example in QApt)
459+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
460+
461+ This program is free software; you can redistribute it and/or
462+ modify it under the terms of the GNU General Public License as
463+ published by the Free Software Foundation; either version 2 of
464+ the License or (at your option) version 3 or any later version
465+ accepted by the membership of KDE e.V. (or its successor approved
466+ by the membership of KDE e.V.), which shall act as a proxy
467+ defined in Section 14 of version 3 of the license.
468+
469+ This program is distributed in the hope that it will be useful,
470+ but WITHOUT ANY WARRANTY; without even the implied warranty of
471+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
472+ GNU General Public License for more details.
473+
474+ You should have received a copy of the GNU General Public License
475+ along with this program. If not, see <http://www.gnu.org/licenses/>.
476+*/
477+
478+#include <QtCore/QString>
479+
480+#include <LibQApt/Globals>
481+#include <KLocalizedString>
482+#include "QAptDecorator.h"
483+
484+QString QAptDecorator::errorText(QApt::ErrorCode error, QApt::Transaction *trans)
485+{
486+ QString text;
487+
488+ switch (error) {
489+ case QApt::InitError:
490+ text = i18nc("@label", "The package system could not be initialized, your "
491+ "configuration may be broken.");
492+ break;
493+ case QApt::LockError:
494+ text = i18nc("@label",
495+ "Another application seems to be using the package "
496+ "system at this time. You must close all other package "
497+ "managers before you will be able to install or remove "
498+ "any packages.");
499+ break;
500+ case QApt::DiskSpaceError:
501+ text = i18nc("@label",
502+ "You do not have enough disk space in the directory "
503+ "at %1 to continue with this operation.", trans->errorDetails());
504+ break;
505+ case QApt::FetchError:
506+ text = i18nc("@label", "Could not download packages");
507+ break;
508+ case QApt::CommitError:
509+ text = i18nc("@label", "An error occurred while applying changes:");
510+ break;
511+ case QApt::AuthError:
512+ text = i18nc("@label",
513+ "This operation cannot continue since proper "
514+ "authorization was not provided");
515+ break;
516+ case QApt::WorkerDisappeared:
517+ text = i18nc("@label", "It appears that the QApt worker has either crashed "
518+ "or disappeared. Please report a bug to the QApt maintainers");
519+ break;
520+ case QApt::UntrustedError:
521+ text = i18ncp("@label",
522+ "The following package has not been verified by its author. "
523+ "Downloading untrusted packages has been disallowed "
524+ "by your current configuration.",
525+ "The following packages have not been verified by "
526+ "their authors. "
527+ "Downloading untrusted packages has "
528+ "been disallowed by your current configuration.",
529+ trans->untrustedPackages().size());
530+ break;
531+ default:
532+ break;
533+ }
534+
535+ return text;
536+}
537\ No newline at end of file
538
539=== added file 'src/QAptDecorator.h'
540--- src/QAptDecorator.h 1970-01-01 00:00:00 +0000
541+++ src/QAptDecorator.h 2013-07-22 19:46:26 +0000
542@@ -0,0 +1,34 @@
543+/*
544+ Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> (cacheupdate example in QApt)
545+ Copyright © 2013 Michael D. Stemle, Jr. <themanchicken@gmail.com>
546+
547+ This program is free software; you can redistribute it and/or
548+ modify it under the terms of the GNU General Public License as
549+ published by the Free Software Foundation; either version 2 of
550+ the License or (at your option) version 3 or any later version
551+ accepted by the membership of KDE e.V. (or its successor approved
552+ by the membership of KDE e.V.), which shall act as a proxy
553+ defined in Section 14 of version 3 of the license.
554+
555+ This program is distributed in the hope that it will be useful,
556+ but WITHOUT ANY WARRANTY; without even the implied warranty of
557+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
558+ GNU General Public License for more details.
559+
560+ You should have received a copy of the GNU General Public License
561+ along with this program. If not, see <http://www.gnu.org/licenses/>.
562+*/
563+
564+#ifndef QAPTDECORATOR_H
565+#define QAPTDECORATOR_H
566+
567+#include <LibQApt/Globals>
568+#include <LibQApt/Transaction>
569+
570+class QAptDecorator
571+{
572+public:
573+ static QString errorText(QApt::ErrorCode error, QApt::Transaction *trans);
574+};
575+
576+#endif // QAPTDECORATOR_H

Subscribers

People subscribed via source and target branches