成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 Swift 中編寫腳本:Git Hooks

移動(dòng)開發(fā) iOS
在本例中,我使用了 commit-msg 鉤子,它能夠在當(dāng)前提交信息生效前修改此信息。鉤子由一個(gè)參數(shù)調(diào)用,該參數(shù)是指向包含用戶輸入的提交消息的文件的路徑。這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內(nèi)容,然后寫回調(diào)用掛鉤的文件。

前言

這周,我決定完成因?yàn)楣ぷ鞫七t了一周的TODO事項(xiàng)來改進(jìn)我的Git工作流程。

為了在提交的時(shí)候盡可能多的攜帶上下文信息,我們讓提交信息包含了正在處理的JIRA編號(hào)。這樣,將來如果有人回到我們現(xiàn)在正在提交的源代碼,輸入??git blame??,就能很容易的找出JIRA的編號(hào)。

每次提交都包含這些信息可能會(huì)有點(diǎn)乏味(如果你使用了類似TDD[1]之類的方法,您會(huì)提交的更加頻繁),而且,盡管像Tower[2]這樣的git客戶端會(huì)讓此變得容易一些,但是您仍然需要手動(dòng)將問題編號(hào)復(fù)制粘貼到提交消息中,并且記住這樣做,這是我最難以解決的問題??。

出于這個(gè)原因,我開始尋求了解git hooks,試圖自動(dòng)化這項(xiàng)任務(wù)。我的想法是能夠從git分支獲取JIRA編號(hào)(我們有一個(gè)分支命名約定,形如:story/ISSUE-1234_branch-name),然后將提交消息更改為以JIRA編號(hào)為前綴,從而生成最終結(jié)果消息:ISSUE-1234-其他原本的提交信息。

用git hooks自動(dòng)生成提交信息

?Git Hooks[3] 提供了一種在運(yùn)行某些重要的git命令時(shí)觸發(fā)自定義操作的方法,例如在一次commit或者push之前執(zhí)行一些操作。

在本例中,我使用了 commit-msg 鉤子,它能夠在當(dāng)前提交信息生效前修改此信息。鉤子由一個(gè)參數(shù)調(diào)用,該參數(shù)是指向包含用戶輸入的提交消息的文件的路徑。這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內(nèi)容,然后寫回調(diào)用掛鉤的文件。

要?jiǎng)?chuàng)建git鉤子,我們需要在 .git/hooks? 路經(jīng)下提供一個(gè)可執(zhí)行腳本。我的鉤子放在了 .git/hooks/commit-msg 路經(jīng)之下。

為什么我使用Swift?

Git hooks可以使用任何你熟悉的,并且在主機(jī)上安裝了解釋器(通過shebang來指定)的腳本語言來編寫。

雖然有很多更受歡迎的選項(xiàng),比如bash?、ruby等等,但我還是決定使用Swift。因?yàn)槲覍wift更熟悉,因?yàn)槲颐刻於荚谑褂盟椅艺娴姆浅O矚g它強(qiáng)大的類型語法以及低內(nèi)存占用。

讓我們開始吧

你可以使用任何你喜歡的IDE編寫Swift腳本。但是如果你想要有適當(dāng)?shù)拇a補(bǔ)全以及調(diào)試能力,你可以為其創(chuàng)建一個(gè)Xcode項(xiàng)目。為此,在 macOS? 下選擇 Command Line Tool 創(chuàng)建一個(gè)新的項(xiàng)目。

圖片

在創(chuàng)建的文件頂部加上Swift shebang,引入Foundation庫。

#!/usr/bin/swift
import Foundation

這樣當(dāng)git執(zhí)行文件時(shí),shebang將確保使用文件作為輸入數(shù)據(jù)調(diào)用/usr/bin/swift二進(jìn)制文件。

編寫git鉤子

項(xiàng)目已經(jīng)全部設(shè)置好,所以現(xiàn)在可以編寫git掛鉤了。讓我們走完所有的步驟。

檢索提交消息

