Differences between revisions 1 and 2
Revision 1 as of 2006-01-11 06:32:59
Size: 32
Editor: ZoomQuiet
Comment:
Revision 2 as of 2006-01-11 08:24:10
Size: 5098
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
{{{CVS太古老,SVN正当年;
   版本管理是基础,然则可以更有用!
   }}}
==== 缘起 ====
 * 很早就听说CVS 在hacker 手里什么花样都玩的出来!写日志,写小说,聊天……
 * 后来尝试的[:CvsRootHook:使用cvs来维护内容] 果然可行
  * 但是非常的麻烦,而且要频率启动一个检测脚本来配合数据的同步...
 * 使用 SVN 作为主要的版本管理系统后,当然的也想同理进行,有版本控制的内容维护!

==== 研究 ====
'''SVN 有hook 嘛?怎么使用?'''
 * 看书先! [http://svnbook.red-bean.com/ 《使用Subversion进行版本控制》]的在线主页
  * [http://www.subversion.org.cn/svnbook/1.1/index.html 中文1.1版本]
 * 嗯嗯!果然不出所料,有!
 [http://www.subversion.org.cn/svnbook/1.1/svn-ch-5-sect-2.html#svn-ch-5-sect-2.1 钩子脚本]
 * 看样子SVN没有玩太多的事务,就明晰的分了五种:
     1. start-commit 提交前触发事务
     1. pre-commit 提交完成前触发事务
     1. post-commit 提交完成时触发事务
     1. pre-revprop-change 版本属性修改前触发事务
     1. post-revprop-change 版本属性修改后触发事务

==== 实现 ====
'''那未我只是要自动的将所有的指定更新同步到目标中'''
 * 当然是 `post-commit` !
 {{{#/path/to/u/SVNrepo/hooks/post-commit.tmpl
...
REPOS="$1"
REV="$2"

#commit-email.pl "$REPOS" "$REV" [email protected]
#log-commit.py --repository "$REPOS" --revision "$REV"
...
}}}
 * 按照说明,只要将 post-commit.tmpl 重命名为 post-commit SVN 就可以运行了!
 * 但是! log-commit.py遍查不到,可以看到的 mailer.py 也大量调用 subversion-python-1.1.3::svn 模块,实在不明白
  * 好容易 看到[http://svn.collab.net/repos/svn/branches/1.2.x/contrib/hook-scripts/commit-block-joke.py commit-block-joke.py] 比较简单,但是怎么也不调用?!
  * 最终还是要[http://svn.haxx.se/users/archive-2006-01/0349.shtml 问列表]
   * 才知道原来是文档没有看透:{{{
由于安全原因,Subversion版本库在一个空环境中执行钩子脚本—就是没有任何环境变量,
甚至没有$PATH或%PATH%。
由于这个原因,许多管理员会感到很困惑,它们的钩子脚本手工运行时正常,
可在Subversion中却不能运行。
要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。
}}}
   * 有简单的合理测试方式:{{{
$ env - ./post-commit /var/lib/svn-repos 1234
}}}
 * 这样一来果然快速调整好调用关系:{{{
...
HOOKS="/path/to/u/svnrepo/hooks/script"
$HOOKS/post-commit.py "$REPOS" "$REV"
}}}
 * 以Pythonic 的精神快速组织一下子:{{{#!python
#!/usr/local/bin/python
#coding=utf-8
import sys,os,time
LOOK = "/usr/local/bin/svnlook"
SVN = "/usr/local/bin/svn"
LOGFILE = "/path/to/u/hooks/log/post-commit.log"
f = open( LOGFILE, "a+" )
TSTAMP = "%s"%time.strftime("%y-%m-%d %H:%M:%S", time.localtime())
def autoco(dirs,svn,mark,aim,mod):
    """自动检出指定项目的代码到指定目录
        - dirs 本次修改了的目录
        - svn svn 命令所在地
        - mark 匹配项
        - aim 输出目标
        - mod 检出的模块
       要求目标路径有预先检出的环境!
    """
    if mark in dirs:
        print >> f,TSTAMP+" %s marked::%s >>>> updating..."%(("+"*7),mark)
        upsvn = svn+" update %s"%(aim+mod)
        print >> f,TSTAMP+" "+"+"*7
        up = os.popen(upsvn).read().strip()
        print >> f,up
    else:
        print >> f,TSTAMP+" -------- marked null >>> update::nothing"
def changedirs(look,rev,repos):
    """使用 svnlook 得到修改的路径
    """
    dirs = os.popen( LOOK+" changed -r "+ rev + " " + repos).read().strip()
    return dirs
def usage():
    print "Usage: " + sys.argv[0] + " REPOS REV\n"
    print >> f,TSTAMP+"Usage: " + sys.argv[0] + " REPOS REV"
    sys.exit(0)
if __name__ == '__main__':
    if len(sys.argv) != 3:
        usage()
    repos = sys.argv[1]
    rev = sys.argv[2]
    print >> f,TSTAMP+" repos::"+repos+" rev::"+rev
    ## Blog事务
    autoco(changedirs(LOOK,rev,repos),SVN
        ,"pyblosxom"
        ,"/path/to/ur/pyblosxom"
        ,"")
}}}
 * 关键就是:'''一切都使用绝对路径!'''
==== 小结 ====
'''原理都非常简单,但是实施时要时刻保持清醒!'''
 * 基本的行动路线:
  1. 准备 hooks
  1. 安装调试
  1. 部属目标工作复本![[FootNote(此处有个小遗留问题:权限! 聪明的你一定知道怎么修正的哪!-))]]
   * 提示,注意先后顺序,否则会造成版本冲突,而没有将目标文件同步!
    1. 本地加入内容模块,追加到SVN中,并提交
    1. 增加hooks 处理,确定事务处理
    1. 服务器端,检出工作复本
    1. 开始透过 SVN 进行内容维护!
 
 * 邮件列表实在伟大,让全球任何地方的人可以分享体验!
 

维护PyBlosxom 内容

{{{CVS太古老,SVN正当年;

  • 版本管理是基础,然则可以更有用! }}}

缘起

  • 很早就听说CVS 在hacker 手里什么花样都玩的出来!写日志,写小说,聊天……
  • 后来尝试的[:CvsRootHook:使用cvs来维护内容] 果然可行

    • 但是非常的麻烦,而且要频率启动一个检测脚本来配合数据的同步...
  • 使用 SVN 作为主要的版本管理系统后,当然的也想同理进行,有版本控制的内容维护!

研究

SVN 有hook 嘛?怎么使用?

实现

那未我只是要自动的将所有的指定更新同步到目标中

  • 当然是 post-commit ! {{{#/path/to/u/SVNrepo/hooks/post-commit.tmpl

... REPOS="$1" REV="$2"

#commit-email.pl "$REPOS" "$REV" [email protected] #log-commit.py --repository "$REPOS" --revision "$REV" ... }}}

  • 按照说明,只要将 post-commit.tmpl 重命名为 post-commit SVN 就可以运行了!
  • 但是! log-commit.py遍查不到,可以看到的 mailer.py 也大量调用 subversion-python-1.1.3::svn 模块,实在不明白
    • 好容易 看到[http://svn.collab.net/repos/svn/branches/1.2.x/contrib/hook-scripts/commit-block-joke.py commit-block-joke.py] 比较简单,但是怎么也不调用?!

    • 最终还是要[http://svn.haxx.se/users/archive-2006-01/0349.shtml 问列表]

      • 才知道原来是文档没有看透:

        由于安全原因,Subversion版本库在一个空环境中执行钩子脚本—就是没有任何环境变量,
        甚至没有$PATH或%PATH%。
        由于这个原因,许多管理员会感到很困惑,它们的钩子脚本手工运行时正常,
        可在Subversion中却不能运行。
        要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝对路径。
      • 有简单的合理测试方式:

        $ env - ./post-commit /var/lib/svn-repos 1234
  • 这样一来果然快速调整好调用关系:

    ...
    HOOKS="/path/to/u/svnrepo/hooks/script"
    $HOOKS/post-commit.py "$REPOS" "$REV"
  • 以Pythonic 的精神快速组织一下子:

       1 #!/usr/local/bin/python
       2 #coding=utf-8
       3 import sys,os,time
       4 LOOK = "/usr/local/bin/svnlook"
       5 SVN = "/usr/local/bin/svn"
       6 LOGFILE = "/path/to/u/hooks/log/post-commit.log"
       7 f = open( LOGFILE, "a+" )
       8 TSTAMP = "%s"%time.strftime("%y-%m-%d %H:%M:%S", time.localtime())
       9 def autoco(dirs,svn,mark,aim,mod):
      10     """自动检出指定项目的代码到指定目录
      11         - dirs  本次修改了的目录
      12         - svn svn 命令所在地
      13         - mark  匹配项
      14         - aim   输出目标
      15         - mod   检出的模块
      16        要求目标路径有预先检出的环境!
      17     """
      18     if mark in dirs:
      19         print >> f,TSTAMP+" %s marked::%s >>>> updating..."%(("+"*7),mark)
      20         upsvn = svn+" update %s"%(aim+mod)
      21         print >> f,TSTAMP+" "+"+"*7
      22         up = os.popen(upsvn).read().strip()
      23         print >> f,up
      24     else:
      25         print >> f,TSTAMP+" -------- marked null >>> update::nothing"
      26 def changedirs(look,rev,repos):
      27     """使用 svnlook 得到修改的路径
      28     """
      29     dirs = os.popen( LOOK+" changed -r "+ rev + " " + repos).read().strip()
      30     return dirs
      31 def usage():
      32     print "Usage: " + sys.argv[0] + " REPOS REV\n"
      33     print >> f,TSTAMP+"Usage: " + sys.argv[0] + " REPOS REV"
      34     sys.exit(0)
      35 if __name__ == '__main__':
      36     if len(sys.argv) != 3:
      37         usage()
      38     repos = sys.argv[1]
      39     rev = sys.argv[2]        
      40     print >> f,TSTAMP+" repos::"+repos+" rev::"+rev
      41     ## Blog事务
      42     autoco(changedirs(LOOK,rev,repos),SVN
      43         ,"pyblosxom"
      44         ,"/path/to/ur/pyblosxom"
      45         ,"")
    
  • 关键就是:一切都使用绝对路径!

小结

原理都非常简单,但是实施时要时刻保持清醒!

  • 基本的行动路线:
    1. 准备 hooks
    2. 安装调试
    3. 部属目标工作复本!FootNote(此处有个小遗留问题:权限! 聪明的你一定知道怎么修正的哪!-))

      • 提示,注意先后顺序,否则会造成版本冲突,而没有将目标文件同步!
        1. 本地加入内容模块,追加到SVN中,并提交
        2. 增加hooks 处理,确定事务处理
        3. 服务器端,检出工作复本
        4. 开始透过 SVN 进行内容维护!
  • 邮件列表实在伟大,让全球任何地方的人可以分享体验!

PyBlosxomWithSvn (last edited 2009-12-25 07:11:08 by localhost)