summaryrefslogtreecommitdiff
path: root/src/SMAPI.Mods.SaveBackup
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-02-01 16:21:35 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2020-02-01 16:21:35 -0500
commitc8d627cdf2ae3126584ec2500877ff19987db17f (patch)
tree2cc6f604df00027239476acf3a74ae6bb0761323 /src/SMAPI.Mods.SaveBackup
parentf976b5c0f095a881fc20f6ce5dcf5a50ebb2b5da (diff)
parent17a9193fd28c527dcba40360702adb277736cc45 (diff)
downloadSMAPI-c8d627cdf2ae3126584ec2500877ff19987db17f.tar.gz
SMAPI-c8d627cdf2ae3126584ec2500877ff19987db17f.tar.bz2
SMAPI-c8d627cdf2ae3126584ec2500877ff19987db17f.zip
Merge branch 'develop' into stable
Diffstat (limited to 'src/SMAPI.Mods.SaveBackup')
-rw-r--r--src/SMAPI.Mods.SaveBackup/ModEntry.cs52
-rw-r--r--src/SMAPI.Mods.SaveBackup/SMAPI.Mods.SaveBackup.csproj1
-rw-r--r--src/SMAPI.Mods.SaveBackup/manifest.json4
3 files changed, 38 insertions, 19 deletions
diff --git a/src/SMAPI.Mods.SaveBackup/ModEntry.cs b/src/SMAPI.Mods.SaveBackup/ModEntry.cs
index 3b47759b..8b139d8f 100644
--- a/src/SMAPI.Mods.SaveBackup/ModEntry.cs
+++ b/src/SMAPI.Mods.SaveBackup/ModEntry.cs
@@ -68,22 +68,21 @@ namespace StardewModdingAPI.Mods.SaveBackup
if (targetFile.Exists || fallbackDir.Exists)
return;
- // back up saves
- this.Monitor.Log($"Backing up saves to {targetFile.FullName}...", LogLevel.Trace);
- if (!this.TryCompress(Constants.SavesPath, targetFile, out Exception compressError))
+ // copy saves to fallback directory (ignore non-save files/folders)
+ this.Monitor.Log($"Backing up saves to {fallbackDir.FullName}...", LogLevel.Trace);
+ DirectoryInfo savesDir = new DirectoryInfo(Constants.SavesPath);
+ this.RecursiveCopy(savesDir, fallbackDir, entry => this.MatchSaveFolders(savesDir, entry), copyRoot: false);
+
+ // compress backup if possible
+ this.Monitor.Log("Compressing backup if possible...", LogLevel.Trace);
+ if (!this.TryCompress(fallbackDir.FullName, targetFile, out Exception compressError))
{
- // log error (expected on Android due to missing compression DLLs)
- if (Constants.TargetPlatform == GamePlatform.Android)
- this.Monitor.VerboseLog($"Compression isn't supported on Android:\n{compressError}");
- else
- {
- this.Monitor.Log("Couldn't zip the save backup, creating uncompressed backup instead.", LogLevel.Debug);
- this.Monitor.Log(compressError.ToString(), LogLevel.Trace);
- }
-
- // fallback to uncompressed
- this.RecursiveCopy(new DirectoryInfo(Constants.SavesPath), fallbackDir, copyRoot: false);
+ if (Constants.TargetPlatform != GamePlatform.Android) // expected to fail on Android
+ this.Monitor.Log($"Couldn't compress backup, leaving it uncompressed.\n{compressError}", LogLevel.Trace);
}
+ else
+ fallbackDir.Delete(recursive: true);
+
this.Monitor.Log("Backup done!", LogLevel.Trace);
}
catch (Exception ex)
@@ -198,12 +197,16 @@ namespace StardewModdingAPI.Mods.SaveBackup
/// <param name="source">The file or folder to copy.</param>
/// <param name="targetFolder">The folder to copy into.</param>
/// <param name="copyRoot">Whether to copy the root folder itself, or <c>false</c> to only copy its contents.</param>
+ /// <param name="filter">A filter which matches the files or directories to copy, or <c>null</c> to copy everything.</param>
/// <remarks>Derived from the SMAPI installer code.</remarks>
- private void RecursiveCopy(FileSystemInfo source, DirectoryInfo targetFolder, bool copyRoot = true)
+ private void RecursiveCopy(FileSystemInfo source, DirectoryInfo targetFolder, Func<FileSystemInfo, bool> filter, bool copyRoot = true)
{
if (!targetFolder.Exists)
targetFolder.Create();
+ if (filter?.Invoke(source) == false)
+ return;
+
switch (source)
{
case FileInfo sourceFile:
@@ -213,12 +216,29 @@ namespace StardewModdingAPI.Mods.SaveBackup
case DirectoryInfo sourceDir:
DirectoryInfo targetSubfolder = copyRoot ? new DirectoryInfo(Path.Combine(targetFolder.FullName, sourceDir.Name)) : targetFolder;
foreach (var entry in sourceDir.EnumerateFileSystemInfos())
- this.RecursiveCopy(entry, targetSubfolder);
+ this.RecursiveCopy(entry, targetSubfolder, filter);
break;
default:
throw new NotSupportedException($"Unknown filesystem info type '{source.GetType().FullName}'.");
}
}
+
+ /// <summary>A copy filter which matches save folders.</summary>
+ /// <param name="savesFolder">The folder containing save folders.</param>
+ /// <param name="entry">The current entry to check under <paramref name="savesFolder"/>.</param>
+ private bool MatchSaveFolders(DirectoryInfo savesFolder, FileSystemInfo entry)
+ {
+ // only need to filter top-level entries
+ string parentPath = (entry as FileInfo)?.DirectoryName ?? (entry as DirectoryInfo)?.Parent?.FullName;
+ if (parentPath != savesFolder.FullName)
+ return true;
+
+
+ // match folders with Name_ID format
+ return
+ entry is DirectoryInfo
+ && ulong.TryParse(entry.Name.Split('_').Last(), out _);
+ }
}
}
diff --git a/src/SMAPI.Mods.SaveBackup/SMAPI.Mods.SaveBackup.csproj b/src/SMAPI.Mods.SaveBackup/SMAPI.Mods.SaveBackup.csproj
index 2d031408..970ccea8 100644
--- a/src/SMAPI.Mods.SaveBackup/SMAPI.Mods.SaveBackup.csproj
+++ b/src/SMAPI.Mods.SaveBackup/SMAPI.Mods.SaveBackup.csproj
@@ -5,7 +5,6 @@
<RootNamespace>StardewModdingAPI.Mods.SaveBackup</RootNamespace>
<TargetFramework>net45</TargetFramework>
<LangVersion>latest</LangVersion>
- <OutputPath>$(SolutionDir)\..\bin\$(Configuration)\Mods\SaveBackup</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json
index 55af8f35..74256013 100644
--- a/src/SMAPI.Mods.SaveBackup/manifest.json
+++ b/src/SMAPI.Mods.SaveBackup/manifest.json
@@ -1,9 +1,9 @@
{
"Name": "Save Backup",
"Author": "SMAPI",
- "Version": "3.1.0",
+ "Version": "3.2.0",
"Description": "Automatically backs up all your saves once per day into its folder.",
"UniqueID": "SMAPI.SaveBackup",
"EntryDll": "SaveBackup.dll",
- "MinimumApiVersion": "3.1.0"
+ "MinimumApiVersion": "3.2.0"
}