-
-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Licence choice suggestion #5
Comments
Thanks for the suggestions. We still haven't finalised anything and agree that dual licensing is likely the best way forward. |
+1 for MIT/BSD, since it makes the best possibilities for contribution in that project, and it's not iOS-aware |
I too agree that a dual license is the way to go. I think that as much of the codebase as possible should be GPL, and any parts that are used in the iOS version would be licensed under a permissive license like the BSD or MIT licenses. This way you can allow contributions from the community (since you won't need to worry about relicensing) and still keep your software open. Apple themselves uses permissive licenses: they originally distributed the GPL-licensed GCC, and have since created Clang under the permissive UIUC License to use instead. Regardless, this is an exciting development for the free software community and I hope the transition goes smoothly. I personally am excited at the idea of a fork of osu! focused on Linux compatibility. |
@ammongit - Licensing a part of the project as GPL and other part as MIT/BSD can be problematic in itself. First of all, GPL doesn't seem to be designed to be used that way. As a strong copyleft/"viral" license, it makes the project live it's own life. Note the you can relicense MIT/BSD-licensed code under GPL, so you can merge MIT/BSD-licensed codebase into GPL project, but not the other way around. Then you have to explain this to contributors, should they contribute their changes to the right project under right license. Basically, I think that licensing the whole thing as GPL and requiring each and every contributor to state that they "allow Peppy/osu! core developer team to use their contribution also for making iOS version" might be simpler than splitting the codebase into permissively-licensed part project and GPL-licensed "full" project and managing the separation (because if third-party contributions to GPL part will be accepted, sooner or later someone could contribute something that would be useful for iOS version to the GPL project). Feels like hacking with licensing corner-cases... |
I have to rule out but I consider osu! to be on BSD or MIT license but if you don't want open source editing out of it, you'll use Google's Open Source License (I guess) or AOSL EDIT: you don't need to choose more than one license, or just create a License out of those Licenses (Like Apple did for AOSL but not GPL compatible) |
I've done some thinking on this as well... Is there any particular reason not to use CC-BY or other variants? It should be compatible with the App Store AFAIK (SA might break that, but it's only really important if you want the license to stay the same on derivative works). If you need the license to stay the same, the Mozilla Public License (MPL) or the Common Development and Distribution License (CDDL) might be a couple more viable options. |
@mz2212 CC-BY is not a software license. While I suppose it is possible to use it to license code, I think a GPL-like license is the best bet for osu, since we don't want other companies being able to make proprietary forks of the product. I think the MPL and CDDL are fine, but I personally think osu needs strong copyleft protection, and that those two licenses don't do enough in that regard. The difficulty here is licensing under GPL or something while still making it compatible with the iOS app store. Here's what the FSF has to say about GPL-licensed code on the app store. The TL;DR is GPL2 and 3 are both incompatible with Apple's restrictions. Given what everybody has said so far, I'm thinking that the best option is to have all contributors give the copyright to peppy, under the condition that it be licensed as free software. As the sole copyright holder, he can relicense parts as necessary under a permissive license for the iOS app, and the rest under GPL3. Perhaps this is where we could use the Mozilla Public License, since the MPL seems to be compatible with the app store. |
The correction for the word "Licence" is supposed to be "License" |
I'm Australian. Licence is actually correct for me. Live with it please. |
@peppy Oh, Didn't know! xD Anyways, I think GPL v3.0 is a good choice. |
Since peppy owns the code, he can tell Apple that he is using a proprietary license for the iOS version. (Dual-licensing with a proprietary license XD.) This still stops others from uploading derivatives to App Store though -- they are receiving the code under GPL. (An evil "shared"-source iOS-only public license will help then.) |
@Arthur2e5 - He won't own any code contributed by anyone else on the terms of GPL. |
@Xender Indeed. And unfortunately CLAs sound evil too. How about something like a GPLv3 App Store Exception then? It seems that most of the incompatiblilities are caused by the DRM-related clauses in GPLv3. (I must be drunk -- without all the clauses it's almost GPLv2…) |
@Arthur2e5 - For me, CLA-s sound less evil and much more clear than creating custom exceptions to GPL. On the other hand, creating exceptions for GPL is basically changing the meaning of GPL itself. I think that creating a custom exception for GPL would require:
|
IANAL This may be an issue when releasing for desktop or other platforms as well. peppy mentioned the following in this blogpost:
FSF states the following in their FAQ:
If I understand the GPL correctly, this means that peppy cannot release the client with any proprietary libraries to connect to bancho, unless those libraries are released under a GPL compatible license. Adding an exception to the GPL license could be a solution, but may prevent keeping future parts of osu! proprietary when those are not covered by the added exception. This doesn't seem to be a problem with the LGPL license. The LGPL would still |
@gluestick I believe your understanding of the GPL and how it applies to linking is correct. I think that licensing osu! under the LGPL provides it with weaker copyleft protection and should be avoided if possible. However, in that blog post peppy said the following:
It seems to me the best choice is to avoid the LGPL and make the entire client open source, and take anything that should be kept secret (e.g. anticheat) to the server. (The rest of this post is not related to @gluestick's comment, but to the blog post peppy made) One question I found interesting was the following:
I don't really understand how you can release osu! under a free software license without making it legal to re-release it as your own game. I understand trademarking the word "osu!" and copyrighting the art, but as long as somebody changes those parts, they are free to release their own version. Firefox is a good example, since you cannot release a Firefox fork and call it "Firefox" or use their logo, but if you replace them then you're good to go. The thing is that I really don't see people making random forks as a big deal. The majority of the userbase will stay with the mainstream osu! source tree. This is where I think having osu! be completely GPL rather than LGPL is most important, since if a fork does add some features that osu! itself doesn't have and people like it, then we can take their improvements into the upstream osu! source since the fork must be GPL as well. If osu! was LGPL or used some sort of permissive license then a competitor could release proprietary extensions and use the LGPL's linking exception or relicense the whole thing to something not open. As long as all potential forks are GPL, I think this problem is mitigated, since we can always merge in improvements. |
about the cloned servers: if made, they aren't going to be made due to people not liking the client, they will most probably be populated by banned players and the likw. |
These already exist. A licence ain't going to do anything either way for such cases. Anyways since i haven't posted here, let me bring you up-to-date with the situation: I am likely going to create an osu! licence specifically for the project. This is not to make it any less "free", but to use the licence to state my intentions of making the project open source. More details will come with time, but you can check out my blog post to get an overview of my intentions and the direction things are heading. As always, nothing is final. |
So a quick question (Sorry that it may be very stupid) Are we having both osu! and osu!stream open sourcing? Since I guess they are individually developed and have a different code base (I may be wrong but I can't find any reference on whether they are on the same one). Since we are dual-lincencing is it a reasonable idea to apply different licence to these two versions since osu!stream have completely different game play? (a single stage can have different object sets) |
osu!stream is completely separate. haven't made any decisions about that yet. |
Since currently osu!stream is proprietary, and we are talking about App Store compatibility, I assume that you are talking about "We don't want to limit osu! from going online on App Store" (Maybe I'm wrong too.) What about an independent code base for osu!stream? Then we won't be bothering on "Osu! main codebase incompatible with App store" issue anymore since we can apply licences like LGPL (which do not prevent osu!stream to use osu! code if certain conditions are met) to osu! and keep osu!stream as a portal to App Store. I'm assuming that we are not talking about "To block people from forking osu! code to release something on App Store." |
we plan on releasing osu! on ios and other platforms going forward. it has nothing to do with osu!stream in this case. |
Anyway let's forget osu!stream. I mean that since App Store has its own ecosystem, it's really not that easy to give iOS players to have the same experience. At least I see many game apps claimed that even between iOS and Android version of the same app, cash-bought items can't be shared. this means even when we want to connect players from iOS platform to those from PC / Android platform we have to present different things to iOS players - In other words we need to do extra work, having a different code base if we do want an exact port at least looking from outside. Though porting to any platform involves some extent of special customization on code, why not just calling "osu! iOS code base" another name and make it completely different software that "includes main osu! open-source code as a module legally" through some licence that allows reuse of the code without open-sourcing every code piece? |
my plan is to use a single code base to target everything (this is the direction we are heading). i've already got osu! compiling and running on iOS using the main code base |
That's great. I believe that technology will never be the limit, but releasing it to App Store is a completely different thing :( . Anyway I'll give dual-licencing with LGPL in it a +1. This at least allow it to be included in proprietary software as a library which seems to be a feasible option for osu! in App Store. |
Eh, LGPL is not a strong copyleft licence effectively because of the linking exception. Strong copyleft like in GPL would be better for the case - it will prevent forks that take but do not give back. On the other hand, if @peppy wants people to be able to use osu! code base to make their own proprietary games (with original gameplay, i.e. using the rendering engine, not ripping off everything), then copyleft is not desirable at all, a permissive/liberal free software licence (MIT/X11, BSD, zlib etc.) is needed for that. |
Don't bother with the LGPL as that is designed really for "libraries" (as is defined in that license) only and still requires corresponding source for that "library" be available with any distributed binary forms. So in cases where things are not dynamically linked you are not solving the issue of distributing binaries without corresponding source, which in the case of the GPL (or LGPL for that matter), means exact same source code that was used to create that binary. Meaning any cheat engine for example would required to be open source with the same freedoms of the GPL. Really the LGPL should be stayed away from if it's not a library, it's not really intended to be used with an entire project that intended to be more than just a library, especially how it's worded it. @gluestick is right regarding the GPL, if the GPL is the only license chosen and @peppy had to follow those terms from future contributions, but if providing an open source client is the goal, but you do not wish for others to make the game proprietary themselves, the best license to go with is still the GPL, it's just all in how you implement it. So, to allow the proprietary use separately for peppy only while releasing the main client GPL, either: This is all separate to any skins and trademarks which are separate elements of the project which don't have to be licensed under any open source license whatsoever (so the osu! name or skins never have to be redistributable). I personally like #.2, since it doesn't require a CLA since some people find it dirty but in effect fulfils the goal of the GPL for a complete open source client without allowing someone rip off the game without releasing source code as well, while still being able to implement contributions in a proprietary client with the contributors still owning the full rights themselves to license their own code as they wish in addition to MIT/BSD rather than entrusting someone (@peppy in this case) in a CLA. Whatever you do, just remember that GPL is incompatible with proprietary code in general, so if you decide to accept contributions under the GPL without any separate license for incorporating in a proprietary client you'll end up with having another Craftbukkit on your hands, which nobody wants to see happen, so it's best to get it right the first time :) (and for those who don't know what that was... Craftbukkit was a GPL licensed API for the proprietary Minecraft server that is (and always was) technically illegal to distribute since Minecraft server is proprietary and Craftbukkit is GPL, which is incompatible with the Minecraft EULA... which is why the md5 fiasco and wolverness thing happened and still isn't really settled and likely never will be) |
Thanks to everyone for their feedback. As per my recent blog post, we still have some work to do before opening up for external submissions. That said, I have come to a conclusion for a license which sits well with me. Look forward to the announcement and open sourcing in the coming months! 🎱 |
…nter Updates csproj file for keycounter resources
Refactor HitProbabilities for clarity (+performance gain), add comments
``` TearDown : osu.Framework.Testing.Drawables.Steps.AssertButton+TracedException : Channel 1 ready --TearDown at osu.Framework.Threading.ScheduledDelegate.RunTaskInternal() at osu.Framework.Threading.Scheduler.Update() at osu.Framework.Graphics.Drawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Graphics.Containers.CompositeDrawable.UpdateSubTree() at osu.Framework.Platform.GameHost.UpdateFrame() at osu.Framework.Threading.GameThread.processFrame() at osu.Framework.Threading.GameThread.RunSingleFrame() at osu.Framework.Threading.GameThread.<createThread>g__runWork|66_0() at System.Threading.Thread.StartHelper.Callback(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) ----- One or more child tests had errors Exception doesn't have a stacktrace [runtime] 2022-05-29 19:29:09 [verbose]: 💨 Class: TestSceneChatOverlayV2 [runtime] 2022-05-29 19:29:09 [verbose]: 🔶 Test: TestSlowLoadingChannel [runtime] 2022-05-29 19:29:09 [verbose]: Chat is now polling every 60000 ms [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #1 Setup request handler [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #2 Add test channels [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #3 Show overlay (slow-loading) [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #4 Join channel 1 [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #5 Select channel 1 [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #6 Channel 1 loading [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #7 Join channel 2 [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #8 Select channel 2 [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #9 Channel 2 loading [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #10 Finish channel 1 load [runtime] 2022-05-29 19:29:09 [verbose]: 🔸 Step #11 Channel 1 ready [runtime] 2022-05-29 19:29:09 [verbose]: 💥 Failed [runtime] 2022-05-29 19:29:09 [verbose]: ⏳ Currently loading components (2) [runtime] 2022-05-29 19:29:09 [verbose]: TestSceneChatOverlayV2+SlowLoadingDrawableChannel [runtime] 2022-05-29 19:29:09 [verbose]: - thread: ThreadedTaskScheduler (LoadComponentsAsync (standard)) [runtime] 2022-05-29 19:29:09 [verbose]: - state: Loading [runtime] 2022-05-29 19:29:09 [verbose]: TestSceneChatOverlayV2+SlowLoadingDrawableChannel [runtime] 2022-05-29 19:29:09 [verbose]: - thread: ThreadedTaskScheduler (LoadComponentsAsync (standard)) [runtime] 2022-05-29 19:29:09 [verbose]: - state: Ready [runtime] 2022-05-29 19:29:09 [verbose]: 🧵 Task schedulers [runtime] 2022-05-29 19:29:09 [verbose]: LoadComponentsAsync (standard) concurrency:4 running:1 pending:0 [runtime] 2022-05-29 19:29:09 [verbose]: LoadComponentsAsync (long load) concurrency:4 running:0 pending:0 [runtime] 2022-05-29 19:29:09 [verbose]: 🎱 Thread pool [runtime] 2022-05-29 19:29:09 [verbose]: worker: min 32 max 32,767 available 32,765 [runtime] 2022-05-29 19:29:09 [verbose]: completion: min 32 max 1,000 available 1,000 ```
Tracking down a flaky test (https://teamcity.ppy.sh/buildConfiguration/Osu_Build/553?hideProblemsFromDependencies=false&expandBuildTestsSection=true&hideTestsFromDependencies=false): ```csharp TearDown : System.TimeoutException : "PM Channel 1 displayed" timed out --TearDown at osu.Framework.Testing.Drawables.Steps.UntilStepButton.<>c__DisplayClass11_0.<.ctor>b__0() at osu.Framework.Testing.Drawables.Steps.StepButton.PerformStep(Boolean userTriggered) at osu.Framework.Testing.TestScene.runNextStep(Action onCompletion, Action`1 onError, Func`2 stopCondition) --- End of stack trace from previous location --- at osu.Framework.Testing.TestSceneTestRunner.TestRunner.RunTestBlocking(TestScene test) at osu.Game.Tests.Visual.OsuTestScene.OsuTestSceneTestRunner.RunTestBlocking(TestScene test) in /opt/buildagent/work/ecd860037212ac52/osu.Game/Tests/Visual/OsuTestScene.cs:line 503 at osu.Framework.Testing.TestScene.RunTestsFromNUnit() ------- Stdout: ------- [runtime] 2022-06-27 23:18:55 [verbose]: 💨 Class: TestSceneChatOverlay [runtime] 2022-06-27 23:18:55 [verbose]: 🔶 Test: TestKeyboardNextChannel [runtime] 2022-06-27 23:18:55 [verbose]: Chat is now polling every 60000 ms [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #1 Setup request handler [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #2 Add test channels [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #3 Show overlay with channels [runtime] 2022-06-27 23:18:55 [verbose]: Unhandled Request Type: osu.Game.Online.API.Requests.CreateChannelRequest [network] 2022-06-27 23:18:55 [verbose]: Failing request osu.Game.Online.API.Requests.CreateChannelRequest (System.InvalidOperationException: DummyAPIAccess cannot process this request.) [runtime] 2022-06-27 23:18:55 [verbose]: Unhandled Request Type: osu.Game.Online.API.Requests.CreateChannelRequest [network] 2022-06-27 23:18:55 [verbose]: Failing request osu.Game.Online.API.Requests.CreateChannelRequest (System.InvalidOperationException: DummyAPIAccess cannot process this request.) [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #4 Select channel 1 [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #5 Channel 1 is visible [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #6 Press document next keys [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #7 Channel 2 is visible [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #8 Press document next keys [runtime] 2022-06-27 23:18:55 [verbose]: 🔸 Step #9 PM Channel 1 displayed [network] 2022-06-27 23:18:55 [verbose]: Request to https://a.ppy.sh/587 failed with System.Net.WebException: NotFound. [network] 2022-06-27 23:18:55 [verbose]: Request to https://a.ppy.sh/503 failed with System.Net.WebException: NotFound. [runtime] 2022-06-27 23:19:05 [verbose]: 💥 Failed (on attempt 5,550) [runtime] 2022-06-27 23:19:05 [verbose]: ⏳ Currently loading components (0) [runtime] 2022-06-27 23:19:05 [verbose]: 🧵 Task schedulers [runtime] 2022-06-27 23:19:05 [verbose]: LoadComponentsAsync (standard) concurrency:4 running:0 pending:0 [runtime] 2022-06-27 23:19:05 [verbose]: LoadComponentsAsync (long load) concurrency:4 running:0 pending:0 [runtime] 2022-06-27 23:19:05 [verbose]: 🎱 Thread pool [runtime] 2022-06-27 23:19:05 [verbose]: worker: min 1 max 32,767 available 32,766 [runtime] 2022-06-27 23:19:05 [verbose]: completion: min 1 max 1,000 available 1,000 [runtime] 2022-06-27 23:19:05 [debug]: Focus on "ChatTextBox" no longer valid as a result of unfocusIfNoLongerValid. [runtime] 2022-06-27 23:19:05 [debug]: Focus changed from ChatTextBox to nothing. ``` This kind of logging should be helpful: ```csharp [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #5 Channel 1 is visible [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #6 Press document next keys [runtime] 2022-06-28 04:59:57 [verbose]: Current channel changed to #channel-2 [runtime] 2022-06-28 04:59:57 [debug]: Pressed (DocumentNext) handled by TestSceneChatOverlay+TestChatOverlay. [runtime] 2022-06-28 04:59:57 [debug]: KeyDownEvent(PageDown, False) handled by ManualInputManager+LocalPlatformActionContainer. [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #7 Channel 2 is visible [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #8 Press document next keys [runtime] 2022-06-28 04:59:57 [verbose]: Current channel changed to test user 685 [runtime] 2022-06-28 04:59:57 [debug]: Pressed (DocumentNext) handled by TestSceneChatOverlay+TestChatOverlay. [runtime] 2022-06-28 04:59:57 [debug]: KeyDownEvent(PageDown, False) handled by ManualInputManager+LocalPlatformActionContainer. [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #9 PM Channel 1 displayed [runtime] 2022-06-28 04:59:57 [verbose]: 🔸 Step #10 Press document next keys [runtime] 2022-06-28 04:59:57 [verbose]: Current channel changed to test user 218 ```
Not really sure how to improve this further, but should help with cases like this: ```csharp [runtime] 2022-06-28 05:32:06 [verbose]: 💨 Class: TestSceneSpectatorPlayback [runtime] 2022-06-28 05:32:06 [verbose]: 🔶 Test: TestWithSendFailure [runtime] 2022-06-28 05:32:06 [verbose]: 🔸 Step #1 Setup containers [runtime] 2022-06-28 05:32:06 [verbose]: Received 1 new frames (total 1 of 2) [runtime] 2022-06-28 05:32:06 [verbose]: 🔸 Step #2 received frames [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 7 of 8) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 13 of 19) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 19 of 29) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 25 of 44) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 31 of 45) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 37 of 59) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 43 of 67) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 49 of 125) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 55 of 126) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 61 of 127) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 67 of 128) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 73 of 129) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 79 of 130) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 85 of 131) [runtime] 2022-06-28 05:32:06 [verbose]: ✔️ 22 repetitions [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 91 of 132) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 97 of 133) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 103 of 134) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 109 of 135) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 115 of 136) [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 121 of 137) [runtime] 2022-06-28 05:32:06 [verbose]: 🔸 Step #3 start failing sends [runtime] 2022-06-28 05:32:06 [verbose]: Received 6 new frames (total 127 of 138) [runtime] 2022-06-28 05:32:06 [verbose]: 🔸 Step #4 wait for send attempts [runtime] 2022-06-28 05:32:06 [verbose]: 🔸 Step #5 frames did not increase [runtime] 2022-06-28 05:32:06 [verbose]: 💥 Failed [runtime] 2022-06-28 05:32:06 [verbose]: ⏳ Currently loading components (0) [runtime] 2022-06-28 05:32:06 [verbose]: 🧵 Task schedulers [runtime] 2022-06-28 05:32:06 [verbose]: LoadComponentsAsync (standard) concurrency:4 running:0 pending:0 [runtime] 2022-06-28 05:32:06 [verbose]: LoadComponentsAsync (long load) concurrency:4 running:0 pending:0 [runtime] 2022-06-28 05:32:06 [verbose]: 🎱 Thread pool [runtime] 2022-06-28 05:32:06 [verbose]: worker: min 1 max 32,767 available 32,766 [runtime] 2022-06-28 05:32:06 [verbose]: completion: min 1 max 1,000 available 1,000 [runtime] 2022-06-28 05:32:06 [verbose]: Host execution state changed to Stopping ``` https://teamcity.ppy.sh/buildConfiguration/Osu_Build/811?hideProblemsFromDependencies=false&hideTestsFromDependencies=false&expandBuildTestsSection=true
Was failing occasionally due to the beatmap present operation causing the test's ruleset change to undo. ```csharp TearDown : System.TimeoutException : "wait for placeholder visible" timed out --TearDown at osu.Framework.Testing.Drawables.Steps.UntilStepButton.<>c__DisplayClass11_0.<.ctor>b__0() at osu.Framework.Testing.Drawables.Steps.StepButton.PerformStep(Boolean userTriggered) at osu.Framework.Testing.TestScene.runNextStep(Action onCompletion, Action`1 onError, Func`2 stopCondition) --- End of stack trace from previous location --- at osu.Framework.Testing.TestSceneTestRunner.TestRunner.RunTestBlocking(TestScene test) at osu.Game.Tests.Visual.OsuTestScene.OsuTestSceneTestRunner.RunTestBlocking(TestScene test) in /opt/buildagent/work/ecd860037212ac52/osu.Game/Tests/Visual/OsuTestScene.cs:line 503 at osu.Framework.Testing.TestScene.RunTestsFromNUnit() ------- Stdout: ------- [runtime] 2022-06-29 10:36:45 [verbose]: 💨 Class: TestScenePlaySongSelect [runtime] 2022-06-29 10:36:45 [verbose]: 🔶 Test: TestPlaceholderConvertSetting [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #1 exit all screens [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #2 reset defaults [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #3 delete all beatmaps [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #4 change ruleset to 2 [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #5 import test map for ruleset 0 [database] 2022-06-29 10:36:45 [verbose]: [efc1a] Beginning import from unknown... [database] 2022-06-29 10:36:45 [verbose]: [efc1a] Import successfully completed! [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #6 wait for imported to arrive in carousel [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #7 change convert setting [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #8 create song select [runtime] 2022-06-29 10:36:45 [verbose]: ScreenTestScene screen changed → TestScenePlaySongSelect+TestSongSelect [runtime] 2022-06-29 10:36:45 [verbose]: 📺 ScreenTestScene(OsuScreenStack)#338(depth:1) loading TestScenePlaySongSelect+TestSongSelect#263 [runtime] 2022-06-29 10:36:45 [verbose]: decoupled ruleset transferred ("" -> "osu!catch") [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #9 wait for present [runtime] 2022-06-29 10:36:45 [verbose]: 📺 ScreenTestScene(OsuScreenStack)#338(depth:1) entered TestScenePlaySongSelect+TestSongSelect#263 [runtime] 2022-06-29 10:36:45 [verbose]: 📺 BackgroundScreenStack#328(depth:1) loading BackgroundScreenBeatmap#338 [runtime] 2022-06-29 10:36:45 [verbose]: 📺 BackgroundScreenStack#328(depth:1) entered BackgroundScreenBeatmap#338 [runtime] 2022-06-29 10:36:45 [verbose]: Song select updating selection with beatmap:null ruleset:fruits [runtime] 2022-06-29 10:36:45 [verbose]: Song select changing beatmap from "please load a beatmap! - no beatmaps available!" to "null" [runtime] 2022-06-29 10:36:45 [verbose]: Song select working beatmap updated to Some Artist 0 - Some Song (set id 6224) ece7b702-895c-4f15-892f-05e4ff5e9a24 (Some Guy 3) [Normal 6224000 (length 0:50, bpm 106.7)] [runtime] 2022-06-29 10:36:45 [verbose]: Song select updating selection with beatmap:null ruleset:osu [runtime] 2022-06-29 10:36:45 [verbose]: decoupled ruleset transferred ("osu!catch" -> "osu!") [runtime] 2022-06-29 10:36:45 [verbose]: Song select updating selection with beatmap:74232aa2-2a1f-4920-b643-e85976838251 ruleset:osu [runtime] 2022-06-29 10:36:45 [verbose]: Song select decided to ensurePlayingSelected [runtime] 2022-06-29 10:36:45 [verbose]: Game-wide working beatmap updated to Some Artist 0 - Some Song (set id 6224) ece7b702-895c-4f15-892f-05e4ff5e9a24 (Some Guy 3) [Normal 6224000 (length 0:50, bpm 106.7)] [runtime] 2022-06-29 10:36:45 [debug]: Focus changed from nothing to SeekLimitedSearchTextBox. [network] 2022-06-29 10:36:45 [verbose]: Failing request osu.Game.Online.API.Requests.GetBeatmapRequest (System.InvalidOperationException: DummyAPIAccess cannot process this request.) [runtime] 2022-06-29 10:36:45 [verbose]: ✔️ 16 repetitions [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #10 wait for carousel loaded [runtime] 2022-06-29 10:36:45 [verbose]: 🔸 Step #11 wait for placeholder visible [runtime] 2022-06-29 10:36:55 [verbose]: 💥 Failed (on attempt 1,459) [runtime] 2022-06-29 10:36:55 [verbose]: ⏳ Currently loading components (0) [runtime] 2022-06-29 10:36:55 [verbose]: 🧵 Task schedulers [runtime] 2022-06-29 10:36:55 [verbose]: LoadComponentsAsync (standard) concurrency:4 running:0 pending:0 [runtime] 2022-06-29 10:36:55 [verbose]: LoadComponentsAsync (long load) concurrency:4 running:0 pending:0 [runtime] 2022-06-29 10:36:55 [verbose]: 🎱 Thread pool [runtime] 2022-06-29 10:36:55 [verbose]: worker: min 1 max 32,767 available 32,766 [runtime] 2022-06-29 10:36:55 [verbose]: completion: min 1 max 1,000 available 1,000 [runtime] 2022-06-29 10:36:55 [debug]: Focus on "SeekLimitedSearchTextBox" no longer valid as a result of unfocusIfNoLongerValid. [runtime] 2022-06-29 10:36:55 [debug]: Focus changed from SeekLimitedSearchTextBox to nothing. ```
修复Cursor Dance 和 Autoplay 在使用Ctrl+Enter时同时启用
Hi.
As for GPLv3 limiting "iOS app store compatibility", I can think of some solutions.
First of all - as long as you have full copy-rights to the entire code base, you can dual-license it.
Dual licensing can be of any form the copyright holder wants:
So the real issue as I understand it boils down to having full copy-rights for the whole base. Possible solutions for that:
I think the CLA way could work better than other alternatives I can think of.
It can be a bit controversial, but it's the only way I can think of that would both liberate the code (GPL) and allow you to make iOS store releases without risk of an unhappy contributor making claims to take down the app from the store.
Disclaimer: I am not a lawyer, nor a license expert.
The text was updated successfully, but these errors were encountered: