Merge lp:~dobey/unity-scope-click/sort-az into lp:unity-scope-click/devel
- sort-az
- Merge into devel
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | dobey | ||||||||
Approved revision: | 290 | ||||||||
Merged at revision: | 290 | ||||||||
Proposed branch: | lp:~dobey/unity-scope-click/sort-az | ||||||||
Merge into: | lp:unity-scope-click/devel | ||||||||
Diff against target: |
257 lines (+141/-20) 7 files modified
debian/control (+1/-0) libclickscope/click/CMakeLists.txt (+1/-0) libclickscope/click/interface.cpp (+38/-3) libclickscope/click/interface.h (+1/-0) libclickscope/tests/applications/user/com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4.desktop (+0/-11) libclickscope/tests/test_interface.cpp (+100/-1) scope/clickapps/apps-query.cpp (+0/-5) |
||||||||
To merge this branch: | bzr merge lp:~dobey/unity-scope-click/sort-az | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Alejandro J. Cura (community) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Approve | |
Review via email: mp+222540@code.launchpad.net |
Commit message
Sort installed apps alphabetically.
Add a test for the sort order.
Move the sorting back to find_installed_
Description of the change
PS Jenkins bot (ps-jenkins) wrote : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:286
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:287
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Alejandro J. Cura (alecu) wrote : | # |
The std::transform is happening twice for each comparison done during the sort; this looks bad cpu-wise;
One option to fix this is using a sorted map with the lowercased items as keys. Other option is moving the lowercasing to a method of Application, where we can cache it if needed.
Also, please move the sorting into its own function, and create unit tests for it.
- 288. By dobey
-
Add dependency on libboost-locale-dev for building.
Move sorting of the apps list to a separate function.
Use boost::locale for sorting of apps by name.
If names are equal, sort based on package name.
Add tests for several different sorting cases. - 289. By dobey
-
[ Rodney Dawes ]
* Remove unused method to fix failure building under gcc 4.9.
[ Rodney Dawes ]
* Handle some languages differently when submitting reviews. (LP:
#1321154). Add runtime dependency on ubuntu-sdk-libs for the
frameworks list. (LP: #1320975). Support hal+json in the search
request. Fix issues in autopilot tests. Port autopilot tests to
python3. Add README and HACKING files. (LP: #1226111). Translations
updates. . (LP: #1321154, #1226111, #1320975)
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:289
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:290
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Alejandro J. Cura (alecu) wrote : | # |
Looks good to me.
Preview Diff
1 | === modified file 'debian/control' | |||
2 | --- debian/control 2014-05-29 07:10:38 +0000 | |||
3 | +++ debian/control 2014-06-13 16:50:42 +0000 | |||
4 | @@ -6,6 +6,7 @@ | |||
5 | 6 | dh-translations, | 6 | dh-translations, |
6 | 7 | google-mock, | 7 | google-mock, |
7 | 8 | intltool, | 8 | intltool, |
8 | 9 | libboost-locale-dev, | ||
9 | 9 | libglib2.0-dev (>= 2.32), | 10 | libglib2.0-dev (>= 2.32), |
10 | 10 | libjsoncpp-dev, | 11 | libjsoncpp-dev, |
11 | 11 | libubuntu-download-manager-client-dev (>= 0.3+14.10.20140430-0ubuntu1), | 12 | libubuntu-download-manager-client-dev (>= 0.3+14.10.20140430-0ubuntu1), |
12 | 12 | 13 | ||
13 | === modified file 'libclickscope/click/CMakeLists.txt' | |||
14 | --- libclickscope/click/CMakeLists.txt 2014-05-26 14:02:45 +0000 | |||
15 | +++ libclickscope/click/CMakeLists.txt 2014-06-13 16:50:42 +0000 | |||
16 | @@ -36,4 +36,5 @@ | |||
17 | 36 | ${UBUNTUONE_LDFLAGS} | 36 | ${UBUNTUONE_LDFLAGS} |
18 | 37 | ${UBUNTU_DOWNLOAD_MANAGER_CLIENT_LDFLAGS} | 37 | ${UBUNTU_DOWNLOAD_MANAGER_CLIENT_LDFLAGS} |
19 | 38 | ${UBUNTU_DOWNLOAD_MANAGER_COMMON_LDFLAGS} | 38 | ${UBUNTU_DOWNLOAD_MANAGER_COMMON_LDFLAGS} |
20 | 39 | -lboost_locale | ||
21 | 39 | ) | 40 | ) |
22 | 40 | 41 | ||
23 | === modified file 'libclickscope/click/interface.cpp' | |||
24 | --- libclickscope/click/interface.cpp 2014-06-09 16:49:10 +0000 | |||
25 | +++ libclickscope/click/interface.cpp 2014-06-13 16:50:42 +0000 | |||
26 | @@ -37,6 +37,9 @@ | |||
27 | 37 | #include <sys/stat.h> | 37 | #include <sys/stat.h> |
28 | 38 | #include <map> | 38 | #include <map> |
29 | 39 | 39 | ||
30 | 40 | #include <boost/locale/collator.hpp> | ||
31 | 41 | #include <boost/locale/generator.hpp> | ||
32 | 42 | |||
33 | 40 | #include <boost/property_tree/ptree.hpp> | 43 | #include <boost/property_tree/ptree.hpp> |
34 | 41 | #include <boost/property_tree/json_parser.hpp> | 44 | #include <boost/property_tree/json_parser.hpp> |
35 | 42 | #include <boost/property_tree/exceptions.hpp> | 45 | #include <boost/property_tree/exceptions.hpp> |
36 | @@ -153,8 +156,7 @@ | |||
37 | 153 | DESKTOP_FILE_GROUP, | 156 | DESKTOP_FILE_GROUP, |
38 | 154 | DESKTOP_FILE_KEY_NAME, | 157 | DESKTOP_FILE_KEY_NAME, |
39 | 155 | domain); | 158 | domain); |
42 | 156 | struct stat times; | 159 | |
41 | 157 | app.installed_time = stat(filename.c_str(), ×) == 0 ? times.st_mtime : 0; | ||
43 | 158 | app.url = "application:///" + filename; | 160 | app.url = "application:///" + filename; |
44 | 159 | if (keyFile.has_key(DESKTOP_FILE_GROUP, DESKTOP_FILE_KEY_ICON)) { | 161 | if (keyFile.has_key(DESKTOP_FILE_GROUP, DESKTOP_FILE_KEY_ICON)) { |
45 | 160 | app.icon_url = add_theme_scheme(keyFile.get_string(DESKTOP_FILE_GROUP, | 162 | app.icon_url = add_theme_scheme(keyFile.get_string(DESKTOP_FILE_GROUP, |
46 | @@ -188,6 +190,39 @@ | |||
47 | 188 | return app; | 190 | return app; |
48 | 189 | } | 191 | } |
49 | 190 | 192 | ||
50 | 193 | std::vector<click::Application> Interface::sort_apps(const std::vector<click::Application>& apps) | ||
51 | 194 | { | ||
52 | 195 | std::vector<click::Application> result = apps; | ||
53 | 196 | boost::locale::generator gen; | ||
54 | 197 | const char* lang = getenv(click::Configuration::LANGUAGE_ENVVAR); | ||
55 | 198 | if (lang == NULL) { | ||
56 | 199 | lang = "C.UTF-8"; | ||
57 | 200 | } | ||
58 | 201 | std::locale loc = gen(lang); | ||
59 | 202 | std::locale::global(loc); | ||
60 | 203 | typedef boost::locale::collator<char> coll_type; | ||
61 | 204 | |||
62 | 205 | // Sort applications alphabetically. | ||
63 | 206 | std::sort(result.begin(), result.end(), [&loc](const Application& a, | ||
64 | 207 | const Application& b) { | ||
65 | 208 | bool lesser = false; | ||
66 | 209 | int order = std::use_facet<coll_type>(loc) | ||
67 | 210 | .compare(boost::locale::collator_base::quaternary, | ||
68 | 211 | a.title, b.title); | ||
69 | 212 | if (order == 0) { | ||
70 | 213 | lesser = a.name < b.name; | ||
71 | 214 | } else { | ||
72 | 215 | // Because compare returns int, not bool, we have to check | ||
73 | 216 | // that 0 is greater than the result, which tells us the | ||
74 | 217 | // first element should be sorted priori | ||
75 | 218 | lesser = order < 0; | ||
76 | 219 | } | ||
77 | 220 | return lesser; | ||
78 | 221 | }); | ||
79 | 222 | |||
80 | 223 | return result; | ||
81 | 224 | } | ||
82 | 225 | |||
83 | 191 | /* find_installed_apps() | 226 | /* find_installed_apps() |
84 | 192 | * | 227 | * |
85 | 193 | * Find all of the installed apps matching @search_query in a timeout. | 228 | * Find all of the installed apps matching @search_query in a timeout. |
86 | @@ -244,7 +279,7 @@ | |||
87 | 244 | }; | 279 | }; |
88 | 245 | 280 | ||
89 | 246 | keyFileLocator->enumerateKeyFilesForInstalledApplications(enumerator); | 281 | keyFileLocator->enumerateKeyFilesForInstalledApplications(enumerator); |
91 | 247 | return result; | 282 | return sort_apps(result); |
92 | 248 | } | 283 | } |
93 | 249 | 284 | ||
94 | 250 | /* is_non_click_app() | 285 | /* is_non_click_app() |
95 | 251 | 286 | ||
96 | === modified file 'libclickscope/click/interface.h' | |||
97 | --- libclickscope/click/interface.h 2014-05-26 14:02:45 +0000 | |||
98 | +++ libclickscope/click/interface.h 2014-06-13 16:50:42 +0000 | |||
99 | @@ -81,6 +81,7 @@ | |||
100 | 81 | const std::string& domain); | 81 | const std::string& domain); |
101 | 82 | virtual Application load_app_from_desktop(const unity::util::IniParser& keyFile, | 82 | virtual Application load_app_from_desktop(const unity::util::IniParser& keyFile, |
102 | 83 | const std::string& filename); | 83 | const std::string& filename); |
103 | 84 | static std::vector<Application> sort_apps(const std::vector<Application>& apps); | ||
104 | 84 | virtual std::vector<Application> find_installed_apps(const std::string& search_query); | 85 | virtual std::vector<Application> find_installed_apps(const std::string& search_query); |
105 | 85 | 86 | ||
106 | 86 | static bool is_non_click_app(const QString& filename); | 87 | static bool is_non_click_app(const QString& filename); |
107 | 87 | 88 | ||
108 | === removed file 'libclickscope/tests/applications/user/com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4.desktop' | |||
109 | --- libclickscope/tests/applications/user/com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4.desktop 2014-02-10 12:23:35 +0000 | |||
110 | +++ libclickscope/tests/applications/user/com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4.desktop 1970-01-01 00:00:00 +0000 | |||
111 | @@ -1,11 +0,0 @@ | |||
112 | 1 | [Desktop Entry] | ||
113 | 2 | Type=Application | ||
114 | 3 | Terminal=false | ||
115 | 4 | Exec=aa-exec-click -p com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4 -- webbrowser-app --enable-back-forward --webappUrlPatterns=https?://one.ubuntu.com/*,https?://login.ubuntu.com/* --webapp https://one.ubuntu.com/ | ||
116 | 5 | Name=Ubuntu One | ||
117 | 6 | Icon=/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-ubuntuone/./ubuntuone.png | ||
118 | 7 | X-Ubuntu-Touch=true | ||
119 | 8 | X-Ubuntu-Single-Instance=true | ||
120 | 9 | Path=/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-ubuntuone | ||
121 | 10 | X-Ubuntu-Old-Icon=./ubuntuone.png | ||
122 | 11 | X-Ubuntu-Application-ID=com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4 | ||
123 | 12 | 0 | ||
124 | === modified file 'libclickscope/tests/test_interface.cpp' | |||
125 | --- libclickscope/tests/test_interface.cpp 2014-06-09 16:42:23 +0000 | |||
126 | +++ libclickscope/tests/test_interface.cpp 2014-06-13 16:50:42 +0000 | |||
127 | @@ -53,7 +53,6 @@ | |||
128 | 53 | // Maintaining this list here will become tedious over time. | 53 | // Maintaining this list here will become tedious over time. |
129 | 54 | static const std::vector<click::Application> non_desktop_applications = | 54 | static const std::vector<click::Application> non_desktop_applications = |
130 | 55 | { | 55 | { |
131 | 56 | {"com.ubuntu.developer.webapps.webapp-ubuntuone", "Ubuntu One", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-ubuntuone/./ubuntuone.png", "application:///com.ubuntu.developer.webapps.webapp-ubuntuone_webapp-ubuntuone_1.0.4.desktop", "", ""}, | ||
132 | 57 | {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", ""}, | 56 | {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", ""}, |
133 | 58 | {"", "Weather", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.weather/./weather64.png", "application:///com.ubuntu.weather_weather_1.0.168.desktop", "", ""}, | 57 | {"", "Weather", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.weather/./weather64.png", "application:///com.ubuntu.weather_weather_1.0.168.desktop", "", ""}, |
134 | 59 | {"com.ubuntu.developer.webapps.webapp-twitter", "Twitter", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-twitter/./twitter.png", "application:///com.ubuntu.developer.webapps.webapp-twitter_webapp-twitter_1.0.5.desktop", "", ""}, | 58 | {"com.ubuntu.developer.webapps.webapp-twitter", "Twitter", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-twitter/./twitter.png", "application:///com.ubuntu.developer.webapps.webapp-twitter_webapp-twitter_1.0.5.desktop", "", ""}, |
135 | @@ -182,6 +181,106 @@ | |||
136 | 182 | EXPECT_TRUE(results.empty()); | 181 | EXPECT_TRUE(results.empty()); |
137 | 183 | } | 182 | } |
138 | 184 | 183 | ||
139 | 184 | TEST(ClickInterface, testFindAppsInDirSorted) | ||
140 | 185 | { | ||
141 | 186 | QSharedPointer<click::KeyFileLocator> keyFileLocator( | ||
142 | 187 | new click::KeyFileLocator( | ||
143 | 188 | testing::systemApplicationsDirectoryForTesting(), | ||
144 | 189 | testing::userApplicationsDirectoryForTesting())); | ||
145 | 190 | |||
146 | 191 | click::Interface iface(keyFileLocator); | ||
147 | 192 | |||
148 | 193 | auto results = iface.find_installed_apps("ock"); | ||
149 | 194 | |||
150 | 195 | const std::vector<click::Application> expected_results = { | ||
151 | 196 | {"com.ubuntu.clock", "Clock", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.clock/./clock64.png", "application:///com.ubuntu.clock_clock_1.0.300.desktop", "", ""}, | ||
152 | 197 | {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", ""}, | ||
153 | 198 | }; | ||
154 | 199 | EXPECT_EQ(expected_results, results); | ||
155 | 200 | } | ||
156 | 201 | |||
157 | 202 | TEST(ClickInterface, testSortApps) | ||
158 | 203 | { | ||
159 | 204 | std::vector<click::Application> apps = { | ||
160 | 205 | {"", "Sudoku", 0.0, "", "", "", ""}, | ||
161 | 206 | {"", "eBay", 0.0, "", "", "", ""}, | ||
162 | 207 | {"", "Facebook", 0.0, "", "", "", ""}, | ||
163 | 208 | {"", "Messaging", 0.0, "", "", "", ""}, | ||
164 | 209 | {"", "Contacts", 0.0, "", "", "", ""}, | ||
165 | 210 | }; | ||
166 | 211 | |||
167 | 212 | std::vector<click::Application> expected = { | ||
168 | 213 | {"", "Contacts", 0.0, "", "", "", ""}, | ||
169 | 214 | {"", "eBay", 0.0, "", "", "", ""}, | ||
170 | 215 | {"", "Facebook", 0.0, "", "", "", ""}, | ||
171 | 216 | {"", "Messaging", 0.0, "", "", "", ""}, | ||
172 | 217 | {"", "Sudoku", 0.0, "", "", "", ""}, | ||
173 | 218 | }; | ||
174 | 219 | |||
175 | 220 | ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0); | ||
176 | 221 | EXPECT_EQ(expected, click::Interface::sort_apps(apps)); | ||
177 | 222 | ASSERT_EQ(unsetenv(Configuration::LANGUAGE_ENVVAR), 0); | ||
178 | 223 | } | ||
179 | 224 | |||
180 | 225 | TEST(ClickInterface, testSortAppsWithDuplicates) | ||
181 | 226 | { | ||
182 | 227 | std::vector<click::Application> apps = { | ||
183 | 228 | {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", ""}, | ||
184 | 229 | {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", ""}, | ||
185 | 230 | }; | ||
186 | 231 | |||
187 | 232 | std::vector<click::Application> expected = { | ||
188 | 233 | {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", ""}, | ||
189 | 234 | {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", ""}, | ||
190 | 235 | }; | ||
191 | 236 | |||
192 | 237 | ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0); | ||
193 | 238 | EXPECT_EQ(expected, click::Interface::sort_apps(apps)); | ||
194 | 239 | ASSERT_EQ(unsetenv(Configuration::LANGUAGE_ENVVAR), 0); | ||
195 | 240 | } | ||
196 | 241 | |||
197 | 242 | TEST(ClickInterface, testSortAppsWithAccents) | ||
198 | 243 | { | ||
199 | 244 | std::vector<click::Application> apps = { | ||
200 | 245 | {"", "Robots", 0.0, "", "", "", ""}, | ||
201 | 246 | {"", "Æon", 0.0, "", "", "", ""}, | ||
202 | 247 | {"", "Contacts", 0.0, "", "", "", ""}, | ||
203 | 248 | {"", "Über", 0.0, "", "", "", ""}, | ||
204 | 249 | }; | ||
205 | 250 | |||
206 | 251 | std::vector<click::Application> expected = { | ||
207 | 252 | {"", "Æon", 0.0, "", "", "", ""}, | ||
208 | 253 | {"", "Contacts", 0.0, "", "", "", ""}, | ||
209 | 254 | {"", "Robots", 0.0, "", "", "", ""}, | ||
210 | 255 | {"", "Über", 0.0, "", "", "", ""}, | ||
211 | 256 | }; | ||
212 | 257 | |||
213 | 258 | ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0); | ||
214 | 259 | EXPECT_EQ(expected, click::Interface::sort_apps(apps)); | ||
215 | 260 | ASSERT_EQ(unsetenv(Configuration::LANGUAGE_ENVVAR), 0); | ||
216 | 261 | } | ||
217 | 262 | |||
218 | 263 | TEST(ClickInterface, testSortAppsMixedCharsets) | ||
219 | 264 | { | ||
220 | 265 | std::vector<click::Application> apps = { | ||
221 | 266 | {"", "Robots", 0.0, "", "", "", ""}, | ||
222 | 267 | {"", "汉字", 0.0, "", "", "", ""}, | ||
223 | 268 | {"", "漢字", 0.0, "", "", "", ""}, | ||
224 | 269 | {"", "Über", 0.0, "", "", "", ""}, | ||
225 | 270 | }; | ||
226 | 271 | |||
227 | 272 | std::vector<click::Application> expected = { | ||
228 | 273 | {"", "汉字", 0.0, "", "", "", ""}, | ||
229 | 274 | {"", "漢字", 0.0, "", "", "", ""}, | ||
230 | 275 | {"", "Robots", 0.0, "", "", "", ""}, | ||
231 | 276 | {"", "Über", 0.0, "", "", "", ""}, | ||
232 | 277 | }; | ||
233 | 278 | |||
234 | 279 | ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "zh_CN.UTF-8", 1), 0); | ||
235 | 280 | EXPECT_EQ(expected, click::Interface::sort_apps(apps)); | ||
236 | 281 | ASSERT_EQ(unsetenv(Configuration::LANGUAGE_ENVVAR), 0); | ||
237 | 282 | } | ||
238 | 283 | |||
239 | 185 | TEST(ClickInterface, testFindAppByKeyword) | 284 | TEST(ClickInterface, testFindAppByKeyword) |
240 | 186 | { | 285 | { |
241 | 187 | QSharedPointer<click::KeyFileLocator> keyFileLocator( | 286 | QSharedPointer<click::KeyFileLocator> keyFileLocator( |
242 | 188 | 287 | ||
243 | === modified file 'scope/clickapps/apps-query.cpp' | |||
244 | --- scope/clickapps/apps-query.cpp 2014-06-10 20:40:33 +0000 | |||
245 | +++ scope/clickapps/apps-query.cpp 2014-06-13 16:50:42 +0000 | |||
246 | @@ -204,11 +204,6 @@ | |||
247 | 204 | auto localResults = clickInterfaceInstance().find_installed_apps( | 204 | auto localResults = clickInterfaceInstance().find_installed_apps( |
248 | 205 | query); | 205 | query); |
249 | 206 | 206 | ||
250 | 207 | // Sort applications so that newest come first. | ||
251 | 208 | std::sort(localResults.begin(), localResults.end(), [](const Application& a, const Application& b) { | ||
252 | 209 | return a.installed_time > b.installed_time; | ||
253 | 210 | }); | ||
254 | 211 | |||
255 | 212 | push_local_results( | 207 | push_local_results( |
256 | 213 | searchReply, | 208 | searchReply, |
257 | 214 | localResults, | 209 | localResults, |
PASSED: Continuous integration, rev:285 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- ci/103/ jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- amd64-ci/ 78 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- armhf-ci/ 77 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- armhf-ci/ 77/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- i386-ci/ 77
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/unity- team-unity- scope-click- devel-ci/ 103/rebuild
http://