CVSROOT 中的 hook 脚本使用 ::-- ZoomQuiet [2006-01-11 04:27:22]

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

1. 钩子!

hook 
n.钩, 吊钩
v.钩住, 沉迷, 上瘾

的确是种容易上瘾的技术。

  • 简单的说,就是CVS和其它程序的友好接口。 通过约定几种事务默许自动调用的脚本,来调用自定的操作脚本....给你的感觉是你可以通过CVS干任何事儿!

1.1. PyBlosxom 的内容维护

  • 怎么想到使用CVS 来维护PyBlosxom 的内容的呢?

    • config.py 中有这么一项:

      # List of strings with directories that should be ignored (e.g. "CVS")
      # ex: py['ignore_directories'] = ["CVS", "temp"]
      
      忽略的目录……
  • 唉呀呀!?特地指出了 CVS 目录, 这一般是使用CVS进行版本管理的本地工作复本中每个目录内含的一个隐藏状信息保存目录名

  • 稍微想象一下子,就知道肯定有非常多的人习惯使用CVS 来自动同步本地和服务器的文件,所以 PyBlosxom 也推荐利用CVS来进行远程内容的维护,而省了FTP/SFTP/webdev 等等各种非要登录才能进行的内容维护

1.1.1. 原理

透过CVS的数据流应是这样子的...

  1. 本地修改
  2. cvs ci 提交修改到CVS

  3. CVS 调用 hook 脚本,进行检查
  4. 如果有指定模块中的文件发生了变化就自动检出所有文件到约定的目录
  5. 但是有个问题,权限问题怎么解决哪!?
    • CVS服务是应该有高权限的,但是PyBlosxom的发布目录应该只有 类似 www 的低权限

    • 解决问题的方法经高手指点弄明白是使用 CvsUp 工具来配合!

    • 调整数据流为:
      1. 本地修改
      2. cvs ci 提交修改到CVS

      3. 运用commitinfo 预处理 hook 来标定一个有更新的记号空文件到指定位置

      4. 定期执行一个commitcheck.sh 脚本来检测 记号空文件是否存在?!

      5. 如果有,则使用 CvsUp 工具来将指定模块内的文件去权限的更新到指定目录!

1.1.2. hookscript

具体的脚本

  1. 传说中的 pre-commit 事务:

    #CVSROOT/commitinfo
    # 仅仅追加一行::
    ALL     $CVSROOT/CVSROOT/checker/signcommit.sh
    
  2. signcommit.sh 我们的标记处理:

    #CVSROOT/checker/signcommit.sh
    #也是仅仅一行搞定
    #!/bin/sh
    > ${CVSROOT}/CVSROOT/checker/have_updates
    
  3. 定时执行的声明

    #/etc/corntab 中声明,每3分钟尝试一次
    */3 * * * * root /path/to/ur/commitcheck.sh 
    
  4. commitcheck.sh 真正的动作

    #调用cvsup 更新,然后清除 have_updates 标记文件
    #!/bin/sh
    CVSROOT="/path/to/ur/cvsrepo."
    CHKPATH="/CVSROOT/checker"
    SUPFILE="/path/to/u/cvsup/supfile/entries.ini"
    if [ -f ${CVSROOT}{CHKPATH}/have_updates ]
    then
           /usr/local/bin/cvsup -1sgL 2 ${SUPFILE} && rm ${CVSROOT}{CHKPATH}/have_updates
    fi
    
    
  5. CvsUp 使用的 支持文件

    # 就是前面指定的 entries.ini
    *default host=127.0.0.1
    *default base=/path/to/ur/pyblosxom/entries
    *default prefix=/path/to/ur/pyblosxom/entries
    *default release=cvs tag=.
    *default delete use-rel-suffix
    blog-all
    

1.1.3. 调试

  1. 简单的手工创建那个空的标记文件,
  2. 然后执行一下子 CvsUp 看到有文件更新到指定目录中,就说明自动同步后半部分成功了!

  3. 小修改一下子随便哪篇文章,然后 cvs ci 看到 have_updates 有生成,就说明一切搞掂了! ;-)

1.2. 小结

CVS 的 hook 脚本基本都是 shell 和 Perl 脚本,不习惯的人是会感觉非常痛苦的

CvsUp 非常的强大,但是使用流程也非常的别扭,实际上还要启动 CvsUp 守护程序的....

2. 反馈