分享私房小工具程式。

正式上線流程常需交付程式碼清單及異動程式碼,過去 TFS TFVC 時代我寫過類似的工具,改用 Git 之後,先前已分享過匯出 Git Commit 檔案並維持資料夾結構的寫法,當時是使用 PowerShell 加 xcopy。這回想更上層樓,兩個願望一次滿足 - 依資料夾結構放置異動檔案並產生 Excel 清單。評估後決定用 Git.exe + PowerShell 聯手完成。

拿前幾天的 ASP.NET Core CRUD 傻瓜範例的 Github 專案來練習,我又加了兩次 Commit (330d888 新增 wwwroot/Help.html、412f446 刪除 favicon.ico) 共計九次 Commit。假設我曾在 Scaffolding 產生 CRUD 介面 (Commit 39f7a8d,Tag InitDeploy) 時部署過一次,故這次要提交 39f7a8d 到 412f446 (HEAD) 之間累積的修改異動。使用 git diff --name-status commitId1 commitId2 可以產生兩次 Commit 間的檔案變化及檔案路徑,第一欄為狀態: M 表示 Modified、A 表示 Added、D 表示 Deleted,git diff 結果即為上次部署到目前異動過的檔案: (註:完整狀態包含 Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), Type Chageed (i.e. regular file, symlink, submodule, …​) (T), Unmerged (U), Unknown (X), Pairing Broken (B),目前我先關注 A、D、M 三種,其餘日後遇到再說,參考)

加上導向 Pipeline 將 git diff 結果存入 CodeList.txt:

git diff --name-status 39f7a8d HEAD > D:\CodeList.txt

CodeList.txt 可人工編輯增減項目,保留修改彈性在實務上挺重要的(本例中我便移除了 .gitignore 及 README.md),修校過的清單文字檔即為產生程式清單及複製檔案的依據。我寫了以下的 PowerShell,讀取 CodeList.txt 產生 CodeList.csv 並將檔案依其資料夾結構複製到指定的資料夾:

param (
    [Parameter(Mandatory=$True)]
    [string] $diffFile,
    [Parameter(Mandatory=$True)]
    [string] $srcFolder,
    [Parameter(Mandatory=$True)]
    [string] $targetFolder,
    [Parameter(Mandatory=$True)]
    [string] $resultFolder
)

#讀取 git diff --name-status 結果
$files = Get-Content $diffFile -Encoding UTF8

#清單陣列
$list = @()

foreach ($file in $files)
{
    #使用 .NET Regex 解析取出狀態及路徑
    $match = [System.Text.RegularExpressions.Regex]::Match($file, "^(?<s>[ACDMRTUXB])\s+(?<p>.+)$")
    if (-not $match.Success) { continue }

    $relFilePath = $match.Groups["p"].Value.Replace("/", "\")
    $status = $match.Groups["s"].Value.Replace("A", "新增").Replace("M", "修改").Replace("D", "刪除")
    
    #產生程式碼清單
    $object = New-Object PSObject -Property @{
        Path = $relFilePath
        Desc = ""
        Status = $status
        Remark = ""
    }
    $list += $object
    
    #複製檔案
	if  ($status -ne "刪除") {
	    #小技巧:New-Item 可一次產生所需的目錄階層,取代逐層檢查目錄是否存在及建立
		New-Item -ItemType File -Path "$targetFolder\$relFilePath" -Force | Out-Null
		Copy-Item "$srcFolder\$relFilePath" "$targetFolder\$relFilePath" -Force | Out-Null
	}
}

#產生CSV
$list | 
Select @{N='路徑';E={$_.Path}},@{N='說明';E={$_.Desc}},@{N='狀態';E={$_.Status}},@{N='備註';E={$_.Remark}} | 
Export-Csv "$resultFolder\CodeList.csv" -Encoding UTF8 -NoTypeInformation

執行方式如下:

以 Excel 開啟 CodeList.csv,補上說明可作為程式清單文件:

對映的程式檔也依原有目錄結構擺放完畢:

就醬,把一項繁瑣手工半自動化,心中升起自己正在"增進人類全體之生活"的錯覺,還累積了一些 PowerShell 開發經驗,敲開薰。

Example of using PowerShell to genereate code list Excel document from git diff result.


Comments

Be the first to post a comment

Post a comment