最近寫一個類似博客的東西,用於存放部門的文檔,爲了文章能夠回滾,寫了個git的類用於操作本地類,如下:
腳本名稱:myGit.py
import os,sys,re
import logging
logger = logging.getLogger(__name__)
from runCMD import runCmd
from django.conf import settings
GIT_DIR = settings.GIT_DIR
def write2GitWorkSpace(file,context):
'''
將文件寫入到本地git的工作區間
'''
try:
with open(os.path.join(GIT_DIR,file),'w') as f:
f.write(context)
return {'code':True}
except Exception,e:
logger.error('寫入到git工作區文件失敗:%s' % str(e))
return {'code':False,'msg':'寫入到git工作區文件失敗:%s' % str(e)}
def commit2Git(file):
'''
將修改提交到git中
'''
if not os.path.exists(os.path.join(GIT_DIR,file)):
logger.error('文件不存在')
return {'code':False,'msg':'文件不存在'}
cmd = 'cd %s;git add %s && git commit -m "%s"' % (GIT_DIR,file,file)
n = runCmd(real=1)
execute = n.run(cmd)
if not execute[0]:
logger.error("在git中提交失敗: %s" % execute[2])
return {'code':False,'msg':"在git中刪除失敗: %s" % execute[2]}
else:
logger.info("提交git成功")
return {'code':True}
def rmFileInGit(file):
'''
在git中刪除文件
'''
cmd = 'cd %s;git rm %s && git commit -m "%s"' % (GIT_DIR,file,file)
n = runCmd(real=1)
execute = n.run(cmd)
if not execute[0]:
logger.error("在git中刪除失敗: %s" % execute[2])
return {'code':False,'msg':"在git中刪除失敗: %s" % execute[2]}
else:
logger.info(execute)
logger.info("在git中刪除成功")
return {'code':True}
def getFileLog(file,item=0):
'''
獲取指定文件的git版本控制信息
'''
if item==0:
cmd = 'cd %s;git log --pretty="[%%cd(%%cr)] %%h : %%s" -p %s' % (GIT_DIR,file)
else:
cmd = 'cd %s;git log --pretty="[%%cd(%%cr)] %%h : %%s" -%s -p %s' % (GIT_DIR,item,file)
n = runCmd(real=1)
execute = n.run(cmd)
if not execute[0]:
logger.error("執行git失敗: %s" % execute[2])
return {'code':False,'msg':"在git中刪除失敗: %s" % execute[2]}
else:
return execute[2]
#return formatLogData(execute[2])
def formatLogData(data):
'''
對版本控制信息數據進行格式化
'''
resultData = []
#找出每個版本的開頭
pat1 = re.compile(r'(?=\[.*\(.*ago\)\])')
#替換成容易辨認的統一擡頭
data = pat1.sub('#----',data)
data += '#----'
#分離出每個版本
pat2 = re.compile(r'(?<=#----)(.*?)\n(?=#----)',re.S)
#提取每個版本的信息
pat3 = re.compile(r'\[(.*)\]\s(.*)\s:\s(.*)\n\ndiff.*@@\n(.*)\n',re.S)
#替換掉沒用的字符串
pat4 = re.compile(r'\\ No newline at end of file\n')
#分離出每個版本,循環取出每個版本信息
for item in re.findall(pat2,data):
resultData.append(pat3.findall(pat4.sub('',item))[0])
return resultData
def getFileVersionData(file,version):
'''
獲取指定文件某個版本內容
'''
logger.info("查看文件版本視圖")
cmd = 'cd %s;git checkout %s -- %s' % (GIT_DIR,version,file)
logger.info(cmd)
n = runCmd(real=1)
execute = n.run(cmd)
if not execute[0]:
logger.error("在git中獲取文件指定歷史版本失敗: %s" % execute[2])
return {'code':False,'msg':"在git中刪除失敗: %s" % execute[2]}
else:
with open(os.path.join(GIT_DIR,file),'r') as f:
return f.read()
def revertArticle(file,version):
'''
回滾文檔到指定版本
'''
logger.info('文件開始回滾')
cmd = 'cd {DIR};git checkout {version} -- {file} && git commit -m "revert to {version}"'.format(
DIR = GIT_DIR,
version = version,
file= file)
n = runCmd(real=1)
execute = n.run(cmd)
if not execute[0]:
logger.error("在git中回滾失敗: %s" % execute[2])
return {'code':False,'msg':"在git中刪除失敗: %s" % execute[2]}
else:
with open(os.path.join(GIT_DIR,file),'r') as f:
return f.read()
runCMD是一個執行命令的腳本,在文章http://blog.csdn.net/u011085172/article/details/78106859 點擊打開鏈接 有,可以參考下
有了以上git的操作類,就可以盡情的調用來操作git存儲文檔、博客了:
創建:
gitid = uuid.uuid1()
logger.info("寫入git:[%s]" % gitid)
exc_result = write2GitWorkSpace(str(gitid),requestData['article'])
if exc_result['code']:
exc_result = commit2Git(str(gitid))
if not exc_result['code']:
return JsonResponse(exc_result)
else:
return exc_result
logger.info("寫入git完畢")
編輯:
logger.info("編輯文檔寫入git:[%s]" % gitid)
exc_result = write2GitWorkSpace(str(gitid),requestData['article'])
if exc_result['code']:
exc_result = commit2Git(str(gitid))
if not exc_result['code']:
return JsonResponse(exc_result)
else:
return JsonResponse(exc_result)
logger.info("編輯文檔寫入git完畢")
版本控制,獲取版本記錄:
gitid = fileRecord.objects.get(id=requestData['articleId']).get_gitid()
exc_result = getFileVersionData(str(gitid),requestData['version'])
if type(exc_result) == dict and exc_result.has_key('code') and not exc_result['code']:
return JsonResponse(exc_result)
版本回滾:
gitid = fileRecord.objects.get(id=requestData['articleId']).get_gitid()
exc_result = revertArticle(str(gitid),requestData['version'])
logger.info("exc_result type:"+ str(type(exc_result)))
if type(exc_result) == dict and exc_result.has_key('code') and not exc_result['code']:
return JsonResponse(exc_result)
姿勢都有了,還有啥做不了呢!
樣例:
版本控制也沒樣例: