public override void ExecuteBuild() { var Filename = ParseParamValue("File", "//depot/UE4/Engine/Source/Runtime/PakFile/Public/IPlatformFilePak.h"); var OutFilename = ParseParamValue("Out"); LogInformation("Creating blame file for {0}", Filename); P4Connection.BlameLineInfo[] Result = null; if (ParseParam("Timelapse")) { Result = P4.Timelapse(Filename); } else { Result = P4.Blame(Filename); } var BlameResult = new StringBuilder(); foreach (var BlameLine in Result) { var ResultLine = String.Format("#{0} in {1} by {2}: {3}", BlameLine.Revision.Revision, BlameLine.Revision.Changelist, BlameLine.Revision.User, BlameLine.Line); LogInformation(ResultLine); BlameResult.AppendLine(ResultLine); } if (String.IsNullOrEmpty(OutFilename) == false) { WriteAllText(OutFilename, BlameResult.ToString()); } }
public override void ExecuteBuild() { Log("************************** BlameKeyword"); var Extensions = new HashSet <string>(KnownExtensions, StringComparer.InvariantCultureIgnoreCase); var PathToSearch = ParseParamValue("Path", CombinePaths(CmdEnv.LocalRoot, "Engine", "Source", "Runtime")); var Keywords = ParseParamValue("Keywords", "@todo,@fixme").Split(','); var bUseTimelapse = ParseParam("Timelapse"); var OutFilename = ParseParamValue("Out", CombinePaths(CmdEnv.LogFolder, "BlameKeywordsOut.csv")); if (IsNullOrEmpty(Keywords)) { throw new AutomationException("No keywords to look for"); } Log("Path={0}", PathToSearch); Log("Keywords={0}", String.Join(",", Keywords)); Log("Timelapse={0}", bUseTimelapse); Log("Out={0}", OutFilename); // Find files to search var FilenamesToSearch = new List <string>(); var DirInfo = new DirectoryInfo(PathToSearch); if (DirInfo.Exists) { var FoundFiles = Directory.GetFiles(DirInfo.FullName, "*", SearchOption.AllDirectories); foreach (var Filename in FoundFiles) { var Ext = Path.GetExtension(Filename); if (Extensions.Contains(Ext)) { FilenamesToSearch.Add(Filename); } } } else { var FilenameInfo = new FileInfo(PathToSearch); if (FilenameInfo.Exists) { FilenamesToSearch.Add(FilenameInfo.FullName); } } if (IsNullOrEmpty(FilenamesToSearch)) { throw new AutomationException("No files found in {0}", PathToSearch); } // Crate a csv based on search results. var BlameCSV = new StringBuilder(); BlameCSV.AppendLine("Keyword;Filename;Line No;User;Revision;Changelist;Date;Line Contents"); foreach (var Filename in FilenamesToSearch) { var FileContents = ReadAllLines(Filename); P4Connection.BlameLineInfo[] BlameInfo = null; for (int LineIndex = 0; LineIndex < FileContents.Length; ++LineIndex) { var Line = FileContents[LineIndex]; var KeywordIndex = ContainsAnyKeyword(Line, Keywords); if (KeywordIndex >= 0) { if (BlameInfo == null) { BlameInfo = bUseTimelapse ? P4.Timelapse(Filename) : P4.Blame(Filename); } if (IsNullOrEmpty(BlameInfo) == false && LineIndex < BlameInfo.Length) { var LineInfo = BlameInfo[LineIndex]; // In case this isn't the first revision of this line, look at previous // revisions to find the first revision where the keyword was added. foreach (var PreviousLineRevision in LineInfo.PreviousRevisions) { if (ContainsAnyKeyword(PreviousLineRevision.Line, Keywords) >= 0) { LineInfo = PreviousLineRevision; break; } } var Blame = String.Format("\"{0}\";\"{1}\";{2};{3};{4};{5};{6};\"{7}\"", Keywords[KeywordIndex], Filename, LineIndex + 1, LineInfo.Revision.User, LineInfo.Revision.Revision, LineInfo.Revision.Changelist, LineInfo.Revision.Date, Line); BlameCSV.AppendLine(Blame); } } } } // Write out the csv Log("Creating blame csv: {0}", OutFilename); WriteAllText(OutFilename, BlameCSV.ToString()); }