svn的钩子

通过svn的钩子可以实现即commit即change通知。

具体方法如下:将commands模块的getstatusoutput函数的     pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')修改为pipe = os.popen(cmd, 'r')

(上述方法并非最佳,应重写一个函数命名为getstatusoutput1,然后将pipe一行重写,否则有可能出现python调用函数getstatusoutput函数是格式不对而产生程序崩溃)

然后再%repository server%/project/hook下增加文件commit.py,pos-commit.bat,源码如下

----------------------------------------commit.py---------------------------------------------------------------

import os
cmd='svnlook youngest "C:/Repository Server/HelloWorld"'
pipe=os.popen(cmd)
version=pipe.read().split('/n')[0]
pipe.close()
cmd='python C:/BuilderServer/buildbot-0.7.5/contrib/svn_buildbot.py --repository "c:/repository server/HelloWorld" --revision '+version+' --bbserver localhost --bbport 9989'
pipe1=os.popen(cmd)
text=pipe1.read()
print cmd
---------------------------------------------------------------------------------------------------------------------

--------------------------------------------pos-commit.bat------------------------------------------------------

python "C:/Repository Server/HelloWorld/hooks/commit.py"

---------------------------------------------------------------------------------------------------------------------

如此来当commit结束后,将执行post-commit.bat批处理,运行python脚本达到钩子效果

 
### 使用Python实现SVN Hooks #### SVN Hook简介 Subversion(SVN)允许通过钩子脚本(hooks)来定义特定事件发生时要执行的操作。这些事件可以是在提交之前(pre-commit),提交之后(post-commit), 锁定前(pre-lock)等等[^2]。 #### 编写pre-commit Hook 对于`pre-commit` hook来说,通常用于验证即将被提交的内容是否满足某些条件。下面是一个简单的例子,在这个例子中会检查日志消息长度: ```python #!/usr/bin/env python3 import sys import subprocess def check_log_message(repos, txn): message = "".join(subprocess.check_output( ["svnlook", "log", repos, "-t", txn]).decode().splitlines()) if not message or len(message.strip()) < 10: print("Commit failed: Log message too short.") sys.exit(1) if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: pre-commit.py REPOS TXN") sys.exit(1) repos = sys.argv[1] txn = sys.argv[2] try: check_log_message(repos, txn) except Exception as e: print(f"Error occurred during validation: {str(e)}") sys.exit(1) ``` 这段代码首先获取了来自`svnlook log`的日志信息并进行了基本的非空以及最小字符数校验。如果不符合要求,则终止提交过程[^1]。 #### 实现post-commit Hook发送通知邮件 当版本库中的数据已经成功保存下来以后触发的是`post-commit` hook。这里展示了一个利用SMTP协议向指定邮箱地址发送简单文本形式的通知的例子: ```python #!/usr/bin/env python3 import smtplib from email.mime.text import MIMEText import sys def send_email(subject, body, to_addr='example@example.com'): msg = MIMEText(body) msg['Subject'] = subject msg['From'] = 'noreply@yourdomain.com' msg['To'] = to_addr with smtplib.SMTP('smtp.yourserver.com') as server: server.login('username', 'password') server.sendmail(msg['From'], [msg['To']], msg.as_string()) if __name__ == '__main__': repo_path = sys.argv[1] revision = int(sys.argv[2]) author_info = subprocess.check_output([ "svnlook", "author", repo_path, '-r', str(revision)]).decode().strip() changed_paths = "\n".join(subprocess.check_output([ "svnlook", "changed", repo_path, '-r', str(revision)]).decode().splitlines()) mail_content = f""" Author: {author_info} Changed paths:\n{changed_paths}""" send_email("[SVN Commit Notification]", mail_content) ``` 此部分实现了读取最新的修订版号,并从中提取作者名和更改路径列表作为邮件正文的一部分;最后调用了函数send_email()完成实际的消息投递工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值