Merge lp:~dandrader/qtmir/detach-state-from-focus into lp:qtmir
| Status: | Merged |
|---|---|
| Approved by: | Gerry Boland on 2015-06-30 |
| Approved revision: | 362 |
| Merged at revision: | 350 |
| Proposed branch: | lp:~dandrader/qtmir/detach-state-from-focus |
| Merge into: | lp:qtmir |
| Prerequisite: | lp:~saviq/qtmir/fix-application-api-deps |
| Diff against target: |
4704 lines (+1598/-1505) 38 files modified
CMakeLists.txt (+3/-1) debian/control (+1/-1) src/modules/Unity/Application/CMakeLists.txt (+1/-0) src/modules/Unity/Application/application.cpp (+341/-69) src/modules/Unity/Application/application.h (+61/-19) src/modules/Unity/Application/application_manager.cpp (+54/-250) src/modules/Unity/Application/application_manager.h (+2/-13) src/modules/Unity/Application/applicationcontroller.h (+2/-1) src/modules/Unity/Application/applicationscreenshotprovider.cpp (+1/-1) src/modules/Unity/Application/mirsurfaceitem.cpp (+4/-4) src/modules/Unity/Application/mirsurfaceitem.h (+18/-74) src/modules/Unity/Application/mirsurfaceiteminterface.h (+116/-0) src/modules/Unity/Application/mirsurfaceitemmodel.h (+2/-2) src/modules/Unity/Application/mirsurfacemanager.cpp (+4/-4) src/modules/Unity/Application/mirsurfacemanager.h (+3/-3) src/modules/Unity/Application/plugin.cpp (+2/-2) src/modules/Unity/Application/session.cpp (+123/-73) src/modules/Unity/Application/session.h (+15/-8) src/modules/Unity/Application/session_interface.h (+31/-23) src/modules/Unity/Application/taskcontroller.cpp (+8/-13) src/modules/Unity/Application/taskcontroller.h (+4/-6) src/modules/Unity/Application/upstart/applicationcontroller.cpp (+10/-2) src/platforms/mirserver/CMakeLists.txt (+2/-0) tests/modules/Application/CMakeLists.txt (+4/-0) tests/modules/Application/application_test.cpp (+145/-71) tests/modules/ApplicationManager/CMakeLists.txt (+4/-1) tests/modules/ApplicationManager/application_manager_test.cpp (+314/-831) tests/modules/MirSurfaceItem/CMakeLists.txt (+1/-1) tests/modules/MirSurfaceItem/mirsurfaceitem_test.cpp (+1/-1) tests/modules/SessionManager/CMakeLists.txt (+3/-0) tests/modules/SessionManager/session_manager_test.cpp (+1/-1) tests/modules/SessionManager/session_test.cpp (+57/-24) tests/modules/TaskController/CMakeLists.txt (+1/-0) tests/modules/common/fake_mirsurfaceitem.h (+95/-0) tests/modules/common/mock_mirsurfaceitem.h (+50/-0) tests/modules/common/mock_session.h (+44/-5) tests/modules/common/qtmir_test.cpp (+61/-0) tests/modules/common/qtmir_test.h (+9/-1) |
| To merge this branch: | bzr merge lp:~dandrader/qtmir/detach-state-from-focus |
| Related bugs: |
| Reviewer | Review Type | Date Requested | Status |
|---|---|---|---|
| Gerry Boland | 2015-05-08 | Approve on 2015-06-29 | |
| PS Jenkins bot | continuous-integration | Needs Fixing on 2015-06-29 | |
| Nick Dedekind (community) | Needs Fixing on 2015-06-17 | ||
|
Review via email:
|
|||
Commit Message
Remove focus-based app lifecycle. Let shell control it.
API changes:
- ApplicationManager: removed suspended and forceDashActive
- Added Application.
Also refactored and clearly defined Application and Session states and state transitions.
- Let Application define its own state based on events provided by ApplicationManager. Previously that responsibility was split between those classes.
- Session now defines its own state based on events and requests fed by Application, SessionManager and SurfaceManager.
Description of the Change
* Are there any related MPs required for this MP to build/function as expected? Please list.
https:/
https:/
* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
Not applicable
- 336. By Daniel d'Andrada on 2015-05-08
-
Application: s/active/
requestedState
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:336
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| Gerry Boland (gerboland) wrote : | # |
+ m_requestedState = value;
+ Q_EMIT requestedStateC
+ if (m_requestedState == RequestedRunning && m_state == Suspended) {
+ setState(Running);
+ } else if (m_requestedState == RequestedSuspended && m_state == Running) {
+ setState(
+ }
please emit the requestedStateC
Do bump the required unity-api API version in CMakeList.txt and the unity-api package version dependency.
Rest looks good, but will need to test to be sure
- 337. By Daniel d'Andrada on 2015-05-11
-
Emit signal at the end
- 338. By Daniel d'Andrada on 2015-05-11
-
Update package version dependency
| Daniel d'Andrada (dandrader) wrote : | # |
> + m_requestedState = value;
> + Q_EMIT requestedStateC
>
> + if (m_requestedState == RequestedRunning && m_state == Suspended) {
> + setState(Running);
> + } else if (m_requestedState == RequestedSuspended && m_state == Running)
> {
> + setState(
> + }
>
> please emit the requestedStateC
> been done, not before.
>
Done.
> Do bump the required unity-api API version in CMakeList.txt
Already did.
> and the unity-api package version dependency.
Done.
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:338
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 339. By Daniel d'Andrada on 2015-05-12
-
Merge trunk
[ Albert Astals Cid ]
* Fix debug line
[ Daniel d'Andrada ]
* When synthesizing touch releases for absent touches, send them in
separate events (LP: #1437357)
[ Gerry Boland ]
* If Mir fails to start, exit the process immediately as nothing else
can be done
* Remove boost dependence, it supplies almost nothing of benefit to
offset its cost
* Remove legacy surface configuration change code, use newer
SurfaceObserver
* Remove useless profiling information, fixes build with Qt5.5 (LP:
#1437181)
[ Michael Zanetti ]
* read exception list from gsettings instead of a hardcoded list
[ Michał Sawicz ]
* Require an application API version, fix the provided version and use
include dir from the .pc file
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:339
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 340. By Daniel d'Andrada on 2015-05-27
-
Merge trunk
[ Alan Griffiths ]
* Release in step with Mir 0.13.0
[ Daniel van Vugt ]
* Release in step with Mir 0.13.0
[ Gerry Boland ]
* Release in step with Mir 0.13.0 - 341. By Daniel d'Andrada on 2015-05-27
-
Fixed all issues pointed out by code review
- Refactor and clearly define Application and Session states and state transitions.
* Let Application define its own state based on events provided by
ApplicationManager. Previously that responsibility was split between those
classes
* Session now defines its own state based on events and requests fed by Application,
SessionManager and SurfaceManager.
- Respond to "resume requested" upstart notifications. This was erroniously deleted earlier
| Gerry Boland (gerboland) wrote : | # |
/«BUILDDIR»
/«BUILDDIR»
EXPECT_
cc1plus: all warnings being treated as errors
| Daniel d'Andrada (dandrader) wrote : | # |
On 28/05/15 09:36, Gerry Boland wrote:
> Review: Needs Fixing
>
> /«BUILDDIR»
> /«BUILDDIR»
> EXPECT_EQ(false, theApp-
> ^
> cc1plus: all warnings being treated as errors
>
Builds fine here and this error doesn't make sense to me.
Maybe it only happens when cross-building?
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:341
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| Daniel d'Andrada (dandrader) wrote : | # |
On 28/05/15 10:09, Daniel d'Andrada wrote:
> On 28/05/15 09:36, Gerry Boland wrote:
>> Review: Needs Fixing
>>
>> /«BUILDDIR»
>> /«BUILDDIR»
>> EXPECT_EQ(false, theApp-
>> ^
>> cc1plus: all warnings being treated as errors
>>
> Builds fine here and this error doesn't make sense to me.
> Maybe it only happens when cross-building?
>
After spending most of the day struggling to get my cross-build setup up
and running, I was able to cross-build this branch just fine here. Could
it be that you have an old chroot?
I cross-built it in a vivid+overlay_ppa chroot.
- 342. By Daniel d'Andrada on 2015-05-29
-
work around a bug in gtest+gcc+
cross-compilati on - 343. By Daniel d'Andrada on 2015-05-29
-
s/KilledOutOfMe
mory/DiedUnexpe ctedly
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:343
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 344. By Daniel d'Andrada on 2015-06-01
-
Session does Starting->Running only once first surface frame is drawn
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:344
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 345. By Daniel d'Andrada on 2015-06-02
-
Workaround a weird behavior in unity8's PhoneStage
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:345
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| Gerry Boland (gerboland) wrote : | # |
+++ src/modules/
+ enum ProcessState {
can you not do "enum class"? The type safety would be nice
+ enum class InternalState {
+ RunningWithoutW
I'd prefer "RunningInBackg
+ DiedUnexpectedly,
+ Stopped // It closed itself, crashed or it stopped and we can't respawn it
+ // In any case, this is a dead end.
on second thought, let's make the names similar.
+ };
+ Application(const QSharedPointer<
add line break please.
+ void setProcessState
This called by AppMan (which is a friend class), and by tests. If wasn't for test, I'd ask to make this protected.
+ ProcessState processState() const;
I see nothing calling this.
+ void setState(
we have 3 different state properties now, let's avoid the confusion and be explicit: rename to setInternalState please.
I like your removal of TaskController from Application. +1
I'm not so keen on there being 3 separate state variables to keep track of, as it introduces risk of invalid state combinations appearing. The code in applyRequestedS
+++ src/modules/
+const char* Application:
+ default:
+ return "???";
should never happen, so don't include it. If a new entry is added to enum, the compiler will warn us (if no default set).
+void Application:
could you rewrite this to use a switch/case statement, it would help ensure all m_state options are being considered, and might make it more readable too.
+void Application:
+ switch (m_state) {
+ case InternalState:
+ case InternalState:
+ case InternalState:
+ m_session-
Why fire resume? I'm unsure of a realistic situation when a Running app would have the associated Session change.
+void Application:
+ case InternalState:
+ releaseWakelock();
If app is in foreground (i.e. has a surface with activeFocus) and stops unexpectedly, the app should be removed from the list. But if in background, we assume OOM killer killed it, so leave it in the app list. This worked when I tested it, but now am unsure how!
+void Application:
again, I'd prefer a switch/case statement, as compiler does warn if you missed an option (if no default defined).
+void Application:
+ if (m_state == InternalState:
+ setState(
+ Q_EMIT resumeProcessRe
+ if (m_processState == ProcessSuspended) {
+ setProcessState
I think we should, no? Otherwise the...
| Gerry Boland (gerboland) wrote : | # |
+++ src/modules/
+ shouldRequestFocus = true;
I don't see the use for this variable, you could just emit focusRequested here like the previous code did.
+ // Applications fail if they fail to launch, crash or are killed.
well crash == 'fail to launch' :) Something more exact would be that the process stopped with a failure return code. </bikeshed>
+ application-
why bother, you've already set the application's process state to Stopped which makes that fact clear.
+ // The connection is queued as a workaround an issue in the PhoneStage animation....
yep, we need to consider a separate thread for costly operations. Later todo.
+ QStringList arguments =application-
missing space
| Gerry Boland (gerboland) wrote : | # |
+++ src/modules/
Why this change in this MR?
| Gerry Boland (gerboland) wrote : | # |
+++ src/modules/
All changes look ok. Just a niggle: Session:
src/modules/
+ // it's public to ease testing
+ void doSuspend();
I do dislike having to do this, but the purpose is clear.
| Gerry Boland (gerboland) wrote : | # |
+++ tests/modules/
+ delete application;
QScopedPointer? :)
You're testing how the setState*() calls impact your state machine. I'd like to see more such tests please.
| Gerry Boland (gerboland) wrote : | # |
+++ tests/modules/
TEST_F(
the text name is incorrect now.
+// For better output in ASSERT_* and EXPECT_* error messages
+void PrintTo(const Application:
+void PrintTo(const SessionInterfac
very nice, didn't know you could do that
| Gerry Boland (gerboland) wrote : | # |
> +++ src/modules/
> Why this change in this MR?
I should've read on, you need it to mock it for testing. Is fine.
| Gerry Boland (gerboland) wrote : | # |
The following tests FAILED:
5 - ApplicationManager (SEGFAULT)
Errors while running CTest
- 346. By Daniel d'Andrada on 2015-06-15
-
s/RunningWithou
tWakelock/ RunningInBackgr ound
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:346
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 347. By Daniel d'Andrada on 2015-06-15
-
Merge trunk
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:347
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 348. By Daniel d'Andrada on 2015-06-15
-
Update tests and remove duplicate ones
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:348
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 349. By Daniel d'Andrada on 2015-06-15
-
s/DiedUnexpecte
dly/StoppedUnex pectedly - 350. By Daniel d'Andrada on 2015-06-15
-
Removed unused Application:
:processState( ) - 351. By Daniel d'Andrada on 2015-06-15
-
Application: s/setState/
setInternalStat e
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:351
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 352. By Daniel d'Andrada on 2015-06-15
-
Refactor Application:
:applyRequested State() - 353. By Daniel d'Andrada on 2015-06-15
-
Removed redundant code
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:353
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 354. By Daniel d'Andrada on 2015-06-15
-
Refactor Application:
:setProcessStat e
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/15 06:40, Gerry Boland wrote:
> Review: Needs Fixing code
>
> +++ src/modules/
> + enum ProcessState {
> can you not do "enum class"? The type safety would be nice
Not changing it as discussed on IRC.
>
> + enum class InternalState {
> + RunningWithoutW
> I'd prefer "RunningInBackg
Done.
>
> + DiedUnexpectedly,
> + Stopped // It closed itself, crashed or it stopped and we can't respawn it
> + // In any case, this is a dead end.
> on second thought, let's make the names similar.
Done.
>
> + };
> + Application(const QSharedPointer<
> add line break please.
Already has it. Maybe you were looking at an older version.
> + ProcessState processState() const;
> I see nothing calling this.
Removed.
>
> + void setState(
> we have 3 different state properties now, let's avoid the confusion and be explicit: rename to setInternalState please.
Done. I didn't rename it to setInternalState earlier out of pure
laziness during the refactoring.
> I like your removal of TaskController from Application. +1
> I'm not so keen on there being 3 separate state variables to keep track of, as it introduces risk of invalid state combinations appearing. The code in applyRequestedS
Believe me, the original code was way scarier, as it didn't track
anything and was drowning in assumptions. :)
>
> +++ src/modules/
>
> +const char* Application:
> + default:
> + return "???";
> should never happen, so don't include it. If a new entry is added to enum, the compiler will warn us (if no default set).
Code doesn't compile without it.
> +void Application:
> could you rewrite this to use a switch/case statement, it would help ensure all m_state options are being considered, and might make it more readable too.
Done.
> +void Application:
> + switch (m_state) {
> + case InternalState:
> + case InternalState:
> + case InternalState:
> + m_session-
> Why fire resume? I'm unsure of a realistic situation when a Running app would have the associated Session change.
For the same reason I fire suspend() and stop(). To ensure the session
is consistent with the application state. It might be unrealistic
indeed, but better safe than sorry I guess. And if I would remove the
resume() and would also have to remove the other cases otherwise it
would be inconsistent.
> +void Application:
> + case InternalState:
> + releaseWakelock();
> If app is in foreground (i.e. has a surface with activeFocus) and stops unexpectedly, the app should be removed from the list. But if in background, we assume OOM killer killed it, so leave it in the app list. This worked when I tested it, but now ...
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:354
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 355. By Daniel d'Andrada on 2015-06-15
-
Remove redundant variable
- 356. By Daniel d'Andrada on 2015-06-15
-
Code cosmetics
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/15 07:21, Gerry Boland wrote:
> Review: Needs Fixing code
>
> +++ src/modules/
>
> + shouldRequestFocus = true;
> I don't see the use for this variable, you could just emit focusRequested here like the previous code did.
It made sense at some point during the refactoring, but as code kept
moving around, it's now redundant indeed. Removed
> + // Applications fail if they fail to launch, crash or are killed.
> well crash == 'fail to launch' :) Something more exact would be that the process stopped with a failure return code. </bikeshed>
Don't blame me, this is your own writing! :-D
I just moved it around, along with the code.
> + application-
> why bother, you've already set the application's process state to Stopped which makes that fact clear.
Consistency. It's like setting pointers to null after deleting them.
> + QStringList arguments =application-
> missing space
Fixed.
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:355
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:356
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 357. By Daniel d'Andrada on 2015-06-16
-
Fix Session:
:insertChildSes sion switch statement
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/15 07:40, Gerry Boland wrote:
> +++ src/modules/
> All changes look ok. Just a niggle: Session:
Done.
- 358. By Daniel d'Andrada on 2015-06-16
-
Rename test
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/15 08:23, Gerry Boland wrote:
> +++ tests/modules/
>
> TEST_F(
> the text name is incorrect now.
Renamed the test.
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/15 10:13, Gerry Boland wrote:
> Review: Needs Fixing
>
> The following tests FAILED:
> 5 - ApplicationManager (SEGFAULT)
> Errors while running CTest
>
Fixed.
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:357
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 359. By Daniel d'Andrada on 2015-06-16
-
Use QScopedPointer in Application tests
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:359
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| Daniel d'Andrada (dandrader) wrote : | # |
On 12/06/2015 07:52, Gerry Boland wrote:
> +++ tests/modules/
> + delete application;
> QScopedPointer? :)
Done.
> You're testing how the setState*() calls impact your state machine. I'd like to see more such tests please.
I think ApplicationManager tests have it pretty much covered.Some tests
might event make more sense to be moved from ApplicationManager to here
as the former is now mainly a demux for qtmir::
| Nick Dedekind (nick-dedekind) wrote : | # |
Lools like there's an issue in MockMirSurfaceItem.
orientationAngle pure virtual.
setOrientationAngle pure virtual.
Looks like it's changed from orientation/
- 360. By Daniel d'Andrada on 2015-06-17
-
Update MockMirSurfaceItem
| Daniel d'Andrada (dandrader) wrote : | # |
On 17/06/15 06:14, Nick Dedekind wrote:
> Review: Needs Fixing
>
> Lools like there's an issue in MockMirSurfaceItem.
>
> orientationAngle pure virtual.
> setOrientationAngle pure virtual.
>
> Looks like it's changed from orientation/
Fixed.
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:360
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 361. By Daniel d'Andrada on 2015-06-18
-
Update unity-api version dependency
| Daniel d'Andrada (dandrader) wrote : | # |
On 18/06/15 08:30, Gerry Boland wrote:
> Review: Needs Fixing
>
> please bump unity-api dependence to 7.98
Done
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:361
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
| Gerry Boland (gerboland) wrote : | # |
Code looks good, need to functional test but building unity8 in a chroot is currently broken
| Gerry Boland (gerboland) wrote : | # |
-- checking for module 'unity-
-- package 'unity-
Need to bump that dep in CMake please
- 362. By Daniel d'Andrada <dandrader@panzer> on 2015-06-29
-
Update unity-shell-
application version dependency
| Daniel d'Andrada (dandrader) wrote : | # |
On 29/06/15 10:20, Gerry Boland wrote:
> Review: Needs Fixing
>
> -- checking for module 'unity-
> -- package 'unity-
> Need to bump that dep in CMake please
Done.
| PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:362
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 363. By Daniel d'Andrada on 2015-07-24
-
Merge trunk
[ Andreas Pokorny ]
* Release in step with Mir 0.14.0
[ CI Train Bot ]
* New rebuild forced.
[ Gerry Boland ]
* [qpa] refactor QMirServer to clean up its API, and fix strange
thread design.
[ Michał Sawicz ]
* Depend on same-version qtmir-{desktop, android}
* No-change rebuild against Qt 5.4.2.

FAILED: Continuous integration, rev:335 jenkins. qa.ubuntu. com/job/ qtmir-ci/ 264/ jenkins. qa.ubuntu. com/job/ qtmir-vivid- amd64-ci/ 115/console jenkins. qa.ubuntu. com/job/ qtmir-vivid- armhf-ci/ 115/console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/qtmir- ci/264/ rebuild
http://