diff --git a/IllusionInjector/Updating/Backup/BackupUnit.cs b/IllusionInjector/Updating/Backup/BackupUnit.cs new file mode 100644 index 00000000..32f78eff --- /dev/null +++ b/IllusionInjector/Updating/Backup/BackupUnit.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using System.Linq; +using System.Text; + +namespace IllusionInjector.Updating.Backup +{ + /// + /// A unit for backup. WIP. + /// + internal class BackupUnit + { + public string Name { get; private set; } + + private DirectoryInfo _BackupPath; + private List _Files = new List(); + + + + public BackupUnit(string backupPath) : this(backupPath, DateTime.Now.ToString("yyyy-MM-dd_h-mm-ss")) + { + } + + public BackupUnit(string backupPath, string name) + { + Name = name; + _BackupPath = new DirectoryInfo(Path.Combine(backupPath, Name)); + } + + public static BackupUnit FromDirectory(DirectoryInfo directory, string backupPath) + { + var unit = new BackupUnit(backupPath, directory.Name); + + // Parse directory + foreach(var file in directory.GetFiles("*", SearchOption.AllDirectories)) { + var relativePath = file.FullName.Substring(directory.FullName.Length + 1); + unit._Files.Add(relativePath); + } + + return unit; + } + + public void Add(string file) + { + Add(new FileInfo(file)); + } + + internal void Delete() + { + _BackupPath.Delete(true); + } + + /// + /// Adds a file to the list of changed files and backups it. + /// + /// + public void Add(FileInfo file) + { + /*if(!file.FullName.StartsWith(_Context.ProjectRoot)) + { + Console.Error.WriteLine("Invalid file path for backup! {0}", file); + return; + }*/ + + var relativePath = new Uri(Environment.CurrentDirectory, UriKind.Absolute).MakeRelativeUri(new Uri(file.FullName)).ToString();//file.FullName.Substring(_Context.ProjectRoot.Length + 1); + var backupPath = new FileInfo(Path.Combine(_BackupPath.FullName, relativePath)); + + if(_Files.Contains(relativePath)) + { + Console.WriteLine("Skipping backup of {0}", relativePath); + return; + } + + + // Copy over + backupPath.Directory.Create(); + if (file.Exists) + { + file.CopyTo(backupPath.FullName); + } else + { + // Make empty file + backupPath.Create().Close(); + } + + // Add to list + _Files.Add(relativePath); + } + + /// + /// Reverts the changes made in this unit. + /// + public void Restore() + { + foreach(var relativePath in _Files) + { + Console.WriteLine("Restoring {0}", relativePath); + // Original version + var backupFile = new FileInfo(Path.Combine(_BackupPath.FullName, relativePath)); + var target = new FileInfo(Path.Combine(Environment.CurrentDirectory, relativePath)); + + if (backupFile.Exists) + { + if (backupFile.Length > 0) + { + Console.WriteLine(" {0} => {1}", backupFile.FullName, target.FullName); + target.Directory.Create(); + backupFile.CopyTo(target.FullName, true); + } else + { + Console.WriteLine(" x {0}", target.FullName); + if(target.Exists) + { + target.Delete(); + } + } + } else { + Console.Error.WriteLine("Backup not found!"); + } + } + } + + } +}