repo git: show error when we can't rebase due to locked files
This commit is contained in:
parent
5ff2645be3
commit
4bb41bf9f6
|
@ -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!")) {
|
||||
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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] = "";
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue