|
@@ -4,6 +4,8 @@ from __future__ import unicode_literals
|
|
|
import os
|
|
|
import re # 正则表达式;
|
|
|
import sys
|
|
|
+#reload(sys)
|
|
|
+#sys.setdefaultencoding('utf-8')
|
|
|
import time
|
|
|
import datetime
|
|
|
import shutil
|
|
@@ -12,7 +14,50 @@ import subprocess
|
|
|
import xlrd
|
|
|
import xlwt
|
|
|
from xlwt import XFStyle, Pattern
|
|
|
-import win_subprocess #此版本对应宽字节,subprocess为acssi;
|
|
|
+import win_subprocess # 此版本对应宽字节,subprocess为acssi;
|
|
|
+import shutil
|
|
|
+
|
|
|
+
|
|
|
+def copyfile(src_file, dest_file):
|
|
|
+ shutil.copy(src_file, dest_file)
|
|
|
+
|
|
|
+
|
|
|
+def copyfolder(src_foler, dest_folder):
|
|
|
+ src_files = os.listdir(src_foler)
|
|
|
+ for name in src_files:
|
|
|
+ copyfile(src_foler+"\\"+name, dest_folder+"\\"+name)
|
|
|
+
|
|
|
+# 不使用重定向;
|
|
|
+def cmdExecute2(cmd):
|
|
|
+ # 定义文件名称;
|
|
|
+ file_name = str(time.time())
|
|
|
+ # 输出到文件中;
|
|
|
+ cmd = cmd + ' >> ' + file_name
|
|
|
+ print u'执行cmd:', cmd
|
|
|
+ proc = subprocess.Popen(cmd, shell=True)
|
|
|
+ # 等待完成;
|
|
|
+ proc.wait()
|
|
|
+ # 读取文件内容;
|
|
|
+ data = ''
|
|
|
+ with open(file_name, mode="rb") as f:
|
|
|
+ data = f.read()
|
|
|
+
|
|
|
+ os.remove(file_name)
|
|
|
+ print u"cmd结果:", data
|
|
|
+ return data
|
|
|
+
|
|
|
+
|
|
|
+def cmdExecute(cmd):
|
|
|
+ print u'执行cmd:', cmd
|
|
|
+ proc = win_subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
|
+ # 等待完成;
|
|
|
+ stdout, stderr = proc.communicate()
|
|
|
+ if proc.returncode == 0:
|
|
|
+ print u'执行成功'
|
|
|
+ # 返回执行结果;
|
|
|
+ # print u"cmdExecute结果:%s" % stdout
|
|
|
+ return stdout
|
|
|
+
|
|
|
|
|
|
class ExcelParser:
|
|
|
def __init__(self, excelPath):
|
|
@@ -94,47 +139,18 @@ class remoteSVN:
|
|
|
|
|
|
|
|
|
# 本地SVN操作,必须安装命令行;
|
|
|
+
|
|
|
class localSVN:
|
|
|
def __init__(self):
|
|
|
print 'local svn'
|
|
|
|
|
|
- # 不使用重定向;
|
|
|
- def __cmdExecute2(self, cmd):
|
|
|
- # 定义文件名称;
|
|
|
- file_name = str(time.time())
|
|
|
- # 输出到文件中;
|
|
|
- cmd = cmd + ' >> ' + file_name
|
|
|
- print u'执行cmd:', cmd
|
|
|
- proc = subprocess.Popen(cmd, shell=True)
|
|
|
- # 等待完成;
|
|
|
- proc.wait()
|
|
|
- # 读取文件内容;
|
|
|
- data = ''
|
|
|
- with open(file_name, mode="rb") as f:
|
|
|
- data = f.read()
|
|
|
-
|
|
|
- os.remove(file_name)
|
|
|
- print u"cmd结果:", data
|
|
|
- return data
|
|
|
-
|
|
|
- def __cmdExecute(self, cmd):
|
|
|
- print u'执行cmd:', cmd
|
|
|
- proc = win_subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
|
- # 等待完成;
|
|
|
- stdout, stderr = proc.communicate()
|
|
|
- if proc.returncode == 0:
|
|
|
- print u'执行成功'
|
|
|
- # 返回执行结果;
|
|
|
- # print u"__cmdExecute结果:%s" % stdout
|
|
|
- return stdout
|
|
|
-
|
|
|
def revisionInfo(self, revision, url):
|
|
|
cmd = 'svn info -r %s %s' % (revision, url)
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def revisionLog(self, revision, url):
|
|
|
cmd = 'svn log -r %s %s' % (revision, url)
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def checkout(self, dir, url, revision=''):
|
|
|
# dir中文必须是unicode的转gbk;
|
|
@@ -142,15 +158,15 @@ class localSVN:
|
|
|
cmd = 'svn co -r %s %s %s' % (revision, url, dir)
|
|
|
else:
|
|
|
cmd = 'svn co %s %s' % (url, dir)
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def export(self, dir, url, revision=''):
|
|
|
# dir中文必须是unicode的转gbk;
|
|
|
if revision.__len__() > 0:
|
|
|
- cmd = 'svn export -r %s %s %s' % (revision, url, dir.encode("gbk"))
|
|
|
+ cmd = 'svn export -r %s %s %s' % (revision, url, dir)
|
|
|
else:
|
|
|
- cmd = 'svn export %s %s' % (url, dir.encode("gbk"))
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ cmd = 'svn export %s %s' % (url, dir)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def update(self, dir, revision=''): # revision只有根目录才有效,即有.svn的目录才有效;
|
|
|
dir = dir.replace('\\', '/')
|
|
@@ -159,7 +175,7 @@ class localSVN:
|
|
|
cmd = 'svn up %s -r %s' % (dir, revision)
|
|
|
else:
|
|
|
cmd = 'svn up %s' % (dir)
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def revert(self, dir, revision=''):
|
|
|
# dir中文必须是unicode的转gbk;
|
|
@@ -167,21 +183,38 @@ class localSVN:
|
|
|
cmd = 'svn revert -r %s %s' % (revision, dir)
|
|
|
else:
|
|
|
cmd = 'svn revert %s' % (dir)
|
|
|
- return self.__cmdExecute(cmd.encode("gbk"))
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def add(self, file):
|
|
|
# file中文必须是unicode的转gbk;
|
|
|
- cmd = 'svn add %s' % (file.encode("gbk"))
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ cmd = 'svn add %s' % (file)
|
|
|
+ return cmdExecute(cmd)
|
|
|
|
|
|
def commit(self, file, desc):
|
|
|
# file/desc中文必须是unicode的转gbk;
|
|
|
- cmd = "svn commit -m %s %s" % (desc.encode("gbk"), file.encode("gbk"))
|
|
|
- return self.__cmdExecute(cmd)
|
|
|
+ cmd = "svn commit -m %s %s" % (desc, file)
|
|
|
+ return cmdExecute(cmd)
|
|
|
+
|
|
|
+ def status(self, file):
|
|
|
+ cmd = "svn status %s"%(file)
|
|
|
+ msg = cmdExecute(cmd)
|
|
|
+ if msg.startswith("?"): # 不在控制;
|
|
|
+ return 0
|
|
|
+ elif msg.startwith("A"): # 预加入;
|
|
|
+ return 1
|
|
|
+ elif msg.startwith("M"): # 已修改;
|
|
|
+ return 2
|
|
|
+ elif msg.startwith("C"): # 冲突;
|
|
|
+ return 3
|
|
|
+ elif msg.startwith("K"): # 被锁定;
|
|
|
+ return 4
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
print "start main"
|
|
|
+ if 1:
|
|
|
+ lsvn = localSVN()
|
|
|
+ lsvn.status(u"F:\\Moka-Code\\SAT_Core\\22")
|
|
|
if 1:
|
|
|
'checkout或更新代码'
|
|
|
lsvn = localSVN()
|
|
@@ -209,27 +242,25 @@ if __name__ == "__main__":
|
|
|
for item in excel.xlsData:
|
|
|
if item['sqa_result'] == u"释放":
|
|
|
'获取apk名称'
|
|
|
- apk_name = item['url'][debug_url.__len__() + 1:-1]
|
|
|
+ apk_name = item['url'][debug_url.__len__() + 1:]
|
|
|
'更新到释放的版本'
|
|
|
- # lsvn.revert(debug_dir+"\\"+apk_name, item['apk_revision'])
|
|
|
lsvn.update(debug_dir + "\\" + apk_name, item['apk_revision'])
|
|
|
+ '复制到release目录'
|
|
|
+ copyfolder(debug_dir + "\\" + apk_name, release_dir + "\\" + apk_name)
|
|
|
+ '获取日志'
|
|
|
+ log = lsvn.revisionLog(item['apk_revision'], item['url']).decode('gbk')
|
|
|
+ listInfo = log.split("\r\n")
|
|
|
+ message = listInfo[3]
|
|
|
+ '获取状态'
|
|
|
+ ret = lsvn.status(release_dir + "\\" + apk_name)
|
|
|
+ if ret == 0:
|
|
|
+ '添加并提交'
|
|
|
+ lsvn.add(release_dir + "\\" + apk_name)
|
|
|
+ lsvn.commit(release_dir + "\\" + apk_name, message)
|
|
|
+ elif ret == 1 or ret == 2:
|
|
|
+ lsvn.commit(release_dir + "\\" + apk_name, message)
|
|
|
+ else:
|
|
|
+ print "不受控,无法提交"
|
|
|
# endif
|
|
|
# endfor
|
|
|
|
|
|
- # endfor
|
|
|
- if 0:
|
|
|
- rsvn = remoteSVN("10.201.44.65", "app", "app2021")
|
|
|
- # bolean, data = getRevisionLog('10168', 'https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/01debug/general/TVMeetingMode')
|
|
|
- # bolean,data = update('/home/data/ApkAutoCompile/cacheAPK/general$', '10168')
|
|
|
- bolean, data = rsvn.update('/home/data/ApkAutoCompile/cacheAPK/general$')
|
|
|
- print data
|
|
|
- if 0:
|
|
|
- lsvn = localSVN()
|
|
|
- # data = lsvn.checkout(u'F:\\Moka-Code\\APK自动编译相关\\general','https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/01debug/general','10168')
|
|
|
- # data = lsvn.export(u'F:\\Moka-Code\\APK自动编译相关\\general','https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/apk/01debug/general')
|
|
|
- # time.sleep(10)
|
|
|
- # data = lsvn.update(u'F:\\Moka-Code\\APK自动编译相关\\general', '10168')
|
|
|
- # data = lsvn.update(u'F:\\Moka-Code\\APK自动编译相关\\general', '')
|
|
|
- data = lsvn.add(u'F:\\Moka-Code\\APK自动编译相关\\general\\1.txt')
|
|
|
- data = lsvn.commit(u'F:\\Moka-Code\\APK自动编译相关\\general\\1.txt', u'测试')
|
|
|
- print data
|