diff --git a/src/NAppUpdate.Framework/Common/Logger.cs b/src/NAppUpdate.Framework/Common/Logger.cs index 24baea61..68257f1c 100644 --- a/src/NAppUpdate.Framework/Common/Logger.cs +++ b/src/NAppUpdate.Framework/Common/Logger.cs @@ -95,6 +95,13 @@ public void Dump(string filePath) filePath = Path.Combine(workingDir ?? string.Empty, @"NauUpdate.log"); } + if (File.Exists(filePath)) + { + var oldBackupFile = SelectBackupLogFileName(filePath); + if (oldBackupFile != null) + File.Move(filePath, oldBackupFile); + } + lock (LogItems) { using (StreamWriter w = File.CreateText(filePath)) @@ -104,5 +111,20 @@ public void Dump(string filePath) } } } + + private string SelectBackupLogFileName(string filePath) + { + var directory = Path.GetDirectoryName(filePath); + if (directory == null) + directory = "."; + for (var i = 0; i < 10; i++) + { + filePath = Path.Combine(directory, "NauUpdate." + i + ".log"); + if(File.Exists(filePath)) + continue; + return filePath; + } + return null; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/BooleanCondition.cs b/src/NAppUpdate.Framework/Conditions/BooleanCondition.cs index 477e4be5..13f80220 100644 --- a/src/NAppUpdate.Framework/Conditions/BooleanCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/BooleanCondition.cs @@ -39,21 +39,21 @@ public static ConditionType ConditionTypeFromString(string type) } #endregion - protected class ConditionItem + public class ConditionItem { public ConditionItem(IUpdateCondition cnd, ConditionType typ) { - this._Condition = cnd; - this._ConditionType = typ; + this.Condition = cnd; + this.ConditionType = typ; } internal bool HasConditionType(ConditionType type) { - return (_ConditionType & type) > 0; + return (ConditionType & type) > 0; } - public readonly IUpdateCondition _Condition; - public readonly ConditionType _ConditionType; + public IUpdateCondition Condition { get; private set; } + public ConditionType ConditionType { get; private set; } } public BooleanCondition() @@ -61,7 +61,7 @@ public BooleanCondition() Attributes = new Dictionary(); } - protected LinkedList ChildConditions { get; set; } + public LinkedList ChildConditions { get; private set; } public int ChildConditionsCount { get { if (ChildConditions != null) return ChildConditions.Count; return 0; } } public void AddCondition(IUpdateCondition cnd) @@ -77,8 +77,8 @@ public void AddCondition(IUpdateCondition cnd, ConditionType type) public IUpdateCondition Degrade() { - if (ChildConditionsCount == 1 && (ChildConditions.First.Value._ConditionType & ConditionType.NOT) == 0) - return ChildConditions.First.Value._Condition; + if (ChildConditionsCount == 1 && (ChildConditions.First.Value.ConditionType & ConditionType.NOT) == 0) + return ChildConditions.First.Value.Condition; return this; } @@ -110,13 +110,13 @@ public bool IsMet(Tasks.IUpdateTask task) { if (item.HasConditionType(ConditionType.OR)) { - var checkResult = item._Condition.IsMet(task); + var checkResult = item.Condition.IsMet(task); passed = item.HasConditionType(ConditionType.NOT) ? !checkResult : checkResult; } } else { - var checkResult = item._Condition.IsMet(task); + var checkResult = item.Condition.IsMet(task); passed = item.HasConditionType(ConditionType.NOT) ? !checkResult : checkResult; } } diff --git a/src/NAppUpdate.Framework/Conditions/FileChecksumCondition.cs b/src/NAppUpdate.Framework/Conditions/FileChecksumCondition.cs index 7311ef23..ff8079ed 100644 --- a/src/NAppUpdate.Framework/Conditions/FileChecksumCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/FileChecksumCondition.cs @@ -43,5 +43,10 @@ public bool IsMet(IUpdateTask task) return false; } + + public override string ToString() + { + return "Checksum [" + ChecksumType + "] equals " + Checksum; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/FileDateCondition.cs b/src/NAppUpdate.Framework/Conditions/FileDateCondition.cs index de3394ec..67423cd2 100644 --- a/src/NAppUpdate.Framework/Conditions/FileDateCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/FileDateCondition.cs @@ -62,5 +62,10 @@ public bool IsMet(Tasks.IUpdateTask task) } return result; } + + public override string ToString() + { + return "Timestamp " + ComparisonType + " " + Timestamp; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/FileExistsCondition.cs b/src/NAppUpdate.Framework/Conditions/FileExistsCondition.cs index 27932023..78ca0607 100644 --- a/src/NAppUpdate.Framework/Conditions/FileExistsCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/FileExistsCondition.cs @@ -24,5 +24,10 @@ public bool IsMet(Tasks.IUpdateTask task) return File.Exists(localPath); } + + public override string ToString() + { + return "File exists"; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/FileSizeCondition.cs b/src/NAppUpdate.Framework/Conditions/FileSizeCondition.cs index 6b43837d..aece94f9 100644 --- a/src/NAppUpdate.Framework/Conditions/FileSizeCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/FileSizeCondition.cs @@ -47,5 +47,10 @@ public bool IsMet(Tasks.IUpdateTask task) } return FileSize > localFileSize; } + + public override string ToString() + { + return "FileSize " + ComparisonType + " " + FileSize; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/FileVersionCondition.cs b/src/NAppUpdate.Framework/Conditions/FileVersionCondition.cs index b33a74ff..b84ed104 100644 --- a/src/NAppUpdate.Framework/Conditions/FileVersionCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/FileVersionCondition.cs @@ -50,5 +50,10 @@ public bool IsMet(Tasks.IUpdateTask task) return updateVersion > localVersion; } } + + public override string ToString() + { + return "Version " + ComparisonType + " " + Version; + } } } diff --git a/src/NAppUpdate.Framework/Conditions/OSCondition.cs b/src/NAppUpdate.Framework/Conditions/OSCondition.cs index ba3eb491..76fdbbc1 100644 --- a/src/NAppUpdate.Framework/Conditions/OSCondition.cs +++ b/src/NAppUpdate.Framework/Conditions/OSCondition.cs @@ -93,5 +93,10 @@ static extern IntPtr GetProcAddress(IntPtr hModule, static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process); #endregion + + public override string ToString() + { + return "OS bitness is " + OsBits; + } } } diff --git a/src/NAppUpdate.Framework/Resources.Designer.cs b/src/NAppUpdate.Framework/Resources.Designer.cs index 062e58c8..a7769419 100644 --- a/src/NAppUpdate.Framework/Resources.Designer.cs +++ b/src/NAppUpdate.Framework/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.17379 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -19,7 +19,7 @@ namespace NAppUpdate.Framework { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -60,6 +60,9 @@ internal Resources() { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// internal static byte[] updater { get { object obj = ResourceManager.GetObject("updater", resourceCulture); diff --git a/src/NAppUpdate.Framework/Resources.resx b/src/NAppUpdate.Framework/Resources.resx index 9e5ab300..3db624e1 100644 --- a/src/NAppUpdate.Framework/Resources.resx +++ b/src/NAppUpdate.Framework/Resources.resx @@ -112,13 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + - Updater\updater.exe;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + updater\updater.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs b/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs index 3830f2bf..ba1a85e1 100644 --- a/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs +++ b/src/NAppUpdate.Framework/Tasks/FileUpdateTask.cs @@ -159,6 +159,7 @@ public override bool Rollback() return true; } + /// /// To mitigate problems with the files being locked even though the application mutex has been released. /// https://github.com/synhershko/NAppUpdate/issues/35 @@ -176,5 +177,11 @@ private void FileLockWait() } } } + + public override string ToString() + { + var ret = base.ToString(); + return string.IsNullOrWhiteSpace(ret) ? LocalPath : ret; + } } } diff --git a/src/NAppUpdate.Framework/Tasks/RegistryTask.cs b/src/NAppUpdate.Framework/Tasks/RegistryTask.cs index 2bbfbae6..13067355 100644 --- a/src/NAppUpdate.Framework/Tasks/RegistryTask.cs +++ b/src/NAppUpdate.Framework/Tasks/RegistryTask.cs @@ -78,5 +78,11 @@ public override bool Rollback() Registry.SetValue(KeyName, KeyValueName, _originalValue); return true; } + + public override string ToString() + { + var ret = base.ToString(); + return string.IsNullOrWhiteSpace(ret) ? KeyName + @"\" + KeyValueName : ret; + } } } diff --git a/src/NAppUpdate.Framework/Tasks/UpdateTaskBase.cs b/src/NAppUpdate.Framework/Tasks/UpdateTaskBase.cs index a2d15d14..6627ad85 100644 --- a/src/NAppUpdate.Framework/Tasks/UpdateTaskBase.cs +++ b/src/NAppUpdate.Framework/Tasks/UpdateTaskBase.cs @@ -31,5 +31,10 @@ public virtual void OnProgress(UpdateProgressInfo pi) public abstract void Prepare(IUpdateSource source); public abstract TaskExecutionStatus Execute(bool coldRun); public abstract bool Rollback(); + + public override string ToString() + { + return Description; + } } } diff --git a/src/NAppUpdate.Framework/UpdateManager.cs b/src/NAppUpdate.Framework/UpdateManager.cs index 36ffbd19..af7e5966 100644 --- a/src/NAppUpdate.Framework/UpdateManager.cs +++ b/src/NAppUpdate.Framework/UpdateManager.cs @@ -101,7 +101,7 @@ private void TaskProgressCallback(UpdateProgressInfo currentStatus, IUpdateTask { if (ReportProgress == null) return; - currentStatus.TaskDescription = task.Description; + currentStatus.TaskDescription = task.ToString(); currentStatus.TaskId = UpdatesToApply.IndexOf(task) + 1; //This was an assumed int, which meant we never reached 100% with an odd number of tasks @@ -247,7 +247,7 @@ public void PrepareUpdates() { task.ExecutionStatus = TaskExecutionStatus.FailedToPrepare; Logger.Log(ex); - throw new UpdateProcessFailedException("Failed to prepare task: " + task.Description, ex); + throw new UpdateProcessFailedException("Failed to prepare task: " + task, ex); } task.ExecutionStatus = TaskExecutionStatus.Prepared; @@ -411,7 +411,7 @@ public void ApplyUpdates(bool relaunchApplication, bool updaterDoLogging, bool u catch (Exception ex) { task.ExecutionStatus = TaskExecutionStatus.Failed; // mark the failing task before rethrowing - throw new UpdateProcessFailedException("Update task execution failed: " + task.Description, ex); + throw new UpdateProcessFailedException("Update task execution failed: " + task, ex); } if (task.ExecutionStatus == TaskExecutionStatus.RequiresAppRestart @@ -426,7 +426,7 @@ public void ApplyUpdates(bool relaunchApplication, bool updaterDoLogging, bool u // We are being quite explicit here - only Successful return values are considered // to be Ok (cold updates are already handled above) if (task.ExecutionStatus != TaskExecutionStatus.Successful) - throw new UpdateProcessFailedException("Update task execution failed: " + task.Description); + throw new UpdateProcessFailedException("Update task execution failed: " + task); } // If an application restart is required @@ -591,4 +591,4 @@ private bool IsAfterRestart() return false; } } -} \ No newline at end of file +} diff --git a/src/NAppUpdate.Framework/Updater/updater.exe b/src/NAppUpdate.Framework/Updater/updater.exe index 94c4caa2..f7023290 100644 Binary files a/src/NAppUpdate.Framework/Updater/updater.exe and b/src/NAppUpdate.Framework/Updater/updater.exe differ diff --git a/src/NAppUpdate.Tests/Integration/SimpleWebSourceTests.cs b/src/NAppUpdate.Tests/Integration/SimpleWebSourceTests.cs index 8f66a929..90c832b7 100644 --- a/src/NAppUpdate.Tests/Integration/SimpleWebSourceTests.cs +++ b/src/NAppUpdate.Tests/Integration/SimpleWebSourceTests.cs @@ -9,6 +9,7 @@ public class SimpleWebSourceTests [TestMethod] public void can_download_ansi_feed() { + Assert.Inconclusive("This url contains wrong data"); const string expected = "NHibernate.Profiler-Build-"; var ws = new SimpleWebSource("http://builds.hibernatingrhinos.com/latest/nhprof"); diff --git a/src/NAppUpdate.Updater/AppStart.cs b/src/NAppUpdate.Updater/AppStart.cs index 825206db..bd062cc7 100644 --- a/src/NAppUpdate.Updater/AppStart.cs +++ b/src/NAppUpdate.Updater/AppStart.cs @@ -131,7 +131,8 @@ private static void PerformUpdates() } } - _logger.LogItems.InsertRange(0, _dto.LogItems); + if(_dto.LogItems != null) + _logger.LogItems.InsertRange(0, _dto.LogItems); _dto.LogItems = _logger.LogItems; // Get some required environment variables @@ -157,7 +158,7 @@ private static void PerformUpdates() // Perform the actual off-line update process foreach (var t in _dto.Tasks) { - Log("Task \"{0}\": {1}", t.Description, t.ExecutionStatus); + Log("Task \"{0}\": {1}", t.ToString(), t.ExecutionStatus); if (t.ExecutionStatus != TaskExecutionStatus.RequiresAppRestart && t.ExecutionStatus != TaskExecutionStatus.RequiresPrivilegedAppRestart) { @@ -180,7 +181,7 @@ private static void PerformUpdates() if (t.ExecutionStatus != TaskExecutionStatus.Successful) { - string taskFailedMessage = string.Format("Update failed, task execution failed, description: {0}, execution status: {1}", t.Description, t.ExecutionStatus); + string taskFailedMessage = string.Format("Update failed, task execution failed, description: {0}, execution status: {1}", t, t.ExecutionStatus); throw new Exception(taskFailedMessage, exception); } }