Merge lp:~townsend/libertine/release-1.1 into lp:libertine/trunk

Proposed by Christopher Townsend
Status: Merged
Approved by: Stephen M. Webb
Approved revision: 130
Merged at revision: 130
Proposed branch: lp:~townsend/libertine/release-1.1
Merge into: lp:libertine/trunk
Diff against target: 3776 lines (+1327/-1547)
36 files modified
data/CMakeLists.txt (+1/-3)
data/demo/CMakeLists.txt (+0/-4)
data/demo/desktop_files/CMakeLists.txt (+0/-24)
data/demo/desktop_files/puritine_firefox_0.0.desktop.in (+0/-11)
data/demo/desktop_files/puritine_gedit_0.0.desktop.in (+0/-11)
data/demo/desktop_files/puritine_gimp_0.0.desktop.in (+0/-11)
data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in (+0/-11)
data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in (+0/-11)
data/demo/icons/accessories-text-editor.svg (+0/-119)
data/puritine-click.conf (+0/-39)
debian/changelog (+23/-0)
debian/control (+5/-11)
debian/libertine-demo.install (+0/-4)
debian/libertine-demo.lintian-overrides (+0/-5)
debian/libertine-tools.install (+2/-0)
libertine/ContainerManager.cpp (+222/-431)
libertine/ContainerManager.h (+25/-112)
libertine/qml/ContainerPasswordDialog.qml (+3/-9)
libertine/qml/ContainersView.qml (+3/-5)
libertine/qml/ExtraArchivesView.qml (+4/-10)
libertine/qml/HomeView.qml (+29/-33)
libertine/qml/ManageContainer.qml (+8/-14)
libertine/qml/PackageInfoView.qml (+47/-11)
libertine/qml/SearchResultsView.qml (+1/-4)
libertine/qml/libertine.qml (+37/-2)
po/en_US.po (+365/-365)
po/libertine.pot (+247/-223)
python/libertine/ChrootContainer.py (+3/-3)
python/libertine/Libertine.py (+16/-10)
python/libertine/LxcContainer.py (+1/-1)
python/libertine/utils.py (+17/-0)
tools/CMakeLists.txt (+3/-0)
tools/bash_completion.d/libertine-container-manager (+72/-0)
tools/libertine-container-manager (+74/-20)
tools/libertine-launch (+36/-12)
tools/libertine-session-bridge (+83/-18)
To merge this branch: bzr merge lp:~townsend/libertine/release-1.1
Reviewer Review Type Date Requested Status
Stephen M. Webb (community) Approve
Review via email: mp+296611@code.launchpad.net

Description of the change

No commit message necessary due to how ci-train is making changelog entries.

To post a comment you must log in.
Revision history for this message
Stephen M. Webb (bregma) wrote :

No evil code herein. I'm not sure about all the empty translation strings, we'll see if it causes problems during testing.

review: Approve
lp:~townsend/libertine/release-1.1 updated
131. By Christopher Townsend

