Ejemplo n.º 1
0
        private void Prepare(int comparisons, out string[] content1, out string[] content2)
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("vcpkg.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            RepositoryReader   repositoryReader   = new RepositoryReader(repoDir);

            content1 = new string[comparisons];
            content2 = new string[comparisons];
            int i = 0;

            foreach (Commit commit in repositoryAnalyzer.GetCommits().Where(x => x.Parents.Any()))
            {
                Dictionary <string, PathHashMode> current = repositoryAnalyzer.GetPathAndHashForFiles(commit.Hash).ToDictionary(x => x.Path);
                Dictionary <string, PathHashMode> parent  = repositoryAnalyzer.GetPathAndHashForFiles(commit.Parents[0]).ToDictionary(x => x.Path);
                foreach ((string hash1, string hash2) in current.Keys.Intersect(parent.Keys).Select(x => (current[x].Hash, parent[x].Hash)))
                {
                    if (hash1 != hash2)
                    {
                        content1[i] = repositoryReader.ReadBlob(hash1);
                        content2[i] = repositoryReader.ReadBlob(hash2);
                        i++;
                    }
                    if (i == comparisons)
                    {
                        break;
                    }
                }
                if (i == comparisons)
                {
                    break;
                }
            }
        }
        public void TestCountCommits()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            int count = repositoryAnalyzer.GetTotalNumberOfCommits();

            Assert.AreEqual(157, count);
        }
        public void TestGetCommitsForPath()
        {
            string                 repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer     repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            IReadOnlyList <Commit> commits            = repositoryAnalyzer.GetCommitsForOneFilePath(@"proposals\lambda-attributes.md");

            Assert.AreEqual(2, commits.Count);
            Assert.AreEqual("24b2ac25986949e39fbb258b39c38c5f134afa74", commits[0].Hash);
            Assert.AreEqual("2531e639b6cc3cce1d632daf350f5e49cd000c62", commits[1].Hash);
        }
        public void TestGetChangesNewlineAddedToEndOfFile()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("html-generator.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            CommitDelta        changes            = repositoryAnalyzer.GetChanges("54a1f0028d595e73ea3151459cb7f9e58ec46b0b");
            FileChange         portfileChanges    = changes.Modified.Where(x => x.Path == @"src\src\HtmlGenerator\Tag.cs").First();

            Assert.AreEqual(1, portfileChanges.NumberOfLinesDeleted);
            Assert.AreEqual(2, portfileChanges.NumberOfLinesAdded);
        }
        public void TestGetChangesByCommitTwoParentsNoChange()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            CommitDelta        changes            = repositoryAnalyzer.GetChanges("dfb46ac110aacfade7a4a9491b272e6e8ffc4468");

            Assert.AreEqual(0, changes.Added.Count);
            Assert.AreEqual(0, changes.Deleted.Count);
            Assert.AreEqual(0, changes.Modified.Count);
        }
        public void TestGetFilePathsHead()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            List <string>      filePaths          = repositoryAnalyzer.GetFilePaths().ToList();

            Assert.AreEqual(152, filePaths.Count);
            Assert.True(filePaths.Contains(".gitattributes"));
            Assert.True(filePaths.Contains(@"meetings\README.md"));
            Assert.True(filePaths.Contains(@"proposals\rejected\README.md"));
        }
        public void TestGetFilePathsSpecificCommit()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            List <string>      filePaths          = repositoryAnalyzer.GetFilePaths("7981ea1fb4d89571fd41e3b75f7c9f7fc178e837").ToList();

            Assert.AreEqual(6, filePaths.Count);
            Assert.True(filePaths.Contains("README.md"));
            Assert.True(filePaths.Contains(@"design-notes\Notes-2016-11-16.md"));
            Assert.True(filePaths.Contains(@"design-notes\csharp-language-design-notes-2017.md"));
            Assert.True(filePaths.Contains(@"proposals\async-streams.md"));
            Assert.True(filePaths.Contains(@"proposals\nullable-reference-types.md"));
            Assert.True(filePaths.Contains(@"spec\spec.md"));
        }
        public void TestGetCommits()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            List <string>      commits            = repositoryAnalyzer.GetCommits().Select(x => x.Hash).ToList();

            Assert.Less(commits.IndexOf("f985e74e689d6857daca1141564dfbc6fd658b08"), commits.IndexOf("460058747f22757b61b8a4f5ad6beb1c2043eef4")); //4600 is a parent of f985
            Assert.Less(commits.IndexOf("380631f0cc7dcc56fdd4af27d77cb0df01c1478c"), commits.IndexOf("460058747f22757b61b8a4f5ad6beb1c2043eef4")); //4600 is a parent of 3806
            Assert.Less(commits.IndexOf("fc7e0f6d81c71944d68cd798bf1d85c9decbc59f"), commits.IndexOf("460058747f22757b61b8a4f5ad6beb1c2043eef4")); //4600 is a parent of fc7e
            Assert.Less(commits.IndexOf("c5de26f52019ca0e1e79d88584f75bfe530ee986"), commits.IndexOf("3524ad4e2bd13ce56def7a4e16986215dd051363")); //3524 is a parent of c5de
            Assert.Less(commits.IndexOf("c5de26f52019ca0e1e79d88584f75bfe530ee986"), commits.IndexOf("e23c9e0ebdcef2a5ceafa16ce7b652335edd5c41")); //e23c is a parent of c5de
            Assert.Less(commits.IndexOf("a275da6616b2d66ae878d894940e79c5e96a3b84"), commits.IndexOf("564b51a481968cebc0c2a8b83e0da1bf652fc9db")); //both share parent but 564b has timetamp which is before timestamp of a275
            Assert.AreEqual("f23184baaccbd403436c6a705f4fc06f90df3086", commits[commits.Count - 1]);                                               // f231 is the commit which started the repository
        }
        public void TestGetFileLineCounts()
        {
            string                   repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer       repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            Dictionary <string, int> lineCounts         = repositoryAnalyzer.GetFileLineCounts("7981ea1fb4d89571fd41e3b75f7c9f7fc178e837").ToDictionary(x => x.FilePath, x => x.LineCount);

            Assert.AreEqual(6, lineCounts.Count);
            Assert.AreEqual(10, lineCounts.GetValueOrDefault(@"README.md", -1));
            Assert.AreEqual(0, lineCounts.GetValueOrDefault(@"proposals\async-streams.md", -1));
            Assert.AreEqual(126, lineCounts.GetValueOrDefault(@"proposals\nullable-reference-types.md", -1));
            Assert.AreEqual(74, lineCounts.GetValueOrDefault(@"design-notes\Notes-2016-11-16.md", -1));
            Assert.AreEqual(0, lineCounts.GetValueOrDefault(@"design-notes\csharp-language-design-notes-2017.md", -1));
            Assert.AreEqual(0, lineCounts.GetValueOrDefault(@"spec\spec.md", -1));
        }
        public void TestGetChangesByCommitTwoParentsWithChange()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("vcpkg.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            CommitDelta        changes            = repositoryAnalyzer.GetChanges("dbab03a1a82913ae96bfa3c1613ade20b5ac438d");

            Assert.AreEqual(0, changes.Added.Count);
            Assert.AreEqual(0, changes.Deleted.Count);
            Assert.AreEqual(1, changes.Modified.Count);
            FileChange portfileChanges = changes.Modified.Where(x => x.Path == @"ports\openssl\portfile.cmake").First();

            Assert.AreEqual(1, portfileChanges.NumberOfLinesDeleted);
            Assert.AreEqual(0, portfileChanges.NumberOfLinesAdded);
        }
        public void TestGetCommitsForAllFilePaths()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            IReadOnlyDictionary <string, IReadOnlyList <Commit> > result = repositoryAnalyzer.GetCommitsForAllFilePaths();

            Assert.AreEqual(152, result.Count);
            Assert.AreEqual(1, result[@"spec\LICENSE.md"].Count);
            Assert.AreEqual("6027ad5a4ab013f4fb42f5edd2d667d649fe1bd8", result[@"spec\LICENSE.md"][0].Hash);
            Assert.AreEqual(4, result[@"proposals\records.md"].Count);
            Assert.AreEqual("658e65403a9e14d9f614994d1fd6757d4fab9608", result[@"proposals\records.md"][0].Hash);
            Assert.AreEqual("22f42429d2b5d391db632ef0cc2444844118f108", result[@"proposals\records.md"][1].Hash);
            Assert.AreEqual("9d957f97b19645397c97340cd996e73b952b30b1", result[@"proposals\records.md"][2].Hash);
            Assert.AreEqual("fab2157f7e13c8f12a781172d9b870f846a442b9", result[@"proposals\records.md"][3].Hash);
        }
        public void TestGetChangesByCommitOneParentFilesModified()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            CommitDelta        changes            = repositoryAnalyzer.GetChanges("a5f82604eab5826bd1913cf63c7dfb8c2b187641");

            Assert.AreEqual(0, changes.Added.Count);
            Assert.AreEqual(0, changes.Deleted.Count);
            Assert.AreEqual(2, changes.Modified.Count);
            FileChange readmeChanges = changes.Modified.Where(x => x.Path == @"README.md").First();

            Assert.AreEqual(4, readmeChanges.NumberOfLinesDeleted);
            Assert.AreEqual(12, readmeChanges.NumberOfLinesAdded);
            FileChange proposalsReadmeChanges = changes.Modified.Where(x => x.Path == @"proposals\README.md").First();

            Assert.AreEqual(1, proposalsReadmeChanges.NumberOfLinesAdded);
            Assert.AreEqual(1, proposalsReadmeChanges.NumberOfLinesDeleted);
        }
        public void TestGetChangesByCommitOneParentFilesAdded()
        {
            string             repoDir            = TestUtils.ExtractZippedRepo("csharplang.git");
            RepositoryAnalyzer repositoryAnalyzer = new RepositoryAnalyzer(repoDir);
            CommitDelta        changes            = repositoryAnalyzer.GetChanges("7981ea1fb4d89571fd41e3b75f7c9f7fc178e837");

            Assert.AreEqual(2, changes.Added.Count);
            Assert.AreEqual(0, changes.Deleted.Count);
            Assert.AreEqual(0, changes.Modified.Count);
            FileChange nullableChanges = changes.Added.Where(x => x.Path == @"proposals\nullable-reference-types.md").First();

            Assert.AreEqual(0, nullableChanges.NumberOfLinesDeleted);
            Assert.AreEqual(126, nullableChanges.NumberOfLinesAdded);
            FileChange notesChanges = changes.Added.Where(x => x.Path == @"design-notes\Notes-2016-11-16.md").First();

            Assert.AreEqual(0, notesChanges.NumberOfLinesDeleted);
            Assert.AreEqual(74, notesChanges.NumberOfLinesAdded);
        }