mirror of
https://github.com/ppy/osu.git
synced 2025-02-15 14:42:56 +08:00
Merge branch 'fix-nested-folder-migration-endless-copy' into migration-ui
This commit is contained in:
commit
9ed0e8891b
@ -24,7 +24,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(OsuModSpunOut), typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail), typeof(ModAutoplay) };
|
public override Type[] IncompatibleMods => new[] { typeof(OsuModSpunOut), typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail), typeof(ModAutoplay) };
|
||||||
|
|
||||||
public bool AllowFail => false;
|
public bool PerformFail() => false;
|
||||||
|
|
||||||
public bool RestartOnFail => false;
|
public bool RestartOnFail => false;
|
||||||
|
|
||||||
private OsuInputManager inputManager;
|
private OsuInputManager inputManager;
|
||||||
|
@ -223,7 +223,7 @@ namespace osu.Game.Tests.NonVisual
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestMigrationToNestedTargetFails()
|
public void TestMigrationToNestedTargetFails()
|
||||||
{
|
{
|
||||||
using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestMigrationToSameTargetFails)))
|
using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestMigrationToNestedTargetFails)))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -233,6 +233,9 @@ namespace osu.Game.Tests.NonVisual
|
|||||||
|
|
||||||
string subFolder = Path.Combine(customPath, "sub");
|
string subFolder = Path.Combine(customPath, "sub");
|
||||||
|
|
||||||
|
if (Directory.Exists(subFolder))
|
||||||
|
Directory.Delete(subFolder, true);
|
||||||
|
|
||||||
Directory.CreateDirectory(subFolder);
|
Directory.CreateDirectory(subFolder);
|
||||||
|
|
||||||
Assert.Throws<ArgumentException>(() => osu.Migrate(subFolder));
|
Assert.Throws<ArgumentException>(() => osu.Migrate(subFolder));
|
||||||
@ -244,6 +247,33 @@ namespace osu.Game.Tests.NonVisual
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestMigrationToSeeminglyNestedTarget()
|
||||||
|
{
|
||||||
|
using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestMigrationToSeeminglyNestedTarget)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var osu = loadOsu(host);
|
||||||
|
|
||||||
|
Assert.DoesNotThrow(() => osu.Migrate(customPath));
|
||||||
|
|
||||||
|
string seeminglySubFolder = customPath + "sub";
|
||||||
|
|
||||||
|
if (Directory.Exists(seeminglySubFolder))
|
||||||
|
Directory.Delete(seeminglySubFolder, true);
|
||||||
|
|
||||||
|
Directory.CreateDirectory(seeminglySubFolder);
|
||||||
|
|
||||||
|
osu.Migrate(seeminglySubFolder);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
host.Exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private OsuGameBase loadOsu(GameHost host)
|
private OsuGameBase loadOsu(GameHost host)
|
||||||
{
|
{
|
||||||
var osu = new OsuGameBase();
|
var osu = new OsuGameBase();
|
||||||
|
@ -33,7 +33,8 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
{
|
{
|
||||||
public new ScoreProcessor ScoreProcessor => base.ScoreProcessor;
|
public new ScoreProcessor ScoreProcessor => base.ScoreProcessor;
|
||||||
public new HUDOverlay HUDOverlay => base.HUDOverlay;
|
public new HUDOverlay HUDOverlay => base.HUDOverlay;
|
||||||
public new bool AllowFail => base.AllowFail;
|
|
||||||
|
public bool AllowFail => base.CheckModsAllowFailure();
|
||||||
|
|
||||||
protected override bool PauseOnFocusLost => false;
|
protected override bool PauseOnFocusLost => false;
|
||||||
|
|
||||||
|
@ -48,10 +48,14 @@ namespace osu.Game.IO
|
|||||||
var source = new DirectoryInfo(GetFullPath("."));
|
var source = new DirectoryInfo(GetFullPath("."));
|
||||||
var destination = new DirectoryInfo(newLocation);
|
var destination = new DirectoryInfo(newLocation);
|
||||||
|
|
||||||
if (source.FullName == destination.FullName)
|
// using Uri is the easiest way to check equality and contains (https://stackoverflow.com/a/7710620)
|
||||||
|
var sourceUri = new Uri(source.FullName + Path.DirectorySeparatorChar);
|
||||||
|
var destinationUri = new Uri(destination.FullName + Path.DirectorySeparatorChar);
|
||||||
|
|
||||||
|
if (sourceUri == destinationUri)
|
||||||
throw new ArgumentException("Destination provided is already the current location", nameof(newLocation));
|
throw new ArgumentException("Destination provided is already the current location", nameof(newLocation));
|
||||||
|
|
||||||
if (destination.FullName.Contains(source.FullName))
|
if (sourceUri.IsBaseOf(destinationUri))
|
||||||
throw new ArgumentException("Destination provided is inside the source", nameof(newLocation));
|
throw new ArgumentException("Destination provided is inside the source", nameof(newLocation));
|
||||||
|
|
||||||
// ensure the new location has no files present, else hard abort
|
// ensure the new location has no files present, else hard abort
|
||||||
|
@ -11,10 +11,11 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether we should allow failing at the current point in time.
|
/// Whether we should allow failing at the current point in time.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool AllowFail { get; }
|
/// <returns>Whether the fail should be allowed to proceed. Return false to block.</returns>
|
||||||
|
bool PerformFail();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Whether we want to restart on fail. Only used if <see cref="AllowFail"/> is true.
|
/// Whether we want to restart on fail. Only used if <see cref="PerformFail"/> returns true.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool RestartOnFail { get; }
|
bool RestartOnFail { get; }
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,8 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public override string Description => "Watch a perfect automated play through the song.";
|
public override string Description => "Watch a perfect automated play through the song.";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
|
|
||||||
public bool AllowFail => false;
|
public bool PerformFail() => false;
|
||||||
|
|
||||||
public bool RestartOnFail => false;
|
public bool RestartOnFail => false;
|
||||||
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };
|
public override Type[] IncompatibleMods => new[] { typeof(ModRelax), typeof(ModSuddenDeath), typeof(ModNoFail) };
|
||||||
|
@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// We never fail, 'yo.
|
/// We never fail, 'yo.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool AllowFail => false;
|
public bool PerformFail() => false;
|
||||||
|
|
||||||
public bool RestartOnFail => false;
|
public bool RestartOnFail => false;
|
||||||
|
|
||||||
|
@ -48,17 +48,14 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
retries = Retries.Value;
|
retries = Retries.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool AllowFail
|
public bool PerformFail()
|
||||||
{
|
{
|
||||||
get
|
if (retries == 0) return true;
|
||||||
{
|
|
||||||
if (retries == 0) return true;
|
|
||||||
|
|
||||||
health.Value = health.MaxValue;
|
health.Value = health.MaxValue;
|
||||||
retries--;
|
retries--;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool RestartOnFail => false;
|
public bool RestartOnFail => false;
|
||||||
|
@ -20,7 +20,8 @@ namespace osu.Game.Rulesets.Mods
|
|||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) };
|
public override Type[] IncompatibleMods => new[] { typeof(ModNoFail), typeof(ModRelax), typeof(ModAutoplay) };
|
||||||
|
|
||||||
public bool AllowFail => true;
|
public bool PerformFail() => true;
|
||||||
|
|
||||||
public bool RestartOnFail => true;
|
public bool RestartOnFail => true;
|
||||||
|
|
||||||
public void ApplyToHealthProcessor(HealthProcessor healthProcessor)
|
public void ApplyToHealthProcessor(HealthProcessor healthProcessor)
|
||||||
|
@ -105,7 +105,7 @@ namespace osu.Game.Screens.Play
|
|||||||
/// Whether failing should be allowed.
|
/// Whether failing should be allowed.
|
||||||
/// By default, this checks whether all selected mods allow failing.
|
/// By default, this checks whether all selected mods allow failing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected virtual bool AllowFail => Mods.Value.OfType<IApplicableFailOverride>().All(m => m.AllowFail);
|
protected virtual bool CheckModsAllowFailure() => Mods.Value.OfType<IApplicableFailOverride>().All(m => m.PerformFail());
|
||||||
|
|
||||||
private readonly bool allowPause;
|
private readonly bool allowPause;
|
||||||
private readonly bool showResults;
|
private readonly bool showResults;
|
||||||
@ -485,7 +485,7 @@ namespace osu.Game.Screens.Play
|
|||||||
|
|
||||||
private bool onFail()
|
private bool onFail()
|
||||||
{
|
{
|
||||||
if (!AllowFail)
|
if (!CheckModsAllowFailure())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
HasFailed = true;
|
HasFailed = true;
|
||||||
|
@ -12,7 +12,7 @@ namespace osu.Game.Screens.Play
|
|||||||
private readonly Score score;
|
private readonly Score score;
|
||||||
|
|
||||||
// Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108)
|
// Disallow replays from failing. (see https://github.com/ppy/osu/issues/6108)
|
||||||
protected override bool AllowFail => false;
|
protected override bool CheckModsAllowFailure() => false;
|
||||||
|
|
||||||
public ReplayPlayer(Score score, bool allowPause = true, bool showResults = true)
|
public ReplayPlayer(Score score, bool allowPause = true, bool showResults = true)
|
||||||
: base(allowPause, showResults)
|
: base(allowPause, showResults)
|
||||||
|
@ -41,7 +41,7 @@ namespace osu.Game.Tests.Visual
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool AllowFail => true;
|
protected override bool CheckModsAllowFailure() => true;
|
||||||
|
|
||||||
public bool CheckFailed(bool failed)
|
public bool CheckFailed(bool failed)
|
||||||
{
|
{
|
||||||
|
@ -64,12 +64,14 @@ namespace osu.Game.Tests.Visual
|
|||||||
|
|
||||||
protected class ModTestPlayer : TestPlayer
|
protected class ModTestPlayer : TestPlayer
|
||||||
{
|
{
|
||||||
protected override bool AllowFail { get; }
|
private readonly bool allowFail;
|
||||||
|
|
||||||
|
protected override bool CheckModsAllowFailure() => allowFail;
|
||||||
|
|
||||||
public ModTestPlayer(bool allowFail)
|
public ModTestPlayer(bool allowFail)
|
||||||
: base(false, false)
|
: base(false, false)
|
||||||
{
|
{
|
||||||
AllowFail = allowFail;
|
this.allowFail = allowFail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user