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

IntelliJ IDEA基于Scala實(shí)現(xiàn)Git檢查工具

 更新時(shí)間:2023年08月21日 14:43:22   作者:TiAmo zhang  
這篇文章主要介紹了如何使用Scala實(shí)現(xiàn)自定義的Git檢查工具,大家可以基于本文的示例進(jìn)行擴(kuò)展與實(shí)現(xiàn),也可以進(jìn)行其他應(yīng)用方向的嘗試,感興趣的可以了解下

01、Git檢查工具

在實(shí)現(xiàn)Git檢查工具之前需要知道程序究竟要做什么。我們知道,在管理Git分支時(shí)可以進(jìn)行代碼合并操作,這樣可以將其他開發(fā)者提交的內(nèi)容同步到當(dāng)前分支中,當(dāng)用戶對自己的分支進(jìn)行提交時(shí)就不會與現(xiàn)有版本產(chǎn)生沖突。

反向合并也可以理解為一種回合,在用戶使用GitLab等版本管理軟件時(shí)經(jīng)常會出現(xiàn)這種現(xiàn)象,但是反向合并帶來了十分嚴(yán)重的問題: 代碼污染。

可以這樣理解,用戶分支是介于生產(chǎn)分支與測試分支中間的媒介,它必須保證與兩種分支的匹配性問題,即文件差異性問題。通常用戶分支是基于生產(chǎn)拉取出來的全新分支,而很多開發(fā)者都試圖使用這個(gè)分支進(jìn)行修改并提交到測試分支進(jìn)行測試發(fā)布。

在理想情況下項(xiàng)目的測試分支與生產(chǎn)分支應(yīng)該是一致的,因此反向合并容易被修改或糾正,但是在測試分支與生產(chǎn)分支差異較大的時(shí)候,反向合并會將測試分支中的內(nèi)容合并到用戶分支中,如果用戶分支被提交到生產(chǎn)分支上,則將會產(chǎn)生不可恢復(fù)的災(zāi)難。

基于上述原因,我們使用Scala設(shè)計(jì)一款簡單的檢查工具,它可以檢查指定分支或分支組中所有的提交信息,并從這些信息中過濾出帶有回合操作的歷史。

如果發(fā)生過反向合并的操作,則在Git提交歷史記錄中通常會帶有Mergeremotetrackingbranch...的字樣信息,但是帶有這種信息的提交并不一定都產(chǎn)生了合并問題。

當(dāng)通過Git檢查工具過濾出符合上述特征的分支后,可以通過判斷與生產(chǎn)分支的差異數(shù)量并設(shè)定一個(gè)判斷閾值的方式再次深度過濾或直接人工觀察用戶分支的差異化等多種方式來確保上線分支的準(zhǔn)確性。

02、編寫配置

在Git版本控制管理章節(jié)里提到過,反向合并會對開發(fā)者的項(xiàng)目分支帶來污染,因此可以實(shí)現(xiàn)一個(gè)用于Git分支檢查的工具,這樣在每次例行版本維護(hù)時(shí)可以幫助我們快速定位反向合并的問題。

工具不一定能解決所有的問題,因?yàn)槊總€(gè)問題的出現(xiàn)都有其隨機(jī)性,但是工具卻能從某些方面提升我們的效率。讀者在學(xué)習(xí)完本章后,可以根據(jù)需要自行擴(kuò)展并定制更多的功能。

首先在resources資源目錄下,創(chuàng)建一個(gè)名為config.conf的文件,它用于Git檢查工具的基礎(chǔ)配置。config.conf配置文件中定義了本地Git項(xiàng)目的根目錄及待檢查的分支,代碼如下:

{
  group1 = {
    workDir = "Git項(xiàng)目目錄"
  }
  group2 = {
    workDir = "Git項(xiàng)目目錄"
    base = master
    branches = [
      user_local_branch
    ]
  }
}

