SVN prehook 用于代码修改统计

UTF82GB.vbs

'*==============================================================================*
'* CMD 命令行编码转换工具包括GB2312,UTF-8,Unicode,BIG5...支持拖拽、文件另保存为 *
'* CodeChange.vbs BY: yongfa365
'* GB2Ue.vbs BY: fastslz
'*==============================================================================*
Option Explicit

Dim Show
Const aCode = "UTF-8"
Const bCode = "GB2312"
Show = "本脚本仅支持"&aCode&""&bCode&"的转换,请拖拽单个要转换的文件到此文件上!"
Const Usage1 = "语法1:GB2Ue.vbs [驱动器][目录][文件名] (直接替换原文件模式)"
Const Usage2 = "语法2:GB2Ue.vbs [驱动器][目录][文件名] [目标驱动器][目录][新名称] /Y"
Const Usage3 = "如果目标新文件已存在,使用/Y参数后将直接替换而不提示是否改写! "
Const Usage4 = "命令行编码转换工具 BY: fastslz"

Dim objArgs,fso
Set objArgs=WScript.Arguments
Set fso=CreateObject("Scripting.FileSystemObject")
if objArgs.Count=0 Then
    MsgBox Show &vbCrLf&vbCrLf& Usage1 &vbCrLf& Usage2 &vbCrLf& Usage3, vbInformation, Usage4
    Wscript.Quit
end if

Dim Sourcefile,Getfile
if not objArgs.Count < 3 Then
    Const Options="/y"
    ignoring = StrComp(objArgs(2), Options, vbTextCompare)
    if ignoring = 0 Then
        Sourcefile=objArgs(0)
        Getfile=objArgs(1)
    else
        MsgBox "文件数量或参数太多,拖拽批量处理请用 ANSI2Unicode.vbs ", vbInformation, "程序意外终止"
        Wscript.Quit
    end if
else
    if not objArgs.Count < 2 Then
        Sourcefile=objArgs(0)
        Getfile=objArgs(1)
        if fso.FileExists(objArgs(1)) then
            Dim Choice
            Choice = MsgBox ("待处理文件“"+Sourcefile+"” ==> 目标文件“"+Getfile+""&vbCrLf&"目标文件已存在,是否改写现有文件?“"+objArgs(1)+"",vbQuestion+vbYesNo,"是否改写")
            if Choice = vbYes Then
                Getfile=objArgs(1)
            else
                Wscript.Quit
            end if
        end if
    else
        Sourcefile=objArgs(0)
        Getfile=objArgs(0)
    end if
end if

'UTF-8也不一定有前面,无法校验
'Call CheckCode(Sourcefile)
Call WriteToFile(Getfile, ReadFile(Sourcefile, aCode), bCode)
Wscript.Quit

Function ReadFile (Sourcefile, CharSet)
    Dim stm,Str
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.loadfromfile Sourcefile
    Str = stm.readtext
    stm.Close
    Set stm = Nothing
    ReadFile = Str
End Function

Function WriteToFile (Getfile, Str, CharSet)
    Dim stm
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.WriteText Str
    stm.SaveToFile Getfile,2
    stm.flush
    stm.Close
    Set stm = Nothing
End Function

Function CheckCode (Sourcefile)
    Dim slz
    set slz = CreateObject("Adodb.Stream")
    slz.Type = 1
    slz.Mode = 3
    slz.Open
    slz.Position = 0
    slz.Loadfromfile Sourcefile
    
    Dim Bin,Codes
    Bin=slz.read(2)
    if AscB(MidB(Bin,1,1))=&HEF and AscB(MidB(Bin,2,1))=&HBB Then
        Codes="UTF-8"
    elseif AscB(MidB(Bin,1,1))=&HFF and AscB(MidB(Bin,2,1))=&HFE Then
        Codes="Unicode"
    else
        Codes="GB2312"
    end if
    if not aCode = Codes Then
        MsgBox "待处理文件 “"&Sourcefile&""&vbCrLf&"该文件原始编码不是"&aCode&",本脚本仅支持"&aCode&""&bCode&"的转换! ",vbInformation,"错误终止"
        WScript.Quit
    end if
    slz.Close
    set slz = Nothing
End Function

 

GB2UTF8.vbs

'*==============================================================================*
'* CMD 命令行编码转换工具包括GB2312,UTF-8,Unicode,BIG5...支持拖拽、文件另保存为 *
'* CodeChange.vbs BY: yongfa365
'* GB2Ue.vbs BY: fastslz
'*==============================================================================*
Option Explicit

Dim Show
Const aCode = "GB2312"
Const bCode = "UTF-8"
Show = "本脚本仅支持"&aCode&""&bCode&"的转换,请拖拽单个要转换的文件到此文件上!"
Const Usage1 = "语法1:GB2Ue.vbs [驱动器][目录][文件名] (直接替换原文件模式)"
Const Usage2 = "语法2:GB2Ue.vbs [驱动器][目录][文件名] [目标驱动器][目录][新名称] /Y"
Const Usage3 = "如果目标新文件已存在,使用/Y参数后将直接替换而不提示是否改写! "
Const Usage4 = "命令行编码转换工具 BY: fastslz"

