repo git: show error when we can't rebase due to locked files
This commit is contained in:
parent
0b985f4307
commit
7c71c3d67f
|
@ -354,10 +354,13 @@ namespace SparkleLib.Git {
|
||||||
UpdateSizes ();
|
UpdateSizes ();
|
||||||
|
|
||||||
if (git.ExitCode == 0) {
|
if (git.ExitCode == 0) {
|
||||||
Rebase ();
|
if (Rebase ()) {
|
||||||
ClearCache ();
|
ClearCache ();
|
||||||
|
return true;
|
||||||
return true;
|
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Error = ErrorStatus.HostUnreachable;
|
Error = ErrorStatus.HostUnreachable;
|
||||||
|
@ -428,7 +431,7 @@ namespace SparkleLib.Git {
|
||||||
|
|
||||||
|
|
||||||
// Merges the fetched changes
|
// Merges the fetched changes
|
||||||
private void Rebase ()
|
private bool Rebase ()
|
||||||
{
|
{
|
||||||
if (HasLocalChanges) {
|
if (HasLocalChanges) {
|
||||||
Add ();
|
Add ();
|
||||||
|
@ -448,15 +451,22 @@ namespace SparkleLib.Git {
|
||||||
string error_output = git.StartAndReadStandardError ();
|
string error_output = git.StartAndReadStandardError ();
|
||||||
|
|
||||||
if (git.ExitCode != 0) {
|
if (git.ExitCode != 0) {
|
||||||
SparkleLogger.LogInfo ("Git", Name + " | Conflict detected, trying to get out...");
|
|
||||||
|
|
||||||
// error: cannot stat 'filename': Permission denied
|
// error: cannot stat 'filename': Permission denied
|
||||||
if (SparkleBackend.Platform != PlatformID.Unix &&
|
if (error_output.Contains ("error: cannot stat")) {
|
||||||
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) {
|
while (HasLocalChanges) {
|
||||||
try {
|
try {
|
||||||
ResolveConflict ();
|
ResolveConflict ();
|
||||||
|
@ -472,6 +482,8 @@ namespace SparkleLib.Git {
|
||||||
|
|
||||||
git = new SparkleGit (LocalPath, "config core.ignorecase false");
|
git = new SparkleGit (LocalPath, "config core.ignorecase false");
|
||||||
git.StartAndWaitForExit ();
|
git.StartAndWaitForExit ();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -643,7 +655,7 @@ namespace SparkleLib.Git {
|
||||||
private bool FindError (string line)
|
private bool FindError (string line)
|
||||||
{
|
{
|
||||||
Error = ErrorStatus.None;
|
Error = ErrorStatus.None;
|
||||||
|
|
||||||
if (line.StartsWith ("WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!") ||
|
if (line.StartsWith ("WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!") ||
|
||||||
line.StartsWith ("WARNING: POSSIBLE DNS SPOOFING DETECTED!")) {
|
line.StartsWith ("WARNING: POSSIBLE DNS SPOOFING DETECTED!")) {
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ namespace SparkleLib {
|
||||||
HostUnreachable,
|
HostUnreachable,
|
||||||
HostIdentityChanged,
|
HostIdentityChanged,
|
||||||
AuthenticationFailed,
|
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 ()
|
protected void OnConflictResolved ()
|
||||||
{
|
{
|
||||||
ConflictResolved ();
|
ConflictResolved ();
|
||||||
|
|
|
@ -165,20 +165,22 @@ namespace SparkleShare {
|
||||||
Gdk.Pixbuf folder_icon;
|
Gdk.Pixbuf folder_icon;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty (Controller.FolderErrors [i])) {
|
if (!string.IsNullOrEmpty (Controller.FolderErrors [i])) {
|
||||||
folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16,
|
folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16, IconLookupFlags.GenericFallback);
|
||||||
IconLookupFlags.GenericFallback);
|
|
||||||
|
|
||||||
item.Submenu = new Menu ();
|
item.Submenu = new Menu ();
|
||||||
|
|
||||||
MenuItem error_item = new MenuItem (Controller.FolderErrors [i]) {
|
MenuItem error_item = new MenuItem (Controller.FolderErrors [i]) {
|
||||||
Sensitive = false
|
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 (error_item);
|
||||||
|
(item.Submenu as Menu).Add (new SeparatorMenuItem ();
|
||||||
|
(item.Submenu as Menu).Add (try_again_item);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
folder_icon = IconTheme.Default.LoadIcon ("folder", 16,
|
folder_icon = IconTheme.Default.LoadIcon ("folder", 16, IconLookupFlags.GenericFallback);
|
||||||
IconLookupFlags.GenericFallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
item.Image = new Image (folder_icon);
|
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)
|
private EventHandler OpenFolderDelegate (string name)
|
||||||
{
|
{
|
||||||
return delegate {
|
return delegate {
|
||||||
Controller.SubfolderClicked (name);
|
Controller.SubfolderClicked (name);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private EventHandler TryAgainDelegate (string name)
|
||||||
|
{
|
||||||
|
return delegate {
|
||||||
|
Controller.TryAgainClicked (name);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !HAVE_APP_INDICATOR
|
#if !HAVE_APP_INDICATOR
|
||||||
|
|
|
@ -57,8 +57,9 @@ namespace SparkleShare {
|
||||||
private NSImage folder_image;
|
private NSImage folder_image;
|
||||||
private NSImage caution_image;
|
private NSImage caution_image;
|
||||||
private NSImage sparkleshare_image;
|
private NSImage sparkleshare_image;
|
||||||
|
|
||||||
private EventHandler [] folder_tasks;
|
private EventHandler [] folder_tasks;
|
||||||
|
private EventHandler [] try_again_tasks;
|
||||||
|
|
||||||
|
|
||||||
public SparkleStatusIcon () : base ()
|
public SparkleStatusIcon () : base ()
|
||||||
|
@ -229,8 +230,9 @@ namespace SparkleShare {
|
||||||
this.folder_menu_items = new NSMenuItem [Controller.Folders.Length];
|
this.folder_menu_items = new NSMenuItem [Controller.Folders.Length];
|
||||||
|
|
||||||
if (Controller.Folders.Length > 0) {
|
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;
|
int i = 0;
|
||||||
foreach (string folder_name in Controller.Folders) {
|
foreach (string folder_name in Controller.Folders) {
|
||||||
NSMenuItem item = new NSMenuItem ();
|
NSMenuItem item = new NSMenuItem ();
|
||||||
|
@ -244,8 +246,17 @@ namespace SparkleShare {
|
||||||
Title = Controller.FolderErrors [i]
|
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 (error_item);
|
||||||
|
item.Submenu.AddItem (NSMenuItem.SeparatorItem);
|
||||||
|
item.Submenu.AddItem (try_again_item);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
item.Image = this.folder_image;
|
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)
|
private EventHandler OpenFolderDelegate (string name)
|
||||||
{
|
{
|
||||||
return delegate {
|
return delegate {
|
||||||
Controller.SubfolderClicked (name);
|
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 ()
|
public void AddHostedProjectClicked ()
|
||||||
{
|
{
|
||||||
new Thread (() => Program.Controller.ShowSetupWindow (PageType.Add)).Start ();
|
new Thread (() => Program.Controller.ShowSetupWindow (PageType.Add)).Start ();
|
||||||
|
@ -228,16 +237,19 @@ namespace SparkleShare {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
foreach (SparkleRepoBase repo in Program.Controller.Repositories) {
|
||||||
if (repo.Error == ErrorStatus.HostUnreachable) {
|
if (repo.Error == ErrorStatus.HostUnreachable) {
|
||||||
FolderErrors [i] = "Host unreachable";
|
FolderErrors [i] = "Can't reach the host";
|
||||||
|
|
||||||
} else if (repo.Error == ErrorStatus.HostIdentityChanged) {
|
} 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) {
|
} else if (repo.Error == ErrorStatus.AuthenticationFailed) {
|
||||||
FolderErrors [i] = "Authentication failed";
|
FolderErrors [i] = "Authentication failed";
|
||||||
|
|
||||||
} else if (repo.Error == ErrorStatus.DiskSpaceExcedeed) {
|
} 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 {
|
} else {
|
||||||
FolderErrors [i] = "";
|
FolderErrors [i] = "";
|
||||||
|
|
|
@ -226,8 +226,16 @@ namespace SparkleShare {
|
||||||
Header = Controller.FolderErrors [i],
|
Header = Controller.FolderErrors [i],
|
||||||
IsEnabled = false
|
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 (error_item);
|
||||||
|
subfolder_item.Items.Add (new Separator ());
|
||||||
|
subfolder_item.Items.Add (try_again_item);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
subfolder_item.Icon = subfolder_image;
|
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)
|
private RoutedEventHandler OpenFolderDelegate (string folder_name)
|
||||||
{
|
{
|
||||||
return delegate {
|
return delegate {
|
||||||
Controller.SubfolderClicked (folder_name);
|
Controller.SubfolderClicked (folder_name);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private EventHandler TryAgainDelegate (string name)
|
||||||
|
{
|
||||||
|
return delegate {
|
||||||
|
Controller.TryAgainClicked (name);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue