清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#!/usr/bin/env python
#coding:utf-8
'''
'''
import os
import sys
originName = "origin"
versionInfo = """
调用方式:
1.将 ssrepo 复制到 '~/bin' 目录下
2.sudo chmod +x ssrepo 为 ssrepo 增加可执行权限
3.将 '~/bin' 加入到环境变量 PATH 中
提交代码:
1.git add 将要提交修改加入暂存区
2.git commit -s 提交修改
3.ssrepo sync 同步服务器代码到当前所在分支,重排提交序列
4.ssrepo upload 提交当前分支到服务器 master 分支
注意事项:
1.可使用 ssrepo push 替代 ssrepo sync 和 ssrepo upload 一次完成同步和提交操作
--= version info =--
version 0.4
1.修正新文件位于文件夹中因文件夹不存在导致 sync时异常结束的bug
version: 0.3
1.修正同步时将其他用户删除的文件加入cache中,而导致代码中出现多余的无用文件的问题
2.增加 push 方法,使用 ssrepo push 调用,自动进行 sync 后进行 upload。
version: 0.2
1.修正master分支pull时出现 非快进式错误提示
2.修正再没有进行git stash 时,错误的调用了 git stash pop 的问题
"""
def hasVersion(filename) :
logline = os.popen('git log {0}'.format(filename)).readlines()
return len(logline) > 0
def removeCache(cachepath):
for parent,dirnames,filenames in os.walk(cachepath):
for filename in filenames:
srcpath = (os.path.join(parent,filename))
targetpath = srcpath[1:]
if os.path.exists(targetpath):
pass
else:
targetDir = os.path.abspath(os.path.join(targetpath,'..'))
if os.path.exists(targetDir):
pass
else :
os.makedirs(targetDir)
os.rename(srcpath,targetpath)
if hasVersion(targetpath) :
#print('hasVersion need delete ' + targetpath)
os.popen('rm {0}'.format(targetpath)).readlines()
else :
print("no version new file " +targetpath)
os.popen('rm -rf '+cachepath).readlines()
def sync(needMV = True):
#print('--origin--')
HASHCODES = os.popen('git log {0} --format="%H"'.format(originName)).readlines()
#for x in HASHCODES:
# print(x)
localcodes = [];
#print('--local--')
LOCALHASHCODES = os.popen('git log --format="%H"').readlines()
#for x in LOCALHASHCODES:
# print(x)
#print('--same--')
tmp = [val for val in HASHCODES if val in LOCALHASHCODES]
#for t in tmp :
# print(t)
HASHCODE = tmp[0].strip()
print("last same code is " + HASHCODE)
for CODE in LOCALHASHCODES :
CODE = CODE.strip()
if ( cmp(CODE ,HASHCODE) == 0) :
break
else :
localcodes.append(CODE)
cherryCount = len(localcodes)
print("need cherry count is {0}".format(cherryCount) )
for c in localcodes :
print ("need cherry code " + c)
localcodes.reverse()
line = os.popen('git branch -a | grep "*"').readlines()
branchName = line[0].strip('*').strip()
print('local branch is ' + branchName)
stash = os.popen('git stash').readlines()
os.popen('git reset '+HASHCODE ).readlines()
if (needMV) :
os.popen('mv src 1src').readlines()
os.popen('mv res 1res').readlines()
os.popen('mv libs 1libs').readlines()
os.popen('git reset --hard').readlines()
if cmp(branchName,'master') == 0:
os.popen('git pull').readlines()
else :
os.popen('git pull {0} master:{1}'.format(originName,branchName)).readlines()
for c in localcodes :
os.popen('git cherry-pick ' + c ).readlines()
print ('cherry-pick ' + c)
if len(stash) > 1 :
print('stash pop')
os.popen('git stash pop').readlines()
else :
print('stash is clear')
removeCache('1src')
removeCache('1res')
removeCache('1libs')
def upload():
line = os.popen('git branch -a | grep "*"').readlines()
branchName = line[0].strip('*').strip()
print('the branch "{0}" will be push '.format(branchName))
os.popen('git push {0} {1}:refs/for/master'.format(originName,branchName)).readlines()
def getOriginInfo():
originInfoline = os.popen('git remote -v').readlines()
for originInfo in originInfoline:
originInfo = originInfo.strip()
#print(originInfo)
if(originInfo.endswith('(push)')) :
#print(originInfo)
infos = originInfo.split('\t',2)
originName = infos[0]
#print(infos[1])
port = infos[1].split(':',3)[2].split('/')[0]
serverName = infos[1].split('@',2)[1].split(':')[0]
userName = infos[1].split('//',2)[1].split('@')[0]
#print(" --== origin info ==--")
#print(" originName : {0}".format(originName))
#print(" serverName : {0}".format(serverName))
#print(" serverPort : {0}".format(port))
#print(" userName : {0}".format(userName))
#scpStr = "scp -p {0} {1}@{2}:hooks/commit-msg .git/hooks/".format(port,userName,serverName)
# print(scpStr)
def main():
workarg = sys.argv[-1].strip()
print('method "{0}"'.format(workarg))
fetchline = os.popen('git fetch').readlines()
if (len(fetchline) > 0 and fetchline[0].startswith('fatal')) or os.path.exists('src') is False :
print ('please make Terminal to code root path !!!')
else :
getOriginInfo()
if cmp(workarg,'sync') == 0 :
sync()
elif cmp(workarg,'upload') ==0 :
upload()
elif cmp(workarg,'push') ==0 :
print(" sync start...")
sync()
print("")
print(" upload start...")
upload()
elif cmp(workarg,'continue') ==0 :
print(" continue sync")
sync(False)
print("")
else :
print("*************************************************************")
print("")
print('method not find !!! please use "sync" or "upload" or "push"')
print("")
print("---------------------- help --------------------------")
print(versionInfo)
print("*************************************************************")
print("")
if __name__ == '__main__':
main()