Dim objArgs,fso
Set objArgs=WScript.Arguments
Set fso=CreateObject("Scripting.FileSystemObject")
if objArgs.Count=0 Then
    MsgBox Show &vbCrLf&vbCrLf& Usage1 &vbCrLf& Usage2 &vbCrLf& Usage3, vbInformation, Usage4
    Wscript.Quit
end if

Dim Sourcefile,Getfile
if not objArgs.Count < 3 Then
    Const Options="/y"
    ignoring = StrComp(objArgs(2), Options, vbTextCompare)
    if ignoring = 0 Then
        Sourcefile=objArgs(0)
        Getfile=objArgs(1)
    else
        MsgBox "文件数量或参数太多,拖拽批量处理请用 ANSI2Unicode.vbs ", vbInformation, "程序意外终止"
        Wscript.Quit
    end if
else
    if not objArgs.Count < 2 Then
        Sourcefile=objArgs(0)
        Getfile=objArgs(1)
        if fso.FileExists(objArgs(1)) then
            Dim Choice
            Choice = MsgBox ("待处理文件“"+Sourcefile+"” ==> 目标文件“"+Getfile+""&vbCrLf&"目标文件已存在,是否改写现有文件?“"+objArgs(1)+"",vbQuestion+vbYesNo,"是否改写")
            if Choice = vbYes Then
                Getfile=objArgs(1)
            else
                Wscript.Quit
            end if
        end if
    else
        Sourcefile=objArgs(0)
        Getfile=objArgs(0)
    end if
end if

Call CheckCode(Sourcefile)
Call WriteToFile(Getfile, ReadFile(Sourcefile, aCode), bCode)
Wscript.Quit

Function ReadFile (Sourcefile, CharSet)
    Dim stm,Str
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.loadfromfile Sourcefile
    Str = stm.readtext
    stm.Close
    Set stm = Nothing
    ReadFile = Str
End Function

Function WriteToFile (Getfile, Str, CharSet)
    Dim stm
    Set stm = CreateObject("Adodb.Stream")
    stm.Type = 2
    stm.mode = 3
    stm.charset = CharSet
    stm.Open
    stm.WriteText Str
    'UTF需要去掉BOM输出
    '不能将流类型直接改成二进制
    '需要创建新流,跳过3个已经生成的BOM拷贝再输出
    stm.Position = 3
    
    Dim binstm
    Set binstm = CreateObject("Adodb.Stream")
    binstm.Type = 1
    binstm.mode = 3
    binstm.Open
    stm.CopyTo(binstm) 
    binstm.SaveToFile Getfile,2
    binstm.flush
    binstm.Close
    
    stm.flush
    stm.Close
    Set stm = Nothing
    Set binstm = Nothing
End Function

Function CheckCode (Sourcefile)
    Dim slz
    set slz = CreateObject("Adodb.Stream")
    slz.Type = 1
    slz.Mode = 3
    slz.Open
    slz.Position = 0
    slz.Loadfromfile Sourcefile
    
    Dim Bin,Codes
    Bin=slz.read(2)
    if AscB(MidB(Bin,1,1))=&HEF and AscB(MidB(Bin,2,1))=&HBB Then
        Codes="UTF-8"
    elseif AscB(MidB(Bin,1,1))=&HFF and AscB(MidB(Bin,2,1))=&HFE Then
        Codes="Unicode"
    else
        Codes="GB2312"
    end if
    if not aCode = Codes Then
        MsgBox "待处理文件 “"&Sourcefile&""&vbCrLf&"该文件原始编码不是"&aCode&",本脚本仅支持"&aCode&""&bCode&"的转换! ",vbInformation,"错误终止"
        WScript.Quit
    end if
    slz.Close
    set slz = Nothing
End Function

 

SVNChangeDetails.bat

@ECHO=OFF
setlocal ENABLEDELAYEDEXPANSION
REM 切换到bat所在目录
cd /d %~dp0

REM 修复js文件的关联,否则js脚本无法执行
reg add "hkcr\.js" /ve /d JSFile /f >nul
reg add "hkcr\.vbs" /ve /d vbsfile /f >nul

set MyName=%~nx0
set LOG_FILE=!MyName!.txt
set CHG_OUTPUT=temp
set CHG_CONFIG=%~1
set LOG_CONFIG=%~3
ECHO="日志文件">%LOG_FILE%
ECHO=%* >>%LOG_FILE%
REM 获取更新列表

REM 输入都是UTF8
UTF82GB.vbs %CHG_CONFIG%
IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

UTF82GB.vbs %LOG_CONFIG%
IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

echo "修改内容文件">%CHG_OUTPUT%
FOR /F "eol= tokens=*" %%i in (%CHG_CONFIG%) do (
    set fileline=%%~i
    svn diff "!fileline!" >>%CHG_OUTPUT%
)


set /a addCount=0
set /a delCount=0
set /a modCount=0
set /a lastdelCount=0

