Merge lp:~mzanetti/unity8/fix-apps-under-panel into lp:unity8
- fix-apps-under-panel
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Albert Astals Cid |
Approved revision: | 2028 |
Merged at revision: | 2047 |
Proposed branch: | lp:~mzanetti/unity8/fix-apps-under-panel |
Merge into: | lp:unity8 |
Prerequisite: | lp:~lukas-kde/unity8/activateWindows |
Diff against target: |
241 lines (+97/-9) 7 files modified
qml/Components/PanelState/PanelState.qml (+2/-0) qml/Panel/Panel.qml (+6/-0) qml/Stages/DesktopStage.qml (+2/-0) qml/Stages/WindowDecoration.qml (+2/-1) qml/Stages/WindowResizeArea.qml (+7/-4) tests/qmltests/Stages/tst_WindowResizeArea.qml (+43/-0) tests/qmltests/tst_Shell.qml (+35/-4) |
To merge this branch: | bzr merge lp:~mzanetti/unity8/fix-apps-under-panel |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Astals Cid (community) | Abstain | ||
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Lukáš Tinkl (community) | Approve | ||
Review via email: mp+276283@code.launchpad.net |
Commit message
prevent windows to be moved under the panel
If they happen to have a saved state which is under the panel
(might happen on alt+drag later), they will be moved below the panel
on close and reopen. This is how unity7 behaves in this regard.
Description of the change
* Are there any related MPs required for this MP to build/function as expected? Please list.
see prereq
* Did you perform an exploratory manual test run of your code change and any related functionality?
yes
* Did you make sure that your branch does not contain spurious tags?
yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
n/a
* If you changed the UI, has there been a design review?
n/a
PS Jenkins bot (ps-jenkins) wrote : | # |
Lukáš Tinkl (lukas-kde) wrote : | # |
The top panel interaction seems to work however, when I drag the window down (offscreen), it isn't restored correctly. Slightly unrelated but still worth fixing imo
Michael Zanetti (mzanetti) wrote : | # |
> The top panel interaction seems to work however, when I drag the window down
> (offscreen), it isn't restored correctly. Slightly unrelated but still worth
> fixing imo
fixed and added tests
Lukáš Tinkl (lukas-kde) wrote : | # |
Yup, looking good, works, tests passing
* Did you perform an exploratory manual test run of the code change and any related functionality?
Yes
* Did CI run pass? If not, please explain why.
Yes (except for broke xenial)
* Did you make sure that the branch does not contain spurious tags?
Yes
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2023
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Note: was already top approved
Text conflict in qml/Panel/Panel.qml
Text conflict in qml/Stages/
Text conflict in qml/Stages/
Text conflict in tests/qmltests/
Text conflict in tests/qmltests/
Text conflict in tests/qmltests/
6 conflicts encountered.
I think some of these are from the parent branch and some own, so better to wait for the parent branch to be re-merged and then merge this one.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2025
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
I still have the merge conflicts when merging this branch to unity8 trunk (and so does CI which fails to build).
Any idea why?
- 2026. By Michael Zanetti
-
merge prereq
- 2027. By Michael Zanetti
-
fix bad merge
Michael Zanetti (mzanetti) wrote : | # |
> I still have the merge conflicts when merging this branch to unity8 trunk (and
> so does CI which fails to build).
>
> Any idea why?
Weird... there was some criss-cross merge which caused the prereq conflict with itself. Perhaps Lukas rewrote the history of his branch after I based mine on top of that. Anyhow, fixed now.
- 2028. By Michael Zanetti
-
fix bad merge
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2026
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:2028
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Merged and "CI" is happy again, re-top approving as per Lukáś old approve.
Preview Diff
1 | === modified file 'qml/Components/PanelState/PanelState.qml' | |||
2 | --- qml/Components/PanelState/PanelState.qml 2015-07-15 15:07:19 +0000 | |||
3 | +++ qml/Components/PanelState/PanelState.qml 2015-11-09 10:53:06 +0000 | |||
4 | @@ -23,6 +23,8 @@ | |||
5 | 23 | property string title: "" | 23 | property string title: "" |
6 | 24 | property bool buttonsVisible: false | 24 | property bool buttonsVisible: false |
7 | 25 | 25 | ||
8 | 26 | property int panelHeight: 0 | ||
9 | 27 | |||
10 | 26 | signal close() | 28 | signal close() |
11 | 27 | signal minimize() | 29 | signal minimize() |
12 | 28 | signal maximize() | 30 | signal maximize() |
13 | 29 | 31 | ||
14 | === modified file 'qml/Panel/Panel.qml' | |||
15 | --- qml/Panel/Panel.qml 2015-11-09 10:53:05 +0000 | |||
16 | +++ qml/Panel/Panel.qml 2015-11-09 10:53:06 +0000 | |||
17 | @@ -32,6 +32,12 @@ | |||
18 | 32 | 32 | ||
19 | 33 | opacity: fullscreenMode && indicators.fullyClosed ? 0.0 : 1.0 | 33 | opacity: fullscreenMode && indicators.fullyClosed ? 0.0 : 1.0 |
20 | 34 | 34 | ||
21 | 35 | Binding { | ||
22 | 36 | target: PanelState | ||
23 | 37 | property: "panelHeight" | ||
24 | 38 | value: root.panelHeight | ||
25 | 39 | } | ||
26 | 40 | |||
27 | 35 | Rectangle { | 41 | Rectangle { |
28 | 36 | id: darkenedArea | 42 | id: darkenedArea |
29 | 37 | property real darkenedOpacity: 0.6 | 43 | property real darkenedOpacity: 0.6 |
30 | 38 | 44 | ||
31 | === modified file 'qml/Stages/DesktopStage.qml' | |||
32 | --- qml/Stages/DesktopStage.qml 2015-11-09 10:53:05 +0000 | |||
33 | +++ qml/Stages/DesktopStage.qml 2015-11-09 10:53:06 +0000 | |||
34 | @@ -391,6 +391,8 @@ | |||
35 | 391 | minHeight: units.gu(10) | 391 | minHeight: units.gu(10) |
36 | 392 | borderThickness: units.gu(2) | 392 | borderThickness: units.gu(2) |
37 | 393 | windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing | 393 | windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing |
38 | 394 | screenWidth: root.width | ||
39 | 395 | screenHeight: root.height | ||
40 | 394 | 396 | ||
41 | 395 | onPressed: { ApplicationManager.focusApplication(model.appId) } | 397 | onPressed: { ApplicationManager.focusApplication(model.appId) } |
42 | 396 | } | 398 | } |
43 | 397 | 399 | ||
44 | === modified file 'qml/Stages/WindowDecoration.qml' | |||
45 | --- qml/Stages/WindowDecoration.qml 2015-11-09 10:53:05 +0000 | |||
46 | +++ qml/Stages/WindowDecoration.qml 2015-11-09 10:53:06 +0000 | |||
47 | @@ -18,6 +18,7 @@ | |||
48 | 18 | import Unity.Application 0.1 // For Mir singleton | 18 | import Unity.Application 0.1 // For Mir singleton |
49 | 19 | import Ubuntu.Components 1.3 | 19 | import Ubuntu.Components 1.3 |
50 | 20 | import "../Components" | 20 | import "../Components" |
51 | 21 | import "../Components/PanelState" | ||
52 | 21 | 22 | ||
53 | 22 | MouseArea { | 23 | MouseArea { |
54 | 23 | id: root | 24 | id: root |
55 | @@ -56,7 +57,7 @@ | |||
56 | 56 | Mir.cursorName = "grabbing"; | 57 | Mir.cursorName = "grabbing"; |
57 | 57 | var pos = mapToItem(root.target.parent, mouseX, mouseY); | 58 | var pos = mapToItem(root.target.parent, mouseX, mouseY); |
58 | 58 | root.target.x = pos.x - priv.distanceX; | 59 | root.target.x = pos.x - priv.distanceX; |
60 | 59 | root.target.y = pos.y - priv.distanceY; | 60 | root.target.y = Math.max(pos.y - priv.distanceY, PanelState.panelHeight); |
61 | 60 | } | 61 | } |
62 | 61 | } | 62 | } |
63 | 62 | 63 | ||
64 | 63 | 64 | ||
65 | === modified file 'qml/Stages/WindowResizeArea.qml' | |||
66 | --- qml/Stages/WindowResizeArea.qml 2015-11-04 14:57:33 +0000 | |||
67 | +++ qml/Stages/WindowResizeArea.qml 2015-11-09 10:53:06 +0000 | |||
68 | @@ -18,6 +18,7 @@ | |||
69 | 18 | import Ubuntu.Components 1.3 | 18 | import Ubuntu.Components 1.3 |
70 | 19 | import Utils 0.1 | 19 | import Utils 0.1 |
71 | 20 | import Unity.Application 0.1 // for Mir.cursorName | 20 | import Unity.Application 0.1 // for Mir.cursorName |
72 | 21 | import "../Components/PanelState" | ||
73 | 21 | 22 | ||
74 | 22 | MouseArea { | 23 | MouseArea { |
75 | 23 | id: root | 24 | id: root |
76 | @@ -35,6 +36,8 @@ | |||
77 | 35 | property int borderThickness: 0 | 36 | property int borderThickness: 0 |
78 | 36 | property int minWidth: 0 | 37 | property int minWidth: 0 |
79 | 37 | property int minHeight: 0 | 38 | property int minHeight: 0 |
80 | 39 | property int screenWidth: 0 | ||
81 | 40 | property int screenHeight: 0 | ||
82 | 38 | 41 | ||
83 | 39 | QtObject { | 42 | QtObject { |
84 | 40 | id: priv | 43 | id: priv |
85 | @@ -66,10 +69,10 @@ | |||
86 | 66 | Component.onCompleted: { | 69 | Component.onCompleted: { |
87 | 67 | var windowGeometry = windowStateStorage.getGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height)) | 70 | var windowGeometry = windowStateStorage.getGeometry(root.windowId, Qt.rect(target.x, target.y, target.width, target.height)) |
88 | 68 | if (windowGeometry !== undefined) { | 71 | if (windowGeometry !== undefined) { |
93 | 69 | target.x = windowGeometry.x | 72 | target.width = Math.min(windowGeometry.width, root.screenWidth) |
94 | 70 | target.y = windowGeometry.y | 73 | target.height = Math.min(windowGeometry.height, root.screenHeight - PanelState.panelHeight) |
95 | 71 | target.width = windowGeometry.width | 74 | target.x = Math.max(Math.min(windowGeometry.x, root.screenWidth - target.width), 0) |
96 | 72 | target.height = windowGeometry.height | 75 | target.y = Math.max(Math.min(windowGeometry.y, root.screenHeight - target.height), PanelState.panelHeight) |
97 | 73 | } | 76 | } |
98 | 74 | var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal) | 77 | var windowState = windowStateStorage.getState(root.windowId, WindowStateStorage.WindowStateNormal) |
99 | 75 | if (windowState === WindowStateStorage.WindowStateMaximized) { | 78 | if (windowState === WindowStateStorage.WindowStateMaximized) { |
100 | 76 | 79 | ||
101 | === modified file 'tests/qmltests/Stages/tst_WindowResizeArea.qml' | |||
102 | --- tests/qmltests/Stages/tst_WindowResizeArea.qml 2015-11-04 14:57:33 +0000 | |||
103 | +++ tests/qmltests/Stages/tst_WindowResizeArea.qml 2015-11-09 10:53:06 +0000 | |||
104 | @@ -19,6 +19,7 @@ | |||
105 | 19 | import QtTest 1.0 | 19 | import QtTest 1.0 |
106 | 20 | import Unity.Test 0.1 | 20 | import Unity.Test 0.1 |
107 | 21 | import ".." | 21 | import ".." |
108 | 22 | import "../../../qml/Components/PanelState" | ||
109 | 22 | import "../../../qml/Stages" | 23 | import "../../../qml/Stages" |
110 | 23 | import Ubuntu.Components 1.3 | 24 | import Ubuntu.Components 1.3 |
111 | 24 | import Ubuntu.Components.ListItems 1.3 as ListItem | 25 | import Ubuntu.Components.ListItems 1.3 as ListItem |
112 | @@ -31,6 +32,12 @@ | |||
113 | 31 | 32 | ||
114 | 32 | property var fakeWindow: windowLoader.item | 33 | property var fakeWindow: windowLoader.item |
115 | 33 | 34 | ||
116 | 35 | Binding { | ||
117 | 36 | target: PanelState | ||
118 | 37 | property: "panelHeight" | ||
119 | 38 | value: units.gu(2) | ||
120 | 39 | } | ||
121 | 40 | |||
122 | 34 | Component { | 41 | Component { |
123 | 35 | id: fakeWindowComponent | 42 | id: fakeWindowComponent |
124 | 36 | 43 | ||
125 | @@ -57,6 +64,8 @@ | |||
126 | 57 | minWidth: units.gu(15) | 64 | minWidth: units.gu(15) |
127 | 58 | minHeight: units.gu(10) | 65 | minHeight: units.gu(10) |
128 | 59 | windowId: "test-window-id" | 66 | windowId: "test-window-id" |
129 | 67 | screenWidth: root.width | ||
130 | 68 | screenHeight: root.height | ||
131 | 60 | } | 69 | } |
132 | 61 | 70 | ||
133 | 62 | Rectangle { | 71 | Rectangle { |
134 | @@ -228,5 +237,39 @@ | |||
135 | 228 | // clean up | 237 | // clean up |
136 | 229 | fakeWindow.state = "normal" | 238 | fakeWindow.state = "normal" |
137 | 230 | } | 239 | } |
138 | 240 | |||
139 | 241 | |||
140 | 242 | function test_restoreMovesIntoBounds_data() { | ||
141 | 243 | return [ | ||
142 | 244 | {tag: "left off", x: -units.gu(5), y: units.gu(5), w: units.gu(10), h: units.gu(10)}, | ||
143 | 245 | {tag: "top off", x: units.gu(5), y: -units.gu(5), w: units.gu(10), h: units.gu(10)}, | ||
144 | 246 | {tag: "right off", x: root.width - units.gu(5), y: units.gu(5), w: units.gu(10), h: units.gu(10)}, | ||
145 | 247 | {tag: "bottom off", x: units.gu(5), y: root.height - units.gu(5), w: units.gu(10), h: units.gu(10)}, | ||
146 | 248 | {tag: "width too large", x: units.gu(5), y: units.gu(5), w: root.width * 2, h: units.gu(10)}, | ||
147 | 249 | {tag: "height too large", x: units.gu(5), y: units.gu(5), w: units.gu(10), h: root.height * 2} | ||
148 | 250 | ] | ||
149 | 251 | } | ||
150 | 252 | |||
151 | 253 | function test_restoreMovesIntoBounds(data) { | ||
152 | 254 | fakeWindow.x = data.x; | ||
153 | 255 | fakeWindow.y = data.y; | ||
154 | 256 | fakeWindow.width = data.w; | ||
155 | 257 | fakeWindow.height = data.h; | ||
156 | 258 | waitForRendering(root); | ||
157 | 259 | |||
158 | 260 | // This will destroy the window and recreate it | ||
159 | 261 | windowLoader.active = false; | ||
160 | 262 | waitForRendering(root); | ||
161 | 263 | windowLoader.active = true; | ||
162 | 264 | waitForRendering(root) | ||
163 | 265 | |||
164 | 266 | // Make sure it's again where we left it in normal state before destroying | ||
165 | 267 | compare(fakeWindow.x >= 0, true) | ||
166 | 268 | compare(fakeWindow.y >= PanelState.panelHeight, true) | ||
167 | 269 | compare(fakeWindow.x + fakeWindow.width <= root.width, true) | ||
168 | 270 | compare(fakeWindow.y + fakeWindow.height <= root.height, true) | ||
169 | 271 | |||
170 | 272 | waitForRendering(root) | ||
171 | 273 | } | ||
172 | 231 | } | 274 | } |
173 | 232 | } | 275 | } |
174 | 233 | 276 | ||
175 | === modified file 'tests/qmltests/tst_Shell.qml' | |||
176 | --- tests/qmltests/tst_Shell.qml 2015-11-04 14:58:05 +0000 | |||
177 | +++ tests/qmltests/tst_Shell.qml 2015-11-09 10:53:06 +0000 | |||
178 | @@ -344,9 +344,9 @@ | |||
179 | 344 | var app2 = ApplicationManager.startApplication("webbrowser-app") | 344 | var app2 = ApplicationManager.startApplication("webbrowser-app") |
180 | 345 | var app3 = ApplicationManager.startApplication("camera-app") | 345 | var app3 = ApplicationManager.startApplication("camera-app") |
181 | 346 | var app4 = ApplicationManager.startApplication("facebook-webapp") | 346 | var app4 = ApplicationManager.startApplication("facebook-webapp") |
183 | 347 | var app5 = ApplicationManager.startApplication("calendar-app") | 347 | var app5 = ApplicationManager.startApplication("camera-app") |
184 | 348 | var app6 = ApplicationManager.startApplication("gallery-app") | 348 | var app6 = ApplicationManager.startApplication("gallery-app") |
186 | 349 | var app7 = ApplicationManager.startApplication("camera-app") | 349 | var app7 = ApplicationManager.startApplication("calendar-app") |
187 | 350 | waitUntilAppWindowIsFullyLoaded(app7); | 350 | waitUntilAppWindowIsFullyLoaded(app7); |
188 | 351 | } | 351 | } |
189 | 352 | 352 | ||
190 | @@ -1710,11 +1710,11 @@ | |||
191 | 1710 | keyPress(Qt.Key_Control) | 1710 | keyPress(Qt.Key_Control) |
192 | 1711 | keyClick(Qt.Key_Tab); | 1711 | keyClick(Qt.Key_Tab); |
193 | 1712 | 1712 | ||
194 | 1713 | |||
195 | 1714 | tryCompare(desktopSpread, "state", "altTab") | 1713 | tryCompare(desktopSpread, "state", "altTab") |
196 | 1715 | 1714 | ||
198 | 1716 | mouseMove(shell, 0, 0); | 1715 | mouseMove(shell, 0, shell.height / 2); |
199 | 1717 | tryCompare(launcher, "state", "visibleTemporary") | 1716 | tryCompare(launcher, "state", "visibleTemporary") |
200 | 1717 | waitForRendering(shell) | ||
201 | 1718 | 1718 | ||
202 | 1719 | mouseClick(bfb, bfb.width / 2, bfb.height / 2) | 1719 | mouseClick(bfb, bfb.width / 2, bfb.height / 2) |
203 | 1720 | tryCompare(launcher, "state", "") | 1720 | tryCompare(launcher, "state", "") |
204 | @@ -1809,6 +1809,37 @@ | |||
205 | 1809 | tryCompare(panelButtons, "visible", true); | 1809 | tryCompare(panelButtons, "visible", true); |
206 | 1810 | } | 1810 | } |
207 | 1811 | 1811 | ||
208 | 1812 | function test_cantMoveWindowUnderPanel() { | ||
209 | 1813 | loadDesktopShellWithApps(); | ||
210 | 1814 | var appRepeater = findChild(shell, "appRepeater") | ||
211 | 1815 | var appDelegate = appRepeater.itemAt(0); | ||
212 | 1816 | |||
213 | 1817 | mousePress(appDelegate, appDelegate.width / 2, units.gu(1)) | ||
214 | 1818 | mouseMove(appDelegate, appDelegate.width / 2, -units.gu(100)) | ||
215 | 1819 | |||
216 | 1820 | compare(appDelegate.y >= PanelState.panelHeight, true); | ||
217 | 1821 | } | ||
218 | 1822 | |||
219 | 1823 | function test_restoreWindowStateFixesIfUnderPanel() { | ||
220 | 1824 | loadDesktopShellWithApps(); | ||
221 | 1825 | var appRepeater = findChild(shell, "appRepeater") | ||
222 | 1826 | var appId = ApplicationManager.get(0).appId; | ||
223 | 1827 | var appDelegate = appRepeater.itemAt(0); | ||
224 | 1828 | |||
225 | 1829 | // Move it under the panel programmatically (might happen later with an alt+drag) | ||
226 | 1830 | appDelegate.y = -units.gu(10) | ||
227 | 1831 | |||
228 | 1832 | ApplicationManager.stopApplication(appId) | ||
229 | 1833 | ApplicationManager.startApplication(appId) | ||
230 | 1834 | waitForRendering(shell) | ||
231 | 1835 | |||
232 | 1836 | // Make sure the newly started one is at index 0 again | ||
233 | 1837 | tryCompare(ApplicationManager.get(0), "appId", appId); | ||
234 | 1838 | |||
235 | 1839 | appDelegate = appRepeater.itemAt(0); | ||
236 | 1840 | compare(appDelegate.y >= PanelState.panelHeight, true); | ||
237 | 1841 | } | ||
238 | 1842 | |||
239 | 1812 | function test_lifecyclePolicyForNonTouchApp_data() { | 1843 | function test_lifecyclePolicyForNonTouchApp_data() { |
240 | 1813 | return [ | 1844 | return [ |
241 | 1814 | {tag: "phone", formFactor: "phone", usageScenario: "phone"}, | 1845 | {tag: "phone", formFactor: "phone", usageScenario: "phone"}, |
FAILED: Continuous integration, rev:2022 jenkins. qa.ubuntu. com/job/ unity8- ci/6609/ jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- vivid-touch/ 4949 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- xenial- touch/24/ console jenkins. qa.ubuntu. com/job/ unity-phablet- qmluitests- vivid/1321 jenkins. qa.ubuntu. com/job/ unity8- qmluitest- xenial- amd64/24 jenkins. qa.ubuntu. com/job/ unity8- vivid-amd64- ci/1216 jenkins. qa.ubuntu. com/job/ unity8- vivid-i386- ci/1217 jenkins. qa.ubuntu. com/job/ unity8- xenial- amd64-ci/ 23 jenkins. qa.ubuntu. com/job/ unity8- xenial- i386-ci/ 23 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- runner- vivid-mako/ 3973 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 4946 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 4946/artifact/ work/output/ *zip*/output. zip s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 24754 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- runner- xenial- mako/13/ console jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- xenial- armhf/24 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- xenial- armhf/24/ artifact/ work/output/ *zip*/output. zip s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 24753
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/unity8- ci/6609/ rebuild
http://