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