set /a addCommentCount=0
set /a delCommentCount=0
set /a modCommentCount=0
set /a lastCdelCount=0
set fileNameExt=
set fileNameType=
FOR /F "delims=" %%i in (%CHG_OUTPUT%) do (
    ECHO=%%~i>>%LOG_FILE%
    set /a isAdd=0
    set /a isDel=0
    set /a isCommentAdd=0
    set /a isCommentDel=0
    set /a isSplit=0
    set /a isFileName=0
    REM 要分析的行
    set "valueline=%%~i"
    
    IF "!valueline:~0,4!"=="+++ " (
        REM 文件变化
        set /a isFileName=1
    ) ELSE (
        IF "!valueline:~0,4!"=="--- " (
            REM 文件变化
            set /a isFileName=1
        )
    )
    
    IF !isFileName! EQU 1 (
        CALL :GETFILENAME "!valueline:~3!"
        CALL :GETFILENAMEEXT "!GETFILENAME!"
        set "fileNameExt=!GETFILENAMEEXT!"
        CALL :GETFILETYPE "!fileNameExt!"
        set "fileNameType=!GETFILETYPE!"
        
        IF "!fileNameType!"=="" (
            CALL :AddStore NameExt ".!fileNameExt!"
        )
        
        REM 文件名行,后面就无需分析了
        set valueline=
    )
    
    IF "!fileNameType!"=="" (
        REM 无效文件类型,不必分析内容了
        set valueline=
    )
    
    IF NOT "!valueline!"=="" (
        IF "!valueline:~0,2!"=="@@" (
            REM 分割
            set /a isSplit=1
        ) ELSE (
            IF "!valueline:~0,1!"=="+" (
                REM 添加空行不算
                IF NOT "!valueline:~1,1!"=="" (
                    REM 检测注释
                    REM 去掉特殊字符,也只能去掉这些% *啥的好像不能去
                    set tmpline=!valueline:~1,80!
                    REM set tmpline=!tmpline:^^=_!
                    REM set tmpline=!tmpline:^.=_!
                    REM set tmpline=!tmpline:^>=_!
                    REM set tmpline=!tmpline:^<=_!
                    REM set tmpline=!tmpline:^&=_!
                    REM set tmpline=!tmpline:^|=_!
                    REM set tmpline=!tmpline:^'=_!
                    REM set tmpline=!tmpline:^\=_!
                    REM set tmpline=!tmpline:^:=_!
                    // 排除第一个加号
                    CALL :ISCOMMENT "!fileNameType!" "!tmpline!"
                    IF NOT %ERRORLEVEL% EQU 0 (
                        exit /B 1
                    )
                    IF !ISCOMMENT! EQU 0 (
                        set /a isAdd=1
                    ) ELSE (
                         set /a isCommentAdd=1
                    )
                )
            ) ELSE (
                IF "!valueline:~0,1!"=="-" (
                    REM 删除空行不算
                    IF NOT "!valueline:~1,1!"=="" (
                        REM 检测注释
                        REM 去掉特殊字符,也只能去掉这些% *啥的好像不能去
                        set tmpline=!valueline:~1,80!
                        REM set tmpline=!tmpline:^^=_!
                        REM set tmpline=!tmpline:^.=_!
                        REM set tmpline=!tmpline:^>=_!
                        REM set tmpline=!tmpline:^<=_!
                        REM set tmpline=!tmpline:^&=_!
                        REM set tmpline=!tmpline:^|=_!
                        REM set tmpline=!tmpline:^'=_!
                        REM set tmpline=!tmpline:^\=_!
                        REM set tmpline=!tmpline:^:=_!
                        CALL :ISCOMMENT "!fileNameType!" "!tmpline!"
                        IF NOT %ERRORLEVEL% EQU 0 (
                            exit /B 1
                        )
                        IF !ISCOMMENT! EQU 0 (
                            set /a isDel=1
                        ) ELSE (
                             set /a isCommentDel=1
                        )
                    )
                ) 
            )
        )
    )
    
    set /a isMod=0
    IF !isAdd! EQU 1 (
        IF !lastdelCount! GTR 0 (
            REM 先减后加算作改
            REM 从删除中干掉
            set /a lastdelCount=lastdelCount-1
            set /a delCount=delCount-1
            set /a isMod=1
        ) ELSE (
            set /a addCount=addCount+1
        )
    )
    
    IF !isDel! EQU 1 (
        set /a lastdelCount=lastdelCount+1
        set /a delCount=delCount+1
    )
    
    IF !isMod! EQU 1 (
        set /a modCount=modCount+1
    )
    
    set /a isCommentMod=0
    IF !isCommentAdd! EQU 1 (
        IF !lastCdelCount! GTR 0 (
            REM 从删除中干掉
            set /a lastCdelCount=lastCdelCount-1
            set /a delCommentCount=delCommentCount-1
            set /a isCommentMod=1
        ) ELSE (
            set /a addCommentCount=addCommentCount+1
        )
    )
    
    IF !isCommentDel! EQU 1 (
        set /a lastCdelCount=lastCdelCount+1
        set /a delCommentCount=delCommentCount+1
    )
    
    IF !isCommentMod! EQU 1 (
        set /a modCommentCount=modCommentCount+1
    )
    
    IF !isSplit! EQU 1 (
        set /a lastdelCount=0
        set /a lastCdelCount=0
    )
    
    ECHO=本行 代码^(增:!isAdd! 删:!isDel! 改:!isMod!^) 注释^(增:!isCommentAdd! 删:!isCommentDel! 改:!isCommentMod!^) 非变更:!isNotChange! 分隔符:!isSplit! 文件名:!isFileName! 扩展名:!fileNameExt! 文件类型:!fileNameType!>>%LOG_FILE%
    ECHO=统计 代码^(增:!addCount! 删:!delCount! 改:!modCount!^) 注释^(增:!addCommentCount! 删:!delCommentCount! 改:!modCommentCount!^) lastdelCount:!lastdelCount! lastCdelCount:!lastCdelCount!>>%LOG_FILE%
)

