python實(shí)現(xiàn)對svn操作及信息獲取
一、實(shí)現(xiàn)效果
1、通過python獲取路徑下所有文件的svn狀態(tài)
2、通過python對svn進(jìn)行“提交、刪除、鎖、解鎖、刪除等操作”
3、通過svn打開小烏龜界面
二、完整代碼
""" SVN狀態(tài)對照表 """ class FileState: Normal = 0 # 000000 正常在svn管理下的最新的文件 RemoteLocked = 1 # 000001 云端鎖定態(tài) LocalLocked = 2 # 000010 本地鎖定態(tài) Locked = 3 # 000011 已鎖定 state and Locked == True LocalMod = 4 # 000100 本地有修改需提交 RemoteMod = 8 # 001000 遠(yuǎn)程有修改需要更新 Conflicked = 12 # 001100 沖突 state and Conflicked == Conflicked UnVersioned = 16 # 010000 未提交到庫 Error = 32 # 100000 錯(cuò)誤狀態(tài)
""" 具體實(shí)現(xiàn)邏輯 """ # -*- coding: utf-8 -*- import os import pprint import subprocess import time from threading import Thread from xmltodict import parse as xmlParse def _doSvnCommandSync(args): startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE p = subprocess.Popen( args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, shell=True ) rst, err = p.communicate() try: rst = str(rst, 'utf-8') except: rst = str(rst, 'gbk', errors="-ignore") try: err = str(err, 'utf-8') except: err = str(err, 'gbk', errors="-ignore") return rst, err def svnCommitNoUnlockSync(path, comment=""): rst, err = _doSvnCommandSync("svn commit " + path + " -m \"" + comment + "\"" + " --no-unlock") return rst, err def svnCommitSync(path, comment=""): rst, err = _doSvnCommandSync("svn commit " + path + " -m \"" + comment + "\"") return rst, err def _svnStatusSync(path): rst, err = _doSvnCommandSync("svn status " + path) if err: return None, err data = rst return data, None def svnLockSync(path): rst, err = _doSvnCommandSync("svn lock -m '哈哈哈哈哈哈' " + path) return rst, err def svnAddSync(path): data, err = _doSvnCommandSync("svn add " + path) return data, err def svnUnLockSync(path): rst, err = _doSvnCommandSync("svn unlock " + path) return rst, err def svnDeleteSync(path): return _doSvnCommandSync("svn delete " + path) def _svnStatusXMLSync(path): rst, err = _doSvnCommandSync("svn status " + path + " -u --xml") if err: return None, err data = rst data = xmlParse(data) return data, None def syncGetAllFileStatus(rootPath): data, info = _svnStatusXMLSync(rootPath) returnDict = {} lockRole = "" state = FileState.Normal if info: if data is None: state = state | FileState.UnVersioned else: state = state | FileState.Error return returnDict target = data["status"]["target"] if target and "entry" in target: iterList = [] if not isinstance(target["entry"], list): iterList.append(target["entry"]) else: iterList = target["entry"] for fileStatusItem in iterList: state = FileState.Normal filePath = fileStatusItem["@path"] wc_status = fileStatusItem["wc-status"] if "unversioned" == wc_status["@item"]: state = state | FileState.UnVersioned elif "modified" == wc_status["@item"]: state = state | FileState.LocalMod elif "repos-status" in fileStatusItem: repos_status = fileStatusItem["repos-status"] if "lock" in repos_status and "lock" not in wc_status: info = repos_status["lock"]["owner"] lockRole = info state = state | FileState.RemoteLocked elif "lock" in wc_status: info = wc_status["lock"]["owner"] lockRole = info state = state | FileState.LocalLocked elif "modified" == repos_status["@item"]: state = state | FileState.RemoteMod info = "%s is modified on remote, you need update first" % filePath if "modified" == wc_status["@item"]: state = state | FileState.LocalMod info = "%s is modified on local, you need commit first" % filePath returnDict[os.path.normcase(filePath)] = [state, info, lockRole] return returnDict def openTortoise(): pathsStr = "".join("G:\SVNCheckOut\Txt2") cmd = "TortoiseProc.exe /command:commit /path %s" % pathsStr p = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", shell=True ) # class Process(subprocess.Popen): # def register_callback(self, callback, *args, **kwargs): # Thread(target=self._poll_completion, args=(callback, args, kwargs)).start() # # def _poll_completion(self, callback, args, kwargs): # while self.poll() is None: # time.sleep(0.1) # callback(*args, **kwargs) # def openTortoise(): # pathsStr = "".join("G:\SVNCheckOut\Version1") # cmd = "TortoiseProc.exe /command:commit /path %s" % pathsStr # handle = Process(cmd) # handle.register_callback(MyPrint) # def MyPrint(): # print("~~~~~~~~~~~~~~~~~") openTortoise() data = syncGetAllFileStatus(r"G:\SVNCheckOut\Txt2") pprint.pprint(data) os.system("Pause")
三、結(jié)果展示、代碼解析
1、上述代碼最終會(huì)有兩個(gè)輸出展示
a、打開小烏龜提交界面
這里對應(yīng)的其實(shí)就是 “TortoiseProc.exe /command:commit /path %s” % pathsStr" 這句命令行的運(yùn)行
b、展示SVN 文件狀態(tài)
我們需要查看上述 “svn狀態(tài)對照表”,可以發(fā)現(xiàn)狀態(tài)碼 “2、4、16” 分別對應(yīng)的就是 “本地鎖定、本地有修改、未提交到庫”,并且到文件夾中查看可知是一一對應(yīng)的
2、代碼解析
首先,我們看 “_doSvnCommandSync” 該函數(shù)的實(shí)質(zhì)就是運(yùn)行命令行
我們將svn的各種命令行傳入上述函數(shù) “_doSvnCommandSync”,以此構(gòu)造了python內(nèi)的 "提交、刪除、鎖、解鎖 等函數(shù)"
比較特殊的是 “_svnStatusXMLSync” 這個(gè)獲取svn狀態(tài)的函數(shù),因?yàn)槲覀兪菍⑵湟詘ml的格式輸出,因此要對其結(jié)構(gòu)進(jìn)行解析,“svn status " + path + " -u --xml” 這條指令能夠獲取 path路徑下所有文件的svn狀態(tài),我們在 “syncGetAllFileStatus” 函數(shù)中對其解析便可以得到我們想要的信息,包括 鎖的相關(guān)信息、提交信息、文件狀態(tài)等
以上就是python實(shí)現(xiàn)對svn操作及信息獲取的詳細(xì)內(nèi)容,更多關(guān)于python操作svn信息獲取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)簡單神經(jīng)網(wǎng)絡(luò)算法
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡單神經(jīng)網(wǎng)絡(luò)算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Keras中 ImageDataGenerator函數(shù)的參數(shù)用法
這篇文章主要介紹了Keras中 ImageDataGenerator函數(shù)的參數(shù)用法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作
這篇文章主要介紹了python3+opencv 使用灰度直方圖來判斷圖片的亮暗操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python如何實(shí)現(xiàn)不用裝飾器實(shí)現(xiàn)登陸器小程序
這篇文章主要介紹了python如何實(shí)現(xiàn)不用裝飾器實(shí)現(xiàn)登陸器小程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Python Unittest根據(jù)不同測試環(huán)境跳過用例的方法
這篇文章主要給大家介紹了關(guān)于Python Unittest如何根據(jù)不同測試環(huán)境跳過用例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-12-12利用Pandas求兩個(gè)dataframe差集的過程詳解
在Pandas中求差集沒有專門的函數(shù),處理辦法就是將兩個(gè)DataFrame追加合并,然后去重,下面這篇文章主要給大家介紹了關(guān)于利用Pandas求兩個(gè)dataframe差集的相關(guān)資料,需要的朋友可以參考下2022-08-08使用Pandas實(shí)現(xiàn)MySQL窗口函數(shù)的解決方法
本文主要介紹 MySQL 中的窗口函數(shù)row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas實(shí)現(xiàn),同時(shí)二者又有什么區(qū)別,感興趣的朋友一起看看吧2023-02-02使用python-magic和wxPython實(shí)現(xiàn)識(shí)別文檔類型
這篇文章主要介紹了如何使用python-magic模塊和wxPython庫創(chuàng)建一個(gè)簡單的文件列表應(yīng)用程序,該應(yīng)用程序可以顯示所選文件夾中文件的類型,需要的可以參考下2023-08-08