public async Task <CodeRepositoryInfo> GetInfo(string path, string revisionIdentifier)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException(nameof(path));
            }

            if (revisionIdentifier == null)
            {
                throw new ArgumentNullException(nameof(revisionIdentifier));
            }

            var info = await this.ExecuteXml("info", "", $"{path}@{revisionIdentifier}");

            if (info == null)
            {
                return(null);
            }

            var result            = new CodeRepositoryInfo();
            var revisionAttribute = info.Descendants("entry")
                                    .Select(s => s.Attribute("revision"))
                                    .SingleOrDefault();

            if (revisionAttribute != null)
            {
                result.RevisionIdentifier = revisionAttribute.Value;
            }

            var authorValue = info.Descendants("author").Select(s => s.Value).FirstOrDefault();

            if (authorValue != null)
            {
                result.Author = authorValue;
            }

            if (_project.RepositorySettings.ContainsKey("compat") && _project.RepositorySettings["compat"] == "github")
            {
                // svn propget git-commit --revprop -r $newRev $url
                var gitInfo = await this.ExecuteXml("propget git-commit", $"--revprop -r {result.RevisionIdentifier}", path);

                var commitHash = gitInfo.Descendants("property")
                                 .Where(x => x.Attribute("name").Value == "git-commit")
                                 .Select(s => s.Value)
                                 .FirstOrDefault();

                //TODO: Get this into CodeRepositoryInfo somehow
            }

            return(result);
        }
Example #2
0
        public void TestStartProcessCreatesEnvironmentVariables()
        {
            var writer = new Mock.MockBuildOutputWriter()
            {
                PrefixSeverity = false
            };

            var agentOptions = new BuildAgentOptions()
            {
                AgentIdentifier  = "AgentID",
                ConcurrentBuilds = 1,
                WorkingPath      = "WorkingPath"
            };

            var codeInfo = new CodeRepositoryInfo()
            {
                Author             = "Author",
                RevisionIdentifier = "RevIdent"
            };

            var buildEntry = new BuildQueueEntry()
            {
                BuildNumber = 999
            };

            var project = new BuildProjectConfiguration()
            {
                ProjectID      = Guid.NewGuid(),
                Name           = "TestProject",
                RepositoryType = "svn",
                RepositoryPath = "repo-path",
                Variables      = new Dictionary <string, string>()
                {
                    { "VarTest", "123" }
                }
            };

            using (var env = new BuildEnvironment("C:\\Build", writer))
            {
                env.AddAgentVariables(agentOptions);
                env.AddCodeInfoVariables(codeInfo);
                env.AddGlobalVariables();
                env.AddQueueEntryVariables(buildEntry);
                env.AddProjectConfigurationVariables(project);

                var resultCode = env.StartProcessAsync("cmd.exe", "/c set").Result;

                Assert.AreEqual(0, resultCode);
            }

            var vars = new Dictionary <string, string>();

            using (var reader = new System.IO.StringReader(writer.StringWriter.ToString()))
            {
                string line;
                while (true)
                {
                    line = reader.ReadLine();
                    if (line == null)
                    {
                        break;
                    }

                    var parts = line.Split(new char[] { '=' }, 2);

                    vars.Add(parts[0], parts[1]);
                }
            }

            Assert.AreEqual("true", vars["CI"]);
            Assert.AreEqual("C:\\Build", vars["CI_WORKINGPATH"]);

            Assert.AreEqual(Environment.MachineName, vars["CI_AGENTHOST"]);
            Assert.AreEqual(agentOptions.AgentIdentifier, vars["CI_AGENTIDENTIFIER"]);

            Assert.AreEqual(codeInfo.RevisionIdentifier, vars["CI_REVISIONIDENTIFIER"]);
            Assert.AreEqual(codeInfo.Author, vars["CI_REVISIONAUTHOR"]);

            Assert.IsNotNull(vars["CI_BUILDDATE"]);
            Assert.IsNotNull(vars["CI_BUILDDATETIME"]);

            Assert.AreEqual(project.NextBuildNumber, int.Parse(vars["CI_BUILDNUMBER"]));

            Assert.AreEqual(project.ProjectID.ToString(), vars["CI_PROJECTID"]);
            Assert.AreEqual(project.Name, vars["CI_PROJECTNAME"]);
            Assert.AreEqual(project.RepositoryType, vars["CI_REPOSITORYTYPE"]);
            Assert.AreEqual(project.RepositoryPath, vars["CI_REPOSITORYPATH"]);
            Assert.AreEqual(project.Variables["VarTest"], vars["CI_VARTEST"]);
        }