ECHO=统计完毕 代码(增:!addCount! 删:!delCount! 改:!modCount!) 注释(增:!addCommentCount! 删:!delCommentCount! 改:!modCommentCount!) >>%LOG_FILE%

set /a chgCount=!addCount!+!modCount!+!delCount!
set /a chgCommentCount=!addCommentCount!+!modCommentCount!+!delCommentCount!
set /a chgCodeCommentCount=!chgCount!+!chgCommentCount!

set /a logCount=0
REM 修改ReviewInfo

set /a lineCount=0
set /a storeCount=0
set /a hasFixed=0
set /a hasOutput=0
FOR /F "eol= tokens=*" %%i in (%LOG_CONFIG%) do (
    set /a lineCount=lineCount+1
    set fileline=%%~i
    ECHO=!fileline!>> %LOG_FILE%
    IF !lineCount! EQU 1 (
        REM 首行判断
        REM Fixed:DTS2017022109061
        IF /I "!fileline:~0,6!"=="Fixed:" (
            REM 找开头
            ECHO="找到开头">> %LOG_FILE%
            set /a hasFixed=1
        )
    ) ELSE (
        IF !hasFixed! EQU 1 (
            REM 已经确认开头
            IF !hasOutput! EQU 0 (
                REM 没有输出过
                REM ReviewInfo:size(2)Loc suggestion() minor() major()
                IF /I "!fileline:~0,11!"=="ReviewInfo:" (
                    REM 找输出位置
                    ECHO="修改输出日志成功">> %LOG_FILE%
                    set /a hasOutput=1
                    IF !chgCount! EQU 0 (
                        REM 至少输出修改为1,小于1会报错
                        set "fileline=ReviewInfo:size(1)Loc suggestion() minor() major()"
                    ) ELSE (
                        set "fileline=ReviewInfo:size(!chgCount!)Loc suggestion() minor() major()"
                    )
                )
            )
        )
    )
    ECHO=!lineCount! !hasFixed! !hasOutput! !fileline!
    set Store[!storeCount!]=!fileline!
    set /a storeCount=storeCount+1
)

ECHO=开始输出>>%LOG_FILE%

REM 清空文件
createempty 2>nul >%LOG_CONFIG%

set /a storeEnd=storeCount-1

FOR /L %%i IN (0,1,!storeEnd!) do (
    ECHO=!Store[%%i]!>>%LOG_CONFIG%
)

ECHO=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=>>%LOG_CONFIG%
IF !chgCodeCommentCount! EQU 0 (
    ECHO=无代码修改>>%LOG_CONFIG%
) ELSE (
    ECHO=代码^(增^:!addCount! 删^:!delCount! 改^:!modCount! 总^:!chgCount!^)>>%LOG_CONFIG%
    ECHO=注释^(增^:!addCommentCount! 删^:!delCommentCount! 改^:!modCommentCount! 总^:!chgCommentCount!^)>>%LOG_CONFIG%
    ECHO=总计^:!chgCodeCommentCount!>>%LOG_CONFIG%
    ECHO=^(单位^:行,注释仅支持^/^/^,不统计空行^)>>%LOG_CONFIG%
)
CALL :GetStore NameExt
IF NOT "!GetStore!"=="" (
    ECHO=提交的非源码文件类型^:!GetStore!>>%LOG_CONFIG%
)

REM 输出完毕的日志转换编码
GB2UTF8.vbs %LOG_CONFIG%

IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

copy /Y %LOG_CONFIG% .\commitlog.txt

GOTO :eof

:ISCOMMENT
    REM 加"是为了确保特殊字符赋值
    set "str=%~2"
    set /a cur=0
    set /a ISCOMMENT=0
    
    IF "%~1"=="CTYPE" (
        REM C类型
        :while_ISCOMMENT
            IF NOT "!str:~%cur%,1!"=="" (
                REM echo "!str:~%cur%,1!"
                IF "!str:~%cur%,1!"==" " (
                    REM 空格,继续往下找
                    set /a cur=cur+1
                    goto :while_ISCOMMENT
                )
                
                IF "!str:~%cur%,1!"=="    " (
                    REM 空格,继续往下找
                    set /a cur=cur+1
                    goto :while_ISCOMMENT
                )
                
                REM echo "!str:~%cur%,2!"
                IF "!str:~%cur%,2!"=="//" (
                    REM 仅支持单行注释
                    set /a ISCOMMENT=1
                ) ELSE (
                    REM 结束
                    goto :endwhile_ISCOMMENT
                )
            )
        :endwhile_ISCOMMENT
        ECHO=!str!>>%LOG_FILE%
        ECHO=判断是否为C注释^:!ISCOMMENT!>>%LOG_FILE%
        GOTO :eof
    )
