Merge lp:~larryprice/libertine/listmodel-crash into lp:libertine

Proposed by Larry Price
Status: Merged
Approved by: Christopher Townsend
Approved revision: 274
Merged at revision: 287
Proposed branch: lp:~larryprice/libertine/listmodel-crash
Merge into: lp:libertine
Diff against target: 173 lines (+28/-23)
6 files modified
libertine/ContainerAppsList.cpp (+2/-7)
libertine/ContainerAppsList.h (+2/-1)
libertine/ContainerArchivesList.cpp (+2/-7)
libertine/ContainerArchivesList.h (+2/-1)
libertine/qml/ContainersView.qml (+16/-6)
python/libertine/ChrootContainer.py (+4/-1)
To merge this branch: bzr merge lp:~larryprice/libertine/listmodel-crash
Reviewer Review Type Date Requested Status
Libertine CI Bot continuous-integration Approve
Christopher Townsend (community) Approve
Review via email: mp+302854@code.launchpad.net

Commit message

Return user to homepage when container has been destroyed from under them.

Description of the change

Return user to homepage when container has been destroyed from under them.

Also check our listmodels for null before trying to call methods on them, especially from noexcept methods (:

To post a comment you must log in.
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

PASSED: Continuous integration, rev:273
https://jenkins.canonical.com/libertine/job/lp-libertine-ci/98/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/283
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/233
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/215/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/269
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/269
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/269
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/262/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/262/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/262/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/262/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/262/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/262
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/262/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/libertine/job/lp-libertine-ci/98/rebuild

review: Approve (continuous-integration)
Revision history for this message
Christopher Townsend (townsend) wrote :

Works well and no more crash.

Just one inline comment.

Thanks!

review: Needs Information
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

PASSED: Continuous integration, rev:274
https://jenkins.canonical.com/libertine/job/lp-libertine-ci/99/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/284
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/234
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/234
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/234
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/234
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/234
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/234
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/216/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/270
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/270
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/270
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/263/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/263/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/263/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/263/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/263/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/263
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/263/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/libertine/job/lp-libertine-ci/99/rebuild

review: Approve (continuous-integration)
Revision history for this message
Christopher Townsend (townsend) wrote :

Ok, looks good. Thanks!

review: Approve
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
https://jenkins.canonical.com/libertine/job/lp-libertine-autoland/39/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/235
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/235
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/235
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/235
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/235
    FAILURE: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/235/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-land-mp/64/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/271
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/271
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/271
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/264/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/264/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/264/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/264/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/264/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/264
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/264/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) :
review: Approve (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) wrote :

