0

我想以类似“报告”的格式导出变更集列表,其中作者、评论和文件已更改(只是文件名,而不是内容)。

我在 Windows 上使用 TortoiseHg。我怎样才能做到这一点?

4

2 回答 2

1

你想要什么样的格式?hg log与模板一起使用。Mercurial 为自定义输出提供了广泛的支持,并且在 Mercurial 书中有很好的记录。

于 2013-04-02T22:36:57.617 回答
0

所以我用 Powershell 解决了这个问题(和许多其他问题一样)。我根据 Mercurial 可以导出的补丁文件生成了一份 HTML 报告。

它当然不是完美的,但它工作得很好。典型的免责声明适用,使用此功能需您自担风险,如果您运行此功能等,我概不负责。

这是代码:

function Generate-PatchReport([string]$loc)
{
    $patchFiles = ls $loc -Filter "*.patch"

    $html = @()
    $html += "<html><head><title>Diff Report</title><style type=`"text/css`">body,table{font-family:Verdana;font-size:10pt}
table{border-collapse:collapse;margin:10px}
p{margin:0}
thead{font-weight:700}
td{border:1px solid gray;padding:5px}
.bin{background-color:#eee}
.add{background-color:#dfd}
.chg{background-color:#ffd}
.rem{background-color:#fdd}
hr{height:1px;background-color:#999;border:none;margin-top:15px;margin-bottom:15px}</style></head><body>"

    foreach($patch in $patchFiles)
    {
        $lines = gc $patch.FullName;

        # Get checkin notes
        $null, $null, $username = $lines[1].Split(' ')
        $datestamp = $lines[2].Split(' ')[2]

        $date = Get-Date -Year 1970 -Month 1 -Day 1 -Minute 0 -Hour 0 -Second 0 -Millisecond 0
        $date = $date.AddSeconds($datestamp)

        foreach($l in $lines)
        {
            if(!$l.StartsWith('#'))
            {
                $note = $l
                break;
            }
        }

        $html += '<p><strong>Note:</strong> ' + $note + '</p>'
        $html += "<p><strong>User:</strong> $username</p>"
        $html += "<p><strong>Timestamp:</strong> $($date.ToString("MM/dd/yyyy hh:mm tt")) UTC</p>"

        # Generate file reports
        $html += "<table><thead><td>Operation</td><td>File</td></thead>"
        for($i = 0; $i -lt $lines.Length; $i++)
        {
            if($lines[$i].StartsWith('diff'))
            {
                $html += "<tr>"
                $null, $null, $null, $null, $null, $filename = $lines[$i].Split(' ')

                if($lines[$i+1].Contains('Binary file'))
                {
                    $html += '<td class="bin">% Binary</td>'
                }
                elseif($lines[$i+1].Contains('/dev/null'))
                {
                    $html += '<td class="add">+ Add</td>'
                }
                elseif($lines[$i+2].Contains('/dev/null'))
                {
                    $html += '<td class="rem">- Remove</td>'
                }
                else
                {
                    $html += '<td class="chg">&bull; Change</td>'
                }
                $html += "<td>$filename</td>"
                $html += "</tr>"
            }
        }

        $html += "</table><hr />"
    }

    # Finalize HTML
    $html += "</body></html>"

    # Write the file to the same folder
    sc $html -Path ([System.IO.Path]::Combine($loc, "PatchReport.html"))
}
于 2013-04-02T18:39:52.853 回答