一键commit文件、目录到SVN服务器

 

by:授客 QQ:1033553122

实现功能 1

测试环境 1

代码show 1

 

实现功能

一键提交文件、目录到svn

测试环境

Win7 64位

Python 3.3.2

TortoiseSVN 1.9.6-64 Bit

代码show

#!/usr/bin/env/ python
#
-*- coding:utf-8 -*-


__author__
=
'shouke'


import

subprocess
import

os.path

class

SVNClient:
    def

__init__(self):
        self.svn_work_path
=
'D:\svn\myfolder'

        if
not

os.path.exists(self.svn_work_path):
            print('svn工作路径:%s
不存在,退出程序'

%
self.svn_work_path)
            exit()
        self.try_for_filure
=
1
# 提交失败,重试次数


    def

get_svn_work_path(self):
        return

self.svn_work_path

def

set_svn_work_path(self,
svn_work_path):
        self.svn_work_path
 = svn_work_path

def

update(self):
        args
=
'cd /d '

+
self.svn_work_path
+
' & svn update'

        with

subprocess.Popen(args,
shell=True,

universal_newlines
=
True
,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

as

proc:
            output
= proc.communicate()
            print('执行svn
update命令输出:%s'

%
str(output))
            if
not

output[1]:
                 print('svn
update命令执行成功'

)
                 return

[True,'执行成功']
            else:
                print('svn
update命令执行失败:%s'

%
str(output))
                return
 
[False,
str(output)]

def

add(self,
path):
        args
=
'cd /d '

+
self.svn_work_path
+
' & svn add '

+ path
        with

subprocess.Popen(args,
shell=True,

universal_newlines
=
True
,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

as

proc:
            output
= proc.communicate()
            print('执行svn
add命令输出:%s'

%  str(output))
            if
not

output[1]

or

(
not

str(output) and

str(output).find('is
already under version control'
)
!= -1):
                 print('svn
add命令执行成功'

)
                 return

[True,'执行成功']
            else:
                print('svn
add命令执行失败:%s'

%
str(output))
                return
 
[False,

'svn add命令执行失败:%s'

% str(output)]

def

commit(self,
path):
        args
=
'cd /d '

+
self.svn_work_path
+
' & svn commit -m "添加版本文件"'

+ path
        with

subprocess.Popen(args,
shell=True,

universal_newlines
=
True
,

stdout=subprocess.PIPE,

stderr=subprocess.PIPE)

as

proc:
            output
= proc.communicate()
            print('执行svn
commit命令输出:%s'

%
str(output))
            if
not

output[1]:
                 print('svn
commit命令执行成功'

)
                 return

[True,'执行成功']
            else:
                print('svn
commit命令执行失败,正在重试:%s'

% str(output))
                if

self.try_for_filure
!=
0:
                    self.commit(path)
                    self.try_for_filure
=
self.try_for_filure
-
1
                return
 
[False,
str(output)]

filepath_list
= []

#
获取目标目录下的文件|子目录|子文件路径

def

get_subdir_or_subfile_paths(dirpath, excludes):
    global
 
filepath_list
    if
not

os.path.exists(dirpath):
        print('路径:%s
不存在,退出程序'

% dirpath)
        exit()
    elif
not

os.path.isdir(dirpath):
        print('路径:%s
不为目录'

% dirpath)
        return
 
[]

for

name
in

os.listdir(dirpath):
        for

exclude
in

excludes.strip(',').split(','):
            if
not

name.endswith(exclude):
                full_path
= os.path.join(dirpath, name)
                filepath_list.append(full_path)
                if

os.path.isdir(full_path):
                    get_subdir_or_subfile_paths(full_path,
exclude)

return

filepath_list

if

__name__ ==
'__main__'
:
    svn_client
= SVNClient()
    svn_client.update()
    dirpath
=
'dirname'  
#
'D:\svn\myfolder\dirname'

    if

svn_client.add(dirpath)[0]:
        svn_client.commit(dirpath)

dirpath
=
'D:\svn\myfolder\dirname'
 
#
''

    #
传递每个文件、目录的绝对路径,确保重复执行时,给定目录下新增的文件也可以被提交

    paths
= get_subdir_or_subfile_paths(dirpath,
'.svn'
)

# .svn文件需要被过滤掉,因为无法提交成功

    for

path
in

paths:
        if

svn_client.add(path)[0]:
            svn_client.commit(dirpath)

filepath
=
'myfile.txt'

# 'D:\svn\myfolder\dirname\myfile.txt'

    if

svn_client.add(filepath)[0]:
        svn_client.commit(filepath)

#
报错

    #
dirpath =
'd:/svn/dir_out_of_svn_workpath'

    #
if svn_client.add(dirpath)
[0]:
    #
    svn_client.commit(dirpath)

注意:

例中,svn工作路径为:'D:\svn\myfolder',即“执行checkout时选择的目录”

1、只能添加并提交位于svn工作目录下的文件目录,否则会报错,如下:


if

__name__ ==
'__main__'
:
    svn_client
= SVNClient()
    svn_client.update()
    dirpath
=
'd:/svn/dir_out_of_svn_workpath'

    if

svn_client.add(dirpath)[0]:
        svn_client.commit(dirpath)

2、如果未对给定目录执行过add类函数,那么执行add函数后,执行commit函数,将会把该目录下的文件、目录及其下子文件、子目录,一起提交svn;否则不会做任何提交操作;所以,给add传递参数,最好是通过遍历的方式,传递每个文件、目录的绝对路径。

3、安装svn时,第二项,必须选择图示红色选框框选项,否则运行会报错:svn不是内部或外部命令,也不是可运行的程序

 

Python 一键commit文件、目录到SVN服务器的更多相关文章

  1. 取消本地文件夹与SVN服务器的关联

    我们在开发项目中用SVN作为版本管理工具时,从服务器下载到本地的项目是有.svn文件夹的,这个代表是与svn服务器代码相关联的,如果我们想取消本地文件夹与svn服务器的关联,那么有多种方法,这里介绍导 ...

  2. 解除单个文件的与svn服务器的关联

    有些文件和个人开发环境有关不需要和svn服务器做同步,可以取消其和svn服务的关联. 右键选中要取消关联的文件,右键菜单 Tortoise SVN  --->   unversion and a ...

  3. linux下svn导入新目录到svn服务器特定地址

    svn import transplant-apps/ svn://xx.xx.xx.90/ -m "changelog:add transplant-apps to 90-svn" ...

  4. 使用C#代码追加和提交文件到SVN服务器

    windows系统下使用svn的命令需要安装一个插件,下载地址:http://sourceforge.net/projects/win32svn/?source=typ_redirect 安装后程序会 ...

  5. 从svn服务器自动同步到另一台服务器

    需求场景 A commit B post-commit C (workstation) --------------> (svn server) ---------------------> ...

  6. CentOS7 配置SVN服务器

    也可以参考这里:https://jingyan.baidu.com/article/148a1921d84be34d71c3b18f.html 1.安装svn yum install -y subve ...

  7. IntelliJ IDEA之如何提交代码到SVN服务器

    一.准备 参照<IntelliJ IDEA教程之如何配置SVN>这篇文章配置SVN插件.提交代码到SVN之前,记得要先创建版本库,请参照<<SVN如何建立版本库>> ...

  8. Windows下SVN服务器及客户端的使用

    原文地址:windows下配置VisualSVN Server服务器 作者:Deem_passion 下载安装文件: 服务端安装文件:VisualSVN-Server-1.6.2 客户端安装文件:To ...

  9. SVN服务器和客户端使用教程总结

    一.SVN简介 Subversion是什么? 它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历 ...

随机推荐

  1. java 常见面试题总结(一)

    1.Redis应用场景 答:分布式会话,分布式锁,计数器,缓存,消息队列,排行榜,最新列表. 2.如何访问一个类的私有方法? 答:使用反射进行访问,代码如下: package cn.entity; p ...

  2. sql的转义字符单引号

    在SQL中,我们都知道单引号 ' 表示字符串的开始和结束符号,如: select * from students where name = '小明'; 但如果字符串里面有单引号时,应该怎么查询呢? 这 ...

  3. 【转】CSS中的浮动和清除浮动

    以下转自<CSS中的浮动和清除浮动,梳理一下!> 浮动到底是什么? 浮动核心就一句话:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素.请默念3次! 浮动最初设计的目 ...

  4. postgresql数据库删除时提示回话 sessions using the database

    数据库命令行或者管理工具中执行删除数据库的命令, DROP DATABASE testdb; 的时候,可能会提示: ERROR: database "testdb" is bein ...

  5. ML - 特征选择

    1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...

  6. springBoot(7)---整合Mybaties增删改查

    整合Mybaties增删改查 1.填写pom.xml <!-- mybatis依赖jar包 --> <dependency> <groupId>org.mybati ...

  7. 【web开发】docker中的数据库

    注:自从开始使用docker,部署方面的事情就简单多了.使用docker构建的数据库容器不用直接安装,开启后就可以使用,也比以前方便很多.下面将一些要点记录下来. 下面的例子使用以下环境: - 系统( ...

  8. k8s网络之calico

    一.概述 前面我们部署calico由于集群规模不是很大,使用的是calico的bgp模式的node-to-node-mesh全节点互联,这种模式在小规模集群里面还可以用,3.4.0版本的calico支 ...

  9. Jenkins自动化构建配置

    写在前头 我每次修改代码一点东西,都要进行一个重新发布.重新发布的流程大概如下: 将最新代码同步上传到git上面 Maven打包 mvn clean install 将最新的jar包上传到服务器上面, ...

  10. Java二维码的制作

    二维码现在已经到处都是了,下面是二维码的介绍 :二维码 ,又称 二维条码 , 二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在 ...