在上述配置中對待檢查目標(biāo)進(jìn)行了分組,運(yùn)行時(shí)用戶可以將需要對比的項(xiàng)目及分支預(yù)先定義好,這樣可以在項(xiàng)目啟動(dòng)后通過接收參數(shù)的方式來動(dòng)態(tài)調(diào)整使用哪一組配置進(jìn)行目標(biāo)分支的檢查與分析。

在每一組配置里,workDir指定本地Git項(xiàng)目的根目錄。base用于指定項(xiàng)目的主分支(master)。branches是一個(gè)分支列表,它代表了待檢查的分支,這些分支既可以是本地分支,也可以是遠(yuǎn)程分支。如果是遠(yuǎn)程分支,則通常要在其前面添加origin/前綴。

接下來定義一個(gè)用于控制日志輸出的配置文件,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <properties>
        <property name="APP_HOME">$${env:APP_HOME}</property>
        <property name="LOG_HOME">${APP_HOME}/logs</property>
        <property name="mainFilename">${LOG_HOME}/vh.log</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level - %msg%n" />
        </Console>
        <RollingFile name="FileMain" fileName="${mainFilename}"
                     filePattern="${LOG_HOME}/vh%date{yyyyMMdd}_%i.log.gz">
            <PatternLayout>
                <pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %level - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <CronTriggeringPolicy schedule="0 0 0 * * ?" evaluateOnStartup="true"/>
                <SizeBasedTriggeringPolicy size="20 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="FileMain" />
        </Root>
    </Loggers>
</Configuration>

03、編寫啟動(dòng)程序

接下來編寫項(xiàng)目的啟動(dòng)程序,啟動(dòng)程序可以接收外界傳入的參數(shù)以實(shí)現(xiàn)不同配置的切換使用,代碼如下:

package com.scala.git
import org.slf4j.LoggerFactory
object MainCheck {
  private val log = LoggerFactory.getLogger(getClass)
  def main(args: Array[String]): Unit = {
    log.info(s"接收外界傳遞的切換配置: ${args.group}")
    var group = "group2"
    if(args.length > 0){
      group = args(0)
    }
    log.info(s"當(dāng)前配置為$group")
    group match {
      case "group2" => CheckTask.main(args)
      case _ => log.error(s"not found $group")
    }
  }
}

因?yàn)镾cala程序可以與Java語言混合編寫,因此Java開發(fā)人員在閱讀Scala程序時(shí)相對容易理解一些。

在MainCheck對象的主方法中接收了外界傳遞進(jìn)來的group參數(shù),它可以在程序啟動(dòng)時(shí)動(dòng)態(tài)傳遞到主方法中并替代默認(rèn)配置組group2。

接下來通過match操作對group變量所代表的分組配置進(jìn)行匹配,如果匹配成功,則執(zhí)行對應(yīng)用的功能調(diào)用。如果匹配不上,則輸出日志提示。

04、編寫校驗(yàn)邏輯

在MainCheck.scala應(yīng)用程序中,當(dāng)外界變量group匹配成功后會調(diào)用具體的執(zhí)行邏輯,此邏輯封裝在CheckTask對象方法中。

在編寫CheckTask對象之前先來編寫GitUtil.scala程序文件,其作用為調(diào)用并執(zhí)行CMD命令以便獲取指定分支的所有提交信息,這些提交信息將以數(shù)組的形式返回,代碼如下:

