Merge lp:~larryprice/libertine-scope/libertine-store-search into lp:libertine-scope

Proposed by Larry Price
Status: Needs review
Proposed branch: lp:~larryprice/libertine-scope/libertine-store-search
Merge into: lp:libertine-scope
Diff against target: 6037 lines (+4404/-376)
77 files modified
CMakeLists.txt (+7/-0)
data/CMakeLists.txt (+11/-17)
data/com.canonical.libertine.ContainerManager.service (+3/-0)
data/store.svg (+77/-0)
debian/control (+18/-2)
debian/libertine-scope.install (+4/-0)
debian/libertined.install (+8/-0)
debian/rules (+2/-2)
lib/CMakeLists.txt (+1/-0)
lib/libertine-scope/CMakeLists.txt (+19/-0)
lib/libertine-scope/action.cpp (+49/-0)
lib/libertine-scope/action.h (+46/-0)
lib/libertine-scope/i18n.h (+59/-0)
lib/libertine-scope/package.cpp (+54/-0)
lib/libertine-scope/package.h (+56/-0)
lib/libertine-scope/preview.cpp (+283/-0)
lib/libertine-scope/preview.h (+93/-0)
lib/libertine-scope/service_manager.cpp (+103/-0)
lib/libertine-scope/service_manager.h (+51/-0)
manifest.json.in (+1/-1)
po/en_AU.po (+86/-6)
po/en_GB.po (+86/-6)
po/es.po (+94/-8)
po/fi.po (+86/-6)
po/fr.po (+86/-6)
po/gl.po (+86/-6)
po/hu.po (+92/-6)
po/libertine-scope.pot (+84/-5)
po/ms.po (+86/-6)
po/pt.po (+86/-6)
po/uk.po (+86/-6)
scope/CMakeLists.txt (+1/-1)
scope/apps/CMakeLists.txt (+6/-6)
scope/apps/action.cpp (+16/-23)
scope/apps/action.h (+10/-10)
scope/apps/applauncher.cpp (+8/-10)
scope/apps/applauncher.h (+6/-2)
scope/apps/config.h.in (+2/-0)
scope/apps/libertine.cpp (+1/-0)
scope/apps/localization.h (+0/-31)
scope/apps/preview.cpp (+34/-54)
scope/apps/preview.h (+21/-16)
scope/apps/query.cpp (+93/-33)
scope/apps/query.h (+4/-1)
scope/apps/scope.cpp (+11/-16)
scope/store/CMakeLists.txt (+50/-0)
scope/store/entry_point.cpp (+42/-0)
scope/store/libertine-scope.ubuntu_libertine-store.ini.in.in (+10/-0)
scope/store/query.cpp (+149/-0)
scope/store/query.h (+70/-0)
scope/store/scope.cpp (+75/-0)
scope/store/scope.h (+77/-0)
service/CMakeLists.txt (+9/-0)
service/libertine_service/appstream.py (+80/-0)
service/libertine_service/apt.py (+106/-0)
service/libertine_service/container.py (+68/-0)
service/libertine_service/dbus.py (+184/-0)
service/libertine_service/tasks.py (+149/-0)
service/libertined (+89/-0)
tests/CMakeLists.txt (+7/-0)
tests/lib/CMakeLists.txt (+1/-0)
tests/lib/libertine-scope/CMakeLists.txt (+24/-0)
tests/lib/libertine-scope/mock_service_manager.h (+49/-0)
tests/lib/libertine-scope/test_action.cpp (+70/-0)
tests/lib/libertine-scope/test_package.cpp (+108/-0)
tests/lib/libertine-scope/test_preview.cpp (+292/-0)
tests/scope/CMakeLists.txt (+2/-0)
tests/scope/apps/CMakeLists.txt (+9/-8)
tests/scope/apps/fake_container.cpp (+1/-1)
tests/scope/apps/fake_libertine.cpp (+2/-2)
tests/scope/apps/scopefixture.h (+3/-3)
tests/scope/apps/test_action.cpp (+47/-12)
tests/scope/apps/test_preview.cpp (+254/-37)
tests/scope/apps/test_query.cpp (+64/-17)
tests/scope/apps/test_scope.cpp (+4/-4)
tests/scope/store/CMakeLists.txt (+23/-0)
tests/scope/store/test_query.cpp (+170/-0)
To merge this branch: bzr merge lp:~larryprice/libertine-scope/libertine-store-search
Reviewer Review Type Date Requested Status
Libertine CI Bot continuous-integration Approve
Brandon Schaefer (community) Approve
Christopher Townsend Approve
Review via email: mp+300596@code.launchpad.net

Commit message

Create libertine service and store scope with simple search.

Description of the change

Create libertine service and store scope with simple search.

DBus service written in python is called libertined. All it currently does is react to a "search" request with a query string. The libertine-store scope is just an entity which calls into the service to get results for its own search.

Neither of these new tools are in a position to be published.

To post a comment you must log in.
77. By Larry Price

removing merge cruft

78. By Larry Price

removing commented code from test

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

PASSED: Continuous integration, rev:76
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/47/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/191
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/151
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/151
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/151
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/151
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/151
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/151
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/148/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/194
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/172/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/172/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/172/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/172/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/172/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/172
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/172/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:78
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/48/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/192
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/152
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/152
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/152
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/152
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/152
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/152
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/149/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/195
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/180
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/180
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/180
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/173/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/173/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/173/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/173/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/173/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/173
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/173/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
79. By Larry Price

there is no price

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

PASSED: Continuous integration, rev:79
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/49/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/193
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/153
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/153
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/153
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/153
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/153
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/153
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/150/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/196
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/174/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/174/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/174/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/174/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/174/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/174
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/174/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
80. By Larry Price

merge

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

PASSED: Continuous integration, rev:80
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/54/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/209
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/169
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/169
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/169
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/169
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/169
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/169
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/159/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/212
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/196
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/196
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/196
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/190/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/190/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/190/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/190/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/190/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/190
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/190/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
81. By Larry Price

Merge

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

FAILED: Continuous integration, rev:81
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/58/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/219/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/165/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/222
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/207
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/207
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/207
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/200/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/200/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/200/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/200/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/200/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/200/console

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

review: Needs Fixing (continuous-integration)
82. By Larry Price

Moving new test files

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

FAILED: Continuous integration, rev:82
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/60/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/221
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/179
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/179
    FAILURE: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/179/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/179
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/167/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/224
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/209
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/209
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/209
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/202/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/202/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/202/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/202/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/202/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/202
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/202/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:82
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/62/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/223
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/181
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/181
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/169/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/226
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/211
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/211
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/211
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/204/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/204/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/204/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/204/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/204/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/204
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/204/artifact/output/*zip*/output.zip

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

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

A couple of initial comments:

Need to add the python dependencies in the control file.

Also, inline comment.

83. By Larry Price

adding deps to control file

84. By Larry Price

More updates to rules, control, and fixing store install dir

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

PASSED: Continuous integration, rev:84
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/64/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/228
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/186
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/186
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/186
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/186
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/186
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/186
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/173/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/216
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/216
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/216
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/209/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/209/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/209/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/209/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/209/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/209
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/209/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
85. By Larry Price

add python3-dev and fix libertine service install

86. By Larry Price

getting python to install correctly

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

FAILED: Continuous integration, rev:86
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/65/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/230/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/174/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/233
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/218
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/218
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/218
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/211/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/211/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/211/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/211/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/211/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/211/console

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

review: Needs Fixing (continuous-integration)
87. By Larry Price

Fixing python install script

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

PASSED: Continuous integration, rev:87
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/66/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/232
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/189
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/189
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/189
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/189
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/189
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/189
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/176/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/235
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/220
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/220
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/220
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/213/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/213/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/213/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/213/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/213/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/213
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/213/artifact/output/*zip*/output.zip

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

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

Some quick comments as I'm playing with this.

1. The search should accept terms that have a space in them such as "Tux Racer" (without quotes). Folks will want to search for actual program names. We agreed this would be fixed in a follow-on MP.
2. The search histories are shared between the Desktop Apps scope and Find XApps scope. They should be separate.
3. Need to change the name to something like "Find Desktop Apps" for naming consistency.

I'll add more comments as I go:)

88. By Larry Price

Merge

89. By Larry Price

Retitle to 'Find Desktop Apps'

90. By Larry Price

remove commented out header

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

FAILED: Continuous integration, rev:90
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/68/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/241/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/184/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/244
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/229
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/229
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/229
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/222
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/222/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/222
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/222/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/222/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/222
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/222/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/222
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/222/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/222/console

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

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

FAILED: Continuous integration, rev:90
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/69/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/242/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/185/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/245
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/230
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/230
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/230
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/223
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/223/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/223
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/223/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/223/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/223
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/223/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/223
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/223/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/223/console

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

review: Needs Fixing (continuous-integration)
91. By Larry Price

Merge

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

PASSED: Continuous integration, rev:91
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/72/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/281
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/231
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/231
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/214/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/283
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/267
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/267
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/267
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/260/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/260/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/260/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/260/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/260/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/260
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/260/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
92. By Larry Price

undo slibdeps change

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

PASSED: Continuous integration, rev:92
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/74/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/308
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/255
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/255
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/255
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/255
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/255
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/255
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/229/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/310
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/294
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/294
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/294
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/288/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/288/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/288/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/288/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/288/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/288
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/288/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
93. By Larry Price

Installing dbus service to hopefully start as needed

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

PASSED: Continuous integration, rev:93
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/75/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/309
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/256
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/256
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/256
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/256
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/256
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/256
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/230/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/311
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/295
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/295
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/295
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/289/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/289/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/289/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/289/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/289/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/289
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/289/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
94. By Larry Price

Debian install file for libertine-scope

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

PASSED: Continuous integration, rev:94
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/76/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/310
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/257
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/257
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/257
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/257
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/257
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/257
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/231/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/312
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/296
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/296
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/296
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/290/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/290/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/290/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/290/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/290/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/290
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/290/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
95. By Larry Price

Fixing sigterm handling and python3-dev deps

96. By Larry Price

deleting recursive log

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

PASSED: Continuous integration, rev:95
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/81/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/315
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/259
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/259
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/259
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/259
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/259
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/259
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/236/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/317
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/301
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/301
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/301
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/295/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/295/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/295/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/295/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/295/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/295
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/295/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:96
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/82/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/316
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/260
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/260
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/260
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/260
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/260
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/260
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/237/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/318
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/302
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/302
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/302
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/296/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/296/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/296/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/296/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/296/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/296
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/296/artifact/output/*zip*/output.zip

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

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

Just to capture what we've discussed thus far on IRC:

1. No results are returned the first time a search is done.
2. libertined crashes when sending it SIGTERM. (fixed)
3. python3-dev needs to be moved to Build-Depends. (fixed)
4. get_categories() should return an empty list.

97. By Larry Price

no fun, work, or pink here

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

PASSED: Continuous integration, rev:97
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/83/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/317
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/261
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/261
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/261
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/261
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/261
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/261
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/238/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/319
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/303
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/303
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/303
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/297/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/297/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/297/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/297/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/297/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/297
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/297/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
98. By Larry Price

Removing invalid isValid() call

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

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

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

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

Ok, I think I'm good with, but I'd like a second set of eyes on the code. Brandon is going to review as well.

review: Approve
Revision history for this message
Brandon Schaefer (brandontschaefer) wrote :

looks good to me (3 random inlines more or less comments/question noting really)

review: Approve
Revision history for this message
Larry Price (larryprice) wrote :

responding to inlines - thanks, guys!

Revision history for this message
Stephen M. Webb (bregma) wrote :

Couple of inline comments. I have not built and tested this MP.

Revision history for this message
Larry Price (larryprice) wrote :

inlines - just about to push minor fixes

99. By Larry Price

Fixing i18n pluralizer

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

FAILED: Continuous integration, rev:99
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/85/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/320/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/241/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/322
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/306
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/306
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/306
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/300/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/300/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/300/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/300/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/300/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/300/console

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

review: Needs Fixing (continuous-integration)
100. By Larry Price

Manipulate string such that there is no visible null character

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

FAILED: Continuous integration, rev:100
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/86/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/321/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/242/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/323
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/307
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/307
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/307
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/301
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/301/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/301
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/301/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/301/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/301
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/301/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/301
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/301/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/301/console

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

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

PASSED: Continuous integration, rev:100
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/87/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/329
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/263
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/263
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/263
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/263
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/263
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/263
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/249/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/331
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/314
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/314
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/314
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/313/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/313/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/313/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/313/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/313/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/313
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/313/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
101. By Larry Price

Create Preview pane with base information

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

PASSED: Continuous integration, rev:101
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/89/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/346
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/279
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/279
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/279
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/279
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/279
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/279
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/261/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/348
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/331
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/331
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/331
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/330/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/330/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/330/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/330/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/330/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/330
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/330/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
102. By Larry Price

Add AppStream backend for libertine service

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

PASSED: Continuous integration, rev:102
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/90/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/347
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/280
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/280
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/280
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/280
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/280
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/280
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/262/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/349
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/332
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/332
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/332
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/331/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/331/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/331/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/331/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/331/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/331
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/331/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
103. By Larry Price

Add link to Store in Apps Scope

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

PASSED: Continuous integration, rev:103
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/91/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/352
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/285
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/285
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/266/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/354
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/337
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/337
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/337
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/336/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/336/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/336/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/336/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/336/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/336
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/336/artifact/output/*zip*/output.zip

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

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

PASSED: Continuous integration, rev:103
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/92/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/353
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/286
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/286
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/267/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/355
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/338
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/338
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/338
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/337/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/337/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/337/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/337/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/337/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/337
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/337/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
104. By Larry Price

Install/remove functionality

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

PASSED: Continuous integration, rev:104
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/93/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/354
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/287
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/287
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/268/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/356
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/339
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/339
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/339
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/338/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/338/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/338/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/338/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/338/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/338
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/338/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
105. By Larry Price

Implement progress update architecture

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

PASSED: Continuous integration, rev:105
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/94/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/355
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/288
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/288
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/269/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/357
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/340
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/340
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/340
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/339/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/339/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/339/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/339/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/339/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/339
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/339/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
106. By Larry Price

Open apps from Store, commonize scope codes

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

FAILED: Continuous integration, rev:106
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/95/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/libertine/job/build/356/console
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/270/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/358
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/341
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/341
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/341
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/340/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/340/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/340/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/340/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/340/console
    FAILURE: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/340/console

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

review: Needs Fixing (continuous-integration)
107. By Larry Price

Removing URL_DISPATCHER

108. By Larry Price

Merge with lp:libertine-scope

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

PASSED: Continuous integration, rev:108
https://jenkins.canonical.com/libertine/job/lp-libertine-scope-ci/96/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/libertine/job/build/357
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=vivid+overlay,testname=default/289
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=xenial+overlay,testname=default/289
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=amd64,release=yakkety,testname=default/289
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=vivid+overlay,testname=default/289
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=xenial+overlay,testname=default/289
    SUCCESS: https://jenkins.canonical.com/libertine/job/test-0-autopkgtest/label=i386,release=yakkety,testname=default/289
    None: https://jenkins.canonical.com/libertine/job/lp-generic-update-mp/271/console
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-0-fetch/359
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=vivid+overlay/342
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=xenial+overlay/342
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-1-sourcepkg/release=yakkety/342
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=vivid+overlay/341/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=xenial+overlay/341/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=amd64,release=yakkety/341/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=vivid+overlay/341/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=xenial+overlay/341/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/341
        deb: https://jenkins.canonical.com/libertine/job/build-2-binpkg/arch=i386,release=yakkety/341/artifact/output/*zip*/output.zip

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

review: Approve (continuous-integration)
Revision history for this message
Larry Price (larryprice) wrote :

For this series, I need to split up the dbus service and the scope. The dbus service will potentially be used by the snap store, while the scope portions will potentially be dropped. A bit blurry so far, so this branch does not need to be thrown out quite yet.

Unmerged revisions

108. By Larry Price

Merge with lp:libertine-scope

107. By Larry Price

Removing URL_DISPATCHER

106. By Larry Price

Open apps from Store, commonize scope codes

105. By Larry Price

Implement progress update architecture

104. By Larry Price

Install/remove functionality

103. By Larry Price

Add link to Store in Apps Scope

102. By Larry Price

Add AppStream backend for libertine service

101. By Larry Price

Create Preview pane with base information

100. By Larry Price

Manipulate string such that there is no visible null character

99. By Larry Price

