diff --git a/osu.Game/Database/EFToRealmMigrator.cs b/osu.Game/Database/EFToRealmMigrator.cs index cbf5c5ffe9..ae73e13b77 100644 --- a/osu.Game/Database/EFToRealmMigrator.cs +++ b/osu.Game/Database/EFToRealmMigrator.cs @@ -1,10 +1,14 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +#nullable enable + +using System; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Development; using osu.Framework.Graphics; @@ -14,6 +18,7 @@ using osu.Framework.Platform; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Graphics; +using osu.Game.Graphics.Containers; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Models; @@ -29,8 +34,6 @@ using SharpCompress.Archives.Zip; using SharpCompress.Common; using SharpCompress.Writers.Zip; -#nullable enable - namespace osu.Game.Database { internal class EFToRealmMigrator : CompositeDrawable @@ -57,7 +60,7 @@ namespace osu.Game.Database [Resolved] private Storage storage { get; set; } = null!; - private readonly OsuSpriteText currentOperationText; + private readonly OsuTextFlowContainer currentOperationText; public EFToRealmMigrator() { @@ -99,11 +102,13 @@ namespace osu.Game.Database { State = { Value = Visibility.Visible } }, - currentOperationText = new OsuSpriteText + currentOperationText = new OsuTextFlowContainer(cp => cp.Font = OsuFont.Default.With(size: 30)) { Anchor = Anchor.Centre, Origin = Anchor.Centre, - Font = OsuFont.Default.With(size: 30) + AutoSizeAxes = Axes.Y, + RelativeSizeAxes = Axes.X, + TextAnchor = Anchor.TopCentre, }, } }, @@ -147,19 +152,34 @@ namespace osu.Game.Database log("Migration successful!"); if (DebugUtils.IsDebugBuild) - Logger.Log("Your development database has been fully migrated to realm. If you switch back to a pre-realm branch and need your previous database, rename the backup file back to \"client.db\".\n\nNote that doing this can potentially leave your file store in a bad state.", level: LogLevel.Important); + { + Logger.Log( + "Your development database has been fully migrated to realm. If you switch back to a pre-realm branch and need your previous database, rename the backup file back to \"client.db\".\n\nNote that doing this can potentially leave your file store in a bad state.", + level: LogLevel.Important); + } } else { log("Migration failed!"); Logger.Log(t.Exception.ToString(), LoggingTarget.Database); + if (RuntimeInfo.OS == RuntimeInfo.Platform.macOS && t.Exception.Flatten().InnerException is TypeInitializationException) + { + // Not guaranteed to be the only cause of exception, but let's roll with it for now. + log("Please download and run the intel version of osu! once\nto allow data migration to complete!"); + efContextFactory.SetMigrationCompletion(); + return; + } + notificationOverlay.Post(new SimpleErrorNotification { - Text = "IMPORTANT: During data migration, some of your data could not be successfully migrated. The previous version has been backed up.\n\nFor further assistance, please open a discussion on github and attach your backup files (click to get started).", + Text = + "IMPORTANT: During data migration, some of your data could not be successfully migrated. The previous version has been backed up.\n\nFor further assistance, please open a discussion on github and attach your backup files (click to get started).", Activated = () => { - game.OpenUrlExternally($@"https://github.com/ppy/osu/discussions/new?title=Realm%20migration%20issue ({t.Exception.Message})&body=Please%20drag%20the%20""attach_me.zip""%20file%20here!&category=q-a", true); + game.OpenUrlExternally( + $@"https://github.com/ppy/osu/discussions/new?title=Realm%20migration%20issue ({t.Exception.Message})&body=Please%20drag%20the%20""attach_me.zip""%20file%20here!&category=q-a", + true); const string attachment_filename = "attach_me.zip"; const string backup_folder = "backups"; diff --git a/osu.Game/Database/RealmAccess.cs b/osu.Game/Database/RealmAccess.cs index 8574002436..8dbb338980 100644 --- a/osu.Game/Database/RealmAccess.cs +++ b/osu.Game/Database/RealmAccess.cs @@ -13,6 +13,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; +using osu.Framework; using osu.Framework.Allocation; using osu.Framework.Development; using osu.Framework.Input.Bindings; @@ -293,7 +294,18 @@ namespace osu.Game.Database /// Compact this realm. /// /// - public bool Compact() => Realm.Compact(getConfiguration()); + public bool Compact() + { + try + { + return Realm.Compact(getConfiguration()); + } + // Catch can be removed along with entity framework. Is specifically to allow a failure message to arrive to the user (see similar catches in EFToRealmMigrator). + catch (AggregateException ae) when (RuntimeInfo.OS == RuntimeInfo.Platform.macOS && ae.Flatten().InnerException is TypeInitializationException) + { + return true; + } + } /// /// Run work on realm with a return value. @@ -542,6 +554,11 @@ namespace osu.Game.Database return Realm.GetInstance(getConfiguration()); } + // Catch can be removed along with entity framework. Is specifically to allow a failure message to arrive to the user (see similar catches in EFToRealmMigrator). + catch (AggregateException ae) when (RuntimeInfo.OS == RuntimeInfo.Platform.macOS && ae.Flatten().InnerException is TypeInitializationException) + { + return Realm.GetInstance(); + } finally { if (tookSemaphoreLock) diff --git a/osu.Game/Rulesets/Mods/ModCinema.cs b/osu.Game/Rulesets/Mods/ModCinema.cs index f28ef1edeb..1fe5ddecf9 100644 --- a/osu.Game/Rulesets/Mods/ModCinema.cs +++ b/osu.Game/Rulesets/Mods/ModCinema.cs @@ -14,8 +14,6 @@ namespace osu.Game.Rulesets.Mods { public virtual void ApplyToDrawableRuleset(DrawableRuleset drawableRuleset) { - drawableRuleset.SetReplayScore(CreateReplayScore(drawableRuleset.Beatmap, drawableRuleset.Mods)); - // AlwaysPresent required for hitsounds drawableRuleset.AlwaysPresent = true; drawableRuleset.Hide();