LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1700|回复: 9

[原创]脚本:自动维护googlecode上的Arch软件仓库

[复制链接]
发表于 2009-6-16 18:45:35 | 显示全部楼层 |阅读模式
为了方便大家积极参与到archlive-pkg archlive项目, 写此脚本

欢迎大家勘误, 欢迎大家提出修改意见

将该脚本保存为maintain_xfce4-svn:
1、sh ./maintain_xfce4-svn co 检出svn
然后就可以编辑pkgbuild文件, 如果软件的PKGBUILD是svn的, 一般不用更改。。。

2、sh ./maintain_xfce4-svn -i compile 批量编译并安装到本地计算机
编译xfce4-svn需要边编译边安装, 后面的依赖前面的

3、 sh ./maintain_xfce4-svn repo 更新软件仓数据库文件

4、sh ./maintain_xfce4-svn upload 批量上传

5、 sh ./maintain_xfce4-svn update 将本地svn修改更新到googlecode上的svn仓库
  1. #!/bin/bash
  2. # 自动编译维护repo的脚本  作者 Carbon Jiao
  3. # 本脚本给予GPL v3发布,使用者须遵循GPL v3相应规定
  4. # 本脚本调用的脚本版权归原作者
  5. #
  6. # 本脚本主要实现以下功能:
  7. # 1、从指定的googlecode项目上下载指定名称的PKGBUILD配置文件
  8. # 2、批量编译指定目录下的软件
  9. # 3、将编译后的软件包创建repo,并更新到总repo数据库文件
  10. # 4、将编译的软件包批量上传到googlecode指定的项目文件中
  11. # 5、将修改后的PKGBUILD文件更新回googlecode指定项目的svn仓库
  12. # 特别说明:维护对应软件仓里面的软件的依赖关系必须放在对应软件仓目录下的depends文件中
  13. # 下个版本将对普通软件包自动检测依赖关系
  14. #
  15. #----2009-06-17 判断一个程序是否已经安装
  16. #----2009-06-17 在olympic的帮助下debug sed -i 's/^M//g' maintain   ^M由Ctrl-v +M 输入, 多余的回车符——用notepad编辑过)
  17. #----2009-06-16 第一版
  18. #
  19. APPNAME=$(basename "${0}")
  20. # 维护archlive-pkg 维护人员用户信息
  21. UserName="carbonjiao@gmail.com"
  22. Passwd=""
  23. # 此密码非gmail帐号密码,是项目授权密码  在http://code.google.com/hosting/settings页面查看
  24. START=$(pwd)
  25. # 不上传的文件清单,须全名 (一般维护不需要)
  26. if [ -f $(pwd)/exclude.list ]; then
  27.         EXCLUDELIST="$(pwd)/exclude.list"
  28. else
  29.         EXCLUDELIST=""
  30. fi
  31. # 如果googlecode上已经存在预提交的文件,则不覆盖
  32. FORCE="n"
  33. # 即使googlecode上已经存在预提交的文件也提交
  34. #FORCE="y"
  35. Project_Name="archlive-pkg"
  36. URL="http://${Project_Name}.googlecode.com"
  37. SVN_URL="$URL/svn/trunk/PKGBUILD"
  38. Full_Repo_Name="archlive-pkg"
  39. This_Repo_Name="xfce4-svn"
  40. # 编译后是否安装?
  41. INSTALL=n
  42. PKGDIR=$START/PKG
  43. SVNDIR=$START/${This_Repo_Name}
  44. # 编译好的包放在当前目录的PKG目录下
  45. if [ ! -d $PKGDIR ]; then
  46.         mkdir -p $PKGDIR
  47. fi
  48. # 软件仓数据库文件制作脚本,属于pacman
  49. if [ -f "$(pwd)/repo-add" ]; then
  50.    REPO_ADD="$(pwd)/repo-add"
  51. else
  52.    REPO_ADD="/usr/bin/repo-add"
  53. fi
  54. usage ()
  55. {
  56.     echo " 用法:  ${APPNAME} [选项]  命令 <命令选项>"
  57.     echo " 选项:"
  58.     echo "    -p Project_Name   预上传到googlecode的项目名, 默认: archlive-pkg"
  59.     echo "    -u UserName            Googlecode帐号"
  60.     echo "    -w Passwd         Googlecode密码"
  61.     echo "    -e EXCLUDELIST    不上传的文件清单"
  62.     echo "    -F Full_Repo_Name 全局软件仓名"
  63.     echo "    -r This_Repo_Name 该小软件仓名"
  64.     echo "    -f                即使googlecode上已经有的软件包也上传"
  65.     echo "    -i                         编译后安装软件包到本地计算机, 编译xfce4-svn须要加"
  66.     echo "    -h                本帮助信息."
  67.     echo " 命令:"
  68.     echo "     co        从googlecode指定项目检出pkgbuild文件"
  69.     echo "     compile   将<SVNDIR>下的所有软件包编译并将编译好的包放到<PKGDIR>,同时更新<SVNDIR>里面的PKGBUILD"
  70.     echo "     repo      将本地<PKGDIR>下的软件包加入到软件仓数据库"
  71.     echo "     upload    将本地<PKGDIR>下的软件包上传到googlecode指定项目"
  72.     echo "     update    将本地<SVNDIR>下的软件编译配置文件更新\提交到googlecode SVN仓库"
  73.     exit $1
  74. }
  75. error () { echo "错误 $@";}
  76. warn () { echo "警告 $@";}
  77. info () { echo "*** $@";}
  78. # 检测、配置输入的命令
  79. while getopts 'p:u:w:e:F:r:ifh' arg; do
  80.     case "${arg}" in
  81.         p) Project_Name="${OPTARG}" ;;
  82.         u) UserName="${OPTARG}" ;;
  83.         w) Passwd="${OPTARG}" ;;
  84.         e) EXCLUDELIST="${OPTARG}" ;;
  85.         F) Full_Repo_Name="${OPTARG}" ;;
  86.         r) This_Repo_Name="${OPTARG}" ;;
  87.         i) INSTALL="y" ;;
  88.         f) FORCE="y" ;;
  89.     h|?) usage 0 ;;
  90.     *) echo "无效参数 '${arg}'"; usage 1 ;;
  91.     esac
  92. done
  93. echo "参数及命令: $@"
  94. shift $(($OPTIND - 1))
  95. echo "命令: $@"
  96. command_name="${1}"
  97. case "${command_name}" in
  98.     co) remark="从googlecode指定项目检出pkgbuild文件" ;;
  99.     compile) remark="编译软件包" ;;
  100.     repo) remark="创建\更新软件仓库" ;;
  101.     upload) remark="上传编译的包到googlecode软件仓" ;;
  102.     update) remark="更新本地的PKGBUILD到googlecode的SVN仓库" ;;
  103.     *) warn "未知命令'${command_name}'"; usage 1 ;;
  104. esac
  105. info " ${APPNAME}程序设置:"
  106. echo " 命令: ${command_name} —— ${remark}"
  107. echo " 预上传googlecode的项目名: ${Project_Name}"
  108. echo " 预上传使用的用户名: ${UserName}"
  109. echo " 预上传用户的密码: ${Passwd}"
  110. echo " 编译后是否安装: ${INSTALL}"
  111. echo " 是否覆盖: ${FORCE}"
  112. sleep 1
  113. do_checkout ()
  114. {
  115.         echo "从$URL下载${This_Repo_Name}的编译配置文件"
  116.         svn co ${SVN_URL}/${This_Repo_Name} $SVNDIR
  117.         cp -rf $SVNDIR ${SVNDIR}-build
  118. }
  119. rmlockfile ()
  120. {
  121.         if [ -f /var/lib/pacman/db.lck ]; then sudo rm -f /var/lib/pacman/db.lck; fi
  122. }
  123. # 查看软件$1是否已经已经安装,如果已经安装则返回1, 否则返回0
  124. # $1 软件包名称
  125. already_installed ()
  126. {
  127.         sudo pacman -Q | grep "^$1 " >/dev/null 2>&1
  128. }
  129. # 配置编译环境
  130. # 编译依赖包,像xfce4-svn这种必须安装一定顺序编译安装的就需要在depends中列出安装依赖包
  131. prepare_depends ()
  132. {
  133.         cat "${This_Repo_Name}-build/depends" | grep -v "^#" | while read pkgname; do
  134.                 #if [ "$(sudo pacman -Q | grep "^$pkgname ")" = "x" ]; then
  135.                         if ! already_installed $pkgname; then
  136.                         echo "安装编译依赖包$pkgname"
  137.                         rmlockfile
  138.                         #if [ -f /var/lib/pacman/db.lck ]; then sudo rm -f /var/lib/pacman/db.lck; fi
  139.                         sudo pacman -Sf --noprogressbar --noconfirm $pkgname
  140.                     fi
  141.         done
  142. }
  143. function_compile ()
  144. {
  145.         echo "编译并安装 $pkgname"
  146.         cd ${SVNDIR}-build/$pkgname
  147.         makepkg
  148.         if [ $? -ne 0 ]; then
  149.                 echo "编译失败"
  150.                 return 1
  151.                 break
  152.         else
  153.                 if [ "$INSTALL" = "y" ]; then
  154.                         rmlockfile
  155.                         #if [ -f /var/lib/pacman/db.lck ]; then sudo rm -f /var/lib/pacman/db.lck; fi
  156.                         sudo pacman -Uf *.pkg.tar.gz
  157.                 fi
  158.         fi
  159.         mv -f *.pkg.tar.gz $PKGDIR
  160.         find . -maxdepth 1 -type f -name "*" -exec cp -f {} $SVNDIR/$pkgname/ \;
  161.         cd ../
  162. }
  163. # 编译、安装
  164. do_compile ()
  165. {
  166.         prepare_depends
  167.         if [ -f ${SVNDIR}-build/order ]; then
  168.                 cat "${SVNDIR}-build/order" | grep -v "^#" | while read pkgname; do
  169.                         function_compile
  170.                 done
  171.         else
  172.                 for pkgname in $(ls ${SVNDIR}-build); do
  173.                         [ "x$(file ${SVNDIR}-build/$pkgname | grep "directory")" != "x" ] && continue
  174.                         function_compile
  175.                    done
  176.         fi
  177. }
  178. # 创建\更新软件仓数据库文件
  179. create_repo ()
  180. {
  181.         if [ "x${Full_Repo_Name}" != "x" ]; then
  182.                         echo "从$URL获取${Full_Repo_Name}软件仓数据库文件"
  183.                         wget $URL/files/${Full_Repo_Name}.db.tar.gz
  184.                         mv -f ${Full_Repo_Name}.db.tar.gz $PKGDIR/
  185.         fi
  186.         for pkgfile in $(ls $PKGDIR/*.pkg.tar.gz); do
  187.                 sh ${REPO_ADD} $PKGDIR/${This_Repo_Name}.db.tar.gz $pkgfile
  188.                 if [ "x${Full_Repo_Name}" != "x" ]; then
  189.                         sh ${REPO_ADD} $PKGDIR/${Full_Repo_Name}.db.tar.gz $pkgfile
  190.                 fi
  191.         done
  192.         rm -f $PKGDIR/*.db.tar.gz.old
  193. }
  194. # 列出googlecode项目的文件
  195. list_in_project ()
  196. {
  197.     links -no-g -dump http://code.google.com/p/$1/downloads/list | grep "gz" >$2
  198.     if [ $? -ne 0 ]; then error "无法访问http://code.google.com/p/${Project_Name}/downloads/list,请检查网络连接"; fi
  199. }
  200. do_upload ()
  201. {
  202.     # 上传到googlecode的python脚本
  203.     if [ ! -f $START/googlecode_upload.py ]; then
  204.         wget -q http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py
  205.         mv googlecode_upload.py $START/
  206.         chmod +x $START/googlecode_upload.py
  207.     fi
  208.     UPLOADPROG="$START/googlecode_upload.py"
  209.     list_in_project ${Project_Name} $START/old.list
  210.     for file in $(ls $PKGDIR); do
  211.         exist=""
  212.         exclude=""
  213.         info "查看$file是否需要上传"
  214.         size=$(ls -l $PKGDIR/$file | cut -d " " -f 5)
  215.         if [ $size -ge 99999999 ]; then
  216.                 # googlecode最大允许100MB
  217.                 echo "$file 大小为$size,超过googlecode上传上限"
  218.                 exclude="y"
  219.         fi
  220.         if [ "x$(cat $START/old.list | egrep "^$file")" != "x" ]; then
  221.                 exist="y"
  222.                 # 如果googlecode上已经存在,如果有 -f 参数,则须要上传,否则不上传
  223.                 if [ "${FORCE}" != "y" ]; then exclude="y"; else exclude="n"; fi
  224.         fi
  225.        
  226.         # 如果在EXCLUDELIST,则不上传
  227.         if [ "x${EXCLUDELIST}" != "x" ]; then
  228.                 [ "x$(cat ${EXCLUDELIST} | sed -r "s/#.*//" | egrep "^$file")" != "x" ] && (exclude="y")
  229.         fi
  230.         # *.db.tar.gz 是软件仓数据库文件,无论是否存在是否排除,均需要更新
  231.         if [ "x$(ls -l $PKGDIR/$file | cut -d " " -f 8 | egrep "db.tar.gz")" != "x" ]; then exclude="n"; fi
  232.         if [ "${exclude}" != "y" ]; then
  233.                 if [ "${exist}" = "y" ]; then
  234.                         warn "$file已经存在于http://${Project_Name}.googlecode.com, 现在重新上传覆盖"
  235.                 else
  236.                         info "正将$PKGDIR/$file上传到 http://${Project_Name}.googlecode.com"
  237.                 fi
  238.                 python ${UPLOADPROG} -s $file -p ${Project_Name} -u ${UserName} -w ${Passwd} -l $file $PKGDIR/$file
  239.                 if [ $? -ne 0 ]; then
  240.                          error "上传$file失败,请检查网络或者googlecode,网络不通或者该文件已经上传?"
  241.                 fi
  242.         fi
  243.     done
  244.     list_in_project ${Project_Name} $START/new.list
  245. }
  246. # 提交更新到googlecode软件仓库
  247. do_update ()
  248. {
  249.    cd ${SVNDIR}
  250.    svn ci -m "由${UserName}于$(date +%F" "%T)更新" --username ${UserName} --password $Passwd
  251. }
  252. if [ "${command_name}" = "co" ]; then do_checkout; fi
  253. if [ "${command_name}" = "compile" ]; then do_compile; fi
  254. if [ "${command_name}" = "repo" ]; then create_repo; fi
  255. if [ "${command_name}" = "upload" ]; then do_upload; fi
  256. if [ "${command_name}" = "update" ]; then do_update; fi