GOTO :eof

:GETFILENAME
    set GETFILENAME=
    REM 加"是为了确保特殊字符赋值
    set "str=%~1"
    IF "!str!"=="" (
        goto :end_GETFILENAME
    )
    
    set /a cur=0
    :while_GETFILENAME
        set "CHAR=!str:~%cur%,1!"
        IF "!CHAR!"=="" (
            goto :end_GETFILENAME
        )
            
        IF "!CHAR!"=="    " (
            REM Tab 结束
            goto :end_GETFILENAME
        )
            
        IF "!GETFILENAME!"=="" (
            IF "!CHAR!"==" " (
                REM 空格,继续往下找
                set /a cur=cur+1
                goto :while_GETFILENAME
            )
        )
        
        set "GETFILENAME=!GETFILENAME!!CHAR!"
        
        REM 继续拼
        set /a cur=cur+1
        goto :while_GETFILENAME

    :end_GETFILENAME
    ECHO=取得文件名^:!GETFILENAME!>>%LOG_FILE%
GOTO :eof

:GETFILENAMEEXT
    set GETFILENAMEEXT=
    REM 加"是为了确保特殊字符赋值
    set "str=%~1"
    IF "!str!"=="" (
        goto :end_GETFILENAMEEXT
    )
    
    set /a rcur=1
    :while_GETFILENAMEEXT
        set /a cur=rcur-1
        
        IF "!str:~%cur%,1!"=="" (
            REM 只能通过正向检测结束
            set GETFILENAMEEXT=
            goto :end_GETFILENAMEEXT
        )
        
        set CHAR=!str:~-%rcur%,1!
        REM echo=单个字符!CHAR!>>%LOG_FILE%
        
        IF "!CHAR!"=="." (
            REM . 结束
            goto :end_GETFILENAMEEXT
        )
        set "GETFILENAMEEXT=!CHAR!!GETFILENAMEEXT!"
        
        REM 继续拼
        set /a rcur=rcur+1
        goto :while_GETFILENAMEEXT

    :end_GETFILENAMEEXT
    ECHO=取得文件扩展名^:!GETFILENAMEEXT!>>%LOG_FILE%
GOTO :eof

:GETFILETYPE
    set FILE_TYPE_C=CTYPE
    set GETFILETYPE=
    IF "%~1"=="" (
        GOTO :eof
    )
    
    IF /I "%~1"=="cpp" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="inl" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="c" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="h" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="hpp" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="java" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="js" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
GOTO :eof

:HasSame
    set "str=%~2"

    FOR /L %%i IN (0,1,!storeCount%1!) do (
        IF /I "!store%1[%%i]!"=="!str!" (
            set HasSame=true
            goto :eof
        )
    )
    set HasSame=false
GOTO :eof

:AddStore
    set "str=%~2"

    REM 判重
    call :HasSame %1 "!str!"
    
    IF "!storeCount%1!"=="" (
        set /a storeCount%1=0
    )
    
    REM 判重
    IF !HasSame!==false (
        set "store%1[!storeCount%1!]=!str!"
        set /a storeCount%1=storeCount%1+1
        set AddStore=true
    ) ELSE (
        set AddStore=false
    )
GOTO :eof

:GetStore
    set GetStore=
    FOR /L %%i IN (0,1,!storeCount%1!) do (
        set "GetStore=!GetStore! !store%1[%%i]!"
    )
GOTO :eof

SVNChangeDetails_old.bat

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
REM 切换到bat所在目录
cd /d %~dp0

REM 修复js文件的关联,否则js脚本无法执行
reg add "hkcr\.js" /ve /d JSFile /f >nul
reg add "hkcr\.vbs" /ve /d vbsfile /f >nul

set MyName=%~nx0
set LOG_FILE=!MyName!.txt
set CHG_OUTPUT=temp
copy /Y "%~1" .\change.txt
set CHG_CONFIG=change.txt
copy /Y "%~3" .\commitlog.txt
copy /Y "%~3" .\commitlogback.txt
set LOG_CONFIG=commitlog.txt

REM 拷贝过来,避免原始路径中存在空格情况


ECHO="日志文件">%LOG_FILE%
ECHO=%* >>%LOG_FILE%
REM 获取更新列表

REM 输入都是UTF8
UTF82GB.vbs %CHG_CONFIG%
IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

UTF82GB.vbs %LOG_CONFIG%
IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

echo "修改内容文件">%CHG_OUTPUT%
FOR /F "delims=" %%i in (%CHG_CONFIG%) do (
    set fileline=%%~i
    call :ISFILE "!fileline!"
    if !ISFILE! EQU 1 (
        REM 只处理文件,不处理文件夹
        CALL :GETFILENAME "!fileline!"
        CALL :GETFILENAMEEXT "!GETFILENAME!"
        CALL :GETFILETYPE "!GETFILENAMEEXT!"
        IF NOT "!GETFILETYPE!"=="" (
            svn diff --depth empty "!fileline!" >>%CHG_OUTPUT%
        )
    )
    ECHO "!fileline! ISFILE^:!ISFILE! GETFILENAME^:!GETFILENAME! GETFILENAMEEXT^:!GETFILENAMEEXT! GETFILETYPE^:!GETFILETYPE!"
)