要做的第一件事就是從腳本傳進(jìn)來的參數(shù)檢索臨時(shí)提交文件的路徑然后讀取文件內(nèi)容。

let commitMessageFile = CommandLine.arguments[1]
guard let data = FileManager.default.contents(atPath: commitMessageFile),
let commitMessage = String(data: data, encoding: .utf8) else {
exit(1)
}

在上面的代碼片段中,我們首先拿到了提交文件的路徑(git?傳遞給腳本),然后通過FileManagerAPI?讀取了文件內(nèi)容。如果因?yàn)橐恍┰驒z索失敗了,我們退出(exit?)腳本同時(shí)返回狀態(tài)碼1,這將告訴git終止此次提交。

注意:

根據(jù)git hooks文檔,如果任何鉤子腳本返回的狀態(tài)碼大于??0??,它都將終止即將要要發(fā)生的操作。這將在本文后面的部分中使用,以便在不需要做任何修改而優(yōu)雅地退出。

檢索問題編號(hào)

既然提交信息的字符串已經(jīng)可用,接下來就需要找到當(dāng)前分支并從中檢索到問題編號(hào)。正如本文前面提到的,這只可能是因?yàn)閳F(tuán)隊(duì)對分支命名的嚴(yán)格格式,在其名稱中始終包含JIRA編號(hào)(例如,story/ISSUE-1234_some-awesome-feature-work)。

為了實(shí)現(xiàn)這一點(diǎn),我們必須檢索當(dāng)前的工作分支,然后用正則表達(dá)式從中檢索問題編號(hào)。

讓我們從添加腳本調(diào)用zsh shell?命令的能力開始。通過使用Process?api,腳本可以與git命令行界面交互。

func shell(_ command: String) -> String {
let task = Process()
let outputPipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = outputPipe
task.standardError = errorPipe
task.arguments = ["-c", command]
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
do {
try task.run()
task.waitUntilExit()
} catch {
print("There was an error running the command: \(command)")
print(error.localizedDescription)
exit(1)
}
guard let outputData = try? outputPipe.fileHandleForReading.readToEnd(),
let outputString = String(data: outputData, encoding: .utf8) else {
// Print error if needed
if let errorData = try? errorPipe.fileHandleForReading.readToEnd(),
let errorString = String(data: errorData, encoding: .utf8) {
print("Encountered the following error running the command:")
print(errorString)
}
exit(1)
}
return outputString
}

現(xiàn)在實(shí)現(xiàn)了shell?命令,那么就可以使用它詢問git當(dāng)前分支是什么,然后盡可能的從中提取出問題編號(hào)。

let gitBranchName = shell("git rev-parse --abbrev-ref HEAD")
.trimmingCharacters(in: .newlines)
let stringRange = NSRange(location: 0, length: gitBranchName.utf16.count)
guard let regex = try? NSRegularExpression(pattern: #"(\w*-\d*)"#, options: .anchorsMatchLines),
let match = regex.firstMatch(in: gitBranchName, range: stringRange) else {
exit(0)
}
let range = match.range(at: 1)
let ticketNumber = (gitBranchName as NSString)
.substring(with: range)
.trimmingCharacters(in: .newlines)

請注意,如果沒有匹配項(xiàng)(即分支名稱中不包含JIRA問題編號(hào)),腳本將以0的狀態(tài)退出,允許提交繼續(xù)進(jìn)行,而不進(jìn)行任何更改。這是為了不破壞諸如main或其他測試/調(diào)查分支中的工作流。

修改提交信息

為了更改提交消息,必須將腳本開頭讀取的文件內(nèi)容(包含提交消息)寫回同一路徑。

在這種情況下,只需要做一個(gè)更改,即在提交信息的前面加上JIRA編號(hào)和(-),以將其與提交信息的其余部分很好地分開。還必須確保檢查了提交信息字符串,僅在編號(hào)不存在時(shí)才添加編號(hào):

if !commitMessage.contains(ticketNumber) {
do {
try "\(ticketNumber) - \(commitMessage.trimmingCharacters(in: .newlines))"
.write(toFile: commitMessageFile, atomically: true, encoding: .utf8)
} catch {
print("Could not write to file \(commitMessageFile)")
exit(1)
}
}

設(shè)置git鉤子

現(xiàn)在腳本已經(jīng)準(zhǔn)備好了,是時(shí)候把它放在git可以找到它的位置了。Git鉤子可以全局設(shè)置,也可以基于單個(gè)repo設(shè)置。

我個(gè)人對這類腳本的偏好是基于單個(gè)repo設(shè)置,因?yàn)檫@樣可以在出現(xiàn)問題時(shí)為您提供更多的控制和可見性,并且如果鉤子開始失敗,它會(huì)在它設(shè)置的repo中失敗,而不是全局都失敗。