复制代码
发表于 2009-6-16 19:34:34 | 显示全部楼层
这个  怎么进行管理呢?
回复 支持 反对

使用道具 举报

发表于 2009-6-16 21:09:43 | 显示全部楼层
google code 被强暴了。我会搞的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-16 21:14:42 | 显示全部楼层
Post by saiddy;1998481
这个  怎么进行管理呢?



暂时还是部署阶段,

近期我会将我定制的所有软件包的PKGBUILD全部整理放入googlecode的SVN仓库,

然后就可以用这个脚本来维护了

到时候在wiki里面会有详细说明

现在大家可以专心写些自己的PKGBUILD。。。
回复 支持 反对

使用道具 举报

发表于 2009-6-17 09:34:19 | 显示全部楼层
顶一个,学习了
里面很多注释,还有mkarchlive里面也是, 还可以当作学习shell不错的参考实例
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-17 12:04:08 | 显示全部楼层
Post by axlrose;1998651
顶一个,学习了
里面很多注释,还有mkarchlive里面也是, 还可以当作学习shell不错的参考实例



暫時可能還有些問題, 剛剛在irc裏面的olympic大俠的幫助下debug了。。。
回复 支持 反对

使用道具 举报

发表于 2009-6-17 17:01:41 | 显示全部楼层
为什么都喜欢简单问题复杂化呢?