set /a addCount=0
set /a delCount=0
set /a modCount=0
set /a lastdelCount=0

set /a addCommentCount=0
set /a delCommentCount=0
set /a modCommentCount=0
set /a lastCdelCount=0
set fileNameExt=
set fileNameType=
FOR /F "delims=" %%i in (%CHG_OUTPUT%) do (
    ECHO=%%~i>>%LOG_FILE%
    set /a isAdd=0
    set /a isDel=0
    set /a isCommentAdd=0
    set /a isCommentDel=0
    set /a isSplit=0
    set /a isFileName=0
    REM 要分析的行
    set "valueline=%%~i"
    
    IF "!valueline:~04!"=="+++ " (
        REM 文件变化
        set /a isFileName=1
    ) ELSE (
        IF "!valueline:~04!"=="--- " (
            REM 文件变化
            set /a isFileName=1
        )
    )
    
    IF !isFileName! EQU 1 (
        CALL :GETFILENAME "!valueline:~3!"
        CALL :GETFILENAMEEXT "!GETFILENAME!"
        set "fileNameExt=!GETFILENAMEEXT!"
        CALL :GETFILETYPE "!fileNameExt!"
        set "fileNameType=!GETFILETYPE!"
        
        IF "!fileNameType!"=="" (
            CALL :AddStore NameExt ".!fileNameExt!"
        )
        
        REM 文件名行,后面就无需分析了
        set valueline=
    )
    
    IF "!fileNameType!"=="" (
        REM 无效文件类型,不必分析内容了
        set valueline=
    )
    
    IF NOT "!valueline!"=="" (
        IF "!valueline:~02!"=="@@" (
            REM 分割
            set /a isSplit=1
        ) ELSE (
            IF "!valueline:~01!"=="+" (
                REM 添加空行不算
                IF NOT "!valueline:~11!"=="" (
                    REM 检测注释
                    REM 去掉特殊字符,也只能去掉这些% *啥的好像不能去
                    set tmpline=!valueline:~180!
                    REM set tmpline=!tmpline:^^=_!
                    REM set tmpline=!tmpline:^.=_!
                    REM set tmpline=!tmpline:^>=_!
                    REM set tmpline=!tmpline:^<=_!
                    REM set tmpline=!tmpline:^&=_!
                    REM set tmpline=!tmpline:^|=_!
                    REM set tmpline=!tmpline:^'=_!
                    REM set tmpline=!tmpline:^\=_!
                    REM set tmpline=!tmpline:^:=_!
                    REM set tmpline=!tmpline:^!=_!
                    REM 排除第一个加号
                    CALL :ISCOMMENT "!fileNameType!" "!tmpline!"
                    IF NOT %ERRORLEVEL% EQU 0 (
                        exit /B 1
                    )
                    IF !ISCOMMENT! EQU 0 (
                        set /a isAdd=1
                    ) ELSE (
                         set /a isCommentAdd=1
                    )
                )
            ) ELSE (
                IF "!valueline:~01!"=="-" (
                    REM 删除空行不算
                    IF NOT "!valueline:~11!"=="" (
                        REM 检测注释
                        REM 去掉特殊字符,也只能去掉这些% *啥的好像不能去
                        set tmpline=!valueline:~180!
                        REM set tmpline=!tmpline:^^=_!
                        REM set tmpline=!tmpline:^.=_!
                        REM set tmpline=!tmpline:^>=_!
                        REM set tmpline=!tmpline:^<=_!
                        REM set tmpline=!tmpline:^&=_!
                        REM set tmpline=!tmpline:^|=_!
                        REM set tmpline=!tmpline:^'=_!
                        REM set tmpline=!tmpline:^\=_!
                        REM set tmpline=!tmpline:^:=_!
                        REM set tmpline=!tmpline:^!=_!
                        CALL :ISCOMMENT "!fileNameType!" "!tmpline!"
                        IF NOT %ERRORLEVEL% EQU 0 (
                            exit /B 1
                        )
                        IF !ISCOMMENT! EQU 0 (
                            set /a isDel=1
                        ) ELSE (
                             set /a isCommentDel=1
                        )
                    )
                ) 
            )
        )
    )
    
    set /a isMod=0
    IF !isAdd! EQU 1 (
        IF !lastdelCount! GTR 0 (
            REM 先减后加算作改
            REM 从删除中干掉
            set /a lastdelCount=lastdelCount-1
            set /a delCount=delCount-1
            set /a isMod=1
        ) ELSE (
            set /a addCount=addCount+1
        )
    )
    
    IF !isDel! EQU 1 (
        set /a lastdelCount=lastdelCount+1
        set /a delCount=delCount+1
    )
    
    IF !isMod! EQU 1 (
        set /a modCount=modCount+1
    )
    
    set /a isCommentMod=0
    IF !isCommentAdd! EQU 1 (
        IF !lastCdelCount! GTR 0 (
            REM 从删除中干掉
            set /a lastCdelCount=lastCdelCount-1
            set /a delCommentCount=delCommentCount-1
            set /a isCommentMod=1
        ) ELSE (
            set /a addCommentCount=addCommentCount+1
        )
    )
    
    IF !isCommentDel! EQU 1 (
        set /a lastCdelCount=lastCdelCount+1
        set /a delCommentCount=delCommentCount+1
    )
    
    IF !isCommentMod! EQU 1 (
        set /a modCommentCount=modCommentCount+1
    )
    
    IF !isSplit! EQU 1 (
        set /a lastdelCount=0
        set /a lastCdelCount=0
    )
    
    ECHO=本行 代码^(增:!isAdd! 删:!isDel! 改:!isMod!^) 注释^(增:!isCommentAdd! 删:!isCommentDel! 改:!isCommentMod!^) 非变更:!isNotChange! 分隔符:!isSplit! 文件名:!isFileName! 扩展名:!fileNameExt! 文件类型:!fileNameType!>>%LOG_FILE%
    ECHO=统计 代码^(增:!addCount! 删:!delCount! 改:!modCount!^) 注释^(增:!addCommentCount! 删:!delCommentCount! 改:!modCommentCount!^) lastdelCount:!lastdelCount! lastCdelCount:!lastCdelCount!>>%LOG_FILE%
)

