diff --git a/SparkleLib/Git/SparkleRepoGit.cs b/SparkleLib/Git/SparkleRepoGit.cs index d4e1600f..40ca21b8 100644 --- a/SparkleLib/Git/SparkleRepoGit.cs +++ b/SparkleLib/Git/SparkleRepoGit.cs @@ -1061,41 +1061,39 @@ namespace SparkleLib.Git { // Recursively gets a folder's size in bytes - private double CalculateSizes (DirectoryInfo parent) + private long CalculateSizes (DirectoryInfo parent) { - if (!Directory.Exists (parent.FullName) || parent.Name.Equals ("rebase-apply")) - return 0; - - double size = 0; - - try { - foreach (FileInfo file in parent.GetFiles ()) { - if (!file.Exists) - return 0; - - if (file.Name.Equals (".empty")) - File.SetAttributes (file.FullName, FileAttributes.Hidden); - - size += file.Length; - } - - } catch (Exception e) { - SparkleLogger.LogInfo ("Local", "Error calculating size", e); - return 0; - } - + long size = 0; try { foreach (DirectoryInfo directory in parent.GetDirectories ()) { - // Do not include LocalPath/.git file if it is a subdirectory - // This will not affect calling CalculateSizes on /.git directly - if (directory.FullName != Path.Combine (LocalPath, ".git")) - size += CalculateSizes (directory); + if (directory.IsSymlink () || + directory.Name.Equals (".git") || + directory.Name.Equals ("rebase-apply")) { + + continue; + } + + size += CalculateSizes (directory); } } catch (Exception e) { - SparkleLogger.LogInfo ("Local", "Error calculating size", e); - return 0; + SparkleLogger.LogInfo ("Local", "Error calculating directory size", e); + } + + try { + foreach (FileInfo file in parent.GetFiles ()) { + if (file.IsSymlink ()) + continue; + + if (file.Name.Equals (".empty")) + File.SetAttributes (file.FullName, FileAttributes.Hidden); + else + size += file.Length; + } + + } catch (Exception e) { + SparkleLogger.LogInfo ("Local", "Error calculating file size", e); } return size; diff --git a/SparkleLib/SparkleExtensions.cs b/SparkleLib/SparkleExtensions.cs index fb39aa75..ef6dd972 100755 --- a/SparkleLib/SparkleExtensions.cs +++ b/SparkleLib/SparkleExtensions.cs @@ -70,5 +70,11 @@ namespace SparkleLib { else return byte_count.ToString () + " ʙ"; } + + + public static bool IsSymlink (this FileSystemInfo file) + { + return ((file.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint); + } } } diff --git a/SparkleLib/SparkleRepoBase.cs b/SparkleLib/SparkleRepoBase.cs index a7b9109d..0a5a2061 100755 --- a/SparkleLib/SparkleRepoBase.cs +++ b/SparkleLib/SparkleRepoBase.cs @@ -501,29 +501,22 @@ namespace SparkleLib { // Recursively gets a folder's size in bytes - private double CalculateSize (DirectoryInfo parent) + private long CalculateSize (DirectoryInfo parent) { - if (!Directory.Exists (parent.ToString ())) - return 0; - - double size = 0; - if (ExcludePaths.Contains (parent.Name)) return 0; + long size = 0; + try { - foreach (FileInfo file in parent.GetFiles ()) { - if (!file.Exists) - return 0; - - size += file.Length; - } - foreach (DirectoryInfo directory in parent.GetDirectories ()) size += CalculateSize (directory); - } catch (Exception) { - return 0; + foreach (FileInfo file in parent.GetFiles ()) + size += file.Length; + + } catch (Exception e) { + SparkleLogger.LogInfo ("Local", "Error calculating directory size", e); } return size;