一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python實現(xiàn)對svn操作及信息獲取

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

2022-02-20 00:20在逆境中蛻變 Python

這篇文章主要介紹了python實現(xiàn)對svn的操作及信息獲取示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

一、實現(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 錯誤狀態(tài)
"""
具體實現(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、上述代碼最終會有兩個輸出展示

a、打開小烏龜提交界面

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

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

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

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

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

我們需要查看上述 “svn狀態(tài)對照表”,可以發(fā)現(xiàn)狀態(tài)碼 “2、4、16” 分別對應(yīng)的就是 “本地鎖定、本地有修改、未提交到庫”,并且到文件夾中查看可知是一一對應(yīng)的

2、代碼解析

首先,我們看 “_doSvnCommandSync” 該函數(shù)的實質(zhì)就是運(yùn)行命令行

我們將svn的各種命令行傳入上述函數(shù) “_doSvnCommandSync”,以此構(gòu)造了python內(nèi)的 "提交、刪除、鎖、解鎖 等函數(shù)"

比較特殊的是 “_svnStatusXMLSync” 這個獲取svn狀態(tài)的函數(shù),因為我們是將其以xml的格式輸出,因此要對其結(jié)構(gòu)進(jìn)行解析,“svn status " + path + " -u --xml” 這條指令能夠獲取 path路徑下所有文件的svn狀態(tài),我們在 “syncGetAllFileStatus” 函數(shù)中對其解析便可以得到我們想要的信息,包括 鎖的相關(guān)信息、提交信息、文件狀態(tài)等

以上就是python實現(xiàn)對svn操作及信息獲取的詳細(xì)內(nèi)容,更多關(guān)于python操作svn信息獲取的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/weixin_40301728/article/details/115792763

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: melody中文字幕 | 很黄的网站在线观看 | 精品国产一区二区三区久久久蜜臀 | 欧美一卡2卡三卡4卡5卡免费观看 | 亚洲国产韩国欧美在线不卡 | 亚洲国产第一区二区三区 | 6080午夜| 91亚洲精品国产自在现线 | avtt天堂网手机版亚洲 | 亚洲精品免费视频 | 日产乱码2021永久手机版 | kisssis无减删全集在线观看 | free性丰满hd性欧美厨房 | 幻女free性摘花第一次 | 西施打开双腿下面好紧 | 亚洲午夜视频 | 日韩丝袜在线观看 | 免费a漫 - 禁密天堂 | 国产在线精品亚洲第一区香蕉 | 果冻传媒在线免费观看 | 富士av105| 免费观看国产视频 | 国产欧美日韩综合二区三区 | 免费一区| 国产剧情麻豆刘玥视频 | 色欲都市 | 白丝校花掀起短裙呻吟小说 | 精品久久久久久久久久久久久久久 | 精品国产福利一区二区在线 | 大逼美女 | 欧美高清milf在线播放 | 荷兰精品女人性hd | 小早川怜子息梦精在线播放 | 性白俄罗斯高清xxxxx | 日韩欧美在线一区二区三区 | 91精品国产91久久久久 | 日韩精品欧美高清区 | 国产精品二区高清在线 | 成人伊人青草久久综合网破解版 | 欧美一级特黄刺激大片视频 | 久久亚洲精品成人 |