ECHO=统计完毕 代码(增:!addCount! 删:!delCount! 改:!modCount!) 注释(增:!addCommentCount! 删:!delCommentCount! 改:!modCommentCount!) >>%LOG_FILE%

set /a chgCount=!addCount!+!modCount!+!delCount!
set /a chgCommentCount=!addCommentCount!+!modCommentCount!+!delCommentCount!
set /a chgCodeCommentCount=!chgCount!+!chgCommentCount!

set /a logCount=0
REM 修改ReviewInfo

set /a lineCount=0
set /a storeCount=0
set /a hasFixed=0
set /a hasOutput=0
REM 空行无法通过For读取
FOR /F "delims=" %%i in (%LOG_CONFIG%) do (
    set /a lineCount=lineCount+1
    set fileline=%%~i
    ECHO=!fileline!>> %LOG_FILE%
    IF !lineCount! EQU 1 (
        REM 首行判断
        REM Fixed:DTS2017022109061
        IF /I "!fileline:~06!"=="Fixed:" (
            REM 找开头
            ECHO="找到开头">> %LOG_FILE%
            set /a hasFixed=1
        )
    ) ELSE (
        IF !hasFixed! EQU 1 (
            REM 已经确认开头
            IF !hasOutput! EQU 0 (
                REM 没有输出过
                REM ReviewInfo:size(2)Loc suggestion() minor() major()
                IF /I "!fileline:~011!"=="ReviewInfo:" (
                    REM 找输出位置
                    ECHO="修改输出日志成功">> %LOG_FILE%
                    set /a hasOutput=1
                    IF !chgCount! EQU 0 (
                        REM 至少输出修改为1,小于1会报错
                        set "fileline=ReviewInfo:size(1)Loc suggestion() minor() major()"
                    ) ELSE (
                        set "fileline=ReviewInfo:size(!chgCount!)Loc suggestion() minor() major()"
                    )
                )
            )
        )
    )
    ECHO=!lineCount! !hasFixed! !hasOutput! !fileline!
    set Store[!storeCount!]=!fileline!
    set /a storeCount=storeCount+1
)

ECHO=开始输出>>%LOG_FILE%

REM 清空文件
createempty 2>nul >%LOG_CONFIG%

set /a storeEnd=storeCount-1

FOR /L %%i IN (01!storeEnd!) do (
    ECHO=!Store[%%i]!>>%LOG_CONFIG%
)

ECHO=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=^=>>%LOG_CONFIG%
IF !chgCodeCommentCount! EQU 0 (
    ECHO=无代码修改>>%LOG_CONFIG%
) ELSE (
    ECHO=代码^(增^:!addCount! 删^:!delCount! 改^:!modCount! 总^:!chgCount!^)>>%LOG_CONFIG%
    ECHO=注释^(增^:!addCommentCount! 删^:!delCommentCount! 改^:!modCommentCount! 总^:!chgCommentCount!^)>>%LOG_CONFIG%
    ECHO=总计^:!chgCodeCommentCount!>>%LOG_CONFIG%
    ECHO=^(单位^:行注释仅支持^/^/^不统计空行^)>>%LOG_CONFIG%
)
CALL :GetStore NameExt
IF NOT "!GetStore!"=="" (
    ECHO=提交的非源码文件类型^:!GetStore!>>%LOG_CONFIG%
)

REM 输出完毕的日志转换编码
GB2UTF8.vbs %LOG_CONFIG%

IF NOT %ERRORLEVEL% EQU 0 (
    exit /B 1
)

copy /Y %LOG_CONFIG% "%~3"

GOTO :eof

