From 420686037d58fdaa49bfc04a0dc49ba28c4ad9be Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 15 Apr 2020 18:51:09 +0200 Subject: [PATCH 1/2] Add unit test for #1782 This unit test demonstrates the exception that was reported in #1782. --- LibGit2Sharp.Tests/BranchFixture.cs | 33 ++++++++++++++++++ .../AnotherFile.txt | 1 + .../dot_git/FETCH_HEAD | 0 .../multifetchspec_testrepo_wd/dot_git/HEAD | 1 + .../multifetchspec_testrepo_wd/dot_git/config | 14 ++++++++ .../multifetchspec_testrepo_wd/dot_git/index | Bin 0 -> 225 bytes .../03/0c7945c1e7eab74072acedfcd2a16db351a9a5 | 1 + .../65/1df87831579c12dab081797720d9973edf477a | Bin 0 -> 131 bytes .../77/d8517569c4f7bdf90fb77cafc8c93c7353e0db | Bin 0 -> 35 bytes .../b9/767f840d2eda4faeafe47712eb3bdf506f8a0a | Bin 0 -> 166 bytes .../c6/242f94be8cb6ad9448a4bb7f57aa4233431e02 | Bin 0 -> 57 bytes .../ea/450f959b935cbf0fb1dc902981ae819386b84d | Bin 0 -> 24 bytes .../dot_git/refs/heads/PR-28 | 1 + .../dot_git/refs/remotes/origin/PR-28 | 1 + .../dot_git/refs/remotes/origin/master | 1 + .../multifetchspec_testrepo_wd/new_file.txt | 1 + LibGit2Sharp.Tests/TestHelpers/BaseFixture.cs | 7 ++++ 17 files changed, 61 insertions(+) create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/AnotherFile.txt create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/FETCH_HEAD create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/HEAD create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/config create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/index create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/03/0c7945c1e7eab74072acedfcd2a16db351a9a5 create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/65/1df87831579c12dab081797720d9973edf477a create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/77/d8517569c4f7bdf90fb77cafc8c93c7353e0db create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/b9/767f840d2eda4faeafe47712eb3bdf506f8a0a create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/c6/242f94be8cb6ad9448a4bb7f57aa4233431e02 create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/ea/450f959b935cbf0fb1dc902981ae819386b84d create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/refs/heads/PR-28 create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/refs/remotes/origin/PR-28 create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/refs/remotes/origin/master create mode 100644 LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/new_file.txt diff --git a/LibGit2Sharp.Tests/BranchFixture.cs b/LibGit2Sharp.Tests/BranchFixture.cs index 736b0faec..029f58871 100644 --- a/LibGit2Sharp.Tests/BranchFixture.cs +++ b/LibGit2Sharp.Tests/BranchFixture.cs @@ -879,6 +879,39 @@ public void CanUnsetTrackedBranch() } } + [Fact] + public void CanSetTrackedBranch_MultipleFetchSpecs() + { + const string testBranchName = "master"; + const string trackedBranchName = "refs/remotes/origin/master"; + + string path = SandboxMultiFetchSpecTestRepo(); + using (var repo = new Repository(path)) + { + Branch trackedBranch = repo.Branches[trackedBranchName]; + Assert.True(trackedBranch.IsRemote); + + Branch branch = repo.CreateBranch(testBranchName, trackedBranch.Tip); + Assert.False(branch.IsTracking); + + repo.Branches.Update(branch, + b => b.TrackedBranch = trackedBranch.CanonicalName); + + // Verify the immutability of the branch. + Assert.False(branch.IsTracking); + + // Get the updated branch information. + branch = repo.Branches[testBranchName]; + + Remote upstreamRemote = repo.Network.Remotes["origin"]; + Assert.NotNull(upstreamRemote); + + Assert.True(branch.IsTracking); + Assert.Equal(trackedBranch, branch.TrackedBranch); + Assert.Equal("origin", branch.RemoteName); + } + } + [Fact] public void CanWalkCommitsFromBranch() { diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/AnotherFile.txt b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/AnotherFile.txt new file mode 100644 index 000000000..4f4c1659d --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/AnotherFile.txt @@ -0,0 +1 @@ +This is another file diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/FETCH_HEAD b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/FETCH_HEAD new file mode 100644 index 000000000..e69de29bb diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/HEAD b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/HEAD new file mode 100644 index 000000000..1c7859fee --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/PR-28 diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/config b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/config new file mode 100644 index 000000000..6c69d1171 --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = false + logallrefupdates = true + ignorecase = true +[remote "origin"] + url = ../multifetchspec_testrepo.git/ + fetch = +refs/pull/28/head:refs/remotes/origin/PR-28 + fetch = +refs/heads/master:refs/remotes/origin/master + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "PR-28"] + remote = origin + merge = refs/pull/28/head diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/index b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..57e64a1e1ec92f674b6d34b0133a9a951dd1ed1c GIT binary patch literal 225 zcmZ?q402{*U|<5_xalT}JjKi@Fd8TZ1&vE!EFdjbej~6n^T_wTKl!)UtUqzmra1V) zZ3ceFy!?`k)FQXcoK(G%iV~ngm^m;SVFrqMT(4aDr_P=nv!8$Coe7$a>l!Dw?eJyb z$xAJdPeT|6)EpAz>I$SJ8H^MRxR`k=T@OBgwcVj;&D%eh7UpgaT)8xY^RwWquhP;V QEpDrNP7bbEnIrWS0MaBxQ2+n{ literal 0 HcmV?d00001 diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/03/0c7945c1e7eab74072acedfcd2a16db351a9a5 b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/03/0c7945c1e7eab74072acedfcd2a16db351a9a5 new file mode 100644 index 000000000..7e58b7e10 --- /dev/null +++ b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/03/0c7945c1e7eab74072acedfcd2a16db351a9a5 @@ -0,0 +1 @@ +x+)JMU°0f040031QpÌË/ÉH-rËÌIÕ+©(a(¿XšyäûÞŸüÛkÖŸ8iSüà6Ti^jy|LÝ+Wþ©³'Çìçßxg‚fãºÆÉm;|I %ý \ No newline at end of file diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/65/1df87831579c12dab081797720d9973edf477a b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/65/1df87831579c12dab081797720d9973edf477a new file mode 100644 index 0000000000000000000000000000000000000000..10f3dcfe512125844176c689eb5fb72d70886ceb GIT binary patch literal 131 zcmV-}0DS*=0iBIO3c@fD06pgwdlw|xY?Bm3MDXA4WC+Q~ELH%b#Jv2HjMO59w9K4TE&zOJCp6C+ux5GfX`m zk2b&uyo_!J7_f4lVkKjf!V|KWYPwYQLbH|-NwP%uCEfM`b0l37r$CW&C9hI25oczP znlpz}otVYR&sdKRw_<&juJCDXJK+~zti^)dCsg;L U+V(rhevI`DENwIQ2f)Bb@~>i0u>b%7 literal 0 HcmV?d00001 diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/c6/242f94be8cb6ad9448a4bb7f57aa4233431e02 b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/c6/242f94be8cb6ad9448a4bb7f57aa4233431e02 new file mode 100644 index 0000000000000000000000000000000000000000..a2f363a219aac42357d5843f5e4e42cb55668936 GIT binary patch literal 57 zcmV-90LK4#0V^p=O;s>4U@$Z=Ff%bx$V)AcPs_|n)hnqeVR+@rKXvxxnEm`4?@Z8a PT-P|cZHF%ag#{9tehL_Q literal 0 HcmV?d00001 diff --git a/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/ea/450f959b935cbf0fb1dc902981ae819386b84d b/LibGit2Sharp.Tests/Resources/multifetchspec_testrepo_wd/dot_git/objects/ea/450f959b935cbf0fb1dc902981ae819386b84d new file mode 100644 index 0000000000000000000000000000000000000000..0128db926f8cd4a2c51dc6c023251cc33c3ae4c2 GIT binary patch literal 24 gcmb Date: Thu, 16 Apr 2020 12:35:47 +0200 Subject: [PATCH 2/2] Handle multiple fetch specs when setting tracking branch (fixes #1782) --- LibGit2Sharp/Remote.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp/Remote.cs b/LibGit2Sharp/Remote.cs index 3bf957866..b0b195032 100644 --- a/LibGit2Sharp/Remote.cs +++ b/LibGit2Sharp/Remote.cs @@ -134,8 +134,16 @@ internal unsafe string FetchSpecTransformToSource(string reference) { using (RemoteHandle remoteHandle = Proxy.git_remote_lookup(repository.Handle, Name, true)) { - git_refspec* fetchSpecPtr = Proxy.git_remote_get_refspec(remoteHandle, 0); - return Proxy.git_refspec_rtransform(new IntPtr(fetchSpecPtr), reference); + var fetchSpec = IntPtr.Zero; + var refspecCount = Proxy.git_remote_refspec_count(remoteHandle); + for (int i = 0; i < refspecCount; i++) + { + fetchSpec = new IntPtr(Proxy.git_remote_get_refspec(remoteHandle, i)); + if (Proxy.git_refspec_dst_matches(fetchSpec, reference)) + break; + } + + return Proxy.git_refspec_rtransform(fetchSpec, reference); } }