示例#1
0
        /// <summary>
        /// Attempts to check if the repository has uncommitted changes.
        /// </summary>
        /// <param name="gitRunner"></param>
        /// <param name="logger"></param>
        /// <returns></returns>
        public static GitInfo GetGitStatus(IGitRunner gitRunner, ITaskLogger logger)
        {
            GitInfo status = new GitInfo();

            try
            {
                string statusText = gitRunner.GetTextFromProcess(GitArgument.Status);
                Match  match      = StatusBranchSearch.Match(statusText);
                if (match.Success && match.Groups.Count > 1)
                {
                    string branch = match.Groups[1].Value;
                    status.Branch = branch;
                }
                else
                {
                    Match detatchedMatch = DetatchedBranchSearch.Match(statusText);
                    if (detatchedMatch.Success && detatchedMatch.Groups.Count > 1)
                    {
                        string branch = detatchedMatch.Groups[1].Value;
                        status.Branch = branch;
                        if (branch.StartsWith("pull/"))
                        {
                            status.IsPullRequest = true;
                        }
                    }
                }
                if (string.IsNullOrWhiteSpace(status.Branch))
                {
                    logger.LogMessage(MessageImportance.High, $"Unable to retrieve branch name from status text: \n{statusText}");
                }
                statusText = statusText.ToUpper();
                if (statusText.Contains(UnmodifiedText) || statusText.Contains(UntrackedOnlyText))
                {
                    status.Modified = "Unmodified";
                }
                else
                {
                    status.Modified = "Modified";
                }
            }
            catch (GitRunnerException ex)
            {
                logger?.LogWarning($"Error getting 'git status': {ex.Message}");
            }
            try
            {
                status.OriginUrl = gitRunner.GetTextFromProcess(GitArgument.OriginUrl);
                if (status.OriginUrl != null && status.OriginUrl.Length > 0)
                {
                    status.GitUser = GetGitHubUser(status.OriginUrl);
                }
            }
            catch (GitRunnerException ex)
            {
                logger?.LogWarning($"Error getting git origin URL: {ex.Message}");
            }
            return(status);
        }
示例#2
0
        /// <inheritdoc/>
        public string GetTextFromProcess(GitArgument command)
        {
            string outText = null;
            string arg     = GetArg(command);

            try
            {
                using (Process process = new Process())
                {
                    process.StartInfo = new ProcessStartInfo(Command, arg)
                    {
                        UseShellExecute        = false,
                        WorkingDirectory       = this.WorkingDirectory,
                        RedirectStandardOutput = true
                    };
                    process.Start();
                    bool exited = process.WaitForExit(1000);
                    if (!exited || !process.HasExited)
                    {
                        Logger?.LogWarning($"Process '{command} {arg}' timed out, killing.");
                        process.Kill();
                    }
                    outText = process.StandardOutput.ReadToEnd()?.Trim();
                }
            }
            catch (Exception ex)
            {
                throw new GitRunnerException(ex.Message, ex);
            }
            return(outText);
        }
示例#3
0
        /// <summary>
        /// Attempts to check if the repository has uncommitted changes.
        /// </summary>
        /// <param name="gitRunner"></param>
        /// <param name="logger"></param>
        /// <returns></returns>
        public static GitInfo GetGitStatus(IGitRunner gitRunner, ITaskLogger logger)
        {
            GitInfo status = new GitInfo();

            try
            {
                string statusText = gitRunner.GetTextFromProcess(GitArgument.Status);
                Match  match      = StatusBranchSearch.Match(statusText);
                if (match.Success && match.Groups.Count > 1)
                {
                    string branch = match.Groups[1].Value;
                    status.Branch = branch;
                }
                statusText = statusText.ToUpper();
                if (statusText.Contains(UnmodifiedText) || statusText.Contains(UntrackedOnlyText))
                {
                    status.Modified = "Unmodified";
                }
                else
                {
                    status.Modified = "Modified";
                }
            }
            catch (GitRunnerException ex)
            {
                logger?.LogWarning($"Error getting 'git status': {ex.Message}");
            }
            try
            {
                status.OriginUrl = gitRunner.GetTextFromProcess(GitArgument.OriginUrl);
                if (status.OriginUrl != null && status.OriginUrl.Length > 0)
                {
                    status.GitUser = GetGitHubUser(status.OriginUrl);
                }
            }
            catch (GitRunnerException ex)
            {
                logger?.LogWarning($"Error getting git origin URL: {ex.Message}");
            }
            return(status);
        }
