From e8a81a90ce22813565ceefac91bb7c12281191d1 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Fri, 23 Jan 2015 15:38:05 +0100 Subject: [PATCH 1/3] Add new AssumeUnchanged test repository Created through the following $ git init assume_unchanged_wd && cd assume_unchanged_wd $ echo "hello" > hello.txt $ echo "world" > world.txt $ git add . $ git commit -m "Initial commit" $ echo "Hello" > hello.txt $ echo "World" > world.txt $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: hello.txt modified: world.txt no changes added to commit (use "git add" and/or "git commit -a") $ git update-index --assume-unchanged world.txt $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: hello.txt no changes added to commit (use "git add" and/or "git commit -a") --- .../assume_unchanged_wd/dot_git/COMMIT_EDITMSG | 1 + .../Resources/assume_unchanged_wd/dot_git/HEAD | 1 + .../Resources/assume_unchanged_wd/dot_git/config | 8 ++++++++ .../Resources/assume_unchanged_wd/dot_git/index | Bin 0 -> 176 bytes .../assume_unchanged_wd/dot_git/info/exclude | 6 ++++++ .../assume_unchanged_wd/dot_git/logs/HEAD | 1 + .../dot_git/logs/refs/heads/master | 1 + .../87/2129051d644790636b416d1ef1ec830c5f6b90 | 3 +++ .../88/e38705fdbd3608cddbe904b67c731f3234c45b | Bin 0 -> 84 bytes .../cc/628ccd10742baea8241c5924df992b5c019f71 | Bin 0 -> 21 bytes .../ce/013625030ba8dba906f756967f9e9ca394464a | Bin 0 -> 21 bytes .../assume_unchanged_wd/dot_git/refs/heads/master | 1 + .../Resources/assume_unchanged_wd/hello.txt | 1 + .../Resources/assume_unchanged_wd/world.txt | 1 + LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs | 6 ++++++ 15 files changed, 30 insertions(+) create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/COMMIT_EDITMSG create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/HEAD create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/config create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/index create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/info/exclude create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/HEAD create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/refs/heads/master create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/87/2129051d644790636b416d1ef1ec830c5f6b90 create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/88/e38705fdbd3608cddbe904b67c731f3234c45b create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/cc/628ccd10742baea8241c5924df992b5c019f71 create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/ce/013625030ba8dba906f756967f9e9ca394464a create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/refs/heads/master create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/hello.txt create mode 100644 LibGit2Sharp.Tests/Resources/assume_unchanged_wd/world.txt diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/COMMIT_EDITMSG b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/COMMIT_EDITMSG new file mode 100644 index 000000000..5852f4463 --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/COMMIT_EDITMSG @@ -0,0 +1 @@ +Initial commit diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/HEAD b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/HEAD new file mode 100644 index 000000000..cb089cd89 --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/config b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/config new file mode 100644 index 000000000..78387c50b --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/config @@ -0,0 +1,8 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = false + logallrefupdates = true + symlinks = false + ignorecase = true + hideDotFiles = dotGitOnly diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/index b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..1af67f2d4f03bf16f86618c5663b14fb2b56aa0f GIT binary patch literal 176 zcmZ?q402{*U|<5_kV8=wK$-zYgV+$zxCF)m(ro7#%~YAWSKMC7_C0J`{k%Dgr?`1B zaAu_DRFr`9cY@TzXoOx=bIv67oE0e1UbjL;CQ{}8OzjxP`GpOf<@rT9DPVKB Z^poAcMo&Mj_2tR3DUY@9y2)0b008$MF0lXr literal 0 HcmV?d00001 diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/info/exclude b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/info/exclude new file mode 100644 index 000000000..a5196d1be --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/HEAD b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/HEAD new file mode 100644 index 000000000..8a423a7ae --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 872129051d644790636b416d1ef1ec830c5f6b90 nulltoken 1422023333 +0100 commit (initial): Initial commit diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/refs/heads/master b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/refs/heads/master new file mode 100644 index 000000000..8a423a7ae --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 872129051d644790636b416d1ef1ec830c5f6b90 nulltoken 1422023333 +0100 commit (initial): Initial commit diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/87/2129051d644790636b416d1ef1ec830c5f6b90 b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/87/2129051d644790636b416d1ef1ec830c5f6b90 new file mode 100644 index 000000000..3c800a797 --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/87/2129051d644790636b416d1ef1ec830c5f6b90 @@ -0,0 +1,3 @@ +x��I +B1]��>��'��[����� ��o���U/�Z�n�i"���5�S�Q�hC��.��n��=? \ No newline at end of file diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/88/e38705fdbd3608cddbe904b67c731f3234c45b b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/88/e38705fdbd3608cddbe904b67c731f3234c45b new file mode 100644 index 0000000000000000000000000000000000000000..783449ff9c40fcb74414212596185b11c6858da8 GIT binary patch literal 84 zcmV-a0IUCa0V^p=O;s>AVK6i>Ff%bx$Vkn}$=55XC}B9qXr{`{z2f#tw(nun>gUZ_ qJjKlms;E4_C?^H1=uA@2S%DJmbt_b4B316s)Q(}CUkCtsV;xvWkS6B< literal 0 HcmV?d00001 diff --git a/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/cc/628ccd10742baea8241c5924df992b5c019f71 b/LibGit2Sharp.Tests/Resources/assume_unchanged_wd/dot_git/objects/cc/628ccd10742baea8241c5924df992b5c019f71 new file mode 100644 index 0000000000000000000000000000000000000000..6b011038d5917ad7204f88f49aef99f22a19256d GIT binary patch literal 21 ccmb Date: Fri, 23 Jan 2015 15:46:32 +0100 Subject: [PATCH 2/3] Ensure RetrieveStatus honors "assumed-unchanged" flag --- LibGit2Sharp.Tests/StatusFixture.cs | 11 +++++++++++ LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs | 1 + 2 files changed, 12 insertions(+) diff --git a/LibGit2Sharp.Tests/StatusFixture.cs b/LibGit2Sharp.Tests/StatusFixture.cs index 3e262e349..e8f9d7314 100644 --- a/LibGit2Sharp.Tests/StatusFixture.cs +++ b/LibGit2Sharp.Tests/StatusFixture.cs @@ -581,5 +581,16 @@ public void CanRetrieveTheStatusOfAGlobSpec() Assert.Equal(2, status.Untracked.Count()); } } + + [Fact] + public void RetrievingTheStatusHonorsAssumedUnchangedMarkedIndexEntries() + { + var path = SandboxAssumeUnchangedTestRepo(); + using (var repo = new Repository(path)) + { + var status = repo.RetrieveStatus(); + Assert.Equal("hello.txt", status.Modified.Single().FilePath); + } + } } } diff --git a/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs b/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs index 6adca0516..ed60c2172 100644 --- a/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs +++ b/LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs @@ -68,6 +68,7 @@ private static void SetUpTestEnvironment() RevertTestRepoWorkingDirPath = Path.Combine(sourceRelativePath, "revert_testrepo_wd"); SubmoduleTestRepoWorkingDirPath = Path.Combine(sourceRelativePath, "submodule_wd"); SubmoduleTargetTestRepoWorkingDirPath = Path.Combine(sourceRelativePath, "submodule_target_wd"); + AssumeUnchangedRepoWorkingDirPath = Path.Combine(sourceRelativePath, "assume_unchanged_wd"); } private static bool IsFileSystemCaseSensitiveInternal() From 6f16791eaeeec5e9e884fe41bd05d4f47af3fc1b Mon Sep 17 00:00:00 2001 From: pete Date: Fri, 23 Jan 2015 18:44:01 +0100 Subject: [PATCH 3/3] Expose the assume-unchanged flag to IndexEntry Fix #928 --- LibGit2Sharp.Tests/IndexFixture.cs | 14 ++++++++++++++ LibGit2Sharp/Core/GitIndexEntry.cs | 2 ++ LibGit2Sharp/IndexEntry.cs | 8 +++++++- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/LibGit2Sharp.Tests/IndexFixture.cs b/LibGit2Sharp.Tests/IndexFixture.cs index 0b926318d..8dcdc4037 100644 --- a/LibGit2Sharp.Tests/IndexFixture.cs +++ b/LibGit2Sharp.Tests/IndexFixture.cs @@ -466,6 +466,20 @@ public void CanMimicGitAddAll() } } + [Fact] + public void RetrievingAssumedUnchangedMarkedIndexEntries() + { + var path = SandboxAssumeUnchangedTestRepo(); + using (var repo = new Repository(path)) + { + var regularFile = repo.Index["hello.txt"]; + Assert.False(regularFile.AssumeUnchanged); + + var assumeUnchangedFile = repo.Index["world.txt"]; + Assert.True(assumeUnchangedFile.AssumeUnchanged); + } + } + private static void AddSomeCornerCases(Repository repo) { // Turn 1.txt into a directory in the Index diff --git a/LibGit2Sharp/Core/GitIndexEntry.cs b/LibGit2Sharp/Core/GitIndexEntry.cs index 51689fa17..05904c84d 100644 --- a/LibGit2Sharp/Core/GitIndexEntry.cs +++ b/LibGit2Sharp/Core/GitIndexEntry.cs @@ -6,6 +6,8 @@ namespace LibGit2Sharp.Core [StructLayout(LayoutKind.Sequential)] internal class GitIndexEntry { + internal const ushort GIT_IDXENTRY_VALID = 0x8000; + public GitIndexTime CTime; public GitIndexTime MTime; public uint Dev; diff --git a/LibGit2Sharp/IndexEntry.cs b/LibGit2Sharp/IndexEntry.cs index d6e97eb03..7dc6b0150 100644 --- a/LibGit2Sharp/IndexEntry.cs +++ b/LibGit2Sharp/IndexEntry.cs @@ -30,6 +30,11 @@ public class IndexEntry : IEquatable /// public virtual StageLevel StageLevel { get; private set; } + /// + /// Whether the file is marked as assume-unchanged + /// + public virtual bool AssumeUnchanged { get; private set; } + /// /// Gets the id of the pointed at by this index entry. /// @@ -51,7 +56,8 @@ internal static IndexEntry BuildFromPtr(IndexEntrySafeHandle handle) Path = path.Native, Id = entry.Id, StageLevel = Proxy.git_index_entry_stage(handle), - Mode = (Mode)entry.Mode + Mode = (Mode)entry.Mode, + AssumeUnchanged = (GitIndexEntry.GIT_IDXENTRY_VALID & entry.Flags) == GitIndexEntry.GIT_IDXENTRY_VALID }; }