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
=== modified file 'data/CMakeLists.txt'
--- data/CMakeLists.txt 2016-05-02 20:45:21 +0000
+++ data/CMakeLists.txt 2016-06-07 12:41:22 +0000
@@ -1,10 +1,8 @@
1add_subdirectory(demo)
2
3install(FILES libertine.desktop1install(FILES libertine.desktop
4 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)2 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
5install(FILES libertine_64.png libertine-lxc.conf3install(FILES libertine_64.png libertine-lxc.conf
6 DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME})4 DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME})
7install(FILES puritine-click.conf libertine-lxc-manager.conf libertine-xmir.conf5install(FILES libertine-lxc-manager.conf libertine-xmir.conf
8 DESTINATION ${CMAKE_INSTALL_DATADIR}/upstart/sessions)6 DESTINATION ${CMAKE_INSTALL_DATADIR}/upstart/sessions)
9install(FILES puritine-15.04.1.framework7install(FILES puritine-15.04.1.framework
10 DESTINATION ${CMAKE_INSTALL_DATADIR}/click/frameworks)8 DESTINATION ${CMAKE_INSTALL_DATADIR}/click/frameworks)
119
=== removed directory 'data/demo'
=== removed file 'data/demo/CMakeLists.txt'
--- data/demo/CMakeLists.txt 2015-09-01 20:32:12 +0000
+++ data/demo/CMakeLists.txt 1970-01-01 00:00:00 +0000
@@ -1,4 +0,0 @@
1add_subdirectory(desktop_files)
2
3install(DIRECTORY icons/
4 DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}/demo/icons)
50
=== removed directory 'data/demo/desktop_files'
=== removed file 'data/demo/desktop_files/CMakeLists.txt'
--- data/demo/desktop_files/CMakeLists.txt 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/CMakeLists.txt 1970-01-01 00:00:00 +0000
@@ -1,24 +0,0 @@
1execute_process(COMMAND dpkg-architecture -qDEB_BUILD_ARCH
2 OUTPUT_VARIABLE BUILD_ARCH
3 OUTPUT_STRIP_TRAILING_WHITESPACE
4)
5
6configure_file("puritine_firefox_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_firefox_0.0.desktop" @ONLY)
7install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_firefox_0.0.desktop"
8 DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
9
10configure_file("puritine_gedit_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_gedit_0.0.desktop" @ONLY)
11install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_gedit_0.0.desktop"
12 DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
13
14configure_file("puritine_gimp_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_gimp_0.0.desktop" @ONLY)
15install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_gimp_0.0.desktop"
16 DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
17
18configure_file("puritine_libreoffice-startcenter_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_libreoffice-startcenter_0.0.desktop" @ONLY)
19install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_libreoffice-startcenter_0.0.desktop"
20 DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
21
22configure_file("puritine_xchat-gnome_0.0.desktop.in" "${CMAKE_CURRENT_BINARY_DIR}/puritine_xchat-gnome_0.0.desktop" @ONLY)
23install(FILES "${CMAKE_CURRENT_BINARY_DIR}/puritine_xchat-gnome_0.0.desktop"
24 DESTINATION "${CMAKE_INSTALL_DATADIR}/applications/demo")
250
=== removed file 'data/demo/desktop_files/puritine_firefox_0.0.desktop.in'
--- data/demo/desktop_files/puritine_firefox_0.0.desktop.in 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/puritine_firefox_0.0.desktop.in 1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
1[Desktop Entry]
2Version=1.0
3Name=Firefox
4Exec=/bin/true
5Type=Application
6StartupNotify=true
7Icon=/usr/share/libertine/demo/icons/firefox.png
8Keywords=Libertine
9NotShowIn=Unity;
10X-Ubuntu-Touch=true
11X-Ubuntu-XMir-Enable=true
120
=== removed file 'data/demo/desktop_files/puritine_gedit_0.0.desktop.in'
--- data/demo/desktop_files/puritine_gedit_0.0.desktop.in 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/puritine_gedit_0.0.desktop.in 1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
1[Desktop Entry]
2Version=1.0
3Name=Gedit
4Exec=/bin/true
5Type=Application
6StartupNotify=true
7Icon=/usr/share/libertine/demo/icons/accessories-text-editor.svg
8Keywords=Libertine
9NotShowIn=Unity;
10X-Ubuntu-Touch=true
11X-Ubuntu-XMir-Enable=true
120
=== removed file 'data/demo/desktop_files/puritine_gimp_0.0.desktop.in'
--- data/demo/desktop_files/puritine_gimp_0.0.desktop.in 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/puritine_gimp_0.0.desktop.in 1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
1[Desktop Entry]
2Version=1.0
3Name=GIMP Image Editor
4Exec=/bin/true
5Type=Application
6StartupNotify=true
7Icon=/usr/share/libertine/demo/icons/gimp.png
8Keywords=Libertine
9NotShowIn=Unity;
10X-Ubuntu-Touch=true
11X-Ubuntu-XMir-Enable=true
120
=== removed file 'data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in'
--- data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/puritine_libreoffice-startcenter_0.0.desktop.in 1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
1[Desktop Entry]
2Version=1.0
3Name=LibreOffice
4Exec=/bin/true
5Type=Application
6StartupNotify=true
7Icon=/usr/share/libertine/demo/icons/libreoffice-startcenter.png
8Keywords=Libertine
9NotShowIn=Unity;
10X-Ubuntu-Touch=true
11X-Ubuntu-XMir-Enable=true
120
=== removed file 'data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in'
--- data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in 2015-09-18 14:35:55 +0000
+++ data/demo/desktop_files/puritine_xchat-gnome_0.0.desktop.in 1970-01-01 00:00:00 +0000
@@ -1,11 +0,0 @@
1[Desktop Entry]
2Version=1.0
3Name=XChat-GNOME
4Exec=/bin/true
5Type=Application
6StartupNotify=true
7Icon=/usr/share/libertine/demo/icons/xchat-gnome.png
8Keywords=Libertine
9NotShowIn=Unity;
10X-Ubuntu-Touch=true
11X-Ubuntu-XMir-Enable=true
120
=== removed directory 'data/demo/icons'
=== removed file 'data/demo/icons/accessories-text-editor.svg'
--- data/demo/icons/accessories-text-editor.svg 2015-09-01 20:32:12 +0000
+++ data/demo/icons/accessories-text-editor.svg 1970-01-01 00:00:00 +0000
@@ -1,119 +0,0 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<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/">
4 <metadata id="metadata290">
5 <rdf:RDF>
6 <cc:Work rdf:about="">
7 <dc:format>image/svg+xml</dc:format>
8 <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
9 </cc:Work>
10 </rdf:RDF>
11 </metadata>
12 <defs id="defs2822">
13 <linearGradient id="linearGradient5060">
14 <stop id="stop5062" offset="0"/>
15 <stop id="stop5064" style="stop-opacity:0" offset="1"/>
16 </linearGradient>
17 <linearGradient id="linearGradient3104">
18 <stop id="stop3106" style="stop-color:#a0a0a0" offset="0"/>
19 <stop id="stop3108" style="stop-color:#c8c8c8" offset="1"/>
20 </linearGradient>
21 <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">
22 <stop id="stop2607" style="stop-color:#ece5a5" offset="0"/>
23 <stop id="stop2609" style="stop-color:#fcfbf2" offset="1"/>
24 </linearGradient>
25 <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">
26 <stop id="stop2613" style="stop-color:#dbce48" offset="0"/>
27 <stop id="stop2615" style="stop-color:#c5b625" offset="1"/>
28 </linearGradient>
29 <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">
30 <stop id="stop2599" style="stop-color:#b1b1b1" offset="0"/>
31 <stop id="stop2601" style="stop-color:#fff" offset=".5"/>
32 <stop id="stop2603" style="stop-color:#8f8f8f" offset="1"/>
33 </linearGradient>
34 <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">
35 <stop id="stop2591" style="stop-color:#565656" offset="0"/>
36 <stop id="stop2593" style="stop-color:#9a9a9a" offset=".5"/>
37 <stop id="stop2595" style="stop-color:#545454" offset="1"/>
38 </linearGradient>
39 <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">
40 <stop id="stop2583" style="stop-color:#b1b1b1" offset="0"/>
41 <stop id="stop2585" style="stop-color:#fff" offset=".5"/>
42 <stop id="stop2587" style="stop-color:#8f8f8f" offset="1"/>
43 </linearGradient>
44 <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">
45 <stop id="stop2575" style="stop-color:#565656" offset="0"/>
46 <stop id="stop2577" style="stop-color:#9a9a9a" offset=".5"/>
47 <stop id="stop2579" style="stop-color:#545454" offset="1"/>
48 </linearGradient>
49 <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">
50 <stop id="stop2567" style="stop-color:#b1b1b1" offset="0"/>
51 <stop id="stop2569" style="stop-color:#fff" offset=".5"/>
52 <stop id="stop2571" style="stop-color:#8f8f8f" offset="1"/>
53 </linearGradient>
54 <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">
55 <stop id="stop2559" style="stop-color:#565656" offset="0"/>
56 <stop id="stop2561" style="stop-color:#9a9a9a" offset=".5"/>
57 <stop id="stop2563" style="stop-color:#545454" offset="1"/>
58 </linearGradient>
59 <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">
60 <stop id="stop2541" style="stop-color:#181818" offset="0"/>
61 <stop id="stop2543" style="stop-color:#dbdbdb" offset=".13483"/>
62 <stop id="stop2545" style="stop-color:#a4a4a4" offset=".20224"/>
63 <stop id="stop2547" style="stop-color:#fff" offset=".26966"/>
64 <stop id="stop2549" style="stop-color:#8d8d8d" offset=".44650"/>
65 <stop id="stop2551" style="stop-color:#959595" offset=".57114"/>
66 <stop id="stop2553" style="stop-color:#cecece" offset=".72038"/>
67 <stop id="stop2555" style="stop-color:#181818" offset="1"/>
68 </linearGradient>
69 <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">
70 <stop id="stop3828" style="stop-color:#f4f4f4" offset="0"/>
71 <stop id="stop3604" style="stop-color:#dbdbdb" offset="1"/>
72 </linearGradient>
73 <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"/>
74 <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"/>
75 <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"/>
76 <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">
77 <stop id="stop5050" style="stop-opacity:0" offset="0"/>
78 <stop id="stop5056" offset=".5"/>
79 <stop id="stop5052" style="stop-opacity:0" offset="1"/>
80 </linearGradient>
81 <linearGradient id="linearGradient3781" y2="3.0719" xlink:href="#linearGradient3104" gradientUnits="userSpaceOnUse" x2="22.004" y1="44.854" x1="22.004"/>
82 </defs>
83 <rect id="rect3706" style="opacity:.40206;fill:url(#linearGradient2984)" height="3" width="32.3" y="43" x="7.85"/>
84 <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"/>
85 <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"/>
86 <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"/>
87 <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"/>
88 <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"/>
89 <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"/>
90 <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"/>
91 <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"/>
92 <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"/>
93 <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"/>
94 <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"/>
95 <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"/>
96 <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"/>
97 <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"/>
98 <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"/>
99 <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"/>
100 <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"/>
101 <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"/>
102 <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"/>
103 <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"/>
104 <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"/>
105 <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"/>
106 <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"/>
107 <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"/>
108 <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"/>
109 <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"/>
110 <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"/>
111 <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"/>
112 <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"/>
113 <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"/>
114 <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"/>
115 <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"/>
116 <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"/>
117 <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"/>
118 <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"/>
119</svg>
1200
=== removed file 'data/demo/icons/firefox.png'
121Binary 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 differ1Binary 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
=== removed file 'data/demo/icons/gimp.png'
122Binary 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 differ2Binary 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
=== removed file 'data/demo/icons/libreoffice-startcenter.png'
123Binary 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 differ3Binary 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
=== removed file 'data/demo/icons/xchat-gnome.png'
124Binary 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 differ4Binary 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
=== removed file 'data/puritine-click.conf'
--- data/puritine-click.conf 2016-04-25 15:45:05 +0000
+++ data/puritine-click.conf 1970-01-01 00:00:00 +0000
@@ -1,39 +0,0 @@
1description "Puritine Click chroot linking"
2
3start on starting unity8
4
5script
6PACKAGE_PATH=`click pkgdir com.ubuntu.puritine`
7CONTAINER_NAME=puritine
8CHROOT_PATH=$PACKAGE_PATH/libertine-data/libertine-container/$CONTAINER_NAME
9
10if [ -x $CHROOT_PATH/rootfs ] ; then
11 # Link the chroot
12 if [ ! -L $HOME/.cache/libertine-container/$CONTAINER_NAME/rootfs ] ; then
13 mkdir -p $HOME/.cache/libertine-container/$CONTAINER_NAME/
14 ln -s $CHROOT_PATH/rootfs $HOME/.cache/libertine-container/$CONTAINER_NAME/rootfs
15 fi
16
17 # Copy or merge the container config files
18 if [ ! -e $HOME/.local/share/libertine/ContainersConfig.json ] ; then
19 mkdir -p $HOME/.local/share/libertine/
20 cp $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json $HOME/.local/share/libertine/ContainersConfig.json
21 elif [ -L $HOME/.local/share/libertine/ContainersConfig.json ] ; then
22 rm $HOME/.local/share/libertine/ContainersConfig.json
23 cp $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json $HOME/.local/share/libertine/ContainersConfig.json
24 else
25 libertine-container-manager merge-configs -f $PACKAGE_PATH/libertine-config/libertine/ContainersConfig.json
26 fi
27
28 # Create and copy the user-data dir from the click package
29 if [ ! -d $HOME/.local/share/libertine-container/user-data/$CONTAINER_NAME ] ; then
30 cp -dR $PACKAGE_PATH/libertine-config/libertine-container/ $HOME/.local/share/libertine-container/
31 fi
32else
33 rm -rf $HOME/.cache/libertine-container/$CONTAINER_NAME
34 if [ $(libertine-container-manager list | grep -v ${CONTAINER_NAME} | wc -l) -eq 0 ]; then
35 rm -rf $HOME/.local/share/libertine
36 fi
37 rm -rf $HOME/.local/share/libertine-container/user-data/$CONTAINER_NAME/.config/
38fi
39end script
400
=== modified file 'debian/changelog'
--- debian/changelog 2016-05-19 17:53:58 +0000
+++ debian/changelog 2016-06-07 12:41:22 +0000
@@ -1,3 +1,26 @@
1libertine (1.1-0ubuntu1) UNRELEASED; urgency=medium
2
3 [ Brandon Schaefer ]
4 * Set up a new proxy socket for the maliit server.
5
6 [ Chris Townsend ]
7 * Remove the demo icons and desktop files and deprecate libertine-demo.
8 (LP: #1575315)
9 * Explicitly create .config/dconf and the common XDG data directories in the
10 user container's mapped home directory in order to make sure the file
11 permissions are correct. (LP: #1570961) (LP: #1581131)
12 * Bump version to 1.1.
13
14 [ Larry Price ]
15 * Make it possible for the user to interact with debconf prompts from apt-get.
16 (LP: #1518814)
17 * Refactor ContainerManagerWorker to use the async QProcess API.
18 * Reap children processes when closing GUI and attempt to recover as necessary.
19 * Implement bash auto-completion for libertine-container-manager.
20 (LP: #1580610)
21
22 -- Chris Townsend <christopher.townsend@canonical.com> Mon, 06 Jun 2016 16:50:28 -0400
23
1libertine (1.0.4+16.10.20160519-0ubuntu1) yakkety; urgency=medium24libertine (1.0.4+16.10.20160519-0ubuntu1) yakkety; urgency=medium
225
3 [ Chris Townsend ]26 [ Chris Townsend ]
427
=== modified file 'debian/control'
--- debian/control 2016-04-28 22:06:04 +0000
+++ debian/control 2016-06-07 12:41:22 +0000
@@ -22,6 +22,7 @@
22 python3-psutil,22 python3-psutil,
23 python3-testtools,23 python3-testtools,
24 python3-xdg,24 python3-xdg,
25 python3-dbus,
25 qtdeclarative5-dev26 qtdeclarative5-dev
26Standards-Version: 3.9.627Standards-Version: 3.9.6
27Homepage: https://launchpad.net/libertine28Homepage: https://launchpad.net/libertine
@@ -32,6 +33,7 @@
32 python3-libertine-lxc,33 python3-libertine-lxc,
33 qml-module-qtquick2,34 qml-module-qtquick2,
34 qtdeclarative5-ubuntu-ui-toolkit-plugin,35 qtdeclarative5-ubuntu-ui-toolkit-plugin,
36 python3-dbus,
35 ${misc:Depends},37 ${misc:Depends},
36 ${shlibs:Depends}38 ${shlibs:Depends}
37Description: sandbox for running deb-packaged X11 apps on Ubuntu Personal39Description: sandbox for running deb-packaged X11 apps on Ubuntu Personal
@@ -48,6 +50,8 @@
48 ${misc:Depends},50 ${misc:Depends},
49 ${python3:Depends},51 ${python3:Depends},
50 ${shlibs:Depends}52 ${shlibs:Depends}
53Breaks: libertine-demo
54Replaces: libertine-demo
51Description: CLI tools for running deb-packaged X11 apps on Ubuntu Personal55Description: CLI tools for running deb-packaged X11 apps on Ubuntu Personal
52 Command-line tools that can be used for creating, manipulating, and using56 Command-line tools that can be used for creating, manipulating, and using
53 the Ubuntu Personal sandbox for legacy Deb-packaged X11 applicatons.57 the Ubuntu Personal sandbox for legacy Deb-packaged X11 applicatons.
@@ -131,14 +135,4 @@
131 This package provides the chroot-based container back end module for the135 This package provides the chroot-based container back end module for the
132 Libertine sandbox. This container back end module is intended only for136 Libertine sandbox. This container back end module is intended only for
133 curated containers distributed for devices that do not support unprivileged137 curated containers distributed for devices that do not support unprivileged
134 LXC contaiers.138 LXC containers.
135
136Package: libertine-demo
137Architecture: any
138Multi-Arch: allowed
139Depends: libertine-tools,
140 python3-libertine-chroot,
141 ${misc:Depends}
142Description: Adds desktop files and icon for Unity 8 desktop support
143 Add desktop files and icons for the targeted applications needed for legacy
144 X application support on Unity 8.
145139
=== removed file 'debian/libertine-demo.install'
--- debian/libertine-demo.install 2015-11-06 21:28:21 +0000
+++ debian/libertine-demo.install 1970-01-01 00:00:00 +0000
@@ -1,4 +0,0 @@
1data/demo/icons/* usr/share/libertine/demo/icons/
2usr/share/applications/demo/* usr/share/applications/
3usr/share/upstart/sessions/puritine-click.conf
4usr/share/click/frameworks/puritine-15.04.1.framework
50
=== removed file 'debian/libertine-demo.lintian-overrides'
--- debian/libertine-demo.lintian-overrides 2015-09-02 12:55:00 +0000
+++ debian/libertine-demo.lintian-overrides 1970-01-01 00:00:00 +0000
@@ -1,5 +0,0 @@
1libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_firefox_0.0.desktop bin/true
2libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_gedit_0.0.desktop bin/true
3libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_gimp_0.0.desktop bin/true
4libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_libreoffice-startcenter_0.0.desktop bin/true
5libertine-demo: desktop-command-not-in-package usr/share/applications/trusty_xchat-gnome_0.0.desktop bin/true
60
=== modified file 'debian/libertine-tools.install'
--- debian/libertine-tools.install 2016-05-02 20:45:21 +0000
+++ debian/libertine-tools.install 2016-06-07 12:41:22 +0000
@@ -3,8 +3,10 @@
3usr/bin/libertine-container-manager3usr/bin/libertine-container-manager
4usr/bin/libertine-lxc-manager4usr/bin/libertine-lxc-manager
5usr/bin/libertine-xmir5usr/bin/libertine-xmir
6etc/bash_completion.d/libertine-container-manager
6usr/lib/*/libertine/update-puritine-containers7usr/lib/*/libertine/update-puritine-containers
7usr/share/man8usr/share/man
8usr/share/libertine/libertine-lxc.conf9usr/share/libertine/libertine-lxc.conf
9usr/share/upstart/sessions/libertine-lxc-manager.conf10usr/share/upstart/sessions/libertine-lxc-manager.conf
10usr/share/upstart/sessions/libertine-xmir.conf11usr/share/upstart/sessions/libertine-xmir.conf
12usr/share/click/frameworks/puritine-15.04.1.framework
1113
=== modified file 'libertine/ContainerManager.cpp'
--- libertine/ContainerManager.cpp 2016-05-11 17:26:27 +0000
+++ libertine/ContainerManager.cpp 2016-06-07 12:41:22 +0000
@@ -18,7 +18,6 @@
18 */18 */
19#include "libertine/ContainerManager.h"19#include "libertine/ContainerManager.h"
2020
21#include <QtCore/QProcess>
2221
23namespace22namespace
24{23{
@@ -27,453 +26,245 @@
27static const QString PACKAGE_REMOVAL_FAILED = QObject::tr("Removal of package %1 failed");26static const QString PACKAGE_REMOVAL_FAILED = QObject::tr("Removal of package %1 failed");
28static const QString PACKAGE_SEARCH_FAILED = QObject::tr("Searching for query %1 failed");27static const QString PACKAGE_SEARCH_FAILED = QObject::tr("Searching for query %1 failed");
29static const QString CONTAINER_UPDATE_FAILED = QObject::tr("Updating container %1 failed");28static const QString CONTAINER_UPDATE_FAILED = QObject::tr("Updating container %1 failed");
29static const QString CONTAINER_CREATE_FAILED = QObject::tr("Creating container %1 failed");
30static const QString CONTAINER_DESTROY_FAILED = QObject::tr("Destroying container %1 failed");
30static const QString RUN_COMMAND_FAILED = QObject::tr("Running command %1 failed");31static const QString RUN_COMMAND_FAILED = QObject::tr("Running command %1 failed");
31static const QString CONTAINER_CONFIGURE_FAILED = QObject::tr("Attempt to configure container %1 failed");32static const QString CONTAINER_CONFIGURE_FAILED = QObject::tr("Attempt to configure container %1 failed");
33constexpr auto libertine_container_manager_tool = "libertine-container-manager";
34
3235
33static const QString readAllStdOutOrStdErr(QProcess& proc)36static const QString readAllStdOutOrStdErr(QProcess& proc)
34{37{
35 auto out = proc.readAllStandardOutput();38 auto out = proc.readAllStandardOutput();
36 return out.isEmpty() ? proc.readAllStandardError() : out;39 return out.isEmpty() ? proc.readAllStandardError() : out;
37}40}
38}41
39const QString ContainerManagerWorker::libertine_container_manager_tool = "libertine-container-manager";42
43static void pidKiller(const QString& pid, bool shouldKill = true)
44{
45 QProcess list_child_pids;
46 list_child_pids.start("pgrep", QStringList{"-P", pid});
47 list_child_pids.waitForFinished();
48 auto pids = QString::fromUtf8(list_child_pids.readAllStandardOutput()).split('\n', QString::SkipEmptyParts);
49 for (const auto& child: pids)
50 {
51 pidKiller(child);
52 }
53 if (shouldKill)
54 {
55 QProcess::execute("kill " + pid);
56 }
57}
58}
4059
4160
42ContainerManagerWorker::61ContainerManagerWorker::
43ContainerManagerWorker()62ContainerManagerWorker()
44{ }63{
4564 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &QObject::deleteLater);
4665}
47ContainerManagerWorker::
48ContainerManagerWorker(ContainerAction container_action,
49 QString const& container_id,
50 QString const& container_type)
51: container_action_(container_action)
52, container_id_(container_id)
53, container_type_(container_type)
54{ }
55
56
57ContainerManagerWorker::
58ContainerManagerWorker(ContainerAction container_action,
59 QString const& container_id,
60 QString const& container_type,
61 QString const& data)
62: container_action_(container_action)
63, container_id_(container_id)
64, container_type_(container_type)
65, data_(data)
66{ }
67
68
69ContainerManagerWorker::
70ContainerManagerWorker(ContainerAction container_action,
71 QString const& container_id,
72 QString const& container_type,
73 QStringList data_list)
74: container_action_(container_action)
75, container_id_(container_id)
76, container_type_(container_type)
77, data_list_(data_list)
78{ }
7966
8067
81ContainerManagerWorker::68ContainerManagerWorker::
82~ContainerManagerWorker()69~ContainerManagerWorker()
83{ }70{
8471 if (process_.state() == QProcess::Running)
8572 {
86ContainerManagerWorker::ContainerAction ContainerManagerWorker::73 pidKiller(QString::number(process_.pid()), false);
87container_action() const74 process_.close();
88{ return container_action_; }75 }
8976}
9077
91void ContainerManagerWorker::78
92container_action(ContainerAction container_action)79void ContainerManagerWorker::
93{80createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password)
94 container_action_ = container_action;81{
95}82 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
9683 [=](int exitCode, QProcess::ExitStatus){
9784 if (exitCode != 0)
98QString const& ContainerManagerWorker::85 {
99container_id() const86 emit error(CONTAINER_CREATE_FAILED.arg(id), process_.readAllStandardError());
100{ return container_id_; }87 }
10188 });
10289 connect(&process_, &QProcess::started, [=]() {
103void ContainerManagerWorker::90 process_.write(password.toUtf8());
104container_id(QString const& container_id)91 process_.closeWriteChannel();
105{92 });
106 container_id_ = container_id;93
107}94 QStringList args{"create", "-i", id, "-d", distro, "-n", name};
10895 if (multiarch)
109
110QString const& ContainerManagerWorker::
111container_type() const
112{ return container_type_; }
113
114
115void ContainerManagerWorker::
116container_type(QString const& container_type)
117{
118 container_type_ = container_type;
119}
120
121
122QString const& ContainerManagerWorker::
123container_distro() const
124{ return container_distro_; }
125
126
127void ContainerManagerWorker::
128container_distro(QString const& container_distro)
129{
130 if (container_distro != container_distro_)
131 {
132 container_distro_ = container_distro;
133 }
134}
135
136
137QString const& ContainerManagerWorker::
138container_name() const
139{ return container_name_; }
140
141
142void ContainerManagerWorker::
143container_name(QString const& container_name)
144{
145 if (container_name != container_name_)
146 {
147 container_name_ = container_name;
148 }
149}
150
151
152bool ContainerManagerWorker::
153container_multiarch()
154{ return container_multiarch_; }
155
156
157void ContainerManagerWorker::
158container_multiarch(bool container_multiarch)
159{
160 if (container_multiarch != container_multiarch_)
161 {
162 container_multiarch_ = container_multiarch;
163 }
164}
165
166
167QString const& ContainerManagerWorker::
168data() const
169{ return data_; }
170
171
172void ContainerManagerWorker::
173data(QString const& data)
174{
175 data_ = data;
176}
177
178
179QStringList ContainerManagerWorker::
180data_list()
181{ return data_list_; }
182
183
184void ContainerManagerWorker::
185data_list(QStringList data_list)
186{
187 data_list_ = data_list;
188}
189
190
191void ContainerManagerWorker::
192run()
193{
194 switch(container_action_)
195 {
196 case ContainerAction::Create:
197 createContainer(data_);
198 break;
199
200 case ContainerAction::Destroy:
201 destroyContainer();
202 break;
203
204 case ContainerAction::Install:
205 installPackage(data_);
206 break;
207
208 case ContainerAction::Remove:
209 removePackage(data_);
210 break;
211
212 case ContainerAction::Search:
213 searchPackageCache(data_);
214 break;
215
216 case ContainerAction::Update:
217 updateContainer();
218 break;
219
220 case ContainerAction::Exec:
221 runCommand(data_);
222 break;
223
224 case ContainerAction::Configure:
225 configureContainer(data_list_);
226 break;
227
228 default:
229 break;
230 }
231}
232
233
234void ContainerManagerWorker::
235createContainer(QString const& password)
236{
237 QProcess libertine_cli_tool;
238 QString exec_line = libertine_container_manager_tool;
239 QStringList args;
240
241 args << "create" << "-i" << container_id_ << "-d" << container_distro_ << "-n" << container_name_;
242
243 if (container_multiarch_)
244 {96 {
245 args << "-m";97 args << "-m";
246 }98 }
24799 process_.start(libertine_container_manager_tool, args);
248 libertine_cli_tool.start(exec_line, args);100}
249101
250 if (!libertine_cli_tool.waitForStarted())102
251 {103void ContainerManagerWorker::
252 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());104destroyContainer(const QString& id)
253 quit();105{
254 return;106 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
255 }107 [=](int exitCode, QProcess::ExitStatus){
256108 if (exitCode != 0)
257 libertine_cli_tool.write(password.toStdString().c_str());109 {
258 libertine_cli_tool.closeWriteChannel();110 emit error(CONTAINER_DESTROY_FAILED.arg(id), process_.readAllStandardError());
259111 }
260 libertine_cli_tool.waitForFinished(-1);112 emit finishedDestroy(id);
261113 });
262 quit();114
263}115 process_.start(libertine_container_manager_tool, QStringList{"destroy", "-i", id});
264116}
265117
266void ContainerManagerWorker::118
267destroyContainer()119void ContainerManagerWorker::
268{120packageOperationInteraction(const QString& input)
269 QProcess libertine_cli_tool;121{
270 QString exec_line = libertine_container_manager_tool;122 if (process_.state() == QProcess::Running)
271 QStringList args;123 {
272124 process_.write(input.toUtf8() + "\n");
273 args << "destroy" << "-i" << container_id_;125 }
274 libertine_cli_tool.start(exec_line, args);126}
275127
276 if (!libertine_cli_tool.waitForStarted())128
277 {129void ContainerManagerWorker::
278 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());130installPackage(const QString& container_id, const QString& package_name)
279 quit();131{
280 return;132 connect(&process_, &QProcess::readyRead, [=](){
281 }133 auto output = process_.readAllStandardOutput();
282134 if (!output.isEmpty())
283 libertine_cli_tool.waitForFinished(-1);135 {
284136 emit updatePackageOperationDetails(container_id, package_name, output);
285 emit finishedDestroy(container_id_);137 process_output_ += output;
286 quit();138 }
287}139 });
288140 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
289141 [=](int exitCode, QProcess::ExitStatus){
290void ContainerManagerWorker::142 if (exitCode != 0)
291installPackage(QString const& package_name)143 {
292{144 auto stderr = process_.readAllStandardError();
293 QProcess libertine_cli_tool;145 emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), stderr.isEmpty() ? process_output_ : stderr);
294 QString exec_line = libertine_container_manager_tool;146 }
295 QStringList args;147 emit packageOperationFinished(container_id, package_name);
296148 });
297 args << "install-package" << "-i" << container_id_ << "-p" << package_name;149
298150 process_.start(libertine_container_manager_tool, QStringList{"install-package", "-i", container_id, "-p", package_name, "-r"});
299 libertine_cli_tool.start(exec_line, args);151}
300152
301 if (!libertine_cli_tool.waitForStarted())153
302 {154void ContainerManagerWorker::
303 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());155removePackage(const QString& container_id, const QString& package_name)
304 quit();156{
305 return;157 connect(&process_, &QProcess::readyRead, [=](){
306 }158 auto output = process_.readAllStandardOutput();
307 libertine_cli_tool.waitForFinished(-1);159 if (!output.isEmpty())
308 if (libertine_cli_tool.exitCode() != 0)160 {
309 {161 emit updatePackageOperationDetails(container_id, package_name, output);
310 emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), libertine_cli_tool.readAllStandardError());162 process_output_ += output;
311 }163 }
312 quit();164 });
313}165 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
314166 [=](int exitCode, QProcess::ExitStatus){
315167 if (exitCode != 0)
316void ContainerManagerWorker::168 {
317removePackage(QString const& package_name)169 emit error(PACKAGE_INSTALLATION_FAILED.arg(package_name), process_output_.isEmpty() ? process_.readAllStandardError() : process_output_);
318{170 }
319 QProcess libertine_cli_tool;171 });
320 QString exec_line = libertine_container_manager_tool;172
321 QStringList args;173 process_.start(libertine_container_manager_tool, QStringList{"remove-package", "-i", container_id, "-p", package_name, "-r"});
322174}
323 args << "remove-package" << "-i" << container_id_ << "-p" << package_name;175
324 libertine_cli_tool.start(exec_line, args);176
325177void ContainerManagerWorker::
326 if (!libertine_cli_tool.waitForStarted())178searchPackageCache(const QString& container_id, const QString& search_string)
327 {179{
328 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAllStandardError());180 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
329 quit();181 [=](int exitCode, QProcess::ExitStatus){
330 return;182 QList<QString> packageList;
331 }183 if (exitCode != 0)
332184 {
333 libertine_cli_tool.waitForFinished(-1);185 QString err(process_.readAllStandardError());
334 if (libertine_cli_tool.exitCode() != 0)186 if (!err.isEmpty())
335 {187 {
336 emit error(PACKAGE_REMOVAL_FAILED.arg(package_name), readAllStdOutOrStdErr(libertine_cli_tool));188 emit error(PACKAGE_SEARCH_FAILED.arg(search_string), err);
337 quit();189 }
338 return;190 // if there is no error message, there probably were no packages found
339 }191 // continue to return an empty list
340 quit();192 }
341}193 else
342194 {
343195 auto search_output = process_.readAllStandardOutput();
344void ContainerManagerWorker::196 QList<QByteArray> packages = search_output.split('\n');
345searchPackageCache(QString const& search_string)197
346{198 for (const auto& package: packages)
347 QProcess libertine_cli_tool;199 {
348 QString exec_line = libertine_container_manager_tool;200 packageList.append(QString(package));
349 QStringList args;201 }
350 QByteArray search_output;202 }
351 QList<QString> packageList;203
352204 emit finishedSearch(packageList);
353 args << "search-cache" << "-i" << container_id_ << "-s" << search_string;205 });
354 libertine_cli_tool.start(exec_line, args);206
355207 process_.start(libertine_container_manager_tool, QStringList{"search-cache", "-i", container_id, "-s", search_string});
356 if (!libertine_cli_tool.waitForStarted())208}
357 {209
358 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());210
359 quit();211void ContainerManagerWorker::
360 return;212updateContainer(const QString& container_id, const QString& container_name)
361 }213{
362214 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
363 libertine_cli_tool.waitForFinished(-1);215 [=](int exitCode, QProcess::ExitStatus){
364 if (libertine_cli_tool.exitCode() != 0)216 if (exitCode != 0)
365 {217 {
366 QString err(libertine_cli_tool.readAllStandardError());218 emit error(CONTAINER_UPDATE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
367 if (!err.isEmpty())219 }
368 {220 });
369 emit error(PACKAGE_SEARCH_FAILED.arg(search_string), err);221
370 quit();222 process_.start(libertine_container_manager_tool, QStringList{"update", "-i", container_id});
371 return;223}
372 }224
373 // if there is no error message, there probably were no packages found225
374 // continue to return an empty list226void ContainerManagerWorker::
375 }227runCommand(const QString& container_id, const QString& container_name, const QString& command_line)
376 else228{
377 {229 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
378 search_output = libertine_cli_tool.readAllStandardOutput();230 [=](int exitCode, QProcess::ExitStatus){
379 QList<QByteArray> packages = search_output.split('\n');231 if (exitCode != 0)
380232 {
381 for (const auto& package: packages)233 emit error(RUN_COMMAND_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
382 {234 }
383 packageList.append(QString(package));235 else
384 }236 {
385 }237 emit finishedCommand(process_.readAllStandardOutput());
386238 }
387 emit finishedSearch(packageList);239 });
388 quit();240
389}241 process_.start(libertine_container_manager_tool, QStringList{"exec", "-i", container_id, "-c", command_line});
390242}
391243
392void ContainerManagerWorker::244
393updateContainer()245void ContainerManagerWorker::
394{246configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command)
395 QProcess libertine_cli_tool;247{
396 QString exec_line = libertine_container_manager_tool;248 connect(&process_, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
397 QStringList args;249 [=](int exitCode, QProcess::ExitStatus){
398250 if (exitCode != 0)
399 args << "update" << "-i" << container_id_;251 {
400252 emit error(CONTAINER_CONFIGURE_FAILED.arg(container_name), readAllStdOutOrStdErr(process_));
401 libertine_cli_tool.start(exec_line, args);253 }
402254 else
403 if (!libertine_cli_tool.waitForStarted())255 {
404 {256 emit finishedConfigure();
405 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());257 }
406 quit();258 });
407 return;259
408 }260 QStringList args{"configure", "-i", container_id};
409261 args << configure_command.at(0) << configure_command.mid(1);
410 libertine_cli_tool.waitForFinished(-1);262 process_.start(libertine_container_manager_tool, args);
411 if (libertine_cli_tool.exitCode() != 0)263}
412 {264
413 emit error(CONTAINER_UPDATE_FAILED.arg(container_name_), readAllStdOutOrStdErr(libertine_cli_tool));265
414 quit();266void ContainerManagerWorker::
415 return;267fixIntegrity()
416 }268{
417269 process_.start(libertine_container_manager_tool, QStringList{"fix-integrity"});
418 quit();
419}
420
421
422void ContainerManagerWorker::
423runCommand(QString const& command_line)
424{
425 QProcess libertine_cli_tool;
426 QString exec_line = libertine_container_manager_tool, command_output, error_msg;
427 QStringList args;
428
429 args << "exec" << "-i" << container_id_ << "-c" << command_line;
430
431 libertine_cli_tool.start(exec_line, args);
432
433 if (!libertine_cli_tool.waitForStarted())
434 {
435 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
436 quit();
437 return;
438 }
439 libertine_cli_tool.waitForFinished(-1);
440 if (libertine_cli_tool.exitCode() != 0)
441 {
442 emit error(RUN_COMMAND_FAILED.arg(command_line), readAllStdOutOrStdErr(libertine_cli_tool));
443 quit();
444 return;
445 }
446
447 emit finishedCommand(libertine_cli_tool.readAllStandardOutput());
448 quit();
449}
450
451
452void ContainerManagerWorker::
453configureContainer(QStringList configure_command)
454{
455 QProcess libertine_cli_tool;
456 QString exec_line = libertine_container_manager_tool;
457 QStringList args;
458
459 args << "configure" << "-i" << container_id_ << configure_command.at(0) << configure_command.mid(1);
460
461 libertine_cli_tool.start(exec_line, args);
462
463 if (!libertine_cli_tool.waitForStarted())
464 {
465 emit error(FAILED_TO_START.arg(libertine_container_manager_tool), libertine_cli_tool.readAll());
466 quit();
467 return;
468 }
469
470 libertine_cli_tool.waitForFinished(-1);
471
472 if (libertine_cli_tool.exitCode() != 0)
473 {
474 error(CONTAINER_CONFIGURE_FAILED.arg(container_name_), readAllStdOutOrStdErr(libertine_cli_tool));
475 }
476
477 emit finishedConfigure();
478 quit();
479}270}
480271
=== modified file 'libertine/ContainerManager.h'
--- libertine/ContainerManager.h 2016-05-04 19:41:25 +0000
+++ libertine/ContainerManager.h 2016-06-07 12:41:22 +0000
@@ -23,122 +23,33 @@
23#include <QtCore/QString>23#include <QtCore/QString>
24#include <QtCore/QStringList>24#include <QtCore/QStringList>
25#include <QtCore/QThread>25#include <QtCore/QThread>
26#include <QtCore/QProcess>
2627
27class ContainerManagerWorker28class ContainerManagerWorker
28: public QThread29: public QObject
29{30{
30 Q_OBJECT31 Q_OBJECT
31 Q_ENUMS(ContainerAction)32
32 Q_PROPERTY(ContainerAction containerAction READ container_action WRITE container_action NOTIFY containerActionChanged)33public:
33 Q_PROPERTY(QString containerId READ container_id WRITE container_id NOTIFY containerIdChanged)34 explicit ContainerManagerWorker();
34 Q_PROPERTY(QString containerType READ container_type WRITE container_type NOTIFY containerTypeChanged)35 virtual ~ContainerManagerWorker();
35 Q_PROPERTY(QString containerDistro READ container_distro WRITE container_distro NOTIFY containerDistroChanged)36
36 Q_PROPERTY(QString containerName READ container_name WRITE container_name NOTIFY containerNameChanged)37 Q_INVOKABLE void createContainer(const QString& id, const QString& name, const QString& distro, bool multiarch, const QString& password);
37 Q_PROPERTY(bool containerMultiarch READ container_multiarch WRITE container_multiarch)38 Q_INVOKABLE void destroyContainer(const QString& id);
38 Q_PROPERTY(QString data READ data WRITE data NOTIFY dataChanged)39 Q_INVOKABLE void installPackage(const QString& id, const QString& package_name);
39 Q_PROPERTY(QStringList data_list READ data_list WRITE data_list NOTIFY dataListChanged) 40 Q_INVOKABLE void removePackage(const QString& container_id, const QString& package_name);
4041 Q_INVOKABLE void searchPackageCache(const QString& container_id, const QString& search_string);
41public:42 Q_INVOKABLE void updateContainer(const QString& container_id, const QString& container_name);
42 static const QString libertine_container_manager_tool;43 Q_INVOKABLE void runCommand(const QString& container_id, const QString& container_name, const QString& command_line);
4344 Q_INVOKABLE void configureContainer(const QString& container_id, const QString& container_name, const QStringList& configure_command);
44 enum class ContainerAction45 Q_INVOKABLE void fixIntegrity();
45 : int46
46 {47public slots:
47 Create,48 void packageOperationInteraction(const QString& input);
48 Destroy,49
49 Install,50private:
50 Remove,51 QProcess process_;
51 Search,52 QString process_output_;
52 Update,
53 Exec,
54 Configure
55 };
56
57public:
58 ContainerManagerWorker();
59 ContainerManagerWorker(ContainerAction container_action,
60 QString const& container_id,
61 QString const& container_type);
62 ContainerManagerWorker(ContainerAction container_action,
63 QString const& container_id,
64 QString const& container_type,
65 QString const& data);
66 ContainerManagerWorker(ContainerAction container_action,
67 QString const& container_id,
68 QString const& container_type,
69 QStringList data_list);
70 ~ContainerManagerWorker();
71
72 ContainerAction
73 container_action() const;
74
75 void
76 container_action(ContainerAction container_action);
77
78 QString const&
79 container_id() const;
80
81 void
82 container_id(QString const& container_id);
83
84 QString const&
85 container_type() const;
86
87 void
88 container_type(QString const& container_type);
89
90 QString const&
91 container_distro() const;
92
93 void
94 container_distro(QString const& container_distro);
95
96 QString const&
97 container_name() const;
98
99 void
100 container_name(QString const& container_name);
101
102 bool
103 container_multiarch();
104
105 void
106 container_multiarch(bool container_multiarch);
107
108 QString const&
109 data() const;
110
111 void
112 data(QString const& data);
113
114 QStringList
115 data_list();
116
117 void
118 data_list(QStringList data_list);
119
120protected:
121 void run() Q_DECL_OVERRIDE;
122
123private:
124 void createContainer(QString const& password);
125 void destroyContainer();
126 void installPackage(QString const& package_name);
127 void removePackage(QString const& package_name);
128 void searchPackageCache(QString const& search_string);
129 void updateContainer();
130 void runCommand(QString const& command_line);
131 void configureContainer(QStringList configure_command);
132
133private:
134 ContainerAction container_action_;
135 QString container_id_;
136 QString container_type_;
137 QString container_distro_;
138 QString container_name_;
139 bool container_multiarch_;
140 QString data_;
141 QStringList data_list_;
14253
143signals:54signals:
144 void containerActionChanged();55 void containerActionChanged();
@@ -154,6 +65,8 @@
154 void finishedSearch(QList<QString> packageList);65 void finishedSearch(QList<QString> packageList);
155 void finishedCommand(QString const& command_output);66 void finishedCommand(QString const& command_output);
156 void finishedConfigure();67 void finishedConfigure();
68 void updatePackageOperationDetails(const QString& container_id, const QString& package_name, const QString& details);
69 void packageOperationFinished(const QString& container_id, const QString& package_name);
15770
158 void error(const QString& short_description, const QString& details);71 void error(const QString& short_description, const QString& details);
159};72};
16073
=== modified file 'libertine/qml/ContainerPasswordDialog.qml'
--- libertine/qml/ContainerPasswordDialog.qml 2016-05-06 21:13:01 +0000
+++ libertine/qml/ContainerPasswordDialog.qml 2016-06-07 12:41:22 +0000
@@ -86,14 +86,8 @@
86 function passwordAccepted(password) {86 function passwordAccepted(password) {
87 var container_id = containerConfigList.addNewContainer("lxc", containerName)87 var container_id = containerConfigList.addNewContainer("lxc", containerName)
88 var comp = Qt.createComponent("ContainerManager.qml")88 var comp = Qt.createComponent("ContainerManager.qml")
89 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Create,89 var worker = comp.createObject(mainView)
90 "containerId": container_id,90 worker.createContainer(container_id, containerConfigList.getContainerName(container_id),
91 "containerType": null,91 containerConfigList.getContainerDistro(container_id), enableMultiarch, password)
92 "data": password})
93 worker.containerDistro = containerConfigList.getContainerDistro(container_id)
94 worker.containerName = containerConfigList.getContainerName(container_id)
95 worker.containerMultiarch = enableMultiarch
96 mainView.currentContainer = container_id
97 worker.start()
98 }92 }
99}93}
10094
=== modified file 'libertine/qml/ContainersView.qml'
--- libertine/qml/ContainersView.qml 2016-05-10 18:55:24 +0000
+++ libertine/qml/ContainersView.qml 2016-06-07 12:41:22 +0000
@@ -59,7 +59,7 @@
59 function edit(containerId) {59 function edit(containerId) {
60 mainView.currentContainer = containerId60 mainView.currentContainer = containerId
61 containerAppsList.setContainerApps(mainView.currentContainer)61 containerAppsList.setContainerApps(mainView.currentContainer)
62 pageStack.push(Qt.resolvedUrl("HomeView.qml"))62 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})
63 }63 }
6464
65 delegate: ListItem {65 delegate: ListItem {
@@ -93,10 +93,8 @@
93 description: i18n.tr("Delete Container")93 description: i18n.tr("Delete Container")
94 onTriggered: {94 onTriggered: {
95 var comp = Qt.createComponent("ContainerManager.qml")95 var comp = Qt.createComponent("ContainerManager.qml")
96 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Destroy,96 var worker = comp.createObject(mainView)
97 "containerId": containerId,97 worker.destroyContainer(containerId)
98 "containerType": containerConfigList.getContainerType(containerId)})
99 worker.start()
100 mainView.currentContainer = containerId98 mainView.currentContainer = containerId
101 }99 }
102 }100 }
103101
=== modified file 'libertine/qml/ExtraArchivesView.qml'
--- libertine/qml/ExtraArchivesView.qml 2016-05-09 20:27:38 +0000
+++ libertine/qml/ExtraArchivesView.qml 2016-06-07 12:41:22 +0000
@@ -127,26 +127,20 @@
127127
128 function addArchive(archive) {128 function addArchive(archive) {
129 var comp = Qt.createComponent("ContainerManager.qml")129 var comp = Qt.createComponent("ContainerManager.qml")
130 worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,130 worker = comp.createObject(mainView)
131 "containerId": mainView.currentContainer,
132 "containerType": containerConfigList.getContainerType(mainView.currentContainer),
133 "data_list": ["--add-archive", archive]})
134 worker.finishedConfigure.connect(finishedConfigure)131 worker.finishedConfigure.connect(finishedConfigure)
135 worker.error.connect(sendAddError)132 worker.error.connect(sendAddError)
136 error.connect(mainView.error)133 error.connect(mainView.error)
137 worker.start()134 worker.configureContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer), ["--add-archive", archive])
138 }135 }
139136
140 function deleteArchive(archive) {137 function deleteArchive(archive) {
141 var comp = Qt.createComponent("ContainerManager.qml")138 var comp = Qt.createComponent("ContainerManager.qml")
142 worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,139 worker = comp.createObject(mainView)
143 "containerId": mainView.currentContainer,
144 "containerType": containerConfigList.getContainerType(mainView.currentContainer),
145 "data_list": ["--delete-archive", archive]})
146 worker.finishedConfigure.connect(finishedConfigure)140 worker.finishedConfigure.connect(finishedConfigure)
147 worker.error.connect(sendDeleteError)141 worker.error.connect(sendDeleteError)
148 error.connect(mainView.error)142 error.connect(mainView.error)
149 worker.start()143 worker.configureContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer), ["--delete-archive", archive])
150 }144 }
151145
152 Component.onCompleted: {146 Component.onCompleted: {
153147
=== modified file 'libertine/qml/HomeView.qml'
--- libertine/qml/HomeView.qml 2016-05-10 18:55:24 +0000
+++ libertine/qml/HomeView.qml 2016-06-07 12:41:22 +0000
@@ -26,7 +26,7 @@
26 id: homeView26 id: homeView
27 header: PageHeader {27 header: PageHeader {
28 id: pageHeader28 id: pageHeader
29 title: i18n.tr("Classic Apps - %1").arg(containerConfigList.getContainerName(mainView.currentContainer))29 title: i18n.tr("Classic Apps - %1").arg(containerConfigList.getContainerName(currentContainer))
30 trailingActionBar.actions: [30 trailingActionBar.actions: [
31 Action {31 Action {
32 id: settingsButton32 id: settingsButton
@@ -39,6 +39,7 @@
39 }39 }
40 ]40 ]
41 }41 }
42 property var currentContainer: null
4243
43 Component {44 Component {
44 id: enterPackagePopup45 id: enterPackagePopup
@@ -69,9 +70,8 @@
69 width: (parent.width - parent.spacing) / 270 width: (parent.width - parent.spacing) / 2
70 onClicked: {71 onClicked: {
71 if (enterPackageInput.text != "") {72 if (enterPackageInput.text != "") {
72 if (!containerConfigList.isAppInstalled(mainView.currentContainer, enterPackageInput.text)) {73 if (!containerConfigList.isAppInstalled(currentContainer, enterPackageInput.text)) {
73 installPackage(enterPackageInput.text)74 installPackage(enterPackageInput.text)
74 mainView.currentPackage = enterPackageInput.text
75 PopupUtils.close(enterPackageDialog)75 PopupUtils.close(enterPackageDialog)
76 }76 }
77 else {77 else {
@@ -97,30 +97,30 @@
97 }97 }
9898
99 Component {99 Component {
100 id: settingsMenu100 id: settingsMenu
101 ActionSelectionPopover {101 ActionSelectionPopover {
102 actions: ActionList {102 actions: ActionList {
103 Action {103 Action {
104 text: i18n.tr("Manage Container")104 text: i18n.tr("Manage Container")
105 onTriggered: {105 onTriggered: {
106 pageStack.push(Qt.resolvedUrl("ManageContainer.qml"))106 pageStack.push(Qt.resolvedUrl("ManageContainer.qml"))
107 }107 }
108 }108 }
109 Action {109 Action {
110 text: i18n.tr("Container Information")110 text: i18n.tr("Container Information")
111 onTriggered: {111 onTriggered: {
112 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"))112 pageStack.push(Qt.resolvedUrl("ContainerInfoView.qml"))
113 }113 }
114 }114 }
115 Action {115 Action {
116 text: i18n.tr("Switch Container")116 text: i18n.tr("Switch Container")
117 onTriggered: {117 onTriggered: {
118 pageStack.pop()118 pageStack.pop()
119 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))119 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))
120 }120 }
121 }121 }
122 }122 }
123 }123 }
124 }124 }
125125
126 Component {126 Component {
@@ -160,7 +160,7 @@
160 }160 }
161161
162 function reloadAppList() {162 function reloadAppList() {
163 containerAppsList.setContainerApps(mainView.currentContainer)163 containerAppsList.setContainerApps(currentContainer)
164164
165 appsList.visible = !containerAppsList.empty() ? true : false165 appsList.visible = !containerAppsList.empty() ? true : false
166 }166 }
@@ -175,8 +175,7 @@
175 visible: !containerAppsList.empty() ? true : false175 visible: !containerAppsList.empty() ? true : false
176176
177 function info(packageName) {177 function info(packageName) {
178 mainView.currentPackage = packageName178 pageStack.push(Qt.resolvedUrl("PackageInfoView.qml"), {"currentPackage": packageName, "currentContainer": currentContainer})
179 pageStack.push(Qt.resolvedUrl("PackageInfoView.qml"))
180 }179 }
181180
182 delegate: ListItem {181 delegate: ListItem {
@@ -211,7 +210,6 @@
211 text: i18n.tr("delete")210 text: i18n.tr("delete")
212 description: i18n.tr("Remove Package")211 description: i18n.tr("Remove Package")
213 onTriggered: {212 onTriggered: {
214 mainView.currentPackage = packageName
215 removePackage(packageName)213 removePackage(packageName)
216 }214 }
217 }215 }
@@ -242,23 +240,21 @@
242 text: i18n.tr("No packages are installed")240 text: i18n.tr("No packages are installed")
243 }241 }
244242
245 function installPackage(package_name) {243 function operationSetup() {
246 var comp = Qt.createComponent("ContainerManager.qml")244 var comp = Qt.createComponent("ContainerManager.qml")
247 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Install,245 var worker = comp.createObject(mainView)
248 "containerId": mainView.currentContainer,
249 "containerType": containerConfigList.getContainerType(mainView.currentContainer),
250 "data": package_name})
251 worker.error.connect(mainView.error)246 worker.error.connect(mainView.error)
252 worker.start()247 worker.updatePackageOperationDetails.connect(mainView.updatePackageOperationDetails)
248 mainView.packageOperationInteraction.connect(worker.packageOperationInteraction)
249 worker.packageOperationFinished.connect(mainView.resetPackageDetails)
250 return worker
251 }
252
253 function installPackage(packageName) {
254 operationSetup().installPackage(currentContainer, packageName)
253 }255 }
254256
255 function removePackage(packageName) {257 function removePackage(packageName) {
256 var comp = Qt.createComponent("ContainerManager.qml")258 operationSetup().removePackage(currentContainer, packageName)
257 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Remove,
258 "containerId": mainView.currentContainer,
259 "containerType": containerConfigList.getContainerType(mainView.currentContainer),
260 "data": packageName})
261 worker.error.connect(mainView.error)
262 worker.start()
263 }259 }
264}260}
265261
=== modified file 'libertine/qml/ManageContainer.qml'
--- libertine/qml/ManageContainer.qml 2016-05-09 20:27:38 +0000
+++ libertine/qml/ManageContainer.qml 2016-06-07 12:41:22 +0000
@@ -49,18 +49,14 @@
49 onClicked: {49 onClicked: {
50 var comp = Qt.createComponent("ContainerManager.qml")50 var comp = Qt.createComponent("ContainerManager.qml")
51 if (checked) {51 if (checked) {
52 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,52 comp.createObject(mainView).configureContainer(mainView.currentContainer,
53 "containerId": mainView.currentContainer,53 containerConfigList.getContainerName(mainView.currentContainer),
54 "containerType": containerConfigList.getContainerType(mainView.currentContainer),54 ["--multiarch", "enable"])
55 "data_list": ["--multiarch", "enable"]})
56 worker.start()
57 }55 }
58 else {56 else {
59 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Configure,57 comp.createObject(mainView).configureContainer(mainView.currentContainer,
60 "containerId": mainView.currentContainer,58 containerConfigList.getContainerName(mainView.currentContainer),
61 "containerType": containerConfigList.getContainerType(mainView.currentContainer),59 ["--multiarch", "disable"])
62 "data_list": ["--multiarch", "disable"]})
63 worker.start()
64 }60 }
65 }61 }
66 }62 }
@@ -110,11 +106,9 @@
110106
111 function updateContainer() {107 function updateContainer() {
112 var comp = Qt.createComponent("ContainerManager.qml")108 var comp = Qt.createComponent("ContainerManager.qml")
113 var worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Update,109 var worker = comp.createObject(mainView)
114 "containerId": mainView.currentContainer,
115 "containerType": containerConfigList.getContainerType(mainView.currentContainer)})
116 worker.error.connect(mainView.error);110 worker.error.connect(mainView.error);
117 worker.start()111 worker.updateContainer(mainView.currentContainer, containerConfigList.getContainerName(mainView.currentContainer))
118 }112 }
119113
120 function updateStatus() {114 function updateStatus() {
121115
=== modified file 'libertine/qml/PackageInfoView.qml'
--- libertine/qml/PackageInfoView.qml 2016-05-09 20:27:38 +0000
+++ libertine/qml/PackageInfoView.qml 2016-06-07 12:41:22 +0000
@@ -27,14 +27,17 @@
27 id: packageInfoView27 id: packageInfoView
28 header: PageHeader {28 header: PageHeader {
29 id: pageHeader29 id: pageHeader
30 title: i18n.tr("Information for the %1 package").arg(mainView.currentPackage)30 title: i18n.tr("Information for the %1 package").arg(currentPackage)
31 }31 }
32 property string currentContainer: mainView.currentContainer32 property string currentContainer: null
33 property var currentPackage: mainView.currentPackage33 property var currentPackage: null
34 property var statusText: containerConfigList.getAppStatus(currentContainer, currentPackage)34 property var statusText: containerConfigList.getAppStatus(currentContainer, currentPackage)
35 property var packageVersionText: i18n.tr("Obtaining package version…")35 property var packageVersionText: i18n.tr("Obtaining package version…")
36 property string packageOperationDetails: ""
36 property var worker: null37 property var worker: null
3738
39 signal sendOperationInteraction(string text)
40
3841
39 Flickable {42 Flickable {
40 anchors {43 anchors {
@@ -52,6 +55,7 @@
52 anchors.right: parent.right55 anchors.right: parent.right
5356
54 ListItem.Standard {57 ListItem.Standard {
58 id: packageListItem
55 text: i18n.tr("Package version")59 text: i18n.tr("Package version")
56 control: Label {60 control: Label {
57 text: packageVersionText61 text: packageVersionText
@@ -59,11 +63,33 @@
59 }63 }
6064
61 ListItem.Standard {65 ListItem.Standard {
66 id: statusListItem
62 text: i18n.tr("Install status")67 text: i18n.tr("Install status")
63 control: Label {68 control: Label {
64 text: statusText69 text: statusText
65 }70 }
66 }71 }
72
73 TextArea {
74 id: packageDetailsView
75 visible: text !== ""
76 anchors.left: parent.left
77 anchors.right: parent.right
78 height: Math.max(packageInfoView.height - pageHeader.height - packageListItem.height - statusListItem.height - 35, units.gu(35))
79 readOnly: true
80 text: packageOperationDetails
81 }
82
83 TextField {
84 visible: packageDetailsView.visible && (statusText === "installing" || statusText === "removing")
85 anchors.left: parent.left
86 anchors.right: parent.right
87 text: ""
88 onAccepted: {
89 sendOperationInteraction(text)
90 text = ""
91 }
92 }
67 }93 }
68 }94 }
6995
@@ -71,21 +97,31 @@
71 containerConfigList.configChanged.connect(reloadStatus)97 containerConfigList.configChanged.connect(reloadStatus)
72 var command = "apt-cache policy " + currentPackage98 var command = "apt-cache policy " + currentPackage
73 var comp = Qt.createComponent("ContainerManager.qml")99 var comp = Qt.createComponent("ContainerManager.qml")
74 worker = comp.createObject(mainView, {"containerAction": ContainerManagerWorker.Exec,100 worker = comp.createObject(mainView)
75 "containerId": mainView.currentContainer,
76 "containerType": containerConfigList.getContainerType(mainView.currentContainer),
77 "data": command })
78 worker.finishedCommand.connect(getPackageVersion)101 worker.finishedCommand.connect(getPackageVersion)
102
103 packageOperationDetails = mainView.getPackageOperationDetails(currentContainer, currentPackage)
104 packageDetailsView.cursorPosition = packageDetailsView.length
105
106 mainView.updatePackageDetails.connect(updatePackageDetails)
107 sendOperationInteraction.connect(mainView.packageOperationInteraction)
108
79 worker.error.connect(mainView.error)109 worker.error.connect(mainView.error)
80 worker.error.connect(onError)110 worker.error.connect(onError)
81 worker.start()111 worker.runCommand(currentContainer, containerConfigList.getContainerName(currentContainer), command)
82 }112 }
83113
84 Component.onDestruction: {114 Component.onDestruction: {
85 containerConfigList.configChanged.disconnect(reloadStatus)115 containerConfigList.configChanged.disconnect(reloadStatus)
86 worker.finishedCommand.disconnect(getPackageVersion)116 mainView.updatePackageDetails.disconnect(updatePackageDetails)
87 worker.error.disconnect(mainView.error)117 sendOperationInteraction.disconnect(mainView.packageOperationInteraction)
88 worker.error.disconnect(onError)118 }
119
120 function updatePackageDetails(container_id, package_name, details) {
121 if (container_id === currentContainer && package_name === currentPackage) {
122 packageOperationDetails += details
123 packageDetailsView.cursorPosition = packageDetailsView.length
124 }
89 }125 }
90126
91 function reloadStatus() {127 function reloadStatus() {
92128
=== modified file 'libertine/qml/SearchResultsView.qml'
--- libertine/qml/SearchResultsView.qml 2016-05-09 20:27:38 +0000
+++ libertine/qml/SearchResultsView.qml 2016-06-07 12:41:22 +0000
@@ -120,12 +120,9 @@
120120
121 var comp = Qt.createComponent("ContainerManager.qml")121 var comp = Qt.createComponent("ContainerManager.qml")
122 var worker = comp.createObject()122 var worker = comp.createObject()
123 worker.containerAction = ContainerManagerWorker.Search
124 worker.containerId = mainView.currentContainer
125 worker.data = search_string
126 worker.finishedSearch.connect(finishedSearch)123 worker.finishedSearch.connect(finishedSearch)
127 worker.error.connect(mainView.error)124 worker.error.connect(mainView.error)
128 worker.start()125 worker.searchPackageCache(mainView.currentContainer, search_string)
129 }126 }
130127
131 function finishedSearch(packageList) {128 function finishedSearch(packageList) {
132129
=== modified file 'libertine/qml/libertine.qml'
--- libertine/qml/libertine.qml 2016-05-09 20:27:38 +0000
+++ libertine/qml/libertine.qml 2016-06-07 12:41:22 +0000
@@ -29,22 +29,26 @@
29 width: units.gu(90)29 width: units.gu(90)
30 height: units.gu(75)30 height: units.gu(75)
31 property var currentContainer: undefined31 property var currentContainer: undefined
32 property var currentPackage: undefined32 property var packageOperationDetails: undefined
3333
34 signal error(string short_description, string details)34 signal error(string short_description, string details)
35 signal updatePackageDetails(string container_id, string package_name, string details)
36 signal packageOperationInteraction(string data)
3537
36 PageStack {38 PageStack {
37 id: pageStack39 id: pageStack
38 }40 }
3941
40 Component.onCompleted: {42 Component.onCompleted: {
43 Qt.createComponent("ContainerManager.qml").createObject(mainView).fixIntegrity()
44
41 mainView.currentContainer = containerConfigList.defaultContainerId45 mainView.currentContainer = containerConfigList.defaultContainerId
4246
43 if (!containerConfigList.empty()) {47 if (!containerConfigList.empty()) {
44 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))48 pageStack.push(Qt.resolvedUrl("ContainersView.qml"))
45 if (mainView.currentContainer) {49 if (mainView.currentContainer) {
46 containerAppsList.setContainerApps(mainView.currentContainer)50 containerAppsList.setContainerApps(mainView.currentContainer)
47 pageStack.push(Qt.resolvedUrl("HomeView.qml"))51 pageStack.push(Qt.resolvedUrl("HomeView.qml"), {"currentContainer": mainView.currentContainer})
48 }52 }
49 }53 }
50 else {54 else {
@@ -56,4 +60,35 @@
56 PopupUtils.open(Qt.resolvedUrl("GenericErrorDialog.qml"), null,60 PopupUtils.open(Qt.resolvedUrl("GenericErrorDialog.qml"), null,
57 {"short_description": short_description, "details": details})61 {"short_description": short_description, "details": details})
58 }62 }
63
64 function updatePackageOperationDetails(container_id, package_name, details) {
65 if (!mainView) {
66 return
67 }
68 if (!packageOperationDetails) {
69 packageOperationDetails = {}
70 }
71 if (!packageOperationDetails[container_id]) {
72 packageOperationDetails[container_id] = {}
73 }
74 if (!packageOperationDetails[container_id][package_name]) {
75 packageOperationDetails[container_id][package_name] = ""
76 }
77 packageOperationDetails[container_id][package_name] += details
78
79 updatePackageDetails(container_id, package_name, details)
80 }
81
82 function resetPackageDetails(container_id, package_name) {
83 if (mainView && packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {
84 delete packageOperationDetails[container_id][package_name]
85 }
86 }
87
88 function getPackageOperationDetails(container_id, package_name) {
89 if (packageOperationDetails && packageOperationDetails[container_id] && packageOperationDetails[container_id][package_name]) {
90 return packageOperationDetails[container_id][package_name]
91 }
92 return ""
93 }
59}94}
6095
=== modified file 'po/en_US.po'
--- po/en_US.po 2016-05-09 14:38:13 +0000
+++ po/en_US.po 2016-06-07 12:41:22 +0000
@@ -7,7 +7,7 @@
7msgstr ""7msgstr ""
8"Project-Id-Version: PACKAGE VERSION\n"8"Project-Id-Version: PACKAGE VERSION\n"
9"Report-Msgid-Bugs-To: \n"9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2016-05-09 10:33-0400\n"10"POT-Creation-Date: 2016-06-07 07:58-0400\n"
11"PO-Revision-Date: 2016-03-21 10:21-0400\n"11"PO-Revision-Date: 2016-03-21 10:21-0400\n"
12"Last-Translator: Chris Townsend <christopher.townsend@canonical.com>\n"12"Last-Translator: Chris Townsend <christopher.townsend@canonical.com>\n"
13"Language-Team: English\n"13"Language-Team: English\n"
@@ -17,316 +17,358 @@
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=2; plural=(n != 1);\n"18"Plural-Forms: nplurals=2; plural=(n != 1);\n"
1919
20#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
21msgid "new"
22msgstr "new"
23
24#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
25#: ../libertine/qml/ContainersView.qml:81 ../libertine/qml/HomeView.qml:197
26#: ../libertine/qml/ExtraArchivesView.qml:99
27msgid "installing"
28msgstr "installing"
29
30#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:119
31#: ../libertine/qml/ManageContainer.qml:79
32#: ../libertine/qml/ManageContainer.qml:119
33msgid "ready"
34msgstr "ready"
35
36#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:120
37#: ../libertine/qml/ManageContainer.qml:91
38#: ../libertine/qml/ManageContainer.qml:115
39msgid "updating"
40msgstr "updating"
41
42#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
43#: ../libertine/qml/ContainersView.qml:82 ../libertine/qml/HomeView.qml:198
44#: ../libertine/qml/ExtraArchivesView.qml:100
45msgid "removing"
46msgstr "removing"
47
48#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
49#: ../libertine/qml/PackageInfoView.qml:131
50#: ../libertine/qml/ContainerInfoView.qml:93
51msgid "removed"
52msgstr "removed"
53
54#: ../libertine/ContainerConfig.cpp:153 ../libertine/ContainerConfig.cpp:187
55msgid "failed"
56msgstr "failed"
57
58#: ../libertine/ContainerConfig.cpp:186
59msgid "installed"
60msgstr "installed"
61
62#: ../libertine/ContainerManager.cpp:24
63msgid "%1 failed to start"
64msgstr "%1 failed to start"
65
20#: ../libertine/ContainerManager.cpp:2566#: ../libertine/ContainerManager.cpp:25
21msgid "%1 failed to start"67msgid "Installation of package %1 failed"
22msgstr ""68msgstr "Installation of package %1 failed"
2369
24#: ../libertine/qml/ExtraArchivesView.qml:3570#: ../libertine/ContainerManager.cpp:26
25msgid "Add a new PPA"71msgid "Removal of package %1 failed"
26msgstr ""72msgstr "Removal of package %1 failed"
2773
28#: ../libertine/qml/ExtraArchivesView.qml:4474#: ../libertine/ContainerManager.cpp:27
29msgid "Add additional PPA"75msgid "Searching for query %1 failed"
30msgstr ""76msgstr "Searching for query %1 failed"
3177
32#: ../libertine/qml/ExtraArchivesView.qml:17478#: ../libertine/ContainerManager.cpp:28
33msgid "Adding archive failed"79msgid "Updating container %1 failed"
34msgstr ""80msgstr "Updating container %1 failed"
3581
36#: ../libertine/qml/ExtraArchivesView.qml:2682#: ../libertine/ContainerManager.cpp:29
37msgid "Additional Archives and PPAs"83msgid "Creating container %1 failed"
38msgstr ""84msgstr "Creating container %1 failed"
3985
40#: ../libertine/qml/ManageContainer.qml:5986#: ../libertine/ContainerManager.cpp:30
41msgid "Additional archives and PPAs"87msgid "Destroying container %1 failed"
42msgstr ""88msgstr "Destroying container %1 failed"
4389
44#: ../libertine/qml/ContainerPasswordDialog.qml:2790#: ../libertine/ContainerManager.cpp:31
45msgid "Authentication required"91msgid "Running command %1 failed"
46msgstr ""92msgstr "Running command %1 failed"
4793
48#: ../libertine/qml/DebianPackagePicker.qml:2694#: ../libertine/ContainerManager.cpp:32
49msgid "Available Debian Packages to Install"95msgid "Attempt to configure container %1 failed"
50msgstr ""96msgstr "Attempt to configure container %1 failed"
5197
98#: ../libertine/qml/PackageExistsDialog.qml:28
99msgid "The %1 package is already installed."
100msgstr "The %1 package is already installed."
101
102#: .:./libertine/qml/PackageExistsDialog.qml:29
103msgid "Search again or return to search results."
104msgstr "Search again or return to search results."
105
106#: ../libertine/qml/PackageExistsDialog.qml:33
107msgid "Search again"
108msgstr "Search again"
109
110#: ../libertine/qml/PackageExistsDialog.qml:43
111msgid "Return to search results"
112msgstr "Return to search results"
113
114#: ../libertine/qml/ContainersView.qml:33
115msgid "My Containers"
116msgstr "My Containers"
117
118#: ../libertine/qml/ContainersView.qml:92 ../libertine/qml/HomeView.qml:210
119msgid "delete"
120msgstr "delete"
121
122#: ../libertine/qml/ContainersView.qml:93
123msgid "Delete Container"
124msgstr "Delete Container"
125
126#: ../libertine/qml/ContainersView.qml:108 ../libertine/qml/HomeView.qml:222
127msgid "info"
128msgstr "info"
129
130#: ../libertine/qml/ContainersView.qml:109
131msgid "Container Info"
132msgstr "Container Info"
133
134#: ../libertine/qml/ContainersView.qml:117
135msgid "edit"
136msgstr "edit"
137
138#: ../libertine/qml/ContainersView.qml:118
139msgid "Container Apps"
140msgstr "Container Apps"
141
142#: ../libertine/qml/SearchPackagesDialog.qml:26
143#: ../libertine/qml/SearchResultsView.qml:36
144msgid "Search for packages"
145msgstr "Search for packages"
146
147#: ../libertine/qml/SearchPackagesDialog.qml:27
148msgid "Search archives for packages"
149msgstr "Search archives for packages"
150
151#: ../libertine/qml/SearchPackagesDialog.qml:31
152msgid "search"
153msgstr "search"
154
155#: ../libertine/qml/SearchPackagesDialog.qml:39
156#: ../libertine/qml/ContainerPasswordDialog.qml:52
157#: ../libertine/qml/HomeView.qml:68 ../libertine/qml/ExtraArchivesView.qml:57
158#: ../libertine/qml/ContainerOptionsDialog.qml:64
159msgid "OK"
160msgstr "OK"
161
162#: ../libertine/qml/SearchPackagesDialog.qml:57
163#: ../libertine/qml/ContainerPasswordDialog.qml:70
164#: ../libertine/qml/HomeView.qml:88 ../libertine/qml/ExtraArchivesView.qml:65
52#: ../libertine/qml/ContainerOptionsDialog.qml:75165#: ../libertine/qml/ContainerOptionsDialog.qml:75
53#: ../libertine/qml/ContainerPasswordDialog.qml:70
54#: ../libertine/qml/SearchPackagesDialog.qml:57
55#: ../libertine/qml/HomeView.qml:86 ../libertine/qml/ExtraArchivesView.qml:63
56msgid "Cancel"166msgid "Cancel"
57msgstr ""167msgstr "Cancel"
58168
59#: ../libertine/qml/HomeView.qml:136169#: ../libertine/qml/PackageInfoView.qml:30
60msgid "Choose Debian package to install"
61msgstr ""
62
63#: ../libertine/qml/HomeView.qml:27
64msgid "Classic Apps - %1"
65msgstr "Classic Apps - %1"
66
67#: ../libertine/qml/ContainerOptionsDialog.qml:28
68#, fuzzy
69msgid "Configure options for container creation."
70msgstr "Configure Container"
71
72#: ../libertine/qml/ContainersView.qml:100
73msgid "Container Apps"
74msgstr "Container Apps"
75
76#: ../libertine/qml/ContainersView.qml:91
77msgid "Container Info"
78msgstr "Container Info"
79
80#: ../libertine/qml/HomeView.qml:108
81#, fuzzy
82msgid "Container Information"
83msgstr "Container information for %1"
84
85#: ../libertine/qml/ContainerOptionsDialog.qml:27
86#, fuzzy
87msgid "Container Options"
88msgstr "Container Apps"
89
90#: ../libertine/qml/ContainerInfoView.qml:28
91msgid "Container information for %1"
92msgstr "Container information for %1"
93
94#: ../libertine/qml/ContainersView.qml:73
95msgid "Delete Container"
96msgstr "Delete Container"
97
98#: ../libertine/qml/ExtraArchivesView.qml:178
99msgid "Deleting archive failed"
100msgstr ""
101
102#: ../libertine/qml/GenericErrorDialog.qml:32
103msgid "Dismiss"
104msgstr ""
105
106#: ../libertine/qml/ContainerInfoView.qml:62
107#, fuzzy
108msgid "Distribution"
109msgstr "Distribution: %1"
110
111#: ../libertine/qml/HomeView.qml:46
112#, fuzzy
113msgid "Enter exact package name or full path to a Debian package file"
114msgstr "Please enter the exact package name of the app to install:"
115
116#: ../libertine/qml/ExtraArchivesView.qml:45
117msgid "Enter name of PPA in the form ppa:user/ppa-name:"
118msgstr ""
119
120#: ../libertine/qml/ContainerOptionsDialog.qml:50
121msgid "Enter or name for the container or leave blank for default name"
122msgstr ""
123
124#: ../libertine/qml/HomeView.qml:130
125#, fuzzy
126msgid "Enter package name or Debian file"
127msgstr "Please enter the exact package name of the app to install:"
128
129#: ../libertine/qml/ContainerInfoView.qml:48
130msgid "ID"
131msgstr ""
132
133#: ../libertine/qml/PackageInfoView.qml:29
134msgid "Information for the %1 package"170msgid "Information for the %1 package"
135msgstr "Information for the %1 package"171msgstr "Information for the %1 package"
136172
137#: ../libertine/qml/WelcomeView.qml:58173#: ../libertine/qml/PackageInfoView.qml:35
138msgid "Install"174msgid "Obtaining package version…"
139msgstr "Install"175msgstr "Obtaining package version…"
140176
141#: ../libertine/qml/DebianPackagePicker.qml:53177#: ../libertine/qml/PackageInfoView.qml:59
142#: ../libertine/qml/SearchResults.qml:42178msgid "Package version"
179msgstr "Package version"
180
181#: ../libertine/qml/PackageInfoView.qml:67
182msgid "Install status"
183msgstr "Install status"
184
185#: ../libertine/qml/PackageInfoView.qml:140
186msgid "Unknown"
187msgstr "Unknown"
188
189#: ../libertine/qml/SearchResultsView.qml:31
190msgid "Package Search Results"
191msgstr "Package Search Results"
192
193#: ../libertine/qml/SearchResultsView.qml:35
194msgid "Search"
195msgstr "Search"
196
197#: ../libertine/qml/SearchResultsView.qml:52
198msgid "No Search Results Found"
199msgstr "No Search Results Found"
200
201#: ../libertine/qml/SearchResultsView.qml:57
202msgid "Search Again"
203msgstr "Search Again"
204
205#: ../libertine/qml/SearchResultsView.qml:67
206msgid "Return to Apps Page"
207msgstr "Return to Apps Page"
208
209#: ../libertine/qml/SearchResultsView.qml:95
210msgid "Searching for packages…"
211msgstr "Searching for packages…"
212
213#: ../libertine/qml/SearchResults.qml:60
214#: ../libertine/qml/DebianPackagePicker.qml:70
143msgid "Install Package"215msgid "Install Package"
144msgstr "Install Package"216msgstr "Install Package"
145217
146#: ../libertine/qml/HomeView.qml:45218#: ../libertine/qml/ManageContainer.qml:29
147#, fuzzy
148msgid "Install new package"
149msgstr "Install Package"
150
151#: ../libertine/qml/PackageInfoView.qml:58
152#, fuzzy
153msgid "Install status"
154msgstr "Install status: %1"
155
156#: ../libertine/ContainerManager.cpp:26
157#, fuzzy
158msgid "Installation of package %1 failed"
159msgstr "Install Package"
160
161#: ../libertine/qml/ContainerPasswordDialog.qml:36
162msgid "Invalid password entered"
163msgstr ""
164
165#: ../libertine/qml/ManageContainer.qml:27
166msgid "Manage %1"219msgid "Manage %1"
167msgstr ""220msgstr "Manage %1"
168221
169#: ../libertine/qml/HomeView.qml:102222#: ../libertine/qml/ManageContainer.qml:63
170#, fuzzy223#: ../libertine/qml/ContainerOptionsDialog.qml:40
171msgid "Manage Container"224msgid "i386 multiarch support"
172msgstr "My Containers"225msgstr "i386 multiarch support"
173226
174#: ../libertine/qml/ContainersView.qml:31227#: ../libertine/qml/ManageContainer.qml:67
175msgid "My Containers"228msgid "Additional archives and PPAs"
176msgstr "My Containers"229msgstr "Additional archives and PPAs"
177230
178#: ../libertine/qml/ContainerInfoView.qml:55231#: ../libertine/qml/ManageContainer.qml:78
179#, fuzzy232msgid "Update…"
180msgid "Name"233msgstr "Update…"
181msgstr "Name: %1"234
182235#: ../libertine/qml/ManageContainer.qml:94
183#: ../libertine/qml/DebianPackagePicker.qml:72236msgid "Update container"
237msgstr "Update container"
238
239#: ../libertine/qml/DebianPackagePicker.qml:28
240msgid "Available Debian Packages to Install"
241msgstr "Available Debian Packages to Install"
242
243#: ../libertine/qml/DebianPackagePicker.qml:87
184msgid "No Debian packages available"244msgid "No Debian packages available"
185msgstr ""245msgstr "No Debian packages available"
186246
187#: ../libertine/qml/SearchResultsView.qml:49247#: ../libertine/qml/ContainerPasswordDialog.qml:27
188#, fuzzy248msgid "Authentication required"
189msgid "No Search Results Found"249msgstr "Authentication required"
190msgstr "No search results for %1."
191
192#: ../libertine/qml/ExtraArchivesView.qml:120
193msgid "No additional archives and PPA's have been added"
194msgstr ""
195
196#: ../libertine/qml/HomeView.qml:227
197#, fuzzy
198msgid "No packages are installed"
199msgstr "Please enter the exact package name of the app to install:"
200
201#: ../libertine/qml/ContainerOptionsDialog.qml:64
202#: ../libertine/qml/ContainerPasswordDialog.qml:52
203#: ../libertine/qml/SearchPackagesDialog.qml:39
204#: ../libertine/qml/HomeView.qml:65 ../libertine/qml/ExtraArchivesView.qml:55
205msgid "OK"
206msgstr ""
207
208#: ../libertine/qml/PackageInfoView.qml:33
209msgid "Obtaining package version…"
210msgstr "Obtaining package version…"
211
212#: ../libertine/qml/HomeView.qml:209
213msgid "Package Info"
214msgstr "Package Info"
215
216#: ../libertine/qml/SearchResultsView.qml:28
217msgid "Package Search Results"
218msgstr ""
219
220#: ../libertine/qml/HomeView.qml:56
221msgid "Package name or Debian package path"
222msgstr ""
223
224#: ../libertine/qml/PackageInfoView.qml:51
225#, fuzzy
226msgid "Package version"
227msgstr "Package version: %1"
228250
229#: ../libertine/qml/ContainerPasswordDialog.qml:28251#: ../libertine/qml/ContainerPasswordDialog.qml:28
230msgid "Password is required to create a Libertine container"252msgid "Password is required to create a Libertine container"
231msgstr ""253msgstr "Password is required to create a Libertine container"
232254
233#: ../libertine/ContainerManager.cpp:27255#: ../libertine/qml/ContainerPasswordDialog.qml:36
234msgid "Removal of package %1 failed"256msgid "Invalid password entered"
235msgstr ""257msgstr "Invalid password entered"
236258
237#: ../libertine/qml/HomeView.qml:196259#: ../libertine/qml/ContainerPasswordDialog.qml:41
260msgid "password"
261msgstr "password"
262
263#: ../libertine/qml/HomeView.qml:29
264msgid "Classic Apps - %1"
265msgstr "Classic Apps - %1"
266
267#: ../libertine/qml/HomeView.qml:48
268msgid "Install new package"
269msgstr "Install new package"
270
271#: ../libertine/qml/HomeView.qml:49
272msgid "Enter exact package name or full path to a Debian package file"
273msgstr "Enter exact package name or full path to a Debian package file"
274
275#: ../libertine/qml/HomeView.qml:59
276msgid "Package name or Debian package path"
277msgstr "Package name or Debian package path"
278
279#: ../libertine/qml/HomeView.qml:78
280msgid "The %1 package is already installed. Please try a different package name."
281msgstr "The %1 package is already installed. Please try a different package name."
282
283#: ../libertine/qml/HomeView.qml:104
284msgid "Manage Container"
285msgstr "Manage Container"
286
287#: ../libertine/qml/HomeView.qml:110
288msgid "Container Information"
289msgstr "Container Information"
290
291#: ../libertine/qml/HomeView.qml:116
292msgid "Switch Container"
293msgstr "Switch Container"
294
295#: ../libertine/qml/HomeView.qml:132
296msgid "Enter package name or Debian file"
297msgstr "Enter package name or Debian file"
298
299#: ../libertine/qml/HomeView.qml:138
300msgid "Choose Debian package to install"
301msgstr "Choose Debian package to install"
302
303#: ../libertine/qml/HomeView.qml:145
304msgid "Search archives for a package"
305msgstr "Search archives for a package"
306
307#: ../libertine/qml/HomeView.qml:211
238msgid "Remove Package"308msgid "Remove Package"
239msgstr "Remove Package"309msgstr "Remove Package"
240310
241#: ../libertine/qml/ExtraArchivesView.qml:103311#: ../libertine/qml/HomeView.qml:223
312msgid "Package Info"
313msgstr "Package Info"
314
315#: ../libertine/qml/HomeView.qml:240
316msgid "No packages are installed"
317msgstr "No packages are installed"
318
319#: ../libertine/qml/ExtraArchivesView.qml:28
320msgid "Additional Archives and PPAs"
321msgstr "Additional Archives and PPAs"
322
323#: ../libertine/qml/ExtraArchivesView.qml:32
324msgid "add"
325msgstr "add"
326
327#: ../libertine/qml/ExtraArchivesView.qml:33
328msgid "Add a new PPA"
329msgstr "Add a new PPA"
330
331#: ../libertine/qml/ExtraArchivesView.qml:46
332msgid "Add additional PPA"
333msgstr "Add additional PPA"
334
335#: ../libertine/qml/ExtraArchivesView.qml:47
336msgid "Enter name of PPA in the form ppa:user/ppa-name:"
337msgstr "Enter name of PPA in the form ppa:user/ppa-name:"
338
339#: ../libertine/qml/ExtraArchivesView.qml:107
340msgid "remove"
341msgstr "remove"
342
343#: ../libertine/qml/ExtraArchivesView.qml:108
242msgid "Remove extra archive"344msgid "Remove extra archive"
243msgstr ""345msgstr "Remove extra archive"
244346
245#: ../libertine/qml/SearchResultsView.qml:64347#: ../libertine/qml/ExtraArchivesView.qml:125
246msgid "Return to Apps Page"348msgid "No additional archives and PPA's have been added"
247msgstr ""349msgstr "No additional archives and PPA's have been added"
248350
249#: ../libertine/qml/PackageExistsDialog.qml:43351#: ../libertine/qml/ExtraArchivesView.qml:173
250#, fuzzy352msgid "Adding archive failed"
251msgid "Return to search results"353msgstr "Adding archive failed"
252msgstr "No search results for %1."354
253355#: ../libertine/qml/ExtraArchivesView.qml:177
254#: ../libertine/qml/SearchResultsView.qml:38356msgid "Deleting archive failed"
255msgid "Search"357msgstr "Deleting archive failed"
256msgstr ""358
257359#: ../libertine/qml/GenericErrorDialog.qml:32
258#: ../libertine/qml/SearchResultsView.qml:54360msgid "Dismiss"
259msgid "Search Again"361msgstr "Dismiss"
260msgstr ""362
261363#: ../libertine/qml/WelcomeView.qml:28
262#: ../libertine/qml/PackageExistsDialog.qml:33
263msgid "Search again"
264msgstr ""
265
266#: ../libertine/qml/PackageExistsDialog.qml:29
267msgid "Search again or return to search results."
268msgstr ""
269
270#: ../libertine/qml/HomeView.qml:143
271msgid "Search archives for a package"
272msgstr ""
273
274#: ../libertine/qml/SearchPackagesDialog.qml:27
275msgid "Search archives for packages"
276msgstr ""
277
278#: ../libertine/qml/SearchResultsView.qml:39
279#: ../libertine/qml/SearchPackagesDialog.qml:26
280msgid "Search for packages"
281msgstr ""
282
283#: ../libertine/qml/SearchResultsView.qml:92
284#, fuzzy
285msgid "Searching for packages…"
286msgstr "Obtaining package version…"
287
288#: ../libertine/qml/ContainerInfoView.qml:69
289#, fuzzy
290msgid "Status"
291msgstr "Status: %1"
292
293#: ../libertine/qml/HomeView.qml:114
294msgid "Switch Container"
295msgstr "Switch Container"
296
297#: ../libertine/qml/PackageExistsDialog.qml:28
298#, fuzzy
299msgid "The %1 package is already installed."
300msgstr "Please enter the exact package name of the app to install:"
301
302#: ../libertine/qml/HomeView.qml:76
303#, fuzzy
304msgid ""
305"The %1 package is already installed. Please try a different package name."
306msgstr "Package %1 already installed. Please try a different package name."
307
308#: ../libertine/qml/PackageInfoView.qml:100
309msgid "Unknown"
310msgstr ""
311
312#: ../libertine/qml/ManageContainer.qml:86
313#, fuzzy
314msgid "Update container"
315msgstr "Update Container"
316
317#: ../libertine/qml/ManageContainer.qml:70
318msgid "Update…"
319msgstr ""
320
321#: ../libertine/qml/WelcomeView.qml:27
322msgid "Welcome"364msgid "Welcome"
323msgstr "Welcome"365msgstr "Welcome"
324366
325#: ../libertine/qml/WelcomeView.qml:42367#: ../libertine/qml/WelcomeView.qml:50
326msgid "Welcome to the Ubuntu Legacy Application Support Manager."368msgid "Welcome to the Ubuntu Legacy Application Support Manager."
327msgstr "Welcome to the Ubuntu Legacy Application Support Manager."369msgstr "Welcome to the Ubuntu Legacy Application Support Manager."
328370
329#: ../libertine/qml/WelcomeView.qml:50371#: ../libertine/qml/WelcomeView.qml:58
330msgid ""372msgid ""
331"You do not have Legacy Application Support configured at this time. "373"You do not have Legacy Application Support configured at this time. "
332"Downloading and setting up the required environment takes some time and "374"Downloading and setting up the required environment takes some time and "
@@ -336,87 +378,45 @@
336"Downloading and setting up the required environment takes some time and "378"Downloading and setting up the required environment takes some time and "
337"network bandwidth."379"network bandwidth."
338380
339#: ../libertine/qml/ExtraArchivesView.qml:34381#: ../libertine/qml/WelcomeView.qml:66
340msgid "add"382msgid "Install"
341msgstr ""383msgstr "Install"
384
385#: ../libertine/qml/ContainerInfoView.qml:30
386msgid "Container information for %1"
387msgstr "Container information for %1"
388
389#: ../libertine/qml/ContainerInfoView.qml:53
390msgid "ID"
391msgstr "ID"
392
393#: ../libertine/qml/ContainerInfoView.qml:60
394msgid "Name"
395msgstr "Name"
396
397#: ../libertine/qml/ContainerInfoView.qml:67
398msgid "Distribution"
399msgstr "Distribution"
400
401#: ../libertine/qml/ContainerInfoView.qml:74
402msgid "Status"
403msgstr "Status"
404
405#: ../libertine/qml/ContainerOptionsDialog.qml:27
406msgid "Container Options"
407msgstr "Container Options"
408
409#: ../libertine/qml/ContainerOptionsDialog.qml:28
410msgid "Configure options for container creation."
411msgstr "Configure options for container creation."
412
413#: ../libertine/qml/ContainerOptionsDialog.qml:50
414msgid "Enter or name for the container or leave blank for default name"
415msgstr "Enter or name for the container or leave blank for default name"
342416
343#: ../libertine/qml/ContainerOptionsDialog.qml:56417#: ../libertine/qml/ContainerOptionsDialog.qml:56
344#, fuzzy
345msgid "container name"418msgid "container name"
346msgstr "Container Info"419msgstr "container name"
347
348#: ../libertine/qml/ContainersView.qml:72 ../libertine/qml/HomeView.qml:195
349msgid "delete"
350msgstr "delete"
351
352#: ../libertine/qml/ContainersView.qml:99
353msgid "edit"
354msgstr "edit"
355
356#: ../libertine/ContainerConfig.cpp:153 ../libertine/ContainerConfig.cpp:187
357msgid "failed"
358msgstr "failed"
359
360#: ../libertine/qml/ContainerOptionsDialog.qml:40
361#: ../libertine/qml/ManageContainer.qml:55
362msgid "i386 multiarch support"
363msgstr "i386 multiarch support"
364
365#: ../libertine/qml/ContainersView.qml:90 ../libertine/qml/HomeView.qml:208
366msgid "info"
367msgstr "info"
368
369#: ../libertine/ContainerConfig.cpp:186
370msgid "installed"
371msgstr "installed"
372
373#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
374#: ../libertine/qml/ContainersView.qml:63 ../libertine/qml/HomeView.qml:187
375#: ../libertine/qml/ExtraArchivesView.qml:94
376msgid "installing"
377msgstr "installing"
378
379#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
380msgid "new"
381msgstr "new"
382
383#: ../libertine/qml/ContainerPasswordDialog.qml:41
384#, fuzzy
385msgid "password"
386msgstr "Password"
387
388#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:101
389#: ../libertine/qml/ManageContainer.qml:71
390#: ../libertine/qml/ManageContainer.qml:112
391msgid "ready"
392msgstr "ready"
393
394#: ../libertine/qml/ExtraArchivesView.qml:102
395#, fuzzy
396msgid "remove"
397msgstr "removed"
398
399#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
400#: ../libertine/qml/ContainerInfoView.qml:88
401#: ../libertine/qml/PackageInfoView.qml:91
402msgid "removed"
403msgstr "removed"
404
405#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
406#: ../libertine/qml/ContainersView.qml:64 ../libertine/qml/HomeView.qml:188
407#: ../libertine/qml/ExtraArchivesView.qml:95
408msgid "removing"
409msgstr "removing"
410
411#: ../libertine/qml/SearchPackagesDialog.qml:31
412msgid "search"
413msgstr ""
414
415#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:102
416#: ../libertine/qml/ManageContainer.qml:83
417#: ../libertine/qml/ManageContainer.qml:108
418msgid "updating"
419msgstr ""
420420
421#~ msgid "Configure %1"421#~ msgid "Configure %1"
422#~ msgstr "Configure %1"422#~ msgstr "Configure %1"
423423
=== modified file 'po/libertine.pot'
--- po/libertine.pot 2016-05-09 14:38:13 +0000
+++ po/libertine.pot 2016-06-07 12:41:22 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: PACKAGE VERSION\n"9"Project-Id-Version: PACKAGE VERSION\n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2016-05-09 10:33-0400\n"11"POT-Creation-Date: 2016-06-07 07:58-0400\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,49 +17,37 @@
17"Content-Type: text/plain; charset=UTF-8\n"17"Content-Type: text/plain; charset=UTF-8\n"
18"Content-Transfer-Encoding: 8bit\n"18"Content-Transfer-Encoding: 8bit\n"
1919
20#: ../libertine/ContainerManager.cpp:25
21msgid "%1 failed to start"
22msgstr ""
23
24#: ../libertine/ContainerManager.cpp:26
25msgid "Installation of package %1 failed"
26msgstr ""
27
28#: ../libertine/ContainerManager.cpp:27
29msgid "Removal of package %1 failed"
30msgstr ""
31
32#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:18420#: ../libertine/ContainerConfig.cpp:147 ../libertine/ContainerConfig.cpp:184
33msgid "new"21msgid "new"
34msgstr ""22msgstr ""
3523
36#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:18524#: ../libertine/ContainerConfig.cpp:148 ../libertine/ContainerConfig.cpp:185
37#: ../libertine/qml/ContainersView.qml:63 ../libertine/qml/HomeView.qml:18725#: ../libertine/qml/ContainersView.qml:81 ../libertine/qml/HomeView.qml:197
38#: ../libertine/qml/ExtraArchivesView.qml:9426#: ../libertine/qml/ExtraArchivesView.qml:99
39msgid "installing"27msgid "installing"
40msgstr ""28msgstr ""
4129
42#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:10130#: ../libertine/ContainerConfig.cpp:149 ../libertine/qml/ContainersView.qml:119
43#: ../libertine/qml/ManageContainer.qml:7131#: ../libertine/qml/ManageContainer.qml:79
44#: ../libertine/qml/ManageContainer.qml:11232#: ../libertine/qml/ManageContainer.qml:119
45msgid "ready"33msgid "ready"
46msgstr ""34msgstr ""
4735
48#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:10236#: ../libertine/ContainerConfig.cpp:150 ../libertine/qml/ContainersView.qml:120
49#: ../libertine/qml/ManageContainer.qml:8337#: ../libertine/qml/ManageContainer.qml:91
50#: ../libertine/qml/ManageContainer.qml:10838#: ../libertine/qml/ManageContainer.qml:115
51msgid "updating"39msgid "updating"
52msgstr ""40msgstr ""
5341
54#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:18842#: ../libertine/ContainerConfig.cpp:151 ../libertine/ContainerConfig.cpp:188
55#: ../libertine/qml/ContainersView.qml:64 ../libertine/qml/HomeView.qml:18843#: ../libertine/qml/ContainersView.qml:82 ../libertine/qml/HomeView.qml:198
56#: ../libertine/qml/ExtraArchivesView.qml:9544#: ../libertine/qml/ExtraArchivesView.qml:100
57msgid "removing"45msgid "removing"
58msgstr ""46msgstr ""
5947
60#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:18948#: ../libertine/ContainerConfig.cpp:152 ../libertine/ContainerConfig.cpp:189
61#: ../libertine/qml/ContainerInfoView.qml:8849#: ../libertine/qml/PackageInfoView.qml:131
62#: ../libertine/qml/PackageInfoView.qml:9150#: ../libertine/qml/ContainerInfoView.qml:93
63msgid "removed"51msgid "removed"
64msgstr ""52msgstr ""
6553
@@ -71,84 +59,188 @@
71msgid "installed"59msgid "installed"
72msgstr ""60msgstr ""
7361
74#: ../libertine/qml/ContainerOptionsDialog.qml:2762#: ../libertine/ContainerManager.cpp:24
75msgid "Container Options"63msgid "%1 failed to start"
76msgstr ""64msgstr ""
7765
78#: ../libertine/qml/ContainerOptionsDialog.qml:2866#: ../libertine/ContainerManager.cpp:25
79msgid "Configure options for container creation."67msgid "Installation of package %1 failed"
80msgstr ""68msgstr ""
8169
82#: ../libertine/qml/ContainerOptionsDialog.qml:4070#: ../libertine/ContainerManager.cpp:26
83#: ../libertine/qml/ManageContainer.qml:5571msgid "Removal of package %1 failed"
84msgid "i386 multiarch support"72msgstr ""
85msgstr ""73
8674#: ../libertine/ContainerManager.cpp:27
87#: ../libertine/qml/ContainerOptionsDialog.qml:5075msgid "Searching for query %1 failed"
88msgid "Enter or name for the container or leave blank for default name"76msgstr ""
89msgstr ""77
9078#: ../libertine/ContainerManager.cpp:28
91#: ../libertine/qml/ContainerOptionsDialog.qml:5679msgid "Updating container %1 failed"
92msgid "container name"80msgstr ""
93msgstr ""81
9482#: ../libertine/ContainerManager.cpp:29
83msgid "Creating container %1 failed"
84msgstr ""
85
86#: ../libertine/ContainerManager.cpp:30
87msgid "Destroying container %1 failed"
88msgstr ""
89
90#: ../libertine/ContainerManager.cpp:31
91msgid "Running command %1 failed"
92msgstr ""
93
94#: ../libertine/ContainerManager.cpp:32
95msgid "Attempt to configure container %1 failed"
96msgstr ""
97
98#: ../libertine/qml/PackageExistsDialog.qml:28
99msgid "The %1 package is already installed."
100msgstr ""
101
102#: ../libertine/qml/PackageExistsDialog.qml:29
103msgid "Search again or return to search results."
104msgstr ""
105
106#: ../libertine/qml/PackageExistsDialog.qml:33
107msgid "Search again"
108msgstr ""
109
110#: ../libertine/qml/PackageExistsDialog.qml:43
111msgid "Return to search results"
112msgstr ""
113
114#: ../libertine/qml/ContainersView.qml:33
115msgid "My Containers"
116msgstr ""
117
118#: ../libertine/qml/ContainersView.qml:92 ../libertine/qml/HomeView.qml:210
119msgid "delete"
120msgstr ""
121
122#: ../libertine/qml/ContainersView.qml:93
123msgid "Delete Container"
124msgstr ""
125
126#: ../libertine/qml/ContainersView.qml:108 ../libertine/qml/HomeView.qml:222
127msgid "info"
128msgstr ""
129
130#: ../libertine/qml/ContainersView.qml:109
131msgid "Container Info"
132msgstr ""
133
134#: ../libertine/qml/ContainersView.qml:117
135msgid "edit"
136msgstr ""
137
138#: ../libertine/qml/ContainersView.qml:118
139msgid "Container Apps"
140msgstr ""
141
142#: ../libertine/qml/SearchPackagesDialog.qml:26
143#: ../libertine/qml/SearchResultsView.qml:36
144msgid "Search for packages"
145msgstr ""
146
147#: ../libertine/qml/SearchPackagesDialog.qml:27
148msgid "Search archives for packages"
149msgstr ""
150
151#: ../libertine/qml/SearchPackagesDialog.qml:31
152msgid "search"
153msgstr ""
154
155#: ../libertine/qml/SearchPackagesDialog.qml:39
156#: ../libertine/qml/ContainerPasswordDialog.qml:52
157#: ../libertine/qml/HomeView.qml:68 ../libertine/qml/ExtraArchivesView.qml:57
95#: ../libertine/qml/ContainerOptionsDialog.qml:64158#: ../libertine/qml/ContainerOptionsDialog.qml:64
96#: ../libertine/qml/ContainerPasswordDialog.qml:52
97#: ../libertine/qml/SearchPackagesDialog.qml:39
98#: ../libertine/qml/HomeView.qml:65 ../libertine/qml/ExtraArchivesView.qml:55
99msgid "OK"159msgid "OK"
100msgstr ""160msgstr ""
101161
162#: ../libertine/qml/SearchPackagesDialog.qml:57
163#: ../libertine/qml/ContainerPasswordDialog.qml:70
164#: ../libertine/qml/HomeView.qml:88 ../libertine/qml/ExtraArchivesView.qml:65
102#: ../libertine/qml/ContainerOptionsDialog.qml:75165#: ../libertine/qml/ContainerOptionsDialog.qml:75
103#: ../libertine/qml/ContainerPasswordDialog.qml:70
104#: ../libertine/qml/SearchPackagesDialog.qml:57
105#: ../libertine/qml/HomeView.qml:86 ../libertine/qml/ExtraArchivesView.qml:63
106msgid "Cancel"166msgid "Cancel"
107msgstr ""167msgstr ""
108168
109#: ../libertine/qml/GenericErrorDialog.qml:32169#: ../libertine/qml/PackageInfoView.qml:30
110msgid "Dismiss"170msgid "Information for the %1 package"
111msgstr ""171msgstr ""
112172
113#: ../libertine/qml/SearchResultsView.qml:28173#: ../libertine/qml/PackageInfoView.qml:35
174msgid "Obtaining package version…"
175msgstr ""
176
177#: ../libertine/qml/PackageInfoView.qml:59
178msgid "Package version"
179msgstr ""
180
181#: ../libertine/qml/PackageInfoView.qml:67
182msgid "Install status"
183msgstr ""
184
185#: ../libertine/qml/PackageInfoView.qml:140
186msgid "Unknown"
187msgstr ""
188
189#: ../libertine/qml/SearchResultsView.qml:31
114msgid "Package Search Results"190msgid "Package Search Results"
115msgstr ""191msgstr ""
116192
117#: ../libertine/qml/SearchResultsView.qml:38193#: ../libertine/qml/SearchResultsView.qml:35
118msgid "Search"194msgid "Search"
119msgstr ""195msgstr ""
120196
121#: ../libertine/qml/SearchResultsView.qml:39197#: ../libertine/qml/SearchResultsView.qml:52
122#: ../libertine/qml/SearchPackagesDialog.qml:26
123msgid "Search for packages"
124msgstr ""
125
126#: ../libertine/qml/SearchResultsView.qml:49
127msgid "No Search Results Found"198msgid "No Search Results Found"
128msgstr ""199msgstr ""
129200
130#: ../libertine/qml/SearchResultsView.qml:54201#: ../libertine/qml/SearchResultsView.qml:57
131msgid "Search Again"202msgid "Search Again"
132msgstr ""203msgstr ""
133204
134#: ../libertine/qml/SearchResultsView.qml:64205#: ../libertine/qml/SearchResultsView.qml:67
135msgid "Return to Apps Page"206msgid "Return to Apps Page"
136msgstr ""207msgstr ""
137208
138#: ../libertine/qml/SearchResultsView.qml:92209#: ../libertine/qml/SearchResultsView.qml:95
139msgid "Searching for packages…"210msgid "Searching for packages…"
140msgstr ""211msgstr ""
141212
142#: ../libertine/qml/DebianPackagePicker.qml:26213#: ../libertine/qml/SearchResults.qml:60
214#: ../libertine/qml/DebianPackagePicker.qml:70
215msgid "Install Package"
216msgstr ""
217
218#: ../libertine/qml/ManageContainer.qml:29
219msgid "Manage %1"
220msgstr ""
221
222#: ../libertine/qml/ManageContainer.qml:63
223#: ../libertine/qml/ContainerOptionsDialog.qml:40
224msgid "i386 multiarch support"
225msgstr ""
226
227#: ../libertine/qml/ManageContainer.qml:67
228msgid "Additional archives and PPAs"
229msgstr ""
230
231#: ../libertine/qml/ManageContainer.qml:78
232msgid "Update…"
233msgstr ""
234
235#: ../libertine/qml/ManageContainer.qml:94
236msgid "Update container"
237msgstr ""
238
239#: ../libertine/qml/DebianPackagePicker.qml:28
143msgid "Available Debian Packages to Install"240msgid "Available Debian Packages to Install"
144msgstr ""241msgstr ""
145242
146#: ../libertine/qml/DebianPackagePicker.qml:53243#: ../libertine/qml/DebianPackagePicker.qml:87
147#: ../libertine/qml/SearchResults.qml:42
148msgid "Install Package"
149msgstr ""
150
151#: ../libertine/qml/DebianPackagePicker.qml:72
152msgid "No Debian packages available"244msgid "No Debian packages available"
153msgstr ""245msgstr ""
154246
@@ -168,226 +260,158 @@
168msgid "password"260msgid "password"
169msgstr ""261msgstr ""
170262
171#: ../libertine/qml/ContainerInfoView.qml:28263#: ../libertine/qml/HomeView.qml:29
172msgid "Container information for %1"
173msgstr ""
174
175#: ../libertine/qml/ContainerInfoView.qml:48
176msgid "ID"
177msgstr ""
178
179#: ../libertine/qml/ContainerInfoView.qml:55
180msgid "Name"
181msgstr ""
182
183#: ../libertine/qml/ContainerInfoView.qml:62
184msgid "Distribution"
185msgstr ""
186
187#: ../libertine/qml/ContainerInfoView.qml:69
188msgid "Status"
189msgstr ""
190
191#: ../libertine/qml/ContainersView.qml:31
192msgid "My Containers"
193msgstr ""
194
195#: ../libertine/qml/ContainersView.qml:72 ../libertine/qml/HomeView.qml:195
196msgid "delete"
197msgstr ""
198
199#: ../libertine/qml/ContainersView.qml:73
200msgid "Delete Container"
201msgstr ""
202
203#: ../libertine/qml/ContainersView.qml:90 ../libertine/qml/HomeView.qml:208
204msgid "info"
205msgstr ""
206
207#: ../libertine/qml/ContainersView.qml:91
208msgid "Container Info"
209msgstr ""
210
211#: ../libertine/qml/ContainersView.qml:99
212msgid "edit"
213msgstr ""
214
215#: ../libertine/qml/ContainersView.qml:100
216msgid "Container Apps"
217msgstr ""
218
219#: ../libertine/qml/SearchPackagesDialog.qml:27
220msgid "Search archives for packages"
221msgstr ""
222
223#: ../libertine/qml/SearchPackagesDialog.qml:31
224msgid "search"
225msgstr ""
226
227#: ../libertine/qml/ManageContainer.qml:27
228msgid "Manage %1"
229msgstr ""
230
231#: ../libertine/qml/ManageContainer.qml:59
232msgid "Additional archives and PPAs"
233msgstr ""
234
235#: ../libertine/qml/ManageContainer.qml:70
236msgid "Update…"
237msgstr ""
238
239#: ../libertine/qml/ManageContainer.qml:86
240msgid "Update container"
241msgstr ""
242
243#: ../libertine/qml/HomeView.qml:27
244msgid "Classic Apps - %1"264msgid "Classic Apps - %1"
245msgstr ""265msgstr ""
246266
247#: ../libertine/qml/HomeView.qml:45267#: ../libertine/qml/HomeView.qml:48
248msgid "Install new package"268msgid "Install new package"
249msgstr ""269msgstr ""
250270
251#: ../libertine/qml/HomeView.qml:46271#: ../libertine/qml/HomeView.qml:49
252msgid "Enter exact package name or full path to a Debian package file"272msgid "Enter exact package name or full path to a Debian package file"
253msgstr ""273msgstr ""
254274
255#: ../libertine/qml/HomeView.qml:56275#: ../libertine/qml/HomeView.qml:59
256msgid "Package name or Debian package path"276msgid "Package name or Debian package path"
257msgstr ""277msgstr ""
258278
259#: ../libertine/qml/HomeView.qml:76279#: ../libertine/qml/HomeView.qml:78
260msgid ""280msgid ""
261"The %1 package is already installed. Please try a different package name."281"The %1 package is already installed. Please try a different package name."
262msgstr ""282msgstr ""
263283
264#: ../libertine/qml/HomeView.qml:102284#: ../libertine/qml/HomeView.qml:104
265msgid "Manage Container"285msgid "Manage Container"
266msgstr ""286msgstr ""
267287
268#: ../libertine/qml/HomeView.qml:108288#: ../libertine/qml/HomeView.qml:110
269msgid "Container Information"289msgid "Container Information"
270msgstr ""290msgstr ""
271291
272#: ../libertine/qml/HomeView.qml:114292#: ../libertine/qml/HomeView.qml:116
273msgid "Switch Container"293msgid "Switch Container"
274msgstr ""294msgstr ""
275295
276#: ../libertine/qml/HomeView.qml:130296#: ../libertine/qml/HomeView.qml:132
277msgid "Enter package name or Debian file"297msgid "Enter package name or Debian file"
278msgstr ""298msgstr ""
279299
280#: ../libertine/qml/HomeView.qml:136300#: ../libertine/qml/HomeView.qml:138
281msgid "Choose Debian package to install"301msgid "Choose Debian package to install"
282msgstr ""302msgstr ""
283303
284#: ../libertine/qml/HomeView.qml:143304#: ../libertine/qml/HomeView.qml:145
285msgid "Search archives for a package"305msgid "Search archives for a package"
286msgstr ""306msgstr ""
287307
288#: ../libertine/qml/HomeView.qml:196308#: ../libertine/qml/HomeView.qml:211
289msgid "Remove Package"309msgid "Remove Package"
290msgstr ""310msgstr ""
291311
292#: ../libertine/qml/HomeView.qml:209312#: ../libertine/qml/HomeView.qml:223
293msgid "Package Info"313msgid "Package Info"
294msgstr ""314msgstr ""
295315
296#: ../libertine/qml/HomeView.qml:227316#: ../libertine/qml/HomeView.qml:240
297msgid "No packages are installed"317msgid "No packages are installed"
298msgstr ""318msgstr ""
299319
300#: ../libertine/qml/PackageInfoView.qml:29320#: ../libertine/qml/ExtraArchivesView.qml:28
301msgid "Information for the %1 package"
302msgstr ""
303
304#: ../libertine/qml/PackageInfoView.qml:33
305msgid "Obtaining package version…"
306msgstr ""
307
308#: ../libertine/qml/PackageInfoView.qml:51
309msgid "Package version"
310msgstr ""
311
312#: ../libertine/qml/PackageInfoView.qml:58
313msgid "Install status"
314msgstr ""
315
316#: ../libertine/qml/PackageInfoView.qml:100
317msgid "Unknown"
318msgstr ""
319
320#: ../libertine/qml/WelcomeView.qml:27
321msgid "Welcome"
322msgstr ""
323
324#: ../libertine/qml/WelcomeView.qml:42
325msgid "Welcome to the Ubuntu Legacy Application Support Manager."
326msgstr ""
327
328#: ../libertine/qml/WelcomeView.qml:50
329msgid ""
330"You do not have Legacy Application Support configured at this time. "
331"Downloading and setting up the required environment takes some time and "
332"network bandwidth."
333msgstr ""
334
335#: ../libertine/qml/WelcomeView.qml:58
336msgid "Install"
337msgstr ""
338
339#: ../libertine/qml/ExtraArchivesView.qml:26
340msgid "Additional Archives and PPAs"321msgid "Additional Archives and PPAs"
341msgstr ""322msgstr ""
342323
343#: ../libertine/qml/ExtraArchivesView.qml:34324#: ../libertine/qml/ExtraArchivesView.qml:32
344msgid "add"325msgid "add"
345msgstr ""326msgstr ""
346327
347#: ../libertine/qml/ExtraArchivesView.qml:35328#: ../libertine/qml/ExtraArchivesView.qml:33
348msgid "Add a new PPA"329msgid "Add a new PPA"
349msgstr ""330msgstr ""
350331
351#: ../libertine/qml/ExtraArchivesView.qml:44332#: ../libertine/qml/ExtraArchivesView.qml:46
352msgid "Add additional PPA"333msgid "Add additional PPA"
353msgstr ""334msgstr ""
354335
355#: ../libertine/qml/ExtraArchivesView.qml:45336#: ../libertine/qml/ExtraArchivesView.qml:47
356msgid "Enter name of PPA in the form ppa:user/ppa-name:"337msgid "Enter name of PPA in the form ppa:user/ppa-name:"
357msgstr ""338msgstr ""
358339
359#: ../libertine/qml/ExtraArchivesView.qml:102340#: ../libertine/qml/ExtraArchivesView.qml:107
360msgid "remove"341msgid "remove"
361msgstr ""342msgstr ""
362343
363#: ../libertine/qml/ExtraArchivesView.qml:103344#: ../libertine/qml/ExtraArchivesView.qml:108
364msgid "Remove extra archive"345msgid "Remove extra archive"
365msgstr ""346msgstr ""
366347
367#: ../libertine/qml/ExtraArchivesView.qml:120348#: ../libertine/qml/ExtraArchivesView.qml:125
368msgid "No additional archives and PPA's have been added"349msgid "No additional archives and PPA's have been added"
369msgstr ""350msgstr ""
370351
371#: ../libertine/qml/ExtraArchivesView.qml:174352#: ../libertine/qml/ExtraArchivesView.qml:173
372msgid "Adding archive failed"353msgid "Adding archive failed"
373msgstr ""354msgstr ""
374355
375#: ../libertine/qml/ExtraArchivesView.qml:178356#: ../libertine/qml/ExtraArchivesView.qml:177
376msgid "Deleting archive failed"357msgid "Deleting archive failed"
377msgstr ""358msgstr ""
378359
379#: ../libertine/qml/PackageExistsDialog.qml:28360#: ../libertine/qml/GenericErrorDialog.qml:32
380msgid "The %1 package is already installed."361msgid "Dismiss"
381msgstr ""362msgstr ""
382363
383#: ../libertine/qml/PackageExistsDialog.qml:29364#: ../libertine/qml/WelcomeView.qml:28
384msgid "Search again or return to search results."365msgid "Welcome"
385msgstr ""366msgstr ""
386367
387#: ../libertine/qml/PackageExistsDialog.qml:33368#: ../libertine/qml/WelcomeView.qml:50
388msgid "Search again"369msgid "Welcome to the Ubuntu Legacy Application Support Manager."
389msgstr ""370msgstr ""
390371
391#: ../libertine/qml/PackageExistsDialog.qml:43372#: ../libertine/qml/WelcomeView.qml:58
392msgid "Return to search results"373msgid ""
374"You do not have Legacy Application Support configured at this time. "
375"Downloading and setting up the required environment takes some time and "
376"network bandwidth."
377msgstr ""
378
379#: ../libertine/qml/WelcomeView.qml:66
380msgid "Install"
381msgstr ""
382
383#: ../libertine/qml/ContainerInfoView.qml:30
384msgid "Container information for %1"
385msgstr ""
386
387#: ../libertine/qml/ContainerInfoView.qml:53
388msgid "ID"
389msgstr ""
390
391#: ../libertine/qml/ContainerInfoView.qml:60
392msgid "Name"
393msgstr ""
394
395#: ../libertine/qml/ContainerInfoView.qml:67
396msgid "Distribution"
397msgstr ""
398
399#: ../libertine/qml/ContainerInfoView.qml:74
400msgid "Status"
401msgstr ""
402
403#: ../libertine/qml/ContainerOptionsDialog.qml:27
404msgid "Container Options"
405msgstr ""
406
407#: ../libertine/qml/ContainerOptionsDialog.qml:28
408msgid "Configure options for container creation."
409msgstr ""
410
411#: ../libertine/qml/ContainerOptionsDialog.qml:50
412msgid "Enter or name for the container or leave blank for default name"
413msgstr ""
414
415#: ../libertine/qml/ContainerOptionsDialog.qml:56
416msgid "container name"
393msgstr ""417msgstr ""
394418
=== modified file 'python/libertine/ChrootContainer.py'
--- python/libertine/ChrootContainer.py 2016-05-11 17:26:27 +0000
+++ python/libertine/ChrootContainer.py 2016-06-07 12:41:22 +0000
@@ -180,8 +180,8 @@
180 self._run_ldconfig(verbosity)180 self._run_ldconfig(verbosity)
181 return retcode181 return retcode
182182
183 def install_package(self, package_name, verbosity=1, extra_apt_args=""):183 def install_package(self, package_name, verbosity=1, readline=False):
184 returncode = super().install_package(package_name, verbosity, extra_apt_args)184 returncode = super().install_package(package_name, verbosity, readline)
185185
186 if returncode:186 if returncode:
187 self._run_ldconfig(verbosity)187 self._run_ldconfig(verbosity)
@@ -210,7 +210,7 @@
210 % (utils.get_libertine_container_userdata_dir_path(self.container_id), home_path)210 % (utils.get_libertine_container_userdata_dir_path(self.container_id), home_path)
211 )211 )
212212
213 xdg_user_dirs = ['Documents', 'Music', 'Pictures', 'Videos']213 xdg_user_dirs = utils.get_common_xdg_directories()
214 for user_dir in xdg_user_dirs:214 for user_dir in xdg_user_dirs:
215 user_dir_path = os.path.join(home_path, user_dir)215 user_dir_path = os.path.join(home_path, user_dir)
216 bind_mounts += " -b %s:%s" % (user_dir_path, user_dir_path)216 bind_mounts += " -b %s:%s" % (user_dir_path, user_dir_path)
217217
=== modified file 'python/libertine/Libertine.py'
--- python/libertine/Libertine.py 2016-05-11 17:26:27 +0000
+++ python/libertine/Libertine.py 2016-06-07 12:41:22 +0000
@@ -77,7 +77,9 @@
77 self.container_type = 'unknown'77 self.container_type = 'unknown'
78 self.container_id = container_id78 self.container_id = container_id
79 self.root_path = libertine.utils.get_libertine_container_rootfs_path(self.container_id)79 self.root_path = libertine.utils.get_libertine_container_rootfs_path(self.container_id)
80 self.default_packages = ['matchbox', 'libnss-extrausers', 'software-properties-common',80 self.default_packages = ['matchbox',
81 'libnss-extrausers',
82 'software-properties-common',
81 'humanity-icon-theme']83 'humanity-icon-theme']
8284
83 def create_libertine_container(self, password=None, multiarch=False, verbosity=1):85 def create_libertine_container(self, password=None, multiarch=False, verbosity=1):
@@ -148,7 +150,7 @@
148 self.run_in_container(apt_command_prefix(verbosity) + '--force-yes update')150 self.run_in_container(apt_command_prefix(verbosity) + '--force-yes update')
149 return self.run_in_container(apt_command_prefix(verbosity) + '--force-yes upgrade')151 return self.run_in_container(apt_command_prefix(verbosity) + '--force-yes upgrade')
150152
151 def install_package(self, package_name, verbosity=1, extra_apt_args=""):153 def install_package(self, package_name, verbosity=1, readline=False):
152 """154 """
153 Installs a named package in the container.155 Installs a named package in the container.
154156
@@ -163,16 +165,17 @@
163 self.run_in_container('dpkg -i ' +165 self.run_in_container('dpkg -i ' +
164 os.path.join('/', 'tmp', package_name.split('/')[-1]))166 os.path.join('/', 'tmp', package_name.split('/')[-1]))
165167
166 ret = self.run_in_container(apt_command_prefix(verbosity) +168 ret = self.run_in_container(apt_command_prefix(verbosity) + " install -f") == 0
167 extra_apt_args + " install -f") == 0
168169
169 if delete_package:170 if delete_package:
170 self.delete_package_in_container(package_name)171 self.delete_package_in_container(package_name)
171172
172 return ret173 return ret
173 else:174 else:
174 return self.run_in_container(apt_command_prefix(verbosity) +175 cmd = apt_command_prefix(verbosity) + " install '" + package_name + "'"
175 extra_apt_args + " install '" + package_name + "'") == 0176 if readline:
177 cmd = "env DEBIAN_FRONTEND=readline " + cmd
178 return self.run_in_container(cmd) == 0
176179
177 def configure_command(self, command, *args, verbosity=1):180 def configure_command(self, command, *args, verbosity=1):
178 """181 """
@@ -326,17 +329,17 @@
326 except RuntimeError as e:329 except RuntimeError as e:
327 return handle_runtime_error(e)330 return handle_runtime_error(e)
328331
329 def install_package(self, package_name, verbosity=1):332 def install_package(self, package_name, verbosity=1, readline=False):
330 """333 """
331 Installs a package in the container.334 Installs a package in the container.
332 """335 """
333 try:336 try:
334 with ContainerRunning(self.container):337 with ContainerRunning(self.container):
335 return self.container.install_package(package_name, verbosity)338 return self.container.install_package(package_name, verbosity, readline)
336 except RuntimeError as e:339 except RuntimeError as e:
337 return handle_runtime_error(e)340 return handle_runtime_error(e)
338341
339 def remove_package(self, package_name, verbosity=1):342 def remove_package(self, package_name, verbosity=1, readline=False):
340 """343 """
341 Removes a package from the container.344 Removes a package from the container.
342345
@@ -345,7 +348,10 @@
345 """348 """
346 try:349 try:
347 with ContainerRunning(self.container):350 with ContainerRunning(self.container):
348 if self.container.run_in_container(apt_command_prefix(verbosity) + "purge '" + package_name + "'") != 0:351 cmd = apt_command_prefix(verbosity) + " purge '" + package_name + "'"
352 if readline:
353 cmd = "env DEBIAN_FRONTEND=readline " + cmd
354 if self.container.run_in_container(cmd) != 0:
349 return False355 return False
350 return self.container.run_in_container(apt_command_prefix(verbosity) + "autoremove --purge") == 0356 return self.container.run_in_container(apt_command_prefix(verbosity) + "autoremove --purge") == 0
351 except RuntimeError as e:357 except RuntimeError as e:
352358
=== modified file 'python/libertine/LxcContainer.py'
--- python/libertine/LxcContainer.py 2016-05-11 17:26:27 +0000
+++ python/libertine/LxcContainer.py 2016-06-07 12:41:22 +0000
@@ -225,7 +225,7 @@
225 # Bind mount the user's home directory225 # Bind mount the user's home directory
226 self.container.append_config_item("lxc.mount.entry", home_entry)226 self.container.append_config_item("lxc.mount.entry", home_entry)
227227
228 xdg_user_dirs = ['Documents', 'Music', 'Pictures', 'Videos']228 xdg_user_dirs = utils.get_common_xdg_directories()
229229
230 for user_dir in xdg_user_dirs:230 for user_dir in xdg_user_dirs:
231 xdg_user_dir_entry = (231 xdg_user_dir_entry = (
232232
=== modified file 'python/libertine/utils.py'
--- python/libertine/utils.py 2016-04-06 19:14:10 +0000
+++ python/libertine/utils.py 2016-06-07 12:41:22 +0000
@@ -100,12 +100,29 @@
100 return dpkg.stdout.read().strip()100 return dpkg.stdout.read().strip()
101101
102102
103def get_common_xdg_directories():
104 return ['Documents', 'Music', 'Pictures', 'Videos', 'Downloads']
105
106
103def create_libertine_user_data_dir(container_id):107def create_libertine_user_data_dir(container_id):
104 user_data = get_libertine_container_userdata_dir_path(container_id)108 user_data = get_libertine_container_userdata_dir_path(container_id)
105109
106 if not os.path.exists(user_data):110 if not os.path.exists(user_data):
107 os.makedirs(user_data)111 os.makedirs(user_data)
108112
113 config_path = os.path.join(user_data, ".config", "dconf")
114
115 if not os.path.exists(config_path):
116 os.makedirs(config_path)
117
118 xdg_user_dirs = get_common_xdg_directories()
119
120 for xdg_dir in xdg_user_dirs:
121 xdg_path = os.path.join(user_data, xdg_dir)
122
123 if not os.path.exists(xdg_path):
124 os.makedirs(xdg_path)
125
109126
110def get_libertine_lxc_socket():127def get_libertine_lxc_socket():
111 return '\0libertine_lxc_socket'128 return '\0libertine_lxc_socket'
112129
=== modified file 'tools/CMakeLists.txt'
--- tools/CMakeLists.txt 2016-05-02 20:45:21 +0000
+++ tools/CMakeLists.txt 2016-06-07 12:41:22 +0000
@@ -5,3 +5,6 @@
5 COMPONENT doc)5 COMPONENT doc)
6install(PROGRAMS update-puritine-containers6install(PROGRAMS update-puritine-containers
7 DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libertine)7 DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libertine)
8
9install(FILES bash_completion.d/libertine-container-manager
10 DESTINATION ${DESTDIR}/etc/bash_completion.d)
811
=== added directory 'tools/bash_completion.d'
=== added file 'tools/bash_completion.d/libertine-container-manager'
--- tools/bash_completion.d/libertine-container-manager 1970-01-01 00:00:00 +0000
+++ tools/bash_completion.d/libertine-container-manager 2016-06-07 12:41:22 +0000
@@ -0,0 +1,72 @@
1# Copyright (C) 2016 Canonical Ltd.
2# Author: Larry Price <larry.price@canonical.com>
3
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; version 3 of the License.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16
17_libertine-container-manager()
18{
19 local cur cmd opts
20 COMPREPLY=()
21 cur="${COMP_WORDS[COMP_CWORD]}"
22 cmd="${COMP_WORDS[1]}"
23
24 if [[ ${cur} == -* ]]; then
25 case "${cmd}" in
26 "install-package" )
27 opts="--help --id --package --readline"
28 ;;
29 "remove-package" )
30 opts="--help --id --package --readline"
31 ;;
32 "create" )
33 opts="--help --id --type --distro --name --force --multiarch --password"
34 ;;
35 "destroy" )
36 opts="--help --id"
37 ;;
38 "search-cache" )
39 opts="--help --id --search-string"
40 ;;
41 "update" )
42 opts="--help --id"
43 ;;
44 "list-apps" )
45 opts="--help --id --json"
46 ;;
47 "list" )
48 opts="--help"
49 ;;
50 "configure" )
51 opts="--help --id --multiarch --add-archive --delete-archive"
52 ;;
53 * )
54 opts="--help --quiet --verbose"
55 ;;
56 esac
57 fi
58
59 if [[ ${cmd} == "configure" && "${COMP_WORDS[COMP_CWORD-1]}" == "--multiarch" ]]; then
60 opts="enable disable"
61 fi
62
63 if [[ -z ${opts} && "${COMP_CWORD}" == "1" ]]; then
64 opts="create destroy install-package remove-package search-cache update list list-apps configure"
65 fi
66
67 if [[ -n "${opts}" ]]; then
68 COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
69 return 0
70 fi
71}
72complete -F _libertine-container-manager libertine-container-manager
073
=== modified file 'tools/libertine-container-manager'
--- tools/libertine-container-manager 2016-05-11 17:26:27 +0000
+++ tools/libertine-container-manager 2016-06-07 12:41:22 +0000
@@ -305,6 +305,16 @@
305 return305 return
306306
307307
308def get_package_install_status(container_id, package_name):
309 container_list = read_container_config_file()
310
311 for container in container_list['containerList']:
312 if container['id'] == container_id:
313 for package in container['installedApps']:
314 if package['packageName'] == package_name:
315 return package['appStatus']
316
317
308def add_new_package(container_id, package_name):318def add_new_package(container_id, package_name):
309 container_list = read_container_config_file()319 container_list = read_container_config_file()
310320
@@ -392,6 +402,14 @@
392 update_container_install_status(args.id, "ready")402 update_container_install_status(args.id, "ready")
393403
394404
405def destroy_container_by_id(id):
406 container = LibertineContainer(id)
407 update_container_install_status(id, "removing")
408 container.destroy_libertine_container()
409 update_container_install_status(id, "removed")
410 delete_container(id)
411
412
395def destroy(args):413def destroy(args):
396 if args.id and not libertine.utils.container_exists(args.id):414 if args.id and not libertine.utils.container_exists(args.id):
397 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)415 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
@@ -399,11 +417,7 @@
399 elif not args.id:417 elif not args.id:
400 args.id = get_default_container_id()418 args.id = get_default_container_id()
401419
402 container = LibertineContainer(args.id)420 destroy_container_by_id(args.id)
403 update_container_install_status(args.id, "removing")
404 container.destroy_libertine_container()
405 update_container_install_status(args.id, "removed")
406 delete_container(args.id)
407421
408422
409def install_package(args):423def install_package(args):
@@ -434,13 +448,28 @@
434 container = LibertineContainer(args.id)448 container = LibertineContainer(args.id)
435449
436 update_package_install_status(args.id, package, "installing")450 update_package_install_status(args.id, package, "installing")
437 if not container.install_package(args.package, args.verbosity):451 if not container.install_package(args.package, args.verbosity, args.readline):
438 delete_package(args.id, package)452 delete_package(args.id, package)
439 sys.exit(1)453 sys.exit(1)
440454
441 update_package_install_status(args.id, package, "installed")455 update_package_install_status(args.id, package, "installed")
442456
443457
458def remove_package_by_name(container_id, package_name, verbosity=1, readline=False):
459 fallback_status = get_package_install_status(container_id, package_name)
460 update_package_install_status(container_id, package_name, "removing")
461
462 container = LibertineContainer(container_id)
463 if not container.remove_package(package_name, verbosity, readline):
464 update_package_install_status(container_id, package_name, fallback_status)
465 return False
466
467 update_package_install_status(container_id, package_name, "removed")
468 delete_package(container_id, package_name)
469
470 return True
471
472
444def remove_package(args):473def remove_package(args):
445 if args.id and not libertine.utils.container_exists(args.id):474 if args.id and not libertine.utils.container_exists(args.id):
446 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)475 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
@@ -448,21 +477,13 @@
448 elif not args.id:477 elif not args.id:
449 args.id = get_default_container_id()478 args.id = get_default_container_id()
450479
451 if not package_exists(args.id, args.package):480 if get_package_install_status(args.id, args.package) != 'installed':
452 print("Package \'%s\' is not installed." % args.package)481 print("Package \'%s\' is not installed." % args.package)
453 sys.exit(1)482 sys.exit(1)
454483
455 container = LibertineContainer(args.id)484 if not remove_package_by_name(args.id, args.package, args.verbosity, args.readline):
456 update_package_install_status(args.id, args.package, "removing")
457
458 if not container.remove_package(args.package, args.verbosity):
459 update_package_install_status(args.id, args.package, "installed")
460 sys.exit(1)485 sys.exit(1)
461486
462 update_package_install_status(args.id, args.package, "removed")
463
464 delete_package(args.id, args.package)
465
466487
467def search_cache(args):488def search_cache(args):
468 if args.id and not libertine.utils.container_exists(args.id):489 if args.id and not libertine.utils.container_exists(args.id):
@@ -523,6 +544,14 @@
523 sys.exit(1)544 sys.exit(1)
524545
525546
547def delete_archive_by_name(container_id, archive_name):
548 update_archive_install_status(container_id, archive_name, 'removing')
549 if LibertineContainer(container_id).configure_command('delete-archive', archive_name) is not 0:
550 return False
551 delete_container_archive(container_id, archive_name)
552 return True
553
554
526def configure(args):555def configure(args):
527 if args.id and not libertine.utils.container_exists(args.id):556 if args.id and not libertine.utils.container_exists(args.id):
528 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)557 print("Container id \'%s\' does not exist." % args.id, file=sys.stderr)
@@ -565,17 +594,30 @@
565 print("%s is not added in container." % args.delete_archive)594 print("%s is not added in container." % args.delete_archive)
566 sys.exit(1)595 sys.exit(1)
567596
568 update_archive_install_status(args.id, args.delete_archive, 'removing')597 if not delete_archive_by_name(args.id, args.delete_archive):
569 if container.configure_command('delete-archive', args.delete_archive) is not 0:
570 sys.exit(1)598 sys.exit(1)
571599
572 delete_container_archive(args.id, args.delete_archive)
573
574600
575def merge(args):601def merge(args):
576 merge_container_config_files(args.file)602 merge_container_config_files(args.file)
577603
578604
605def fix_integrity(args):
606 for container in read_container_config_file()['containerList']:
607 if container['installStatus'] != 'ready':
608 destroy_container_by_id(container['id'])
609 continue
610 LibertineContainer(container['id']).exec_command('dpkg --configure -a')
611
612 for package in container['installedApps']:
613 if package['appStatus'] != 'installed':
614 remove_package_by_name(container['id'], package['packageName'])
615 if 'extraArchives' in container:
616 for archive in container['extraArchives']:
617 if archive['archiveStatus'] != 'installed':
618 delete_archive_by_name(container['id'], archive['archiveName'])
619
620
579if __name__ == '__main__':621if __name__ == '__main__':
580 parser = argparse.ArgumentParser(description="Legacy X application support for Unity 8")622 parser = argparse.ArgumentParser(description="Legacy X application support for Unity 8")
581623
@@ -644,6 +686,9 @@
644 parser_install.add_argument(686 parser_install.add_argument(
645 '-i', '--id',687 '-i', '--id',
646 help=("Container identifier. Default container is used if omitted."))688 help=("Container identifier. Default container is used if omitted."))
689 parser_install.add_argument(
690 '-r', '--readline', action='store_true',
691 help=("Readline mode. Use text-based frontend during debconf interactions."))
647 parser_install.set_defaults(func=install_package)692 parser_install.set_defaults(func=install_package)
648693
649 # Handle the remove-package command and its options694 # Handle the remove-package command and its options
@@ -657,6 +702,9 @@
657 parser_remove.add_argument(702 parser_remove.add_argument(
658 '-i', '--id',703 '-i', '--id',
659 help=("Container identifier. Default container is used if omitted."))704 help=("Container identifier. Default container is used if omitted."))
705 parser_remove.add_argument(
706 '-r', '--readline', action='store_true',
707 help=("Readline mode. Use text-based frontend during debconf interactions."))
660 parser_remove.set_defaults(func=remove_package)708 parser_remove.set_defaults(func=remove_package)
661709
662 # Handle the search-cache command and its options710 # Handle the search-cache command and its options
@@ -747,6 +795,12 @@
747 required=True)795 required=True)
748 parser_merge.set_defaults(func=merge)796 parser_merge.set_defaults(func=merge)
749797
798 # Indiscriminately destroy containers, packages, and archives which are not fully installed
799 parser_integrity = subparsers.add_parser(
800 'fix-integrity',
801 add_help=False)
802 parser_integrity.set_defaults(func=fix_integrity)
803
750 # Actually parse the args804 # Actually parse the args
751 args = parser.parse_args()805 args = parser.parse_args()
752 if args.verbosity is None:806 if args.verbosity is None:
753807
=== modified file 'tools/libertine-launch'
--- tools/libertine-launch 2016-05-05 20:41:46 +0000
+++ tools/libertine-launch 2016-06-07 12:41:22 +0000
@@ -25,18 +25,36 @@
25from libertine import LibertineContainer25from libertine import LibertineContainer
2626
2727
28def set_dbus_session_socket_path():28def get_session_socket_path(session_socket_name):
29 unique_id = os.environ['DISPLAY'].strip(':')29 unique_id = os.environ['DISPLAY'].strip(':')
3030
31 if not os.path.exists(libertine.utils.get_libertine_runtime_dir()):31 if not os.path.exists(libertine.utils.get_libertine_runtime_dir()):
32 os.makedirs(libertine.utils.get_libertine_runtime_dir())32 os.makedirs(libertine.utils.get_libertine_runtime_dir())
3333
34 dbus_session_socket_path = (34 session_socket_path = (
35 os.path.join(libertine.utils.get_libertine_runtime_dir(), 'host_dbus_session' + unique_id))35 os.path.join(libertine.utils.get_libertine_runtime_dir(), session_socket_name + unique_id))
3636
37 os.environ['DBUS_SESSION_BUS_ADDRESS'] = "unix:path=" + dbus_session_socket_path37 return session_socket_path
3838
39 return dbus_session_socket_path39
40def get_dbus_session_socket_path():
41 return get_session_socket_path('host_dbus_session')
42
43
44def get_maliit_session_socket_path():
45 return get_session_socket_path('host_maliit_session')
46
47
48def set_env_socket_path(session_socket_path, session_env):
49 os.environ[session_env] = "unix:path=" + session_socket_path
50
51
52def set_dbus_env_socket_path(socket_path):
53 set_env_socket_path(socket_path, 'DBUS_SESSION_BUS_ADDRESS')
54
55
56def set_maliit_env_socket_path(socket_path):
57 set_env_socket_path(socket_path, 'MALIIT_SERVER_ADDRESS')
4058
4159
42def launch_libertine_session_bridge(session_socket_path):60def launch_libertine_session_bridge(session_socket_path):
@@ -74,11 +92,17 @@
74 if e in os.environ:92 if e in os.environ:
75 del os.environ[e]93 del os.environ[e]
7694
77 session_socket_path = set_dbus_session_socket_path()95 dbus_socket_path = get_dbus_session_socket_path()
7896 maliit_socket_path = get_maliit_session_socket_path()
79 session_bridge = launch_libertine_session_bridge(session_socket_path)97 session_bridge_arguments = dbus_socket_path + ' ' + maliit_socket_path
8098
81 detect_session_bridge_socket(session_socket_path)99 session_bridge = launch_libertine_session_bridge(session_bridge_arguments)
100
101 set_dbus_env_socket_path(dbus_socket_path)
102 set_maliit_env_socket_path(maliit_socket_path)
103
104 # should detect the maliit socket, but dont know if its around or not here.
105 detect_session_bridge_socket(dbus_socket_path)
82106
83 container = LibertineContainer(args.container_id) 107 container = LibertineContainer(args.container_id)
84108
85109
=== modified file 'tools/libertine-session-bridge'
--- tools/libertine-session-bridge 2016-02-04 20:23:58 +0000
+++ tools/libertine-session-bridge 2016-06-07 12:41:22 +0000
@@ -1,5 +1,6 @@
1#!/usr/bin/python31#!/usr/bin/python3
22
3import dbus
3import libertine.utils4import libertine.utils
4import os5import os
5import select6import select
@@ -9,15 +10,15 @@
9from socket import *10from socket import *
1011
1112
12def accept_new_connection():13def accept_new_connection(host_adder, container_sock):
13 newconn = container_dbus_session_sock.accept()[0]14 newconn = container_sock.accept()[0]
14 descriptors.append(newconn)15 descriptors.append(newconn)
1516
16 host_dbus_session_sock = socket(AF_UNIX, SOCK_STREAM)17 host_sock = socket(AF_UNIX, SOCK_STREAM)
17 host_dbus_session_sock.connect(host_dbus_session_addr)18 host_sock.connect(host_adder)
18 descriptors.append(host_dbus_session_sock)19 descriptors.append(host_sock)
1920
20 socket_pairs.append([newconn, host_dbus_session_sock])21 socket_pairs.append([newconn, host_sock])
2122
2223
23def get_socket_pair(socket):24def get_socket_pair(socket):
@@ -57,6 +58,26 @@
57 j.close()58 j.close()
5859
5960
61def get_host_maliit_socket():
62 address_bus_name = "org.maliit.server"
63 address_object_path = "/org/maliit/server/address"
64 address_interface = "org.maliit.Server.Address"
65 address_property = "address"
66
67 session_bus = dbus.SessionBus()
68 maliit_object = session_bus.get_object('org.maliit.server', '/org/maliit/server/address')
69
70 interface = dbus.Interface(maliit_object, dbus.PROPERTIES_IFACE)
71 address = interface.Get('org.maliit.Server.Address', 'address')
72
73 partition_key = 'unix:abstract='
74 address = address.split(',')[0]
75 address = address.partition(partition_key)[2]
76 address = "\0%s" % address
77
78 return address
79
80
60def get_host_dbus_socket():81def get_host_dbus_socket():
61 socket_key = "DBUS_SESSION_BUS_ADDRESS=unix:abstract="82 socket_key = "DBUS_SESSION_BUS_ADDRESS=unix:abstract="
6283
@@ -73,9 +94,13 @@
7394
7495
75def socket_cleanup(signum, frame):96def socket_cleanup(signum, frame):
76 container_dbus_session_sock.close()97 for socket in descriptors:
98 socket.close()
99
77 close_all_connections()100 close_all_connections()
78 os.remove(dbus_session_socket_path)101
102 for socket_path in session_socket_paths:
103 os.remove(socket_path)
79104
80105
81def main_loop():106def main_loop():
@@ -94,8 +119,8 @@
94 if sock.fileno() == -1:119 if sock.fileno() == -1:
95 continue120 continue
96121
97 if sock == container_dbus_session_sock:122 if sock in host_session_socket_path_map:
98 accept_new_connection()123 accept_new_connection(host_session_socket_path_map[sock], sock)
99124
100 else:125 else:
101 data = sock.recv(4096)126 data = sock.recv(4096)
@@ -118,14 +143,54 @@
118 totalsent = totalsent + sent143 totalsent = totalsent + sent
119144
120145
121dbus_session_socket_path = sys.argv[1]146def create_socket(session_socket_path):
122147 try:
123container_dbus_session_sock = socket(AF_UNIX, SOCK_STREAM)148 sock = socket(AF_UNIX, SOCK_STREAM)
124container_dbus_session_sock.bind(dbus_session_socket_path)149 except:
125container_dbus_session_sock.listen(5)150 sock = None
126151 else:
127host_dbus_session_addr = get_host_dbus_socket()152 try:
128descriptors = [container_dbus_session_sock]153 sock.bind(session_socket_path)
154 sock.listen(5)
155 except:
156 sock.close()
157 sock = None
158 else:
159 return sock
160
161 return None
162
163
164def create_container_socket(session_socket_path, get_host_session_path_function):
165 container_session_sock = create_socket(session_socket_path)
166
167 if container_session_sock is not None:
168 try:
169 host_session_path = get_host_session_path_function()
170 except:
171 container_session_sock.close()
172 container_session_sock = None
173 raise
174 else:
175 host_session_socket_path_map.update({container_session_sock:host_session_path})
176
177 session_socket_paths.append(session_socket_path)
178 descriptors.append(container_session_sock)
179
180
181descriptors = []
182host_session_socket_path_map = {}
183session_socket_paths = []
184
185# Required sockets:
186create_container_socket(sys.argv[1], get_host_dbus_socket)
187
188# Optional sockets:
189try:
190 create_container_socket(sys.argv[2], get_host_maliit_socket)
191except:
192 pass
193
129socket_pairs = []194socket_pairs = []
130195
131main_loop()196main_loop()

Subscribers

People subscribed via source and target branches