//
        // Generates the final report
        //
        public static bool Generate(string reportName, RevisionList.Revisions revisions, SvnLogs.Log[] revisionLogs, ReviewState.GetCommitStatsResult commitStats, ReviewState.ReviewStatistics[] reviewStats, JiraState.JiraStatistics jiraStats, Logging logger, TimeSpan reviewTime)
        {
            // Start with the clean template
            string outputContent = Properties.Resources.ReportTemplate;

            try
            {
                // Spin through and update various sections
                outputContent = UpdateOverview(outputContent, reportName, revisionLogs, revisions.Url, reviewTime);
                outputContent = UpdateCommitStatistics(outputContent, commitStats);
                outputContent = UpdateReviewStatistics(outputContent, reviewStats);
                outputContent = UpdateAverageResults(outputContent, reviewStats);
                outputContent = UpdateJiraStatistics(outputContent, jiraStats);
                outputContent = UpdateReviewLists(outputContent, reviewStats);
                outputContent = UpdateJiraLists(outputContent, jiraStats);
                outputContent = UpdateCopyrightSection(outputContent);

                // Display the content
                DisplayReport(outputContent, reportName, revisions.Url);
            }
            catch (Exception e)
            {
                logger.Log("Exception raised when generating report\n\n{0}\n", e.Message);
            }

            // Done
            return(true);
        }
        //
        // Generates the report
        //
        private static bool CreateReviewReport(string reportName, RevisionList.Revisions revisions, SvnLogs.Log[] revisionLogs, ReviewState.GetCommitStatsResult commitStats, ReviewState.ReviewStatistics[] reviewStats, JiraState.JiraStatistics jiraStats, Stopwatch reviewTimer)
        {
            // We're now generating
            s_logger.Log("Starting to generate review report");
            Display.Start(Display.State.CreatingResults);

            // Try and generate the report
            bool generated = Report.Generate(reportName, revisions, revisionLogs, commitStats, reviewStats, jiraStats, s_logger, reviewTimer.Elapsed);

            if (generated == false)
            {
                s_errorMessage = @"Unable to generate the Review Report";
            }

            // Return our results
            return(generated);
        }
        //
        // Pulls out the logs for given revisions
        //
        private static SvnLogs.Log[] GetLogsFromRevisions(RevisionList.Revisions revisionsToLog)
        {
            // Starting to review logs
            s_logger.Log(@"Getting logs for\n{0}", revisionsToLog.Revision);
            Display.Start(Display.State.ExtractingLogs, revisionsToLog.Revision.Length);

            // Get our results
            SvnLogs.Log[] results = SvnLogs.GetRevisionLogs(revisionsToLog.Path, revisionsToLog.Revision, s_logger, (currentCount) =>
            {
                Display.Update(currentCount, revisionsToLog.Revision.Length);
            });

            // Did we fail?
            if (results == null)
            {
                s_errorMessage = @"Unable to get the logs for the revisions selected in " + revisionsToLog.Path;
            }

            // Return our results
            s_logger.Log(@"Logs recieved");
            return(results);
        }