package com.scala.util
import java.io.File
import org.slf4j.LoggerFactory
import scala.sys.process.{Process, ProcessLogger}
object GitUtil {
  private val isWin = System.getProperty("os.name").toLowerCase.contains("Windows")
  private val log = LoggerFactory.getLogger(getClass)
  def getCommits(from: String, to: String, workDir: String): String = {
    val cols = Array("%H", "%s", "%an", "%ae", "%ci")
    val tem = from + ".." + to + " --pretty=format:\"" + cols.mkString("/") + "\"";
    val value = cmdCommits(s"git log " + tem, new File(workDir))
    value
  }
  def cmdCommits(cmd: String, workDir: File): String = {
    var commits:Array[String] = null;
    if(!isWin){
      commits = cmd.split("\\s")
    }else{
      commits = Array("cmd", "/c") ++ cmd.split("\\s")
    }
    Process(commits, workDir).!!(ProcessLogger(s => log.error(s"err => $s")))
  }
}

 接下來實(shí)現(xiàn)CheckTask.scala程序文件,代碼如下:

package com.scala.git
import com.scala.util.GitUtil
import com.typesafe.config.ConfigFactory
import scala.collection.JavaConverters._
object CheckTask {
  private val config = ConfigFactory.load("config.conf").getConfig("group2")
  private val orderWorkDir = config.getString("workDir");
  private val base = config.getString("base");
  private val branchs = config.getStringList("branchs");
  def main(args: Array[String]): Unit = {
    println(s"參照對比分支[$base]")
    println(s"待檢查分支集合$branchs")
    checkBraches(base, asScalaBuffer(branchs).toArray).foreach(b => println(s"發(fā)現(xiàn)可疑分支 $b"))
  }
  def checkBraches(base: String, brans: Array[String]): Array[String] = {
    brans.filter(b => checkMergeError(base, b))
  }
  private def checkMergeError(base: String, target: String): Boolean = {
        println(s"對比分支:$base,檢查分支:$target")
        //取得所有提交信息
        val commits = getDiffCommits(base, target)
        //從歷史提交記錄過濾出回合過的分支
        val targets = commits.filter(isMergeReverse)
        targets.foreach(c => {println(c.mkString("\t"))})
        println(s"分支[$target]中可疑提交次數(shù): ${targets.length}")
        targets.length != 0
  }
  private def isMergeReverse(messages: Array[String]): Boolean = {
    val msg = messages(1)
    if(msg.startsWith("Merge branch 'int_") || msg.startsWith("Merge remote-tracking branch ")){
      val splits = msg.split("\\s")
      val end = splits(splits.length-1)
      val flag = end.startsWith("int_") || end.startsWith("local_int_")
      return !flag
    }
    false
  }
  private def getDiffCommits(from: String, to: String): Array[Array[String]] = {
    GitUtil.getCommits(from, to, orderWorkDir).lines.map(_.split("/")).toArray
  }
}

現(xiàn)在嘗試運(yùn)行工具,隨便選取系統(tǒng)中的某個(gè)Git項(xiàng)目并修改config.conf配置文件以使其與Git項(xiàng)目中的分支對應(yīng),然后運(yùn)行MainCheck.scala程序文件,運(yùn)行效果如圖1所示。

圖1 運(yùn)行Git檢查工具