FAILED: Autolanding.
Approved revid is not set in launchpad. This is most likely a launchpad issue and re-approve should fix it. There is also a chance (although a very small one) this is a permission problem of the ps-jenkins bot.
https://jenkins.canonical.com/libertine/job/lp-libertine-autoland/40/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/238
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/238
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/238
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/238
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/238
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/238
    None: https://jenkins.canonical.com/libertine/job/lp-generic-land-mp/65/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/290
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/274
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/274
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/274
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/267/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/267/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/267/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/267/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/267/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/267
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/267/artifact/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
Libertine CI Bot (libertine-ci-bot) :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'libertine/ContainerAppsList.cpp'
--- libertine/ContainerAppsList.cpp 2016-03-24 14:15:26 +0000
+++ libertine/ContainerAppsList.cpp 2016-08-15 16:00:34 +0000
@@ -27,11 +27,6 @@
27{ }27{ }
2828
2929
30ContainerAppsList::
31~ContainerAppsList()
32{ }
33
34
35void ContainerAppsList::30void ContainerAppsList::
36setContainerApps(QString const& container_id)31setContainerApps(QString const& container_id)
37{32{
@@ -51,12 +46,12 @@
5146
52bool ContainerAppsList::47bool ContainerAppsList::
53empty() const noexcept48empty() const noexcept
54{ return apps_->empty(); }49{ return apps_ == nullptr || apps_->empty(); }
5550
5651
57ContainerAppsList::size_type ContainerAppsList::52ContainerAppsList::size_type ContainerAppsList::
58size() const noexcept53size() const noexcept
59{ return apps_->count(); }54{ return apps_ != nullptr ? apps_->count() : 0;}
6055
6156
62int ContainerAppsList::57int ContainerAppsList::
6358
=== modified file 'libertine/ContainerAppsList.h'
--- libertine/ContainerAppsList.h 2016-03-24 14:15:26 +0000
+++ libertine/ContainerAppsList.h 2016-08-15 16:00:34 +0000
@@ -53,7 +53,8 @@
53 ContainerAppsList(ContainerConfigList* container_config_list,53 ContainerAppsList(ContainerConfigList* container_config_list,
54 QObject* parent = nullptr);54 QObject* parent = nullptr);
5555
56 ~ContainerAppsList();56 virtual
57 ~ContainerAppsList() = default;
5758
58 Q_INVOKABLE void59 Q_INVOKABLE void
59 setContainerApps(QString const& container_id);60 setContainerApps(QString const& container_id);
6061
=== modified file 'libertine/ContainerArchivesList.cpp'
--- libertine/ContainerArchivesList.cpp 2016-03-10 21:33:25 +0000
+++ libertine/ContainerArchivesList.cpp 2016-08-15 16:00:34 +0000
@@ -27,11 +27,6 @@
27{ }27{ }
2828
2929
30ContainerArchivesList::
31~ContainerArchivesList()
32{ }
33
34
35void ContainerArchivesList::30void ContainerArchivesList::
36setContainerArchives(QString const& container_id)31setContainerArchives(QString const& container_id)
37{32{
@@ -44,12 +39,12 @@
4439
45bool ContainerArchivesList::40bool ContainerArchivesList::
46empty() const noexcept41empty() const noexcept
47{ return archives_->empty(); }42{ return archives_ == nullptr || archives_->empty(); }
4843
4944
50ContainerArchivesList::size_type ContainerArchivesList::45ContainerArchivesList::size_type ContainerArchivesList::
51size() const noexcept46size() const noexcept
52{ return archives_->count(); }47{ return archives_ != nullptr ? archives_->count() : 0; }
5348
5449
55int ContainerArchivesList::50int ContainerArchivesList::
5651
=== modified file 'libertine/ContainerArchivesList.h'
--- libertine/ContainerArchivesList.h 2016-03-10 21:33:25 +0000
+++ libertine/ContainerArchivesList.h 2016-08-15 16:00:34 +0000
@@ -53,7 +53,8 @@
53 ContainerArchivesList(ContainerConfigList* container_config_list,53 ContainerArchivesList(ContainerConfigList* container_config_list,
54 QObject* parent = nullptr);54 QObject* parent = nullptr);
5555
56 ~ContainerArchivesList();56 virtual
57 ~ContainerArchivesList() = default;
5758
58 Q_INVOKABLE void59 Q_INVOKABLE void
59 setContainerArchives(QString const& container_id);60 setContainerArchives(QString const& container_id);
6061
=== modified file 'libertine/qml/ContainersView.qml'
--- libertine/qml/ContainersView.qml 2016-07-15 18:39:58 +0000
+++ libertine/qml/ContainersView.qml 2016-08-15 16:00:34 +0000
@@ -55,8 +55,12 @@
55 }55 }
56 model: containerConfigList56 model: containerConfigList
5757
58 function edit(containerId) {58 function edit(id, status) {
59 mainView.currentContainer = containerId59 if (status === "removing") {
60 mainView.error(i18n.tr("Container Unavailable"), i18n.tr("Container is being destroyed and is no longer editable."))
61 return
62 }
63 mainView.currentContainer = id
60 containerAppsList.setContainerApps(mainView.currentContainer)64 containerAppsList.setContainerApps(mainView.currentContainer)
61 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})65 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})
62 }66 }
@@ -82,7 +86,7 @@
82 running: containerActivity.visible86 running: containerActivity.visible
83 }87 }
8488
85 onClicked: { containersList.edit(containerId) }89 onClicked: { containersList.edit(containerId, installStatus) }
8690
87 leadingActions: ListItemActions {91 leadingActions: ListItemActions {
88 actions: [92 actions: [
@@ -92,8 +96,8 @@
92 description: i18n.tr("Delete Container")96 description: i18n.tr("Delete Container")
93 onTriggered: {97 onTriggered: {
94 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)98 var worker = Qt.createComponent("ContainerManager.qml").createObject(mainView)
99 worker.error.connect(mainView.error)
95 worker.destroyContainer(containerId)100 worker.destroyContainer(containerId)
96 mainView.currentContainer = containerId
97 }101 }
98 }102 }
99 ]103 ]
@@ -117,7 +121,7 @@
117 visible: (installStatus === i18n.tr("ready") ||121 visible: (installStatus === i18n.tr("ready") ||
118 installStatus === i18n.tr("updating")) ? true : false122 installStatus === i18n.tr("updating")) ? true : false
119 onTriggered: {123 onTriggered: {
120 containersList.edit(containerId)124 containersList.edit(containerId, installStatus)
121 }125 }
122 }126 }
123 ]127 ]
@@ -128,13 +132,19 @@
128 Component.onCompleted: {132 Component.onCompleted: {
129 containerConfigList.configChanged.connect(updateContainerList)133 containerConfigList.configChanged.connect(updateContainerList)
130 }134 }
131 135
132 Component.onDestruction: {136 Component.onDestruction: {
133 containerConfigList.configChanged.disconnect(updateContainerList)137 containerConfigList.configChanged.disconnect(updateContainerList)
134 }138 }
135139
136 function updateContainerList() {140 function updateContainerList() {
137 containerConfigList.reloadContainerList()141 containerConfigList.reloadContainerList()
142
143 if (mainView.currentContainer && !containerConfigList.getContainerStatus(mainView.currentContainer) && pageStack.currentPage !== containersView) {
144 pageStack.pop()
145 mainView.currentContainer = ""
146 mainView.error(i18n.tr("Container Unavailable"), i18n.tr("This container has been destroyed and is no longer valid. You have been returned to the containers overview."))
147 }
138 }148 }
139149
140 function showPasswordDialog(enableMultiarch, containerName) {150 function showPasswordDialog(enableMultiarch, containerName) {
141151
=== modified file 'python/libertine/ChrootContainer.py'
--- python/libertine/ChrootContainer.py 2016-08-09 13:58:26 +0000
+++ python/libertine/ChrootContainer.py 2016-08-15 16:00:34 +0000
@@ -61,7 +61,10 @@
6161
62 def destroy_libertine_container(self):62 def destroy_libertine_container(self):
63 container_root = os.path.join(utils.get_libertine_containers_dir_path(), self.container_id)63 container_root = os.path.join(utils.get_libertine_containers_dir_path(), self.container_id)
64 shutil.rmtree(container_root)64 try:
65 shutil.rmtree(container_root)
66 except Exception as e:
67 print("%s" % e)
6568
66 def create_libertine_container(self, password=None, multiarch=False, verbosity=1):69 def create_libertine_container(self, password=None, multiarch=False, verbosity=1):
67 # Create the actual chroot70 # Create the actual chroot

Subscribers

People subscribed via source and target branches