repo git: show error when we can't rebase due to locked files

This commit is contained in:
Hylke Bons 2012-11-17 19:03:37 +00:00
parent 0b985f4307
commit 7c71c3d67f
6 changed files with 106 additions and 30 deletions

View file

@ -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!")) {

View file

@ -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 ();

View file

@ -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

View file

@ -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);
};
}
}

View file

@ -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] = "";

View file

@ -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);
};
}
}