Fixing i18n pluralizer

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2016-08-01 13:24:26 +0000
3+++ CMakeLists.txt 2016-09-23 14:36:26 +0000
4@@ -29,15 +29,20 @@
5 find_package(PkgConfig REQUIRED)
6 find_package(Intltool)
7 find_package(Qt5Core REQUIRED)
8+find_package(Qt5DBus REQUIRED)
9 find_program(INTLTOOL_MERGE intltool-merge)
10
11 # useful variables
12 set(APPS_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/unity-scopes/libertine-scope/)
13 set(APPS_DATA_DIR ${CMAKE_INSTALL_FULL_DATADIR}/unity/scopes/libertine-scope/)
14+set(STORE_LIB_DIR ${CMAKE_INSTALL_FULL_LIBDIR}/unity-scopes/libertine-scope/)
15 set(SCOPE_NAME "libertine-scope")
16 set(SCOPE_DISPLAY_NAME "Desktop Apps")
17 set(PACKAGE_NAME "libertine-scope.ubuntu")
18 set(FULLY_QUALIFIED_NAME "${PACKAGE_NAME}_${SCOPE_NAME}")
19+set(STORE_SCOPE_NAME "libertine-store")
20+set(STORE_PACKAGE_NAME "libertine-scope.ubuntu_${STORE_SCOPE_NAME}")
21+set(SCOPE_LIB_NAME "libertine-scope")
22 option(CLICK_MODE "Installs to a contained location" off)
23
24 add_definitions(-DSCOPE_NAME="${SCOPE_NAME}")
25@@ -88,7 +93,9 @@
26 endif()
27
28 # Add our main directories
29+add_subdirectory(lib)
30 add_subdirectory(scope)
31+add_subdirectory(service)
32 add_subdirectory(data)
33 add_subdirectory(po)
34
35
36=== modified file 'data/CMakeLists.txt'
37--- data/CMakeLists.txt 2016-07-19 17:56:58 +0000
38+++ data/CMakeLists.txt 2016-09-23 14:36:26 +0000
39@@ -1,17 +1,11 @@
40-# Put the ini files in the build directory next to the scope
41-# .so file so that the test tools can find them.
42-
43-# Install the scope images
44-install(
45- FILES
46- "apps.png"
47- DESTINATION
48- ${APPS_DATA_DIR}
49-)
50-
51-install(
52- FILES
53- "blacklist"
54- DESTINATION
55- ${SCOPE_INSTALL_DIR}
56-)
57+# Copy data files into apps scope dir for dev
58+file(COPY store.svg blacklist DESTINATION ${CMAKE_BINARY_DIR}/scope/apps/)
59+
60+install(FILES apps.png apps.svg
61+ DESTINATION ${APPS_DATA_DIR})
62+
63+install(FILES blacklist store.svg
64+ DESTINATION ${SCOPE_INSTALL_DIR})
65+
66+install(FILES com.canonical.libertine.ContainerManager.service
67+ DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/services)
68
69=== added file 'data/com.canonical.libertine.ContainerManager.service'
70--- data/com.canonical.libertine.ContainerManager.service 1970-01-01 00:00:00 +0000
71+++ data/com.canonical.libertine.ContainerManager.service 2016-09-23 14:36:26 +0000
72@@ -0,0 +1,3 @@
73+[D-BUS Service]
74+Name=com.canonical.libertine.ContainerManager
75+Exec=/usr/bin/libertined
76
77=== added file 'data/store.svg'
78--- data/store.svg 1970-01-01 00:00:00 +0000
79+++ data/store.svg 2016-09-23 14:36:26 +0000
80@@ -0,0 +1,77 @@
81+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
82+<!-- Created with Inkscape (http://www.inkscape.org/) -->
83+
84+<svg
85+ xmlns:dc="http://purl.org/dc/elements/1.1/"
86+ xmlns:cc="http://creativecommons.org/ns#"
87+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
88+ xmlns:svg="http://www.w3.org/2000/svg"
89+ xmlns="http://www.w3.org/2000/svg"
90+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
91+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
92+ width="351.27005mm"
93+ height="433.59958mm"
94+ viewBox="0 0 1244.6577 1536.3765"
95+ id="svg3637"
96+ version="1.1"
97+ inkscape:version="0.91 r13725"
98+ sodipodi:docname="store.svg">
99+ <defs
100+ id="defs3639" />
101+ <sodipodi:namedview
102+ id="base"
103+ pagecolor="#00ffff"
104+ bordercolor="#666666"
105+ borderopacity="1.0"
106+ inkscape:pageopacity="0"
107+ inkscape:pageshadow="2"
108+ inkscape:zoom="0.24748737"
109+ inkscape:cx="-563.75562"
110+ inkscape:cy="519.26806"
111+ inkscape:document-units="px"
112+ inkscape:current-layer="layer1"
113+ showgrid="false"
114+ inkscape:window-width="1920"
115+ inkscape:window-height="1056"
116+ inkscape:window-x="1920"
117+ inkscape:window-y="24"
118+ inkscape:window-maximized="1"
119+ fit-margin-left="118.5"
120+ fit-margin-right="118.5"
121+ fit-margin-top="120"
122+ fit-margin-bottom="180" />
123+ <metadata
124+ id="metadata3642">
125+ <rdf:RDF>
126+ <cc:Work
127+ rdf:about="">
128+ <dc:format>image/svg+xml</dc:format>
129+ <dc:type
130+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
131+ <dc:title></dc:title>
132+ </cc:Work>
133+ </rdf:RDF>
134+ </metadata>
135+ <g
136+ inkscape:label="Layer 1"
137+ inkscape:groupmode="layer"
138+ id="layer1"
139+ transform="translate(-388.21849,836.02937)">
140+ <g
141+ id="g3343"
142+ transform="matrix(0.74113597,0,0,0.78153068,321.48718,23.928691)">
143+ <path
144+ transform="translate(229.97523,-735.66029)"
145+ inkscape:connector-curvature="0"
146+ id="path3734"
147+ d="m 435.93411,771.50865 c 5.13251,-7.46428 23.15091,-32.85714 40.04089,-56.42857 16.88998,-23.57143 36.65936,-51.21428 43.93196,-61.42857 7.2726,-10.21428 21.97523,-30.46508 32.67251,-45.00177 10.69727,-14.53669 27.61176,-38.11043 37.58774,-52.38611 9.97598,-14.27566 24.24529,-34.14652 31.70958,-44.15743 7.46428,-10.01089 13.57143,-19.48897 13.57143,-21.06235 0,-2.71828 -17.5498,-29.26911 -81.37207,-123.10662 -15.49738,-22.78572 -40.3902,-59.42858 -55.31738,-81.42858 -14.92718,-22 -35.00329,-51.57142 -44.61358,-65.71428 -9.6103,-14.14286 -19.70681,-29.25 -22.4367,-33.57143 l -4.96343,-7.85714 65.44846,0 65.44845,0 33.90313,50.17117 c 18.64671,27.59414 35.20443,52.34414 36.79492,55 4.96144,8.28476 14.04967,21.90535 15.61363,23.40026 5.56962,5.32368 80.066,120.17946 80.066,123.44281 0,2.24606 -7.49798,14.28313 -16.66215,26.74904 -31.75367,43.19412 -68.03182,92.82957 -153.20253,209.6104 l -85.57896,117.3406 -20.98687,0 -20.98687,0 9.33184,-13.57143 z"
148+ style="fill:#ffffff" />
149+ <path
150+ transform="translate(229.97523,-735.66029)"
151+ inkscape:connector-curvature="0"
152+ id="path3736"
153+ d="m 831.21335,770.08008 c -5.66053,-8.25 -20.06228,-29.14285 -32.00388,-46.42857 -11.9416,-17.28571 -38.73039,-56.5 -59.53064,-87.14286 -20.80026,-30.64285 -44.68152,-65.72971 -53.06948,-77.97082 -13.98989,-20.41635 -14.92937,-22.77866 -11.36275,-28.57143 2.13845,-3.47317 18.80864,-26.80949 37.04485,-51.85846 18.23622,-25.04895 38.94248,-53.61705 46.01391,-63.48466 7.07143,-9.86761 23.78571,-33.00848 37.14286,-51.42417 13.35714,-18.41568 28.87474,-39.99043 34.48356,-47.9439 5.60881,-7.95346 26.18024,-36.33887 45.71429,-63.07868 19.53404,-26.73982 39.227,-54.06125 43.76215,-60.71429 l 8.24572,-12.09644 22.55911,0 22.55911,0 -8.89011,12.14285 c -12.05808,16.46994 -89.78558,123.80437 -110.17606,152.14286 -16.77918,23.31954 -41.38224,57.29953 -74.11675,102.36479 l -18.32072,25.22193 59.10118,87.6352 c 32.50564,48.19937 70.71004,104.99237 84.89866,126.20665 14.18861,21.21429 26.78352,39 27.98867,39.5238 1.20515,0.52383 2.19119,1.99846 2.19119,3.277 0,1.27855 8.43058,14.6714 18.73463,29.76192 l 18.73462,27.43728 -65.70612,0 -65.70611,0 -10.29189,-15 z"
154+ style="fill:#ffffff" />
155+ </g>
156+ </g>
157+</svg>
158
159=== modified file 'debian/control'
160--- debian/control 2016-07-13 17:26:54 +0000
161+++ debian/control 2016-09-23 14:36:26 +0000
162@@ -10,11 +10,12 @@
163 google-mock,
164 intltool,
165 libunity-scopes-dev (>= 1.0.0),
166- liburl-dispatcher1-dev,
167 libubuntu-app-launch2-dev,
168 liblibertine-dev,
169 pkg-config,
170- qtbase5-dev
171+ qtbase5-dev,
172+ libqt5dbus5 (>= 5.4.1),
173+ python3-dev
174 Standards-Version: 3.9.6
175 Homepage: https://launchpad.net/libertine-scope
176 Vcs-Bzr: https://code.launchpad.net/~libertine-team/libertine-scope/devel
177@@ -23,6 +24,7 @@
178 Package: libertine-scope
179 Architecture: any
180 Depends: libertine-tools,
181+ libertined,
182 ${misc:Depends},
183 ${shlibs:Depends}
184 Description: Libertine packages scope for Unity
185@@ -31,3 +33,17 @@
186 still waiting to be ported natively to Unity.
187 .
188 This package provides the Libertine scope itself.
189+
190+Package: libertined
191+Architecture: any
192+Depends: python3-libertine,
193+ python3-apt (>= 0.9.3),
194+ python3-dbus (>= 1.2.0),
195+ appstream,
196+ gir1.2-appstream,
197+ ${python3:Depends}
198+Description: Libertine packages scope for Unity
199+ The libertined package provides the d-bus service for finding and
200+ maintaining deb-packaged X11-based legacy software.
201+ .
202+ This package provides the libertined service.
203
204=== added file 'debian/libertine-scope.install'
205--- debian/libertine-scope.install 1970-01-01 00:00:00 +0000
206+++ debian/libertine-scope.install 2016-09-23 14:36:26 +0000
207@@ -0,0 +1,4 @@
208+usr/lib/*/unity-scopes/*
209+usr/share/unity/scopes/libertine-scope/*png
210+usr/share/unity/scopes/libertine-scope/*svg
211+usr/share/locale/*/LC_MESSAGES/libertine-scope.mo
212
213=== added file 'debian/libertined.install'
214--- debian/libertined.install 1970-01-01 00:00:00 +0000
215+++ debian/libertined.install 2016-09-23 14:36:26 +0000
216@@ -0,0 +1,8 @@
217+usr/share/dbus-1/services/com.canonical.libertine.ContainerManager.service
218+usr/bin/libertined
219+usr/lib/python*/*/libertine_service/__init__.py
220+usr/lib/python*/*/libertine_service/appstream.py
221+usr/lib/python*/*/libertine_service/apt.py
222+usr/lib/python*/*/libertine_service/container.py
223+usr/lib/python*/*/libertine_service/dbus.py
224+usr/lib/python*/*/libertine_service/tasks.py
225
226=== modified file 'debian/rules'
227--- debian/rules 2016-06-28 17:15:54 +0000
228+++ debian/rules 2016-09-23 14:36:26 +0000
229@@ -1,7 +1,7 @@
230-#!/usr/bin/make -f
231+#!/usr/bin/make -f
232
233 %:
234- dh $@
235+ dh $@ --with python3
236
237 override_dh_auto_build:
238 dh_auto_build -- all translations
239
240=== added directory 'lib'
241=== added file 'lib/CMakeLists.txt'
242--- lib/CMakeLists.txt 1970-01-01 00:00:00 +0000
243+++ lib/CMakeLists.txt 2016-09-23 14:36:26 +0000
244@@ -0,0 +1,1 @@
245+add_subdirectory(libertine-scope)
246
247=== added directory 'lib/libertine-scope'
248=== added file 'lib/libertine-scope/CMakeLists.txt'
249--- lib/libertine-scope/CMakeLists.txt 1970-01-01 00:00:00 +0000
250+++ lib/libertine-scope/CMakeLists.txt 2016-09-23 14:36:26 +0000
251@@ -0,0 +1,19 @@
252+SET (CMAKE_INCLUDE_CURRENT_DIR ON)
253+SET (CMAKE_AUTOMOC ON)
254+
255+add_library(${SCOPE_LIB_NAME} STATIC
256+ preview.cpp
257+ service_manager.cpp
258+ package.cpp
259+ action.cpp
260+)
261+
262+include_directories(
263+ ${CMAKE_SOURCE_DIR}/lib
264+)
265+
266+target_link_libraries (${SCOPE_LIB_NAME}
267+ ${SCOPE_LDFLAGS}
268+ Qt5::Core
269+ Qt5::DBus
270+)
271
272=== added file 'lib/libertine-scope/action.cpp'
273--- lib/libertine-scope/action.cpp 1970-01-01 00:00:00 +0000
274+++ lib/libertine-scope/action.cpp 2016-09-23 14:36:26 +0000
275@@ -0,0 +1,49 @@
276+/*
277+ * Copyright (C) 2016 Canonical Ltd
278+ *
279+ * This program is free software: you can redistribute it and/or modify
280+ * it under the terms of the GNU General Public License version 3 as
281+ * published by the Free Software Foundation.
282+ *
283+ * This program is distributed in the hope that it will be useful,
284+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
285+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
286+ * GNU General Public License for more details.
287+ *
288+ * You should have received a copy of the GNU General Public License
289+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
290+ */
291+#include "libertine-scope/action.h"
292+
293+#include "libertine-scope/service_manager.h"
294+
295+
296+libertine::scope::Action::
297+Action(unity::scopes::Result const& result,
298+ unity::scopes::ActionMetadata const& metadata,
299+ std::string const& action_id,
300+ std::shared_ptr<ServiceManager> const& service_manager)
301+ : ActivationQueryBase(result, metadata)
302+ , action_id_(action_id)
303+ , service_(service_manager)
304+{ }
305+
306+
307+unity::scopes::ActivationResponse libertine::scope::Action::
308+activate()
309+{
310+ if (action_id_ == "open")
311+ {
312+ return unity::scopes::ActivationResponse(unity::scopes::ActivationResponse::Status::NotHandled);
313+ }
314+
315+ if (action_id_ == "install")
316+ {
317+ service_->install(QString::fromStdString(result()["id"].get_string()));
318+ }
319+ else if (action_id_ == "remove")
320+ {
321+ service_->remove(QString::fromStdString(result()["id"].get_string()));
322+ }
323+ return unity::scopes::ActivationResponse(unity::scopes::ActivationResponse::Status::ShowPreview);
324+}
325
326=== added file 'lib/libertine-scope/action.h'
327--- lib/libertine-scope/action.h 1970-01-01 00:00:00 +0000
328+++ lib/libertine-scope/action.h 2016-09-23 14:36:26 +0000
329@@ -0,0 +1,46 @@
330+/*
331+ * Copyright (C) 2016 Canonical Ltd
332+ *
333+ * This program is free software: you can redistribute it and/or modify
334+ * it under the terms of the GNU General Public License version 3 as
335+ * published by the Free Software Foundation.
336+ *
337+ * This program is distributed in the hope that it will be useful,
338+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
339+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
340+ * GNU General Public License for more details.
341+ *
342+ * You should have received a copy of the GNU General Public License
343+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
344+ */
345+
346+#pragma once
347+
348+#include <unity/scopes/ActivationQueryBase.h>
349+
350+
351+namespace libertine
352+{
353+namespace scope
354+{
355+
356+class ServiceManager;
357+
358+class Action : public unity::scopes::ActivationQueryBase
359+{
360+public:
361+ explicit Action(unity::scopes::Result const& result,
362+ unity::scopes::ActionMetadata const& metadata,
363+ std::string const& action_id,
364+ std::shared_ptr<ServiceManager> const& service_manager);
365+
366+ virtual ~Action() = default;
367+
368+ virtual unity::scopes::ActivationResponse activate() override;
369+
370+private:
371+ std::string action_id_;
372+ std::shared_ptr<ServiceManager> service_;
373+};
374+} // namespace libertine
375+} // namespace scope
376
377=== added file 'lib/libertine-scope/i18n.h'
378--- lib/libertine-scope/i18n.h 1970-01-01 00:00:00 +0000
379+++ lib/libertine-scope/i18n.h 2016-09-23 14:36:26 +0000
380@@ -0,0 +1,59 @@
381+/**
382+ * @file lib/libertine-scope/i18n.h
383+ * @brief Internationalization helpers.
384+ */
385+/*
386+ * Copyright 2016 Canonical Ltd.
387+ *
388+ * This program is free software: you can redistribute it and/or modify it under
389+ * the terms of the GNU General Public License, version 3, as published by the
390+ * Free Software Foundation.
391+ *
392+ * This program is distributed in the hope that it will be useful,
393+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
394+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
395+ * GNU General Public License for more details.
396+ *
397+ * You should have received a copy of the GNU General Public License
398+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
399+ */
400+#pragma once
401+
402+#include <libintl.h>
403+#include <string>
404+
405+
406+/**
407+ * Translates a simple string.
408+ * @param[in] msgid The string to be translated.
409+ * @returns the translated string.
410+ */
411+inline std::string
412+_(char const* msgid)
413+{
414+ return dgettext(GETTEXT_PACKAGE, msgid);
415+}
416+
417+
418+/**
419+ * Translates a single/plural string pair.
420+ * @param[in] msgid1 The string to be tranlated (single form).
421+ * @param[in] msgid2 The string to be translated (plural form).
422+ * @param[in] n The number of items referenced in the string.
423+ *
424+ * @returns the translated string, either singular or plural forms depending on
425+ * @p n.
426+ */
427+inline std::string
428+_(char const* msgid1, char const* msgid2, unsigned long int n)
429+{
430+ auto fmt = dngettext(GETTEXT_PACKAGE, msgid1, msgid2, n);
431+ auto sz = std::snprintf(nullptr, 0, fmt, n);
432+ std::string buf;
433+ if (sz > 0)
434+ {
435+ buf.resize(sz);
436+ std::snprintf(&buf[0], sz+1, fmt, n);
437+ }
438+ return buf;
439+}
440
441=== added file 'lib/libertine-scope/package.cpp'
442--- lib/libertine-scope/package.cpp 1970-01-01 00:00:00 +0000
443+++ lib/libertine-scope/package.cpp 2016-09-23 14:36:26 +0000
444@@ -0,0 +1,54 @@
445+/*
446+ * Copyright 2016 Canonical Ltd.
447+ *
448+ * This program is free software: you can redistribute it and/or modify it under
449+ * the terms of the GNU General Public License, version 3, as published by the
450+ * Free Software Foundation.
451+ *
452+ * This program is distributed in the hope that it will be useful,
453+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
454+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
455+ * GNU General Public License for more details.
456+ *
457+ * You should have received a copy of the GNU General Public License
458+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
459+ */
460+#include "libertine-scope/package.h"
461+
462+
463+libertine::scope::Package libertine::scope::Package::
464+from_map(QVariantMap const& pkgMap)
465+{
466+ Package pkg;
467+ pkg.name = pkgMap["name"].toString().toStdString();
468+ pkg.summary = pkgMap["summary"].toString().toStdString();
469+ pkg.description = pkgMap["description"].toString().toStdString();
470+ pkg.icon = pkgMap["icon"].toString().toStdString();
471+ pkg.publisher = pkgMap["publisher"].toString().toStdString();
472+ pkg.website = pkgMap["website"].toString().toStdString();
473+ pkg.license = pkgMap["license"].toString().toStdString();
474+ pkg.id = pkgMap["id"].toString().toStdString();
475+ pkg.status = pkgMap["status"].toString().toStdString();
476+ pkg.progress = pkgMap["progress_id"].toString().toStdString();
477+
478+ for (auto const& screenshot: pkgMap["screenshots"].toStringList())
479+ {
480+ pkg.screenshots.push_back(screenshot.toStdString());
481+ }
482+
483+ return pkg;
484+}
485+
486+
487+QList<libertine::scope::Package> libertine::scope::Package::
488+from_map(QList<QVariantMap> const& pkgMap)
489+{
490+ QList<Package> pkgs;
491+
492+ for (auto const& pkg: pkgMap)
493+ {
494+ pkgs << Package::from_map(pkg);
495+ }
496+
497+ return pkgs;
498+}
499
500=== added file 'lib/libertine-scope/package.h'
501--- lib/libertine-scope/package.h 1970-01-01 00:00:00 +0000
502+++ lib/libertine-scope/package.h 2016-09-23 14:36:26 +0000
503@@ -0,0 +1,56 @@
504+/*
505+ * Copyright 2016 Canonical Ltd.
506+ *
507+ * This program is free software: you can redistribute it and/or modify it under
508+ * the terms of the GNU General Public License, version 3, as published by the
509+ * Free Software Foundation.
510+ *
511+ * This program is distributed in the hope that it will be useful,
512+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
513+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
514+ * GNU General Public License for more details.
515+ *
516+ * You should have received a copy of the GNU General Public License
517+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
518+ */
519+#pragma once
520+
521+
522+#include <QList>
523+#include <QVariant>
524+
525+
526+namespace libertine
527+{
528+namespace scope
529+{
530+
531+
532+class Package
533+{
534+public:
535+ explicit Package() = default;
536+ virtual ~Package() = default;
537+
538+ static Package from_map(QVariantMap const&);
539+ static QList<Package> from_map(QList<QVariantMap> const&);
540+
541+
542+ std::string id;
543+ std::string name;
544+ std::string summary;
545+ std::string status;
546+
547+ std::string description;
548+ std::string icon;
549+ std::string publisher;
550+ std::string website;
551+ std::string license;
552+ std::string progress;
553+
554+ std::vector<std::string> screenshots;
555+};
556+
557+
558+} // Store
559+} // Libertine
560
561=== added file 'lib/libertine-scope/preview.cpp'
562--- lib/libertine-scope/preview.cpp 1970-01-01 00:00:00 +0000
563+++ lib/libertine-scope/preview.cpp 2016-09-23 14:36:26 +0000
564@@ -0,0 +1,283 @@
565+/*
566+ * Copyright 2016 Canonical Ltd.
567+ *
568+ * This program is free software: you can redistribute it and/or modify it under
569+ * the terms of the GNU General Public License, version 3, as published by the
570+ * Free Software Foundation.
571+ *
572+ * This program is distributed in the hope that it will be useful,
573+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
574+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
575+ * GNU General Public License for more details.
576+ *
577+ * You should have received a copy of the GNU General Public License
578+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
579+ */
580+#include "libertine-scope/preview.h"
581+
582+
583+#include "libertine-scope/i18n.h"
584+#include "libertine-scope/service_manager.h"
585+#include <future>
586+#include <QDebug>
587+#include <unity/UnityExceptions.h>
588+#include <unity/scopes/ColumnLayout.h>
589+#include <unity/scopes/PreviewReply.h>
590+#include <unity/scopes/Variant.h>
591+#include <unity/scopes/VariantBuilder.h>
592+#include <unity/scopes/ActionMetadata.h>
593+#include <unity/scopes/Result.h>
594+
595+
596+namespace usc = unity::scopes;
597+
598+
599+namespace
600+{
601+static auto constexpr HEADER_ID = "hdr";
602+static auto constexpr ACTIONS_ID = "actions";
603+static auto constexpr METADATA_ID = "other_metadata";
604+static auto constexpr SUMMARY_ID = "summary";
605+static auto constexpr SCREENSHOTS_ID = "screenshots";
606+static auto const SUMMARY_TITLE = _("Info");
607+static auto const ACTION_INSTALL = _("Install");
608+static auto const ACTION_REMOVE = _("Remove");
609+static auto const ACTION_NOOP_REMOVING = _("Removing...");
610+static auto const ACTION_NOOP_INSTALLING = _("Installing...");
611+static auto const ACTION_OPEN = _("Open");
612+static auto const METADATA_PUBLISHER = _("Publisher/Creator");
613+static auto const METADATA_WEBSITE = _("Website");
614+static auto const METADATA_LICENSE = _("License");
615+
616+
617+static usc::PreviewWidget
618+metadataWidgets(libertine::scope::Package const& app)
619+{
620+ usc::PreviewWidget widget(METADATA_ID, "table");
621+ usc::VariantArray values;
622+ if (!app.publisher.empty())
623+ {
624+ values.push_back(usc::Variant{usc::VariantArray{usc::Variant{METADATA_PUBLISHER}, usc::Variant{app.publisher}}});
625+ }
626+ if (!app.website.empty())
627+ {
628+ values.push_back(usc::Variant{usc::VariantArray{usc::Variant{METADATA_WEBSITE}, usc::Variant{app.website}}});
629+ }
630+ if (!app.license.empty())
631+ {
632+ values.push_back(usc::Variant{usc::VariantArray{usc::Variant{METADATA_LICENSE}, usc::Variant{app.license}}});
633+ }
634+
635+ widget.add_attribute_value("values", usc::Variant(values));
636+ return widget;
637+}
638+
639+
640+static usc::PreviewWidget
641+screenshotWidgets(libertine::scope::Package const& app)
642+{
643+ usc::PreviewWidget gallery(SCREENSHOTS_ID, "gallery");
644+ usc::VariantArray arr;
645+ for (auto const& screenshot: app.screenshots)
646+ {
647+ arr.push_back(usc::Variant(screenshot));
648+ }
649+ gallery.add_attribute_value("sources", usc::Variant(arr));
650+ return gallery;
651+}
652+}
653+
654+
655+std::chrono::milliseconds libertine::scope::Preview::
656+update_progress_after = std::chrono::milliseconds(500);
657+
658+
659+libertine::scope::Preview::
660+Preview(usc::Result const& result,
661+ usc::ActionMetadata const& metadata,
662+ std::shared_ptr<ServiceManager> const& service)
663+ : PreviewQueryBase(result, metadata)
664+ , service_(service)
665+ , thread_()
666+{
667+}
668+
669+
670+libertine::scope::Preview::
671+~Preview()
672+{
673+ if (thread_ != nullptr)
674+ {
675+ thread_->join();
676+ }
677+}
678+
679+
680+void libertine::scope::Preview::
681+cancelled()
682+{
683+}
684+
685+
686+void libertine::scope::Preview::
687+createSingleColumnLayout(Package const& app)
688+{
689+ oneColumn.column.push_back(HEADER_ID);
690+ oneColumn.column.push_back(ACTIONS_ID);
691+ oneColumn.column.push_back(METADATA_ID);
692+ if (!app.screenshots.empty())
693+ {
694+ oneColumn.column.push_back(SCREENSHOTS_ID);
695+ }
696+ oneColumn.column.push_back(SUMMARY_ID);
697+}
698+
699+
700+void libertine::scope::Preview::
701+createDualColumnLayout(Package const& app)
702+{
703+ twoColumns.column1.push_back(HEADER_ID);
704+ twoColumns.column1.push_back(ACTIONS_ID);
705+ twoColumns.column1.push_back(SUMMARY_ID);
706+ twoColumns.column2.push_back(METADATA_ID);
707+ if (!app.screenshots.empty())
708+ {
709+ twoColumns.column2.push_back(SCREENSHOTS_ID);
710+ }
711+}
712+
713+
714+void libertine::scope::Preview::
715+run(usc::PreviewReplyProxy const& reply)
716+{
717+ auto app = service_->app_info(QString::fromStdString(result()["id"].get_string()));
718+ auto widgets = createWidgets(app);
719+
720+ createSingleColumnLayout(app);
721+ createDualColumnLayout(app);
722+
723+ registerLayouts(reply);
724+ reply->push(widgets);
725+
726+ // update the progress bar asynchronously
727+ // if an operation is in progress
728+ if (app.status == "installing" || app.status == "removing") {
729+ thread_.reset(new std::thread([=](){
730+ std::this_thread::sleep_for(update_progress_after);
731+ service_->update_progress(QString::fromStdString(app.id));
732+ }));
733+ }
734+}
735+
736+
737+usc::PreviewWidgetList libertine::scope::Preview::
738+createWidgets(libertine::scope::Package const& app) const
739+{
740+ auto widgets = headerWidgets(app);
741+ widgets.push_back(buttonWidgets(app));
742+ widgets.push_back(metadataWidgets(app));
743+ if (!app.screenshots.empty())
744+ {
745+ widgets.push_back(screenshotWidgets(app));
746+ }
747+ widgets.push_back(descriptionWidgets(app));
748+
749+ return widgets;
750+}
751+
752+
753+usc::PreviewWidgetList libertine::scope::Preview::
754+headerWidgets(libertine::scope::Package const& app) const
755+{
756+ usc::PreviewWidget header(HEADER_ID, "header");
757+ header.add_attribute_value("title", usc::Variant(app.name.empty() ? result().title() : app.name));
758+ header.add_attribute_value("subtitle", usc::Variant(app.summary));
759+ header.add_attribute_value("mascot", usc::Variant(app.icon.empty() ? result().art() : app.icon));
760+ header.add_attribute_value("fallback", usc::Variant("image://theme/placeholder-app-icon"));
761+
762+ usc::PreviewWidgetList widgets;
763+ widgets.push_back(header);
764+
765+ qDebug() << "Pushed widgets for package:" << QString::fromStdString(app.name);
766+ return widgets;
767+}
768+
769+
770+usc::PreviewWidget libertine::scope::Preview::
771+buttonWidgets(libertine::scope::Package const& package) const
772+{
773+ if (package.status == "installing" || package.status == "removing")
774+ {
775+ usc::PreviewWidget progress(ACTIONS_ID, "progress");
776+ usc::VariantMap tuple;
777+ tuple["dbus-name"] = "com.canonical.libertine.ContainerManager";
778+ tuple["dbus-object"] = std::string("/Progress/") + package.progress;
779+ progress.add_attribute_value("source", usc::Variant(tuple));
780+ return progress;
781+ }
782+
783+ usc::VariantBuilder builder;
784+ if (package.status == "installed")
785+ {
786+ builder.add_tuple(
787+ {
788+ {"id", usc::Variant("remove")},
789+ {"label", usc::Variant(ACTION_REMOVE)},
790+ });
791+ builder.add_tuple(
792+ {
793+ {"id", usc::Variant("open")},
794+ {"label", usc::Variant(ACTION_OPEN)},
795+ });
796+ }
797+ else
798+ {
799+ builder.add_tuple(
800+ {
801+ {"id", usc::Variant("install")},
802+ {"label", usc::Variant(ACTION_INSTALL)},
803+ });
804+ }
805+
806+ usc::PreviewWidget buttons(ACTIONS_ID, "actions");
807+ buttons.add_attribute_value("actions", builder.end());
808+ return buttons;
809+}
810+
811+
812+usc::PreviewWidget libertine::scope::Preview::
813+descriptionWidgets(libertine::scope::Package const& app) const
814+{
815+ usc::PreviewWidget summary(SUMMARY_ID, "text");
816+ summary.add_attribute_value("title", usc::Variant(SUMMARY_TITLE));
817+ if (app.description.empty() && result().contains("description"))
818+ {
819+ summary.add_attribute_value("text", usc::Variant(result()["description"].get_string()));
820+ }
821+ else
822+ {
823+ summary.add_attribute_value("text", usc::Variant(app.description));
824+ }
825+ return summary;
826+}
827+
828+
829+void libertine::scope::Preview::
830+registerLayouts(unity::scopes::PreviewReplyProxy const& reply)
831+{
832+ usc::ColumnLayout layout1col(1);
833+ layout1col.add_column(oneColumn.column);
834+
835+ usc::ColumnLayout layout2col(2);
836+ layout2col.add_column(twoColumns.column1);
837+ layout2col.add_column(twoColumns.column2);
838+
839+ try
840+ {
841+ reply->register_layout({layout1col, layout2col});
842+ }
843+ catch (unity::LogicException const& e)
844+ {
845+ qWarning() << "Failed to register layout:" << QString::fromStdString(e.what());
846+ }
847+}
848
849=== added file 'lib/libertine-scope/preview.h'
850--- lib/libertine-scope/preview.h 1970-01-01 00:00:00 +0000
851+++ lib/libertine-scope/preview.h 2016-09-23 14:36:26 +0000
852@@ -0,0 +1,93 @@
853+/*
854+ * Copyright 2016 Canonical Ltd.
855+ *
856+ * This program is free software: you can redistribute it and/or modify it under
857+ * the terms of the GNU General Public License, version 3, as published by the
858+ * Free Software Foundation.
859+ *
860+ * This program is distributed in the hope that it will be useful,
861+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
862+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
863+ * GNU General Public License for more details.
864+ *
865+ * You should have received a copy of the GNU General Public License
866+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
867+ */
868+#pragma once
869+
870+#include <chrono>
871+#include <unity/scopes/PreviewQueryBase.h>
872+#include <unity/scopes/PreviewWidget.h>
873+
874+
875+namespace std
876+{
877+class thread;
878+}
879+
880+namespace libertine
881+{
882+namespace scope
883+{
884+
885+
886+class ServiceManager;
887+class Package;
888+
889+
890+class Preview
891+: public unity::scopes::PreviewQueryBase
892+{
893+public:
894+ explicit Preview(unity::scopes::Result const& result,
895+ unity::scopes::ActionMetadata const& metadata,
896+ std::shared_ptr<ServiceManager> const& service);
897+
898+ virtual ~Preview();
899+
900+ virtual void
901+ cancelled() override;
902+
903+ virtual void
904+ run(unity::scopes::PreviewReplyProxy const& reply) override;
905+
906+ static
907+ std::chrono::milliseconds update_progress_after;
908+
909+protected:
910+ virtual unity::scopes::PreviewWidget
911+ buttonWidgets(libertine::scope::Package const& package) const;
912+
913+private:
914+ unity::scopes::PreviewWidgetList
915+ createWidgets(libertine::scope::Package const& app) const;
916+
917+ unity::scopes::PreviewWidgetList
918+ headerWidgets(libertine::scope::Package const& app) const;
919+
920+ unity::scopes::PreviewWidget
921+ descriptionWidgets(libertine::scope::Package const& app) const;
922+
923+ void
924+ registerLayouts(unity::scopes::PreviewReplyProxy const& reply);
925+
926+ void
927+ createSingleColumnLayout(Package const& app);
928+
929+ void
930+ createDualColumnLayout(Package const& app);
931+
932+ struct {
933+ std::vector<std::string> column;
934+ } oneColumn;
935+
936+ struct {
937+ std::vector<std::string> column1;
938+ std::vector<std::string> column2;
939+ } twoColumns;
940+
941+ std::shared_ptr<ServiceManager> service_;
942+ std::unique_ptr<std::thread> thread_;
943+};
944+} // namespace scope
945+} // namespace libertine
946
947=== added file 'lib/libertine-scope/service_manager.cpp'
948--- lib/libertine-scope/service_manager.cpp 1970-01-01 00:00:00 +0000
949+++ lib/libertine-scope/service_manager.cpp 2016-09-23 14:36:26 +0000
950@@ -0,0 +1,103 @@
951+/*
952+ * Copyright 2016 Canonical Ltd.
953+ *
954+ * This program is free software: you can redistribute it and/or modify it under
955+ * the terms of the GNU General Public License, version 3, as published by the
956+ * Free Software Foundation.
957+ *
958+ * This program is distributed in the hope that it will be useful,
959+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
960+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
961+ * GNU General Public License for more details.
962+ *
963+ * You should have received a copy of the GNU General Public License
964+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
965+ */
966+#include "libertine-scope/service_manager.h"
967+
968+#include <QtDBus>
969+#include <QDebug>
970+#include <QDBusMetaType>
971+
972+namespace
973+{
974+constexpr auto SEARCH_CACHE_METHOD = "search";
975+constexpr auto APP_INFO_METHOD = "app_info";
976+constexpr auto INSTALL_METHOD = "install";
977+constexpr auto REMOVE_METHOD = "remove";
978+constexpr auto UPDATE_PROGRESS_METHOD = "update_progress";
979+constexpr auto LIBERTINE_SERVICE_DESTINATION = "com.canonical.libertine.ContainerManager";
980+constexpr auto LIBERTINE_SERVICE_INTERFACE = "com.canonical.libertine.ContainerManager";
981+constexpr auto LIBERTINE_SERVICE_OBJECT = "/Manager";
982+}
983+
984+
985+libertine::scope::ServiceManager::
986+ServiceManager()
987+{
988+ qDBusRegisterMetaType<QList<QVariantMap > >();
989+}
990+
991+
992+void libertine::scope::ServiceManager::
993+install(QString const& package_name) const
994+{
995+ call<qlonglong>(INSTALL_METHOD, QVariant(package_name));
996+}
997+
998+
999+void libertine::scope::ServiceManager::
1000+remove(QString const& package_name) const
1001+{
1002+ call<qlonglong>(REMOVE_METHOD, QVariant(package_name));
1003+}
1004+
1005+
1006+libertine::scope::Package libertine::scope::ServiceManager::
1007+app_info(const QString &app_id) const
1008+{
1009+ return Package::from_map(call<QVariantMap >(APP_INFO_METHOD, QVariant(app_id)));
1010+}
1011+
1012+
1013+void libertine::scope::ServiceManager::
1014+update_progress(QString const& package_name) const
1015+{
1016+ call<bool>(UPDATE_PROGRESS_METHOD, QVariant(package_name));
1017+}
1018+
1019+
1020+QList<libertine::scope::Package> libertine::scope::ServiceManager::
1021+search_cache(const QString &query) const
1022+{
1023+ return Package::from_map(call<QList<QVariantMap > >(SEARCH_CACHE_METHOD, QVariant(query)));
1024+}
1025+
1026+
1027+template<class T>
1028+T libertine::scope::ServiceManager::
1029+call(QString const& method, QVariant const& arg1) const
1030+{
1031+ if (!valid())
1032+ {
1033+ qCritical() << "Cannot connect to D-Bus session bus.";
1034+ return T{};
1035+ }
1036+
1037+ QDBusInterface iface(LIBERTINE_SERVICE_DESTINATION, LIBERTINE_SERVICE_OBJECT, LIBERTINE_SERVICE_INTERFACE, QDBusConnection::sessionBus());
1038+ QDBusReply<T> response = iface.call(method, arg1);
1039+ if (response.isValid())
1040+ {
1041+ return response.value();
1042+ }
1043+
1044+ qCritical() << "Call to " << method << " failed:" << qPrintable(response.error().message());
1045+ return T{};
1046+}
1047+
1048+
1049+bool libertine::scope::ServiceManager::
1050+valid() const
1051+{
1052+ return QDBusConnection::sessionBus().isConnected();
1053+}
1054
1055=== added file 'lib/libertine-scope/service_manager.h'
1056--- lib/libertine-scope/service_manager.h 1970-01-01 00:00:00 +0000
1057+++ lib/libertine-scope/service_manager.h 2016-09-23 14:36:26 +0000
1058@@ -0,0 +1,51 @@
1059+/*
1060+ * Copyright 2016 Canonical Ltd.
1061+ *
1062+ * This program is free software: you can redistribute it and/or modify it under
1063+ * the terms of the GNU General Public License, version 3, as published by the
1064+ * Free Software Foundation.
1065+ *
1066+ * This program is distributed in the hope that it will be useful,
1067+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1068+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1069+ * GNU General Public License for more details.
1070+ *
1071+ * You should have received a copy of the GNU General Public License
1072+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
1073+ */
1074+#pragma once
1075+
1076+#include "libertine-scope/package.h"
1077+
1078+#include <QString>
1079+#include <QVariant>
1080+
1081+
1082+namespace libertine
1083+{
1084+namespace scope
1085+{
1086+
1087+
1088+class ServiceManager
1089+{
1090+public:
1091+ explicit ServiceManager();
1092+ virtual ~ServiceManager() = default;
1093+
1094+ virtual QList<Package> search_cache(QString const& query) const;
1095+ virtual Package app_info(QString const& app_id) const;
1096+ virtual void install(QString const& package_name) const;
1097+ virtual void remove(QString const& package_name) const;
1098+ virtual void update_progress(QString const& package_name) const;
1099+
1100+private:
1101+ bool valid() const;
1102+
1103+ template<class T>
1104+ T call(QString const& method, QVariant const& = QVariant()) const;
1105+};
1106+
1107+
1108+} // namespace libertine
1109+} // namespace scope
1110
1111=== modified file 'manifest.json.in'
1112--- manifest.json.in 2016-07-15 19:52:28 +0000
1113+++ manifest.json.in 2016-09-23 14:36:26 +0000
1114@@ -1,7 +1,7 @@
1115 {
1116 "architecture": "@CLICK_ARCH@",
1117 "description": "A Unity scope that surfaces Legacy apps from a Libertine container",
1118- "framework": "ubuntu-sdk-15.04.3",
1119+ "framework": "ubuntu-sdk-15.04.5",
1120 "hooks": {
1121 "libertine-scope": {
1122 "apparmor": "@SCOPE_NAME@.apparmor",
1123
1124=== modified file 'po/en_AU.po'
1125--- po/en_AU.po 2016-08-25 06:10:07 +0000
1126+++ po/en_AU.po 2016-09-23 14:36:26 +0000
1127@@ -6,11 +6,12 @@
1128 msgid ""
1129 msgstr ""
1130 "Project-Id-Version: libertine-scope\n"
1131-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1132-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1133+"Report-Msgid-Bugs-To: \n"
1134+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1135 "PO-Revision-Date: 2016-05-21 11:19+0000\n"
1136 "Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1137 "Language-Team: English (Australia) <en_AU@li.org>\n"
1138+"Language: \n"
1139 "MIME-Version: 1.0\n"
1140 "Content-Type: text/plain; charset=UTF-8\n"
1141 "Content-Transfer-Encoding: 8bit\n"
1142@@ -30,14 +31,77 @@
1143 msgid "Search apps"
1144 msgstr ""
1145
1146+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1147+msgid "X Apps"
1148+msgstr ""
1149+
1150+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1151+msgid "Hidden X Apps"
1152+msgstr ""
1153+
1154+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1155+msgid "Exclude Apps: "
1156+msgstr ""
1157+
1158+#. anonymous namespace
1159+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1160+msgid ""
1161+"No XApps available. Install new applications with the Libertine Manager."
1162+msgstr ""
1163+
1164+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1165+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1166+msgstr ""
1167+
1168+#: ../lib/libertine-scope/preview.cpp:40
1169+msgid "Info"
1170+msgstr ""
1171+
1172+#: ../lib/libertine-scope/preview.cpp:41
1173+msgid "Install"
1174+msgstr ""
1175+
1176+#: ../lib/libertine-scope/preview.cpp:42
1177+msgid "Remove"
1178+msgstr ""
1179+
1180+#: ../lib/libertine-scope/preview.cpp:43
1181+msgid "Removing..."
1182+msgstr ""
1183+
1184+#: ../lib/libertine-scope/preview.cpp:44
1185+msgid "Installing..."
1186+msgstr ""
1187+
1188+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1189+msgid "Open"
1190+msgstr ""
1191+
1192+#: ../lib/libertine-scope/preview.cpp:46
1193+msgid "Publisher/Creator"
1194+msgstr ""
1195+
1196+#: ../lib/libertine-scope/preview.cpp:47
1197+msgid "Website"
1198+msgstr ""
1199+
1200+#: ../lib/libertine-scope/preview.cpp:48
1201+msgid "License"
1202+msgstr ""
1203+
1204+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1205+#: ../scope/apps/preview.cpp:55
1206+msgid "Show"
1207+msgstr ""
1208+
1209+#: ../scope/apps/preview.cpp:62
1210+msgid "Hide"
1211+msgstr ""
1212+
1213 #: ../scope/apps/query.cpp:39
1214 msgid "Hidden Desktop Apps"
1215 msgstr ""
1216
1217-#: ../scope/apps/query.cpp:43
1218-msgid "Exclude Apps: "
1219-msgstr ""
1220-
1221 #. anonymous namespace
1222 #: ../scope/apps/query.cpp:113
1223 msgid ""
1224@@ -50,3 +114,19 @@
1225 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
1226 "department."
1227 msgstr ""
1228+
1229+#: ../scope/store/query.cpp:68
1230+msgid "%1 result found"
1231+msgstr ""
1232+
1233+#: ../scope/store/query.cpp:69
1234+msgid "%1 results found"
1235+msgstr ""
1236+
1237+#: ../scope/store/query.cpp:74
1238+msgid "Use the searchbar to find software."
1239+msgstr ""
1240+
1241+#: ../scope/store/query.cpp:75
1242+msgid "No results found."
1243+msgstr ""
1244
1245=== modified file 'po/en_GB.po'
1246--- po/en_GB.po 2016-08-25 06:10:07 +0000
1247+++ po/en_GB.po 2016-09-23 14:36:26 +0000
1248@@ -6,11 +6,12 @@
1249 msgid ""
1250 msgstr ""
1251 "Project-Id-Version: libertine-scope\n"
1252-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1253-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1254+"Report-Msgid-Bugs-To: \n"
1255+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1256 "PO-Revision-Date: 2016-05-20 16:47+0000\n"
1257 "Last-Translator: Andi Chandler <Unknown>\n"
1258 "Language-Team: English (United Kingdom) <en_GB@li.org>\n"
1259+"Language: \n"
1260 "MIME-Version: 1.0\n"
1261 "Content-Type: text/plain; charset=UTF-8\n"
1262 "Content-Transfer-Encoding: 8bit\n"
1263@@ -30,14 +31,77 @@
1264 msgid "Search apps"
1265 msgstr ""
1266
1267+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1268+msgid "X Apps"
1269+msgstr ""
1270+
1271+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1272+msgid "Hidden X Apps"
1273+msgstr ""
1274+
1275+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1276+msgid "Exclude Apps: "
1277+msgstr ""
1278+
1279+#. anonymous namespace
1280+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1281+msgid ""
1282+"No XApps available. Install new applications with the Libertine Manager."
1283+msgstr ""
1284+
1285+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1286+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1287+msgstr ""
1288+
1289+#: ../lib/libertine-scope/preview.cpp:40
1290+msgid "Info"
1291+msgstr ""
1292+
1293+#: ../lib/libertine-scope/preview.cpp:41
1294+msgid "Install"
1295+msgstr ""
1296+
1297+#: ../lib/libertine-scope/preview.cpp:42
1298+msgid "Remove"
1299+msgstr ""
1300+
1301+#: ../lib/libertine-scope/preview.cpp:43
1302+msgid "Removing..."
1303+msgstr ""
1304+
1305+#: ../lib/libertine-scope/preview.cpp:44
1306+msgid "Installing..."
1307+msgstr ""
1308+
1309+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1310+msgid "Open"
1311+msgstr ""
1312+
1313+#: ../lib/libertine-scope/preview.cpp:46
1314+msgid "Publisher/Creator"
1315+msgstr ""
1316+
1317+#: ../lib/libertine-scope/preview.cpp:47
1318+msgid "Website"
1319+msgstr ""
1320+
1321+#: ../lib/libertine-scope/preview.cpp:48
1322+msgid "License"
1323+msgstr ""
1324+
1325+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1326+#: ../scope/apps/preview.cpp:55
1327+msgid "Show"
1328+msgstr ""
1329+
1330+#: ../scope/apps/preview.cpp:62
1331+msgid "Hide"
1332+msgstr ""
1333+
1334 #: ../scope/apps/query.cpp:39
1335 msgid "Hidden Desktop Apps"
1336 msgstr ""
1337
1338-#: ../scope/apps/query.cpp:43
1339-msgid "Exclude Apps: "
1340-msgstr ""
1341-
1342 #. anonymous namespace
1343 #: ../scope/apps/query.cpp:113
1344 msgid ""
1345@@ -50,3 +114,19 @@
1346 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
1347 "department."
1348 msgstr ""
1349+
1350+#: ../scope/store/query.cpp:68
1351+msgid "%1 result found"
1352+msgstr ""
1353+
1354+#: ../scope/store/query.cpp:69
1355+msgid "%1 results found"
1356+msgstr ""
1357+
1358+#: ../scope/store/query.cpp:74
1359+msgid "Use the searchbar to find software."
1360+msgstr ""
1361+
1362+#: ../scope/store/query.cpp:75
1363+msgid "No results found."
1364+msgstr ""
1365
1366=== modified file 'po/es.po'
1367--- po/es.po 2016-08-25 06:10:07 +0000
1368+++ po/es.po 2016-09-23 14:36:26 +0000
1369@@ -6,11 +6,12 @@
1370 msgid ""
1371 msgstr ""
1372 "Project-Id-Version: libertine-scope\n"
1373-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1374-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1375+"Report-Msgid-Bugs-To: \n"
1376+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1377 "PO-Revision-Date: 2016-07-26 14:22+0000\n"
1378 "Last-Translator: Víctor R. Ruiz <Unknown>\n"
1379 "Language-Team: Spanish <es@li.org>\n"
1380+"Language: es\n"
1381 "MIME-Version: 1.0\n"
1382 "Content-Type: text/plain; charset=UTF-8\n"
1383 "Content-Transfer-Encoding: 8bit\n"
1384@@ -24,21 +25,90 @@
1385
1386 #: ../scope/apps/libertine-scope.ubuntu_libertine-scope.ini.in.in.h:2
1387 msgid "Surface and launch DEB-packaged X11-based applications."
1388-msgstr ""
1389-"Mostrar y ejecutar aplicaciones basadas en X11 y empaquetadas en DEB."
1390+msgstr "Mostrar y ejecutar aplicaciones basadas en X11 y empaquetadas en DEB."
1391
1392 #: ../scope/apps/libertine-scope.ubuntu_libertine-scope.ini.in.in.h:3
1393 msgid "Search apps"
1394 msgstr "Buscar aplis"
1395
1396+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1397+msgid "X Apps"
1398+msgstr ""
1399+
1400+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1401+#, fuzzy
1402+msgid "Hidden X Apps"
1403+msgstr "Aplis de escritorio ocultas"
1404+
1405+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1406+msgid "Exclude Apps: "
1407+msgstr "Excluir aplis: "
1408+
1409+#. anonymous namespace
1410+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1411+#, fuzzy
1412+msgid ""
1413+"No XApps available. Install new applications with the Libertine Manager."
1414+msgstr ""
1415+"No hay aplicaciones disponibles. Instale las nuevas aplicaciones con el "
1416+"gestor de Libertine."
1417+
1418+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1419+#, fuzzy
1420+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1421+msgstr ""
1422+"Todas las aplicaciones están ocultas. Reinice los filtros o revise el "
1423+"departamento Aplis de escritorio ocultas."
1424+
1425+#: ../lib/libertine-scope/preview.cpp:40
1426+msgid "Info"
1427+msgstr ""
1428+
1429+#: ../lib/libertine-scope/preview.cpp:41
1430+msgid "Install"
1431+msgstr ""
1432+
1433+#: ../lib/libertine-scope/preview.cpp:42
1434+msgid "Remove"
1435+msgstr ""
1436+
1437+#: ../lib/libertine-scope/preview.cpp:43
1438+msgid "Removing..."
1439+msgstr ""
1440+
1441+#: ../lib/libertine-scope/preview.cpp:44
1442+msgid "Installing..."
1443+msgstr ""
1444+
1445+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1446+msgid "Open"
1447+msgstr ""
1448+
1449+#: ../lib/libertine-scope/preview.cpp:46
1450+msgid "Publisher/Creator"
1451+msgstr ""
1452+
1453+#: ../lib/libertine-scope/preview.cpp:47
1454+msgid "Website"
1455+msgstr ""
1456+
1457+#: ../lib/libertine-scope/preview.cpp:48
1458+msgid "License"
1459+msgstr ""
1460+
1461+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1462+#: ../scope/apps/preview.cpp:55
1463+msgid "Show"
1464+msgstr ""
1465+
1466+#: ../scope/apps/preview.cpp:62
1467+msgid "Hide"
1468+msgstr ""
1469+
1470 #: ../scope/apps/query.cpp:39
1471 msgid "Hidden Desktop Apps"
1472 msgstr "Aplis de escritorio ocultas"
1473
1474-#: ../scope/apps/query.cpp:43
1475-msgid "Exclude Apps: "
1476-msgstr "Excluir aplis: "
1477-
1478 #. anonymous namespace
1479 #: ../scope/apps/query.cpp:113
1480 msgid ""
1481@@ -55,3 +125,19 @@
1482 msgstr ""
1483 "Todas las aplicaciones están ocultas. Reinice los filtros o revise el "
1484 "departamento Aplis de escritorio ocultas."
1485+
1486+#: ../scope/store/query.cpp:68
1487+msgid "%1 result found"
1488+msgstr ""
1489+
1490+#: ../scope/store/query.cpp:69
1491+msgid "%1 results found"
1492+msgstr ""
1493+
1494+#: ../scope/store/query.cpp:74
1495+msgid "Use the searchbar to find software."
1496+msgstr ""
1497+
1498+#: ../scope/store/query.cpp:75
1499+msgid "No results found."
1500+msgstr ""
1501
1502=== modified file 'po/fi.po'
1503--- po/fi.po 2016-08-25 06:10:07 +0000
1504+++ po/fi.po 2016-09-23 14:36:26 +0000
1505@@ -6,11 +6,12 @@
1506 msgid ""
1507 msgstr ""
1508 "Project-Id-Version: libertine-scope\n"
1509-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1510-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1511+"Report-Msgid-Bugs-To: \n"
1512+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1513 "PO-Revision-Date: 2016-05-30 07:34+0000\n"
1514 "Last-Translator: Jiri Grönroos <Unknown>\n"
1515 "Language-Team: Finnish <fi@li.org>\n"
1516+"Language: fi\n"
1517 "MIME-Version: 1.0\n"
1518 "Content-Type: text/plain; charset=UTF-8\n"
1519 "Content-Transfer-Encoding: 8bit\n"
1520@@ -30,14 +31,77 @@
1521 msgid "Search apps"
1522 msgstr ""
1523
1524+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1525+msgid "X Apps"
1526+msgstr ""
1527+
1528+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1529+msgid "Hidden X Apps"
1530+msgstr ""
1531+
1532+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1533+msgid "Exclude Apps: "
1534+msgstr ""
1535+
1536+#. anonymous namespace
1537+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1538+msgid ""
1539+"No XApps available. Install new applications with the Libertine Manager."
1540+msgstr ""
1541+
1542+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1543+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1544+msgstr ""
1545+
1546+#: ../lib/libertine-scope/preview.cpp:40
1547+msgid "Info"
1548+msgstr ""
1549+
1550+#: ../lib/libertine-scope/preview.cpp:41
1551+msgid "Install"
1552+msgstr ""
1553+
1554+#: ../lib/libertine-scope/preview.cpp:42
1555+msgid "Remove"
1556+msgstr ""
1557+
1558+#: ../lib/libertine-scope/preview.cpp:43
1559+msgid "Removing..."
1560+msgstr ""
1561+
1562+#: ../lib/libertine-scope/preview.cpp:44
1563+msgid "Installing..."
1564+msgstr ""
1565+
1566+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1567+msgid "Open"
1568+msgstr ""
1569+
1570+#: ../lib/libertine-scope/preview.cpp:46
1571+msgid "Publisher/Creator"
1572+msgstr ""
1573+
1574+#: ../lib/libertine-scope/preview.cpp:47
1575+msgid "Website"
1576+msgstr ""
1577+
1578+#: ../lib/libertine-scope/preview.cpp:48
1579+msgid "License"
1580+msgstr ""
1581+
1582+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1583+#: ../scope/apps/preview.cpp:55
1584+msgid "Show"
1585+msgstr ""
1586+
1587+#: ../scope/apps/preview.cpp:62
1588+msgid "Hide"
1589+msgstr ""
1590+
1591 #: ../scope/apps/query.cpp:39
1592 msgid "Hidden Desktop Apps"
1593 msgstr ""
1594
1595-#: ../scope/apps/query.cpp:43
1596-msgid "Exclude Apps: "
1597-msgstr ""
1598-
1599 #. anonymous namespace
1600 #: ../scope/apps/query.cpp:113
1601 msgid ""
1602@@ -50,3 +114,19 @@
1603 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
1604 "department."
1605 msgstr ""
1606+
1607+#: ../scope/store/query.cpp:68
1608+msgid "%1 result found"
1609+msgstr ""
1610+
1611+#: ../scope/store/query.cpp:69
1612+msgid "%1 results found"
1613+msgstr ""
1614+
1615+#: ../scope/store/query.cpp:74
1616+msgid "Use the searchbar to find software."
1617+msgstr ""
1618+
1619+#: ../scope/store/query.cpp:75
1620+msgid "No results found."
1621+msgstr ""
1622
1623=== modified file 'po/fr.po'
1624--- po/fr.po 2016-08-25 06:10:07 +0000
1625+++ po/fr.po 2016-09-23 14:36:26 +0000
1626@@ -6,11 +6,12 @@
1627 msgid ""
1628 msgstr ""
1629 "Project-Id-Version: libertine-scope\n"
1630-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1631-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1632+"Report-Msgid-Bugs-To: \n"
1633+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1634 "PO-Revision-Date: 2016-05-21 12:23+0000\n"
1635 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1636 "Language-Team: French <fr@li.org>\n"
1637+"Language: fr\n"
1638 "MIME-Version: 1.0\n"
1639 "Content-Type: text/plain; charset=UTF-8\n"
1640 "Content-Transfer-Encoding: 8bit\n"
1641@@ -30,14 +31,77 @@
1642 msgid "Search apps"
1643 msgstr ""
1644
1645+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1646+msgid "X Apps"
1647+msgstr ""
1648+
1649+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1650+msgid "Hidden X Apps"
1651+msgstr ""
1652+
1653+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1654+msgid "Exclude Apps: "
1655+msgstr ""
1656+
1657+#. anonymous namespace
1658+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1659+msgid ""
1660+"No XApps available. Install new applications with the Libertine Manager."
1661+msgstr ""
1662+
1663+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1664+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1665+msgstr ""
1666+
1667+#: ../lib/libertine-scope/preview.cpp:40
1668+msgid "Info"
1669+msgstr ""
1670+
1671+#: ../lib/libertine-scope/preview.cpp:41
1672+msgid "Install"
1673+msgstr ""
1674+
1675+#: ../lib/libertine-scope/preview.cpp:42
1676+msgid "Remove"
1677+msgstr ""
1678+
1679+#: ../lib/libertine-scope/preview.cpp:43
1680+msgid "Removing..."
1681+msgstr ""
1682+
1683+#: ../lib/libertine-scope/preview.cpp:44
1684+msgid "Installing..."
1685+msgstr ""
1686+
1687+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1688+msgid "Open"
1689+msgstr ""
1690+
1691+#: ../lib/libertine-scope/preview.cpp:46
1692+msgid "Publisher/Creator"
1693+msgstr ""
1694+
1695+#: ../lib/libertine-scope/preview.cpp:47
1696+msgid "Website"
1697+msgstr ""
1698+
1699+#: ../lib/libertine-scope/preview.cpp:48
1700+msgid "License"
1701+msgstr ""
1702+
1703+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1704+#: ../scope/apps/preview.cpp:55
1705+msgid "Show"
1706+msgstr ""
1707+
1708+#: ../scope/apps/preview.cpp:62
1709+msgid "Hide"
1710+msgstr ""
1711+
1712 #: ../scope/apps/query.cpp:39
1713 msgid "Hidden Desktop Apps"
1714 msgstr ""
1715
1716-#: ../scope/apps/query.cpp:43
1717-msgid "Exclude Apps: "
1718-msgstr ""
1719-
1720 #. anonymous namespace
1721 #: ../scope/apps/query.cpp:113
1722 msgid ""
1723@@ -50,3 +114,19 @@
1724 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
1725 "department."
1726 msgstr ""
1727+
1728+#: ../scope/store/query.cpp:68
1729+msgid "%1 result found"
1730+msgstr ""
1731+
1732+#: ../scope/store/query.cpp:69
1733+msgid "%1 results found"
1734+msgstr ""
1735+
1736+#: ../scope/store/query.cpp:74
1737+msgid "Use the searchbar to find software."
1738+msgstr ""
1739+
1740+#: ../scope/store/query.cpp:75
1741+msgid "No results found."
1742+msgstr ""
1743
1744=== modified file 'po/gl.po'
1745--- po/gl.po 2016-08-25 06:10:07 +0000
1746+++ po/gl.po 2016-09-23 14:36:26 +0000
1747@@ -6,11 +6,12 @@
1748 msgid ""
1749 msgstr ""
1750 "Project-Id-Version: libertine-scope\n"
1751-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1752-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1753+"Report-Msgid-Bugs-To: \n"
1754+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1755 "PO-Revision-Date: 2016-07-30 18:36+0000\n"
1756 "Last-Translator: Marcos Lans <Unknown>\n"
1757 "Language-Team: Galician <gl@li.org>\n"
1758+"Language: gl\n"
1759 "MIME-Version: 1.0\n"
1760 "Content-Type: text/plain; charset=UTF-8\n"
1761 "Content-Transfer-Encoding: 8bit\n"
1762@@ -31,14 +32,77 @@
1763 msgid "Search apps"
1764 msgstr "Buscar nos aplicativos"
1765
1766+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1767+msgid "X Apps"
1768+msgstr ""
1769+
1770+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1771+msgid "Hidden X Apps"
1772+msgstr ""
1773+
1774+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1775+msgid "Exclude Apps: "
1776+msgstr "Excluír aplicativos: "
1777+
1778+#. anonymous namespace
1779+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1780+msgid ""
1781+"No XApps available. Install new applications with the Libertine Manager."
1782+msgstr ""
1783+
1784+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1785+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1786+msgstr ""
1787+
1788+#: ../lib/libertine-scope/preview.cpp:40
1789+msgid "Info"
1790+msgstr ""
1791+
1792+#: ../lib/libertine-scope/preview.cpp:41
1793+msgid "Install"
1794+msgstr ""
1795+
1796+#: ../lib/libertine-scope/preview.cpp:42
1797+msgid "Remove"
1798+msgstr ""
1799+
1800+#: ../lib/libertine-scope/preview.cpp:43
1801+msgid "Removing..."
1802+msgstr ""
1803+
1804+#: ../lib/libertine-scope/preview.cpp:44
1805+msgid "Installing..."
1806+msgstr ""
1807+
1808+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1809+msgid "Open"
1810+msgstr ""
1811+
1812+#: ../lib/libertine-scope/preview.cpp:46
1813+msgid "Publisher/Creator"
1814+msgstr ""
1815+
1816+#: ../lib/libertine-scope/preview.cpp:47
1817+msgid "Website"
1818+msgstr ""
1819+
1820+#: ../lib/libertine-scope/preview.cpp:48
1821+msgid "License"
1822+msgstr ""
1823+
1824+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1825+#: ../scope/apps/preview.cpp:55
1826+msgid "Show"
1827+msgstr ""
1828+
1829+#: ../scope/apps/preview.cpp:62
1830+msgid "Hide"
1831+msgstr ""
1832+
1833 #: ../scope/apps/query.cpp:39
1834 msgid "Hidden Desktop Apps"
1835 msgstr "Aplicativos de escritorio ocultos"
1836
1837-#: ../scope/apps/query.cpp:43
1838-msgid "Exclude Apps: "
1839-msgstr "Excluír aplicativos: "
1840-
1841 #. anonymous namespace
1842 #: ../scope/apps/query.cpp:113
1843 msgid ""
1844@@ -55,3 +119,19 @@
1845 msgstr ""
1846 "Todos os aplicativos ocultos. Restabeleza os filtros ou comprobe o apartado "
1847 "de aplicativos de escritorio ocultos."
1848+
1849+#: ../scope/store/query.cpp:68
1850+msgid "%1 result found"
1851+msgstr ""
1852+
1853+#: ../scope/store/query.cpp:69
1854+msgid "%1 results found"
1855+msgstr ""
1856+
1857+#: ../scope/store/query.cpp:74
1858+msgid "Use the searchbar to find software."
1859+msgstr ""
1860+
1861+#: ../scope/store/query.cpp:75
1862+msgid "No results found."
1863+msgstr ""
1864
1865=== modified file 'po/hu.po'
1866--- po/hu.po 2016-08-25 06:10:07 +0000
1867+++ po/hu.po 2016-09-23 14:36:26 +0000
1868@@ -6,11 +6,12 @@
1869 msgid ""
1870 msgstr ""
1871 "Project-Id-Version: libertine-scope\n"
1872-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1873-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
1874+"Report-Msgid-Bugs-To: \n"
1875+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
1876 "PO-Revision-Date: 2016-07-21 20:40+0000\n"
1877 "Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1878 "Language-Team: Hungarian <hu@li.org>\n"
1879+"Language: hu\n"
1880 "MIME-Version: 1.0\n"
1881 "Content-Type: text/plain; charset=UTF-8\n"
1882 "Content-Transfer-Encoding: 8bit\n"
1883@@ -30,14 +31,83 @@
1884 msgid "Search apps"
1885 msgstr "Alkalmazások keresése"
1886
1887+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
1888+msgid "X Apps"
1889+msgstr ""
1890+
1891+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
1892+#, fuzzy
1893+msgid "Hidden X Apps"
1894+msgstr "Rejtett asztali alkalmazások"
1895+
1896+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
1897+msgid "Exclude Apps: "
1898+msgstr "Alkalmazáskivételek: "
1899+
1900+#. anonymous namespace
1901+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
1902+#, fuzzy
1903+msgid ""
1904+"No XApps available. Install new applications with the Libertine Manager."
1905+msgstr ""
1906+"Nincs elérhető alkalmazás. Telepítsen újakat a Libertine-kezelő segítségével."
1907+
1908+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
1909+#, fuzzy
1910+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
1911+msgstr ""
1912+"Minden alkalmazás rejtett. Törölje a szűrőt vagy váltson a rejtett asztali "
1913+"alkalmazásokra."
1914+
1915+#: ../lib/libertine-scope/preview.cpp:40
1916+msgid "Info"
1917+msgstr ""
1918+
1919+#: ../lib/libertine-scope/preview.cpp:41
1920+msgid "Install"
1921+msgstr ""
1922+
1923+#: ../lib/libertine-scope/preview.cpp:42
1924+msgid "Remove"
1925+msgstr ""
1926+
1927+#: ../lib/libertine-scope/preview.cpp:43
1928+msgid "Removing..."
1929+msgstr ""
1930+
1931+#: ../lib/libertine-scope/preview.cpp:44
1932+msgid "Installing..."
1933+msgstr ""
1934+
1935+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
1936+msgid "Open"
1937+msgstr ""
1938+
1939+#: ../lib/libertine-scope/preview.cpp:46
1940+msgid "Publisher/Creator"
1941+msgstr ""
1942+
1943+#: ../lib/libertine-scope/preview.cpp:47
1944+msgid "Website"
1945+msgstr ""
1946+
1947+#: ../lib/libertine-scope/preview.cpp:48
1948+msgid "License"
1949+msgstr ""
1950+
1951+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
1952+#: ../scope/apps/preview.cpp:55
1953+msgid "Show"
1954+msgstr ""
1955+
1956+#: ../scope/apps/preview.cpp:62
1957+msgid "Hide"
1958+msgstr ""
1959+
1960 #: ../scope/apps/query.cpp:39
1961 msgid "Hidden Desktop Apps"
1962 msgstr "Rejtett asztali alkalmazások"
1963
1964-#: ../scope/apps/query.cpp:43
1965-msgid "Exclude Apps: "
1966-msgstr "Alkalmazáskivételek: "
1967-
1968 #. anonymous namespace
1969 #: ../scope/apps/query.cpp:113
1970 msgid ""
1971@@ -53,3 +123,19 @@
1972 msgstr ""
1973 "Minden alkalmazás rejtett. Törölje a szűrőt vagy váltson a rejtett asztali "
1974 "alkalmazásokra."
1975+
1976+#: ../scope/store/query.cpp:68
1977+msgid "%1 result found"
1978+msgstr ""
1979+
1980+#: ../scope/store/query.cpp:69
1981+msgid "%1 results found"
1982+msgstr ""
1983+
1984+#: ../scope/store/query.cpp:74
1985+msgid "Use the searchbar to find software."
1986+msgstr ""
1987+
1988+#: ../scope/store/query.cpp:75
1989+msgid "No results found."
1990+msgstr ""
1991
1992=== modified file 'po/libertine-scope.pot'
1993--- po/libertine-scope.pot 2016-07-20 16:39:17 +0000
1994+++ po/libertine-scope.pot 2016-09-23 14:36:26 +0000
1995@@ -8,7 +8,7 @@
1996 msgstr ""
1997 "Project-Id-Version: PACKAGE VERSION\n"
1998 "Report-Msgid-Bugs-To: \n"
1999-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
2000+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
2001 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
2002 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
2003 "Language-Team: LANGUAGE <LL@li.org>\n"
2004@@ -30,14 +30,77 @@
2005 msgid "Search apps"
2006 msgstr ""
2007
2008+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
2009+msgid "X Apps"
2010+msgstr ""
2011+
2012+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
2013+msgid "Hidden X Apps"
2014+msgstr ""
2015+
2016+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
2017+msgid "Exclude Apps: "
2018+msgstr ""
2019+
2020+#. anonymous namespace
2021+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
2022+msgid ""
2023+"No XApps available. Install new applications with the Libertine Manager."
2024+msgstr ""
2025+
2026+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
2027+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
2028+msgstr ""
2029+
2030+#: ../lib/libertine-scope/preview.cpp:40
2031+msgid "Info"
2032+msgstr ""
2033+
2034+#: ../lib/libertine-scope/preview.cpp:41
2035+msgid "Install"
2036+msgstr ""
2037+
2038+#: ../lib/libertine-scope/preview.cpp:42
2039+msgid "Remove"
2040+msgstr ""
2041+
2042+#: ../lib/libertine-scope/preview.cpp:43
2043+msgid "Removing..."
2044+msgstr ""
2045+
2046+#: ../lib/libertine-scope/preview.cpp:44
2047+msgid "Installing..."
2048+msgstr ""
2049+
2050+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
2051+msgid "Open"
2052+msgstr ""
2053+
2054+#: ../lib/libertine-scope/preview.cpp:46
2055+msgid "Publisher/Creator"
2056+msgstr ""
2057+
2058+#: ../lib/libertine-scope/preview.cpp:47
2059+msgid "Website"
2060+msgstr ""
2061+
2062+#: ../lib/libertine-scope/preview.cpp:48
2063+msgid "License"
2064+msgstr ""
2065+
2066+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2067+#: ../scope/apps/preview.cpp:55
2068+msgid "Show"
2069+msgstr ""
2070+
2071+#: ../scope/apps/preview.cpp:62
2072+msgid "Hide"
2073+msgstr ""
2074+
2075 #: ../scope/apps/query.cpp:39
2076 msgid "Hidden Desktop Apps"
2077 msgstr ""
2078
2079-#: ../scope/apps/query.cpp:43
2080-msgid "Exclude Apps: "
2081-msgstr ""
2082-
2083 #. anonymous namespace
2084 #: ../scope/apps/query.cpp:113
2085 msgid ""
2086@@ -50,3 +113,19 @@
2087 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
2088 "department."
2089 msgstr ""
2090+
2091+#: ../scope/store/query.cpp:68
2092+msgid "%1 result found"
2093+msgstr ""
2094+
2095+#: ../scope/store/query.cpp:69
2096+msgid "%1 results found"
2097+msgstr ""
2098+
2099+#: ../scope/store/query.cpp:74
2100+msgid "Use the searchbar to find software."
2101+msgstr ""
2102+
2103+#: ../scope/store/query.cpp:75
2104+msgid "No results found."
2105+msgstr ""
2106
2107=== modified file 'po/ms.po'
2108--- po/ms.po 2016-08-25 06:10:07 +0000
2109+++ po/ms.po 2016-09-23 14:36:26 +0000
2110@@ -6,11 +6,12 @@
2111 msgid ""
2112 msgstr ""
2113 "Project-Id-Version: libertine-scope\n"
2114-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
2115-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
2116+"Report-Msgid-Bugs-To: \n"
2117+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
2118 "PO-Revision-Date: 2016-05-22 00:24+0000\n"
2119 "Last-Translator: abuyop <Unknown>\n"
2120 "Language-Team: Malay <ms@li.org>\n"
2121+"Language: ms\n"
2122 "MIME-Version: 1.0\n"
2123 "Content-Type: text/plain; charset=UTF-8\n"
2124 "Content-Transfer-Encoding: 8bit\n"
2125@@ -30,14 +31,77 @@
2126 msgid "Search apps"
2127 msgstr ""
2128
2129+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
2130+msgid "X Apps"
2131+msgstr ""
2132+
2133+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
2134+msgid "Hidden X Apps"
2135+msgstr ""
2136+
2137+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
2138+msgid "Exclude Apps: "
2139+msgstr ""
2140+
2141+#. anonymous namespace
2142+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
2143+msgid ""
2144+"No XApps available. Install new applications with the Libertine Manager."
2145+msgstr ""
2146+
2147+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
2148+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
2149+msgstr ""
2150+
2151+#: ../lib/libertine-scope/preview.cpp:40
2152+msgid "Info"
2153+msgstr ""
2154+
2155+#: ../lib/libertine-scope/preview.cpp:41
2156+msgid "Install"
2157+msgstr ""
2158+
2159+#: ../lib/libertine-scope/preview.cpp:42
2160+msgid "Remove"
2161+msgstr ""
2162+
2163+#: ../lib/libertine-scope/preview.cpp:43
2164+msgid "Removing..."
2165+msgstr ""
2166+
2167+#: ../lib/libertine-scope/preview.cpp:44
2168+msgid "Installing..."
2169+msgstr ""
2170+
2171+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
2172+msgid "Open"
2173+msgstr ""
2174+
2175+#: ../lib/libertine-scope/preview.cpp:46
2176+msgid "Publisher/Creator"
2177+msgstr ""
2178+
2179+#: ../lib/libertine-scope/preview.cpp:47
2180+msgid "Website"
2181+msgstr ""
2182+
2183+#: ../lib/libertine-scope/preview.cpp:48
2184+msgid "License"
2185+msgstr ""
2186+
2187+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2188+#: ../scope/apps/preview.cpp:55
2189+msgid "Show"
2190+msgstr ""
2191+
2192+#: ../scope/apps/preview.cpp:62
2193+msgid "Hide"
2194+msgstr ""
2195+
2196 #: ../scope/apps/query.cpp:39
2197 msgid "Hidden Desktop Apps"
2198 msgstr ""
2199
2200-#: ../scope/apps/query.cpp:43
2201-msgid "Exclude Apps: "
2202-msgstr ""
2203-
2204 #. anonymous namespace
2205 #: ../scope/apps/query.cpp:113
2206 msgid ""
2207@@ -50,3 +114,19 @@
2208 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
2209 "department."
2210 msgstr ""
2211+
2212+#: ../scope/store/query.cpp:68
2213+msgid "%1 result found"
2214+msgstr ""
2215+
2216+#: ../scope/store/query.cpp:69
2217+msgid "%1 results found"
2218+msgstr ""
2219+
2220+#: ../scope/store/query.cpp:74
2221+msgid "Use the searchbar to find software."
2222+msgstr ""
2223+
2224+#: ../scope/store/query.cpp:75
2225+msgid "No results found."
2226+msgstr ""
2227
2228=== modified file 'po/pt.po'
2229--- po/pt.po 2016-08-25 06:10:07 +0000
2230+++ po/pt.po 2016-09-23 14:36:26 +0000
2231@@ -6,11 +6,12 @@
2232 msgid ""
2233 msgstr ""
2234 "Project-Id-Version: libertine-scope\n"
2235-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
2236-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
2237+"Report-Msgid-Bugs-To: \n"
2238+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
2239 "PO-Revision-Date: 2016-05-20 16:05+0000\n"
2240 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
2241 "Language-Team: Portuguese <pt@li.org>\n"
2242+"Language: pt\n"
2243 "MIME-Version: 1.0\n"
2244 "Content-Type: text/plain; charset=UTF-8\n"
2245 "Content-Transfer-Encoding: 8bit\n"
2246@@ -30,14 +31,77 @@
2247 msgid "Search apps"
2248 msgstr ""
2249
2250+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
2251+msgid "X Apps"
2252+msgstr ""
2253+
2254+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
2255+msgid "Hidden X Apps"
2256+msgstr ""
2257+
2258+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
2259+msgid "Exclude Apps: "
2260+msgstr ""
2261+
2262+#. anonymous namespace
2263+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
2264+msgid ""
2265+"No XApps available. Install new applications with the Libertine Manager."
2266+msgstr ""
2267+
2268+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
2269+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
2270+msgstr ""
2271+
2272+#: ../lib/libertine-scope/preview.cpp:40
2273+msgid "Info"
2274+msgstr ""
2275+
2276+#: ../lib/libertine-scope/preview.cpp:41
2277+msgid "Install"
2278+msgstr ""
2279+
2280+#: ../lib/libertine-scope/preview.cpp:42
2281+msgid "Remove"
2282+msgstr ""
2283+
2284+#: ../lib/libertine-scope/preview.cpp:43
2285+msgid "Removing..."
2286+msgstr ""
2287+
2288+#: ../lib/libertine-scope/preview.cpp:44
2289+msgid "Installing..."
2290+msgstr ""
2291+
2292+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
2293+msgid "Open"
2294+msgstr ""
2295+
2296+#: ../lib/libertine-scope/preview.cpp:46
2297+msgid "Publisher/Creator"
2298+msgstr ""
2299+
2300+#: ../lib/libertine-scope/preview.cpp:47
2301+msgid "Website"
2302+msgstr ""
2303+
2304+#: ../lib/libertine-scope/preview.cpp:48
2305+msgid "License"
2306+msgstr ""
2307+
2308+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2309+#: ../scope/apps/preview.cpp:55
2310+msgid "Show"
2311+msgstr ""
2312+
2313+#: ../scope/apps/preview.cpp:62
2314+msgid "Hide"
2315+msgstr ""
2316+
2317 #: ../scope/apps/query.cpp:39
2318 msgid "Hidden Desktop Apps"
2319 msgstr ""
2320
2321-#: ../scope/apps/query.cpp:43
2322-msgid "Exclude Apps: "
2323-msgstr ""
2324-
2325 #. anonymous namespace
2326 #: ../scope/apps/query.cpp:113
2327 msgid ""
2328@@ -50,3 +114,19 @@
2329 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
2330 "department."
2331 msgstr ""
2332+
2333+#: ../scope/store/query.cpp:68
2334+msgid "%1 result found"
2335+msgstr ""
2336+
2337+#: ../scope/store/query.cpp:69
2338+msgid "%1 results found"
2339+msgstr ""
2340+
2341+#: ../scope/store/query.cpp:74
2342+msgid "Use the searchbar to find software."
2343+msgstr ""
2344+
2345+#: ../scope/store/query.cpp:75
2346+msgid "No results found."
2347+msgstr ""
2348
2349=== modified file 'po/uk.po'
2350--- po/uk.po 2016-08-25 06:10:07 +0000
2351+++ po/uk.po 2016-09-23 14:36:26 +0000
2352@@ -6,11 +6,12 @@
2353 msgid ""
2354 msgstr ""
2355 "Project-Id-Version: libertine-scope\n"
2356-"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
2357-"POT-Creation-Date: 2016-07-20 12:38-0400\n"
2358+"Report-Msgid-Bugs-To: \n"
2359+"POT-Creation-Date: 2016-08-26 14:45-0400\n"
2360 "PO-Revision-Date: 2016-05-20 15:56+0000\n"
2361 "Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
2362 "Language-Team: Ukrainian <uk@li.org>\n"
2363+"Language: uk\n"
2364 "MIME-Version: 1.0\n"
2365 "Content-Type: text/plain; charset=UTF-8\n"
2366 "Content-Transfer-Encoding: 8bit\n"
2367@@ -30,14 +31,77 @@
2368 msgid "Search apps"
2369 msgstr ""
2370
2371+#: ../.bzr/cobzr/store/scope/apps/query.cpp:38
2372+msgid "X Apps"
2373+msgstr ""
2374+
2375+#: ../.bzr/cobzr/store/scope/apps/query.cpp:39
2376+msgid "Hidden X Apps"
2377+msgstr ""
2378+
2379+#: ../.bzr/cobzr/store/scope/apps/query.cpp:43 ../scope/apps/query.cpp:43
2380+msgid "Exclude Apps: "
2381+msgstr ""
2382+
2383+#. anonymous namespace
2384+#: ../.bzr/cobzr/store/scope/apps/query.cpp:113
2385+msgid ""
2386+"No XApps available. Install new applications with the Libertine Manager."
2387+msgstr ""
2388+
2389+#: ../.bzr/cobzr/store/scope/apps/query.cpp:114
2390+msgid "All XApps hidden. Reset filters or check the Hidden XApps department."
2391+msgstr ""
2392+
2393+#: ../lib/libertine-scope/preview.cpp:40
2394+msgid "Info"
2395+msgstr ""
2396+
2397+#: ../lib/libertine-scope/preview.cpp:41
2398+msgid "Install"
2399+msgstr ""
2400+
2401+#: ../lib/libertine-scope/preview.cpp:42
2402+msgid "Remove"
2403+msgstr ""
2404+
2405+#: ../lib/libertine-scope/preview.cpp:43
2406+msgid "Removing..."
2407+msgstr ""
2408+
2409+#: ../lib/libertine-scope/preview.cpp:44
2410+msgid "Installing..."
2411+msgstr ""
2412+
2413+#: ../lib/libertine-scope/preview.cpp:45 ../scope/apps/preview.cpp:47
2414+msgid "Open"
2415+msgstr ""
2416+
2417+#: ../lib/libertine-scope/preview.cpp:46
2418+msgid "Publisher/Creator"
2419+msgstr ""
2420+
2421+#: ../lib/libertine-scope/preview.cpp:47
2422+msgid "Website"
2423+msgstr ""
2424+
2425+#: ../lib/libertine-scope/preview.cpp:48
2426+msgid "License"
2427+msgstr ""
2428+
2429+#. Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2430+#: ../scope/apps/preview.cpp:55
2431+msgid "Show"
2432+msgstr ""
2433+
2434+#: ../scope/apps/preview.cpp:62
2435+msgid "Hide"
2436+msgstr ""
2437+
2438 #: ../scope/apps/query.cpp:39
2439 msgid "Hidden Desktop Apps"
2440 msgstr ""
2441
2442-#: ../scope/apps/query.cpp:43
2443-msgid "Exclude Apps: "
2444-msgstr ""
2445-
2446 #. anonymous namespace
2447 #: ../scope/apps/query.cpp:113
2448 msgid ""
2449@@ -50,3 +114,19 @@
2450 "All applications hidden. Reset filters or check the Hidden Desktop Apps "
2451 "department."
2452 msgstr ""
2453+
2454+#: ../scope/store/query.cpp:68
2455+msgid "%1 result found"
2456+msgstr ""
2457+
2458+#: ../scope/store/query.cpp:69
2459+msgid "%1 results found"
2460+msgstr ""
2461+
2462+#: ../scope/store/query.cpp:74
2463+msgid "Use the searchbar to find software."
2464+msgstr ""
2465+
2466+#: ../scope/store/query.cpp:75
2467+msgid "No results found."
2468+msgstr ""
2469
2470=== modified file 'scope/CMakeLists.txt'
2471--- scope/CMakeLists.txt 2016-07-12 18:26:07 +0000
2472+++ scope/CMakeLists.txt 2016-09-23 14:36:26 +0000
2473@@ -1,2 +1,2 @@
2474-# add_subdirectory(libertine-store)
2475 add_subdirectory(apps)
2476+add_subdirectory(store)
2477
2478=== modified file 'scope/apps/CMakeLists.txt'
2479--- scope/apps/CMakeLists.txt 2016-07-21 14:10:23 +0000
2480+++ scope/apps/CMakeLists.txt 2016-09-23 14:36:26 +0000
2481@@ -1,8 +1,6 @@
2482 set (CMAKE_INCLUDE_CURRENT_DIR ON)
2483 set (CMAKE_AUTOMOC ON)
2484
2485-pkg_check_modules(URL_DISPATCHER REQUIRED url-dispatcher-1)
2486-
2487 # Find all the sources
2488 file(GLOB_RECURSE SCOPE_SOURCES
2489 "*.cpp"
2490@@ -13,14 +11,16 @@
2491 ${SCOPE_SOURCES}
2492 )
2493
2494-include_directories(${URL_DISPATCHER_INCLUDE_DIRS})
2495-
2496 target_link_libraries(apps
2497+ ${SCOPE_LIB_NAME}
2498 ${SCOPE_LDFLAGS}
2499+ ${LIBERTINE_LDFLAGS}
2500 ${UAL_LDFLAGS}
2501- ${LIBERTINE_LDFLAGS}
2502 Qt5::Core
2503- ${URL_DISPATCHER_LIBRARIES}
2504+)
2505+
2506+include_directories(
2507+ ${CMAKE_SOURCE_DIR}/lib
2508 )
2509
2510 configure_file(
2511
2512=== modified file 'scope/apps/action.cpp'
2513--- scope/apps/action.cpp 2016-07-29 13:21:34 +0000
2514+++ scope/apps/action.cpp 2016-09-23 14:36:26 +0000
2515@@ -21,50 +21,42 @@
2516 #include "scope/apps/hidden_apps.h"
2517 #include <unity/scopes/ActivationResponse.h>
2518 #include <unity/scopes/CannedQuery.h>
2519-#include <url-dispatcher.h>
2520 #include <QString>
2521 #include <QFile>
2522 #include <QTextStream>
2523
2524-namespace usc = unity::scopes;
2525-
2526
2527 namespace
2528 {
2529-static usc::ActivationResponse
2530-sendToResults(usc::FilterState const& filter_state)
2531+static unity::scopes::ActivationResponse
2532+sendToResults(unity::scopes::FilterState const& filter_state)
2533 {
2534- usc::CannedQuery query(FULLY_QUALIFIED_APPS_SCOPE);
2535+ unity::scopes::CannedQuery query(FULLY_QUALIFIED_APPS_SCOPE);
2536 query.set_filter_state(filter_state);
2537- return usc::ActivationResponse(query);
2538+ return unity::scopes::ActivationResponse(query);
2539 }
2540 }
2541
2542
2543 Action::
2544-Action(unity::scopes::Result const& result,
2545- unity::scopes::ActionMetadata const& metadata,
2546- std::string const& action_id,
2547- Action::OpenUriAction open_action,
2548- std::shared_ptr<HiddenApps> hidden,
2549- unity::scopes::FilterState const& filter_state)
2550- : usc::ActivationQueryBase(result, metadata)
2551+Action(unity::scopes::Result const& result,
2552+ unity::scopes::ActionMetadata const& metadata,
2553+ std::string const& action_id,
2554+ std::shared_ptr<libertine::scope::ServiceManager> const& service,
2555+ std::shared_ptr<HiddenApps> const& hidden,
2556+ unity::scopes::FilterState const& filter_state)
2557+ : libertine::scope::Action(result, metadata, action_id, service)
2558 , action_id_(action_id)
2559- , open_action_(open_action)
2560 , hidden_(hidden)
2561 , filter_state_(filter_state)
2562 {
2563 }
2564
2565
2566-usc::ActivationResponse
2567-Action::activate()
2568+unity::scopes::ActivationResponse Action::
2569+activate()
2570 {
2571- if (action_id_ == "open")
2572- {
2573- open_action_(result().uri());
2574- }
2575- else if (action_id_ == "hide")
2576+ if (action_id_ == "hide")
2577 {
2578 hidden_->add(QString::fromStdString(result()["app_id"].get_string()));
2579 return sendToResults(filter_state_);
2580@@ -74,5 +66,6 @@
2581 hidden_->remove(QString::fromStdString(result()["app_id"].get_string()));
2582 return sendToResults(filter_state_);
2583 }
2584- return usc::ActivationResponse(usc::ActivationResponse::Status::NotHandled);
2585+
2586+ return libertine::scope::Action::activate();
2587 }
2588
2589=== modified file 'scope/apps/action.h'
2590--- scope/apps/action.h 2016-07-28 20:12:03 +0000
2591+++ scope/apps/action.h 2016-09-23 14:36:26 +0000
2592@@ -19,6 +19,7 @@
2593 #define SCOPE_ACTION_H_
2594
2595
2596+#include <libertine-scope/action.h>
2597 #include <unity/scopes/ActionMetadata.h>
2598 #include <unity/scopes/ActivationQueryBase.h>
2599 #include <unity/scopes/ActivationResponse.h>
2600@@ -27,16 +28,16 @@
2601
2602 class HiddenApps;
2603
2604-class Action : public unity::scopes::ActivationQueryBase {
2605+class Action : public libertine::scope::Action
2606+{
2607 public:
2608- typedef std::function<void(std::string const&)> OpenUriAction;
2609-
2610- explicit Action(unity::scopes::Result const& result,
2611- unity::scopes::ActionMetadata const& metadata,
2612- std::string const& action_id,
2613- OpenUriAction open_action,
2614- std::shared_ptr<HiddenApps> hidden,
2615- unity::scopes::FilterState const& filterState);
2616+ explicit
2617+ Action(unity::scopes::Result const& result,
2618+ unity::scopes::ActionMetadata const& metadata,
2619+ std::string const& action_id,
2620+ std::shared_ptr<libertine::scope::ServiceManager> const& service,
2621+ std::shared_ptr<HiddenApps> const& hidden,
2622+ unity::scopes::FilterState const& filterState);
2623
2624 virtual ~Action() = default;
2625 virtual unity::scopes::ActivationResponse activate() override;
2626@@ -44,7 +45,6 @@
2627 private:
2628 std::string action_id_;
2629 std::string cache_dir_;
2630- OpenUriAction open_action_;
2631 std::shared_ptr<HiddenApps> hidden_;
2632 unity::scopes::FilterState filter_state_;
2633 };
2634
2635=== modified file 'scope/apps/applauncher.cpp'
2636--- scope/apps/applauncher.cpp 2016-07-12 18:26:07 +0000
2637+++ scope/apps/applauncher.cpp 2016-09-23 14:36:26 +0000
2638@@ -26,20 +26,11 @@
2639 name_ = app->info()->name().value();
2640 icon_ = app->info()->iconPath().value();
2641 description_ = app->info()->description().value();
2642+ id_ = appId.appname.value() + ".desktop";
2643 uri_ = "appid://" + container_id + "/" + appId.appname.value() + "/0.0";
2644 }
2645
2646
2647-AppLauncher::
2648-AppLauncher() { /* empty */ }
2649-
2650-
2651-AppLauncher::
2652-~AppLauncher()
2653-{
2654-}
2655-
2656-
2657 std::string AppLauncher::
2658 name() const
2659 {
2660@@ -67,3 +58,10 @@
2661 return uri_;
2662 }
2663
2664+
2665+std::string AppLauncher::
2666+id() const
2667+{
2668+ return id_;
2669+}
2670+
2671
2672=== modified file 'scope/apps/applauncher.h'
2673--- scope/apps/applauncher.h 2016-05-03 13:25:14 +0000
2674+++ scope/apps/applauncher.h 2016-09-23 14:36:26 +0000
2675@@ -33,7 +33,7 @@
2676 AppLauncher(const std::string& app_id, const std::string& container_name);
2677
2678 virtual
2679- ~AppLauncher();
2680+ ~AppLauncher() = default;
2681
2682 virtual std::string
2683 name() const;
2684@@ -47,14 +47,18 @@
2685 virtual std::string
2686 uri() const;
2687
2688+ virtual std::string
2689+ id() const;
2690+
2691 protected:
2692 explicit
2693- AppLauncher();
2694+ AppLauncher() = default;
2695
2696 std::string name_;
2697 std::string icon_;
2698 std::string uri_;
2699 std::string description_;
2700+ std::string id_;
2701 };
2702
2703 #endif /* LIBERTINE_SCOPE_APPLAUNCHER_H */
2704
2705=== modified file 'scope/apps/config.h.in'
2706--- scope/apps/config.h.in 2016-07-29 13:21:34 +0000
2707+++ scope/apps/config.h.in 2016-09-23 14:36:26 +0000
2708@@ -17,7 +17,9 @@
2709 #define LIBERTINE_SCOPE_CONFIG_H_
2710
2711 const std::string FULLY_QUALIFIED_APPS_SCOPE = "@FULLY_QUALIFIED_NAME@";
2712+const std::string STORE_SCOPE_FULL_NAME = "@STORE_PACKAGE_NAME@";
2713 const std::string ROOT_DEPT_ID = "root_dept";
2714 const std::string HIDDEN_DEPT_ID = "hidden_dept";
2715+const std::string DATA_DIR = "@APPS_DATA_DIR@";
2716
2717 #endif // LIBERTINE_SCOPE_CONFIG_H_
2718
2719=== modified file 'scope/apps/libertine.cpp'
2720--- scope/apps/libertine.cpp 2016-07-28 14:04:27 +0000
2721+++ scope/apps/libertine.cpp 2016-09-23 14:36:26 +0000
2722@@ -19,6 +19,7 @@
2723 #include <liblibertine/libertine.h>
2724 #include <glib.h>
2725
2726+
2727 namespace
2728 {
2729
2730
2731=== removed file 'scope/apps/localization.h'
2732--- scope/apps/localization.h 2015-12-29 21:50:58 +0000
2733+++ scope/apps/localization.h 1970-01-01 00:00:00 +0000
2734@@ -1,31 +0,0 @@
2735-#ifndef LOCALIZATION_H_
2736-#define LOCALIZATION_H_
2737-
2738-#include <libintl.h>
2739-#include <string>
2740-
2741-
2742-inline char*
2743-_(const char *__msgid)
2744-{
2745- return dgettext(GETTEXT_PACKAGE, __msgid);
2746-}
2747-
2748-
2749-inline std::string
2750-_(char const*__msgid1, char const*__msgid2, unsigned long int __n)
2751-{
2752- char buffer [256];
2753- if (snprintf(buffer, 256, dngettext(GETTEXT_PACKAGE, __msgid1, __msgid2, __n), __n ) >= 0)
2754- {
2755- return buffer;
2756- }
2757- else
2758- {
2759- return std::string();
2760- }
2761-}
2762-
2763-#endif // LOCALIZATION_H_
2764-
2765-
2766
2767=== modified file 'scope/apps/preview.cpp'
2768--- scope/apps/preview.cpp 2016-07-12 18:26:07 +0000
2769+++ scope/apps/preview.cpp 2016-09-23 14:36:26 +0000
2770@@ -13,9 +13,11 @@
2771 * You should have received a copy of the GNU General Public License
2772 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2773 */
2774-
2775 #include "scope/apps/preview.h"
2776+
2777 #include "scope/apps/config.h"
2778+#include "scope/apps/hidden_apps.h"
2779+#include <libertine-scope/i18n.h>
2780 #include <unity/scopes/PreviewReply.h>
2781 #include <unity/scopes/Variant.h>
2782 #include <unity/scopes/VariantBuilder.h>
2783@@ -24,64 +26,42 @@
2784
2785 namespace usc = unity::scopes;
2786
2787-Preview::
2788-Preview(usc::Result const& result,
2789- usc::ActionMetadata const& metadata)
2790-: PreviewQueryBase(result, metadata)
2791-{
2792-}
2793-
2794-
2795-Preview::
2796-~Preview()
2797-{
2798-}
2799-
2800-
2801-void Preview::
2802-cancelled()
2803-{
2804-}
2805-
2806-
2807-void Preview::
2808-run(usc::PreviewReplyProxy const& reply)
2809-{
2810- usc::PreviewWidget header("hdr", "header");
2811- header.add_attribute_mapping("title", "title");
2812- header.add_attribute_mapping("mascot", "art");
2813- header.add_attribute_value("fallback", usc::Variant("image://theme/placeholder-app-icon"));
2814-
2815- usc::PreviewWidget buttons("buttons", "actions");
2816+
2817+Preview::
2818+Preview(usc::Result const& result,
2819+ usc::ActionMetadata const& metadata,
2820+ std::shared_ptr<libertine::scope::ServiceManager> const& service,
2821+ std::shared_ptr<HiddenApps> const& hidden)
2822+ : libertine::scope::Preview(result, metadata, service)
2823+ , hidden_(hidden)
2824+{
2825+}
2826+
2827+
2828+unity::scopes::PreviewWidget Preview::buttonWidgets(libertine::scope::Package const&) const
2829+{
2830+ usc::PreviewWidget buttons("actions", "actions");
2831 usc::VariantBuilder vb;
2832 vb.add_tuple({
2833 {"id", usc::Variant("open")},
2834- {"label", usc::Variant("Open")},
2835+ {"label", usc::Variant(_("Open"))}
2836 });
2837
2838- if (result().contains("department_id"))
2839- {
2840- if (result()["department_id"].get_string() == ROOT_DEPT_ID)
2841- {
2842- vb.add_tuple({
2843- {"id", usc::Variant("hide")},
2844- {"label", usc::Variant("Hide")},
2845- });
2846- }
2847- else
2848- {
2849- vb.add_tuple({
2850- {"id", usc::Variant("show")},
2851- //Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2852- {"label", usc::Variant("Show")},
2853- });
2854- }
2855+ if (hidden_->app_is_hidden(QString::fromStdString(result()["app_id"].get_string())))
2856+ {
2857+ vb.add_tuple({
2858+ {"id", usc::Variant("show")},
2859+ //Translators: Users tap "Show" button to remove an app from the hidden list of apps: so the meaning is to undo a hide
2860+ {"label", usc::Variant(_("Show"))},
2861+ });
2862+ }
2863+ else
2864+ {
2865+ vb.add_tuple({
2866+ {"id", usc::Variant("hide")},
2867+ {"label", usc::Variant(_("Hide"))},
2868+ });
2869 }
2870 buttons.add_attribute_value("actions", vb.end());
2871-
2872- usc::PreviewWidget desc("desc", "text");
2873- desc.add_attribute_mapping("text", "description");
2874-
2875- usc::PreviewWidgetList widgets{ header, desc, buttons };
2876- reply->push(widgets);
2877+ return buttons;
2878 }
2879
2880=== modified file 'scope/apps/preview.h'
2881--- scope/apps/preview.h 2016-06-10 15:11:56 +0000
2882+++ scope/apps/preview.h 2016-09-23 14:36:26 +0000
2883@@ -13,26 +13,31 @@
2884 * You should have received a copy of the GNU General Public License
2885 * along with this program. If not, see <http://www.gnu.org/licenses/>.
2886 */
2887-#ifndef LIBERTINE_SCOPE_PREVIEW_H
2888-#define LIBERTINE_SCOPE_PREVIEW_H
2889-
2890+#pragma once
2891+
2892+
2893+#include <libertine-scope/preview.h>
2894 #include <unity/scopes/PreviewQueryBase.h>
2895
2896+class HiddenApps;
2897+
2898
2899 class Preview
2900-: public unity::scopes::PreviewQueryBase
2901+: public libertine::scope::Preview
2902 {
2903 public:
2904- Preview(unity::scopes::Result const& result,
2905- unity::scopes::ActionMetadata const& metadata);
2906-
2907- virtual ~Preview();
2908-
2909- void
2910- cancelled() override;
2911-
2912- void
2913- run(unity::scopes::PreviewReplyProxy const& reply) override;
2914+ explicit
2915+ Preview(unity::scopes::Result const& result,
2916+ unity::scopes::ActionMetadata const& metadata,
2917+ std::shared_ptr<libertine::scope::ServiceManager> const& service,
2918+ std::shared_ptr<HiddenApps> const& hidden);
2919+
2920+ virtual ~Preview() = default;
2921+
2922+protected:
2923+ virtual unity::scopes::PreviewWidget
2924+ buttonWidgets(const libertine::scope::Package &package) const override;
2925+
2926+private:
2927+ std::shared_ptr<HiddenApps> hidden_;
2928 };
2929-
2930-#endif /* LIBERTINE_SCOPE_PREVIEW_H */
2931
2932=== modified file 'scope/apps/query.cpp'
2933--- scope/apps/query.cpp 2016-07-28 14:04:27 +0000
2934+++ scope/apps/query.cpp 2016-09-23 14:36:26 +0000
2935@@ -17,7 +17,7 @@
2936 #include "scope/apps/query.h"
2937 #include "scope/apps/container.h"
2938 #include "scope/apps/config.h"
2939-#include "scope/apps/localization.h"
2940+#include <libertine-scope/i18n.h>
2941 #include <unity/scopes/CategorisedResult.h>
2942 #include <unity/scopes/CategoryRenderer.h>
2943 #include <unity/scopes/QueryBase.h>
2944@@ -31,8 +31,10 @@
2945 #include <QFile>
2946 #include <QTextStream>
2947
2948+
2949 namespace usc = unity::scopes;
2950
2951+
2952 namespace
2953 {
2954 static const auto ROOT_DEPT_TITLE = _("Desktop Apps");
2955@@ -41,6 +43,8 @@
2956 static const auto APP_ID_FIELD = "app_id";
2957 static const auto DEPARTMENT_ID_FIELD = "department_id";
2958 static const auto EXCLUDED_APPS_FILTER_TITLE = _("Exclude Apps: ");
2959+static const auto SEARCH_STORE_HINT = _("Search for '%s' in the store");
2960+static const auto SEARCH_STORE_CATEGORY_TITLE = _("Get more apps from the store");
2961
2962 struct AppInfo
2963 {
2964@@ -107,23 +111,45 @@
2965 }
2966 }
2967 )";
2968+
2969+
2970+static const auto CATEGORY_STORE = R"(
2971+ {
2972+ "schema-version": 1,
2973+ "template": {
2974+ "category-layout": "grid",
2975+ "overlay": true,
2976+ "card-background": "color:///#E95420"
2977+ },
2978+ "components": {
2979+ "title": "title",
2980+ "art": {
2981+ "aspect-ratio": 0.55,
2982+ "field": "art"
2983+ },
2984+ "overlay-color": "overlay-color"
2985+ }
2986+ }
2987+)";
2988 } // anonymous namespace
2989
2990
2991-std::string const Query::NO_RESULTS_HINT = _("No applications available. Install new applications with the Libertine Manager.");
2992-std::string const Query::ALL_RESULTS_FILTERED_HINT = _("All applications hidden. Reset filters or check the Hidden Desktop Apps department.");
2993+std::string const Query::NO_RESULTS_HINT = _("No applications available in this department.");
2994+std::string const Query::ALL_RESULTS_FILTERED_HINT = _("All applications filtered. Reset filters or clear department.");
2995
2996
2997 Query::
2998-Query(usc::CannedQuery const& query,
2999- usc::SearchMetadata const& metadata,
3000- Libertine::Factory const& libertine_factory,
3001+Query(usc::CannedQuery const& query,
3002+ usc::SearchMetadata const& metadata,
3003+ Libertine::Factory const& libertine_factory,
3004 std::shared_ptr<HiddenApps> hidden,
3005- std::shared_ptr<Blacklist> blacklist)
3006+ std::shared_ptr<Blacklist> blacklist,
3007+ std::string const& data_directory)
3008 : usc::SearchQueryBase(query, metadata)
3009 , libertine_factory_(libertine_factory)
3010 , hidden_(hidden)
3011 , blacklist_(blacklist)
3012+ , data_directory_(data_directory)
3013 {
3014 }
3015
3016@@ -201,6 +227,35 @@
3017
3018
3019 void Query::
3020+add_store_link(usc::SearchReplyProxy const& reply) const
3021+{
3022+ const auto querystr = query().query_string();
3023+ auto cat_title = SEARCH_STORE_CATEGORY_TITLE;
3024+
3025+ if (!querystr.empty())
3026+ {
3027+ char tmp[512];
3028+ if (snprintf(tmp, sizeof(tmp), SEARCH_STORE_HINT.c_str(), querystr.c_str()) > 0)
3029+ {
3030+ cat_title = tmp;
3031+ }
3032+ }
3033+
3034+ usc::CategoryRenderer rdr(CATEGORY_STORE);
3035+ auto cat = reply->register_category("hint", cat_title, "", rdr);
3036+
3037+ const unity::scopes::CannedQuery store_scope(STORE_SCOPE_FULL_NAME, querystr, "");
3038+
3039+ usc::CategorisedResult res(cat);
3040+ res.set_title(_("Install X Apps"));
3041+ res.set_art(data_directory_ + "/store.svg");
3042+ res.set_uri(store_scope.to_uri());
3043+ res["overlay-color"] = "transparent";
3044+ reply->push(res);
3045+}
3046+
3047+
3048+void Query::
3049 run(usc::SearchReplyProxy const& reply)
3050 {
3051 if (!hidden_->empty())
3052@@ -219,7 +274,8 @@
3053
3054 QRegExp search_query(QString::fromStdString(query().query_string()), Qt::CaseInsensitive);
3055 bool has_no_apps = true,
3056- all_filtered = true;
3057+ all_filtered = true,
3058+ is_hidden_dept = query().department_id() == HIDDEN_DEPT_ID;
3059
3060 for (auto const& container: libertine->get_container_list())
3061 {
3062@@ -230,44 +286,41 @@
3063
3064 for (auto const& app: container->app_launchers())
3065 {
3066+ auto app_info = parse_app_info(app.uri());
3067+
3068+ // ignore blacklisted apps
3069+ if (blacklist_->app_is_blacklisted(app_info.app_id, container->id()))
3070+ {
3071+ continue;
3072+ }
3073+
3074+ // ignore hidden apps unless in hidden dept
3075+ if ((!is_hidden_dept && hidden_->app_is_hidden(app_info.key)) ||
3076+ (is_hidden_dept && !hidden_->app_is_hidden(app_info.key)))
3077+ {
3078+ continue;
3079+ }
3080+
3081 has_no_apps = false;
3082+
3083 if (!(search_query.isEmpty() || QString::fromStdString(app.name()).contains(search_query)))
3084 {
3085 continue;
3086 }
3087
3088- auto app_info = parse_app_info(app.uri());
3089-
3090- if (blacklist_->app_is_blacklisted(app_info.app_id, container->id()))
3091- {
3092- continue;
3093- }
3094-
3095 if (excludes_by_filter.contains(app_info.key))
3096 {
3097 continue;
3098 }
3099
3100- // ignore hidden apps in root department
3101- if (query().department_id().empty() || query().department_id() == ROOT_DEPT_ID)
3102- {
3103- if (hidden_->app_is_hidden(app_info.key))
3104- {
3105- continue;
3106- }
3107- }
3108- else if (!hidden_->app_is_hidden(app_info.key))
3109- {
3110- continue;
3111- }
3112-
3113 usc::CategorisedResult result(category);
3114 result.set_title(app.name());
3115 result.set_art(app.icon());
3116 result.set_uri(app.uri());
3117 result[DESCRIPTION_FIELD] = app.description();
3118 result[APP_ID_FIELD] = app_info.key.toStdString();
3119- result[DEPARTMENT_ID_FIELD] = (query().department_id().empty() || query().department_id() == ROOT_DEPT_ID) ? ROOT_DEPT_ID : HIDDEN_DEPT_ID;
3120+ result["id"] = app.id();
3121+ result[DEPARTMENT_ID_FIELD] = is_hidden_dept ? HIDDEN_DEPT_ID : ROOT_DEPT_ID;
3122
3123 if (!reply->push(result))
3124 {
3125@@ -278,12 +331,19 @@
3126 }
3127 }
3128
3129- if (has_no_apps)
3130+ if (is_hidden_dept)
3131 {
3132- show_hint(reply, NO_RESULTS_HINT);
3133+ if (has_no_apps)
3134+ {
3135+ show_hint(reply, NO_RESULTS_HINT);
3136+ }
3137+ else if (all_filtered)
3138+ {
3139+ show_hint(reply, ALL_RESULTS_FILTERED_HINT);
3140+ }
3141 }
3142- else if (all_filtered)
3143+ else
3144 {
3145- show_hint(reply, ALL_RESULTS_FILTERED_HINT);
3146+ add_store_link(reply);
3147 }
3148 }
3149
3150=== modified file 'scope/apps/query.h'
3151--- scope/apps/query.h 2016-07-28 14:04:27 +0000
3152+++ scope/apps/query.h 2016-09-23 14:36:26 +0000
3153@@ -35,7 +35,8 @@
3154 unity::scopes::SearchMetadata const& metadata,
3155 Libertine::Factory const& libertine_factory,
3156 std::shared_ptr<HiddenApps> hidden_apps,
3157- std::shared_ptr<Blacklist> blacklist);
3158+ std::shared_ptr<Blacklist> blacklist,
3159+ std::string const& data_directory);
3160
3161 ~Query() = default;
3162
3163@@ -53,10 +54,12 @@
3164 QStringList make_filters(unity::scopes::SearchReplyProxy const& reply, Libertine::UPtr libertine) const;
3165 void show_hint(unity::scopes::SearchReplyProxy const& reply, std::string const& reason) const;
3166 void parse_blacklist(const std::string& data_dir);
3167+ void add_store_link(unity::scopes::SearchReplyProxy const& reply) const;
3168
3169 Libertine::Factory libertine_factory_;
3170 std::shared_ptr<HiddenApps> hidden_;
3171 std::shared_ptr<Blacklist> blacklist_;
3172+ const std::string data_directory_;
3173 };
3174
3175 #endif // LIBERTINE_SCOPE_QUERY_H_
3176
3177=== modified file 'scope/apps/scope.cpp'
3178--- scope/apps/scope.cpp 2016-07-29 13:21:34 +0000
3179+++ scope/apps/scope.cpp 2016-09-23 14:36:26 +0000
3180@@ -18,27 +18,18 @@
3181 #include "scope/apps/preview.h"
3182 #include "scope/apps/query.h"
3183 #include "scope/apps/action.h"
3184-#include "scope/apps/localization.h"
3185+#include <libertine-scope/i18n.h>
3186+#include <libertine-scope/action.h>
3187+#include <libertine-scope/preview.h>
3188+#include <libertine-scope/service_manager.h>
3189 #include <sstream>
3190-#include <url-dispatcher.h>
3191 #include <QFile>
3192 #include <QTextStream>
3193 #include <QString>
3194
3195-
3196 namespace usc = unity::scopes;
3197
3198
3199-namespace
3200-{
3201-static void
3202-open_application(std::string const& app_uri)
3203-{
3204- url_dispatch_send(app_uri.c_str(), NULL, NULL);
3205-}
3206-}
3207-
3208-
3209 Scope::
3210 Scope(Libertine::Factory const& libertine_factory)
3211 : libertine_factory_(libertine_factory)
3212@@ -71,7 +62,8 @@
3213 metadata,
3214 libertine_factory_,
3215 std::make_shared<HiddenApps>(cache_directory()),
3216- std::make_shared<Blacklist>(scope_directory())));
3217+ std::make_shared<Blacklist>(scope_directory()),
3218+ scope_directory()));
3219 }
3220
3221
3222@@ -79,7 +71,10 @@
3223 preview(usc::Result const& result,
3224 usc::ActionMetadata const& metadata)
3225 {
3226- return usc::PreviewQueryBase::UPtr(new Preview(result, metadata));
3227+ return usc::PreviewQueryBase::UPtr(new Preview(result,
3228+ metadata,
3229+ std::make_shared<libertine::scope::ServiceManager>(),
3230+ std::make_shared<HiddenApps>(cache_directory())));
3231 }
3232
3233
3234@@ -92,7 +87,7 @@
3235 return usc::ActivationQueryBase::UPtr(new Action(result,
3236 metadata,
3237 action_id,
3238- open_application,
3239+ std::make_shared<libertine::scope::ServiceManager>(),
3240 std::make_shared<HiddenApps>(cache_directory()),
3241 filter_state_));
3242 }
3243
3244=== added directory 'scope/store'
3245=== added file 'scope/store/CMakeLists.txt'
3246--- scope/store/CMakeLists.txt 1970-01-01 00:00:00 +0000
3247+++ scope/store/CMakeLists.txt 2016-09-23 14:36:26 +0000
3248@@ -0,0 +1,50 @@
3249+set (CMAKE_INCLUDE_CURRENT_DIR ON)
3250+set (CMAKE_AUTOMOC ON)
3251+
3252+set(STORE_SCOPE_TARGET store)
3253+
3254+# Find all the sources
3255+file(GLOB_RECURSE STORE_SCOPE_SOURCES
3256+ "*.cpp"
3257+ "*.h"
3258+)
3259+
3260+add_library(${STORE_SCOPE_TARGET} SHARED
3261+ ${STORE_SCOPE_SOURCES}
3262+)
3263+
3264+target_link_libraries(${STORE_SCOPE_TARGET}
3265+ ${SCOPE_LIB_NAME}
3266+ ${SCOPE_LDFLAGS}
3267+ ${LIBERTINE_LDFLAGS}
3268+ Qt5::Core
3269+)
3270+
3271+include_directories(
3272+ ${CMAKE_SOURCE_DIR}/lib
3273+)
3274+
3275+set_target_properties(store
3276+ PROPERTIES
3277+ OUTPUT_NAME ${STORE_PACKAGE_NAME}
3278+)
3279+
3280+install(TARGETS ${STORE_SCOPE_TARGET}
3281+ LIBRARY DESTINATION "${STORE_LIB_DIR}"
3282+)
3283+
3284+set(STORE_INI_TARGET ${STORE_PACKAGE_NAME}.ini)
3285+configure_file(
3286+ ${STORE_INI_TARGET}.in.in
3287+ ${STORE_INI_TARGET}.in
3288+)
3289+
3290+add_custom_target(${STORE_INI_TARGET} ALL
3291+ COMMENT "Merging translations into ${STORE_INI_TARGET}"
3292+ COMMAND LC_ALL=C ${INTLTOOL_MERGE} -d -u ${CMAKE_SOURCE_DIR}/po ${STORE_INI_TARGET}.in ${STORE_INI_TARGET} >/dev/null
3293+)
3294+
3295+install(
3296+ FILES "${CMAKE_CURRENT_BINARY_DIR}/${STORE_INI_TARGET}"
3297+ DESTINATION "${STORE_LIB_DIR}"
3298+)
3299
3300=== added file 'scope/store/entry_point.cpp'
3301--- scope/store/entry_point.cpp 1970-01-01 00:00:00 +0000
3302+++ scope/store/entry_point.cpp 2016-09-23 14:36:26 +0000
3303@@ -0,0 +1,42 @@
3304+/**
3305+ * @file store/entry_point.cpp
3306+ * @brief The scope entry point.
3307+ */
3308+/*
3309+ * Copyright 2016 Canonical Ltd.
3310+ *
3311+ * This program is free software: you can redistribute it and/or modify it under
3312+ * the terms of the GNU General Public License, version 3, as published by the
3313+ * Free Software Foundation.
3314+ *
3315+ * This program is distributed in the hope that it will be useful,
3316+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3317+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3318+ * GNU General Public License for more details.
3319+ *
3320+ * You should have received a copy of the GNU General Public License
3321+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3322+ */
3323+#include "scope/store/scope.h"
3324+#include <unity/scopes/ScopeBase.h>
3325+
3326+#define EXPORT __attribute__((visibility ("default")))
3327+
3328+// These functions define the entry points for the scope plugin
3329+extern "C"
3330+{
3331+
3332+EXPORT unity::scopes::ScopeBase*
3333+UNITY_SCOPE_CREATE_FUNCTION()
3334+{
3335+ return new libertine::scope::Scope();
3336+}
3337+
3338+
3339+EXPORT void
3340+UNITY_SCOPE_DESTROY_FUNCTION(unity::scopes::ScopeBase* scope)
3341+{
3342+ delete scope;
3343+}
3344+
3345+}
3346
3347=== added file 'scope/store/libertine-scope.ubuntu_libertine-store.ini.in.in'
3348--- scope/store/libertine-scope.ubuntu_libertine-store.ini.in.in 1970-01-01 00:00:00 +0000
3349+++ scope/store/libertine-scope.ubuntu_libertine-store.ini.in.in 2016-09-23 14:36:26 +0000
3350@@ -0,0 +1,10 @@
3351+[ScopeConfig]
3352+_DisplayName=Find Desktop Apps
3353+_Description=Search for XApps to install.
3354+Author=The Canonical Libertine Team <libertine-team@lists.launchpad.net>
3355+Icon=@APPS_DATA_DIR@/apps.png
3356+_SearchHint=Search apps
3357+Keywords=apps
3358+
3359+[Appearance]
3360+LogoOverlayColor=#ffffffff
3361
3362=== added file 'scope/store/query.cpp'
3363--- scope/store/query.cpp 1970-01-01 00:00:00 +0000
3364+++ scope/store/query.cpp 2016-09-23 14:36:26 +0000
3365@@ -0,0 +1,149 @@
3366+/*
3367+ * Copyright 2016 Canonical Ltd.
3368+ *
3369+ * This program is free software: you can redistribute it and/or modify it under
3370+ * the terms of the GNU General Public License, version 3, as published by the
3371+ * Free Software Foundation.
3372+ *
3373+ * This program is distributed in the hope that it will be useful,
3374+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3375+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3376+ * GNU General Public License for more details.
3377+ *
3378+ * You should have received a copy of the GNU General Public License
3379+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3380+ */
3381+#include "scope/store/query.h"
3382+
3383+#include <libertine-scope/service_manager.h>
3384+#include <libertine-scope/i18n.h>
3385+#include <unity/scopes/SearchReply.h>
3386+#include <unity/scopes/CategoryRenderer.h>
3387+#include <unity/scopes/VariantBuilder.h>
3388+#include <QtDBus>
3389+#include <QDebug>
3390+
3391+namespace usc = unity::scopes;
3392+
3393+namespace
3394+{
3395+static constexpr auto CATEGORY_APPS_DISPLAY = R"(
3396+ {
3397+ "schema-version" : 1,
3398+ "template" : {
3399+ "category-layout" : "grid",
3400+ "card-layout" : "horizontal",
3401+ "collapsed-rows": 0,
3402+ "card-size": "large"
3403+ },
3404+ "components" : {
3405+ "title" : "title",
3406+ "art" : {
3407+ "field": "art",
3408+ "aspect-ratio": 1.13,
3409+ "fallback": "image://theme/placeholder-app-icon"
3410+ },
3411+ "subtitle": "subtitle",
3412+ "attributes": { "field": "attributes", "max-count": 3 }
3413+ }
3414+ }
3415+)";
3416+
3417+
3418+static constexpr auto CATEGORY_HINT = R"(
3419+ {
3420+ "schema-version": 1,
3421+ "template": {
3422+ "category-layout": "grid",
3423+ "card-size": "large",
3424+ "card-layout": "horizontal"
3425+ },
3426+ "components": {
3427+ "title": "title"
3428+ }
3429+ }
3430+)";
3431+
3432+
3433+static auto const SINGLE_RESULT_FOUND = _("%1 result found");
3434+static auto const MULTIPLE_RESULTS_FOUND = _("%1 results found");
3435+static QString const APPID_URI_FORMAT = "appid://palatine/%1/0.0";
3436+}
3437+
3438+
3439+std::string const libertine::scope::Query::USE_SEARCH_HINT = _("Use the searchbar to find software.");
3440+std::string const libertine::scope::Query::NO_SEARCH_RESULTS_HINT = _("No results found.");
3441+
3442+
3443+libertine::scope::Query::
3444+Query(usc::CannedQuery const& query,
3445+ usc::SearchMetadata const& metadata,
3446+ std::shared_ptr<ServiceManager> const& service)
3447+ : usc::SearchQueryBase(query, metadata)
3448+ , service_(service)
3449+{
3450+}
3451+
3452+
3453+void libertine::scope::Query::
3454+cancelled()
3455+{
3456+}
3457+
3458+
3459+void libertine::scope::Query::
3460+show_hint(usc::SearchReplyProxy const& reply,
3461+ std::string const& reason) const
3462+{
3463+ auto hint_category = reply->register_category("hint", "", "", usc::CategoryRenderer(CATEGORY_HINT));
3464+ usc::CategorisedResult res(hint_category);
3465+ res.set_uri(usc::CannedQuery(query()).to_uri());
3466+ res.set_title(reason);
3467+ reply->push(res);
3468+}
3469+
3470+
3471+void libertine::scope::Query::
3472+run_search(usc::SearchReplyProxy const& reply) const
3473+{
3474+ auto results = service_->search_cache(QString::fromStdString(query().query_string()));
3475+ if (results.empty())
3476+ {
3477+ show_hint(reply, NO_SEARCH_RESULTS_HINT);
3478+ return;
3479+ }
3480+
3481+ auto category = reply->register_category("aptcache",
3482+ _("%u result found", "%u results found", results.size()),
3483+ "Application",
3484+ usc::CategoryRenderer(CATEGORY_APPS_DISPLAY));
3485+ auto self_uri = usc::CannedQuery(query()).to_uri();
3486+ for (auto const& result: results)
3487+ {
3488+ usc::CategorisedResult cr(category);
3489+ cr.set_title(result.name);
3490+ cr["subtitle"] = result.summary;
3491+ cr["id"] = result.id;
3492+ cr.set_art(result.icon);
3493+ cr.set_uri(APPID_URI_FORMAT.arg(QString::fromStdString(result.id).remove(".desktop")).toStdString());
3494+
3495+ if (!reply->push(cr))
3496+ {
3497+ qCritical() << "Error while adding result " << QString::fromStdString(result.name);
3498+ return;
3499+ }
3500+ }
3501+}
3502+
3503+
3504+void libertine::scope::Query::
3505+run(usc::SearchReplyProxy const& reply)
3506+{
3507+ if (!query().query_string().empty())
3508+ {
3509+ run_search(reply);
3510+ return;
3511+ }
3512+
3513+ show_hint(reply, USE_SEARCH_HINT);
3514+}
3515
3516=== added file 'scope/store/query.h'
3517--- scope/store/query.h 1970-01-01 00:00:00 +0000
3518+++ scope/store/query.h 2016-09-23 14:36:26 +0000
3519@@ -0,0 +1,70 @@
3520+/*
3521+ * Copyright 2016 Canonical Ltd.
3522+ *
3523+ * This program is free software: you can redistribute it and/or modify it under
3524+ * the terms of the GNU General Public License, version 3, as published by the
3525+ * Free Software Foundation.
3526+ *
3527+ * This program is distributed in the hope that it will be useful,
3528+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3529+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3530+ * GNU General Public License for more details.
3531+ *
3532+ * You should have received a copy of the GNU General Public License
3533+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3534+ */
3535+#ifndef LIBERTINE_STORE_QUERY_H_
3536+#define LIBERTINE_STORE_QUERY_H_
3537+
3538+
3539+#include <unity/scopes/ReplyProxyFwd.h>
3540+#include <unity/scopes/SearchQueryBase.h>
3541+
3542+class QStringList;
3543+
3544+
3545+namespace libertine
3546+{
3547+namespace scope
3548+{
3549+
3550+class ServiceManager;
3551+
3552+/**
3553+ * Engine to run a specific store query.
3554+ */
3555+class Query
3556+ : public unity::scopes::SearchQueryBase
3557+{
3558+public:
3559+ explicit Query(unity::scopes::CannedQuery const& query,
3560+ unity::scopes::SearchMetadata const& metadata,
3561+ std::shared_ptr<ServiceManager> const& service);
3562+
3563+ ~Query() = default;
3564+
3565+ virtual void
3566+ cancelled() override;
3567+
3568+ virtual void
3569+ run(unity::scopes::SearchReplyProxy const& reply) override;
3570+
3571+ static std::string const USE_SEARCH_HINT;
3572+ static std::string const NO_SEARCH_RESULTS_HINT;
3573+
3574+private:
3575+ void
3576+ show_hint(unity::scopes::SearchReplyProxy const& reply,
3577+ std::string const& reason) const;
3578+ void
3579+ run_search(unity::scopes::SearchReplyProxy const& reply) const;
3580+
3581+ std::shared_ptr<ServiceManager> service_;
3582+};
3583+
3584+} // namespace scope
3585+} // namespace libertine
3586+
3587+#endif // LIBERTINE_STORE_QUERY_H_
3588+
3589+
3590
3591=== added file 'scope/store/scope.cpp'
3592--- scope/store/scope.cpp 1970-01-01 00:00:00 +0000
3593+++ scope/store/scope.cpp 2016-09-23 14:36:26 +0000
3594@@ -0,0 +1,75 @@
3595+/**
3596+ * @file libertine_store/scope.cpp
3597+ * @brief The implementation of the Libertine Store scope class.
3598+ */
3599+/*
3600+ * Copyright 2016 Canonical Ltd.
3601+ *
3602+ * This program is free software: you can redistribute it and/or modify it under
3603+ * the terms of the GNU General Public License, version 3, as published by the
3604+ * Free Software Foundation.
3605+ *
3606+ * This program is distributed in the hope that it will be useful,
3607+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3608+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3609+ * GNU General Public License for more details.
3610+ *
3611+ * You should have received a copy of the GNU General Public License
3612+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3613+ */
3614+#include "scope/store/scope.h"
3615+
3616+#include "scope/store/query.h"
3617+#include <libertine-scope/action.h>
3618+#include <libertine-scope/i18n.h>
3619+#include <libertine-scope/preview.h>
3620+#include <libertine-scope/service_manager.h>
3621+
3622+
3623+namespace usc = unity::scopes;
3624+
3625+
3626+libertine::scope::Scope::
3627+Scope()
3628+ : service_(std::make_shared<ServiceManager>())
3629+{ }
3630+
3631+
3632+void libertine::scope::Scope::
3633+start(std::string const&)
3634+{
3635+ setlocale(LC_ALL, "");
3636+ std::string translation_directory = ScopeBase::scope_directory()
3637+ + "/../share/locale/";
3638+ bindtextdomain(GETTEXT_PACKAGE, translation_directory.c_str());
3639+}
3640+
3641+
3642+usc::SearchQueryBase::UPtr libertine::scope::Scope::
3643+search(usc::CannedQuery const& query,
3644+ usc::SearchMetadata const& metadata)
3645+{
3646+ return usc::SearchQueryBase::UPtr(new Query(query, metadata, service_));
3647+}
3648+
3649+
3650+usc::PreviewQueryBase::UPtr libertine::scope::Scope::
3651+preview(usc::Result const& result,
3652+ usc::ActionMetadata const& metadata)
3653+{
3654+ return usc::PreviewQueryBase::UPtr(new Preview(result, metadata, service_));
3655+}
3656+
3657+
3658+usc::ActivationQueryBase::UPtr libertine::scope::Scope::
3659+perform_action(usc::Result const& result,
3660+ usc::ActionMetadata const& metadata,
3661+ std::string const& /* widget_id */,
3662+ std::string const& action_id)
3663+{
3664+ return usc::ActivationQueryBase::UPtr(new Action(result,
3665+ metadata,
3666+ action_id,
3667+ service_));
3668+}
3669+
3670
3671=== added file 'scope/store/scope.h'
3672--- scope/store/scope.h 1970-01-01 00:00:00 +0000
3673+++ scope/store/scope.h 2016-09-23 14:36:26 +0000
3674@@ -0,0 +1,77 @@
3675+/**
3676+ * @file libertine_store/scope.h
3677+ * @brief The internal interface for the Libertine Store scope class.
3678+ */
3679+/*
3680+ * Copyright 2016 Canonical Ltd.
3681+ *
3682+ * This program is free software: you can redistribute it and/or modify it under
3683+ * the terms of the GNU General Public License, version 3, as published by the
3684+ * Free Software Foundation.
3685+ *
3686+ * This program is distributed in the hope that it will be useful,
3687+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3688+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3689+ * GNU General Public License for more details.
3690+ *
3691+ * You should have received a copy of the GNU General Public License
3692+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
3693+ */
3694+#ifndef LIBERTINE_STORE_SCOPE_H_
3695+#define LIBERTINE_STORE_SCOPE_H_
3696+
3697+#include <unity/scopes/ScopeBase.h>
3698+
3699+namespace libertine
3700+{
3701+namespace scope
3702+{
3703+
3704+class ServiceManager;
3705+
3706+
3707+class Scope
3708+: public unity::scopes::ScopeBase
3709+{
3710+public:
3711+ explicit Scope();
3712+ virtual ~Scope() = default;
3713+
3714+ /**
3715+ * Initializes the scope instance.
3716+ */
3717+ virtual void
3718+ start(std::string const&) override;
3719+
3720+ /**
3721+ * Called each time a new query is requested
3722+ */
3723+ virtual unity::scopes::SearchQueryBase::UPtr
3724+ search(unity::scopes::CannedQuery const& query,
3725+ unity::scopes::SearchMetadata const& metadata) override;
3726+
3727+ /**
3728+ * Gets an application preview.
3729+ */
3730+ virtual unity::scopes::PreviewQueryBase::UPtr
3731+ preview(unity::scopes::Result const& result,
3732+ unity::scopes::ActionMetadata const& metadata) override;
3733+
3734+ /**
3735+ * Gets an application preview.
3736+ */
3737+ virtual unity::scopes::ActivationQueryBase::UPtr
3738+ perform_action(unity::scopes::Result const& result,
3739+ unity::scopes::ActionMetadata const& metadata,
3740+ std::string const& widget_id,
3741+ std::string const& action_id) override;
3742+
3743+private:
3744+ std::shared_ptr<ServiceManager> service_;
3745+};
3746+
3747+
3748+} // namespace scope
3749+} // namespace libertine
3750+
3751+#endif /* LIBERTINE_STORE_SCOPE_H_ */
3752
3753=== added directory 'service'
3754=== added file 'service/CMakeLists.txt'
3755--- service/CMakeLists.txt 1970-01-01 00:00:00 +0000
3756+++ service/CMakeLists.txt 2016-09-23 14:36:26 +0000
3757@@ -0,0 +1,9 @@
3758+# Figure out where the host distro stores its Python3 packages.
3759+execute_process(COMMAND python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
3760+ OUTPUT_VARIABLE python_site_packages
3761+ OUTPUT_STRIP_TRAILING_WHITESPACE)
3762+
3763+install(DIRECTORY libertine_service
3764+ DESTINATION ${python_site_packages})
3765+install(PROGRAMS libertined
3766+ DESTINATION ${CMAKE_INSTALL_BINDIR})
3767
3768=== added directory 'service/libertine_service'
3769=== added file 'service/libertine_service/__init__.py'
3770=== added file 'service/libertine_service/appstream.py'
3771--- service/libertine_service/appstream.py 1970-01-01 00:00:00 +0000
3772+++ service/libertine_service/appstream.py 2016-09-23 14:36:26 +0000
3773@@ -0,0 +1,80 @@
3774+# Copyright 2016 Canonical Ltd.
3775+#
3776+# This program is free software: you can redistribute it and/or modify
3777+# it under the terms of the GNU General Public License as published by
3778+# the Free Software Foundation; version 3 of the License.
3779+#
3780+# This program is distributed in the hope that it will be useful,
3781+# but WITHOUT ANY WARRANTY; without even the implied warranty of
3782+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3783+# GNU General Public License for more details.
3784+#
3785+# You should have received a copy of the GNU General Public License
3786+# along with this program. If not, see <http://www.gnu.org/licenses/>.
3787+
3788+import gi
3789+gi.require_version('AppStream', '1.0')
3790+from gi.repository import AppStream
3791+
3792+
3793+def xstr(s):
3794+ """Converts anything to a string"""
3795+ return str(s or "")
3796+
3797+
3798+class AppStreamCache(object):
3799+ """AppStreamCache"""
3800+ def __init__(self, config):
3801+ super(AppStreamCache, self).__init__()
3802+ self.config = config
3803+ self.pool = AppStream.Pool()
3804+ self.pool.load()
3805+
3806+ def search(self, query):
3807+ packages = []
3808+ for component in self.pool.search(query):
3809+ if component.is_valid():
3810+ package = {}
3811+ package["name"] = xstr(component.get_name())
3812+ package["id"] = xstr(component.get_id())
3813+ package["summary"] = xstr(component.get_summary())
3814+ package["uri"] = xstr(component.get_url(AppStream.UrlKind.HOMEPAGE))
3815+
3816+ if len(component.get_icons()) > 0:
3817+ package["icon"] = xstr(self._get_largest_icon(component.get_icons()).get_filename())
3818+ packages.append(package)
3819+
3820+ return packages[::-1]
3821+
3822+ def app_info(self, app_id):
3823+ apps = self.pool.get_components_by_id(app_id)
3824+ app_data = {}
3825+ if len(apps) == 1 and apps[0].is_valid():
3826+ app = apps[0]
3827+ app_data["name"] = xstr(app.get_name())
3828+ app_data["id"] = xstr(app.get_id())
3829+ app_data["summary"] = xstr(app.get_summary())
3830+ app_data["website"] = xstr(app.get_url(AppStream.UrlKind.HOMEPAGE))
3831+ app_data["license"] = xstr(app.get_project_license())
3832+ app_data['package'] = ' '.join(app.get_pkgnames())
3833+ for screenshot in app.get_screenshots():
3834+ if screenshot.is_valid() and screenshot.get_kind() is AppStream.ScreenshotKind.EXTRA:
3835+ largest = self._get_largest_icon(screenshot.get_images())
3836+ if largest is not None:
3837+ if "screenshots" not in app_data:
3838+ app_data["screenshots"] = []
3839+ app_data["screenshots"].append(largest.get_url())
3840+
3841+ app_data["description"] = xstr(app.get_description())
3842+
3843+ if len(app.get_icons()) > 0:
3844+ app_data["icon"] = xstr(self._get_largest_icon(app.get_icons()).get_filename())
3845+
3846+ return app_data
3847+
3848+ def _get_largest_icon(self, images):
3849+ largest = None
3850+ for icon in images:
3851+ if largest is None or icon.get_width() > largest.get_width():
3852+ largest = icon
3853+ return largest
3854
3855=== added file 'service/libertine_service/apt.py'
3856--- service/libertine_service/apt.py 1970-01-01 00:00:00 +0000
3857+++ service/libertine_service/apt.py 2016-09-23 14:36:26 +0000
3858@@ -0,0 +1,106 @@
3859+# Copyright 2016 Canonical Ltd.
3860+#
3861+# This program is free software: you can redistribute it and/or modify
3862+# it under the terms of the GNU General Public License as published by
3863+# the Free Software Foundation; version 3 of the License.
3864+#
3865+# This program is distributed in the hope that it will be useful,
3866+# but WITHOUT ANY WARRANTY; without even the implied warranty of
3867+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3868+# GNU General Public License for more details.
3869+#
3870+# You should have received a copy of the GNU General Public License
3871+# along with this program. If not, see <http://www.gnu.org/licenses/>.
3872+
3873+import apt
3874+import glob
3875+import os
3876+import re
3877+
3878+def _use_system_gpg():
3879+ """ Configures APT to use the system-wide GPG store. Always."""
3880+ for key in 'Dir::Etc::Trusted', 'Dir::Etc::TrustedParts':
3881+ apt.apt_pkg.config.set(key, apt.apt_pkg.config.find_file(key))
3882+
3883+
3884+def _get_system_sources_list():
3885+ """Concatenates all the system apt/sources.list files into a single text buffer."""
3886+ sources_path = os.path.join('/etc', 'apt')
3887+ sources_list = glob.glob(os.path.join(sources_path, 'sources.list.d', '*.list'))
3888+ sources_list.append(os.path.join(sources_path, 'sources.list'))
3889+ sources = ''
3890+ for source in sources_list:
3891+ with open(source) as f:
3892+ sources += f.read()
3893+ return sources
3894+
3895+
3896+def _write_local_sources_list(rootdir):
3897+ """ Writes out a user-local sources.list file by copying all the systemwide ones. """
3898+ sources = _get_system_sources_list()
3899+ sources_path = os.path.join(rootdir, 'etc', 'apt')
3900+ os.makedirs(sources_path, exist_ok=True)
3901+ srcfile = os.path.join(sources_path, 'sources.list')
3902+ with open(srcfile, 'w') as f:
3903+ f.write(sources)
3904+ return srcfile
3905+
3906+
3907+def _get_local_apt_cache():
3908+ """ Gets a user-local APT cache. """
3909+ rootdir = os.path.join('/tmp', '.cache', 'libertine', 'apt')
3910+ srcfile = _write_local_sources_list(rootdir)
3911+
3912+ apt_cache = apt.Cache(rootdir=rootdir, memonly=True)
3913+ apt.apt_pkg.config.clear("APT::Update::Post-Invoke-Success")
3914+ apt_cache.update(sources_list=srcfile)
3915+ apt_cache.open()
3916+
3917+ return apt_cache
3918+
3919+
3920+def _get_apt_cache(config):
3921+ """ Factory function to get the APT cache obejct. """
3922+ _use_system_gpg()
3923+ if config.use_local_cache:
3924+ return _get_local_apt_cache()
3925+ else:
3926+ return apt.Cache()
3927+
3928+class AptCache(object):
3929+ """docstring for AptCache"""
3930+ def __init__(self, config):
3931+ super(AptCache, self).__init__()
3932+ self.config = config
3933+
3934+ def search(self, query):
3935+ apps = []
3936+
3937+ cache = _get_apt_cache(self.config)
3938+ pkg_keys = [key for key in cache.keys() if re.match(query, key)]
3939+ for key in pkg_keys:
3940+ app = {}
3941+ app["name"] = cache[key].name
3942+ app["id"] = cache[key].name
3943+ app["package"] = cache[key].name
3944+ if len(cache[key].versions) > 0:
3945+ app["summary"] = cache[key].versions[0].summary
3946+ app["website"] = cache[key].versions[0].homepage
3947+ apps.append(app)
3948+ return apps
3949+
3950+ def app_info(self, app_id):
3951+ app_data = {}
3952+ cache = _get_apt_cache(self.config)
3953+ if app_id in cache:
3954+ app = cache[app_id]
3955+ app_data["name"] = app.name
3956+ app_data["id"] = app.name
3957+ app_data["package"] = app.name
3958+ if len(app.versions) > 0:
3959+ app_data["summary"] = app.versions[0].summary
3960+ app_data["website"] = app.versions[0].homepage
3961+ app_data["description"] = app.versions[0].description
3962+ app_data["package"] = app.name
3963+
3964+ return app_data
3965
3966=== added file 'service/libertine_service/container.py'
3967--- service/libertine_service/container.py 1970-01-01 00:00:00 +0000
3968+++ service/libertine_service/container.py 2016-09-23 14:36:26 +0000
3969@@ -0,0 +1,68 @@
3970+# Copyright 2016 Canonical Ltd.
3971+#
3972+# This program is free software: you can redistribute it and/or modify
3973+# it under the terms of the GNU General Public License as published by
3974+# the Free Software Foundation; version 3 of the License.
3975+#
3976+# This program is distributed in the hope that it will be useful,
3977+# but WITHOUT ANY WARRANTY; without even the implied warranty of
3978+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3979+# GNU General Public License for more details.
3980+#
3981+# You should have received a copy of the GNU General Public License
3982+# along with this program. If not, see <http://www.gnu.org/licenses/>.
3983+
3984+from threading import Lock
3985+from libertine import ContainersConfig
3986+from libertine_service import tasks
3987+
3988+
3989+class SafeContainersConfig(object):
3990+ def __init__(self):
3991+ self.lock = Lock()
3992+ self.config = ContainersConfig.ContainersConfig()
3993+ def __getattr__(self, name):
3994+ config_method = getattr(self.config, name)
3995+ if config_method is not None:
3996+ def _method(*args, **kwargs):
3997+ with self.lock:
3998+ return config_method(*args)
3999+ return _method
4000+
4001+
4002+class Container(object):
4003+ def __init__(self, log):
4004+ self.log = log
4005+ self.libertine_config = SafeContainersConfig()
4006+ self.lock = Lock()
4007+
4008+ def install(self, package_name, container_id, progress):
4009+ self.libertine_config.refresh_database()
4010+ if not self._container_exists(container_id):
4011+ self.log.debug("Container does not exist, queuing create operation")
4012+ create = tasks.CreateTask(container_id, self.libertine_config, self.lock, self.log)
4013+ create.start()
4014+
4015+ task = tasks.InstallTask(package_name, container_id, self.libertine_config, progress, self.lock, self.log)
4016+ return task.start()
4017+
4018+ def remove(self, package_name, container_id, progress):
4019+ self.libertine_config.refresh_database()
4020+ if not self._container_exists(container_id):
4021+ self.log.debug("Container does not exist, queuing create operation")
4022+ create = tasks.CreateTask(container_id, self.libertine_config, self.lock, self.log)
4023+ create.start()
4024+
4025+ task = tasks.RemoveTask(package_name, container_id, self.libertine_config, progress, self.lock, self.log)
4026+ return task.start()
4027+
4028+ def status(self, package_name, container_id):
4029+ self.log.debug("Checking status of package '%s'" % package_name)
4030+ self.libertine_config.refresh_database()
4031+ if not self._container_exists(container_id):
4032+ return ''
4033+ return self.libertine_config.get_package_install_status(container_id, package_name) or ''
4034+
4035+ def _container_exists(self, container_id):
4036+ self.log.debug("Checking if container '%s' exists" % container_id)
4037+ return self.libertine_config.container_exists(container_id)
4038
4039=== added file 'service/libertine_service/dbus.py'
4040--- service/libertine_service/dbus.py 1970-01-01 00:00:00 +0000
4041+++ service/libertine_service/dbus.py 2016-09-23 14:36:26 +0000
4042@@ -0,0 +1,184 @@
4043+# Copyright 2016 Canonical Ltd.
4044+#
4045+# This program is free software: you can redistribute it and/or modify
4046+# it under the terms of the GNU General Public License as published by
4047+# the Free Software Foundation; version 3 of the License.
4048+#
4049+# This program is distributed in the hope that it will be useful,
4050+# but WITHOUT ANY WARRANTY; without even the implied warranty of
4051+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4052+# GNU General Public License for more details.
4053+#
4054+# You should have received a copy of the GNU General Public License
4055+# along with this program. If not, see <http://www.gnu.org/licenses/>.
4056+
4057+import dbus
4058+import dbus.service
4059+import logging
4060+from libertine_service import apt
4061+from libertine_service import appstream
4062+from libertine_service import container
4063+from dbus.mainloop.glib import DBusGMainLoop
4064+from time import time
4065+
4066+
4067+LIBERTINE_SERVICE_NAME = "com.canonical.libertine.ContainerManager"
4068+LIBERTINE_STORE_INTERFACE = LIBERTINE_SERVICE_NAME
4069+DOWNLOAD_INTERFACE = "com.canonical.applications.Download"
4070+LIBERTINE_STORE_PATH = "/Manager"
4071+CONTAINER_ID = "palatine"
4072+
4073+log = logging.getLogger("Libertine")
4074+
4075+
4076+class Progress(dbus.service.Object):
4077+ def __init__(self, connection):
4078+ log.debug("creating a Progress object")
4079+ self._id = hex(int(time()*10000000))[2:]
4080+ self._finished = False
4081+ self.current_progress = (dbus.UInt64(0), dbus.UInt64(0))
4082+ dbus.service.Object.__init__(self, conn=connection, object_path=("/Progress/%s" % self._id))
4083+
4084+ def emit_progress(self):
4085+ self.progress(self.current_progress[0], self.current_progress[1])
4086+
4087+ @property
4088+ def id(self):
4089+ return self._id
4090+
4091+ @property
4092+ def done(self):
4093+ return self._finished
4094+
4095+ @dbus.service.signal(DOWNLOAD_INTERFACE)
4096+ def finished(self, path):
4097+ log.debug("emit finished('%s')" % path)
4098+ self._finished = True
4099+
4100+ @dbus.service.signal(DOWNLOAD_INTERFACE)
4101+ def progress(self, received, total):
4102+ log.debug("emit progress(%d, %d)" % (received, total))
4103+ self.current_progress = (received, total)
4104+
4105+
4106+class Service(dbus.service.Object):
4107+
4108+ def __init__(self, config):
4109+ log.debug("creating service")
4110+ DBusGMainLoop(set_as_default=True)
4111+ try:
4112+ bus_name = dbus.service.BusName(LIBERTINE_SERVICE_NAME,
4113+ bus=dbus.SessionBus(),
4114+ do_not_queue=True)
4115+ except dbus.exceptions.NameExistsException:
4116+ log.warning("service is already running")
4117+ raise
4118+
4119+ try:
4120+ self.cache = appstream.AppStreamCache(config)
4121+ except:
4122+ log.warning("AppStream backend unavailable, falling back to Apt backend.")
4123+ self.cache = apt.AptCache(config)
4124+
4125+ self.container = container.Container(log)
4126+ self.progress = {}
4127+
4128+ super().__init__(bus_name, LIBERTINE_STORE_PATH)
4129+
4130+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4131+ out_signature='as')
4132+ def get_categories(self):
4133+ log.debug("get_categories() called")
4134+ return []
4135+
4136+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4137+ out_signature='as')
4138+ def get_featured(self):
4139+ log.debug("get_featured() called")
4140+ return []
4141+
4142+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4143+ out_signature='as')
4144+ def get_popular(self):
4145+ log.debug("get_popular() called")
4146+ return []
4147+
4148+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4149+ in_signature='s',
4150+ out_signature='aa{sv}')
4151+ def search(self, search_string):
4152+ log.debug("search('{}') called".format(search_string))
4153+ return self.cache.search(search_string)
4154+
4155+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4156+ in_signature='s',
4157+ out_signature='a{sv}')
4158+ def app_info(self, app_id):
4159+ log.debug("app_info('{}') called".format(app_id))
4160+ app = self.cache.app_info(app_id)
4161+ if 'package' in app:
4162+ app['status'] = self.container.status(app['package'], CONTAINER_ID)
4163+ if app['id'] in self.progress:
4164+ app['progress_id'] = self.progress[app['id']].id
4165+
4166+ return app
4167+
4168+ @dbus.service.signal(LIBERTINE_STORE_INTERFACE,
4169+ signature='su')
4170+ def updating(self, target, percent):
4171+ log.debug("emit updating('{}', {})".format(target, percent))
4172+
4173+ # Packaging
4174+
4175+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4176+ in_signature='s',
4177+ out_signature='x')
4178+ def install(self, app_id):
4179+ log.debug("install('%s')" % app_id)
4180+ package = self.cache.app_info(app_id)
4181+ if 'package' in package:
4182+ return self.container.install(package['package'], CONTAINER_ID, self.find_or_create_package_progress(app_id))
4183+
4184+ return 0
4185+
4186+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4187+ in_signature='s',
4188+ out_signature='x')
4189+ def remove(self, app_id):
4190+ log.debug("remove('%s')" % app_id)
4191+ package = self.cache.app_info(app_id)
4192+ if 'package' in package:
4193+ return self.container.remove(package['package'], CONTAINER_ID, self.find_or_create_package_progress(app_id))
4194+
4195+ return 0
4196+
4197+ @dbus.service.method(LIBERTINE_STORE_INTERFACE,
4198+ in_signature='s',
4199+ out_signature='b')
4200+ def update_progress(self, app_id):
4201+ log.debug("update_progress('%s')" % app_id)
4202+ self.cleanup_progress()
4203+ if app_id in self.progress:
4204+ self.progress[app_id].emit_progress()
4205+ return True
4206+ return False
4207+
4208+ def find_or_create_package_progress(self, app_id):
4209+ self.cleanup_progress()
4210+
4211+ if app_id in self.progress:
4212+ progress = self.progress[app_id]
4213+ else:
4214+ progress = Progress(self.connection)
4215+ self.progress[app_id] = progress
4216+
4217+ return progress
4218+
4219+ def cleanup_progress(self):
4220+ updated_progress_list = {}
4221+ for key in self.progress.keys():
4222+ if self.progress[key].done:
4223+ self.progress[key].remove_from_connection()
4224+ else:
4225+ updated_progress_list[key] = self.progress[key]
4226+ self.progress = updated_progress_list
4227
4228=== added file 'service/libertine_service/tasks.py'
4229--- service/libertine_service/tasks.py 1970-01-01 00:00:00 +0000
4230+++ service/libertine_service/tasks.py 2016-09-23 14:36:26 +0000
4231@@ -0,0 +1,149 @@
4232+# Copyright 2016 Canonical Ltd.
4233+#
4234+# This program is free software: you can redistribute it and/or modify
4235+# it under the terms of the GNU General Public License as published by
4236+# the Free Software Foundation; version 3 of the License.
4237+#
4238+# This program is distributed in the hope that it will be useful,
4239+# but WITHOUT ANY WARRANTY; without even the implied warranty of
4240+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4241+# GNU General Public License for more details.
4242+#
4243+# You should have received a copy of the GNU General Public License
4244+# along with this program. If not, see <http://www.gnu.org/licenses/>.
4245+
4246+from subprocess import Popen, PIPE
4247+from threading import Thread
4248+from abc import ABCMeta, abstractmethod
4249+from libertine import LibertineContainer, HostInfo, utils
4250+from dbus import UInt64
4251+
4252+
4253+class LibertineTask(metaclass=ABCMeta):
4254+ """
4255+ Abstract class for performing long-running, synchronous operations on a
4256+ Libertine container. Child classes must implement _run, which will execute
4257+ in a separate thread. Override _before to run commands synchronously; if
4258+ _before returns False, _run will not be executed.
4259+ """
4260+ def __init__(self, lock, log):
4261+ self.lock = lock
4262+ self.log = log
4263+
4264+ def start(self):
4265+ if self._before():
4266+ thread = Thread(target=self.run)
4267+ thread.start()
4268+ return thread.ident
4269+ else:
4270+ return 0
4271+
4272+ def run(self):
4273+ with self.lock:
4274+ self._run()
4275+
4276+ @abstractmethod
4277+ def _run(self):
4278+ pass
4279+
4280+ def _before(self):
4281+ return True
4282+
4283+
4284+class ProgressTask(LibertineTask):
4285+ def __init__(self, package_name, container_id, config, progress, lock, log):
4286+ super().__init__(lock, log)
4287+ self.package = package_name
4288+ self.container = container_id
4289+ self.config = config
4290+ self.progress = progress
4291+ self.current_progress = 0
4292+
4293+ def _progress(self):
4294+ self.current_progress += 1
4295+ self.progress.progress(UInt64(self.current_progress), UInt64(self.current_progress+1))
4296+
4297+
4298+class InstallTask(ProgressTask):
4299+ def __init__(self, package_name, container_id, config, progress, lock, log):
4300+ super().__init__(package_name, container_id, config, progress, lock, log)
4301+
4302+ def _run(self):
4303+ self.log.debug("Installing package '%s'" % self.package)
4304+ self._progress()
4305+ container = LibertineContainer(self.container, self.config)
4306+ if container.install_package(self.package):
4307+ self._progress()
4308+ self.config.update_package_install_status(self.container, self.package, "installed")
4309+ utils.refresh_libertine_scope()
4310+ else:
4311+ self.log.warning("Package installation failed for '%s'" % self.package)
4312+ self.config.delete_package(self.container, self.package)
4313+ self.progress.finished(self.package)
4314+
4315+ def _before(self):
4316+ self.log.debug("InstallTask::_before")
4317+ self._progress()
4318+ self.config.add_new_package(self.container, self.package)
4319+ self.config.update_package_install_status(self.container, self.package, "installing")
4320+ self._progress()
4321+ return True
4322+
4323+
4324+class RemoveTask(ProgressTask):
4325+ def __init__(self, package_name, container_id, config, progress, lock, log):
4326+ super().__init__(package_name, container_id, config, progress, lock, log)
4327+ self.fallback = "installed"
4328+
4329+ def _run(self):
4330+ self.log.debug("Removing package '%s'" % self.package)
4331+ self._progress()
4332+ container = LibertineContainer(self.container, self.config)
4333+ if container.remove_package(self.package):
4334+ self._progress()
4335+ self.config.delete_package(self.container, self.package)
4336+ utils.refresh_libertine_scope()
4337+ else:
4338+ self.log.warning("Package removal failed for '%s'" % self.package)
4339+ self.config.update_package_install_status(self.container, self.package, self.fallback)
4340+ self.progress.finished(self.package)
4341+
4342+ def _before(self):
4343+ self.log.debug("RemoveTask::_before")
4344+ self._progress()
4345+ if self.config.package_exists(self.container, self.package):
4346+ self.fallback = self.config.get_package_install_status(self.container, self.package)
4347+ self.config.update_package_install_status(self.container, self.package, "removing")
4348+ self._progress()
4349+ return True
4350+ else:
4351+ self.log.debug("Package '%s' already exists, skipping install" % self.package)
4352+ return False
4353+
4354+
4355+class CreateTask(LibertineTask):
4356+ def __init__(self, container_id, config, lock, log):
4357+ super().__init__(lock, log)
4358+ self.container = container_id
4359+ self.config = config
4360+
4361+ def _run(self):
4362+ self.log.debug("Creating container '%s'" % self.container)
4363+ container = LibertineContainer(self.container, self.config)
4364+ if not container.create_libertine_container(password=''):
4365+ self.log.debug("Creating container '%s' failed" % self.container)
4366+ self.config.delete_container(self.container)
4367+ return
4368+ self.config.update_container_install_status(self.container, "ready")
4369+
4370+ def _before(self):
4371+ self.log.debug("CreateTask::_before")
4372+ if self.config.container_exists(self.container):
4373+ return False
4374+
4375+ info = HostInfo.HostInfo()
4376+
4377+ self.config.add_new_container(self.container, 'User Applications', info.select_container_type_by_kernel(),
4378+ info.get_host_distro_release())
4379+ self.config.update_container_install_status(self.container, 'installing')
4380+ return True
4381
4382=== added file 'service/libertined'
4383--- service/libertined 1970-01-01 00:00:00 +0000
4384+++ service/libertined 2016-09-23 14:36:26 +0000
4385@@ -0,0 +1,89 @@
4386+#!/usr/bin/python3
4387+# -*- coding: utf-8 -*-
4388+
4389+# Copyright 2016 Canonical Ltd.
4390+#
4391+# This program is free software: you can redistribute it and/or modify
4392+# it under the terms of the GNU General Public License as published by
4393+# the Free Software Foundation; version 3 of the License.
4394+#
4395+# This program is distributed in the hope that it will be useful,
4396+# but WITHOUT ANY WARRANTY; without even the implied warranty of
4397+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4398+# GNU General Public License for more details.
4399+#
4400+# You should have received a copy of the GNU General Public License
4401+# along with this program. If not, see <http://www.gnu.org/licenses/>.
4402+
4403+import argparse
4404+import logging
4405+import signal
4406+import sys
4407+from gi.repository import GLib, GObject
4408+from libertine_service import dbus
4409+
4410+
4411+log = logging.getLogger("Libertine")
4412+
4413+
4414+class Config(object):
4415+
4416+ def __init__(self):
4417+ self._arg_parser = argparse.ArgumentParser(description=u'Libertine Store service')
4418+ self._arg_parser.add_argument(u'-d', u"--debug",
4419+ action='store_true',
4420+ default=False,
4421+ help=u"enable internal debugging output")
4422+ self._arg_parser.add_argument(u'-l', u"--use-local-cache",
4423+ action='store_true',
4424+ default=False,
4425+ help=u"use local cache instead of system cache")
4426+ args = self._arg_parser.parse_args(namespace=Config)
4427+
4428+
4429+def configure_logging(config):
4430+ if config.debug:
4431+ log.setLevel(logging.DEBUG)
4432+ else:
4433+ log.setLevel(logging.INFO)
4434+ lch = logging.StreamHandler(sys.stdout)
4435+ lfm = logging.Formatter('%(asctime)s %(name)s [%(levelname)s] %(message)s')
4436+ lch.setFormatter(lfm)
4437+ log.addHandler(lch)
4438+
4439+
4440+class Loop(object):
4441+ def __init__(self):
4442+ GLib.unix_signal_add(GLib.PRIORITY_HIGH,
4443+ signal.SIGTERM,
4444+ self.sigterm,
4445+ None)
4446+ self.loop = GLib.MainLoop()
4447+
4448+ def sigterm(self, code):
4449+ log.info("terminate ('%s') signal received" % code)
4450+ self.shutdown()
4451+
4452+ def shutdown(self):
4453+ log.info("shutting service down")
4454+ self.loop.quit()
4455+
4456+ def run(self):
4457+ log.info("entering main loop")
4458+ self.loop.run()
4459+
4460+def main():
4461+ config = Config()
4462+ configure_logging(config)
4463+ service = dbus.Service(config=config)
4464+ loop = Loop()
4465+
4466+ try:
4467+ loop.run()
4468+ except KeyboardInterrupt:
4469+ log.debug("keyboard interrupt received")
4470+ loop.shutdown()
4471+
4472+
4473+if __name__ == '__main__':
4474+ main()
4475
4476=== added file 'tests/CMakeLists.txt'
4477--- tests/CMakeLists.txt 1970-01-01 00:00:00 +0000
4478+++ tests/CMakeLists.txt 2016-09-23 14:36:26 +0000
4479@@ -0,0 +1,7 @@
4480+# Build with system gmock and its embedded gtest -- the horror of hardcoding
4481+set(GMOCK_SOURCE_DIR "/usr/src/gmock" CACHE PATH "gmock source directory")
4482+set(GTEST_INCLUDE_DIR "${GMOCK_SOURCE_DIR}/gtest/include" CACHE PATH "gtest source include directory")
4483+add_subdirectory(${GMOCK_SOURCE_DIR} "${CMAKE_CURRENT_BINARY_DIR}/gmock")
4484+
4485+add_subdirectory(scope)
4486+add_subdirectory(lib)
4487
4488=== added directory 'tests/lib'
4489=== added file 'tests/lib/CMakeLists.txt'
4490--- tests/lib/CMakeLists.txt 1970-01-01 00:00:00 +0000
4491+++ tests/lib/CMakeLists.txt 2016-09-23 14:36:26 +0000
4492@@ -0,0 +1,1 @@
4493+add_subdirectory(libertine-scope)
4494
4495=== added directory 'tests/lib/libertine-scope'
4496=== added file 'tests/lib/libertine-scope/CMakeLists.txt'
4497--- tests/lib/libertine-scope/CMakeLists.txt 1970-01-01 00:00:00 +0000
4498+++ tests/lib/libertine-scope/CMakeLists.txt 2016-09-23 14:36:26 +0000
4499@@ -0,0 +1,24 @@
4500+function(create_test test_name)
4501+ add_executable(${test_name}_exe
4502+ mock_service_manager.h
4503+ ${test_name}.cpp
4504+ )
4505+
4506+ include_directories(${test_name}_exe
4507+ ${CMAKE_SOURCE_DIR}/lib
4508+ )
4509+
4510+ target_link_libraries(${test_name}_exe
4511+ ${SCOPE_LIB_NAME}
4512+ Qt5::Core
4513+ Qt5::DBus
4514+ gmock
4515+ gmock_main
4516+ )
4517+
4518+ add_test(${test_name} ${test_name}_exe)
4519+endfunction(create_test)
4520+
4521+create_test(test_preview)
4522+create_test(test_package)
4523+create_test(test_action)
4524
4525=== added file 'tests/lib/libertine-scope/mock_service_manager.h'
4526--- tests/lib/libertine-scope/mock_service_manager.h 1970-01-01 00:00:00 +0000
4527+++ tests/lib/libertine-scope/mock_service_manager.h 2016-09-23 14:36:26 +0000
4528@@ -0,0 +1,49 @@
4529+/*
4530+ * Copyright 2016 Canonical Ltd.
4531+ *
4532+ * This program is free software: you can redistribute it and/or modify it under
4533+ * the terms of the GNU General Public License, version 3, as published by the
4534+ * Free Software Foundation.
4535+ *
4536+ * This program is distributed in the hope that it will be useful,
4537+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4538+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4539+ * GNU General Public License for more details.
4540+ *
4541+ * You should have received a copy of the GNU General Public License
4542+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
4543+ */
4544+
4545+#ifndef _MOCK_SERVICE_MANAGER_H
4546+#define _MOCK_SERVICE_MANAGER_H
4547+
4548+#include "libertine-scope/service_manager.h"
4549+#include <gmock/gmock.h>
4550+
4551+
4552+namespace libertine
4553+{
4554+namespace scope
4555+{
4556+
4557+
4558+class MockServiceManager : public ServiceManager
4559+{
4560+public:
4561+ MockServiceManager()
4562+ : ServiceManager()
4563+ {
4564+ }
4565+
4566+ MOCK_CONST_METHOD1(search_cache, QList<Package>(QString const&));
4567+ MOCK_CONST_METHOD1(app_info, Package(QString const&));
4568+ MOCK_CONST_METHOD1(update_progress, void(QString const&));
4569+ MOCK_CONST_METHOD1(install, void(QString const&));
4570+ MOCK_CONST_METHOD1(remove, void(QString const&));
4571+};
4572+
4573+
4574+} // namesapce Store
4575+} // namesapce Libertine
4576+
4577+#endif // _MOCK_SERVICE_MANAGER_H
4578
4579=== added file 'tests/lib/libertine-scope/test_action.cpp'
4580--- tests/lib/libertine-scope/test_action.cpp 1970-01-01 00:00:00 +0000
4581+++ tests/lib/libertine-scope/test_action.cpp 2016-09-23 14:36:26 +0000
4582@@ -0,0 +1,70 @@
4583+/*
4584+ * Copyright 2016 Canonical Ltd.
4585+ *
4586+ * This program is free software: you can redistribute it and/or modify it under
4587+ * the terms of the GNU General Public License, version 3, as published by the
4588+ * Free Software Foundation.
4589+ *
4590+ * This program is distributed in the hope that it will be useful,
4591+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4592+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4593+ * GNU General Public License for more details.
4594+ *
4595+ * You should have received a copy of the GNU General Public License
4596+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
4597+ */
4598+#include "libertine-scope/action.h"
4599+
4600+#include "tests/lib/libertine-scope/mock_service_manager.h"
4601+#include <unity/scopes/ActionMetadata.h>
4602+#include <unity/scopes/testing/Result.h>
4603+#include <gmock/gmock.h>
4604+
4605+
4606+namespace
4607+{
4608+TEST(StoreActionTest, CallsInstallOnServiceManager)
4609+{
4610+ unity::scopes::testing::Result result;
4611+ result["id"] = "vim-common";
4612+ unity::scopes::ActionMetadata metadata("en_US", "phone");
4613+ auto service = std::make_shared<testing::NiceMock<libertine::scope::MockServiceManager> >();
4614+
4615+ libertine::scope::Action action(result, metadata, "install", service);
4616+
4617+ EXPECT_CALL(*service, install(QString("vim-common")));
4618+
4619+ auto response = action.activate();
4620+ EXPECT_EQ(unity::scopes::ActivationResponse::Status::ShowPreview, response.status());
4621+}
4622+
4623+
4624+TEST(StoreActionTest, CallsRemoveOnServiceManager)
4625+{
4626+ unity::scopes::testing::Result result;
4627+ result["id"] = "gedit";
4628+ unity::scopes::ActionMetadata metadata("en_US", "phone");
4629+ auto service = std::make_shared<testing::NiceMock<libertine::scope::MockServiceManager> >();
4630+
4631+ libertine::scope::Action action(result, metadata, "remove", service);
4632+
4633+ EXPECT_CALL(*service, remove(QString("gedit")));
4634+
4635+ auto response = action.activate();
4636+ EXPECT_EQ(unity::scopes::ActivationResponse::Status::ShowPreview, response.status());
4637+}
4638+
4639+
4640+TEST(StoreActionTest, OpenAllowsDefaultHandlerToRun)
4641+{
4642+ unity::scopes::testing::Result result;
4643+ result["id"] = "gedit";
4644+ unity::scopes::ActionMetadata metadata("en_US", "phone");
4645+ auto service = std::make_shared<testing::NiceMock<libertine::scope::MockServiceManager> >();
4646+
4647+ libertine::scope::Action action(result, metadata, "open", service);
4648+
4649+ auto response = action.activate();
4650+ EXPECT_EQ(unity::scopes::ActivationResponse::Status::NotHandled, response.status());
4651+}
4652+}
4653
4654=== added file 'tests/lib/libertine-scope/test_package.cpp'
4655--- tests/lib/libertine-scope/test_package.cpp 1970-01-01 00:00:00 +0000
4656+++ tests/lib/libertine-scope/test_package.cpp 2016-09-23 14:36:26 +0000
4657@@ -0,0 +1,108 @@
4658+/*
4659+ * Copyright 2016 Canonical Ltd.
4660+ *
4661+ * This program is free software: you can redistribute it and/or modify it under
4662+ * the terms of the GNU General Public License, version 3, as published by the
4663+ * Free Software Foundation.
4664+ *
4665+ * This program is distributed in the hope that it will be useful,
4666+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4667+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4668+ * GNU General Public License for more details.
4669+ *
4670+ * You should have received a copy of the GNU General Public License
4671+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
4672+ */
4673+#include "libertine-scope/package.h"
4674+
4675+#include <gmock/gmock.h>
4676+
4677+
4678+namespace
4679+{
4680+using namespace libertine::scope;
4681+
4682+
4683+static QVariantMap
4684+attribute_map(QString const& name, QString const& summary, QString const& description,
4685+ QString const& icon, QString const& publisher, QString const& website,
4686+ QString const& license, QString const& id, QString const& status, QStringList screenshots)
4687+{
4688+ QVariantMap attributes;
4689+ attributes["name"] = name;
4690+ attributes["summary"] = summary;
4691+ attributes["description"] = description;
4692+ attributes["icon"] = icon;
4693+ attributes["publisher"] = publisher;
4694+ attributes["website"] = website;
4695+ attributes["license"] = license;
4696+ attributes["id"] = id;
4697+ attributes["status"] = status;
4698+ attributes["screenshots"] = screenshots;
4699+ return attributes;
4700+}
4701+
4702+
4703+static void
4704+package_matches_attributes(Package actual, std::string const& name, std::string const& summary,
4705+ std::string const& description, std::string const& icon, std::string const& publisher,
4706+ std::string const& website, std::string const& license, std::string const& id,
4707+ std::string const& status, QStringList screenshots)
4708+{
4709+ EXPECT_EQ(name, actual.name);
4710+ EXPECT_EQ(summary, actual.summary);
4711+ EXPECT_EQ(description, actual.description);
4712+ EXPECT_EQ(icon, actual.icon);
4713+ EXPECT_EQ(publisher, actual.publisher);
4714+ EXPECT_EQ(website, actual.website);
4715+ EXPECT_EQ(license, actual.license);
4716+ EXPECT_EQ(id, actual.id);
4717+ EXPECT_EQ(status, actual.status);
4718+
4719+ ASSERT_EQ(actual.screenshots.size(), screenshots.size());
4720+ for (auto i = 0u; i < actual.screenshots.size(); ++i)
4721+ {
4722+ EXPECT_EQ(screenshots[i], QString::fromStdString(actual.screenshots[i]));
4723+ }
4724+}
4725+
4726+
4727+TEST(PackageTest, FromMapCreatesSinglePackage)
4728+{
4729+ QStringList screenshots{"file:///some/image.png", "file:///some/other/image.jpg"};
4730+ auto attributeMap = attribute_map("Harry", "The Philosopher's Stone",
4731+ "Boy with head injury seeks magic rock",
4732+ "harry.png", "JK", "pottermore.com", "Private",
4733+ "com.pottermore.harry", "finished", screenshots);
4734+ auto package = Package::from_map(attributeMap);
4735+ package_matches_attributes(package, "Harry", "The Philosopher's Stone",
4736+ "Boy with head injury seeks magic rock",
4737+ "harry.png", "JK", "pottermore.com", "Private",
4738+ "com.pottermore.harry", "finished", screenshots);
4739+}
4740+
4741+
4742+TEST(PackageTest, FromMapCreatesListOfPackages)
4743+{
4744+ QStringList screenshots{"file:///some/image.png", "file:///some/other/image.jpg"};
4745+ auto attributePkg1Map = attribute_map("Harry", "The Philosopher's Stone",
4746+ "Boy with head injury seeks magic rock",
4747+ "harry.png", "JK", "pottermore.com", "Private",
4748+ "com.pottermore.harry", "finished", screenshots);
4749+ QStringList screenshots2{"file://imageFor2.png"};
4750+ auto attributePkg2Map = attribute_map("Dune", "Classic science fiction",
4751+ "The spice must flow", "worms.png",
4752+ "Herbert", "dunebook.net", "Other",
4753+ "net.dunebook.dune", "spicey", screenshots2);
4754+ auto packages = Package::from_map(QList<QVariantMap>{attributePkg1Map, attributePkg2Map});
4755+ ASSERT_EQ(2, packages.size());
4756+ package_matches_attributes(packages[0], "Harry", "The Philosopher's Stone",
4757+ "Boy with head injury seeks magic rock",
4758+ "harry.png", "JK", "pottermore.com", "Private",
4759+ "com.pottermore.harry", "finished", screenshots);
4760+ package_matches_attributes(packages[1], "Dune", "Classic science fiction",
4761+ "The spice must flow", "worms.png",
4762+ "Herbert", "dunebook.net", "Other",
4763+ "net.dunebook.dune", "spicey", screenshots2);
4764+}
4765+}
4766
4767=== added file 'tests/lib/libertine-scope/test_preview.cpp'
4768--- tests/lib/libertine-scope/test_preview.cpp 1970-01-01 00:00:00 +0000
4769+++ tests/lib/libertine-scope/test_preview.cpp 2016-09-23 14:36:26 +0000
4770@@ -0,0 +1,292 @@
4771+/*
4772+ * Copyright 2016 Canonical Ltd.
4773+ *
4774+ * This program is free software: you can redistribute it and/or modify it under
4775+ * the terms of the GNU General Public License, version 3, as published by the
4776+ * Free Software Foundation.
4777+ *
4778+ * This program is distributed in the hope that it will be useful,
4779+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4780+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4781+ * GNU General Public License for more details.
4782+ *
4783+ * You should have received a copy of the GNU General Public License
4784+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
4785+ */
4786+#include "libertine-scope/preview.h"
4787+#include "tests/lib/libertine-scope/mock_service_manager.h"
4788+
4789+#include <unity/scopes/ActionMetadata.h>
4790+#include <unity/scopes/PreviewWidget.h>
4791+#include <unity/scopes/testing/MockPreviewReply.h>
4792+#include <unity/scopes/testing/Result.h>
4793+#include <gtest/gtest.h>
4794+#include <gmock/gmock.h>
4795+
4796+namespace
4797+{
4798+using namespace libertine::scope;
4799+
4800+
4801+static void
4802+verifyHeader(Package const& package, unity::scopes::PreviewWidget const& header)
4803+{
4804+ EXPECT_EQ("hdr", header.id());
4805+ EXPECT_EQ("header", header.widget_type());
4806+
4807+ EXPECT_EQ(package.name, header.attribute_values()["title"].get_string());
4808+ EXPECT_EQ(package.summary, header.attribute_values()["subtitle"].get_string());
4809+ EXPECT_EQ(package.icon, header.attribute_values()["mascot"].get_string());
4810+}
4811+
4812+
4813+static void
4814+verifyButtons(unity::scopes::PreviewWidget const& buttons)
4815+{
4816+ EXPECT_EQ("actions", buttons.id());
4817+ EXPECT_EQ("actions", buttons.widget_type());
4818+ auto buttons_actions = buttons.attribute_values()["actions"].get_array();
4819+ ASSERT_EQ(1, buttons_actions.size());
4820+ EXPECT_EQ("install", buttons_actions[0].get_dict()["id"].get_string());
4821+ EXPECT_EQ("Install", buttons_actions[0].get_dict()["label"].get_string());
4822+}
4823+
4824+static void
4825+verifyInProgressButtons(unity::scopes::PreviewWidget const& buttons, std::string const& progress_id)
4826+{
4827+ EXPECT_EQ("actions", buttons.id());
4828+ EXPECT_EQ("progress", buttons.widget_type());
4829+ auto source = buttons.attribute_values()["source"].get_dict();
4830+ EXPECT_EQ("com.canonical.libertine.ContainerManager", source["dbus-name"].get_string());
4831+ EXPECT_EQ(std::string("/Progress/") + progress_id, source["dbus-object"].get_string());
4832+}
4833+
4834+
4835+static void
4836+verifyInstalledButtons(unity::scopes::PreviewWidget const& buttons)
4837+{
4838+ EXPECT_EQ("actions", buttons.id());
4839+ EXPECT_EQ("actions", buttons.widget_type());
4840+ auto buttons_actions = buttons.attribute_values()["actions"].get_array();
4841+ ASSERT_EQ(2, buttons_actions.size());
4842+ EXPECT_EQ("remove", buttons_actions[0].get_dict()["id"].get_string());
4843+ EXPECT_EQ("Remove", buttons_actions[0].get_dict()["label"].get_string());
4844+ EXPECT_EQ("open", buttons_actions[1].get_dict()["id"].get_string());
4845+ EXPECT_EQ("Open", buttons_actions[1].get_dict()["label"].get_string());
4846+}
4847+
4848+
4849+static void
4850+verifyMetadata(Package const& package, unity::scopes::PreviewWidget const& props)
4851+{
4852+ EXPECT_EQ("other_metadata", props.id());
4853+ EXPECT_EQ("table", props.widget_type());
4854+
4855+ auto propValues = props.attribute_values()["values"].get_array();
4856+ ASSERT_EQ(3, propValues.size());
4857+ ASSERT_EQ(2, propValues[0].get_array().size());
4858+ EXPECT_EQ("Publisher/Creator", propValues[0].get_array()[0].get_string());
4859+ EXPECT_EQ(package.publisher, propValues[0].get_array()[1].get_string());
4860+ ASSERT_EQ(2, propValues[1].get_array().size());
4861+ EXPECT_EQ("Website", propValues[1].get_array()[0].get_string());
4862+ EXPECT_EQ(package.website, propValues[1].get_array()[1].get_string());
4863+ ASSERT_EQ(2, propValues[2].get_array().size());
4864+ EXPECT_EQ("License", propValues[2].get_array()[0].get_string());
4865+ EXPECT_EQ(package.license, propValues[2].get_array()[1].get_string());
4866+}
4867+
4868+
4869+static void
4870+verifyDescription(Package const& package, unity::scopes::PreviewWidget const& description)
4871+{
4872+ EXPECT_EQ("summary", description.id());
4873+ EXPECT_EQ("text", description.widget_type());
4874+ EXPECT_EQ("Info", description.attribute_values()["title"].get_string());
4875+ EXPECT_EQ(package.description, description.attribute_values()["text"].get_string());
4876+}
4877+
4878+
4879+static void
4880+verifyScreenshots(Package const& package, unity::scopes::PreviewWidget const& screenshots)
4881+{
4882+ EXPECT_EQ("screenshots", screenshots.id());
4883+ EXPECT_EQ("gallery", screenshots.widget_type());
4884+
4885+ auto sources = screenshots.attribute_values()["sources"].get_array();
4886+ ASSERT_EQ(package.screenshots.size(), sources.size());
4887+
4888+ for (auto i = 0u; i < package.screenshots.size(); ++i)
4889+ {
4890+ EXPECT_EQ(package.screenshots[i], sources[i].get_string());
4891+ }
4892+
4893+}
4894+
4895+
4896+static Package
4897+basePackage()
4898+{
4899+ Package package;
4900+ package.name = "vim";
4901+ package.summary = "classic text editor";
4902+ package.description = "this or emacs";
4903+ package.icon = "file:///test/file.png";
4904+ package.publisher = "Woody Boyd";
4905+ package.website = "http://canonical.com/";
4906+ package.license = "GPLv8+";
4907+ package.id = "vim.desktop";
4908+ package.status = "";
4909+ return package;
4910+}
4911+
4912+
4913+class StorePreviewTest : public testing::Test
4914+{
4915+protected:
4916+ StorePreviewTest()
4917+ : testing::Test()
4918+ , result()
4919+ , metadata("en_US", "phone")
4920+ , list(new unity::scopes::PreviewWidgetList())
4921+ , reply()
4922+ , proxy(&reply, [](unity::scopes::PreviewReply*) {})
4923+ , service(new testing::NiceMock<MockServiceManager>())
4924+ {
4925+ }
4926+
4927+ virtual void
4928+ SetUp()
4929+ {
4930+ EXPECT_CALL(reply, push(testing::_)).WillOnce(testing::SaveArg<0>(list.get()));
4931+ Preview::update_progress_after = std::chrono::milliseconds(0);
4932+ }
4933+
4934+ void usePackage(Package const& package)
4935+ {
4936+ result["id"] = unity::scopes::Variant(package.id);
4937+ EXPECT_CALL(*service, app_info(QString::fromStdString(package.id))).WillOnce(testing::Return(package));
4938+ }
4939+
4940+ unity::scopes::testing::Result result;
4941+ unity::scopes::ActionMetadata metadata;
4942+ std::unique_ptr<unity::scopes::PreviewWidgetList> list;
4943+ testing::NiceMock<unity::scopes::testing::MockPreviewReply> reply;
4944+ unity::scopes::PreviewReplyProxy proxy;
4945+ std::shared_ptr<testing::NiceMock<MockServiceManager> > service;
4946+};
4947+
4948+
4949+TEST_F(StorePreviewTest, ShowsDetailedInformationForPackage)
4950+{
4951+ auto package = basePackage();
4952+ usePackage(package);
4953+
4954+ Preview preview(result, metadata, service);
4955+ preview.run(proxy);
4956+
4957+ ASSERT_NE(nullptr, list);
4958+ ASSERT_EQ(4, list->size());
4959+
4960+ verifyHeader(package, list->front());
4961+ list->pop_front();
4962+ verifyButtons(list->front());
4963+ list->pop_front();
4964+ verifyMetadata(package, list->front());
4965+ list->pop_front();
4966+ verifyDescription(package, list->front());
4967+}
4968+
4969+
4970+TEST_F(StorePreviewTest, ShowsScreenshotsWhenAvailable)
4971+{
4972+ auto package = basePackage();
4973+ package.screenshots = std::vector<std::string>{"file:///some/string/uri.png", "file:///some/other/string/uri.jpg"};
4974+ usePackage(package);
4975+
4976+ Preview preview(result, metadata, service);
4977+ preview.run(proxy);
4978+
4979+ ASSERT_NE(nullptr, list);
4980+ ASSERT_EQ(5, list->size());
4981+
4982+ verifyHeader(package, list->front());
4983+ list->pop_front();
4984+ verifyButtons(list->front());
4985+ list->pop_front();
4986+ verifyMetadata(package, list->front());
4987+ list->pop_front();
4988+ verifyScreenshots(package, list->front());
4989+ list->pop_front();
4990+ verifyDescription(package, list->front());
4991+}
4992+
4993+
4994+TEST_F(StorePreviewTest, ShowsRemoveAndOpenButtonsWhenInstalled)
4995+{
4996+ auto package = basePackage();
4997+ package.status = "installed";
4998+ usePackage(package);
4999+
5000+ Preview preview(result, metadata, service);
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches