Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2sharp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius Ungureanu <marius.ungureanu@xamarin.com>2014-11-07 16:26:16 +0300
committerMarius Ungureanu <marius.ungureanu@xamarin.com>2015-04-07 16:03:15 +0300
commit11da2fa1b9e79bb87a19e3945fab721ab72c203a (patch)
tree2806aa87dbfdd6c5a0aba00071062f984c756bab
parent2e3b534998ddefe94a772ab62584be0076418dfa (diff)
Introduce StatusOptions.IncludeUnaltered
-rw-r--r--LibGit2Sharp.Tests/StatusFixture.cs60
-rw-r--r--LibGit2Sharp/RepositoryStatus.cs36
-rw-r--r--LibGit2Sharp/StatusOptions.cs8
3 files changed, 88 insertions, 16 deletions
diff --git a/LibGit2Sharp.Tests/StatusFixture.cs b/LibGit2Sharp.Tests/StatusFixture.cs
index e8f9d731..476dab8b 100644
--- a/LibGit2Sharp.Tests/StatusFixture.cs
+++ b/LibGit2Sharp.Tests/StatusFixture.cs
@@ -103,20 +103,22 @@ namespace LibGit2Sharp.Tests
}
}
- [Fact]
- public void CanRetrieveTheStatusOfTheWholeWorkingDirectory()
+ [Theory]
+ [InlineData(false, 0)]
+ [InlineData(true, 5)]
+ public void CanRetrieveTheStatusOfTheWholeWorkingDirectory(bool includeUnaltered, int unalteredCount)
{
string path = SandboxStandardTestRepo();
using (var repo = new Repository(path))
{
const string file = "modified_staged_file.txt";
- RepositoryStatus status = repo.RetrieveStatus();
+ RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered });
Assert.Equal(FileStatus.Staged, status[file].State);
Assert.NotNull(status);
- Assert.Equal(6, status.Count());
+ Assert.Equal(6 + unalteredCount, status.Count());
Assert.True(status.IsDirty);
Assert.Equal("new_untracked_file.txt", status.Untracked.Select(s => s.FilePath).Single());
@@ -131,11 +133,11 @@ namespace LibGit2Sharp.Tests
Assert.Equal(FileStatus.Staged | FileStatus.Modified, repo.RetrieveStatus(file));
- RepositoryStatus status2 = repo.RetrieveStatus();
+ RepositoryStatus status2 = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered });
Assert.Equal(FileStatus.Staged | FileStatus.Modified, status2[file].State);
Assert.NotNull(status2);
- Assert.Equal(6, status2.Count());
+ Assert.Equal(6 + unalteredCount, status2.Count());
Assert.True(status2.IsDirty);
Assert.Equal("new_untracked_file.txt", status2.Untracked.Select(s => s.FilePath).Single());
@@ -242,14 +244,16 @@ namespace LibGit2Sharp.Tests
}
}
- [Fact]
- public void CanRetrieveTheStatusOfANewRepository()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void CanRetrieveTheStatusOfANewRepository(bool includeUnaltered)
{
string repoPath = InitNewRepository();
using (var repo = new Repository(repoPath))
{
- RepositoryStatus status = repo.RetrieveStatus();
+ RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered });
Assert.NotNull(status);
Assert.Equal(0, status.Count());
Assert.False(status.IsDirty);
@@ -592,5 +596,43 @@ namespace LibGit2Sharp.Tests
Assert.Equal("hello.txt", status.Modified.Single().FilePath);
}
}
+
+ [Fact]
+ public void CanIncludeStatusOfUnalteredFiles()
+ {
+ var path = SandboxStandardTestRepo();
+ string[] unalteredPaths = {
+ "1.txt",
+ "1" + Path.DirectorySeparatorChar + "branch_file.txt",
+ "branch_file.txt",
+ "new.txt",
+ "README",
+ };
+
+ using (var repo = new Repository(path))
+ {
+ RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });
+
+ Assert.Equal(unalteredPaths.Length, status.Unaltered.Count());
+ Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath).Select(s => s.FilePath).ToArray());
+ }
+ }
+
+ [Fact]
+ public void UnalteredFilesDontMarkIndexAsDirty()
+ {
+ var path = SandboxStandardTestRepo();
+
+ using (var repo = new Repository(path))
+ {
+ repo.Reset(ResetMode.Hard);
+ repo.RemoveUntrackedFiles();
+
+ RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });
+
+ Assert.Equal(false, status.IsDirty);
+ Assert.Equal(9, status.Count());
+ }
+ }
}
}
diff --git a/LibGit2Sharp/RepositoryStatus.cs b/LibGit2Sharp/RepositoryStatus.cs
index 1eac10e1..d5e82ef4 100644
--- a/LibGit2Sharp/RepositoryStatus.cs
+++ b/LibGit2Sharp/RepositoryStatus.cs
@@ -26,6 +26,7 @@ namespace LibGit2Sharp
private readonly List<StatusEntry> ignored = new List<StatusEntry>();
private readonly List<StatusEntry> renamedInIndex = new List<StatusEntry>();
private readonly List<StatusEntry> renamedInWorkDir = new List<StatusEntry>();
+ private readonly List<StatusEntry> unaltered = new List<StatusEntry>();
private readonly bool isDirty;
private readonly IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> dispatcher = Build();
@@ -42,7 +43,7 @@ namespace LibGit2Sharp
{ FileStatus.Removed, (rs, s) => rs.removed.Add(s) },
{ FileStatus.RenamedInIndex, (rs, s) => rs.renamedInIndex.Add(s) },
{ FileStatus.Ignored, (rs, s) => rs.ignored.Add(s) },
- { FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) }
+ { FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) },
};
}
@@ -81,7 +82,7 @@ namespace LibGit2Sharp
AddStatusEntryForDelta(entry.Status, deltaHeadToIndex, deltaIndexToWorkDir);
}
- isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored);
+ isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored && entry.State != FileStatus.Unaltered);
}
}
@@ -134,6 +135,12 @@ namespace LibGit2Sharp
GitStatusOptionFlags.DisablePathspecMatch;
}
+ if (options.IncludeUnaltered)
+ {
+ coreOptions.Flags |=
+ GitStatusOptionFlags.IncludeUnmodified;
+ }
+
return coreOptions;
}
@@ -164,14 +171,21 @@ namespace LibGit2Sharp
StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails);
- foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
+ if (gitStatus == FileStatus.Unaltered)
{
- if (!gitStatus.HasFlag(kvp.Key))
+ unaltered.Add(statusEntry);
+ }
+ else
+ {
+ foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
{
- continue;
- }
+ if (!gitStatus.HasFlag(kvp.Key))
+ {
+ continue;
+ }
- kvp.Value(this, statusEntry);
+ kvp.Value(this, statusEntry);
+ }
}
statusEntries.Add(statusEntry);
@@ -290,6 +304,14 @@ namespace LibGit2Sharp
}
/// <summary>
+ /// List of files that were unmodified in the working directory.
+ /// </summary>
+ public virtual IEnumerable<StatusEntry> Unaltered
+ {
+ get { return unaltered; }
+ }
+
+ /// <summary>
/// True if the index or the working directory has been altered since the last commit. False otherwise.
/// </summary>
public virtual bool IsDirty
diff --git a/LibGit2Sharp/StatusOptions.cs b/LibGit2Sharp/StatusOptions.cs
index a7e51760..f389303a 100644
--- a/LibGit2Sharp/StatusOptions.cs
+++ b/LibGit2Sharp/StatusOptions.cs
@@ -76,5 +76,13 @@
/// as explicit paths, and NOT as pathspecs containing globs.
/// </summary>
public bool DisablePathSpecMatch { get; set; }
+
+ /// <summary>
+ /// Include unaltered files when scanning for status
+ /// </summary>
+ /// <remarks>
+ /// Unaltered meaning the file is identical in the working directory, the index and HEAD.
+ /// </remarks>
+ public bool IncludeUnaltered { get; set; }
}
}