以上就是IntelliJ IDEA基于Scala實(shí)現(xiàn)Git檢查工具的詳細(xì)內(nèi)容,更多關(guān)于IntelliJ IDEA Scala的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java遞歸算法簡單示例兩則

    Java遞歸算法簡單示例兩則

    這篇文章主要介紹了Java遞歸算法,通過兩則示例分析了Java遞歸算法實(shí)現(xiàn)階乘與求和的具體操作技巧,需要的朋友可以參考下
    2017-09-09
  • 使用FastAPI和Redis實(shí)現(xiàn)實(shí)時(shí)通知方式(SSE)

    使用FastAPI和Redis實(shí)現(xiàn)實(shí)時(shí)通知方式(SSE)

    本文介紹了如何使用FastAPI和Redis實(shí)現(xiàn)Server-SentEvents(SSE)來推送實(shí)時(shí)通知,Server-SentEvents是一種單向數(shù)據(jù)流技術(shù),適用于實(shí)時(shí)數(shù)據(jù)推送場景,FastAPI和Redis的結(jié)合可以高效地實(shí)現(xiàn)這一功能,并通過心跳機(jī)制管理連接
    2026-01-01
  • SpringBoot整合MybatisPlusGernerator實(shí)現(xiàn)逆向工程

    SpringBoot整合MybatisPlusGernerator實(shí)現(xiàn)逆向工程

    在我們寫項(xiàng)目的時(shí)候,我們時(shí)常會因?yàn)樾枰獎(jiǎng)?chuàng)建很多的項(xiàng)目結(jié)構(gòu)而頭疼,本文主要介紹了SpringBoot整合MybatisPlusGernerator實(shí)現(xiàn)逆向工程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • java讀取資源路徑的幾種實(shí)現(xiàn)方式

    java讀取資源路徑的幾種實(shí)現(xiàn)方式

    文章總結(jié)了Java讀取資源路徑的幾種方式,并指出了在JUnit測試文件和普通類中讀取資源路徑的區(qū)別,普通類中讀取資源路徑時(shí),只返回主目錄,而JUnit測試文件中可以精確到所在模塊
    2025-02-02
  • 線程池之newCachedThreadPool可緩存線程池的實(shí)例

    線程池之newCachedThreadPool可緩存線程池的實(shí)例

    這篇文章主要介紹了線程池之newCachedThreadPool可緩存線程池的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào))

    SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào))

    這篇文章主要介紹了SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào)),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java讀取word-excel-ppt文件代碼

    java讀取word-excel-ppt文件代碼

    OFFICE文檔使用POI控件,PDF可以使用PDFBOX0.7.3控件,完全支持中文,用XPDF也行,不過感覺PDFBOX比較好,而且作者也在更新。水平有限,萬望各位指正
    2009-04-04
  • JVM與操作系統(tǒng)之間的關(guān)系詳解

    JVM與操作系統(tǒng)之間的關(guān)系詳解

    JVM與操作系統(tǒng)之間是依賴與被依賴的關(guān)系,JVM依賴于操作系統(tǒng)提供的資源和服務(wù),同時(shí)JVM也起到了抽象與隔離的作用,為Java程序提供了一個(gè)統(tǒng)一的、與平臺無關(guān)的運(yùn)行環(huán)境,提高了Java程序的安全性
    2025-03-03
  • java 實(shí)現(xiàn)切割文件和合并文件的功能

    java 實(shí)現(xiàn)切割文件和合并文件的功能

    這篇文章主要介紹了java 實(shí)現(xiàn)切割文件和合并文件的功能的相關(guān)資料,這里實(shí)現(xiàn)文件的切割的實(shí)現(xiàn)代碼和文件合并的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-07-07
  • 關(guān)于Spring?Boot項(xiàng)目的?log4j2?核彈漏洞問題(一行代碼配置搞定)

    關(guān)于Spring?Boot項(xiàng)目的?log4j2?核彈漏洞問題(一行代碼配置搞定)

    相信昨天,很多小伙伴都因?yàn)長og4j2的史詩級漏洞忙翻了吧,不過我看到群里發(fā)出來的各種修復(fù)方法,還真是不好看...所以這里也提一下Spring Boot用戶怎么修復(fù)最簡單吧,對Spring Boot log4j2 核彈漏洞問題感興趣的朋友參考下吧
    2021-12-12

最新評論

阜新市| 蒲城县| 上蔡县| 汕尾市| 建始县| 祁东县| 页游| 惠东县| 墨竹工卡县| 延津县| 榕江县| 那曲县| 武鸣县| 乃东县| 伊宁县| 大冶市| 旌德县| 桐柏县| 济宁市| 应用必备| 积石山| 金门县| 中阳县| 古丈县| 巴林右旗| 灵山县| 博乐市| 大安市| 湄潭县| 乐都县| 体育| 卢湾区| 泸州市| 抚顺县| 神池县| 梅州市| 枣阳市| 嘉定区| 新民市| 勃利县| 肇庆市|