要設(shè)置它們,我們只需要使文件可執(zhí)行,重命名并將其復(fù)制到所要設(shè)置repo的.git/hooks/路徑之下:

chmod +x main.swift
mv main.swift <path_to_your_repo>/.git/hooks/commit-msg

測試結(jié)果

現(xiàn)在repo已經(jīng)全部設(shè)置好了,剩下的就是對部署的腳本進(jìn)行測試。在下面的截屏中,創(chuàng)建了兩個(gè)分支,一個(gè)帶有問題編號(hào),一個(gè)沒有,它們有著相同的提交信息。可以看出腳本運(yùn)行正常,并且只在需要時(shí)才更改提交消息!

圖片

參考資料

[1] TDD: https://en.wikipedia.org/wiki/Test-driven_development。

[2] Tower: https://www.git-tower.com/mac。

[3] Git Hooks: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks。

責(zé)任編輯:姜華 來源: Swift社區(qū)
相關(guān)推薦

2024-08-12 08:33:05

2014-07-04 09:47:24

SwiftSwift開發(fā)

2010-09-09 11:16:06

CSS交互

2022-08-21 09:41:42

ReactVue3前端

2014-07-22 09:01:53

SwiftJSON

2017-04-12 11:16:08

Python終端編程

2022-09-15 07:44:32

Git全局配置本地配置

2024-01-08 13:31:00

Rust自動(dòng)化測試

2012-04-26 14:02:58

ibmdw

2022-06-21 09:26:21

Shell腳本JavaScript

2021-09-08 14:47:53

UbuntuLinux服務(wù)

2024-09-19 20:59:49

2015-08-06 13:44:21

swiftcocoapods

2018-02-23 10:50:34

Linuxudev規(guī)則

2011-05-27 11:01:10

DreamweaverCSS

2022-11-17 10:23:13

VS CodeCodiumPython

2009-06-15 17:24:59

Groovy正則表達(dá)式

2019-12-31 08:00:00

DebianLinuxApple Swift

2015-12-17 13:19:29

編寫高性能Swift

2018-05-10 13:45:15

Swift網(wǎng)絡(luò)層協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91久久久久久| 成人伊人 | 久久成人精品一区二区三区 | 免费xxxx大片国产在线 | 午夜影晥| 久久精品成人热国产成 | 荷兰欧美一级毛片 | 韩日精品一区 | 国产精品无码久久久久 | 久久久久91| 日韩av一区二区在线观看 | 人人色视频 | 伊人狠狠操 | 亚洲久视频 | 一级片毛片 | 精品国产一区二区三区久久 | 久久亚洲一区二区 | 亚洲成人网在线 | 久久久久久久久久一区 | 日本成人午夜影院 | 国产精品久久久久久久久 | 亚洲视频在线免费观看 | 国产丝袜av | 一本综合久久 | 999久久久| 国产香蕉视频在线播放 | 亚洲欧美日韩国产综合 | 国产一区影院 | 91精品久久久久久久久中文字幕 | 天天草天天射 | 99在线观看| www.操.com| 国产精品成人久久久久 | 91精品国产91久久久久久吃药 | 在线午夜| 草草影院ccyy | 欧美不卡 | 成人免费大片黄在线播放 | 一区二区三区精品视频 | 一区二区三区免费在线观看 | 国产亚洲成av人在线观看导航 |