示例#4
0
 /// <summary>
 /// Attempts to retrieve the git commit hash using the 'git' program.
 /// </summary>
 /// <param name="gitRunner"></param>
 /// <param name="logger"></param>
 /// <param name="commitHash"></param>
 /// <returns></returns>
 public static bool TryGetGitCommit(IGitRunner gitRunner, ITaskLogger logger, out string commitHash)
 {
     commitHash = null;
     try
     {
         string outText = gitRunner.GetTextFromProcess(GitArgument.CommitHash);
         if (outText.Length > 0)
         {
             commitHash = outText;
             return(true);
         }
     }
     catch (GitRunnerException ex)
     {
         logger?.LogWarning($"Error getting commit hash from 'git' command: {ex.Message}");
     }
     return(false);
 }
        /// <summary>
        /// Parses the assembly version from the given file.
        /// </summary>
        /// <param name="assemblyFile"></param>
        /// <param name="errorOnMismatch"></param>
        /// <returns></returns>
        public AssemblyInfoData ParseAssembly(string assemblyFile, bool errorOnMismatch)
        {
            string       assemblyVersionStart      = "[assembly: AssemblyVersion";
            string       assemblyFileVersionStart  = "[assembly: AssemblyFileVersion";
            string       assemblyVersionString     = null;
            string       assemblyFileVersionString = null;
            int          asmVerLineNum             = 0;
            int          asmFileVerLineNum         = 0;
            int          asmVerStartColumn;
            int          asmVerEndColumn;
            int          asmFileVerStartColumn;
            int          asmFileVerEndColumn;
            FilePosition asmVerPosition     = default;
            FilePosition asmFileVerPosition = default;
            string       line;
            int          currentLine         = 1;
            string       assemblyVersion     = null;
            string       assemblyFileVersion = null;

            if (!File.Exists(assemblyFile))
            {
                throw new FileNotFoundException("Could not find AssemblyInfo: " + assemblyFile);
            }
            using (StreamReader assemblyStream = new StreamReader(assemblyFile))
            {
                while ((line = assemblyStream.ReadLine()) != null)
                {
                    if (line.Trim().StartsWith(assemblyVersionStart))
                    {
                        assemblyVersionString = line;
                        asmVerLineNum         = currentLine;
                    }
                    if (line.Trim().StartsWith(assemblyFileVersionStart))
                    {
                        assemblyFileVersionString = line;
                        asmFileVerLineNum         = currentLine;
                    }
                    currentLine++;
                }
            }
            if (!string.IsNullOrEmpty(assemblyVersionString))
            {
                asmVerStartColumn = assemblyVersionString.IndexOf('"') + 1;
                asmVerEndColumn   = assemblyVersionString.LastIndexOf('"');
                asmVerPosition    = new FilePosition(asmVerLineNum, asmVerStartColumn + 1, asmVerEndColumn + 1);
                if (asmVerStartColumn > 0 && asmVerEndColumn > 0)
                {
                    assemblyVersion = assemblyVersionString.Substring(asmVerStartColumn, asmVerEndColumn - asmVerStartColumn);
                }
            }
            else
            {
                if (FailOnError)
                {
                    throw new ParsingException(null, MessageCodes.GetAssemblyInfo.AssemblyFileVersionParseFail,
                                               "", assemblyFile, 0, 0, 0, 0, "Unable to parse the AssemblyVersion from {0}", assemblyFile);
                }
                Logger.LogWarning(null, MessageCodes.GetAssemblyInfo.AssemblyFileVersionParseFail,
                                  "", assemblyFile, 0, 0, 0, 0, "Unable to parse the AssemblyVersion from {0}", assemblyFile);
                return(AssemblyInfoData.AssemblyVersionError());
            }

            if (!string.IsNullOrEmpty(assemblyFileVersionString))
            {
                asmFileVerStartColumn = assemblyFileVersionString.IndexOf('"') + 1;
                asmFileVerEndColumn   = assemblyFileVersionString.LastIndexOf('"');
                int lenth = asmFileVerEndColumn - asmFileVerStartColumn;
                if (asmFileVerStartColumn > 0 && asmFileVerEndColumn > 0 && lenth > 0)
                {
                    assemblyFileVersion = assemblyFileVersionString.Substring(asmFileVerStartColumn, asmFileVerEndColumn - asmFileVerStartColumn);
                    if (assemblyVersion != assemblyFileVersion)
                    {
                        string message = "AssemblyVersion {0} does not match AssemblyFileVersion {1} in {2}";
                        if (errorOnMismatch)
                        {
                            throw new ParsingException(null, MessageCodes.GetAssemblyInfo.AssemblyVersionMismatch,
                                                       "", assemblyFile, asmFileVerLineNum, asmFileVerStartColumn + 1, asmFileVerLineNum,
                                                       asmFileVerEndColumn + 1, message, assemblyVersion, assemblyFileVersion, assemblyFile);
                        }
                        Logger.LogWarning(null, MessageCodes.GetAssemblyInfo.AssemblyVersionMismatch,
                                          "", assemblyFile, asmFileVerLineNum, asmFileVerStartColumn + 1, asmFileVerLineNum,
                                          asmFileVerEndColumn + 1, message, assemblyVersion, assemblyFileVersion, assemblyFile);
                    }
                }
                else
                {
                    asmFileVerStartColumn = Math.Max(0, asmFileVerStartColumn);
                    asmFileVerEndColumn   = asmFileVerStartColumn;
                    string message = "Unable to parse the AssemblyFileVersion from {0}";
                    if (errorOnMismatch)
                    {
                        throw new ParsingException(null, MessageCodes.GetAssemblyInfo.AssemblyFileVersionParseFail,
                                                   "", assemblyFile, asmFileVerLineNum, asmFileVerStartColumn,
                                                   asmFileVerLineNum, asmFileVerEndColumn, message, assemblyFile);
                    }
                    Logger.LogWarning(null, MessageCodes.GetAssemblyInfo.AssemblyFileVersionParseFail,
                                      "", assemblyFile, asmFileVerLineNum, asmFileVerStartColumn, asmFileVerLineNum,
                                      asmFileVerEndColumn, message, assemblyFile);
                }
                asmFileVerPosition = new FilePosition(asmFileVerLineNum, asmFileVerStartColumn, asmFileVerEndColumn);
            }
            return(new AssemblyInfoData(assemblyVersion, assemblyFileVersion, asmVerPosition, asmFileVerPosition));
        }