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()); }
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; }