public void ResolveReference()
        {
            using var temp = new TempRoot();

            var gitDir = temp.CreateDirectory();

            var commonDir    = temp.CreateDirectory();
            var refsHeadsDir = commonDir.CreateDirectory("refs").CreateDirectory("heads");

            refsHeadsDir.CreateFile("master").WriteAllText("0000000000000000000000000000000000000000");
            refsHeadsDir.CreateFile("br1").WriteAllText("ref: refs/heads/br2");
            refsHeadsDir.CreateFile("br2").WriteAllText("ref: refs/heads/master");

            var resolver = new GitReferenceResolver(gitDir.Path, commonDir.Path);

            Assert.Equal("0123456789ABCDEFabcdef000000000000000000", resolver.ResolveReference("0123456789ABCDEFabcdef000000000000000000"));

            Assert.Equal("0000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/master"));
            Assert.Equal("0000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/br1"));
            Assert.Equal("0000000000000000000000000000000000000000", resolver.ResolveReference("ref: refs/heads/br2"));

            // branch without commits (emtpy repository) will have not file in refs/heads:
            Assert.Null(resolver.ResolveReference("ref: refs/heads/none"));

            Assert.Null(resolver.ResolveReference("ref: refs/heads/rec1   "));
            Assert.Null(resolver.ResolveReference("ref: refs/heads/none" + string.Join("/", Path.GetInvalidPathChars())));
        }
        public void ReadPackedReferences()
        {
            var packedRefs =
                @"# pack-refs with:
1111111111111111111111111111111111111111 refs/heads/master
2222222222222222222222222222222222222222 refs/heads/br
^3333333333333333333333333333333333333333
4444444444444444444444444444444444444444 x
5555555555555555555555555555555555555555 y 
6666666666666666666666666666666666666666 y z
7777777777777777777777777777777777777777 refs/heads/br
";

            var actual = GitReferenceResolver.ReadPackedReferences(new StringReader(packedRefs), "<path>");

            AssertEx.SetEqual(new[]
            {
                "refs/heads/br:2222222222222222222222222222222222222222",
                "refs/heads/master:1111111111111111111111111111111111111111"
            }, actual.Select(e => $"{e.Key}:{e.Value}"));
        }
        public void ResolveReference_Errors()
        {
            using var temp = new TempRoot();

            var gitDir = temp.CreateDirectory();

            var commonDir    = temp.CreateDirectory();
            var refsHeadsDir = commonDir.CreateDirectory("refs").CreateDirectory("heads");

            refsHeadsDir.CreateFile("rec1").WriteAllText("ref: refs/heads/rec2");
            refsHeadsDir.CreateFile("rec2").WriteAllText("ref: refs/heads/rec1");

            var resolver = new GitReferenceResolver(gitDir.Path, commonDir.Path);

            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference("ref: refs/heads/rec1"));
            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference("ref: xyz/heads/rec1"));
            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference("ref:refs/heads/rec1"));
            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference("refs/heads/rec1"));
            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference(new string('0', 39)));
            Assert.Throws <InvalidDataException>(() => resolver.ResolveReference(new string('0', 41)));
        }
        public void ResolveReference_Packed()
        {
            using var temp = new TempRoot();

            var gitDir = temp.CreateDirectory();

            gitDir.CreateFile("packed-refs").WriteAllText(
                @"# pack-refs with: peeled fully-peeled sorted
1111111111111111111111111111111111111111 refs/heads/master
2222222222222222222222222222222222222222 refs/heads/br2
");
            var commonDir    = temp.CreateDirectory();
            var refsHeadsDir = commonDir.CreateDirectory("refs").CreateDirectory("heads");

            refsHeadsDir.CreateFile("br1").WriteAllText("ref: refs/heads/br2");

            var resolver = new GitReferenceResolver(gitDir.Path, commonDir.Path);

            Assert.Equal("1111111111111111111111111111111111111111", resolver.ResolveReference("ref: refs/heads/master"));
            Assert.Equal("2222222222222222222222222222222222222222", resolver.ResolveReference("ref: refs/heads/br1"));
            Assert.Equal("2222222222222222222222222222222222222222", resolver.ResolveReference("ref: refs/heads/br2"));
        }
 [InlineData("# pack-refs with:xyz\n^1111111111111111111111111111111111111111\n^2222222222222222222222222222222222222222")] // tag dereference without previous ref
 public void ReadPackedReferences_Errors(string content)
 {
     Assert.Throws <InvalidDataException>(() => GitReferenceResolver.ReadPackedReferences(new StringReader(content), "<path>"));
 }
 public void ReadPackedReferences_Empty(string content)
 {
     Assert.Empty(GitReferenceResolver.ReadPackedReferences(new StringReader(content), "<path>"));
 }