From 7c71c3d67ffff4a471a87de10c8ecb062d5e3aa0 Mon Sep 17 00:00:00 2001 From: Hylke Bons Date: Sat, 17 Nov 2012 19:03:37 +0000 Subject: [PATCH] repo git: show error when we can't rebase due to locked files --- SparkleLib/Git/SparkleRepoGit.cs | 34 ++++++++++++++------- SparkleLib/SparkleRepoBase.cs | 15 ++++++++- SparkleShare/Linux/SparkleStatusIcon.cs | 22 ++++++++----- SparkleShare/Mac/SparkleStatusIcon.cs | 29 ++++++++++++++---- SparkleShare/SparkleStatusIconController.cs | 18 +++++++++-- SparkleShare/Windows/SparkleStatusIcon.cs | 18 +++++++++-- 6 files changed, 106 insertions(+), 30 deletions(-) diff --git a/SparkleLib/Git/SparkleRepoGit.cs b/SparkleLib/Git/SparkleRepoGit.cs index 82e7cc5a..9b4b8185 100644 --- a/SparkleLib/Git/SparkleRepoGit.cs +++ b/SparkleLib/Git/SparkleRepoGit.cs @@ -354,10 +354,13 @@ namespace SparkleLib.Git { UpdateSizes (); if (git.ExitCode == 0) { - Rebase (); - ClearCache (); - - return true; + if (Rebase ()) { + ClearCache (); + return true; + + } else { + return false; + } } else { Error = ErrorStatus.HostUnreachable; @@ -428,7 +431,7 @@ namespace SparkleLib.Git { // Merges the fetched changes - private void Rebase () + private bool Rebase () { if (HasLocalChanges) { Add (); @@ -448,15 +451,22 @@ namespace SparkleLib.Git { string error_output = git.StartAndReadStandardError (); if (git.ExitCode != 0) { - SparkleLogger.LogInfo ("Git", Name + " | Conflict detected, trying to get out..."); - // error: cannot stat 'filename': Permission denied - if (SparkleBackend.Platform != PlatformID.Unix && - error_output.Contains ("error: cannot stat")) { + if (error_output.Contains ("error: cannot stat")) { + Error = ErrorStatus.LockedFiles; + SparkleLogger.LogInfo ("Git", Name + " | Error status changed to " + Error); - // TODO + git = new SparkleGit (LocalPath, "rebase --abort"); + git.StartAndWaitForExit (); + + git = new SparkleGit (LocalPath, "config core.ignorecase false"); + git.StartAndWaitForExit (); + + return false; } + SparkleLogger.LogInfo ("Git", Name + " | Conflict detected, trying to get out..."); + while (HasLocalChanges) { try { ResolveConflict (); @@ -472,6 +482,8 @@ namespace SparkleLib.Git { git = new SparkleGit (LocalPath, "config core.ignorecase false"); git.StartAndWaitForExit (); + + return true; } @@ -643,7 +655,7 @@ namespace SparkleLib.Git { private bool FindError (string line) { Error = ErrorStatus.None; - + if (line.StartsWith ("WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!") || line.StartsWith ("WARNING: POSSIBLE DNS SPOOFING DETECTED!")) { diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index 75d20faa..d5075a89 100755 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -37,7 +37,8 @@ namespace SparkleLib { HostUnreachable, HostIdentityChanged, AuthenticationFailed, - DiskSpaceExcedeed + DiskSpaceExcedeed, + LockedFiles } @@ -278,6 +279,18 @@ namespace SparkleLib { } + public void ForceRetry () + { + if (Error == ErrorStatus.None) + return; + + if (Error == ErrorStatus.LockedFiles) + SyncDownBase (); + else + SyncUpBase (); + } + + protected void OnConflictResolved () { ConflictResolved (); diff --git a/SparkleShare/Linux/SparkleStatusIcon.cs b/SparkleShare/Linux/SparkleStatusIcon.cs index 76216364..e25485c4 100644 --- a/SparkleShare/Linux/SparkleStatusIcon.cs +++ b/SparkleShare/Linux/SparkleStatusIcon.cs @@ -165,20 +165,22 @@ namespace SparkleShare { Gdk.Pixbuf folder_icon; if (!string.IsNullOrEmpty (Controller.FolderErrors [i])) { - folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16, - IconLookupFlags.GenericFallback); - + folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16, IconLookupFlags.GenericFallback); item.Submenu = new Menu (); MenuItem error_item = new MenuItem (Controller.FolderErrors [i]) { Sensitive = false }; + MenuItem try_again_item = new MenuItem ("Try Again"); + try_again_item.Activated += TryAgainDelegate (folder_name); + (item.Submenu as Menu).Add (error_item); + (item.Submenu as Menu).Add (new SeparatorMenuItem (); + (item.Submenu as Menu).Add (try_again_item); } else { - folder_icon = IconTheme.Default.LoadIcon ("folder", 16, - IconLookupFlags.GenericFallback); + folder_icon = IconTheme.Default.LoadIcon ("folder", 16, IconLookupFlags.GenericFallback); } item.Image = new Image (folder_icon); @@ -263,14 +265,20 @@ namespace SparkleShare { } - // A method reference that makes sure that opening the - // event log for each repository works correctly private EventHandler OpenFolderDelegate (string name) { return delegate { Controller.SubfolderClicked (name); }; } + + + private EventHandler TryAgainDelegate (string name) + { + return delegate { + Controller.TryAgainClicked (name); + }; + } #if !HAVE_APP_INDICATOR diff --git a/SparkleShare/Mac/SparkleStatusIcon.cs b/SparkleShare/Mac/SparkleStatusIcon.cs index 0da09d57..9cf4dd8c 100755 --- a/SparkleShare/Mac/SparkleStatusIcon.cs +++ b/SparkleShare/Mac/SparkleStatusIcon.cs @@ -57,8 +57,9 @@ namespace SparkleShare { private NSImage folder_image; private NSImage caution_image; private NSImage sparkleshare_image; - + private EventHandler [] folder_tasks; + private EventHandler [] try_again_tasks; public SparkleStatusIcon () : base () @@ -229,8 +230,9 @@ namespace SparkleShare { this.folder_menu_items = new NSMenuItem [Controller.Folders.Length]; if (Controller.Folders.Length > 0) { - this.folder_tasks = new EventHandler [Controller.Folders.Length]; - + this.folder_tasks = new EventHandler [Controller.Folders.Length]; + this.try_again_tasks = new EventHandler [Controller.Folders.Length]; + int i = 0; foreach (string folder_name in Controller.Folders) { NSMenuItem item = new NSMenuItem (); @@ -244,8 +246,17 @@ namespace SparkleShare { Title = Controller.FolderErrors [i] }; + NSMenuItem try_again_item = new NSMenuItem () { + Title = "Try Again" + }; + + this.try_again_tasks [i] = TryAgainDelegate (folder_name); + try_again_item.Activated += this.try_again_tasks [i]; + item.Submenu.AddItem (error_item); - + item.Submenu.AddItem (NSMenuItem.SeparatorItem); + item.Submenu.AddItem (try_again_item); + } else { item.Image = this.folder_image; } @@ -278,14 +289,20 @@ namespace SparkleShare { } - // A method reference that makes sure that opening the - // event log for each repository works correctly private EventHandler OpenFolderDelegate (string name) { return delegate { Controller.SubfolderClicked (name); }; } + + + private EventHandler TryAgainDelegate (string name) + { + return delegate { + Controller.TryAgainClicked (name); + }; + } } diff --git a/SparkleShare/SparkleStatusIconController.cs b/SparkleShare/SparkleStatusIconController.cs index d4c12e66..da31b8b3 100755 --- a/SparkleShare/SparkleStatusIconController.cs +++ b/SparkleShare/SparkleStatusIconController.cs @@ -190,6 +190,15 @@ namespace SparkleShare { } + public void TryAgainClicked (string subfolder) + { + foreach (SparkleRepoBase repo in Program.Controller.Repositories) { + if (repo.Name.Equals (subfolder)) + repo.ForceRetry (); + } + } + + public void AddHostedProjectClicked () { new Thread (() => Program.Controller.ShowSetupWindow (PageType.Add)).Start (); @@ -228,16 +237,19 @@ namespace SparkleShare { int i = 0; foreach (SparkleRepoBase repo in Program.Controller.Repositories) { if (repo.Error == ErrorStatus.HostUnreachable) { - FolderErrors [i] = "Host unreachable"; + FolderErrors [i] = "Can't reach the host"; } else if (repo.Error == ErrorStatus.HostIdentityChanged) { - FolderErrors [i] = "Host identity changed"; + FolderErrors [i] = "The host's identity has changed"; } else if (repo.Error == ErrorStatus.AuthenticationFailed) { FolderErrors [i] = "Authentication failed"; } else if (repo.Error == ErrorStatus.DiskSpaceExcedeed) { - FolderErrors [i] = "Out of disk space"; + FolderErrors [i] = "Host is out of disk space"; + + } else if (repo.Error == ErrorStatus.LockedFiles) { + FolderErrors [i] = "Some local files are locked or in use"; } else { FolderErrors [i] = ""; diff --git a/SparkleShare/Windows/SparkleStatusIcon.cs b/SparkleShare/Windows/SparkleStatusIcon.cs index 14e9fb10..39e59c7b 100644 --- a/SparkleShare/Windows/SparkleStatusIcon.cs +++ b/SparkleShare/Windows/SparkleStatusIcon.cs @@ -226,8 +226,16 @@ namespace SparkleShare { Header = Controller.FolderErrors [i], IsEnabled = false }; + + SparkleMenuItem try_again_item = new SparkleMenuItem () { + Header = "Try again" + }; + + try_again_item.Click += TryAgainDelegate (folder_name); subfolder_item.Items.Add (error_item); + subfolder_item.Items.Add (new Separator ()); + subfolder_item.Items.Add (try_again_item); } else { subfolder_item.Icon = subfolder_image; @@ -265,14 +273,20 @@ namespace SparkleShare { } - // A method reference that makes sure that opening the - // event log for each repository works correctly private RoutedEventHandler OpenFolderDelegate (string folder_name) { return delegate { Controller.SubfolderClicked (folder_name); }; } + + + private EventHandler TryAgainDelegate (string name) + { + return delegate { + Controller.TryAgainClicked (name); + }; + } }