:ISCOMMENT
    REM 加"是为了确保特殊字符赋值
    set "str=%~2"
    set /a cur=0
    set /a ISCOMMENT=0
    
    IF "%~1"=="CTYPE" (
        REM C类型
        :while_ISCOMMENT
            IF NOT "!str:~%cur%1!"=="" (
                REM echo "!str:~%cur%1!"
                IF "!str:~%cur%1!"==" " (
                    REM 空格,继续往下找
                    set /a cur=cur+1
                    goto :while_ISCOMMENT
                )
                
                IF "!str:~%cur%1!"=="    " (
                    REM 空格,继续往下找
                    set /a cur=cur+1
                    goto :while_ISCOMMENT
                )
                
                REM echo "!str:~%cur%2!"
                IF "!str:~%cur%2!"=="//" (
                    REM 仅支持单行注释
                    set /a ISCOMMENT=1
                ) ELSE (
                    REM 结束
                    goto :endwhile_ISCOMMENT
                )
            )
        :endwhile_ISCOMMENT
        ECHO=!str!>>%LOG_FILE%
        ECHO=判断是否为C注释^:!ISCOMMENT!>>%LOG_FILE%
        GOTO :eof
    )
GOTO :eof

:GETFILENAME
    set GETFILENAME=
    REM 加"是为了确保特殊字符赋值
    set "str=%~1"
    IF "!str!"=="" (
        goto :end_GETFILENAME
    )
    
    set /a cur=0
    :while_GETFILENAME
        set "CHAR=!str:~%cur%1!"
        IF "!CHAR!"=="" (
            goto :end_GETFILENAME
        )
            
        IF "!CHAR!"=="    " (
            REM Tab 结束
            goto :end_GETFILENAME
        )
            
        IF "!GETFILENAME!"=="" (
            IF "!CHAR!"==" " (
                REM 空格,继续往下找
                set /a cur=cur+1
                goto :while_GETFILENAME
            )
        )
        
        set "GETFILENAME=!GETFILENAME!!CHAR!"
        
        REM 继续拼
        set /a cur=cur+1
        goto :while_GETFILENAME

    :end_GETFILENAME
    ECHO=取得文件名^:!GETFILENAME!>>%LOG_FILE%
GOTO :eof

:GETFILENAMEEXT
    set GETFILENAMEEXT=
    REM 加"是为了确保特殊字符赋值
    set "str=%~1"
    IF "!str!"=="" (
        goto :end_GETFILENAMEEXT
    )
    
    set /a rcur=1
    :while_GETFILENAMEEXT
        set /a cur=rcur-1
        
        IF "!str:~%cur%1!"=="" (
            REM 只能通过正向检测结束
            set GETFILENAMEEXT=
            goto :end_GETFILENAMEEXT
        )
        
        set CHAR=!str:~-%rcur%1!
        REM echo=单个字符!CHAR!>>%LOG_FILE%
        
        IF "!CHAR!"=="." (
            REM . 结束
            goto :end_GETFILENAMEEXT
        )
        set "GETFILENAMEEXT=!CHAR!!GETFILENAMEEXT!"
        
        REM 继续拼
        set /a rcur=rcur+1
        goto :while_GETFILENAMEEXT

    :end_GETFILENAMEEXT
    ECHO=取得文件扩展名^:!GETFILENAMEEXT!>>%LOG_FILE%
GOTO :eof

:GETFILETYPE
    set FILE_TYPE_C=CTYPE
    set GETFILETYPE=
    IF "%~1"=="" (
        GOTO :eof
    )
    
    IF /I "%~1"=="cpp" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="inl" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="c" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="h" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="hpp" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="java" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    
    IF /I "%~1"=="js" (
        set GETFILETYPE=!FILE_TYPE_C!
        GOTO :eof
    )
    IF /I "%~1"=="bat" (
        set GETFILETYPE=BATTYPE
        GOTO :eof
    )
GOTO :eof

:HasSame
    set "str=%~2"

    FOR /L %%i IN (01!storeCount%1!) do (
        IF /I "!store%1[%%i]!"=="!str!" (
            set HasSame=true
            goto :eof
        )
    )
    set HasSame=false
GOTO :eof

:AddStore
    set "str=%~2"

    REM 判重
    call :HasSame %1 "!str!"
    
    IF "!storeCount%1!"=="" (
        set /a storeCount%1=0
    )
    
    REM 判重
    IF !HasSame!==false (
        set "store%1[!storeCount%1!]=!str!"
        set /a storeCount%1=storeCount%1+1
        set AddStore=true
    ) ELSE (
        set AddStore=false
    )
GOTO :eof

:GetStore
    set GetStore=
    FOR /L %%i IN (01!storeCount%1!) do (
        set "GetStore=!GetStore! !store%1[%%i]!"
    )
GOTO :eof

:ISFILE
    set /a ISFILE=0
    IF exist "%~1" (
        call :FORMATFOLDERPATH "%~1"
        if not exist "!FORMATFOLDERPATH!" (
            REM 路径有效,且不是文件夹
            set /a ISFILE=1
        )
    )
GOTO :eof

REM 格式化原路径,拼上\
:FORMATFOLDERPATH
    set strPath=%~1
    call :STRLEN "strPath"
    set /a STREND=STRLEN-1
    IF NOT "!strPath:~%STREND%1!"=="\" (
        set strPath=!strPath!\
    )
    set FORMATFOLDERPATH=!strPath!
GOTO :eof

:STRLEN
    set str=%~1
    set cur=0;

    :while
        if "!str:~%cur%1!"=="" (
            set /a STRLEN=cur
        ) else (
            set /a cur=cur+1
            goto :while
        )
GOTO :eof

 

posted @ 2017-08-14 00:13  dzqabc  阅读(1)  评论(0编辑  收藏  举报