public void TestToString()
        {
            DateTime committerTime = DateTime.Now;
            DateTime authorTime = DateTime.Now;

            StringBuilder expectedHeader = new StringBuilder();

            expectedHeader.AppendLine("Author: Author");
            expectedHeader.AppendLine("AuthorTime: " + authorTime.ToString());
            expectedHeader.AppendLine("Committer: committer");
            expectedHeader.AppendLine("CommitterTime: " + committerTime.ToString());
            expectedHeader.AppendLine("Summary: test summary");
            expectedHeader.AppendLine();
            expectedHeader.Append("FileName: fileName.txt");

            GitBlameHeader header = new GitBlameHeader
            {
                Author = "Author",
                AuthorMail = "*****@*****.**",
                AuthorTime = authorTime,
                Committer = "committer",
                CommitterTime = committerTime,
                Summary = "test summary",
                FileName = "fileName.txt"
            };

            Assert.AreEqual(expectedHeader.ToString(), header.ToString());
        }
        public void TestEqualsFails()
        {
            GitBlameHeader header1 = new GitBlameHeader { Author = "Author" };
            GitBlameHeader header2 = new GitBlameHeader();

            Assert.IsFalse(header1.Equals(header2));
        }
        public void TestFindHeaderForCommitGuid()
        {
            GitBlame blame = new GitBlame();
            string expectedCommitGuid = Guid.NewGuid().ToString();

            GitBlameHeader expectedHeader = new GitBlameHeader { CommitGuid = expectedCommitGuid };

            blame.Headers.Add(expectedHeader);
            Assert.IsTrue(blame.FindHeaderForCommitGuid(expectedCommitGuid).Equals(expectedHeader));
        }
        public void TestGetColor()
        {
            string randomGuid = "b35a3233-8345-43aa-a618-2ca0de12000c";

            GitBlameHeader header = new GitBlameHeader { CommitGuid = randomGuid };

            Color expectedColor = Color.FromArgb(255, 246, 226, 238);

            Assert.AreEqual(expectedColor, header.GetColor());
        }