Update .pot/.po files for this release.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/CMakeLists.txt'
2--- data/CMakeLists.txt 2016-05-02 20:45:21 +0000
3+++ data/CMakeLists.txt 2016-06-07 12:41:22 +0000
4@@ -1,10 +1,8 @@
5-add_subdirectory(demo)
6-
7 install(FILES libertine.desktop
8 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
9 install(FILES libertine_64.png libertine-lxc.conf
10 DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME})
11-install(FILES puritine-click.conf libertine-lxc-manager.conf libertine-xmir.conf
12+install(FILES libertine-lxc-manager.conf libertine-xmir.conf
13 DESTINATION ${CMAKE_INSTALL_DATADIR}/upstart/sessions)
14 install(FILES puritine-15.04.1.framework
15 DESTINATION ${CMAKE_INSTALL_DATADIR}/click/frameworks)
16
17=== removed directory 'data/demo'
18=== removed file 'data/demo/CMakeLists.txt'
19--- data/demo/CMakeLists.txt 2015-09-01 20:32:12 +0000
20+++ data/demo/CMakeLists.txt 1970-01-01 00:00:00 +0000
21@@ -1,4 +0,0 @@
22-add_subdirectory(desktop_files)
23-
24-install(DIRECTORY icons/
25- DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}/demo/icons)
26
27=== removed directory 'data/demo/desktop_files'
28=== removed file 'data/demo/desktop_files/CMakeLists.txt'
29--- data/demo/desktop_files/CMakeLists.txt 2015-09-18 14:35:55 +0000
30+++ data/demo/desktop_files/CMakeLists.txt 1970-01-01 00:00:00 +0000
31@@ -1,24 +0,0 @@
32-execute_process(COMMAND dpkg-architecture -qDEB_BUILD_ARCH
33- OUTPUT_VARIABLE BUILD_ARCH
34- OUTPUT_STRIP_TRAILING_WHITESPACE
35-)
36-
37-configure_file("puritine_firefox_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_firefox_0.0.desktop" @ONLY)
38-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_firefox_0.0.desktop"
39- DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
40-
41-configure_file("puritine_gedit_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_gedit_0.0.desktop" @ONLY)
42-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_gedit_0.0.desktop"
43- DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
44-
45-configure_file("puritine_gimp_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_gimp_0.0.desktop" @ONLY)
46-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_gimp_0.0.desktop"
47- DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
48-
49-configure_file("puritine_libreoffice-startcenter_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_libreoffice-startcenter_0.0.desktop" @ONLY)
50-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_libreoffice-startcenter_0.0.desktop"
51- DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
52-
53-configure_file("puritine_xchat-gnome_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_xchat-gnome_0.0.desktop" @ONLY)
54-install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_xchat-gnome_0.0.desktop"
55- DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
56
57=== removed file 'data/demo/desktop_files/puritine_firefox_0.0.desktop.in'
58--- data/demo/desktop_files/puritine_firefox_0.0.desktop.in 2015-09-18 14:35:55 +0000
59+++ data/demo/desktop_files/puritine_firefox_0.0.desktop.in 1970-01-01 00:00:00 +0000
60@@ -1,11 +0,0 @@
61-[Desktop Entry]
62-Version=1.0
63-Name=Firefox
64-Exec=/bin/true
65-Type=Application
66-StartupNotify=true
67-Icon=/usr/share/libertine/demo/icons/firefox.png
68-Keywords=Libertine
69-NotShowIn=Unity;
70-X-Ubuntu-Touch=true
71-X-Ubuntu-XMir-Enable=true
72
73=== removed file 'data/demo/desktop_files/puritine_gedit_0.0.desktop.in'
74--- data/demo/desktop_files/puritine_gedit_0.0.desktop.in 2015-09-18 14:35:55 +0000
75+++ data/demo/desktop_files/puritine_gedit_0.0.desktop.in 1970-01-01 00:00:00 +0000
76@@ -1,11 +0,0 @@
77-[Desktop Entry]
78-Version=1.0
79-Name=Gedit
80-Exec=/bin/true
81-Type=Application
82-StartupNotify=true
83-Icon=/usr/share/libertine/demo/icons/accessories-text-editor.svg
84-Keywords=Libertine
85-NotShowIn=Unity;
86-X-Ubuntu-Touch=true
87-X-Ubuntu-XMir-Enable=true
88
89=== removed file 'data/demo/desktop_files/puritine_gimp_0.0.desktop.in'
90--- data/demo/desktop_files/puritine_gimp_0.0.desktop.in 2015-09-18 14:35:55 +0000
91+++ data/demo/desktop_files/puritine_gimp_0.0.desktop.in 1970-01-01 00:00:00 +0000
92@@ -1,11 +0,0 @@
93-[Desktop Entry]
94-Version=1.0
95-Name=GIMP Image Editor
96-Exec=/bin/true
97-Type=Application
98-StartupNotify=true
99-Icon=/usr/share/libertine/demo/icons/gimp.png
100-Keywords=Libertine
101-NotShowIn=Unity;
102-X-Ubuntu-Touch=true
103-X-Ubuntu-XMir-Enable=true
104
105=== removed file 'data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in'
106--- data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in 2015-09-18 14:35:55 +0000
107+++ data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in 1970-01-01 00:00:00 +0000
108@@ -1,11 +0,0 @@
109-[Desktop Entry]
110-Version=1.0
111-Name=LibreOffice
112-Exec=/bin/true
113-Type=Application
114-StartupNotify=true
115-Icon=/usr/share/libertine/demo/icons/libreoffice-startcenter.png
116-Keywords=Libertine
117-NotShowIn=Unity;
118-X-Ubuntu-Touch=true
119-X-Ubuntu-XMir-Enable=true
120
121=== removed file 'data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in'
122--- data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in 2015-09-18 14:35:55 +0000
123+++ data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in 1970-01-01 00:00:00 +0000
124@@ -1,11 +0,0 @@
125-[Desktop Entry]
126-Version=1.0
127-Name=XChat-GNOME
128-Exec=/bin/true
129-Type=Application
130-StartupNotify=true
131-Icon=/usr/share/libertine/demo/icons/xchat-gnome.png
132-Keywords=Libertine
133-NotShowIn=Unity;
134-X-Ubuntu-Touch=true
135-X-Ubuntu-XMir-Enable=true
136
137=== removed directory 'data/demo/icons'
138=== removed file 'data/demo/icons/accessories-text-editor.svg'
139--- data/demo/icons/accessories-text-editor.svg 2015-09-01 20:32:12 +0000
140+++ data/demo/icons/accessories-text-editor.svg 1970-01-01 00:00:00 +0000
141@@ -1,119 +0,0 @@
142-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
143-<!-- Created with Inkscape (http://www.inkscape.org/) -->
144-<svg id="svg2820" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.0" xmlns:cc="http://creativecommons.org/ns#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
145- <metadata id="metadata290">
146- <rdf:RDF>
147- <cc:Work rdf:about="">
148- <dc:format>image/svg+xml</dc:format>
149- <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
150- </cc:Work>
151- </rdf:RDF>
152- </metadata>
153- <defs id="defs2822">
154- <linearGradient id="linearGradient5060">
155- <stop id="stop5062" offset="0"/>
156- <stop id="stop5064" style="stop-opacity:0" offset="1"/>
157- </linearGradient>
158- <linearGradient id="linearGradient3104">
159- <stop id="stop3106" style="stop-color:#a0a0a0" offset="0"/>
160- <stop id="stop3108" style="stop-color:#c8c8c8" offset="1"/>
161- </linearGradient>
162- <linearGradient id="linearGradient2670" y2="26.03" gradientUnits="userSpaceOnUse" x2="9" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -3.6613 16.731)" y1="29.057" x1="9">
163- <stop id="stop2607" style="stop-color:#ece5a5" offset="0"/>
164- <stop id="stop2609" style="stop-color:#fcfbf2" offset="1"/>
165- </linearGradient>
166- <linearGradient id="linearGradient2673" y2="41.392" gradientUnits="userSpaceOnUse" x2="9.5221" gradientTransform="matrix(.56036 .024186 .024156 .55967 19.547 13.104)" y1="37.372" x1="5.5179">
167- <stop id="stop2613" style="stop-color:#dbce48" offset="0"/>
168- <stop id="stop2615" style="stop-color:#c5b625" offset="1"/>
169- </linearGradient>
170- <linearGradient id="linearGradient2676" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -2.3288 15.392)" y1="24.99" x1="30.038">
171- <stop id="stop2599" style="stop-color:#b1b1b1" offset="0"/>
172- <stop id="stop2601" style="stop-color:#fff" offset=".5"/>
173- <stop id="stop2603" style="stop-color:#8f8f8f" offset="1"/>
174- </linearGradient>
175- <linearGradient id="linearGradient2679" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -2.1461 15.208)" y1="24.99" x1="30.038">
176- <stop id="stop2591" style="stop-color:#565656" offset="0"/>
177- <stop id="stop2593" style="stop-color:#9a9a9a" offset=".5"/>
178- <stop id="stop2595" style="stop-color:#545454" offset="1"/>
179- </linearGradient>
180- <linearGradient id="linearGradient2682" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -2.9668 16.033)" y1="24.99" x1="30.038">
181- <stop id="stop2583" style="stop-color:#b1b1b1" offset="0"/>
182- <stop id="stop2585" style="stop-color:#fff" offset=".5"/>
183- <stop id="stop2587" style="stop-color:#8f8f8f" offset="1"/>
184- </linearGradient>
185- <linearGradient id="linearGradient2685" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -2.7841 15.849)" y1="24.99" x1="30.038">
186- <stop id="stop2575" style="stop-color:#565656" offset="0"/>
187- <stop id="stop2577" style="stop-color:#9a9a9a" offset=".5"/>
188- <stop id="stop2579" style="stop-color:#545454" offset="1"/>
189- </linearGradient>
190- <linearGradient id="linearGradient2688" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -3.6017 16.671)" y1="24.99" x1="30.038">
191- <stop id="stop2567" style="stop-color:#b1b1b1" offset="0"/>
192- <stop id="stop2569" style="stop-color:#fff" offset=".5"/>
193- <stop id="stop2571" style="stop-color:#8f8f8f" offset="1"/>
194- </linearGradient>
195- <linearGradient id="linearGradient2691" y2="30" gradientUnits="userSpaceOnUse" x2="30.038" gradientTransform="matrix(.63801 -.64114 .85963 .85535 -3.419 16.487)" y1="24.99" x1="30.038">
196- <stop id="stop2559" style="stop-color:#565656" offset="0"/>
197- <stop id="stop2561" style="stop-color:#9a9a9a" offset=".5"/>
198- <stop id="stop2563" style="stop-color:#545454" offset="1"/>
199- </linearGradient>
200- <linearGradient id="linearGradient2697" y2="31.211" gradientUnits="userSpaceOnUse" x2="23.576" gradientTransform="matrix(.65657 -.65979 .73452 .73087 -1.013 19.863)" y1="25.357" x1="23.576">
201- <stop id="stop2541" style="stop-color:#181818" offset="0"/>
202- <stop id="stop2543" style="stop-color:#dbdbdb" offset=".13483"/>
203- <stop id="stop2545" style="stop-color:#a4a4a4" offset=".20224"/>
204- <stop id="stop2547" style="stop-color:#fff" offset=".26966"/>
205- <stop id="stop2549" style="stop-color:#8d8d8d" offset=".44650"/>
206- <stop id="stop2551" style="stop-color:#959595" offset=".57114"/>
207- <stop id="stop2553" style="stop-color:#cecece" offset=".72038"/>
208- <stop id="stop2555" style="stop-color:#181818" offset="1"/>
209- </linearGradient>
210- <linearGradient id="linearGradient2973" y2="114.54" gradientUnits="userSpaceOnUse" x2="-60.908" gradientTransform="matrix(.45037 .00027173 -.00027421 .44630 46.808 -6.9909)" y1="13.668" x1="-60.97">
211- <stop id="stop3828" style="stop-color:#f4f4f4" offset="0"/>
212- <stop id="stop3604" style="stop-color:#dbdbdb" offset="1"/>
213- </linearGradient>
214- <linearGradient id="linearGradient2975" y2="-1.0041" xlink:href="#linearGradient3104" gradientUnits="userSpaceOnUse" x2="11.536" gradientTransform="translate(5e-7 .047615)" y1="44.952" x1="11.536"/>
215- <radialGradient id="radialGradient2978" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(.022892 0 0 .012353 26.354 38.471)" r="117.14"/>
216- <radialGradient id="radialGradient2981" xlink:href="#linearGradient5060" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(-.022892 0 0 .012353 21.646 38.471)" r="117.14"/>
217- <linearGradient id="linearGradient2984" y2="609.51" gradientUnits="userSpaceOnUse" x2="302.86" gradientTransform="matrix(.066893 0 0 .012353 -.17722 38.471)" y1="366.65" x1="302.86">
218- <stop id="stop5050" style="stop-opacity:0" offset="0"/>
219- <stop id="stop5056" offset=".5"/>
220- <stop id="stop5052" style="stop-opacity:0" offset="1"/>
221- </linearGradient>
222- <linearGradient id="linearGradient3781" y2="3.0719" xlink:href="#linearGradient3104" gradientUnits="userSpaceOnUse" x2="22.004" y1="44.854" x1="22.004"/>
223- </defs>
224- <rect id="rect3706" style="opacity:.40206;fill:url(#linearGradient2984)" height="3" width="32.3" y="43" x="7.85"/>
225- <path id="path3708" style="opacity:.40206;fill:url(#radialGradient2981)" d="m7.85 43v3c-1.1789 0.006-2.85-0.672-2.85-1.5s1.3156-1.5 2.85-1.5z"/>
226- <path id="path3710" style="opacity:.40206;fill:url(#radialGradient2978)" d="m40.15 43v3c1.179 0.006 2.85-0.672 2.85-1.5s-1.316-1.5-2.85-1.5z"/>
227- <path id="path2855" style="stroke-linejoin:round;stroke:url(#linearGradient2975);stroke-linecap:round;fill:url(#linearGradient2973)" d="m7.5 3.5c8.522 0.0051 24.478-0.0051 33 0 0.075 1.6058 0.924 38.198 0.999 41-11.666-0.007-23.333-0.014-34.999-0.021 0.0918-3.147 0.9082-39.567 1-40.979z"/>
228- <path id="path5685" style="opacity:.59070;stroke-linejoin:round;fill-rule:evenodd;stroke:#f6abab;stroke-linecap:round;stroke-width:0.5;fill:#80b3ff" d="m12.688 4.2499l-0.438 39.5"/>
229- <path id="path6656" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.057 9.875l-32.18-0.1845"/>
230- <path id="path6658" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.131 11.875l-32.262-0.185"/>
231- <path id="path6660" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.214 13.875l-32.428-0.185"/>
232- <path id="path6662" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.297 15.875l-32.594-0.185"/>
233- <path id="path6664" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.297 17.875l-32.594-0.185"/>
234- <path id="path6666" style="opacity:.43721;stroke-linejoin:round;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;stroke-width:0.25;fill:#80b3ff" d="m40.379 19.875l-32.758-0.185"/>
235- <path id="path7637" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.379 21.875l-32.758-0.185"/>
236- <path id="path7639" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.462 23.875l-32.924-0.185"/>
237- <path id="path7641" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.462 25.875l-32.924-0.185"/>
238- <path id="path7645" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.627 27.875l-33.254-0.185"/>
239- <path id="path7647" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.627 29.864l-33.254-0.184"/>
240- <path id="path7649" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 31.875l-33.75-0.185"/>
241- <path id="path7651" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 33.83l-33.75-0.184"/>
242- <path id="path7653" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 35.814l-33.75-0.185"/>
243- <path id="path7655" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 37.797l-33.75-0.185"/>
244- <path id="path7657" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 39.78l-33.75-0.185"/>
245- <path id="path7659" style="opacity:.43721;stroke-linejoin:round;stroke-width:0.25;fill-rule:evenodd;stroke:#80b3ff;stroke-linecap:round;fill:#80b3ff" d="m40.875 41.875l-33.75-0.185"/>
246- <path id="path7671" style="opacity:.59070;stroke-linejoin:round;stroke:#b9d5ff;stroke-linecap:round;stroke-width:0.5;fill:none" d="m35.25 4.1673l1.05 39.5"/>
247- <path id="path3715" style="stroke:url(#linearGradient3781);stroke-width:1px;fill:none" d="m12.999 11.546h2.348m0.335 0h2.181m0.351 0h1.945m0.32 0h0.838m0.336 0h1.878m0.369 0h4.931m0.335 0h3.757m0.336 0h1.14m-21.4 1.954h3.641m0.423 0h1.74m0.321 0h0.859m0.349 0h1.602m0.336 0h1.643m0.31 0h2.581m0.335 0h3.404m-17.544 1.98h3.081m0.324 0h5.075m0.311 0h2.461m0.316 0h2.302m0.33 0h1.961m0.316 0l3.085 0.02m-19.562 2h4.284m0.337 0h4.63m0.32 0h1.82m0.335 0h4.331m0.292 0h2.968m0.336 0h1.175m0.335 0h0.65m-21.813 2h1.599m0.492 0h5.921m-8.012 10h3.641m0.423 0h1.74m0.321 0h0.859m0.349 0h1.602m0.336 0h1.643m0.31 0h2.581m-13.805 3.98h3.081m0.324 0h5.075m0.311 0h2.461m8.697 0.061h5.027m-24.976-6.041h4.284m0.337 0h4.63m0.32 0h1.82m0.335 0h4.331m-16.057-4h2.348m0.335 0h2.181m0.351 0h1.945m0.32 0h0.838m0.336 0h1.878m0.369 0h4.931m0.335 0h3.757m-19.924 2h3.954m0.311 0h4.199m0.32 0h1.642m0.31 0h3.95m0.317 0h4.314m-19.317 10h3.695m0.397 0h1.629m0.381 0h0.813m0.259 0h1.604m0.213 0h8.492m0.399 0h2.267m0.305 0h0.572m-16.816 2h1.205m-5.415 0h3.857m1.866 0h2.805m0.297 0h4.116m0.32 0h2.793m0.281 0h0.576m0.315 0h3.546m0.363 0h1.856m-18.781 2h1.702m-5.912 0h3.857m2.423 0h2.393"/>
248- <path id="path2422" style="opacity:.15;fill:#0c0c0c;fill-rule:evenodd" d="m38.469 23.944c-0.173-0.101-0.307-0.075-0.396-0.018l-11.796 7.511-2.171 1.387-0.067 0.028-2.57 5.792 6.37 0.192 0.053-0.036 2.185-1.379 11.793-7.576c0.354-0.227-0.206-1.731-1.257-3.381-0.788-1.237-1.624-2.214-2.144-2.52z"/>
249- <path id="rect2383" style="stroke-linejoin:round;stroke:#0c0c0c;stroke-width:.5;fill:url(#linearGradient2697)" d="m24.934 31.028c0.446-0.334 1.697 0.294 2.847 1.438 1.147 1.141 1.751 2.362 1.424 2.812-0.001 0.002 0.029 0.026 0.027 0.027l16.01-16.088c0.407-0.409-0.225-1.7-1.411-2.88s-2.48-1.806-2.887-1.397l-16.01 16.088z"/>
250- <path id="rect3175" style="opacity:.8;stroke-linejoin:round;stroke:#e28ccd;stroke-width:.5;fill:#ffb6ed" d="m38.99 16.903c0.446-0.334 1.697 0.293 2.847 1.438 1.147 1.141 1.752 2.362 1.425 2.812-0.002 0.002 0.028 0.025 0.026 0.027l1.954-1.963 0.04-0.04c0.001-0.002-0.028-0.025-0.027-0.027 0.327-0.45-0.277-1.672-1.424-2.813-1.15-1.144-2.401-1.772-2.847-1.437l-0.04 0.04-1.954 1.963z"/>
251- <path id="path3208" style="opacity:.6;fill:#0c0c0c" d="m24.934 31.028c0.446-0.334 1.697 0.294 2.847 1.438 1.147 1.141 1.751 2.362 1.424 2.812-0.001 0.002 0.029 0.026 0.027 0.027l11.026-11.079 0.04-0.041c0.001-0.001-0.028-0.025-0.027-0.026 0.327-0.451-0.278-1.672-1.425-2.813-1.149-1.144-2.401-1.772-2.846-1.437l-0.04 0.04-11.026 11.079z"/>
252- <path id="path3233" style="fill:url(#linearGradient2691)" d="m36.8 19.104c0.446-0.334 1.697 0.293 2.847 1.437 1.147 1.142 1.751 2.363 1.424 2.813-0.001 0.002 0.029 0.025 0.027 0.027l0.2-0.2c0.001-0.002-0.028-0.025-0.027-0.027 0.327-0.45-0.278-1.672-1.425-2.813-1.149-1.144-2.401-1.772-2.846-1.437l-0.2 0.2z"/>
253- <path id="path3216" style="fill:url(#linearGradient2688)" d="m36.617 19.288c0.446-0.335 1.698 0.293 2.847 1.437 1.147 1.141 1.752 2.363 1.425 2.813-0.002 0.002 0.028 0.025 0.027 0.027l0.199-0.201c0.001-0.001-0.028-0.025-0.027-0.026 0.327-0.451-0.277-1.672-1.424-2.813-1.15-1.144-2.401-1.772-2.847-1.438l-0.2 0.201z"/>
254- <path id="path3248" style="fill:url(#linearGradient2685)" d="m37.435 18.466c0.446-0.334 1.697 0.293 2.847 1.437 1.147 1.142 1.751 2.363 1.424 2.813-0.001 0.002 0.028 0.025 0.027 0.027l0.2-0.2c0.001-0.002-0.029-0.025-0.027-0.027 0.327-0.45-0.278-1.672-1.425-2.813-1.149-1.144-2.401-1.772-2.847-1.437l-0.199 0.2z"/>
255- <path id="path3250" style="fill:url(#linearGradient2682)" d="m37.252 18.65c0.446-0.335 1.697 0.293 2.847 1.437 1.147 1.141 1.752 2.363 1.425 2.813-0.002 0.002 0.028 0.025 0.026 0.027l0.2-0.201c0.001-0.002-0.028-0.025-0.027-0.027 0.327-0.45-0.277-1.671-1.424-2.812-1.15-1.144-2.401-1.772-2.847-1.438l-0.2 0.201z"/>
256- <path id="path3256" style="fill:url(#linearGradient2679)" d="m38.073 17.825c0.446-0.335 1.697 0.293 2.847 1.437 1.147 1.142 1.751 2.363 1.424 2.813-0.001 0.002 0.028 0.025 0.027 0.027l0.2-0.201c0.001-0.001-0.029-0.025-0.027-0.026 0.327-0.451-0.278-1.672-1.425-2.813-1.149-1.144-2.401-1.772-2.847-1.437l-0.199 0.2z"/>
257- <path id="path3258" style="fill:url(#linearGradient2676)" d="m37.89 18.009c0.446-0.335 1.697 0.293 2.847 1.437 1.147 1.141 1.752 2.362 1.425 2.813-0.002 0.001 0.028 0.025 0.027 0.026l0.199-0.2c0.001-0.002-0.028-0.025-0.027-0.027 0.327-0.45-0.277-1.671-1.424-2.813-1.15-1.144-2.401-1.771-2.847-1.437l-0.2 0.201z"/>
258- <path id="path3270" style="fill-rule:evenodd;stroke:url(#linearGradient2673);stroke-width:.5;fill:url(#linearGradient2670)" d="m21.866 38.31l7.284-2.97 0.062-0.063c0.327-0.45-0.285-1.671-1.432-2.813-1.15-1.144-2.4-1.768-2.846-1.433l-3.068 7.279z"/>
259- <path id="path3281" style="fill-rule:evenodd;stroke:#0c0c0c;stroke-width:.5;fill:#0c0c0c" d="m22.697 36.339l-0.831 1.964 1.986-0.815c-0.159-0.191-0.306-0.384-0.497-0.575-0.22-0.219-0.437-0.396-0.658-0.574z"/>
260-</svg>
261
262=== removed file 'data/demo/icons/firefox.png'
263Binary files data/demo/icons/firefox.png 2015-09-01 20:32:12 +0000 and data/demo/icons/firefox.png 1970-01-01 00:00:00 +0000 differ
264=== removed file 'data/demo/icons/gimp.png'
265Binary files data/demo/icons/gimp.png 2015-09-01 20:32:12 +0000 and data/demo/icons/gimp.png 1970-01-01 00:00:00 +0000 differ
266=== removed file 'data/demo/icons/libreoffice-startcenter.png'
267Binary files data/demo/icons/libreoffice-startcenter.png 2015-09-01 20:32:12 +0000 and data/demo/icons/libreoffice-startcenter.png 1970-01-01 00:00:00 +0000 differ
268=== removed file 'data/demo/icons/xchat-gnome.png'
269Binary files data/demo/icons/xchat-gnome.png 2015-09-01 20:32:12 +0000 and data/demo/icons/xchat-gnome.png 1970-01-01 00:00:00 +0000 differ
270=== removed file 'data/puritine-click.conf'
271--- data/puritine-click.conf 2016-04-25 15:45:05 +0000
272+++ data/puritine-click.conf 1970-01-01 00:00:00 +0000
273@@ -1,39 +0,0 @@
274-description "Puritine Click chroot linking"
275-
276-start on starting unity8
277-
278-script
279-PACKAGE_PATH=`click pkgdir com.ubuntu.puritine`
280-CONTAINER_NAME=puritine
281-CHROOT_PATH=$PACKAGE_PATH/libertine-data/libertine-container/$CONTAINER_NAME
282-
283-if [ -x $CHROOT_PATH/rootfs ] ; then
284- # Link the chroot
285- if [ ! -L $HOME/.cache/libertine-container/$CONTAINER_NAME/rootfs ] ; then
286- mkdir -p $HOME/.cache/libertine-container/$CONTAINER_NAME/
287- ln -s $CHROOT_PATH/rootfs $HOME/.cache/libertine-container/$CONTAINER_NAME/rootfs
288- fi
289-
290- # Copy or merge the container config files
291- if [ ! -e $HOME/.local/share/libertine/ContainersConfig.json ] ; then
292- mkdir -p $HOME/.local/share/libertine/
293- cp $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json $HOME/.local/share/libertine/ContainersConfig.json
294- elif [ -L $HOME/.local/share/libertine/ContainersConfig.json ] ; then
295- rm $HOME/.local/share/libertine/ContainersConfig.json
296- cp $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json $HOME/.local/share/libertine/ContainersConfig.json
297- else
298- libertine-container-manager merge-configs -f $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json
299- fi
300-
301- # Create and copy the user-data dir from the click package
302- if [ ! -d $HOME/.local/share/libertine-container/user-data/$CONTAINER_NAME ] ; then
303- cp -dR $PACKAGE_PATH/libertine-config/libertine-container/ $HOME/.local/share/libertine-container/
304- fi
305-else
306- rm -rf $HOME/.cache/libertine-container/$CONTAINER_NAME
307- if [ $(libertine-container-manager list | grep -v ${CONTAINER_NAME} | wc -l) -eq 0 ]; then
308- rm -rf $HOME/.local/share/libertine
309- fi
310- rm -rf $HOME/.local/share/libertine-container/user-data/$CONTAINER_NAME/.config/
311-fi
312-end script
313
314=== modified file 'debian/changelog'
315--- debian/changelog 2016-05-19 17:53:58 +0000
316+++ debian/changelog 2016-06-07 12:41:22 +0000
317@@ -1,3 +1,26 @@
318+libertine (1.1-0ubuntu1) UNRELEASED; urgency=medium
319+
320+ [ Brandon Schaefer ]
321+ * Set up a new proxy socket for the maliit server.
322+
323+ [ Chris Townsend ]
324+ * Remove the demo icons and desktop files and deprecate libertine-demo.
325+ (LP: #1575315)
326+ * Explicitly create .config/dconf and the common XDG data directories in the
327+ user container's mapped home directory in order to make sure the file
328+ permissions are correct. (LP: #1570961) (LP: #1581131)
329+ * Bump version to 1.1.
330+
331+ [ Larry Price ]
332+ * Make it possible for the user to interact with debconf prompts from apt-get.
333+ (LP: #1518814)
334+ * Refactor ContainerManagerWorker to use the async QProcess API.
335+ * Reap children processes when closing GUI and attempt to recover as necessary.
336+ * Implement bash auto-completion for libertine-container-manager.
337+ (LP: #1580610)
338+
339+ -- Chris Townsend <christopher.townsend@canonical.com> Mon, 06 Jun 2016 16:50:28 -0400
340+
341 libertine (1.0.4+16.10.20160519-0ubuntu1) yakkety; urgency=medium
342
343 [ Chris Townsend ]
344
345=== modified file 'debian/control'
346--- debian/control 2016-04-28 22:06:04 +0000
347+++ debian/control 2016-06-07 12:41:22 +0000
348@@ -22,6 +22,7 @@
349 python3-psutil,
350 python3-testtools,
351 python3-xdg,
352+ python3-dbus,
353 qtdeclarative5-dev
354 Standards-Version: 3.9.6
355 Homepage: https://launchpad.net/libertine
356@@ -32,6 +33,7 @@
357 python3-libertine-lxc,
358 qml-module-qtquick2,
359 qtdeclarative5-ubuntu-ui-toolkit-plugin,
360+ python3-dbus,
361 ${misc:Depends},
362 ${shlibs:Depends}
363 Description: sandbox for running deb-packaged X11 apps on Ubuntu Personal
364@@ -48,6 +50,8 @@
365 ${misc:Depends},
366 ${python3:Depends},
367 ${shlibs:Depends}
368+Breaks: libertine-demo
369+Replaces: libertine-demo
370 Description: CLI tools for running deb-packaged X11 apps on Ubuntu Personal
371 Command-line tools that can be used for creating, manipulating, and using
372 the Ubuntu Personal sandbox for legacy Deb-packaged X11 applicatons.
373@@ -131,14 +135,4 @@
374 This package provides the chroot-based container back end module for the
375 Libertine sandbox. This container back end module is intended only for
376 curated containers distributed for devices that do not support unprivileged
377- LXC contaiers.
378-
379-Package: libertine-demo
380-Architecture: any
381-Multi-Arch: allowed
382-Depends: libertine-tools,
383- python3-libertine-chroot,
384- ${misc:Depends}
385-Description: Adds desktop files and icon for Unity 8 desktop support
386- Add desktop files and icons for the targeted applications needed for legacy
387- X application support on Unity 8.
388+ LXC containers.
389
390=== removed file 'debian/libertine-demo.install'
391--- debian/libertine-demo.install 2015-11-06 21:28:21 +0000
392+++ debian/libertine-demo.install 1970-01-01 00:00:00 +0000
393@@ -1,4 +0,0 @@
394-data/demo/icons/* usr/share/libertine/demo/icons/
395-usr/share/applications/demo/* usr/share/applications/
396-usr/share/upstart/sessions/puritine-click.conf
397-usr/share/click/frameworks/puritine-15.04.1.framework
398
399=== removed file 'debian/libertine-demo.lintian-overrides'
400--- debian/libertine-demo.lintian-overrides 2015-09-02 12:55:00 +0000
401+++ debian/libertine-demo.lintian-overrides 1970-01-01 00:00:00 +0000
402@@ -1,5 +0,0 @@
403-libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_firefox_0.0.desktop bin/true
404-libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_gedit_0.0.desktop bin/true
405-libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_gimp_0.0.desktop bin/true
406-libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_libreoffice-startcenter_0.0.desktop bin/true
407-libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_xchat-gnome_0.0.desktop bin/true
408
409=== modified file 'debian/libertine-tools.install'
410--- debian/libertine-tools.install 2016-05-02 20:45:21 +0000
411+++ debian/libertine-tools.install 2016-06-07 12:41:22 +0000
412@@ -3,8 +3,10 @@
413 usr/bin/libertine-container-manager
414 usr/bin/libertine-lxc-manager
415 usr/bin/libertine-xmir
416+etc/bash_completion.d/libertine-container-manager
417 usr/lib/*/libertine/update-puritine-containers
418 usr/share/man
419 usr/share/libertine/libertine-lxc.conf
420 usr/share/upstart/sessions/libertine-lxc-manager.conf
421 usr/share/upstart/sessions/libertine-xmir.conf
422+usr/share/click/frameworks/puritine-15.04.1.framework
423
424=== modified file 'libertine/ContainerManager.cpp'
425--- libertine/ContainerManager.cpp 2016-05-11 17:26:27 +0000
426+++ libertine/ContainerManager.cpp 2016-06-07 12:41:22 +0000
427@@ -18,7 +18,6 @@
428 */
429 #include "libertine/ContainerManager.h"
430
431-#include <QtCore/QProcess>
432
433 namespace
434 {
435@@ -27,453 +26,245 @@
436 static const QString PACKAGE_REMOVAL_FAILED = QObject::tr("Removal of package %1 failed");
437 static const QString PACKAGE_SEARCH_FAILED = QObject::tr("Searching for query %1 failed");
438 static const QString CONTAINER_UPDATE_FAILED = QObject::tr("Updating container %1 failed");
439+static const QString CONTAINER_CREATE_FAILED = QObject::tr("Creating container %1 failed");
440+static const QString CONTAINER_DESTROY_FAILED = QObject::tr("Destroying container %1 failed");
441 static const QString RUN_COMMAND_FAILED = QObject::tr("Running command %1 failed");
442 static const QString CONTAINER_CONFIGURE_FAILED = QObject::tr("Attempt to configure container %1 failed");
443+constexpr auto libertine_container_manager_tool = "libertine-container-manager";
444+
445
446 static const QString readAllStdOutOrStdErr(QProcess& proc)
447 {
448 auto out = proc.readAllStandardOutput();
449 return out.isEmpty() ? proc.readAllStandardError() : out;
450 }
451-}
452-const QString ContainerManagerWorker::libertine_container_manager_tool = "libertine-container-manager";
453+
454+
455+static void pidKiller(const QString& pid, bool shouldKill = true)
456+{
457+ QProcess list_child_pids;
458+ list_child_pids.start("pgrep", QStringList{"-P", pid});
459+ list_child_pids.waitForFinished();
460+ auto pids = QString::fromUtf8(list_child_pids.readAllStandardOutput()).split('\n', QString::SkipEmptyParts);
461+ for (const auto& child: pids)
462+ {
463+ pidKiller(child);
464+ }
465+ if (shouldKill)
466+ {
467+ QProcess::execute("kill " + pid);
468+ }
469+}
470+}
471
472
473 ContainerManagerWorker::
474 ContainerManagerWorker()
475-{ }
476-
477-
478-ContainerManagerWorker::
479-ContainerManagerWorker(ContainerAction container_action,
480- QString const& container_id,
481- QString const& container_type)
482-: container_action_(container_action)
483-, container_id_(container_id)
484-, container_type_(container_type)
485-{ }
486-
487-
488-ContainerManagerWorker::
489-ContainerManagerWorker(ContainerAction container_action,
490- QString const& container_id,
491- QString const& container_type,
492- QString const& data)
493-: container_action_(container_action)
494-, container_id_(container_id)
495-, container_type_(container_type)
496-, data_(data)
497-{ }
498-
499-
500-ContainerManagerWorker::
501-ContainerManagerWorker(ContainerAction container_action,
502- QString const& container_id,
503- QString const& container_type,
504- QStringList data_list)
505-: container_action_(container_action)
506-, container_id_(container_id)
507-, container_type_(container_type)
508-, data_list_(data_list)
509-{ }
510+{
511+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &QObject::deleteLater);
512+}
513
514
515 ContainerManagerWorker::
516 ~ContainerManagerWorker()
517-{ }
518-
519-
520-ContainerManagerWorker::ContainerAction ContainerManagerWorker::
521-container_action() const
522-{ return container_action_; }
523-
524-
525-void ContainerManagerWorker::
526-container_action(ContainerAction container_action)
527-{
528- container_action_ = container_action;
529-}
530-
531-
532-QString const& ContainerManagerWorker::
533-container_id() const
534-{ return container_id_; }
535-
536-
537-void ContainerManagerWorker::
538-container_id(QString const& container_id)
539-{
540- container_id_ = container_id;
541-}
542-
543-
544-QString const& ContainerManagerWorker::
545-container_type() const
546-{ return container_type_; }
547-
548-
549-void ContainerManagerWorker::
550-container_type(QString const& container_type)
551-{
552- container_type_ = container_type;
553-}
554-
555-
556-QString const& ContainerManagerWorker::
557-container_distro() const
558-{ return container_distro_; }
559-
560-
561-void ContainerManagerWorker::
562-container_distro(QString const& container_distro)
563-{
564- if (container_distro != container_distro_)
565- {
566- container_distro_ = container_distro;
567- }
568-}
569-
570-
571-QString const& ContainerManagerWorker::
572-container_name() const
573-{ return container_name_; }
574-
575-
576-void ContainerManagerWorker::
577-container_name(QString const& container_name)
578-{
579- if (container_name != container_name_)
580- {
581- container_name_ = container_name;
582- }
583-}
584-
585-
586-bool ContainerManagerWorker::
587-container_multiarch()
588-{ return container_multiarch_; }
589-
590-
591-void ContainerManagerWorker::
592-container_multiarch(bool container_multiarch)
593-{
594- if (container_multiarch != container_multiarch_)
595- {
596- container_multiarch_ = container_multiarch;
597- }
598-}
599-
600-
601-QString const& ContainerManagerWorker::
602-data() const
603-{ return data_; }
604-
605-
606-void ContainerManagerWorker::
607-data(QString const& data)
608-{
609- data_ = data;
610-}
611-
612-
613-QStringList ContainerManagerWorker::
614-data_list()
615-{ return data_list_; }
616-
617-
618-void ContainerManagerWorker::
619-data_list(QStringList data_list)
620-{
621- data_list_ = data_list;
622-}
623-
624-
625-void ContainerManagerWorker::
626-run()
627-{
628- switch(container_action_)
629- {
630- case ContainerAction::Create:
631- createContainer(data_);
632- break;
633-
634- case ContainerAction::Destroy:
635- destroyContainer();
636- break;
637-
638- case ContainerAction::Install:
639- installPackage(data_);
640- break;
641-
642- case ContainerAction::Remove:
643- removePackage(data_);
644- break;
645-
646- case ContainerAction::Search:
647- searchPackageCache(data_);
648- break;
649-
650- case ContainerAction::Update:
651- updateContainer();
652- break;
653-
654- case ContainerAction::Exec:
655- runCommand(data_);
656- break;
657-
658- case ContainerAction::Configure:
659- configureContainer(data_list_);
660- break;
661-
662- default:
663- break;
664- }
665-}
666-
667-
668-void ContainerManagerWorker::
669-createContainer(QString const& password)
670-{
671- QProcess libertine_cli_tool;
672- QString exec_line = libertine_container_manager_tool;
673- QStringList args;
674-
675- args << "create" << "-i" << container_id_ << "-d" << container_distro_ << "-n" << container_name_;
676-
677- if (container_multiarch_)
678+{
679+ if (process_.state() == QProcess::Running)
680+ {
681+ pidKiller(QString::number(process_.pid()), false);
682+ process_.close();
683+ }
684+}
685+
686+
687+void ContainerManagerWorker::
688+createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password)
689+{
690+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
691+ [=](int exitCode, QProcess::ExitStatus){
692+ if (exitCode != 0)
693+ {
694+ emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError());
695+ }
696+ });
697+ connect(&process_, &QProcess::started, [=]() {
698+ process_.write(password.toUtf8());
699+ process_.closeWriteChannel();
700+ });
701+
702+ QStringList args{"create", "-i", id, "-d", distro, "-n", name};
703+ if (multiarch)
704 {
705 args << "-m";
706 }
707-
708- libertine_cli_tool.start(exec_line, args);
709-
710- if (!libertine_cli_tool.waitForStarted())
711- {
712- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
713- quit();
714- return;
715- }
716-
717- libertine_cli_tool.write(password.toStdString().c_str());
718- libertine_cli_tool.closeWriteChannel();
719-
720- libertine_cli_tool.waitForFinished(-1);
721-
722- quit();
723-}
724-
725-
726-void ContainerManagerWorker::
727-destroyContainer()
728-{
729- QProcess libertine_cli_tool;
730- QString exec_line = libertine_container_manager_tool;
731- QStringList args;
732-
733- args << "destroy" << "-i" << container_id_;
734- libertine_cli_tool.start(exec_line, args);
735-
736- if (!libertine_cli_tool.waitForStarted())
737- {
738- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
739- quit();
740- return;
741- }
742-
743- libertine_cli_tool.waitForFinished(-1);
744-
745- emit finishedDestroy(container_id_);
746- quit();
747-}
748-
749-
750-void ContainerManagerWorker::
751-installPackage(QString const& package_name)
752-{
753- QProcess libertine_cli_tool;
754- QString exec_line = libertine_container_manager_tool;
755- QStringList args;
756-
757- args << "install-package" << "-i" << container_id_ << "-p" << package_name;
758-
759- libertine_cli_tool.start(exec_line, args);
760-
761- if (!libertine_cli_tool.waitForStarted())
762- {
763- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
764- quit();
765- return;
766- }
767- libertine_cli_tool.waitForFinished(-1);
768- if (libertine_cli_tool.exitCode() != 0)
769- {
770- emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), libertine_cli_tool.readAllStandardError());
771- }
772- quit();
773-}
774-
775-
776-void ContainerManagerWorker::
777-removePackage(QString const& package_name)
778-{
779- QProcess libertine_cli_tool;
780- QString exec_line = libertine_container_manager_tool;
781- QStringList args;
782-
783- args << "remove-package" << "-i" << container_id_ << "-p" << package_name;
784- libertine_cli_tool.start(exec_line, args);
785-
786- if (!libertine_cli_tool.waitForStarted())
787- {
788- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAllStandardError());
789- quit();
790- return;
791- }
792-
793- libertine_cli_tool.waitForFinished(-1);
794- if (libertine_cli_tool.exitCode() != 0)
795- {
796- emit error(PACKAGE_REMOVAL_FAILED.arg(package_name), readAllStdOutOrStdErr(libertine_cli_tool));
797- quit();
798- return;
799- }
800- quit();
801-}
802-
803-
804-void ContainerManagerWorker::
805-searchPackageCache(QString const& search_string)
806-{
807- QProcess libertine_cli_tool;
808- QString exec_line = libertine_container_manager_tool;
809- QStringList args;
810- QByteArray search_output;
811- QList<QString> packageList;
812-
813- args << "search-cache" << "-i" << container_id_ << "-s" << search_string;
814- libertine_cli_tool.start(exec_line, args);
815-
816- if (!libertine_cli_tool.waitForStarted())
817- {
818- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
819- quit();
820- return;
821- }
822-
823- libertine_cli_tool.waitForFinished(-1);
824- if (libertine_cli_tool.exitCode() != 0)
825- {
826- QString err(libertine_cli_tool.readAllStandardError());
827- if (!err.isEmpty())
828- {
829- emit error(PACKAGE_SEARCH_FAILED.arg(search_string), err);
830- quit();
831- return;
832- }
833- // if there is no error message, there probably were no packages found
834- // continue to return an empty list
835- }
836- else
837- {
838- search_output = libertine_cli_tool.readAllStandardOutput();
839- QList<QByteArray> packages = search_output.split('\n');
840-
841- for (const auto& package: packages)
842- {
843- packageList.append(QString(package));
844- }
845- }
846-
847- emit finishedSearch(packageList);
848- quit();
849-}
850-
851-
852-void ContainerManagerWorker::
853-updateContainer()
854-{
855- QProcess libertine_cli_tool;
856- QString exec_line = libertine_container_manager_tool;
857- QStringList args;
858-
859- args << "update" << "-i" << container_id_;
860-
861- libertine_cli_tool.start(exec_line, args);
862-
863- if (!libertine_cli_tool.waitForStarted())
864- {
865- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
866- quit();
867- return;
868- }
869-
870- libertine_cli_tool.waitForFinished(-1);
871- if (libertine_cli_tool.exitCode() != 0)
872- {
873- emit error(CONTAINER_UPDATE_FAILED.arg(container_name_), readAllStdOutOrStdErr(libertine_cli_tool));
874- quit();
875- return;
876- }
877-
878- quit();
879-}
880-
881-
882-void ContainerManagerWorker::
883-runCommand(QString const& command_line)
884-{
885- QProcess libertine_cli_tool;
886- QString exec_line = libertine_container_manager_tool, command_output, error_msg;
887- QStringList args;
888-
889- args << "exec" << "-i" << container_id_ << "-c" << command_line;
890-
891- libertine_cli_tool.start(exec_line, args);
892-
893- if (!libertine_cli_tool.waitForStarted())
894- {
895- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
896- quit();
897- return;
898- }
899- libertine_cli_tool.waitForFinished(-1);
900- if (libertine_cli_tool.exitCode() != 0)
901- {
902- emit error(RUN_COMMAND_FAILED.arg(command_line), readAllStdOutOrStdErr(libertine_cli_tool));
903- quit();
904- return;
905- }
906-
907- emit finishedCommand(libertine_cli_tool.readAllStandardOutput());
908- quit();
909-}
910-
911-
912-void ContainerManagerWorker::
913-configureContainer(QStringList configure_command)
914-{
915- QProcess libertine_cli_tool;
916- QString exec_line = libertine_container_manager_tool;
917- QStringList args;
918-
919- args << "configure" << "-i" << container_id_ << configure_command.at(0) << configure_command.mid(1);
920-
921- libertine_cli_tool.start(exec_line, args);
922-
923- if (!libertine_cli_tool.waitForStarted())
924- {
925- emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
926- quit();
927- return;
928- }
929-
930- libertine_cli_tool.waitForFinished(-1);
931-
932- if (libertine_cli_tool.exitCode() != 0)
933- {
934- error(CONTAINER_CONFIGURE_FAILED.arg(container_name_), readAllStdOutOrStdErr(libertine_cli_tool));
935- }
936-
937- emit finishedConfigure();
938- quit();
939+ process_.start(libertine_container_manager_tool, args);
940+}
941+
942+
943+void ContainerManagerWorker::
944+destroyContainer(const QString& id)
945+{
946+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
947+ [=](int exitCode, QProcess::ExitStatus){
948+ if (exitCode != 0)
949+ {
950+ emit error(CONTAINER_DESTROY_FAILED.arg(id), process_.readAllStandardError());
951+ }
952+ emit finishedDestroy(id);
953+ });
954+
955+ process_.start(libertine_container_manager_tool, QStringList{"destroy", "-i", id});
956+}
957+
958+
959+void ContainerManagerWorker::
960+packageOperationInteraction(const QString& input)
961+{
962+ if (process_.state() == QProcess::Running)
963+ {
964+ process_.write(input.toUtf8() + "\n");
965+ }
966+}
967+
968+
969+void ContainerManagerWorker::
970+installPackage(const QString& container_id, const QString& package_name)
971+{
972+ connect(&process_, &QProcess::readyRead, [=](){
973+ auto output = process_.readAllStandardOutput();
974+ if (!output.isEmpty())
975+ {
976+ emit updatePackageOperationDetails(container_id, package_name, output);
977+ process_output_ += output;
978+ }
979+ });
980+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
981+ [=](int exitCode, QProcess::ExitStatus){
982+ if (exitCode != 0)
983+ {
984+ auto stderr = process_.readAllStandardError();
985+ emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), stderr.isEmpty() ? process_output_ : stderr);
986+ }
987+ emit packageOperationFinished(container_id, package_name);
988+ });
989+
990+ process_.start(libertine_container_manager_tool, QStringList{"install-package", "-i", container_id, "-p", package_name, "-r"});
991+}
992+
993+
994+void ContainerManagerWorker::
995+removePackage(const QString& container_id, const QString& package_name)
996+{
997+ connect(&process_, &QProcess::readyRead, [=](){
998+ auto output = process_.readAllStandardOutput();
999+ if (!output.isEmpty())
1000+ {
1001+ emit updatePackageOperationDetails(container_id, package_name, output);
1002+ process_output_ += output;
1003+ }
1004+ });
1005+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
1006+ [=](int exitCode, QProcess::ExitStatus){
1007+ if (exitCode != 0)
1008+ {
1009+ emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), process_output_.isEmpty() ? process_.readAllStandardError() : process_output_);
1010+ }
1011+ });
1012+
1013+ process_.start(libertine_container_manager_tool, QStringList{"remove-package", "-i", container_id, "-p", package_name, "-r"});
1014+}
1015+
1016+
1017+void ContainerManagerWorker::
1018+searchPackageCache(const QString& container_id, const QString& search_string)
1019+{
1020+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
1021+ [=](int exitCode, QProcess::ExitStatus){
1022+ QList<QString> packageList;
1023+ if (exitCode != 0)
1024+ {
1025+ QString err(process_.readAllStandardError());
1026+ if (!err.isEmpty())
1027+ {
1028+ emit error(PACKAGE_SEARCH_FAILED.arg(search_string), err);
1029+ }
1030+ // if there is no error message, there probably were no packages found
1031+ // continue to return an empty list
1032+ }
1033+ else
1034+ {
1035+ auto search_output = process_.readAllStandardOutput();
1036+ QList<QByteArray> packages = search_output.split('\n');
1037+
1038+ for (const auto& package: packages)
1039+ {
1040+ packageList.append(QString(package));
1041+ }
1042+ }
1043+
1044+ emit finishedSearch(packageList);
1045+ });
1046+
1047+ process_.start(libertine_container_manager_tool, QStringList{"search-cache", "-i", container_id, "-s", search_string});
1048+}
1049+
1050+
1051+void ContainerManagerWorker::
1052+updateContainer(const QString& container_id, const QString& container_name)
1053+{
1054+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
1055+ [=](int exitCode, QProcess::ExitStatus){
1056+ if (exitCode != 0)
1057+ {
1058+ emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
1059+ }
1060+ });
1061+
1062+ process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id});
1063+}
1064+
1065+
1066+void ContainerManagerWorker::
1067+runCommand(const QString& container_id, const QString& container_name, const QString& command_line)
1068+{
1069+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
1070+ [=](int exitCode, QProcess::ExitStatus){
1071+ if (exitCode != 0)
1072+ {
1073+ emit error(RUN_COMMAND_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
1074+ }
1075+ else
1076+ {
1077+ emit finishedCommand(process_.readAllStandardOutput());
1078+ }
1079+ });
1080+
1081+ process_.start(libertine_container_manager_tool, QStringList{"exec", "-i", container_id, "-c", command_line});
1082+}
1083+
1084+
1085+void ContainerManagerWorker::
1086+configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command)
1087+{
1088+ connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
1089+ [=](int exitCode, QProcess::ExitStatus){
1090+ if (exitCode != 0)
1091+ {
1092+ emit error(CONTAINER_CONFIGURE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
1093+ }
1094+ else
1095+ {
1096+ emit finishedConfigure();
1097+ }
1098+ });
1099+
1100+ QStringList args{"configure", "-i", container_id};
1101+ args << configure_command.at(0) << configure_command.mid(1);
1102+ process_.start(libertine_container_manager_tool, args);
1103+}
1104+
1105+
1106+void ContainerManagerWorker::
1107+fixIntegrity()
1108+{
1109+ process_.start(libertine_container_manager_tool, QStringList{"fix-integrity"});
1110 }
1111
1112=== modified file 'libertine/ContainerManager.h'
1113--- libertine/ContainerManager.h 2016-05-04 19:41:25 +0000
1114+++ libertine/ContainerManager.h 2016-06-07 12:41:22 +0000
1115@@ -23,122 +23,33 @@
1116 #include <QtCore/QString>
1117 #include <QtCore/QStringList>
1118 #include <QtCore/QThread>
1119+#include <QtCore/QProcess>
1120
1121 class ContainerManagerWorker
1122-: public QThread
1123+: public QObject
1124 {
1125 Q_OBJECT
1126- Q_ENUMS(ContainerAction)
1127- Q_PROPERTY(ContainerAction containerAction READ container_action WRITE container_action NOTIFY containerActionChanged)
1128- Q_PROPERTY(QString containerId READ container_id WRITE container_id NOTIFY containerIdChanged)
1129- Q_PROPERTY(QString containerType READ container_type WRITE container_type NOTIFY containerTypeChanged)
1130- Q_PROPERTY(QString containerDistro READ container_distro WRITE container_distro NOTIFY containerDistroChanged)
1131- Q_PROPERTY(QString containerName READ container_name WRITE container_name NOTIFY containerNameChanged)
1132- Q_PROPERTY(bool containerMultiarch READ container_multiarch WRITE container_multiarch)
1133- Q_PROPERTY(QString data READ data WRITE data NOTIFY dataChanged)
1134- Q_PROPERTY(QStringList data_list READ data_list WRITE data_list NOTIFY dataListChanged)
1135-
1136-public:
1137- static const QString libertine_container_manager_tool;
1138-
1139- enum class ContainerAction
1140- : int
1141- {
1142- Create,
1143- Destroy,
1144- Install,
1145- Remove,
1146- Search,
1147- Update,
1148- Exec,
1149- Configure
1150- };
1151-
1152-public:
1153- ContainerManagerWorker();
1154- ContainerManagerWorker(ContainerAction container_action,
1155- QString const& container_id,
1156- QString const& container_type);
1157- ContainerManagerWorker(ContainerAction container_action,
1158- QString const& container_id,
1159- QString const& container_type,
1160- QString const& data);
1161- ContainerManagerWorker(ContainerAction container_action,
1162- QString const& container_id,
1163- QString const& container_type,
1164- QStringList data_list);
1165- ~ContainerManagerWorker();
1166-
1167- ContainerAction
1168- container_action() const;
1169-
1170- void
1171- container_action(ContainerAction container_action);
1172-
1173- QString const&
1174- container_id() const;
1175-
1176- void
1177- container_id(QString const& container_id);
1178-
1179- QString const&
1180- container_type() const;
1181-
1182- void
1183- container_type(QString const& container_type);
1184-
1185- QString const&
1186- container_distro() const;
1187-
1188- void
1189- container_distro(QString const& container_distro);
1190-
1191- QString const&
1192- container_name() const;
1193-
1194- void
1195- container_name(QString const& container_name);
1196-
1197- bool
1198- container_multiarch();
1199-
1200- void
1201- container_multiarch(bool container_multiarch);
1202-
1203- QString const&
1204- data() const;
1205-
1206- void
1207- data(QString const& data);
1208-
1209- QStringList
1210- data_list();
1211-
1212- void
1213- data_list(QStringList data_list);
1214-
1215-protected:
1216- void run() Q_DECL_OVERRIDE;
1217-
1218-private:
1219- void createContainer(QString const& password);
1220- void destroyContainer();
1221- void installPackage(QString const& package_name);
1222- void removePackage(QString const& package_name);
1223- void searchPackageCache(QString const& search_string);
1224- void updateContainer();
1225- void runCommand(QString const& command_line);
1226- void configureContainer(QStringList configure_command);
1227-
1228-private:
1229- ContainerAction container_action_;
1230- QString container_id_;
1231- QString container_type_;
1232- QString container_distro_;
1233- QString container_name_;
1234- bool container_multiarch_;
1235- QString data_;
1236- QStringList data_list_;
1237+
1238+public:
1239+ explicit ContainerManagerWorker();
1240+ virtual ~ContainerManagerWorker();
1241+
1242+ Q_INVOKABLE void createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password);
1243+ Q_INVOKABLE void destroyContainer(const QString& id);
1244+ Q_INVOKABLE void installPackage(const QString& id, const QString& package_name);
1245+ Q_INVOKABLE void removePackage(const QString& container_id, const QString& package_name);
1246+ Q_INVOKABLE void searchPackageCache(const QString& container_id, const QString& search_string);
1247+ Q_INVOKABLE void updateContainer(const QString& container_id, const QString& container_name);
1248+ Q_INVOKABLE void runCommand(const QString& container_id, const QString& container_name, const QString& command_line);
1249+ Q_INVOKABLE void configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command);
1250+ Q_INVOKABLE void fixIntegrity();
1251+
1252+public slots:
1253+ void packageOperationInteraction(const QString& input);
1254+
1255+private:
1256+ QProcess process_;
1257+ QString process_output_;
1258
1259 signals:
1260 void containerActionChanged();
1261@@ -154,6 +65,8 @@
1262 void finishedSearch(QList<QString> packageList);
1263 void finishedCommand(QString const& command_output);
1264 void finishedConfigure();
1265+ void updatePackageOperationDetails(const QString& container_id, const QString& package_name, const QString& details);
1266+ void packageOperationFinished(const QString& container_id, const QString& package_name);
1267
1268 void error(const QString& short_description, const QString& details);
1269 };
1270
1271=== modified file 'libertine/qml/ContainerPasswordDialog.qml'
1272--- libertine/qml/ContainerPasswordDialog.qml 2016-05-06 21:13:01 +0000
1273+++ libertine/qml/ContainerPasswordDialog.qml 2016-06-07 12:41:22 +0000
1274@@ -86,14 +86,8 @@
1275 function passwordAccepted(password) {
1276 var container_id = containerConfigList.addNewContainer("lxc", containerName)
1277 var comp = Qt.createComponent("ContainerManager.qml")
1278- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Create,
1279- "containerId": container_id,
1280- "containerType": null,
1281- "data": password})
1282- worker.containerDistro = containerConfigList.getContainerDistro(container_id)
1283- worker.containerName = containerConfigList.getContainerName(container_id)
1284- worker.containerMultiarch = enableMultiarch
1285- mainView.currentContainer = container_id
1286- worker.start()
1287+ var worker = comp.createObject(mainView)
1288+ worker.createContainer(container_id, containerConfigList.getContainerName(container_id),
1289+ containerConfigList.getContainerDistro(container_id), enableMultiarch, password)
1290 }
1291 }
1292
1293=== modified file 'libertine/qml/ContainersView.qml'
1294--- libertine/qml/ContainersView.qml 2016-05-10 18:55:24 +0000
1295+++ libertine/qml/ContainersView.qml 2016-06-07 12:41:22 +0000
1296@@ -59,7 +59,7 @@
1297 function edit(containerId) {
1298 mainView.currentContainer = containerId
1299 containerAppsList.setContainerApps(mainView.currentContainer)
1300- pageStack.push(Qt.resolvedUrl("HomeView.qml"))
1301+ pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})
1302 }
1303
1304 delegate: ListItem {
1305@@ -93,10 +93,8 @@
1306 description: i18n.tr("Delete Container")
1307 onTriggered: {
1308 var comp = Qt.createComponent("ContainerManager.qml")
1309- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Destroy,
1310- "containerId": containerId,
1311- "containerType": containerConfigList.getContainerType(containerId)})
1312- worker.start()
1313+ var worker = comp.createObject(mainView)
1314+ worker.destroyContainer(containerId)
1315 mainView.currentContainer = containerId
1316 }
1317 }
1318
1319=== modified file 'libertine/qml/ExtraArchivesView.qml'
1320--- libertine/qml/ExtraArchivesView.qml 2016-05-09 20:27:38 +0000
1321+++ libertine/qml/ExtraArchivesView.qml 2016-06-07 12:41:22 +0000
1322@@ -127,26 +127,20 @@
1323
1324 function addArchive(archive) {
1325 var comp = Qt.createComponent("ContainerManager.qml")
1326- worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,
1327- "containerId": mainView.currentContainer,
1328- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1329- "data_list": ["--add-archive", archive]})
1330+ worker = comp.createObject(mainView)
1331 worker.finishedConfigure.connect(finishedConfigure)
1332 worker.error.connect(sendAddError)
1333 error.connect(mainView.error)
1334- worker.start()
1335+ worker.configureContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer), ["--add-archive", archive])
1336 }
1337
1338 function deleteArchive(archive) {
1339 var comp = Qt.createComponent("ContainerManager.qml")
1340- worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,
1341- "containerId": mainView.currentContainer,
1342- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1343- "data_list": ["--delete-archive", archive]})
1344+ worker = comp.createObject(mainView)
1345 worker.finishedConfigure.connect(finishedConfigure)
1346 worker.error.connect(sendDeleteError)
1347 error.connect(mainView.error)
1348- worker.start()
1349+ worker.configureContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer), ["--delete-archive", archive])
1350 }
1351
1352 Component.onCompleted: {
1353
1354=== modified file 'libertine/qml/HomeView.qml'
1355--- libertine/qml/HomeView.qml 2016-05-10 18:55:24 +0000
1356+++ libertine/qml/HomeView.qml 2016-06-07 12:41:22 +0000
1357@@ -26,7 +26,7 @@
1358 id: homeView
1359 header: PageHeader {
1360 id: pageHeader
1361- title: i18n.tr("Classic Apps - %1").arg(containerConfigList.getContainerName(mainView.currentContainer))
1362+ title: i18n.tr("Classic Apps - %1").arg(containerConfigList.getContainerName(currentContainer))
1363 trailingActionBar.actions: [
1364 Action {
1365 id: settingsButton
1366@@ -39,6 +39,7 @@
1367 }
1368 ]
1369 }
1370+ property var currentContainer: null
1371
1372 Component {
1373 id: enterPackagePopup
1374@@ -69,9 +70,8 @@
1375 width: (parent.width - parent.spacing) / 2
1376 onClicked: {
1377 if (enterPackageInput.text != "") {
1378- if (!containerConfigList.isAppInstalled(mainView.currentContainer, enterPackageInput.text)) {
1379+ if (!containerConfigList.isAppInstalled(currentContainer, enterPackageInput.text)) {
1380 installPackage(enterPackageInput.text)
1381- mainView.currentPackage = enterPackageInput.text
1382 PopupUtils.close(enterPackageDialog)
1383 }
1384 else {
1385@@ -97,30 +97,30 @@
1386 }
1387
1388 Component {
1389- id: settingsMenu
1390- ActionSelectionPopover {
1391- actions: ActionList {
1392- Action {
1393- text: i18n.tr("Manage Container")
1394- onTriggered: {
1395+ id: settingsMenu
1396+ ActionSelectionPopover {
1397+ actions: ActionList {
1398+ Action {
1399+ text: i18n.tr("Manage Container")
1400+ onTriggered: {
1401 pageStack.push(Qt.resolvedUrl("ManageContainer.qml"))
1402 }
1403- }
1404+ }
1405 Action {
1406 text: i18n.tr("Container Information")
1407 onTriggered: {
1408 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"))
1409 }
1410 }
1411- Action {
1412- text: i18n.tr("Switch Container")
1413- onTriggered: {
1414+ Action {
1415+ text: i18n.tr("Switch Container")
1416+ onTriggered: {
1417 pageStack.pop()
1418 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))
1419 }
1420- }
1421- }
1422- }
1423+ }
1424+ }
1425+ }
1426 }
1427
1428 Component {
1429@@ -160,7 +160,7 @@
1430 }
1431
1432 function reloadAppList() {
1433- containerAppsList.setContainerApps(mainView.currentContainer)
1434+ containerAppsList.setContainerApps(currentContainer)
1435
1436 appsList.visible = !containerAppsList.empty() ? true : false
1437 }
1438@@ -175,8 +175,7 @@
1439 visible: !containerAppsList.empty() ? true : false
1440
1441 function info(packageName) {
1442- mainView.currentPackage = packageName
1443- pageStack.push(Qt.resolvedUrl("PackageInfoView.qml"))
1444+ pageStack.push(Qt.resolvedUrl("PackageInfoView.qml"), {"currentPackage": packageName, "currentContainer": currentContainer})
1445 }
1446
1447 delegate: ListItem {
1448@@ -211,7 +210,6 @@
1449 text: i18n.tr("delete")
1450 description: i18n.tr("Remove Package")
1451 onTriggered: {
1452- mainView.currentPackage = packageName
1453 removePackage(packageName)
1454 }
1455 }
1456@@ -242,23 +240,21 @@
1457 text: i18n.tr("No packages are installed")
1458 }
1459
1460- function installPackage(package_name) {
1461+ function operationSetup() {
1462 var comp = Qt.createComponent("ContainerManager.qml")
1463- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Install,
1464- "containerId": mainView.currentContainer,
1465- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1466- "data": package_name})
1467+ var worker = comp.createObject(mainView)
1468 worker.error.connect(mainView.error)
1469- worker.start()
1470+ worker.updatePackageOperationDetails.connect(mainView.updatePackageOperationDetails)
1471+ mainView.packageOperationInteraction.connect(worker.packageOperationInteraction)
1472+ worker.packageOperationFinished.connect(mainView.resetPackageDetails)
1473+ return worker
1474+ }
1475+
1476+ function installPackage(packageName) {
1477+ operationSetup().installPackage(currentContainer, packageName)
1478 }
1479
1480 function removePackage(packageName) {
1481- var comp = Qt.createComponent("ContainerManager.qml")
1482- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Remove,
1483- "containerId": mainView.currentContainer,
1484- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1485- "data": packageName})
1486- worker.error.connect(mainView.error)
1487- worker.start()
1488+ operationSetup().removePackage(currentContainer, packageName)
1489 }
1490 }
1491
1492=== modified file 'libertine/qml/ManageContainer.qml'
1493--- libertine/qml/ManageContainer.qml 2016-05-09 20:27:38 +0000
1494+++ libertine/qml/ManageContainer.qml 2016-06-07 12:41:22 +0000
1495@@ -49,18 +49,14 @@
1496 onClicked: {
1497 var comp = Qt.createComponent("ContainerManager.qml")
1498 if (checked) {
1499- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,
1500- "containerId": mainView.currentContainer,
1501- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1502- "data_list": ["--multiarch", "enable"]})
1503- worker.start()
1504+ comp.createObject(mainView).configureContainer(mainView.currentContainer,
1505+ containerConfigList.getContainerName(mainView.currentContainer),
1506+ ["--multiarch", "enable"])
1507 }
1508 else {
1509- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,
1510- "containerId": mainView.currentContainer,
1511- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1512- "data_list": ["--multiarch", "disable"]})
1513- worker.start()
1514+ comp.createObject(mainView).configureContainer(mainView.currentContainer,
1515+ containerConfigList.getContainerName(mainView.currentContainer),
1516+ ["--multiarch", "disable"])
1517 }
1518 }
1519 }
1520@@ -110,11 +106,9 @@
1521
1522 function updateContainer() {
1523 var comp = Qt.createComponent("ContainerManager.qml")
1524- var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Update,
1525- "containerId": mainView.currentContainer,
1526- "containerType": containerConfigList.getContainerType(mainView.currentContainer)})
1527+ var worker = comp.createObject(mainView)
1528 worker.error.connect(mainView.error);
1529- worker.start()
1530+ worker.updateContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer))
1531 }
1532
1533 function updateStatus() {
1534
1535=== modified file 'libertine/qml/PackageInfoView.qml'
1536--- libertine/qml/PackageInfoView.qml 2016-05-09 20:27:38 +0000
1537+++ libertine/qml/PackageInfoView.qml 2016-06-07 12:41:22 +0000
1538@@ -27,14 +27,17 @@
1539 id: packageInfoView
1540 header: PageHeader {
1541 id: pageHeader
1542- title: i18n.tr("Information for the %1 package").arg(mainView.currentPackage)
1543+ title: i18n.tr("Information for the %1 package").arg(currentPackage)
1544 }
1545- property string currentContainer: mainView.currentContainer
1546- property var currentPackage: mainView.currentPackage
1547+ property string currentContainer: null
1548+ property var currentPackage: null
1549 property var statusText: containerConfigList.getAppStatus(currentContainer, currentPackage)
1550 property var packageVersionText: i18n.tr("Obtaining package version…")
1551+ property string packageOperationDetails: ""
1552 property var worker: null
1553
1554+ signal sendOperationInteraction(string text)
1555+
1556
1557 Flickable {
1558 anchors {
1559@@ -52,6 +55,7 @@
1560 anchors.right: parent.right
1561
1562 ListItem.Standard {
1563+ id: packageListItem
1564 text: i18n.tr("Package version")
1565 control: Label {
1566 text: packageVersionText
1567@@ -59,11 +63,33 @@
1568 }
1569
1570 ListItem.Standard {
1571+ id: statusListItem
1572 text: i18n.tr("Install status")
1573 control: Label {
1574 text: statusText
1575 }
1576 }
1577+
1578+ TextArea {
1579+ id: packageDetailsView
1580+ visible: text !== ""
1581+ anchors.left: parent.left
1582+ anchors.right: parent.right
1583+ height: Math.max(packageInfoView.height - pageHeader.height - packageListItem.height - statusListItem.height - 35, units.gu(35))
1584+ readOnly: true
1585+ text: packageOperationDetails
1586+ }
1587+
1588+ TextField {
1589+ visible: packageDetailsView.visible && (statusText === "installing" || statusText === "removing")
1590+ anchors.left: parent.left
1591+ anchors.right: parent.right
1592+ text: ""
1593+ onAccepted: {
1594+ sendOperationInteraction(text)
1595+ text = ""
1596+ }
1597+ }
1598 }
1599 }
1600
1601@@ -71,21 +97,31 @@
1602 containerConfigList.configChanged.connect(reloadStatus)
1603 var command = "apt-cache policy " + currentPackage
1604 var comp = Qt.createComponent("ContainerManager.qml")
1605- worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Exec,
1606- "containerId": mainView.currentContainer,
1607- "containerType": containerConfigList.getContainerType(mainView.currentContainer),
1608- "data": command })
1609+ worker = comp.createObject(mainView)
1610 worker.finishedCommand.connect(getPackageVersion)
1611+
1612+ packageOperationDetails = mainView.getPackageOperationDetails(currentContainer, currentPackage)
1613+ packageDetailsView.cursorPosition = packageDetailsView.length
1614+
1615+ mainView.updatePackageDetails.connect(updatePackageDetails)
1616+ sendOperationInteraction.connect(mainView.packageOperationInteraction)
1617+
1618 worker.error.connect(mainView.error)
1619 worker.error.connect(onError)
1620- worker.start()
1621+ worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command)
1622 }
1623
1624 Component.onDestruction: {
1625 containerConfigList.configChanged.disconnect(reloadStatus)
1626- worker.finishedCommand.disconnect(getPackageVersion)
1627- worker.error.disconnect(mainView.error)
1628- worker.error.disconnect(onError)
1629+ mainView.updatePackageDetails.disconnect(updatePackageDetails)
1630+ sendOperationInteraction.disconnect(mainView.packageOperationInteraction)
1631+ }
1632+
1633+ function updatePackageDetails(container_id, package_name, details) {
1634+ if (container_id === currentContainer && package_name === currentPackage) {
1635+ packageOperationDetails += details
1636+ packageDetailsView.cursorPosition = packageDetailsView.length
1637+ }
1638 }
1639
1640 function reloadStatus() {
1641
1642=== modified file 'libertine/qml/SearchResultsView.qml'
1643--- libertine/qml/SearchResultsView.qml 2016-05-09 20:27:38 +0000
1644+++ libertine/qml/SearchResultsView.qml 2016-06-07 12:41:22 +0000
1645@@ -120,12 +120,9 @@
1646
1647 var comp = Qt.createComponent("ContainerManager.qml")
1648 var worker = comp.createObject()
1649- worker.containerAction = ContainerManagerWorker.Search
1650- worker.containerId = mainView.currentContainer
1651- worker.data = search_string
1652 worker.finishedSearch.connect(finishedSearch)
1653 worker.error.connect(mainView.error)
1654- worker.start()
1655+ worker.searchPackageCache(mainView.currentContainer, search_string)
1656 }
1657
1658 function finishedSearch(packageList) {
1659
1660=== modified file 'libertine/qml/libertine.qml'
1661--- libertine/qml/libertine.qml 2016-05-09 20:27:38 +0000
1662+++ libertine/qml/libertine.qml 2016-06-07 12:41:22 +0000
1663@@ -29,22 +29,26 @@
1664 width: units.gu(90)
1665 height: units.gu(75)
1666 property var currentContainer: undefined
1667- property var currentPackage: undefined
1668+ property var packageOperationDetails: undefined
1669
1670 signal error(string short_description, string details)
1671+ signal updatePackageDetails(string container_id, string package_name, string details)
1672+ signal packageOperationInteraction(string data)
1673
1674 PageStack {
1675 id: pageStack
1676 }
1677
1678 Component.onCompleted: {
1679+ Qt.createComponent("ContainerManager.qml").createObject(mainView).fixIntegrity()
1680+
1681 mainView.currentContainer = containerConfigList.defaultContainerId
1682
1683 if (!containerConfigList.empty()) {
1684 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))
1685 if (mainView.currentContainer) {
1686 containerAppsList.setContainerApps(mainView.currentContainer)
1687- pageStack.push(Qt.resolvedUrl("HomeView.qml"))
1688+ pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})
1689 }
1690 }
1691 else {
1692@@ -56,4 +60,35 @@
1693 PopupUtils.open(Qt.resolvedUrl("GenericErrorDialog.qml"), null,
1694 {"short_description": short_description, "details": details})
1695 }
1696+
1697+ function updatePackageOperationDetails(container_id, package_name, details) {
1698+ if (!mainView) {
1699+ return
1700+ }
1701+ if (!packageOperationDetails) {
1702+ packageOperationDetails = {}
1703+ }
1704+ if (!packageOperationDetails[container_id]) {
1705+ packageOperationDetails[container_id] = {}
1706+ }
1707+ if (!packageOperationDetails[container_id][package_name]) {
1708+ packageOperationDetails[container_id][package_name] = ""
1709+ }
1710+ packageOperationDetails[container_id][package_name] += details
1711+
1712+ updatePackageDetails(container_id, package_name, details)
1713+ }
1714+
1715+ function resetPackageDetails(container_id, package_name) {
1716+ if (mainView && packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {
1717+ delete packageOperationDetails[container_id][package_name]
1718+ }
1719+ }
1720+
1721+ function getPackageOperationDetails(container_id, package_name) {
1722+ if (packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {
1723+ return packageOperationDetails[container_id][package_name]
1724+ }
1725+ return ""
1726+ }
1727 }
1728
1729=== modified file 'po/en_US.po'
1730--- po/en_US.po 2016-05-09 14:38:13 +0000
1731+++ po/en_US.po 2016-06-07 12:41:22 +0000
1732@@ -7,7 +7,7 @@
1733 msgstr ""
1734 "Project-Id-Version: PACKAGE VERSION\n"
1735 "Report-Msgid-Bugs-To: \n"
1736-"POT-Creation-Date: 2016-05-09 10:33-0400\n"
1737+"POT-Creation-Date: 2016-06-07 07:58-0400\n"
1738 "PO-Revision-Date: 2016-03-21 10:21-0400\n"
1739 "Last-Translator: Chris Townsend <christopher.townsend@canonical.com>\n"
1740 "Language-Team: English\n"
1741@@ -17,316 +17,358 @@
1742 "Content-Transfer-Encoding: 8bit\n"
1743 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
1744
1745+#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
1746+msgid "new"
1747+msgstr "new"
1748+
1749+#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
1750+#: ../libertine/qml/ContainersView.qml:81 ../libertine/qml/HomeView.qml:197
1751+#: ../libertine/qml/ExtraArchivesView.qml:99
1752+msgid "installing"
1753+msgstr "installing"
1754+
1755+#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:119
1756+#: ../libertine/qml/ManageContainer.qml:79
1757+#: ../libertine/qml/ManageContainer.qml:119
1758+msgid "ready"
1759+msgstr "ready"
1760+
1761+#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:120
1762+#: ../libertine/qml/ManageContainer.qml:91
1763+#: ../libertine/qml/ManageContainer.qml:115
1764+msgid "updating"
1765+msgstr "updating"
1766+
1767+#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
1768+#: ../libertine/qml/ContainersView.qml:82 ../libertine/qml/HomeView.qml:198
1769+#: ../libertine/qml/ExtraArchivesView.qml:100
1770+msgid "removing"
1771+msgstr "removing"
1772+
1773+#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
1774+#: ../libertine/qml/PackageInfoView.qml:131
1775+#: ../libertine/qml/ContainerInfoView.qml:93
1776+msgid "removed"
1777+msgstr "removed"
1778+
1779+#: ../libertine/ContainerConfig.cpp:153 ../libertine/ContainerConfig.cpp:187
1780+msgid "failed"
1781+msgstr "failed"
1782+
1783+#: ../libertine/ContainerConfig.cpp:186
1784+msgid "installed"
1785+msgstr "installed"
1786+
1787+#: ../libertine/ContainerManager.cpp:24
1788+msgid "%1 failed to start"
1789+msgstr "%1 failed to start"
1790+
1791 #: ../libertine/ContainerManager.cpp:25
1792-msgid "%1 failed to start"
1793-msgstr ""
1794-
1795-#: ../libertine/qml/ExtraArchivesView.qml:35
1796-msgid "Add a new PPA"
1797-msgstr ""
1798-
1799-#: ../libertine/qml/ExtraArchivesView.qml:44
1800-msgid "Add additional PPA"
1801-msgstr ""
1802-
1803-#: ../libertine/qml/ExtraArchivesView.qml:174
1804-msgid "Adding archive failed"
1805-msgstr ""
1806-
1807-#: ../libertine/qml/ExtraArchivesView.qml:26
1808-msgid "Additional Archives and PPAs"
1809-msgstr ""
1810-
1811-#: ../libertine/qml/ManageContainer.qml:59
1812-msgid "Additional archives and PPAs"
1813-msgstr ""
1814-
1815-#: ../libertine/qml/ContainerPasswordDialog.qml:27
1816-msgid "Authentication required"
1817-msgstr ""
1818-
1819-#: ../libertine/qml/DebianPackagePicker.qml:26
1820-msgid "Available Debian Packages to Install"
1821-msgstr ""
1822-
1823+msgid "Installation of package %1 failed"
1824+msgstr "Installation of package %1 failed"
1825+
1826+#: ../libertine/ContainerManager.cpp:26
1827+msgid "Removal of package %1 failed"
1828+msgstr "Removal of package %1 failed"
1829+
1830+#: ../libertine/ContainerManager.cpp:27
1831+msgid "Searching for query %1 failed"
1832+msgstr "Searching for query %1 failed"
1833+
1834+#: ../libertine/ContainerManager.cpp:28
1835+msgid "Updating container %1 failed"
1836+msgstr "Updating container %1 failed"
1837+
1838+#: ../libertine/ContainerManager.cpp:29
1839+msgid "Creating container %1 failed"
1840+msgstr "Creating container %1 failed"
1841+
1842+#: ../libertine/ContainerManager.cpp:30
1843+msgid "Destroying container %1 failed"
1844+msgstr "Destroying container %1 failed"
1845+
1846+#: ../libertine/ContainerManager.cpp:31
1847+msgid "Running command %1 failed"
1848+msgstr "Running command %1 failed"
1849+
1850+#: ../libertine/ContainerManager.cpp:32
1851+msgid "Attempt to configure container %1 failed"
1852+msgstr "Attempt to configure container %1 failed"
1853+
1854+#: ../libertine/qml/PackageExistsDialog.qml:28
1855+msgid "The %1 package is already installed."
1856+msgstr "The %1 package is already installed."
1857+
1858+#: .:./libertine/qml/PackageExistsDialog.qml:29
1859+msgid "Search again or return to search results."
1860+msgstr "Search again or return to search results."
1861+
1862+#: ../libertine/qml/PackageExistsDialog.qml:33
1863+msgid "Search again"
1864+msgstr "Search again"
1865+
1866+#: ../libertine/qml/PackageExistsDialog.qml:43
1867+msgid "Return to search results"
1868+msgstr "Return to search results"
1869+
1870+#: ../libertine/qml/ContainersView.qml:33
1871+msgid "My Containers"
1872+msgstr "My Containers"
1873+
1874+#: ../libertine/qml/ContainersView.qml:92 ../libertine/qml/HomeView.qml:210
1875+msgid "delete"
1876+msgstr "delete"
1877+
1878+#: ../libertine/qml/ContainersView.qml:93
1879+msgid "Delete Container"
1880+msgstr "Delete Container"
1881+
1882+#: ../libertine/qml/ContainersView.qml:108 ../libertine/qml/HomeView.qml:222
1883+msgid "info"
1884+msgstr "info"
1885+
1886+#: ../libertine/qml/ContainersView.qml:109
1887+msgid "Container Info"
1888+msgstr "Container Info"
1889+
1890+#: ../libertine/qml/ContainersView.qml:117
1891+msgid "edit"
1892+msgstr "edit"
1893+
1894+#: ../libertine/qml/ContainersView.qml:118
1895+msgid "Container Apps"
1896+msgstr "Container Apps"
1897+
1898+#: ../libertine/qml/SearchPackagesDialog.qml:26
1899+#: ../libertine/qml/SearchResultsView.qml:36
1900+msgid "Search for packages"
1901+msgstr "Search for packages"
1902+
1903+#: ../libertine/qml/SearchPackagesDialog.qml:27
1904+msgid "Search archives for packages"
1905+msgstr "Search archives for packages"
1906+
1907+#: ../libertine/qml/SearchPackagesDialog.qml:31
1908+msgid "search"
1909+msgstr "search"
1910+
1911+#: ../libertine/qml/SearchPackagesDialog.qml:39
1912+#: ../libertine/qml/ContainerPasswordDialog.qml:52
1913+#: ../libertine/qml/HomeView.qml:68 ../libertine/qml/ExtraArchivesView.qml:57
1914+#: ../libertine/qml/ContainerOptionsDialog.qml:64
1915+msgid "OK"
1916+msgstr "OK"
1917+
1918+#: ../libertine/qml/SearchPackagesDialog.qml:57
1919+#: ../libertine/qml/ContainerPasswordDialog.qml:70
1920+#: ../libertine/qml/HomeView.qml:88 ../libertine/qml/ExtraArchivesView.qml:65
1921 #: ../libertine/qml/ContainerOptionsDialog.qml:75
1922-#: ../libertine/qml/ContainerPasswordDialog.qml:70
1923-#: ../libertine/qml/SearchPackagesDialog.qml:57
1924-#: ../libertine/qml/HomeView.qml:86 ../libertine/qml/ExtraArchivesView.qml:63
1925 msgid "Cancel"
1926-msgstr ""
1927-
1928-#: ../libertine/qml/HomeView.qml:136
1929-msgid "Choose Debian package to install"
1930-msgstr ""
1931-
1932-#: ../libertine/qml/HomeView.qml:27
1933-msgid "Classic Apps - %1"
1934-msgstr "Classic Apps - %1"
1935-
1936-#: ../libertine/qml/ContainerOptionsDialog.qml:28
1937-#, fuzzy
1938-msgid "Configure options for container creation."
1939-msgstr "Configure Container"
1940-
1941-#: ../libertine/qml/ContainersView.qml:100
1942-msgid "Container Apps"
1943-msgstr "Container Apps"
1944-
1945-#: ../libertine/qml/ContainersView.qml:91
1946-msgid "Container Info"
1947-msgstr "Container Info"
1948-
1949-#: ../libertine/qml/HomeView.qml:108
1950-#, fuzzy
1951-msgid "Container Information"
1952-msgstr "Container information for %1"
1953-
1954-#: ../libertine/qml/ContainerOptionsDialog.qml:27
1955-#, fuzzy
1956-msgid "Container Options"
1957-msgstr "Container Apps"
1958-
1959-#: ../libertine/qml/ContainerInfoView.qml:28
1960-msgid "Container information for %1"
1961-msgstr "Container information for %1"
1962-
1963-#: ../libertine/qml/ContainersView.qml:73
1964-msgid "Delete Container"
1965-msgstr "Delete Container"
1966-
1967-#: ../libertine/qml/ExtraArchivesView.qml:178
1968-msgid "Deleting archive failed"
1969-msgstr ""
1970-
1971-#: ../libertine/qml/GenericErrorDialog.qml:32
1972-msgid "Dismiss"
1973-msgstr ""
1974-
1975-#: ../libertine/qml/ContainerInfoView.qml:62
1976-#, fuzzy
1977-msgid "Distribution"
1978-msgstr "Distribution: %1"
1979-
1980-#: ../libertine/qml/HomeView.qml:46
1981-#, fuzzy
1982-msgid "Enter exact package name or full path to a Debian package file"
1983-msgstr "Please enter the exact package name of the app to install:"
1984-
1985-#: ../libertine/qml/ExtraArchivesView.qml:45
1986-msgid "Enter name of PPA in the form ppa:user/ppa-name:"
1987-msgstr ""
1988-
1989-#: ../libertine/qml/ContainerOptionsDialog.qml:50
1990-msgid "Enter or name for the container or leave blank for default name"
1991-msgstr ""
1992-
1993-#: ../libertine/qml/HomeView.qml:130
1994-#, fuzzy
1995-msgid "Enter package name or Debian file"
1996-msgstr "Please enter the exact package name of the app to install:"
1997-
1998-#: ../libertine/qml/ContainerInfoView.qml:48
1999-msgid "ID"
2000-msgstr ""
2001-
2002-#: ../libertine/qml/PackageInfoView.qml:29
2003+msgstr "Cancel"
2004+
2005+#: ../libertine/qml/PackageInfoView.qml:30
2006 msgid "Information for the %1 package"
2007 msgstr "Information for the %1 package"
2008
2009-#: ../libertine/qml/WelcomeView.qml:58
2010-msgid "Install"
2011-msgstr "Install"
2012-
2013-#: ../libertine/qml/DebianPackagePicker.qml:53
2014-#: ../libertine/qml/SearchResults.qml:42
2015+#: ../libertine/qml/PackageInfoView.qml:35
2016+msgid "Obtaining package version…"
2017+msgstr "Obtaining package version…"
2018+
2019+#: ../libertine/qml/PackageInfoView.qml:59
2020+msgid "Package version"
2021+msgstr "Package version"
2022+
2023+#: ../libertine/qml/PackageInfoView.qml:67
2024+msgid "Install status"
2025+msgstr "Install status"
2026+
2027+#: ../libertine/qml/PackageInfoView.qml:140
2028+msgid "Unknown"
2029+msgstr "Unknown"
2030+
2031+#: ../libertine/qml/SearchResultsView.qml:31
2032+msgid "Package Search Results"
2033+msgstr "Package Search Results"
2034+
2035+#: ../libertine/qml/SearchResultsView.qml:35
2036+msgid "Search"
2037+msgstr "Search"
2038+
2039+#: ../libertine/qml/SearchResultsView.qml:52
2040+msgid "No Search Results Found"
2041+msgstr "No Search Results Found"
2042+
2043+#: ../libertine/qml/SearchResultsView.qml:57
2044+msgid "Search Again"
2045+msgstr "Search Again"
2046+
2047+#: ../libertine/qml/SearchResultsView.qml:67
2048+msgid "Return to Apps Page"
2049+msgstr "Return to Apps Page"
2050+
2051+#: ../libertine/qml/SearchResultsView.qml:95
2052+msgid "Searching for packages…"
2053+msgstr "Searching for packages…"
2054+
2055+#: ../libertine/qml/SearchResults.qml:60
2056+#: ../libertine/qml/DebianPackagePicker.qml:70
2057 msgid "Install Package"
2058 msgstr "Install Package"
2059
2060-#: ../libertine/qml/HomeView.qml:45
2061-#, fuzzy
2062-msgid "Install new package"
2063-msgstr "Install Package"
2064-
2065-#: ../libertine/qml/PackageInfoView.qml:58
2066-#, fuzzy
2067-msgid "Install status"
2068-msgstr "Install status: %1"
2069-
2070-#: ../libertine/ContainerManager.cpp:26
2071-#, fuzzy
2072-msgid "Installation of package %1 failed"
2073-msgstr "Install Package"
2074-
2075-#: ../libertine/qml/ContainerPasswordDialog.qml:36
2076-msgid "Invalid password entered"
2077-msgstr ""
2078-
2079-#: ../libertine/qml/ManageContainer.qml:27
2080+#: ../libertine/qml/ManageContainer.qml:29
2081 msgid "Manage %1"
2082-msgstr ""
2083-
2084-#: ../libertine/qml/HomeView.qml:102
2085-#, fuzzy
2086-msgid "Manage Container"
2087-msgstr "My Containers"
2088-
2089-#: ../libertine/qml/ContainersView.qml:31
2090-msgid "My Containers"
2091-msgstr "My Containers"
2092-
2093-#: ../libertine/qml/ContainerInfoView.qml:55
2094-#, fuzzy
2095-msgid "Name"
2096-msgstr "Name: %1"
2097-
2098-#: ../libertine/qml/DebianPackagePicker.qml:72
2099+msgstr "Manage %1"
2100+
2101+#: ../libertine/qml/ManageContainer.qml:63
2102+#: ../libertine/qml/ContainerOptionsDialog.qml:40
2103+msgid "i386 multiarch support"
2104+msgstr "i386 multiarch support"
2105+
2106+#: ../libertine/qml/ManageContainer.qml:67
2107+msgid "Additional archives and PPAs"
2108+msgstr "Additional archives and PPAs"
2109+
2110+#: ../libertine/qml/ManageContainer.qml:78
2111+msgid "Update…"
2112+msgstr "Update…"
2113+
2114+#: ../libertine/qml/ManageContainer.qml:94
2115+msgid "Update container"
2116+msgstr "Update container"
2117+
2118+#: ../libertine/qml/DebianPackagePicker.qml:28
2119+msgid "Available Debian Packages to Install"
2120+msgstr "Available Debian Packages to Install"
2121+
2122+#: ../libertine/qml/DebianPackagePicker.qml:87
2123 msgid "No Debian packages available"
2124-msgstr ""
2125-
2126-#: ../libertine/qml/SearchResultsView.qml:49
2127-#, fuzzy
2128-msgid "No Search Results Found"
2129-msgstr "No search results for %1."
2130-
2131-#: ../libertine/qml/ExtraArchivesView.qml:120
2132-msgid "No additional archives and PPA's have been added"
2133-msgstr ""
2134-
2135-#: ../libertine/qml/HomeView.qml:227
2136-#, fuzzy
2137-msgid "No packages are installed"
2138-msgstr "Please enter the exact package name of the app to install:"
2139-
2140-#: ../libertine/qml/ContainerOptionsDialog.qml:64
2141-#: ../libertine/qml/ContainerPasswordDialog.qml:52
2142-#: ../libertine/qml/SearchPackagesDialog.qml:39
2143-#: ../libertine/qml/HomeView.qml:65 ../libertine/qml/ExtraArchivesView.qml:55
2144-msgid "OK"
2145-msgstr ""
2146-
2147-#: ../libertine/qml/PackageInfoView.qml:33
2148-msgid "Obtaining package version…"
2149-msgstr "Obtaining package version…"
2150-
2151-#: ../libertine/qml/HomeView.qml:209
2152-msgid "Package Info"
2153-msgstr "Package Info"
2154-
2155-#: ../libertine/qml/SearchResultsView.qml:28
2156-msgid "Package Search Results"
2157-msgstr ""
2158-
2159-#: ../libertine/qml/HomeView.qml:56
2160-msgid "Package name or Debian package path"
2161-msgstr ""
2162-
2163-#: ../libertine/qml/PackageInfoView.qml:51
2164-#, fuzzy
2165-msgid "Package version"
2166-msgstr "Package version: %1"
2167+msgstr "No Debian packages available"
2168+
2169+#: ../libertine/qml/ContainerPasswordDialog.qml:27
2170+msgid "Authentication required"
2171+msgstr "Authentication required"
2172
2173 #: ../libertine/qml/ContainerPasswordDialog.qml:28
2174 msgid "Password is required to create a Libertine container"
2175-msgstr ""
2176-
2177-#: ../libertine/ContainerManager.cpp:27
2178-msgid "Removal of package %1 failed"
2179-msgstr ""
2180-
2181-#: ../libertine/qml/HomeView.qml:196
2182+msgstr "Password is required to create a Libertine container"
2183+
2184+#: ../libertine/qml/ContainerPasswordDialog.qml:36
2185+msgid "Invalid password entered"
2186+msgstr "Invalid password entered"
2187+
2188+#: ../libertine/qml/ContainerPasswordDialog.qml:41
2189+msgid "password"
2190+msgstr "password"
2191+
2192+#: ../libertine/qml/HomeView.qml:29
2193+msgid "Classic Apps - %1"
2194+msgstr "Classic Apps - %1"
2195+
2196+#: ../libertine/qml/HomeView.qml:48
2197+msgid "Install new package"
2198+msgstr "Install new package"
2199+
2200+#: ../libertine/qml/HomeView.qml:49
2201+msgid "Enter exact package name or full path to a Debian package file"
2202+msgstr "Enter exact package name or full path to a Debian package file"
2203+
2204+#: ../libertine/qml/HomeView.qml:59
2205+msgid "Package name or Debian package path"
2206+msgstr "Package name or Debian package path"
2207+
2208+#: ../libertine/qml/HomeView.qml:78
2209+msgid "The %1 package is already installed. Please try a different package name."
2210+msgstr "The %1 package is already installed. Please try a different package name."
2211+
2212+#: ../libertine/qml/HomeView.qml:104
2213+msgid "Manage Container"
2214+msgstr "Manage Container"
2215+
2216+#: ../libertine/qml/HomeView.qml:110
2217+msgid "Container Information"
2218+msgstr "Container Information"
2219+
2220+#: ../libertine/qml/HomeView.qml:116
2221+msgid "Switch Container"
2222+msgstr "Switch Container"
2223+
2224+#: ../libertine/qml/HomeView.qml:132
2225+msgid "Enter package name or Debian file"
2226+msgstr "Enter package name or Debian file"
2227+
2228+#: ../libertine/qml/HomeView.qml:138
2229+msgid "Choose Debian package to install"
2230+msgstr "Choose Debian package to install"
2231+
2232+#: ../libertine/qml/HomeView.qml:145
2233+msgid "Search archives for a package"
2234+msgstr "Search archives for a package"
2235+
2236+#: ../libertine/qml/HomeView.qml:211
2237 msgid "Remove Package"
2238 msgstr "Remove Package"
2239
2240-#: ../libertine/qml/ExtraArchivesView.qml:103
2241+#: ../libertine/qml/HomeView.qml:223
2242+msgid "Package Info"
2243+msgstr "Package Info"
2244+
2245+#: ../libertine/qml/HomeView.qml:240
2246+msgid "No packages are installed"
2247+msgstr "No packages are installed"
2248+
2249+#: ../libertine/qml/ExtraArchivesView.qml:28
2250+msgid "Additional Archives and PPAs"
2251+msgstr "Additional Archives and PPAs"
2252+
2253+#: ../libertine/qml/ExtraArchivesView.qml:32
2254+msgid "add"
2255+msgstr "add"
2256+
2257+#: ../libertine/qml/ExtraArchivesView.qml:33
2258+msgid "Add a new PPA"
2259+msgstr "Add a new PPA"
2260+
2261+#: ../libertine/qml/ExtraArchivesView.qml:46
2262+msgid "Add additional PPA"
2263+msgstr "Add additional PPA"
2264+
2265+#: ../libertine/qml/ExtraArchivesView.qml:47
2266+msgid "Enter name of PPA in the form ppa:user/ppa-name:"
2267+msgstr "Enter name of PPA in the form ppa:user/ppa-name:"
2268+
2269+#: ../libertine/qml/ExtraArchivesView.qml:107
2270+msgid "remove"
2271+msgstr "remove"
2272+
2273+#: ../libertine/qml/ExtraArchivesView.qml:108
2274 msgid "Remove extra archive"
2275-msgstr ""
2276-
2277-#: ../libertine/qml/SearchResultsView.qml:64
2278-msgid "Return to Apps Page"
2279-msgstr ""
2280-
2281-#: ../libertine/qml/PackageExistsDialog.qml:43
2282-#, fuzzy
2283-msgid "Return to search results"
2284-msgstr "No search results for %1."
2285-
2286-#: ../libertine/qml/SearchResultsView.qml:38
2287-msgid "Search"
2288-msgstr ""
2289-
2290-#: ../libertine/qml/SearchResultsView.qml:54
2291-msgid "Search Again"
2292-msgstr ""
2293-
2294-#: ../libertine/qml/PackageExistsDialog.qml:33
2295-msgid "Search again"
2296-msgstr ""
2297-
2298-#: ../libertine/qml/PackageExistsDialog.qml:29
2299-msgid "Search again or return to search results."
2300-msgstr ""
2301-
2302-#: ../libertine/qml/HomeView.qml:143
2303-msgid "Search archives for a package"
2304-msgstr ""
2305-
2306-#: ../libertine/qml/SearchPackagesDialog.qml:27
2307-msgid "Search archives for packages"
2308-msgstr ""
2309-
2310-#: ../libertine/qml/SearchResultsView.qml:39
2311-#: ../libertine/qml/SearchPackagesDialog.qml:26
2312-msgid "Search for packages"
2313-msgstr ""
2314-
2315-#: ../libertine/qml/SearchResultsView.qml:92
2316-#, fuzzy
2317-msgid "Searching for packages…"
2318-msgstr "Obtaining package version…"
2319-
2320-#: ../libertine/qml/ContainerInfoView.qml:69
2321-#, fuzzy
2322-msgid "Status"
2323-msgstr "Status: %1"
2324-
2325-#: ../libertine/qml/HomeView.qml:114
2326-msgid "Switch Container"
2327-msgstr "Switch Container"
2328-
2329-#: ../libertine/qml/PackageExistsDialog.qml:28
2330-#, fuzzy
2331-msgid "The %1 package is already installed."
2332-msgstr "Please enter the exact package name of the app to install:"
2333-
2334-#: ../libertine/qml/HomeView.qml:76
2335-#, fuzzy
2336-msgid ""
2337-"The %1 package is already installed. Please try a different package name."
2338-msgstr "Package %1 already installed. Please try a different package name."
2339-
2340-#: ../libertine/qml/PackageInfoView.qml:100
2341-msgid "Unknown"
2342-msgstr ""
2343-
2344-#: ../libertine/qml/ManageContainer.qml:86
2345-#, fuzzy
2346-msgid "Update container"
2347-msgstr "Update Container"
2348-
2349-#: ../libertine/qml/ManageContainer.qml:70
2350-msgid "Update…"
2351-msgstr ""
2352-
2353-#: ../libertine/qml/WelcomeView.qml:27
2354+msgstr "Remove extra archive"
2355+
2356+#: ../libertine/qml/ExtraArchivesView.qml:125
2357+msgid "No additional archives and PPA's have been added"
2358+msgstr "No additional archives and PPA's have been added"
2359+
2360+#: ../libertine/qml/ExtraArchivesView.qml:173
2361+msgid "Adding archive failed"
2362+msgstr "Adding archive failed"
2363+
2364+#: ../libertine/qml/ExtraArchivesView.qml:177
2365+msgid "Deleting archive failed"
2366+msgstr "Deleting archive failed"
2367+
2368+#: ../libertine/qml/GenericErrorDialog.qml:32
2369+msgid "Dismiss"
2370+msgstr "Dismiss"
2371+
2372+#: ../libertine/qml/WelcomeView.qml:28
2373 msgid "Welcome"
2374 msgstr "Welcome"
2375
2376-#: ../libertine/qml/WelcomeView.qml:42
2377+#: ../libertine/qml/WelcomeView.qml:50
2378 msgid "Welcome to the Ubuntu Legacy Application Support Manager."
2379 msgstr "Welcome to the Ubuntu Legacy Application Support Manager."
2380
2381-#: ../libertine/qml/WelcomeView.qml:50
2382+#: ../libertine/qml/WelcomeView.qml:58
2383 msgid ""
2384 "You do not have Legacy Application Support configured at this time. "
2385 "Downloading and setting up the required environment takes some time and "
2386@@ -336,87 +378,45 @@
2387 "Downloading and setting up the required environment takes some time and "
2388 "network bandwidth."
2389
2390-#: ../libertine/qml/ExtraArchivesView.qml:34
2391-msgid "add"
2392-msgstr ""
2393+#: ../libertine/qml/WelcomeView.qml:66
2394+msgid "Install"
2395+msgstr "Install"
2396+
2397+#: ../libertine/qml/ContainerInfoView.qml:30
2398+msgid "Container information for %1"
2399+msgstr "Container information for %1"
2400+
2401+#: ../libertine/qml/ContainerInfoView.qml:53
2402+msgid "ID"
2403+msgstr "ID"
2404+
2405+#: ../libertine/qml/ContainerInfoView.qml:60
2406+msgid "Name"
2407+msgstr "Name"
2408+
2409+#: ../libertine/qml/ContainerInfoView.qml:67
2410+msgid "Distribution"
2411+msgstr "Distribution"
2412+
2413+#: ../libertine/qml/ContainerInfoView.qml:74
2414+msgid "Status"
2415+msgstr "Status"
2416+
2417+#: ../libertine/qml/ContainerOptionsDialog.qml:27
2418+msgid "Container Options"
2419+msgstr "Container Options"
2420+
2421+#: ../libertine/qml/ContainerOptionsDialog.qml:28
2422+msgid "Configure options for container creation."
2423+msgstr "Configure options for container creation."
2424+
2425+#: ../libertine/qml/ContainerOptionsDialog.qml:50
2426+msgid "Enter or name for the container or leave blank for default name"
2427+msgstr "Enter or name for the container or leave blank for default name"
2428
2429 #: ../libertine/qml/ContainerOptionsDialog.qml:56
2430-#, fuzzy
2431 msgid "container name"
2432-msgstr "Container Info"
2433-
2434-#: ../libertine/qml/ContainersView.qml:72 ../libertine/qml/HomeView.qml:195
2435-msgid "delete"
2436-msgstr "delete"
2437-
2438-#: ../libertine/qml/ContainersView.qml:99
2439-msgid "edit"
2440-msgstr "edit"
2441-
2442-#: ../libertine/ContainerConfig.cpp:153 ../libertine/ContainerConfig.cpp:187
2443-msgid "failed"
2444-msgstr "failed"
2445-
2446-#: ../libertine/qml/ContainerOptionsDialog.qml:40
2447-#: ../libertine/qml/ManageContainer.qml:55
2448-msgid "i386 multiarch support"
2449-msgstr "i386 multiarch support"
2450-
2451-#: ../libertine/qml/ContainersView.qml:90 ../libertine/qml/HomeView.qml:208
2452-msgid "info"
2453-msgstr "info"
2454-
2455-#: ../libertine/ContainerConfig.cpp:186
2456-msgid "installed"
2457-msgstr "installed"
2458-
2459-#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
2460-#: ../libertine/qml/ContainersView.qml:63 ../libertine/qml/HomeView.qml:187
2461-#: ../libertine/qml/ExtraArchivesView.qml:94
2462-msgid "installing"
2463-msgstr "installing"
2464-
2465-#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
2466-msgid "new"
2467-msgstr "new"
2468-
2469-#: ../libertine/qml/ContainerPasswordDialog.qml:41
2470-#, fuzzy
2471-msgid "password"
2472-msgstr "Password"
2473-
2474-#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:101
2475-#: ../libertine/qml/ManageContainer.qml:71
2476-#: ../libertine/qml/ManageContainer.qml:112
2477-msgid "ready"
2478-msgstr "ready"
2479-
2480-#: ../libertine/qml/ExtraArchivesView.qml:102
2481-#, fuzzy
2482-msgid "remove"
2483-msgstr "removed"
2484-
2485-#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
2486-#: ../libertine/qml/ContainerInfoView.qml:88
2487-#: ../libertine/qml/PackageInfoView.qml:91
2488-msgid "removed"
2489-msgstr "removed"
2490-
2491-#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
2492-#: ../libertine/qml/ContainersView.qml:64 ../libertine/qml/HomeView.qml:188
2493-#: ../libertine/qml/ExtraArchivesView.qml:95
2494-msgid "removing"
2495-msgstr "removing"
2496-
2497-#: ../libertine/qml/SearchPackagesDialog.qml:31
2498-msgid "search"
2499-msgstr ""
2500-
2501-#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:102
2502-#: ../libertine/qml/ManageContainer.qml:83
2503-#: ../libertine/qml/ManageContainer.qml:108
2504-msgid "updating"
2505-msgstr ""
2506+msgstr "container name"
2507
2508 #~ msgid "Configure %1"
2509 #~ msgstr "Configure %1"
2510
2511=== modified file 'po/libertine.pot'
2512--- po/libertine.pot 2016-05-09 14:38:13 +0000
2513+++ po/libertine.pot 2016-06-07 12:41:22 +0000
2514@@ -8,7 +8,7 @@
2515 msgstr ""
2516 "Project-Id-Version: PACKAGE VERSION\n"
2517 "Report-Msgid-Bugs-To: \n"
2518-"POT-Creation-Date: 2016-05-09 10:33-0400\n"
2519+"POT-Creation-Date: 2016-06-07 07:58-0400\n"
2520 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
2521 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
2522 "Language-Team: LANGUAGE <LL@li.org>\n"
2523@@ -17,49 +17,37 @@
2524 "Content-Type: text/plain; charset=UTF-8\n"
2525 "Content-Transfer-Encoding: 8bit\n"
2526
2527-#: ../libertine/ContainerManager.cpp:25
2528-msgid "%1 failed to start"
2529-msgstr ""
2530-
2531-#: ../libertine/ContainerManager.cpp:26
2532-msgid "Installation of package %1 failed"
2533-msgstr ""
2534-
2535-#: ../libertine/ContainerManager.cpp:27
2536-msgid "Removal of package %1 failed"
2537-msgstr ""
2538-
2539 #: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
2540 msgid "new"
2541 msgstr ""
2542
2543 #: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
2544-#: ../libertine/qml/ContainersView.qml:63 ../libertine/qml/HomeView.qml:187
2545-#: ../libertine/qml/ExtraArchivesView.qml:94
2546+#: ../libertine/qml/ContainersView.qml:81 ../libertine/qml/HomeView.qml:197
2547+#: ../libertine/qml/ExtraArchivesView.qml:99
2548 msgid "installing"
2549 msgstr ""
2550
2551-#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:101
2552-#: ../libertine/qml/ManageContainer.qml:71
2553-#: ../libertine/qml/ManageContainer.qml:112
2554+#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:119
2555+#: ../libertine/qml/ManageContainer.qml:79
2556+#: ../libertine/qml/ManageContainer.qml:119
2557 msgid "ready"
2558 msgstr ""
2559
2560-#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:102
2561-#: ../libertine/qml/ManageContainer.qml:83
2562-#: ../libertine/qml/ManageContainer.qml:108
2563+#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:120
2564+#: ../libertine/qml/ManageContainer.qml:91
2565+#: ../libertine/qml/ManageContainer.qml:115
2566 msgid "updating"
2567 msgstr ""
2568
2569 #: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
2570-#: ../libertine/qml/ContainersView.qml:64 ../libertine/qml/HomeView.qml:188
2571-#: ../libertine/qml/ExtraArchivesView.qml:95
2572+#: ../libertine/qml/ContainersView.qml:82 ../libertine/qml/HomeView.qml:198
2573+#: ../libertine/qml/ExtraArchivesView.qml:100
2574 msgid "removing"
2575 msgstr ""
2576
2577 #: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
2578-#: ../libertine/qml/ContainerInfoView.qml:88
2579-#: ../libertine/qml/PackageInfoView.qml:91
2580+#: ../libertine/qml/PackageInfoView.qml:131
2581+#: ../libertine/qml/ContainerInfoView.qml:93
2582 msgid "removed"
2583 msgstr ""
2584
2585@@ -71,84 +59,188 @@
2586 msgid "installed"
2587 msgstr ""
2588
2589-#: ../libertine/qml/ContainerOptionsDialog.qml:27
2590-msgid "Container Options"
2591-msgstr ""
2592-
2593-#: ../libertine/qml/ContainerOptionsDialog.qml:28
2594-msgid "Configure options for container creation."
2595-msgstr ""
2596-
2597-#: ../libertine/qml/ContainerOptionsDialog.qml:40
2598-#: ../libertine/qml/ManageContainer.qml:55
2599-msgid "i386 multiarch support"
2600-msgstr ""
2601-
2602-#: ../libertine/qml/ContainerOptionsDialog.qml:50
2603-msgid "Enter or name for the container or leave blank for default name"
2604-msgstr ""
2605-
2606-#: ../libertine/qml/ContainerOptionsDialog.qml:56
2607-msgid "container name"
2608-msgstr ""
2609-
2610+#: ../libertine/ContainerManager.cpp:24
2611+msgid "%1 failed to start"
2612+msgstr ""
2613+
2614+#: ../libertine/ContainerManager.cpp:25
2615+msgid "Installation of package %1 failed"
2616+msgstr ""
2617+
2618+#: ../libertine/ContainerManager.cpp:26
2619+msgid "Removal of package %1 failed"
2620+msgstr ""
2621+
2622+#: ../libertine/ContainerManager.cpp:27
2623+msgid "Searching for query %1 failed"
2624+msgstr ""
2625+
2626+#: ../libertine/ContainerManager.cpp:28
2627+msgid "Updating container %1 failed"
2628+msgstr ""
2629+
2630+#: ../libertine/ContainerManager.cpp:29
2631+msgid "Creating container %1 failed"
2632+msgstr ""
2633+
2634+#: ../libertine/ContainerManager.cpp:30
2635+msgid "Destroying container %1 failed"
2636+msgstr ""
2637+
2638+#: ../libertine/ContainerManager.cpp:31
2639+msgid "Running command %1 failed"
2640+msgstr ""
2641+
2642+#: ../libertine/ContainerManager.cpp:32
2643+msgid "Attempt to configure container %1 failed"
2644+msgstr ""
2645+
2646+#: ../libertine/qml/PackageExistsDialog.qml:28
2647+msgid "The %1 package is already installed."
2648+msgstr ""
2649+
2650+#: ../libertine/qml/PackageExistsDialog.qml:29
2651+msgid "Search again or return to search results."
2652+msgstr ""
2653+
2654+#: ../libertine/qml/PackageExistsDialog.qml:33
2655+msgid "Search again"
2656+msgstr ""
2657+
2658+#: ../libertine/qml/PackageExistsDialog.qml:43
2659+msgid "Return to search results"
2660+msgstr ""
2661+
2662+#: ../libertine/qml/ContainersView.qml:33
2663+msgid "My Containers"
2664+msgstr ""
2665+
2666+#: ../libertine/qml/ContainersView.qml:92 ../libertine/qml/HomeView.qml:210
2667+msgid "delete"
2668+msgstr ""
2669+
2670+#: ../libertine/qml/ContainersView.qml:93
2671+msgid "Delete Container"
2672+msgstr ""
2673+
2674+#: ../libertine/qml/ContainersView.qml:108 ../libertine/qml/HomeView.qml:222
2675+msgid "info"
2676+msgstr ""
2677+
2678+#: ../libertine/qml/ContainersView.qml:109
2679+msgid "Container Info"
2680+msgstr ""
2681+
2682+#: ../libertine/qml/ContainersView.qml:117
2683+msgid "edit"
2684+msgstr ""
2685+
2686+#: ../libertine/qml/ContainersView.qml:118
2687+msgid "Container Apps"
2688+msgstr ""
2689+
2690+#: ../libertine/qml/SearchPackagesDialog.qml:26
2691+#: ../libertine/qml/SearchResultsView.qml:36
2692+msgid "Search for packages"
2693+msgstr ""
2694+
2695+#: ../libertine/qml/SearchPackagesDialog.qml:27
2696+msgid "Search archives for packages"
2697+msgstr ""
2698+
2699+#: ../libertine/qml/SearchPackagesDialog.qml:31
2700+msgid "search"
2701+msgstr ""
2702+
2703+#: ../libertine/qml/SearchPackagesDialog.qml:39
2704+#: ../libertine/qml/ContainerPasswordDialog.qml:52
2705+#: ../libertine/qml/HomeView.qml:68 ../libertine/qml/ExtraArchivesView.qml:57
2706 #: ../libertine/qml/ContainerOptionsDialog.qml:64
2707-#: ../libertine/qml/ContainerPasswordDialog.qml:52
2708-#: ../libertine/qml/SearchPackagesDialog.qml:39
2709-#: ../libertine/qml/HomeView.qml:65 ../libertine/qml/ExtraArchivesView.qml:55
2710 msgid "OK"
2711 msgstr ""
2712
2713+#: ../libertine/qml/SearchPackagesDialog.qml:57
2714+#: ../libertine/qml/ContainerPasswordDialog.qml:70
2715+#: ../libertine/qml/HomeView.qml:88 ../libertine/qml/ExtraArchivesView.qml:65
2716 #: ../libertine/qml/ContainerOptionsDialog.qml:75
2717-#: ../libertine/qml/ContainerPasswordDialog.qml:70
2718-#: ../libertine/qml/SearchPackagesDialog.qml:57
2719-#: ../libertine/qml/HomeView.qml:86 ../libertine/qml/ExtraArchivesView.qml:63
2720 msgid "Cancel"
2721 msgstr ""
2722
2723-#: ../libertine/qml/GenericErrorDialog.qml:32
2724-msgid "Dismiss"
2725-msgstr ""
2726-
2727-#: ../libertine/qml/SearchResultsView.qml:28
2728+#: ../libertine/qml/PackageInfoView.qml:30
2729+msgid "Information for the %1 package"
2730+msgstr ""
2731+
2732+#: ../libertine/qml/PackageInfoView.qml:35
2733+msgid "Obtaining package version…"
2734+msgstr ""
2735+
2736+#: ../libertine/qml/PackageInfoView.qml:59
2737+msgid "Package version"
2738+msgstr ""
2739+
2740+#: ../libertine/qml/PackageInfoView.qml:67
2741+msgid "Install status"
2742+msgstr ""
2743+
2744+#: ../libertine/qml/PackageInfoView.qml:140
2745+msgid "Unknown"
2746+msgstr ""
2747+
2748+#: ../libertine/qml/SearchResultsView.qml:31
2749 msgid "Package Search Results"
2750 msgstr ""
2751
2752-#: ../libertine/qml/SearchResultsView.qml:38
2753+#: ../libertine/qml/SearchResultsView.qml:35
2754 msgid "Search"
2755 msgstr ""
2756
2757-#: ../libertine/qml/SearchResultsView.qml:39
2758-#: ../libertine/qml/SearchPackagesDialog.qml:26
2759-msgid "Search for packages"
2760-msgstr ""
2761-
2762-#: ../libertine/qml/SearchResultsView.qml:49
2763+#: ../libertine/qml/SearchResultsView.qml:52
2764 msgid "No Search Results Found"
2765 msgstr ""
2766
2767-#: ../libertine/qml/SearchResultsView.qml:54
2768+#: ../libertine/qml/SearchResultsView.qml:57
2769 msgid "Search Again"
2770 msgstr ""
2771
2772-#: ../libertine/qml/SearchResultsView.qml:64
2773+#: ../libertine/qml/SearchResultsView.qml:67
2774 msgid "Return to Apps Page"
2775 msgstr ""
2776
2777-#: ../libertine/qml/SearchResultsView.qml:92
2778+#: ../libertine/qml/SearchResultsView.qml:95
2779 msgid "Searching for packages…"
2780 msgstr ""
2781
2782-#: ../libertine/qml/DebianPackagePicker.qml:26
2783+#: ../libertine/qml/SearchResults.qml:60
2784+#: ../libertine/qml/DebianPackagePicker.qml:70
2785+msgid "Install Package"
2786+msgstr ""
2787+
2788+#: ../libertine/qml/ManageContainer.qml:29
2789+msgid "Manage %1"
2790+msgstr ""
2791+
2792+#: ../libertine/qml/ManageContainer.qml:63
2793+#: ../libertine/qml/ContainerOptionsDialog.qml:40
2794+msgid "i386 multiarch support"
2795+msgstr ""
2796+
2797+#: ../libertine/qml/ManageContainer.qml:67
2798+msgid "Additional archives and PPAs"
2799+msgstr ""
2800+
2801+#: ../libertine/qml/ManageContainer.qml:78
2802+msgid "Update…"
2803+msgstr ""
2804+
2805+#: ../libertine/qml/ManageContainer.qml:94
2806+msgid "Update container"
2807+msgstr ""
2808+
2809+#: ../libertine/qml/DebianPackagePicker.qml:28
2810 msgid "Available Debian Packages to Install"
2811 msgstr ""
2812
2813-#: ../libertine/qml/DebianPackagePicker.qml:53
2814-#: ../libertine/qml/SearchResults.qml:42
2815-msgid "Install Package"
2816-msgstr ""
2817-
2818-#: ../libertine/qml/DebianPackagePicker.qml:72
2819+#: ../libertine/qml/DebianPackagePicker.qml:87
2820 msgid "No Debian packages available"
2821 msgstr ""
2822
2823@@ -168,226 +260,158 @@
2824 msgid "password"
2825 msgstr ""
2826
2827-#: ../libertine/qml/ContainerInfoView.qml:28
2828-msgid "Container information for %1"
2829-msgstr ""
2830-
2831-#: ../libertine/qml/ContainerInfoView.qml:48
2832-msgid "ID"
2833-msgstr ""
2834-
2835-#: ../libertine/qml/ContainerInfoView.qml:55
2836-msgid "Name"
2837-msgstr ""
2838-
2839-#: ../libertine/qml/ContainerInfoView.qml:62
2840-msgid "Distribution"
2841-msgstr ""
2842-
2843-#: ../libertine/qml/ContainerInfoView.qml:69
2844-msgid "Status"
2845-msgstr ""
2846-
2847-#: ../libertine/qml/ContainersView.qml:31
2848-msgid "My Containers"
2849-msgstr ""
2850-
2851-#: ../libertine/qml/ContainersView.qml:72 ../libertine/qml/HomeView.qml:195
2852-msgid "delete"
2853-msgstr ""
2854-
2855-#: ../libertine/qml/ContainersView.qml:73
2856-msgid "Delete Container"
2857-msgstr ""
2858-
2859-#: ../libertine/qml/ContainersView.qml:90 ../libertine/qml/HomeView.qml:208
2860-msgid "info"
2861-msgstr ""
2862-
2863-#: ../libertine/qml/ContainersView.qml:91
2864-msgid "Container Info"
2865-msgstr ""
2866-
2867-#: ../libertine/qml/ContainersView.qml:99
2868-msgid "edit"
2869-msgstr ""
2870-
2871-#: ../libertine/qml/ContainersView.qml:100
2872-msgid "Container Apps"
2873-msgstr ""
2874-
2875-#: ../libertine/qml/SearchPackagesDialog.qml:27
2876-msgid "Search archives for packages"
2877-msgstr ""
2878-
2879-#: ../libertine/qml/SearchPackagesDialog.qml:31
2880-msgid "search"
2881-msgstr ""
2882-
2883-#: ../libertine/qml/ManageContainer.qml:27
2884-msgid "Manage %1"
2885-msgstr ""
2886-
2887-#: ../libertine/qml/ManageContainer.qml:59
2888-msgid "Additional archives and PPAs"
2889-msgstr ""
2890-
2891-#: ../libertine/qml/ManageContainer.qml:70
2892-msgid "Update…"
2893-msgstr ""
2894-
2895-#: ../libertine/qml/ManageContainer.qml:86
2896-msgid "Update container"
2897-msgstr ""
2898-
2899-#: ../libertine/qml/HomeView.qml:27
2900+#: ../libertine/qml/HomeView.qml:29
2901 msgid "Classic Apps - %1"
2902 msgstr ""
2903
2904-#: ../libertine/qml/HomeView.qml:45
2905+#: ../libertine/qml/HomeView.qml:48
2906 msgid "Install new package"
2907 msgstr ""
2908
2909-#: ../libertine/qml/HomeView.qml:46
2910+#: ../libertine/qml/HomeView.qml:49
2911 msgid "Enter exact package name or full path to a Debian package file"
2912 msgstr ""
2913
2914-#: ../libertine/qml/HomeView.qml:56
2915+#: ../libertine/qml/HomeView.qml:59
2916 msgid "Package name or Debian package path"
2917 msgstr ""
2918
2919-#: ../libertine/qml/HomeView.qml:76
2920+#: ../libertine/qml/HomeView.qml:78
2921 msgid ""
2922 "The %1 package is already installed. Please try a different package name."
2923 msgstr ""
2924
2925-#: ../libertine/qml/HomeView.qml:102
2926+#: ../libertine/qml/HomeView.qml:104
2927 msgid "Manage Container"
2928 msgstr ""
2929
2930-#: ../libertine/qml/HomeView.qml:108
2931+#: ../libertine/qml/HomeView.qml:110
2932 msgid "Container Information"
2933 msgstr ""
2934
2935-#: ../libertine/qml/HomeView.qml:114
2936+#: ../libertine/qml/HomeView.qml:116
2937 msgid "Switch Container"
2938 msgstr ""
2939
2940-#: ../libertine/qml/HomeView.qml:130
2941+#: ../libertine/qml/HomeView.qml:132
2942 msgid "Enter package name or Debian file"
2943 msgstr ""
2944
2945-#: ../libertine/qml/HomeView.qml:136
2946+#: ../libertine/qml/HomeView.qml:138
2947 msgid "Choose Debian package to install"
2948 msgstr ""
2949
2950-#: ../libertine/qml/HomeView.qml:143
2951+#: ../libertine/qml/HomeView.qml:145
2952 msgid "Search archives for a package"
2953 msgstr ""
2954
2955-#: ../libertine/qml/HomeView.qml:196
2956+#: ../libertine/qml/HomeView.qml:211
2957 msgid "Remove Package"
2958 msgstr ""
2959
2960-#: ../libertine/qml/HomeView.qml:209
2961+#: ../libertine/qml/HomeView.qml:223
2962 msgid "Package Info"
2963 msgstr ""
2964
2965-#: ../libertine/qml/HomeView.qml:227
2966+#: ../libertine/qml/HomeView.qml:240
2967 msgid "No packages are installed"
2968 msgstr ""
2969
2970-#: ../libertine/qml/PackageInfoView.qml:29
2971-msgid "Information for the %1 package"
2972-msgstr ""
2973-
2974-#: ../libertine/qml/PackageInfoView.qml:33
2975-msgid "Obtaining package version…"
2976-msgstr ""
2977-
2978-#: ../libertine/qml/PackageInfoView.qml:51
2979-msgid "Package version"
2980-msgstr ""
2981-
2982-#: ../libertine/qml/PackageInfoView.qml:58
2983-msgid "Install status"
2984-msgstr ""
2985-
2986-#: ../libertine/qml/PackageInfoView.qml:100
2987-msgid "Unknown"
2988-msgstr ""
2989-
2990-#: ../libertine/qml/WelcomeView.qml:27
2991-msgid "Welcome"
2992-msgstr ""
2993-
2994-#: ../libertine/qml/WelcomeView.qml:42
2995-msgid "Welcome to the Ubuntu Legacy Application Support Manager."
2996-msgstr ""
2997-
2998-#: ../libertine/qml/WelcomeView.qml:50
2999-msgid ""
3000-"You do not have Legacy Application Support configured at this time. "
3001-"Downloading and setting up the required environment takes some time and "
3002-"network bandwidth."
3003-msgstr ""
3004-
3005-#: ../libertine/qml/WelcomeView.qml:58
3006-msgid "Install"
3007-msgstr ""
3008-
3009-#: ../libertine/qml/ExtraArchivesView.qml:26
3010+#: ../libertine/qml/ExtraArchivesView.qml:28
3011 msgid "Additional Archives and PPAs"
3012 msgstr ""
3013
3014-#: ../libertine/qml/ExtraArchivesView.qml:34
3015+#: ../libertine/qml/ExtraArchivesView.qml:32
3016 msgid "add"
3017 msgstr ""
3018
3019-#: ../libertine/qml/ExtraArchivesView.qml:35
3020+#: ../libertine/qml/ExtraArchivesView.qml:33
3021 msgid "Add a new PPA"
3022 msgstr ""
3023
3024-#: ../libertine/qml/ExtraArchivesView.qml:44
3025+#: ../libertine/qml/ExtraArchivesView.qml:46
3026 msgid "Add additional PPA"
3027 msgstr ""
3028
3029-#: ../libertine/qml/ExtraArchivesView.qml:45
3030+#: ../libertine/qml/ExtraArchivesView.qml:47
3031 msgid "Enter name of PPA in the form ppa:user/ppa-name:"
3032 msgstr ""
3033
3034-#: ../libertine/qml/ExtraArchivesView.qml:102
3035+#: ../libertine/qml/ExtraArchivesView.qml:107
3036 msgid "remove"
3037 msgstr ""
3038
3039-#: ../libertine/qml/ExtraArchivesView.qml:103
3040+#: ../libertine/qml/ExtraArchivesView.qml:108
3041 msgid "Remove extra archive"
3042 msgstr ""
3043
3044-#: ../libertine/qml/ExtraArchivesView.qml:120
3045+#: ../libertine/qml/ExtraArchivesView.qml:125
3046 msgid "No additional archives and PPA's have been added"
3047 msgstr ""
3048
3049-#: ../libertine/qml/ExtraArchivesView.qml:174
3050+#: ../libertine/qml/ExtraArchivesView.qml:173
3051 msgid "Adding archive failed"
3052 msgstr ""
3053
3054-#: ../libertine/qml/ExtraArchivesView.qml:178
3055+#: ../libertine/qml/ExtraArchivesView.qml:177
3056 msgid "Deleting archive failed"
3057 msgstr ""
3058
3059-#: ../libertine/qml/PackageExistsDialog.qml:28
3060-msgid "The %1 package is already installed."
3061-msgstr ""
3062-
3063-#: ../libertine/qml/PackageExistsDialog.qml:29
3064-msgid "Search again or return to search results."
3065-msgstr ""
3066-
3067-#: ../libertine/qml/PackageExistsDialog.qml:33
3068-msgid "Search again"
3069-msgstr ""
3070-
3071-#: ../libertine/qml/PackageExistsDialog.qml:43
3072-msgid "Return to search results"
3073+#: ../libertine/qml/GenericErrorDialog.qml:32
3074+msgid "Dismiss"
3075+msgstr ""
3076+
3077+#: ../libertine/qml/WelcomeView.qml:28
3078+msgid "Welcome"
3079+msgstr ""
3080+
3081+#: ../libertine/qml/WelcomeView.qml:50
3082+msgid "Welcome to the Ubuntu Legacy Application Support Manager."
3083+msgstr ""
3084+
3085+#: ../libertine/qml/WelcomeView.qml:58
3086+msgid ""
3087+"You do not have Legacy Application Support configured at this time. "
3088+"Downloading and setting up the required environment takes some time and "
3089+"network bandwidth."
3090+msgstr ""
3091+
3092+#: ../libertine/qml/WelcomeView.qml:66
3093+msgid "Install"
3094+msgstr ""
3095+
3096+#: ../libertine/qml/ContainerInfoView.qml:30
3097+msgid "Container information for %1"
3098+msgstr ""
3099+
3100+#: ../libertine/qml/ContainerInfoView.qml:53
3101+msgid "ID"
3102+msgstr ""
3103+
3104+#: ../libertine/qml/ContainerInfoView.qml:60
3105+msgid "Name"
3106+msgstr ""
3107+
3108+#: ../libertine/qml/ContainerInfoView.qml:67
3109+msgid "Distribution"
3110+msgstr ""
3111+
3112+#: ../libertine/qml/ContainerInfoView.qml:74
3113+msgid "Status"
3114+msgstr ""
3115+
3116+#: ../libertine/qml/ContainerOptionsDialog.qml:27
3117+msgid "Container Options"
3118+msgstr ""
3119+
3120+#: ../libertine/qml/ContainerOptionsDialog.qml:28
3121+msgid "Configure options for container creation."
3122+msgstr ""
3123+
3124+#: ../libertine/qml/ContainerOptionsDialog.qml:50
3125+msgid "Enter or name for the container or leave blank for default name"
3126+msgstr ""
3127+
3128+#: ../libertine/qml/ContainerOptionsDialog.qml:56
3129+msgid "container name"
3130 msgstr ""
3131
3132=== modified file 'python/libertine/ChrootContainer.py'
3133--- python/libertine/ChrootContainer.py 2016-05-11 17:26:27 +0000
3134+++ python/libertine/ChrootContainer.py 2016-06-07 12:41:22 +0000
3135@@ -180,8 +180,8 @@
3136 self._run_ldconfig(verbosity)
3137 return retcode
3138
3139- def install_package(self, package_name, verbosity=1, extra_apt_args=""):
3140- returncode = super().install_package(package_name, verbosity, extra_apt_args)
3141+ def install_package(self, package_name, verbosity=1, readline=False):
3142+ returncode = super().install_package(package_name, verbosity, readline)
3143
3144 if returncode:
3145 self._run_ldconfig(verbosity)
3146@@ -210,7 +210,7 @@
3147 % (utils.get_libertine_container_userdata_dir_path(self.container_id), home_path)
3148 )
3149
3150- xdg_user_dirs = ['Documents', 'Music', 'Pictures', 'Videos']
3151+ xdg_user_dirs = utils.get_common_xdg_directories()
3152 for user_dir in xdg_user_dirs:
3153 user_dir_path = os.path.join(home_path, user_dir)
3154 bind_mounts += " -b %s:%s" % (user_dir_path, user_dir_path)
3155
3156=== modified file 'python/libertine/Libertine.py'
3157--- python/libertine/Libertine.py 2016-05-11 17:26:27 +0000
3158+++ python/libertine/Libertine.py 2016-06-07 12:41:22 +0000
3159@@ -77,7 +77,9 @@
3160 self.container_type = 'unknown'
3161 self.container_id = container_id
3162 self.root_path = libertine.utils.get_libertine_container_rootfs_path(self.container_id)
3163- self.default_packages = ['matchbox', 'libnss-extrausers', 'software-properties-common',
3164+ self.default_packages = ['matchbox',
3165+ 'libnss-extrausers',
3166+ 'software-properties-common',
3167 'humanity-icon-theme']
3168
3169 def create_libertine_container(self, password=None, multiarch=False, verbosity=1):
3170@@ -148,7 +150,7 @@
3171 self.run_in_container(apt_command_prefix(verbosity) + '--force-yes update')
3172 return self.run_in_container(apt_command_prefix(verbosity) + '--force-yes upgrade')
3173
3174- def install_package(self, package_name, verbosity=1, extra_apt_args=""):
3175+ def install_package(self, package_name, verbosity=1, readline=False):
3176 """
3177 Installs a named package in the container.
3178
3179@@ -163,16 +165,17 @@
3180 self.run_in_container('dpkg -i ' +
3181 os.path.join('/', 'tmp', package_name.split('/')[-1]))
3182
3183- ret = self.run_in_container(apt_command_prefix(verbosity) +
3184- extra_apt_args + " install -f") == 0
3185+ ret = self.run_in_container(apt_command_prefix(verbosity) + " install -f") == 0
3186
3187 if delete_package:
3188 self.delete_package_in_container(package_name)
3189
3190 return ret
3191 else:
3192- return self.run_in_container(apt_command_prefix(verbosity) +
3193- extra_apt_args + " install '" + package_name + "'") == 0
3194+ cmd = apt_command_prefix(verbosity) + " install '" + package_name + "'"
3195+ if readline:
3196+ cmd = "env DEBIAN_FRONTEND=readline " + cmd
3197+ return self.run_in_container(cmd) == 0
3198
3199 def configure_command(self, command, *args, verbosity=1):
3200 """
3201@@ -326,17 +329,17 @@
3202 except RuntimeError as e:
3203 return handle_runtime_error(e)
3204
3205- def install_package(self, package_name, verbosity=1):
3206+ def install_package(self, package_name, verbosity=1, readline=False):
3207 """
3208 Installs a package in the container.
3209 """
3210 try:
3211 with ContainerRunning(self.container):
3212- return self.container.install_package(package_name, verbosity)
3213+ return self.container.install_package(package_name, verbosity, readline)
3214 except RuntimeError as e:
3215 return handle_runtime_error(e)
3216
3217- def remove_package(self, package_name, verbosity=1):
3218+ def remove_package(self, package_name, verbosity=1, readline=False):
3219 """
3220 Removes a package from the container.
3221
3222@@ -345,7 +348,10 @@
3223 """
3224 try:
3225 with ContainerRunning(self.container):
3226- if self.container.run_in_container(apt_command_prefix(verbosity) + "purge '" + package_name + "'") != 0:
3227+ cmd = apt_command_prefix(verbosity) + " purge '" + package_name + "'"
3228+ if readline:
3229+ cmd = "env DEBIAN_FRONTEND=readline " + cmd
3230+ if self.container.run_in_container(cmd) != 0:
3231 return False
3232 return self.container.run_in_container(apt_command_prefix(verbosity) + "autoremove --purge") == 0
3233 except RuntimeError as e:
3234
3235=== modified file 'python/libertine/LxcContainer.py'
3236--- python/libertine/LxcContainer.py 2016-05-11 17:26:27 +0000
3237+++ python/libertine/LxcContainer.py 2016-06-07 12:41:22 +0000
3238@@ -225,7 +225,7 @@
3239 # Bind mount the user's home directory
3240 self.container.append_config_item("lxc.mount.entry", home_entry)
3241
3242- xdg_user_dirs = ['Documents', 'Music', 'Pictures', 'Videos']
3243+ xdg_user_dirs = utils.get_common_xdg_directories()
3244
3245 for user_dir in xdg_user_dirs:
3246 xdg_user_dir_entry = (
3247
3248=== modified file 'python/libertine/utils.py'
3249--- python/libertine/utils.py 2016-04-06 19:14:10 +0000
3250+++ python/libertine/utils.py 2016-06-07 12:41:22 +0000
3251@@ -100,12 +100,29 @@
3252 return dpkg.stdout.read().strip()
3253
3254
3255+def get_common_xdg_directories():
3256+ return ['Documents', 'Music', 'Pictures', 'Videos', 'Downloads']
3257+
3258+
3259 def create_libertine_user_data_dir(container_id):
3260 user_data = get_libertine_container_userdata_dir_path(container_id)
3261
3262 if not os.path.exists(user_data):
3263 os.makedirs(user_data)
3264
3265+ config_path = os.path.join(user_data, ".config", "dconf")
3266+
3267+ if not os.path.exists(config_path):
3268+ os.makedirs(config_path)
3269+
3270+ xdg_user_dirs = get_common_xdg_directories()
3271+
3272+ for xdg_dir in xdg_user_dirs:
3273+ xdg_path = os.path.join(user_data, xdg_dir)
3274+
3275+ if not os.path.exists(xdg_path):
3276+ os.makedirs(xdg_path)
3277+
3278
3279 def get_libertine_lxc_socket():
3280 return '\0libertine_lxc_socket'
3281
3282=== modified file 'tools/CMakeLists.txt'
3283--- tools/CMakeLists.txt 2016-05-02 20:45:21 +0000
3284+++ tools/CMakeLists.txt 2016-06-07 12:41:22 +0000
3285@@ -5,3 +5,6 @@
3286 COMPONENT doc)
3287 install(PROGRAMS update-puritine-containers
3288 DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libertine)
3289+
3290+install(FILES bash_completion.d/libertine-container-manager
3291+ DESTINATION ${DESTDIR}/etc/bash_completion.d)
3292
3293=== added directory 'tools/bash_completion.d'
3294=== added file 'tools/bash_completion.d/libertine-container-manager'
3295--- tools/bash_completion.d/libertine-container-manager 1970-01-01 00:00:00 +0000
3296+++ tools/bash_completion.d/libertine-container-manager 2016-06-07 12:41:22 +0000
3297@@ -0,0 +1,72 @@
3298+# Copyright (C) 2016 Canonical Ltd.
3299+# Author: Larry Price <larry.price@canonical.com>
3300+
3301+# This program is free software: you can redistribute it and/or modify
3302+# it under the terms of the GNU General Public License as published by
3303+# the Free Software Foundation; version 3 of the License.
3304+#
3305+# This program is distributed in the hope that it will be useful,
3306+# but WITHOUT ANY WARRANTY; without even the implied warranty of
3307+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3308+# GNU General Public License for more details.
3309+#
3310+# You should have received a copy of the GNU General Public License
3311+# along with this program. If not, see <http://www.gnu.org/licenses/>.
3312+
3313+
3314+_libertine-container-manager()
3315+{
3316+ local cur cmd opts
3317+ COMPREPLY=()
3318+ cur="${COMP_WORDS[COMP_CWORD]}"
3319+ cmd="${COMP_WORDS[1]}"
3320+
3321+ if [[ ${cur} == -* ]]; then
3322+ case "${cmd}" in
3323+ "install-package" )
3324+ opts="--help --id --package --readline"
3325+ ;;
3326+ "remove-package" )
3327+ opts="--help --id --package --readline"
3328+ ;;
3329+ "create" )
3330+ opts="--help --id --type --distro --name --force --multiarch --password"
3331+ ;;
3332+ "destroy" )
3333+ opts="--help --id"
3334+ ;;
3335+ "search-cache" )
3336+ opts="--help --id --search-string"
3337+ ;;
3338+ "update" )
3339+ opts="--help --id"
3340+ ;;
3341+ "list-apps" )
3342+ opts="--help --id --json"
3343+ ;;
3344+ "list" )
3345+ opts="--help"
3346+ ;;
3347+ "configure" )
3348+ opts="--help --id --multiarch --add-archive --delete-archive"
3349+ ;;
3350+ * )
3351+ opts="--help --quiet --verbose"
3352+ ;;
3353+ esac
3354+ fi
3355+
3356+ if [[ ${cmd} == "configure" && "${COMP_WORDS[COMP_CWORD-1]}" == "--multiarch" ]]; then
3357+ opts="enable disable"
3358+ fi
3359+
3360+ if [[ -z ${opts} && "${COMP_CWORD}" == "1" ]]; then
3361+ opts="create destroy install-package remove-package search-cache update list list-apps configure"
3362+ fi
3363+
3364+ if [[ -n "${opts}" ]]; then
3365+ COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
3366+ return 0
3367+ fi
3368+}
3369+complete -F _libertine-container-manager libertine-container-manager
3370
3371=== modified file 'tools/libertine-container-manager'
3372--- tools/libertine-container-manager 2016-05-11 17:26:27 +0000
3373+++ tools/libertine-container-manager 2016-06-07 12:41:22 +0000
3374@@ -305,6 +305,16 @@
3375 return
3376
3377
3378+def get_package_install_status(container_id, package_name):
3379+ container_list = read_container_config_file()
3380+
3381+ for container in container_list['containerList']:
3382+ if container['id'] == container_id:
3383+ for package in container['installedApps']:
3384+ if package['packageName'] == package_name:
3385+ return package['appStatus']
3386+
3387+
3388 def add_new_package(container_id, package_name):
3389 container_list = read_container_config_file()
3390
3391@@ -392,6 +402,14 @@
3392 update_container_install_status(args.id, "ready")
3393
3394
3395+def destroy_container_by_id(id):
3396+ container = LibertineContainer(id)
3397+ update_container_install_status(id, "removing")
3398+ container.destroy_libertine_container()
3399+ update_container_install_status(id, "removed")
3400+ delete_container(id)
3401+
3402+
3403 def destroy(args):
3404 if args.id and not libertine.utils.container_exists(args.id):
3405 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
3406@@ -399,11 +417,7 @@
3407 elif not args.id:
3408 args.id = get_default_container_id()
3409
3410- container = LibertineContainer(args.id)
3411- update_container_install_status(args.id, "removing")
3412- container.destroy_libertine_container()
3413- update_container_install_status(args.id, "removed")
3414- delete_container(args.id)
3415+ destroy_container_by_id(args.id)
3416
3417
3418 def install_package(args):
3419@@ -434,13 +448,28 @@
3420 container = LibertineContainer(args.id)
3421
3422 update_package_install_status(args.id, package, "installing")
3423- if not container.install_package(args.package, args.verbosity):
3424+ if not container.install_package(args.package, args.verbosity, args.readline):
3425 delete_package(args.id, package)
3426 sys.exit(1)
3427
3428 update_package_install_status(args.id, package, "installed")
3429
3430
3431+def remove_package_by_name(container_id, package_name, verbosity=1, readline=False):
3432+ fallback_status = get_package_install_status(container_id, package_name)
3433+ update_package_install_status(container_id, package_name, "removing")
3434+
3435+ container = LibertineContainer(container_id)
3436+ if not container.remove_package(package_name, verbosity, readline):
3437+ update_package_install_status(container_id, package_name, fallback_status)
3438+ return False
3439+
3440+ update_package_install_status(container_id, package_name, "removed")
3441+ delete_package(container_id, package_name)
3442+
3443+ return True
3444+
3445+
3446 def remove_package(args):
3447 if args.id and not libertine.utils.container_exists(args.id):
3448 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
3449@@ -448,21 +477,13 @@
3450 elif not args.id:
3451 args.id = get_default_container_id()
3452
3453- if not package_exists(args.id, args.package):
3454+ if get_package_install_status(args.id, args.package) != 'installed':
3455 print("Package \'%s\' is not installed." % args.package)
3456 sys.exit(1)
3457
3458- container = LibertineContainer(args.id)
3459- update_package_install_status(args.id, args.package, "removing")
3460-
3461- if not container.remove_package(args.package, args.verbosity):
3462- update_package_install_status(args.id, args.package, "installed")
3463+ if not remove_package_by_name(args.id, args.package, args.verbosity, args.readline):
3464 sys.exit(1)
3465
3466- update_package_install_status(args.id, args.package, "removed")
3467-
3468- delete_package(args.id, args.package)
3469-
3470
3471 def search_cache(args):
3472 if args.id and not libertine.utils.container_exists(args.id):
3473@@ -523,6 +544,14 @@
3474 sys.exit(1)
3475
3476
3477+def delete_archive_by_name(container_id, archive_name):
3478+ update_archive_install_status(container_id, archive_name, 'removing')
3479+ if LibertineContainer(container_id).configure_command('delete-archive', archive_name) is not 0:
3480+ return False
3481+ delete_container_archive(container_id, archive_name)
3482+ return True
3483+
3484+
3485 def configure(args):
3486 if args.id and not libertine.utils.container_exists(args.id):
3487 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
3488@@ -565,17 +594,30 @@
3489 print("%s is not added in container." % args.delete_archive)
3490 sys.exit(1)
3491
3492- update_archive_install_status(args.id, args.delete_archive, 'removing')
3493- if container.configure_command('delete-archive', args.delete_archive) is not 0:
3494+ if not delete_archive_by_name(args.id, args.delete_archive):
3495 sys.exit(1)
3496
3497- delete_container_archive(args.id, args.delete_archive)
3498-
3499
3500 def merge(args):
3501 merge_container_config_files(args.file)
3502
3503
3504+def fix_integrity(args):
3505+ for container in read_container_config_file()['containerList']:
3506+ if container['installStatus'] != 'ready':
3507+ destroy_container_by_id(container['id'])
3508+ continue
3509+ LibertineContainer(container['id']).exec_command('dpkg --configure -a')
3510+
3511+ for package in container['installedApps']:
3512+ if package['appStatus'] != 'installed':
3513+ remove_package_by_name(container['id'], package['packageName'])
3514+ if 'extraArchives' in container:
3515+ for archive in container['extraArchives']:
3516+ if archive['archiveStatus'] != 'installed':
3517+ delete_archive_by_name(container['id'], archive['archiveName'])
3518+
3519+
3520 if __name__ == '__main__':
3521 parser = argparse.ArgumentParser(description="Legacy X application support for Unity 8")
3522
3523@@ -644,6 +686,9 @@
3524 parser_install.add_argument(
3525 '-i', '--id',
3526 help=("Container identifier. Default container is used if omitted."))
3527+ parser_install.add_argument(
3528+ '-r', '--readline', action='store_true',
3529+ help=("Readline mode. Use text-based frontend during debconf interactions."))
3530 parser_install.set_defaults(func=install_package)
3531
3532 # Handle the remove-package command and its options
3533@@ -657,6 +702,9 @@
3534 parser_remove.add_argument(
3535 '-i', '--id',
3536 help=("Container identifier. Default container is used if omitted."))
3537+ parser_remove.add_argument(
3538+ '-r', '--readline', action='store_true',
3539+ help=("Readline mode. Use text-based frontend during debconf interactions."))
3540 parser_remove.set_defaults(func=remove_package)
3541
3542 # Handle the search-cache command and its options
3543@@ -747,6 +795,12 @@
3544 required=True)
3545 parser_merge.set_defaults(func=merge)
3546
3547+ # Indiscriminately destroy containers, packages, and archives which are not fully installed
3548+ parser_integrity = subparsers.add_parser(
3549+ 'fix-integrity',
3550+ add_help=False)
3551+ parser_integrity.set_defaults(func=fix_integrity)
3552+
3553 # Actually parse the args
3554 args = parser.parse_args()
3555 if args.verbosity is None:
3556
3557=== modified file 'tools/libertine-launch'
3558--- tools/libertine-launch 2016-05-05 20:41:46 +0000
3559+++ tools/libertine-launch 2016-06-07 12:41:22 +0000
3560@@ -25,18 +25,36 @@
3561 from libertine import LibertineContainer
3562
3563
3564-def set_dbus_session_socket_path():
3565+def get_session_socket_path(session_socket_name):
3566 unique_id = os.environ['DISPLAY'].strip(':')
3567
3568 if not os.path.exists(libertine.utils.get_libertine_runtime_dir()):
3569 os.makedirs(libertine.utils.get_libertine_runtime_dir())
3570
3571- dbus_session_socket_path = (
3572- os.path.join(libertine.utils.get_libertine_runtime_dir(), 'host_dbus_session' + unique_id))
3573-
3574- os.environ['DBUS_SESSION_BUS_ADDRESS'] = "unix:path=" + dbus_session_socket_path
3575-
3576- return dbus_session_socket_path
3577+ session_socket_path = (
3578+ os.path.join(libertine.utils.get_libertine_runtime_dir(), session_socket_name + unique_id))
3579+
3580+ return session_socket_path
3581+
3582+
3583+def get_dbus_session_socket_path():
3584+ return get_session_socket_path('host_dbus_session')
3585+
3586+
3587+def get_maliit_session_socket_path():
3588+ return get_session_socket_path('host_maliit_session')
3589+
3590+
3591+def set_env_socket_path(session_socket_path, session_env):
3592+ os.environ[session_env] = "unix:path=" + session_socket_path
3593+
3594+
3595+def set_dbus_env_socket_path(socket_path):
3596+ set_env_socket_path(socket_path, 'DBUS_SESSION_BUS_ADDRESS')
3597+
3598+
3599+def set_maliit_env_socket_path(socket_path):
3600+ set_env_socket_path(socket_path, 'MALIIT_SERVER_ADDRESS')
3601
3602
3603 def launch_libertine_session_bridge(session_socket_path):
3604@@ -74,11 +92,17 @@
3605 if e in os.environ:
3606 del os.environ[e]
3607
3608- session_socket_path = set_dbus_session_socket_path()
3609-
3610- session_bridge = launch_libertine_session_bridge(session_socket_path)
3611-
3612- detect_session_bridge_socket(session_socket_path)
3613+ dbus_socket_path = get_dbus_session_socket_path()
3614+ maliit_socket_path = get_maliit_session_socket_path()
3615+ session_bridge_arguments = dbus_socket_path + ' ' + maliit_socket_path
3616+
3617+ session_bridge = launch_libertine_session_bridge(session_bridge_arguments)
3618+
3619+ set_dbus_env_socket_path(dbus_socket_path)
3620+ set_maliit_env_socket_path(maliit_socket_path)
3621+
3622+ # should detect the maliit socket, but dont know if its around or not here.
3623+ detect_session_bridge_socket(dbus_socket_path)
3624
3625 container = LibertineContainer(args.container_id)
3626
3627
3628=== modified file 'tools/libertine-session-bridge'
3629--- tools/libertine-session-bridge 2016-02-04 20:23:58 +0000
3630+++ tools/libertine-session-bridge 2016-06-07 12:41:22 +0000
3631@@ -1,5 +1,6 @@
3632 #!/usr/bin/python3
3633
3634+import dbus
3635 import libertine.utils
3636 import os
3637 import select
3638@@ -9,15 +10,15 @@
3639 from socket import *
3640
3641
3642-def accept_new_connection():
3643- newconn = container_dbus_session_sock.accept()[0]
3644+def accept_new_connection(host_adder, container_sock):
3645+ newconn = container_sock.accept()[0]
3646 descriptors.append(newconn)
3647
3648- host_dbus_session_sock = socket(AF_UNIX, SOCK_STREAM)
3649- host_dbus_session_sock.connect(host_dbus_session_addr)
3650- descriptors.append(host_dbus_session_sock)
3651+ host_sock = socket(AF_UNIX, SOCK_STREAM)
3652+ host_sock.connect(host_adder)
3653+ descriptors.append(host_sock)
3654
3655- socket_pairs.append([newconn, host_dbus_session_sock])
3656+ socket_pairs.append([newconn, host_sock])
3657
3658
3659 def get_socket_pair(socket):
3660@@ -57,6 +58,26 @@
3661 j.close()
3662
3663
3664+def get_host_maliit_socket():
3665+ address_bus_name = "org.maliit.server"
3666+ address_object_path = "/org/maliit/server/address"
3667+ address_interface = "org.maliit.Server.Address"
3668+ address_property = "address"
3669+
3670+ session_bus = dbus.SessionBus()
3671+ maliit_object = session_bus.get_object('org.maliit.server', '/org/maliit/server/address')
3672+
3673+ interface = dbus.Interface(maliit_object, dbus.PROPERTIES_IFACE)
3674+ address = interface.Get('org.maliit.Server.Address', 'address')
3675+
3676+ partition_key = 'unix:abstract='
3677+ address = address.split(',')[0]
3678+ address = address.partition(partition_key)[2]
3679+ address = "\0%s" % address
3680+
3681+ return address
3682+
3683+
3684 def get_host_dbus_socket():
3685 socket_key = "DBUS_SESSION_BUS_ADDRESS=unix:abstract="
3686
3687@@ -73,9 +94,13 @@
3688
3689
3690 def socket_cleanup(signum, frame):
3691- container_dbus_session_sock.close()
3692+ for socket in descriptors:
3693+ socket.close()
3694+
3695 close_all_connections()
3696- os.remove(dbus_session_socket_path)
3697+
3698+ for socket_path in session_socket_paths:
3699+ os.remove(socket_path)
3700
3701
3702 def main_loop():
3703@@ -94,8 +119,8 @@
3704 if sock.fileno() == -1:
3705 continue
3706
3707- if sock == container_dbus_session_sock:
3708- accept_new_connection()
3709+ if sock in host_session_socket_path_map:
3710+ accept_new_connection(host_session_socket_path_map[sock], sock)
3711
3712 else:
3713 data = sock.recv(4096)
3714@@ -118,14 +143,54 @@
3715 totalsent = totalsent + sent
3716
3717
3718-dbus_session_socket_path = sys.argv[1]
3719-
3720-container_dbus_session_sock = socket(AF_UNIX, SOCK_STREAM)
3721-container_dbus_session_sock.bind(dbus_session_socket_path)
3722-container_dbus_session_sock.listen(5)
3723-
3724-host_dbus_session_addr = get_host_dbus_socket()
3725-descriptors = [container_dbus_session_sock]
3726+def create_socket(session_socket_path):
3727+ try:
3728+ sock = socket(AF_UNIX, SOCK_STREAM)
3729+ except:
3730+ sock = None
3731+ else:
3732+ try:
3733+ sock.bind(session_socket_path)
3734+ sock.listen(5)
3735+ except:
3736+ sock.close()
3737+ sock = None
3738+ else:
3739+ return sock
3740+
3741+ return None
3742+
3743+
3744+def create_container_socket(session_socket_path, get_host_session_path_function):
3745+ container_session_sock = create_socket(session_socket_path)
3746+
3747+ if container_session_sock is not None:
3748+ try:
3749+ host_session_path = get_host_session_path_function()
3750+ except:
3751+ container_session_sock.close()
3752+ container_session_sock = None
3753+ raise
3754+ else:
3755+ host_session_socket_path_map.update({container_session_sock:host_session_path})
3756+
3757+ session_socket_paths.append(session_socket_path)
3758+ descriptors.append(container_session_sock)
3759+
3760+
3761+descriptors = []
3762+host_session_socket_path_map = {}
3763+session_socket_paths = []
3764+
3765+# Required sockets:
3766+create_container_socket(sys.argv[1], get_host_dbus_socket)
3767+
3768+# Optional sockets:
3769+try:
3770+ create_container_socket(sys.argv[2], get_host_maliit_socket)
3771+except:
3772+ pass
3773+
3774 socket_pairs = []
3775
3776 main_loop()

Subscribers

People subscribed via source and target branches