建议给makpkg加一个patch,在选择PKGBUILD的时候,加上版本筛选的功能。

举例而言,makepkg默认寻找当前目录下的PKGBUILD,如果有就以此编译,否则报错。
因此可以给他加个补丁实现一下功能:
当有PKGBUILD的时候直接采用该文件
当没有PKGBUILD这个文件的时候,自动寻找PKGBUILD-版本号,如果找到多个,就应用规则自动选取最新的版本
可以将-p选项的功能(以前是手动指定PKGBUILD的文件名)改为设定要编译的版本的功能。
即:makepkg -p 1.2.3 可以自动选取PKGBUILD-1.2.3这个文件进行编译。


具体可参考emerge。我觉得这个特性值得借鉴。这样也利于在ABS里保存软件的不同版本。
回复 支持 反对

使用道具 举报

发表于 2009-6-17 19:03:12 | 显示全部楼层
还是一版一夹子好,kiss。 不然太乱
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-17 21:16:55 | 显示全部楼层
Post by athurg;1998821
为什么都喜欢简单问题复杂化呢?


不明白, 这个脚本执行的功能——从http://archlive-pkg.googlecode.com SVN仓库下载PKGBUILD, 批量编译、 建立最终的软件仓数据库文件、批量提交到 http://archlive-pkg.googlecode.com/files 里、 自动更新 SVN 仓库