Beispiel #5
0
        public GitBlame Blame(string filename, string from, string lines, Encoding encoding)
        {
            from = FixPath(from);
            filename = FixPath(filename);
            string blameCommand = string.Format("blame --porcelain -M -w -l{0} \"{1}\" -- \"{2}\"", lines != null ? " -L " + lines : "", from, filename);
            var itemsStrings =
                RunCacheableCmd(
                    AppSettings.GitCommand,
                    blameCommand,
                    LosslessEncoding
                    )
                    .Split('\n');

            GitBlame blame = new GitBlame();

            GitBlameHeader blameHeader = null;
            GitBlameLine blameLine = null;

            for (int i = 0; i < itemsStrings.GetLength(0); i++)
            {
                try
                {
                    string line = itemsStrings[i];

                    //The contents of the actual line is output after the above header, prefixed by a TAB. This is to allow adding more header elements later.
                    if (line.StartsWith("\t"))
                    {
                        blameLine.LineText = line.Substring(1) //trim ONLY first tab
                                                 .Trim(new char[] { '\r' }); //trim \r, this is a workaround for a \r\n bug
                        blameLine.LineText = ReEncodeStringFromLossless(blameLine.LineText, encoding);
                    }
                    else if (line.StartsWith("author-mail"))
                        blameHeader.AuthorMail = ReEncodeStringFromLossless(line.Substring("author-mail".Length).Trim());
                    else if (line.StartsWith("author-time"))
                        blameHeader.AuthorTime = DateTimeUtils.ParseUnixTime(line.Substring("author-time".Length).Trim());
                    else if (line.StartsWith("author-tz"))
                        blameHeader.AuthorTimeZone = line.Substring("author-tz".Length).Trim();
                    else if (line.StartsWith("author"))
                    {
                        blameHeader = new GitBlameHeader();
                        blameHeader.CommitGuid = blameLine.CommitGuid;
                        blameHeader.Author = ReEncodeStringFromLossless(line.Substring("author".Length).Trim());
                        blame.Headers.Add(blameHeader);
                    }
                    else if (line.StartsWith("committer-mail"))
                        blameHeader.CommitterMail = line.Substring("committer-mail".Length).Trim();
                    else if (line.StartsWith("committer-time"))
                        blameHeader.CommitterTime = DateTimeUtils.ParseUnixTime(line.Substring("committer-time".Length).Trim());
                    else if (line.StartsWith("committer-tz"))
                        blameHeader.CommitterTimeZone = line.Substring("committer-tz".Length).Trim();
                    else if (line.StartsWith("committer"))
                        blameHeader.Committer = ReEncodeStringFromLossless(line.Substring("committer".Length).Trim());
                    else if (line.StartsWith("summary"))
                        blameHeader.Summary = ReEncodeStringFromLossless(line.Substring("summary".Length).Trim());
                    else if (line.StartsWith("filename"))
                        blameHeader.FileName = ReEncodeFileNameFromLossless(line.Substring("filename".Length).Trim());
                    else if (line.IndexOf(' ') == 40) //SHA1, create new line!
                    {
                        blameLine = new GitBlameLine();
                        var headerParams = line.Split(' ');
                        blameLine.CommitGuid = headerParams[0];
                        if (headerParams.Length >= 3)
                        {
                            blameLine.OriginLineNumber = int.Parse(headerParams[1]);
                            blameLine.FinalLineNumber = int.Parse(headerParams[2]);
                        }
                        blame.Lines.Add(blameLine);
                    }
                }
                catch
                {
                    //Catch all parser errors, and ignore them all!
                    //We should never get here...
                    AppSettings.GitLog.Log("Error parsing output from command: " + blameCommand + "\n\nPlease report a bug!");
                }
            }

            return blame;
        }
        public static GitBlame Blame(string filename, string from)
        {
            from = FixPath(from);
            filename = FixPath(filename);
            string blameCommand = string.Format("blame --porcelain -M -w -l \"{0}\" -- \"{1}\"", from, filename);
            var itemsStrings =
                RunCmd(
                    Settings.GitCommand,
                    blameCommand
                    )
                    .Split('\n');

            GitBlame blame = new GitBlame();

            GitBlameHeader blameHeader = null;
            GitBlameLine blameLine = null;

            for (int i = 0; i < itemsStrings.GetLength(0); i++)
            {
                try
                {
                    string line = itemsStrings[i];

                    //The contents of the actual line is output after the above header, prefixed by a TAB. This is to allow adding more header elements later.
                    if (line.StartsWith("\t"))
                        blameLine.LineText = line.Substring(1).Trim(new char[] { '\r' });//trim first tab
                    else
                        if (line.StartsWith("author-mail"))
                            blameHeader.AuthorMail = line.Substring("author-mail".Length).Trim();
                        else
                            if (line.StartsWith("author-time"))
                                blameHeader.AuthorTime = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(int.Parse(line.Substring("author-time".Length).Trim()));
                            else
                                if (line.StartsWith("author-tz"))
                                    blameHeader.AuthorTimeZone = line.Substring("author-tz".Length).Trim();
                                else
                                    if (line.StartsWith("author"))
                                    {
                                        blameHeader = new GitBlameHeader();
                                        blameHeader.CommitGuid = blameLine.CommitGuid;
                                        blameHeader.Author = line.Substring("author".Length).Trim();
                                        blame.Headers.Add(blameHeader);
                                    }
                                    else
                                        if (line.StartsWith("committer-mail"))
                                            blameHeader.CommitterMail = line.Substring("committer-mail".Length).Trim();
                                        else
                                            if (line.StartsWith("committer-time"))
                                                blameHeader.CommitterTime = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(int.Parse(line.Substring("committer-time".Length).Trim()));
                                            else
                                                if (line.StartsWith("committer-tz"))
                                                    blameHeader.CommitterTimeZone = line.Substring("committer-tz".Length).Trim();
                                                else
                                                    if (line.StartsWith("committer"))
                                                        blameHeader.Committer = line.Substring("committer".Length).Trim();
                                                    else
                                                        if (line.StartsWith("summary"))
                                                            blameHeader.Summary = line.Substring("summary".Length).Trim();
                                                        else
                                                            if (line.StartsWith("filename"))
                                                                blameHeader.FileName = line.Substring("filename".Length).Trim();
                                                            else
                                                                if (line.IndexOf(' ') == 40) //SHA1, create new line!
                                                                {
                                                                    blameLine = new GitBlameLine();
                                                                    blameLine.CommitGuid = line.Substring(0, 40);
                                                                    blame.Lines.Add(blameLine);
                                                                }
                }
                catch
                {
                    //Catch all parser errors, and ignore them all!
                    //We should never get here...
                    Settings.GitLog.Log("Error parsing output from command: " + blameCommand + "\n\nPlease report a bug!");
                }
            }

            return blame;
        }
        void BlameFile_MouseMove(object sender, MouseEventArgs e)
        {
            if (_blame == null)
                return;

            int line = BlameFile.GetLineFromVisualPosY(e.Y);

            if (line >= _blame.Lines.Count)
                return;

            GitBlameHeader blameHeader = _blame.FindHeaderForCommitGuid(_blame.Lines[line].CommitGuid);

            if (blameHeader != lastBlameHeader)
            {
                BlameCommitter.ClearHighlighting();
                BlameFile.ClearHighlighting();
                int startLine = -1;
                int prevLine = -1;
                for (int i = 0; i < _blame.Lines.Count; i++)
                {
                    if (_blame.Lines[i].CommitGuid == blameHeader.CommitGuid)
                    {
                        if (prevLine != i - 1 && startLine != -1)
                        {
                            BlameCommitter.HighlightLines(startLine, prevLine, Color.FromArgb(225, 225, 225));
                            BlameFile.HighlightLines(startLine, prevLine, Color.FromArgb(225, 225, 225));
                            startLine = -1;
                        }

                        prevLine = i;
                        if (startLine == -1)
                            startLine = i;
                    }
                }
                if (startLine != -1)
                {
                    BlameCommitter.HighlightLines(startLine, prevLine, Color.FromArgb(225, 225, 225));
                    BlameFile.HighlightLines(startLine, prevLine, Color.FromArgb(225, 225, 225));
                }
                BlameCommitter.Refresh();
                BlameFile.Refresh();
                lastBlameHeader = blameHeader;
            }
        }
 public void TestConstructor()
 {
     GitBlameHeader header = new GitBlameHeader();
     Assert.IsNotNull(header);
 }
        void BlameFile_MouseMove(object sender, MouseEventArgs e)
        {
            if (Blame == null)
                return;

            int line = BlameFile.GetLineFromVisualPosY(e.Y);

            if (line >= Blame.Lines.Count)
                return;

            GitBlameHeader blameHeader = Blame.FindHeaderForCommitGuid(Blame.Lines[line].CommitGuid);

            if (blameHeader == lastBlameHeader)
                return;
            BlameCommitter.ClearHighlighting();
            BlameFile.ClearHighlighting();
            for (int i = 0; i < Blame.Lines.Count; i++)
            {
                if (Blame.Lines[i].CommitGuid != blameHeader.CommitGuid)
                    continue;
                Color blameColor = Color.FromArgb(225, 225, 225);
                BlameCommitter.HighlightLine(i, blameColor);
                BlameFile.HighlightLine(i, blameColor);
            }
            BlameCommitter.Refresh();
            BlameFile.Refresh();
            lastBlameHeader = blameHeader;
        }