private void RepositoryScope(ILog log, Action <EmptyRepositoryFixture, VersionVariables> fixtureAction = null)
        {
            // Make sure GitVersion doesn't trigger build server mode when we are running the tests
            environment.SetEnvironmentVariable(AppVeyor.EnvironmentVariableName, null);
            environment.SetEnvironmentVariable(TravisCi.EnvironmentVariableName, null);
            environment.SetEnvironmentVariable(AzurePipelines.EnvironmentVariableName, null);

            using var fixture = new EmptyRepositoryFixture();

            var arguments = new Arguments {
                TargetPath = fixture.RepositoryPath
            };
            var options = Options.Create(arguments);

            var gitPreparer               = new GitPreparer(log, environment, options);
            var stepFactory               = new ConfigInitStepFactory();
            var configInitWizard          = new ConfigInitWizard(new ConsoleAdapter(), stepFactory);
            var configurationProvider     = new ConfigProvider(fileSystem, log, configFileLocator, gitPreparer, configInitWizard);
            var baseVersionCalculator     = new BaseVersionCalculator(this.log, null);
            var mainlineVersionCalculator = new MainlineVersionCalculator(this.log, metaDataCalculator);
            var nextVersionCalculator     = new NextVersionCalculator(this.log, metaDataCalculator, baseVersionCalculator, mainlineVersionCalculator);
            var variableProvider          = new VariableProvider(nextVersionCalculator, new TestEnvironment());
            var gitVersionCalculator      = new GitVersionCalculator(fileSystem, log, configFileLocator, configurationProvider, buildServerResolver, gitVersionCache, gitVersionFinder, gitPreparer, variableProvider, options);

            fixture.Repository.MakeACommit();
            var vv = gitVersionCalculator.CalculateVersionVariables();

            vv.AssemblySemVer.ShouldBe("0.1.0.0");
            vv.FileName.ShouldNotBeNullOrEmpty();

            fixtureAction?.Invoke(fixture, vv);
        }
        public void FindsGitDirectoryInParent()
        {
            var childDir = Path.Combine(workDirectory, "child");

            Directory.CreateDirectory(childDir);

            try
            {
                var arguments = new Arguments {
                    TargetPath = childDir, NoFetch = true
                };
                var options = Options.Create(arguments);

                var gitPreparer               = new GitPreparer(log, environment, options);
                var configurationProvider     = new ConfigProvider(testFileSystem, log, configFileLocator, gitPreparer, configInitWizard);
                var baseVersionCalculator     = new BaseVersionCalculator(log, null);
                var mainlineVersionCalculator = new MainlineVersionCalculator(log, metaDataCalculator);
                var nextVersionCalculator     = new NextVersionCalculator(log, metaDataCalculator, baseVersionCalculator, mainlineVersionCalculator);
                var variableProvider          = new VariableProvider(nextVersionCalculator, environment);

                var gitVersionCalculator = new GitVersionCalculator(testFileSystem, log, configFileLocator, configurationProvider, buildServerResolver, gitVersionCache, gitVersionFinder, gitPreparer, variableProvider, options);

                gitVersionCalculator.CalculateVersionVariables();
            }
            catch (Exception ex)
            {
                // TODO I think this test is wrong.. It throws a different exception
                // `RepositoryNotFoundException` means that it couldn't find the .git directory,
                // any other exception means that the .git was found but there was some other issue that this test doesn't care about.
                Assert.IsNotAssignableFrom <RepositoryNotFoundException>(ex);
            }
        }
        public void TryGetVersion_GitError_ReturnsFalse()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner.RunCommand("describe --tags --long --match \"v[0-9]*\"", out ignored, out ignored)).Returns(1).AssignsOutAndRefParameters("testOutput", "testError");

            Assert.IsFalse(gitVersion.TryGetVersion(out string version));
        }
        public void TryGetVersion_GitError_LogsWarning()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner.RunCommand("describe --tags --long --match \"v[0-9]*\"", out ignored, out ignored)).Returns(1).AssignsOutAndRefParameters("testOutput", "testError");

            LogAssert.Expect(LogType.Warning, "Error running git: testError");

            gitVersion.TryGetVersion(out string version);
        }
        private GitVersionCalculator CreateGitVersionCalculator(out IGitRunner fakeGitRunner)
        {
            GitVersionCalculator gitVersionCalculator = new GitVersionCalculator();

            fakeGitRunner = A.Fake <IGitRunner>();
            gitVersionCalculator.GetType()
            .GetField(
                "gitRunner",
                System.Reflection.BindingFlags.NonPublic
                | System.Reflection.BindingFlags.Instance)
            .SetValue(gitVersionCalculator, fakeGitRunner);
            return(gitVersionCalculator);
        }
        public void TryGetBranch_GitError_ReturnsFalse()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-parse --abbrev-ref HEAD",
                         out ignored, out ignored))
            .Returns(1)
            .AssignsOutAndRefParameters("testOutput", "testError");

            Assert.IsFalse(gitVersion.TryGetBranch(out string branch));
        }
        public void TryGetVersion_GitGivesVersion_ReturnsTrue()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         "describe --tags --long --match \"v[0-9]*\"",
                         out ignored, out ignored))
            .Returns(0)
            .AssignsOutAndRefParameters("v1.2-3-g4ab59cb78", "");

            Assert.IsTrue(gitVersion.TryGetVersion(out string version));
        }
        public void TryGetTotalCommitsOnBranch_GitGivesCount_ReturnsTrue()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-list --count HEAD",
                         out ignored, out ignored))
            .Returns(0)
            .AssignsOutAndRefParameters("123", "");

            Assert.IsTrue(gitVersion.TryGetTotalCommitsOnBranch(out int number));
        }
        public void TryGetTotalCommitsOnBranch_GitError_ReturnsFalse()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-list --count HEAD",
                         out ignored, out ignored))
            .Returns(1)
            .AssignsOutAndRefParameters("testOutput", "testError");

            Assert.IsFalse(gitVersion.TryGetTotalCommitsOnBranch(out int number));
        }
        public void TryGetBranch_GitGivesBranch_ReturnsTrue()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-parse --abbrev-ref HEAD",
                         out ignored, out ignored))
            .Returns(0)
            .AssignsOutAndRefParameters("features/myBranch", "");

            Assert.IsTrue(gitVersion.TryGetBranch(out string branch));
        }
        public void TryGetTotalCommitsOnBranch_GitError_LogsWarning()
        {
            GitVersionCalculator gitVersion = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-list --count HEAD",
                         out ignored, out ignored))
            .Returns(1)
            .AssignsOutAndRefParameters("testOutput", "testError");

            LogAssert.Expect(LogType.Warning, "Error running git: testError");
            gitVersion.TryGetTotalCommitsOnBranch(out int number);
        }
        private GitVersionCalculator GetGitVersionCalculator(Arguments arguments)
        {
            var options = Options.Create(arguments);

            var gitPreparer               = new GitPreparer(log, environment, options);
            var stepFactory               = new ConfigInitStepFactory();
            var configInitWizard          = new ConfigInitWizard(new ConsoleAdapter(), stepFactory);
            var configurationProvider     = new ConfigProvider(fileSystem, log, configFileLocator, gitPreparer, configInitWizard);
            var baseVersionCalculator     = new BaseVersionCalculator(log, null);
            var mainlineVersionCalculator = new MainlineVersionCalculator(log, metaDataCalculator);
            var nextVersionCalculator     = new NextVersionCalculator(log, metaDataCalculator, baseVersionCalculator, mainlineVersionCalculator);
            var variableProvider          = new VariableProvider(nextVersionCalculator, new TestEnvironment());
            var gitVersionCalculator      = new GitVersionCalculator(fileSystem, log, configFileLocator, configurationProvider, buildServerResolver, gitVersionCache, gitVersionFinder, gitPreparer, variableProvider, options);

            return(gitVersionCalculator);
        }
        public void TryGetBranch_GitGivesBranch_BranchCorrect()
        {
            const string         expectedbranchName = "features/myBranch";
            GitVersionCalculator gitVersion         = CreateGitVersionCalculator(out IGitRunner gitRunner);
            string ignored = null;

            A.CallTo(() => gitRunner
                     .RunCommand(
                         @"rev-parse --abbrev-ref HEAD",
                         out ignored, out ignored))
            .Returns(0)
            .AssignsOutAndRefParameters(expectedbranchName, "");

            gitVersion.TryGetBranch(out string branch);
            Assert.AreEqual(expectedbranchName, branch);
        }
        public void FindsVersionInDynamicRepo(string name, string url, string targetBranch, string commitId, string expectedFullSemVer)
        {
            var root             = Path.Combine(workDirectory, name);
            var dynamicDirectory = Path.Combine(root, "D"); // dynamic, keeping directory as short as possible
            var workingDirectory = Path.Combine(root, "W"); // working, keeping directory as short as possible
            var arguments        = new Arguments
            {
                TargetUrl = url,
                DynamicRepositoryLocation = dynamicDirectory,
                TargetBranch = targetBranch,
                NoFetch      = false,
                TargetPath   = workingDirectory,
                CommitId     = commitId
            };
            var options = Options.Create(arguments);

            Directory.CreateDirectory(dynamicDirectory);
            Directory.CreateDirectory(workingDirectory);

            var testFileSystem      = new TestFileSystem();
            var log                 = new NullLog();
            var configFileLocator   = new DefaultConfigFileLocator(testFileSystem, log);
            var gitVersionCache     = new GitVersionCache(testFileSystem, log);
            var buildServerResolver = new BuildServerResolver(null, log);

            var metadataCalculator        = new MetaDataCalculator();
            var baseVersionCalculator     = new TestBaseVersionStrategiesCalculator(log);
            var mainlineVersionCalculator = new MainlineVersionCalculator(log, metadataCalculator);
            var nextVersionCalculator     = new NextVersionCalculator(log, metadataCalculator, baseVersionCalculator, mainlineVersionCalculator);
            var gitVersionFinder          = new GitVersionFinder(log, nextVersionCalculator);

            var gitPreparer      = new GitPreparer(log, new TestEnvironment(), options);
            var stepFactory      = new ConfigInitStepFactory();
            var configInitWizard = new ConfigInitWizard(new ConsoleAdapter(), stepFactory);

            var configurationProvider = new ConfigProvider(testFileSystem, log, configFileLocator, gitPreparer, configInitWizard);

            var variableProvider     = new VariableProvider(nextVersionCalculator, new TestEnvironment());
            var gitVersionCalculator = new GitVersionCalculator(testFileSystem, log, configFileLocator, configurationProvider, buildServerResolver, gitVersionCache, gitVersionFinder, gitPreparer, variableProvider, options);

            var versionVariables = gitVersionCalculator.CalculateVersionVariables();

            Assert.AreEqual(expectedFullSemVer, versionVariables.FullSemVer);
        }