python 用本地git來保存文件或者博客,實現版本控制

最近寫一個類似博客的東西,用於存放部門的文檔,爲了文章能夠回滾,寫了個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)


姿勢都有了,還有啥做不了呢!

樣例:


版本控制也沒樣例:






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章