527 lines
17 KiB
Python
527 lines
17 KiB
Python
from email.policy import strict
|
||
from inspect import getcomments
|
||
import os
|
||
from re import S
|
||
import sys
|
||
import json
|
||
import urllib3
|
||
import re
|
||
|
||
DirPath = os.path.split(os.path.realpath(__file__))
|
||
# DirPath = "E:\\Jenkins3Agent\\workspace\\qiuqiuTest"
|
||
|
||
# 白名单
|
||
whiteList = ['info','svnUpdate','status','gitPull','versionLog','diffLog','gitStatus']
|
||
|
||
# DIR = sys.argv[1] # 方向
|
||
GitPath = sys.argv[1] # git地址
|
||
GITBRANCH = sys.argv[2] # git分支
|
||
SVN_USER = sys.argv[3] # svn用户
|
||
SVN_PASSWORD = sys.argv[4] # svn密码
|
||
GIT_USER = sys.argv[5] # git用户
|
||
GIT_PASSWORD = sys.argv[6] #git密码
|
||
PUSH_STYLE = sys.argv[7] #提交方式 #true为分批提交,false为一次提交
|
||
GIT_USER_TEMP = r"http://liaoyourong%40brmyx.com" #git临时用户
|
||
GIT_PASSWORD_TEMP = r"z123456" #git临时密码
|
||
|
||
# svn命令行
|
||
SVNDiffCommand = "svn diff -r "
|
||
SVNInfoCommand = "svn info >.\info"
|
||
SVNLogCommand = "svn log -r "
|
||
SVNUpdateToVersionCommand = "svn up -r "
|
||
SVNRevertCommand = "svn revert -R *"
|
||
SVNUpdateCommand = "svn update >.\svnUpdate"
|
||
SVNUpdate = "svn update"
|
||
SVNStatusCommand = "svn status > .\status"
|
||
SVNDeleteCommand = "svn del "
|
||
SVNAddOneCommand = "svn add "
|
||
SVNCommitCommand = 'svn commit --username ' + SVN_USER + ' --password ' + SVN_PASSWORD + ' -m "git提交"'
|
||
|
||
SVNBeforeRevision = "" #一次提交的版本迭代 前版本
|
||
SVNAfterRevision = "" #一次提交的版本迭代 后版本
|
||
SVNBeforeRevision_New = "" #分批提交的版本迭代 前版本
|
||
SVNAfterRevision_New = "" #分批提交的版本迭代 后版本
|
||
SVNVersionList = []
|
||
SVNVersionLogList = []
|
||
NewGitList = [] #git拉取下来,相对于svn来说是改变的文件列表
|
||
|
||
# git命令行
|
||
addstr = "."
|
||
GitCheckoutCommand = "git checkout ."
|
||
GitPullCommand = "git pull > .\gitPull"
|
||
GitAddCommand = "git add "
|
||
GitAddAllCommand = "git add " + addstr
|
||
GitCommitCommand = 'git commit -m "'
|
||
GitCommitCommandLog = 'git commit '
|
||
GitPushCommand = r"git push " + GIT_USER_TEMP + ":" + GIT_PASSWORD_TEMP + "@" + GitPath + " " + GITBRANCH
|
||
|
||
|
||
# 前缀函数
|
||
def NormalFunc():
|
||
# 路径跳转
|
||
# os.chdir(listPath[0])
|
||
|
||
os.chdir(DirPath[0]) #跳转
|
||
|
||
|
||
# testarg = open("./testArgs",'w')
|
||
# for i in range(0,len(sys.argv)):
|
||
# testarg.write(sys.argv[i] + '\n')
|
||
|
||
|
||
# testarg.close()
|
||
|
||
|
||
# 拿到版本区间的提交信息
|
||
def GetLogCommand(after,before):
|
||
return SVNLogCommand + after + ":" + before + r" >.\versionLog"
|
||
|
||
|
||
def GetLog():
|
||
os.system(GetLogCommand(SVNBeforeRevision_New,SVNAfterRevision_New))
|
||
SvnVersionLog = open("./versionLog",'r')
|
||
svnLogList = SvnVersionLog.readlines()
|
||
for i in range(len(svnLogList)):
|
||
svnList = svnLogList[i].split('|')
|
||
if(len(svnList) > 1):
|
||
global SVNVersionList
|
||
global SVNVersionLogList
|
||
SVNVersionList.append(int(re.findall(r"\d+",svnList[0])[0]))
|
||
SVNVersionLogList.append(str(svnLogList[i+2]).strip())
|
||
|
||
|
||
SvnVersionLog.close()
|
||
os.remove(DirPath[0] + "\\" + "versionLog")
|
||
|
||
def JudgeGitClean():
|
||
GitStatusCommand = "git status > .\gitStatus"
|
||
os.system(GitStatusCommand)
|
||
StatusLog = open("./gitStatus",'r',encoding= "utf-8")
|
||
for StatusLogLine in StatusLog.readlines():
|
||
if(StatusLogLine.strip().find("nothing to commit") != -1):
|
||
StatusLog.close()
|
||
os.remove(DirPath[0] + "\\" + "gitStatus")
|
||
return True
|
||
|
||
StatusLog.close()
|
||
os.remove(DirPath[0] + "\\" + "gitStatus")
|
||
return False
|
||
|
||
|
||
def GetDiff(lastVersion,nowVersion):
|
||
diffList = []
|
||
|
||
svnDiff = SVNDiffCommand + str(lastVersion) + r":" + str(nowVersion) + " --summarize" + " >.\diffLog"
|
||
os.system(svnDiff)
|
||
|
||
|
||
diffLog = open("./diffLog",'r',encoding= "ansi")
|
||
for diffLogLine in diffLog.readlines():
|
||
# if(diffLogLine.find("Index:",0,7) != -1):
|
||
diffList.append(diffLogLine.strip()[8:len(diffLogLine.strip())])
|
||
|
||
diffLog.close()
|
||
os.remove(DirPath[0] + "\\" + "diffLog")
|
||
return diffList
|
||
|
||
def UpdateSVNByVersion():
|
||
# SVNVersionList.reverse()
|
||
# SVNVersionLogList.reverse()
|
||
|
||
for j in range(len(SVNVersionList)):
|
||
if(j > 0):
|
||
os.system(SVNUpdateToVersionCommand + str(SVNVersionList[j]))
|
||
|
||
if(JudgeGitClean() ==False):
|
||
diffList = GetDiff(SVNVersionList[j-1],SVNVersionList[j])
|
||
|
||
for m in range(len(diffList)):
|
||
if(diffList[m] in NewGitList): #如果修改列表里面,包含修改的内容,就修正改成单次提交
|
||
os.system(SVNUpdate)
|
||
os.system(GitAddAllCommand)
|
||
changeLog = 'git commit -m "' + r"svn提交,修改列表里面,包含git修改内容,本次自动修改成单次提交,从以下提交开始:" + '"'
|
||
|
||
for l in range(len(SVNVersionLogList)):
|
||
if l >= j:
|
||
changeLog = changeLog + ' -m "' + SVNVersionLogList[l].strip() + '"'
|
||
|
||
|
||
os.system(changeLog)
|
||
os.system(GitPushCommand)
|
||
return
|
||
|
||
add = GitAddCommand + '"' + diffList[m] + '"'
|
||
os.system(add)
|
||
|
||
os.system(GitCommitCommand+ r"svn版本号:" + str(SVNVersionList[j]) + r"/" + str(SVNVersionLogList[j]).strip())
|
||
os.system(GitPushCommand)
|
||
|
||
|
||
|
||
# print(SVNVersionLogList[j])
|
||
|
||
def GetLocalVersion():
|
||
os.system(SVNInfoCommand)
|
||
infoLog = open("./info",'r')
|
||
for infoLine in infoLog.readlines():
|
||
if(infoLine.strip().find('Last Changed Rev') != -1):
|
||
global SVNBeforeRevision_New
|
||
SVNBeforeRevision_New = infoLine.strip()[18:len(infoLine.strip())]
|
||
# if(infoLine.strip().find(r"URL: http:") != -1):
|
||
# global SVNURL
|
||
# SVNURL = infoLine.strip()[5:len(infoLine.strip())]
|
||
|
||
infoLog.close()
|
||
|
||
def GetNewVersion():
|
||
os.system(SVNInfoCommand)
|
||
infoLog = open("./info",'r')
|
||
for infoLine in infoLog.readlines():
|
||
if(infoLine.strip().find('Last Changed Rev') != -1):
|
||
global SVNAfterRevision_New
|
||
SVNAfterRevision_New = infoLine.strip()[18:len(infoLine.strip())]
|
||
# if(infoLine.strip().find(r"URL: http:") != -1):
|
||
# global SVNURL
|
||
# SVNURL = infoLine.strip()[5:len(infoLine.strip())]
|
||
|
||
infoLog.close()
|
||
os.remove(DirPath[0] + "\\" + "info")
|
||
|
||
def GetBeforeInfo():
|
||
infoLog = open("./info",'r')
|
||
for infoLine in infoLog.readlines():
|
||
if(infoLine.strip().find('Revision') != -1):
|
||
global SVNBeforeRevision
|
||
SVNBeforeRevision = infoLine.strip()[10:len(infoLine.strip())]
|
||
infoLog.close()
|
||
|
||
def GetAfterInfo():
|
||
infoLog = open("./info",'r')
|
||
for infoLine in infoLog.readlines():
|
||
if(infoLine.strip().find('Revision') != -1):
|
||
global SVNAfterRevision
|
||
SVNAfterRevision = infoLine.strip()[10:len(infoLine.strip())]
|
||
infoLog.close()
|
||
|
||
# svn发到git
|
||
def SvnToGit():
|
||
|
||
os.system(SVNRevertCommand)
|
||
os.system(SVNUpdateCommand)
|
||
|
||
# os.system(GitCheckoutCommand)
|
||
os.system(GitPullCommand)
|
||
|
||
|
||
# os.system(SVNRevertCommand)
|
||
|
||
# os.system(SVNStatusCommand)
|
||
|
||
# statusLog = open("./status")
|
||
# for line in statusLog.readlines():
|
||
# if line.strip()[0] == "?": #新增的文件: (实际上在svn已经删除的)
|
||
# os.remove(DirPath + "\\" + line.strip()[8:len(line.strip())])
|
||
# statusLog.close()
|
||
|
||
|
||
|
||
# os.system(GitAddCommand)
|
||
# os.system(GitCommitCommand)
|
||
# os.system(GitPushCommand)
|
||
|
||
|
||
|
||
# git发到svn
|
||
def GitToSVN():
|
||
|
||
os.system(SVNRevertCommand)
|
||
os.system(SVNUpdateCommand)
|
||
|
||
# os.system(GitCheckoutCommand)
|
||
os.system(GitPullCommand)
|
||
|
||
# os.system(SVNStatusCommand)
|
||
|
||
# statusLog = open("./status")
|
||
# for line in statusLog.readlines():
|
||
# if line.strip()[0] == "!": #被删除的文件
|
||
# os.system(SVNDeleteCommand + '"' + ".\\" + line.strip()[8:len(line.strip())] + '"')
|
||
# elif line.strip()[0] == "?": #新增的文件:
|
||
# os.system(SVNAddOneCommand + '"' + ".\\" + line.strip()[8:len(line.strip())] + '"')
|
||
|
||
|
||
# os.system(SVNCommitCommand)
|
||
|
||
|
||
headers = {
|
||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36', 'Accept-Charset': 'utf-8', 'Content-Type': 'application/json'}
|
||
|
||
webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/eb0834e0-4d2d-4d2c-a20c-90ce9079566e"
|
||
href = ""
|
||
|
||
# git pull失败
|
||
def notify():
|
||
|
||
content = {
|
||
"msg_type": "post",
|
||
"content": {
|
||
"post": {
|
||
"zh_cn": {
|
||
"title": "git和svn合并通知",
|
||
"content":
|
||
[
|
||
[
|
||
{
|
||
"tag": "text",
|
||
"text": "git拉取失败,有修改了相同文件: "
|
||
},
|
||
{
|
||
"tag": "at",
|
||
"user_id": "7109285249619836931"
|
||
}
|
||
]
|
||
]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
http = urllib3.PoolManager(retries=3, timeout=10)
|
||
resp = http.request(method="POST", url=webhook,
|
||
headers=headers, body=json.dumps(content))
|
||
# print(resp.data)
|
||
|
||
|
||
# svn要删除文件,但是git修改了这个文件
|
||
def AlreadySVNDel(message,allMessage):
|
||
|
||
content = {
|
||
"msg_type": "post",
|
||
"content": {
|
||
"post": {
|
||
"zh_cn": {
|
||
"title": "git和svn合并通知",
|
||
"content":
|
||
[
|
||
[
|
||
{
|
||
"tag": "text",
|
||
"text": "svn要删除文件,但是git修改了这个文件:\n "
|
||
},
|
||
{
|
||
"tag": "text",
|
||
"text": f"{message}"
|
||
},
|
||
{
|
||
"tag": "text",
|
||
"text": "\n所有svn删除的文件列表为:\n "
|
||
},
|
||
{
|
||
"tag": "text",
|
||
"text": f"{allMessage}"
|
||
},
|
||
{
|
||
"tag": "at",
|
||
"user_id": "7109285249619836931"
|
||
}
|
||
]
|
||
]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
http = urllib3.PoolManager(retries=3, timeout=10)
|
||
resp = http.request(method="POST", url=webhook,
|
||
headers=headers, body=json.dumps(content))
|
||
# print(resp.data)
|
||
|
||
|
||
# svn和git重命名了同一个文件
|
||
def Rename(message):
|
||
|
||
content = {
|
||
"msg_type": "post",
|
||
"content": {
|
||
"post": {
|
||
"zh_cn": {
|
||
"title": "git和svn合并通知",
|
||
"content":
|
||
[
|
||
[
|
||
{
|
||
"tag": "text",
|
||
"text": "svn重命名了这个文件,git也重命名了这个文件,会产生多余的文件:\n "
|
||
},
|
||
{
|
||
"tag": "text",
|
||
"text": f"{message}"
|
||
},
|
||
{
|
||
"tag": "at",
|
||
"user_id": "7109285249619836931"
|
||
}
|
||
]
|
||
]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
http = urllib3.PoolManager(retries=3, timeout=10)
|
||
resp = http.request(method="POST", url=webhook,
|
||
headers=headers, body=json.dumps(content))
|
||
# print(resp.data)
|
||
|
||
|
||
def DelOther():
|
||
os.remove(DirPath[0] + "\\" + "svnlog")
|
||
os.remove(DirPath[0] + "\\" + "gitPull")
|
||
os.remove(DirPath[0] + "\\" + "status")
|
||
os.remove(DirPath[0] + "\\" + "svnUpdate")
|
||
os.remove(DirPath[0] + "\\" + "info")
|
||
# os.remove(DirPath[0] + "\\" + "versionLog")
|
||
|
||
|
||
|
||
def GetAfterInfo():
|
||
infoLog = open("./info",'r')
|
||
for infoLine in infoLog.readlines():
|
||
if(infoLine.strip().find('Revision') != -1):
|
||
global SVNAfterRevision
|
||
SVNAfterRevision = infoLine.strip()[10:len(infoLine.strip())]
|
||
infoLog.close()
|
||
|
||
|
||
# 双向发送
|
||
def Both():
|
||
|
||
os.system(SVNRevertCommand)
|
||
|
||
os.system(SVNInfoCommand)
|
||
GetBeforeInfo()
|
||
|
||
GetLocalVersion()
|
||
|
||
|
||
os.system(SVNUpdateCommand)
|
||
|
||
os.system(SVNInfoCommand)
|
||
GetAfterInfo()
|
||
|
||
os.system(GitPullCommand)
|
||
|
||
os.system(SVNStatusCommand)
|
||
|
||
svndelList = ""
|
||
svnDelTrueList = []
|
||
svnLog = open("./svnUpdate",'r')
|
||
for svnLine in svnLog.readlines():
|
||
if svnLine.strip()[0] == "D": #被删除的文件
|
||
svndelList = svndelList + svnLine + "\n"
|
||
splitList = svnLine.split("\\")
|
||
svnDelTrueList.append(splitList[len(splitList)-1])
|
||
svnLog.close()
|
||
|
||
|
||
gitLog = open("./gitPull",'r',encoding= "utf-8")
|
||
gitNormal = False
|
||
isRename = False
|
||
for gitLine in gitLog.readlines():
|
||
if len(gitLine.split('|')) > 1:
|
||
gitNormal = True
|
||
|
||
if(gitLine.find("rename",0,len(gitLine)-1) != -1):
|
||
for i in range(0,len(svnDelTrueList)):
|
||
cleanLine = gitLine.replace("\"",'')
|
||
if(cleanLine.strip().find(str(svnDelTrueList[i]).strip(),0,len(cleanLine)-1) != -1):
|
||
isRename = True
|
||
Rename(svnDelTrueList[i])
|
||
|
||
if(gitLine.find("Already",0,len(gitLine)-1) != -1):
|
||
gitNormal = True
|
||
break
|
||
|
||
gitLog.close()
|
||
|
||
if(isRename == True):
|
||
print("git something wrong!!!!!!!!!!!")
|
||
return
|
||
|
||
if(gitNormal == False):
|
||
print("git something wrong!!!!!!!!!!!")
|
||
notify()
|
||
return
|
||
else:
|
||
print("git normal ula!!!!!!!!!!!!!!!!!!!!")
|
||
|
||
statusLog = open("./status")
|
||
NewGitList.clear()
|
||
for line in statusLog.readlines():
|
||
|
||
if whiteList.count(line.strip()[8:len(line.strip())]) != 0 :
|
||
continue
|
||
|
||
fullName = line.strip()[8:len(line.strip())] + "@"
|
||
NewGitList.append(line.strip()[8:len(line.strip())]) #存储git对于svn而言,变更的文件列表
|
||
|
||
if line.strip()[0] == "!": #被删除的文件
|
||
os.system(SVNDeleteCommand + '"' + ".\\" + fullName + '"')
|
||
elif line.strip()[0] == "?": #新增的文件:
|
||
if(svndelList.find(line.strip()[8:len(line.strip())],0,len(svndelList)-1) != -1):
|
||
AlreadySVNDel(line.strip()[8:len(line.strip())],svndelList)
|
||
print("git something wrong!!!!!!!!!!!")
|
||
return
|
||
else:
|
||
os.system(SVNAddOneCommand + '"' + ".\\" + fullName + '"')
|
||
statusLog.close()
|
||
os.system(SVNLogCommand + SVNBeforeRevision + ':' + SVNAfterRevision + " >.\svnlog")
|
||
|
||
|
||
versionLog = open("./svnlog",'r')
|
||
versionLogList = versionLog.readlines()
|
||
VersionMessageList = []
|
||
for i in range(len(versionLogList)):
|
||
svnList = versionLogList[i].split('|')
|
||
if(len(svnList) > 1):
|
||
logIndex = i + 2
|
||
if(logIndex <= len(versionLogList) -1):
|
||
message =re.findall(r"\d+",svnList[0])[0] + r":" + versionLogList[i+2].strip()
|
||
else:
|
||
message =re.findall(r"\d+",svnList[0])[0] + r":"
|
||
|
||
VersionMessageList.append(' -m "' + message + '"')
|
||
# for versionLine in versionLog.readlines():
|
||
# print("versionLine:"+versionLine)
|
||
# global GitCommitCommandLog
|
||
# GitCommitCommandLog = GitCommitCommandLog + ' -m "' + versionLine.replace('\n','') + '"'
|
||
versionLog.close()
|
||
|
||
VersionMessageList.reverse()
|
||
for j in range(len(VersionMessageList)-1):
|
||
global GitCommitCommandLog
|
||
GitCommitCommandLog = GitCommitCommandLog + VersionMessageList[j]
|
||
|
||
|
||
DelOther()
|
||
|
||
|
||
os.system(SVNCommitCommand)
|
||
os.system(SVNUpdate)
|
||
|
||
# 判断是分批提交,还是单次提交
|
||
if(str(PUSH_STYLE) == "true"):
|
||
GetNewVersion()
|
||
GetLog()
|
||
UpdateSVNByVersion()
|
||
else:
|
||
os.system(GitAddAllCommand)
|
||
os.system(GitCommitCommandLog)
|
||
os.system(GitPushCommand)
|
||
|
||
|
||
# direction = {"svn发给git":SvnToGit,"git发给svn":GitToSVN,"双向更新":Both}
|
||
|
||
|
||
NormalFunc()
|
||
# direction.get(DIR,Both)()
|
||
|
||
Both()
|