最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)對(duì)svn操作及信息獲取

 更新時(shí)間:2021年10月28日 15:08:00   作者:在逆境中蛻變  
這篇文章主要介紹了python實(shí)現(xiàn)對(duì)svn的操作及信息獲取示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

一、實(shí)現(xiàn)效果

1、通過(guò)python獲取路徑下所有文件的svn狀態(tài)
2、通過(guò)python對(duì)svn進(jìn)行“提交、刪除、鎖、解鎖、刪除等操作”
3、通過(guò)svn打開(kāi)小烏龜界面

二、完整代碼

"""
SVN狀態(tài)對(duì)照表
"""
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 未提交到庫(kù)
    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、打開(kāi)小烏龜提交界面

在這里插入圖片描述

這里對(duì)應(yīng)的其實(shí)就是 “TortoiseProc.exe /command:commit /path %s” % pathsStr" 這句命令行的運(yùn)行

b、展示SVN 文件狀態(tài)

在這里插入圖片描述

在這里插入圖片描述

我們需要查看上述 “svn狀態(tài)對(duì)照表”,可以發(fā)現(xiàn)狀態(tài)碼 “2、4、16” 分別對(duì)應(yīng)的就是 “本地鎖定、本地有修改、未提交到庫(kù)”,并且到文件夾中查看可知是一一對(duì)應(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的格式輸出,因此要對(duì)其結(jié)構(gòu)進(jìn)行解析,“svn status " + path + " -u --xml” 這條指令能夠獲取 path路徑下所有文件的svn狀態(tài),我們?cè)?“syncGetAllFileStatus” 函數(shù)中對(duì)其解析便可以得到我們想要的信息,包括 鎖的相關(guān)信息、提交信息、文件狀態(tài)等

以上就是python實(shí)現(xiàn)對(duì)svn操作及信息獲取的詳細(xì)內(nèi)容,更多關(guān)于python操作svn信息獲取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中捕捉詳細(xì)異常信息的代碼示例

    Python中捕捉詳細(xì)異常信息的代碼示例

    這篇文章主要介紹了Python中捕捉詳細(xì)異常信息的代碼示例,本文的代碼是從Python 2.7的源碼中得來(lái),可以獲取文件位置、行號(hào)、函數(shù)、異常信息等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Python使用sigthief簽發(fā)證書(shū)的實(shí)現(xiàn)步驟

    Python使用sigthief簽發(fā)證書(shū)的實(shí)現(xiàn)步驟

    Windows 系統(tǒng)中的一些非常重要文件通常會(huì)被添加數(shù)字簽名,其目的是用來(lái)防止被篡改,能確保用戶通過(guò)互聯(lián)網(wǎng)下載時(shí)能確信此代碼沒(méi)有被非法篡改和來(lái)源可信,從而保護(hù)了代碼的完整性、保護(hù)了用戶不會(huì)被病毒、惡意代碼和間諜軟件所侵害,本章將演示證書(shū)的簽發(fā)與偽造
    2021-06-06
  • Python數(shù)據(jù)讀寫(xiě)之Python讀寫(xiě)CSV文件

    Python數(shù)據(jù)讀寫(xiě)之Python讀寫(xiě)CSV文件

    這篇文章主要介紹了Python數(shù)據(jù)讀寫(xiě)之Python讀寫(xiě)CSV文件,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 一文詳解Python中的zip函數(shù)

    一文詳解Python中的zip函數(shù)

    在Python中,處理數(shù)據(jù)時(shí)經(jīng)常需要同時(shí)遍歷多個(gè)序列,zip函數(shù)提供了一種簡(jiǎn)潔的方式來(lái)組合這些序列,它用于將多個(gè)可迭代對(duì)象(如列表、元組等)的元素配對(duì),本文將給大家詳細(xì)介紹一下Python中的zip函數(shù),需要的朋友可以參考下
    2024-05-05
  • Python實(shí)現(xiàn)查找并刪除重復(fù)文件的方法小結(jié)

    Python實(shí)現(xiàn)查找并刪除重復(fù)文件的方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫(xiě)一個(gè)簡(jiǎn)單的腳本來(lái)查找并刪除指定目錄及其子目錄中的重復(fù)文件,需要的可以參考一下
    2025-03-03
  • python 實(shí)現(xiàn)繪制整齊的表格

    python 實(shí)現(xiàn)繪制整齊的表格

    今天小編就為大家分享一篇python 實(shí)現(xiàn)繪制整齊的表格,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • python測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)例

    python測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)例

    這篇文章主要介紹了python測(cè)試驅(qū)動(dòng)開(kāi)發(fā)實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • python中mpi4py的所有基礎(chǔ)使用案例詳解

    python中mpi4py的所有基礎(chǔ)使用案例詳解

    這篇文章主要介紹了python中mpi4py的所有基礎(chǔ)使用,本文通過(guò)10個(gè)案例給大家詳細(xì)講解,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 利用python代碼管理Word文檔屬性信息

    利用python代碼管理Word文檔屬性信息

    在Word文檔管理中,文檔屬性包含與文檔有關(guān)的關(guān)鍵信息,如標(biāo)題、作者、創(chuàng)建日期等,是進(jìn)行文檔管理的重要工具,本文將展示如何利用Python代碼來(lái)靈活操控Word文檔的屬性信息,從而滿足個(gè)性化與批量化文檔處理的需求,需要的朋友可以參考下
    2024-05-05
  • Python3.6簡(jiǎn)單操作Mysql數(shù)據(jù)庫(kù)

    Python3.6簡(jiǎn)單操作Mysql數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了Python3.6簡(jiǎn)單操作Mysql數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評(píng)論

江口县| 九江县| 乐昌市| 武平县| 呼玛县| 墨脱县| 高州市| 乌拉特前旗| 吉水县| 库伦旗| 揭阳市| 东乡族自治县| 泾源县| 泉州市| 新津县| 阿勒泰市| 奉新县| 桂平市| 庆城县| 恭城| 奇台县| 肃南| 和田市| 历史| 西安市| 绿春县| 祁连县| 清新县| 灵山县| 荥阳市| 兴国县| 湖州市| 斗六市| 普格县| 烟台市| 巩留县| 嘉鱼县| 丽水市| 色达县| 灵台县| 康定县|