repo: refactor size calculation, ignore symlinks. fixes #1149

This commit is contained in:
Hylke Bons 2013-01-11 19:58:14 +01:00
parent afd7b76866
commit 7d7cddc680
3 changed files with 40 additions and 43 deletions

View file

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

View file

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

View file

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