最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在?Swift?中編寫Git?Hooks腳本的方法

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

前言

這周,我決定完成因為工作而推遲了一周的TODO事項來改進(jìn)我的Git工作流程。

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

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

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

用git hooks自動生成提交信息

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

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

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

為什么我使用Swift?

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

雖然有很多更受歡迎的選項,比如bash?、ruby等等,但我還是決定使用Swift。因為我對Swift更熟悉,因為我每天都在使用它,而且我真的非常喜歡它強大的類型語法以及低內(nèi)存占用。

讓我們開始吧

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

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

#!/usr/bin/swift
import Foundation

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

編寫git鉤子

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

檢索提交消息

要做的第一件事就是從腳本傳進(jìn)來的參數(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)容。如果因為一些原因檢索失敗了,我們退出(exit?)腳本同時返回狀態(tài)碼1,這將告訴git終止此次提交。

注意:

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

檢索問題編號

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

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

讓我們從添加腳本調(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)在實現(xiàn)了shell?命令,那么就可以使用它詢問git當(dāng)前分支是什么,然后盡可能的從中提取出問題編號。

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)

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

修改提交信息

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

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

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)備好了,是時候把它放在git可以找到它的位置了。Git鉤子可以全局設(shè)置,也可以基于單個repo設(shè)置。

我個人對這類腳本的偏好是基于單個repo設(shè)置,因為這樣可以在出現(xiàn)問題時為您提供更多的控制和可見性,并且如果鉤子開始失敗,它會在它設(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)建了兩個分支,一個帶有問題編號,一個沒有,它們有著相同的提交信息??梢钥闯瞿_本運行正常,并且只在需要時才更改提交消息!

參考資料

[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。

到此這篇關(guān)于在 Swift 中編寫腳本:Git Hooks的文章就介紹到這了,更多相關(guān)Git Hooks腳本編寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼

    通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼

    這篇文章主要給大家介紹了通過Notification.Name看Swift是如何優(yōu)雅的解決String硬編碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Swift算法實現(xiàn)逐字翻轉(zhuǎn)字符串的方法示例

    Swift算法實現(xiàn)逐字翻轉(zhuǎn)字符串的方法示例

    大家都知道翻轉(zhuǎn)字符串在字符串算法中算是比較常見的,下面這篇文章主要介紹了Swift算法實現(xiàn)逐字翻轉(zhuǎn)字符串的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Swift3.0剪切板代碼拷貝及跨應(yīng)用粘貼實現(xiàn)代碼

    Swift3.0剪切板代碼拷貝及跨應(yīng)用粘貼實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Swift3.0剪切板代碼拷貝及跨應(yīng)用粘貼的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • swift 3.0中實現(xiàn)字符串截取、比較的方法示例

    swift 3.0中實現(xiàn)字符串截取、比較的方法示例

    時,為了使用現(xiàn)有的字符串生成一個新的字符串,我們可以使用截取字符串的方法實現(xiàn)。下面這篇文章主要給大家介紹了關(guān)于swift 3.0中實現(xiàn)字符串截取的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒。
    2017-10-10
  • swiftui開發(fā)之padding默認(rèn)值設(shè)置詳解

    swiftui開發(fā)之padding默認(rèn)值設(shè)置詳解

    這篇文章主要為大家介紹了swiftui開發(fā)之padding默認(rèn)值設(shè)置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Swift中Optional值的鏈?zhǔn)秸{(diào)用學(xué)習(xí)筆記

    Swift中Optional值的鏈?zhǔn)秸{(diào)用學(xué)習(xí)筆記

    這篇文章主要介紹了Swift中Optional值的鏈?zhǔn)秸{(diào)用學(xué)習(xí)筆記,Optional鏈?zhǔn)荢wift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-07-07
  • SwiftUI中TabView組件的常規(guī)使用

    SwiftUI中TabView組件的常規(guī)使用

    這篇文章主要給大家介紹了關(guān)于SwiftUI中TabView組件的常規(guī)使用,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-06-06
  • 簡單分析Swift語言的一些基本特征

    簡單分析Swift語言的一些基本特征

    這篇文章主要介紹了Swift語言的一些基本特征,本文從各語言最基礎(chǔ)的類與對象等方面來講,需要的朋友可以參考下
    2015-07-07
  • Swift?中的?JSON?反序列化示例詳解

    Swift?中的?JSON?反序列化示例詳解

    這篇文章主要為大家介紹了Swift中的JSON?反序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Swift編程中實現(xiàn)希爾排序算法的代碼實例

    Swift編程中實現(xiàn)希爾排序算法的代碼實例

    希爾排序是對插入排序的一種改進(jìn)版本,算法本身并不穩(wěn)定,存在優(yōu)化空間,這里我們來講一下希爾排序的大體思路及Swift編程中實現(xiàn)希爾排序算法的代碼實例
    2016-07-07

最新評論

茂名市| 枝江市| 泰顺县| 新密市| 霸州市| 原平市| 西昌市| 库车县| 宁河县| 宿州市| 马尔康县| 平乡县| 高尔夫| 仙桃市| 开化县| 临泉县| 茶陵县| 靖边县| 安化县| 三台县| 东至县| 内黄县| 花莲县| 常熟市| 达州市| 石家庄市| 孟津县| 资兴市| 虎林市| 祁阳县| 日土县| 海林市| 巍山| 德州市| 保德县| 郸城县| 郁南县| 鹤峰县| 昂仁县| 永福县| 宣城市|