LinuxSir.cn,穿越时空的Linuxsir!

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

[原创]脚本:在指定位置建立软件仓,并上传googlecode、添加到pacman.conf的脚本

[复制链接]
发表于 2009-6-7 14:56:37 | 显示全部楼层 |阅读模式
如题


写脚本的初衷在于方便自己。。。

使用该脚本风险自负

[color="Blue"]俺已经用这个脚本将为archlive定制的软件包及通过aur编译的包上传到http://archlive-pkg.googlecode.com了!


2009年7月4日下午再优化了下,将googlecode用户信息放在~/.googlecode文件内
2009年6月8日下午17:20再将脚本再优化了下。。。


  1. #!/bin/bash
  2. # 该脚本将在指定目录创建Arch软件仓库(指定仓库名)  作者 Carbon Jiao
  3. # 同时调用python脚本将这些仓库上传到googlecode的相应项目
  4. # 本脚本给予GPL v3发布,使用者须遵循GPL v3相应规定
  5. # 本脚本调用的脚本版权归原作者
  6. #
  7. # 该脚本主要实现三个功能:
  8. # 1、在制定目录下建立自定义软件仓;
  9. #    调用pacman软件组中的一个脚本repo-add
  10. # 2、将制定目录下的自定义软件仓批量上传到googlecode的制定项目空间;
  11. #    调用googlecode官方的一个python上传脚本
  12. #    在使用upload或者all命令的时候,会在该命令目录下产生两个文件
  13. #        old.list   上传前googlecode上对应项目的文件清单
  14. #        new.list  上传后googlecode上对应项目的文件清单
  15. #    脚本会自动检测预上传的文件夹下的软件是否已经存在于googlecode项目上
  16. # 3、将自定义软件仓的相关设置加到制定的 pacman.conf
  17. #    (一般用户/etc/pacman.conf, 制作archlive的就还有另外的软件仓配置文件了)
  18. #    脚本会自动检测软件仓配置文件中是否已经存在预添加的软件仓
  19. #
  20. #----2009-07-04更新: 将googlecode用户信息存放到~/.googlecode下
  21. #----2009-06-16更新: 加入文件大小判断,简化文件是否上传的判断条件
  22. #

  23. APPNAME=$(basename "${0}")

  24. # 默认预修改的软件仓配置文件,用-c 可以指定另外的配置文件
  25. # 预添加的软件仓第一优先:
  26. # 在"# uncommented to enable the repo."行后开始定义软件仓.
  27. # 原始/etc/pacman.conf行有以上的标的行
  28. PACMANCONF="/etc/pacman.conf"

  29. # 在指定文件下的文件中不上传的文件清单,须全名
  30. if [ -f $(pwd)/exclude.list ]; then
  31.         EXCLUDELIST="$(pwd)/exclude.list"
  32. else
  33.         EXCLUDELIST=""
  34. fi
  35. # 软件仓数据库文件制作脚本,属于pacman
  36. if [ -f "$(pwd)/repo-add" ]; then
  37.    REPO_ADD="$(pwd)/repo-add"
  38. else
  39.    REPO_ADD="/usr/bin/repo-add"
  40. fi

  41. # 如果googlecode上已经存在预提交的文件,则不覆盖
  42. FORCE="n"
  43. # 即使googlecode上已经存在预提交的文件也提交
  44. #FORCE="y"

  45. usage ()
  46. {
  47.     echo " 用法:  ${APPNAME} [选项]  命令 <命令选项>"
  48.     echo " 选项:"
  49.     echo "    -p Project_Name   预上传到googlecode的项目名, 默认: archlive-pkg"
  50.     echo "    -u UserName        Googlecode帐号"
  51.     echo "    -w Passwd      Googlecode密码"
  52.     echo "    -e EXCLUDELIST 不上传的文件清单"
  53.     echo "    -c pacman.conf 预添加自定义软件仓的配置文件"
  54.     echo "    -f               即使googlecode上已经有的文件也上传"
  55.     echo "    -h               本帮助信息."
  56.     echo " 命令:"
  57.     echo "     create <REPO_DIR> <REPO_NAME>  在<REPO_DIR>下创建名为<REPO_NAME>的软件仓"
  58.     echo "     upload <REPO_DIR> <Project_Name>   将<REPO_DIR>下的文件提交到<Project_Name>项目"
  59.     echo "     add <REPO_DIR> <REPO_NAME>     将本地<REPO_DIR>下的<REPO_NAME>软件仓加入到指定的pacman.conf"
  60.     echo "     c_and_u <REPO_DIR> <REPO_NAME> <Project_Name> 在本地<REPO_DIR>下建立名为<REPO_NAME>的软件仓,并提交到<REPO_NAME>项目"
  61.     echo "     c_and_a <REPO_DIR> <REPO_NAME> 在本地<REPO_DIR>下建立名为<REPO_NAME>的软件仓,并加入到指定的pacman.conf"
  62.     exit $1
  63. }

  64. error () { echo "XXX $@";}
  65. warn () { echo "!!! $@";}
  66. info () { echo "*** $@";}

  67. # 检测、配置输入的命令
  68. while getopts 'u:w:c:e:fh' arg; do
  69.     case "${arg}" in
  70.         u) UserName="${OPTARG}" ;;
  71.         w) Passwd="${OPTARG}" ;;
  72.         c) PACMANCONF="${OPTARG}" ;;
  73.         e) EXCLUDELIST="${OPTARG}" ;;
  74.         f) FORCE="y" ;;
  75.     h|?) usage 0 ;;
  76.     *) echo "无效参数 '${arg}'"; usage 1 ;;
  77.     esac
  78. done

  79. echo "参数及命令: $@"
  80. shift $(($OPTIND - 1))
  81. echo "命令: $@"
  82. #[ $# -le 1 ] && usage 1

  83. command_name="${1}"

  84. case "${command_name}" in
  85.     create) REPO_DIR="${2}"; REPO_NAME="${3}"; remark="创建本地自定义软件仓(Repo)" ;;
  86.     upload) REPO_DIR="${2}"; Project_Name="${3}"; remark="将本地自定义软件仓(Repo)提交到Googlecode" ;;
  87.     add) REPO_DIR="${2}"; REPO_NAME="${3}"; remark="将本地自定义软件仓(Repo)加到软件仓配置文件${PACMANCONF}" ;;
  88.     c_and_u) REPO_DIR="${2}"; REPO_NAME="${3}"; Project_Name="${4}"; remark="创建Repo并上传到${Project_Name}项目" ;;
  89.     c_and_a) REPO_DIR="${2}"; REPO_NAME="${3}"; remark="创建Repo并加到软件仓配置文件${PACMANCONF}" ;;
  90.     *) warn "未知命令'${command_name}'"; usage 1 ;;
  91. esac

  92. if [ "x${REPO_DIR}" = "x" ]; then REPO_DIR="/mnt/sda3/cpkg"; fi
  93. if [ "x${REPO_NAME}" = "x" ]; then REPO_NAME="archlive-pkg"; fi
  94. if [ "x${Project_Name}" = "x" ]; then Project_Name="archlive-pkg"; fi

  95. info " ${APPNAME}程序设置:"
  96. echo " 命令: ${command_name} —— ${remark}"
  97. echo " 预创建的软件仓位置: ${REPO_DIR}"
  98. echo " 预创建的软件仓名: ${REPO_NAME}"
  99. echo " 预上传googlecode的项目名: ${Project_Name}"
  100. echo " 预上传使用的用户名: ${UserName}"
  101. echo " 预上传用户的密码: ${Passwd}"
  102. echo " 预添加自定义软件仓的配置文件: ${PACMANCONF}"
  103. echo " 不上传文件名清单: ${EXCLUDELIST}"
  104. echo " 是否覆盖: ${FORCE}"
  105. sleep 1

  106. # 自定义软件仓
  107. custom_repo ()
  108. {
  109.     for pkgfile in $(ls ${REPO_DIR}/*.pkg.tar.gz); do
  110.                 sh ${REPO_ADD} ${REPO_DIR}/${REPO_NAME}.db.tar.gz $pkgfile
  111.     done
  112.     rm -rf ${REPO_DIR}/${REPO_NAME}.db.tar.gz.old
  113. }

  114. # 上传到googlecode的python脚本
  115. if [ ! -f $(pwd)/googlecode_upload.py ]; then
  116.         wget -q http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py
  117.         chmod +x $(pwd)/googlecode_upload.py
  118. fi
  119. UPLOADPROG="$(pwd)/googlecode_upload.py"

  120. # 列出已经上传googlecode项目的文件
  121. list_in_project ()
  122. {
  123.     links -no-g -dump http://code.google.com/p/$1/downloads/list | grep "gz" >$2
  124.     if [ $? -ne 0 ]; then error "无法访问http://code.google.com/p/${Project_Name}/downloads/list,请检查网络连接"; fi
  125. }
  126. # 检查软件仓$1  是否已经在  软件仓配置文件$2  中定义
  127. is_in_pacmanconf ()
  128. {
  129.    if [ "x$(cat ${PACMANCONF} | sed -r "s/#.*//" | egrep  "\[*${REPO_NAME}\]")" = "x" ]; then echo "0"; fi
  130. }

  131. # 将自定义的软件仓加入到PACMANCONF中,默认第一优先
  132. # pacman.conf须是在# and they will be used before the default mirrors.行后开始定义软件仓.
  133. add_customrepo2pacmanconf ()
  134. {
  135.    if [ "$(is_in_pacmanconf ${REPO_NAME} ${PACMANCONF})" = "0" ]; then
  136.         sudo sed -i "/# uncommented to enable the repo./ a\
  137.                 \ \n#本地自定义软件仓\n[${REPO_NAME}]\
  138.                 \nServer = file://${REPO_DIR} \n" ${PACMANCONF}
  139.         if [ $? -eq 0 ]; then info "添加成功!"; else error "添加错误!请查看原文件!"; fi
  140.    else
  141.         warn "该软件仓已经添加到${PACMANCONF},请检查${PACMANCONF}:"
  142.         info " 如果定义的为同一软件仓库,则无须添加"
  143.         info " 如果定义的不是同一软件仓,则重新指定软件仓名称,重新运行$APPNAME create...来创建软件仓"
  144.         info " 再运行 $APPNAME add ... 添加到软件仓配置文件pacman.conf"
  145.    fi
  146. }

  147. _create ()
  148. {
  149.     if [ x"${REPO_DIR}" = "x" -o x"${REPO_NAME}" = "x" ]; then
  150.                 error "必须指定软件仓位置及软件仓名"
  151.                 usage 1
  152.     else
  153.                 info "在${REPO_DIR} 建立自定义软件仓库[${REPO_NAME}]"
  154.                 custom_repo ${REPO_DIR} ${REPO_NAME}
  155.     fi
  156.         info "在目录${REPO_DIR}下的软件仓${REPO_NAME}建立完成!"
  157. }

  158. # 维护googlecode人员用户信息
  159. checkuser ()
  160. {
  161.         if [ "x$UserName" = "x" -o "x$Passwd" = "x" ]; then
  162.                 if [ -f ~/.googlecode ]; then
  163.                         . ~/.googlecode
  164.                 else
  165.                         warn "无googlecode用户信息"; usage 1 ;;
  166.                 fi
  167.         else
  168.                 if [ -f ~/.googlecode ]; then
  169.                         sed -i "s/UserName=.*/UserName="$UserName"/g" ~/.googlecode
  170.                         sed -i "s/Passwd=.*/Passwd="$Passwd"/g" ~/.googlecode
  171.                 else
  172.                         echo "UserName=$UserName" >~/.googlecode
  173.                         echo "Passwd=$Passwd" >>~/.googlecode
  174.                 fi               
  175.         fi
  176. }

  177. _upload ()
  178. {
  179.     checkuser
  180.     if [ "x${REPO_DIR}" = "x" ]; then
  181.                 error "必须指定软件仓位置"
  182.                 usage 1
  183.     fi
  184.     if [ "x${Project_Name}" = "x" -o "x${UserName}" = "x" ]; then
  185.                 error "必须指定预上传的googlecode项目名、用户名及密码"
  186.                 usage 1
  187.     fi
  188.     info "正将自定义软件仓${REPO_DIR}下的文件,以用户${UserName}身份上传到googlecode项目${Project_Name}"
  189.     list_in_project ${Project_Name} $(pwd)/old.list
  190.     for file in $(ls ${REPO_DIR}); do
  191.         exist=""
  192.         exclude=""
  193.         info "查看$file是否需要上传"

  194.         size=$(ls -l ${REPO_DIR}/$file | cut -d " " -f 5)
  195.         if [ $size -ge 99999999 ]; then
  196.                 echo "$file 大小为$size,超过googlecode上传上限"
  197.                 exclude="y"
  198.         fi

  199.         if [ "x$(cat $(pwd)/old.list | egrep "$file")" != "x" ]; then
  200.                 exist="y"
  201.                 if [ "${FORCE}" != "y" ]; then exclude="y"; else exclude="n"; fi
  202.         fi

  203.         if [ "x${EXCLUDELIST}" != "x" ]; then
  204.                 [ "x$(cat ${EXCLUDELIST} | sed -r "s/#.*//" | egrep "$file")" != "x" ] && (exclude="y")
  205.         fi

  206.         # *.pkg.tar.gz 是软件仓数据库文件,无论是否存在是否排除,均需要更新
  207.         if [ "x$(ls -l ${REPO_DIR}/$file | cut -d " " -f 8 | grep "db.tar.gz")" != "x" ]; then exclude="n"; fi

  208.         if [ "${exclude}" != "y" ]; then
  209.                 if [ "${exist}" = "y" ]; then
  210.                         warn "$file已经存在于http://${Project_Name}.googlecode.com, 现在重新上传覆盖"
  211.                 else
  212.                         info "正将${REPO_DIR}/$file 上传到 http://${Project_Name}.googlecode.com"
  213.                 fi
  214.                 python ${UPLOADPROG} -s $file -p ${Project_Name} -u ${UserName} -w ${Passwd} -l $file ${REPO_DIR}/$file
  215.                 if [ $? -ne 0 ]; then
  216.                          error "上传$file失败,请检查网络或者googlecode,网络不通或者该文件已经上传?"
  217.                 fi
  218.         fi
  219.     done
  220.     list_in_project ${Project_Name} $(pwd)/new.list
  221. }

  222. _add ()
  223. {
  224.     if [ "x${REPO_DIR}" = "x" -o "x${REPO_NAME}" = "x" ]; then
  225.         error "必须指定软件仓位置及软件仓名"
  226.         usage 1
  227.     fi
  228.     if [ "x${PACMANCONF}" = "x" ]; then
  229.         error "必须指定预添加到的pacman.conf"
  230.         usage 1
  231.     fi
  232.     info "将${REPO_DIR}下的自定义软件仓${REPO_NAME}添加到软件仓配置文件${PACMANCONF}"
  233.     add_customrepo2pacmanconf ${REPO_NAME} ${REPO_DIR} ${PACMANCONF}
  234. }

  235. if [ "${command_name}" = "create" -o "${command_name}" = "c_and_u" -o "${command_name}" = "c_and_a" ]; then _create; fi
  236. if [ "${command_name}" = "upload" -o "${command_name}" = "c_and_u" ]; then _upload; fi
  237. if [ "${command_name}" = "add" -o "${command_name}" = "c_and_a" ]; then _add; fi

复制代码
发表于 2009-6-7 16:51:13 | 显示全部楼层
ym下shell编程
这个是做什么的,上传到pacman的软件仓库和google code有什么关系?
倒是源里的xf86-input-evdev包在我的笔记本上一直工作不正常,有大升级时就需要自己改下重新编译
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-7 17:18:39 | 显示全部楼层
这个脚本与本人之前的文章
《利用googlecode建立自己的Arch软件仓库》http://www.linuxsir.cn/bbs/thread347713.html
形成呼应!

建立自己的Arch Repo后,上传到自己建立的项目空间上去,这样可以供大家和自己日后使用。。。

archlive小组已经在googlecode上建立xfce4-devel xfce4-svn的软件仓
《 在http://archlive-pkg.googlecode.com上新建了个xfce4 的repo》
http://www.linuxsir.cn/bbs/thread348105.html

该脚本主要实现三个功能:
1、在制定目录下建立自定义软件仓;
2、将制定目录下的自定义软件仓批量上传到googlecode的制定项目空间;
3、将自定义软件仓的相关设置加到制定的 pacman.conf (一般用户/etc/pacman.conf, 制作archlive的就还有另外的软件仓配置文件了)


有了这个脚本,大家都可以建立自己的软件仓共享给大家。。。

(不用一个一个上传了!)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-7 17:20:32 | 显示全部楼层
Post by maxint;1995167
ym下shell编程
倒是源里的xf86-input-evdev包在我的笔记本上一直工作不正常,有大升级时就需要自己改下重新编译


如何的不正常?

你是如何改的?

向我抱怨官方源的问题?——去官方的butreport  或者googlecode上的arch-cn
(翻一下以前的帖子)
回复 支持 反对

使用道具 举报

发表于 2009-6-8 00:43:25 | 显示全部楼层
牛,支持以下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-8 11:06:03 | 显示全部楼层
今天有时间再优化下

今天凌晨经过测试, googlecode能接受强行上传——服务器上已经存在的文件,再次传同名文件的时候自动用新文件覆盖!

所以这个脚本再加个条件判断就更加完美了!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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