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());
        }
    }
Пример #2
0
    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());
    }