要实现这样的功能,如果手动,执行。。。 很恐怖, 也许一天都没有办法搞定

但如此执行该脚本(脚本名 maintain_xfce4-svn):
1、sh ./maintain_xfce4-svn co      检出svn

     然后就可以编辑pkgbuild文件, 如果是svn的, 一般不用更改。。。

2、sh ./maintain_xfce4-svn -i compile     批量编译并安装到本地计算机

    编译xfce4-svn需要边编译边安装, 后面的依赖前面的

3、 sh ./maintain_xfce4-svn repo     更新软件仓数据库文件

4、sh ./maintain_xfce4-svn upload     批量上传

5、 sh ./maintain_xfce4-svn update     将本地svn修改更新到googlecode上的svn仓库


有了此脚本, 整个过程如此简单了,  难道会让简单变复杂?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-17 21:18:01 | 显示全部楼层
Post by athurg;1998821

建议给makpkg加一个patch,在选择PKGBUILD的时候,加上版本筛选的功能。

举例而言,makepkg默认寻找当前目录下的PKGBUILD,如果有就以此编译,否则报错。
因此可以给他加个补丁实现一下功能:
当有PKGBUILD的时候直接采用该文件
当没有PKGBUILD这个文件的时候,自动寻找PKGBUILD-版本号,如果找到多个,就应用规则自动选取最新的版本
可以将-p选项的功能(以前是手动指定PKGBUILD的文件名)改为设定要编译的版本的功能。
即:makepkg -p 1.2.3 可以自动选取PKGBUILD-1.2.3这个文件进行编译。


具体可参考emerge。我觉得这个特性值得借鉴。这样也利于在ABS里保存软件的不同版本。



你可以考虑, 写个patch啊。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表