LinuxSir.cn,穿越时空的Linuxsir!

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

[原创]再来一*脚本!自动在googlecode的项目上创建kdemod的镜像,希望网速快的兄弟给国

[复制链接]
发表于 2009-7-8 17:33:36 | 显示全部楼层 |阅读模式
有些兄弟很想用kdemod,但chakraproject 或者其他源的访问速度又太慢——自己网络原因。。。  但有的兄弟网络环境很好,下载超快,上传到googlecode也不错
而googlecode大多数兄弟的访问速度都还不错,所以萌生一个想法:

网络好的兄弟,如果没有自己的服务器,就将kdemod的官方镜像同步到本地,再批量上传到googlecode。。。 这样,在googlecode建立镜像,网络环境不好的,比如我,就有福了!

使用办法:

1、首先在googlecode上申请项目
2、运行本脚本(脚本名可以改为sync-kdemod)   sh ./sync-kdemod 获取具体使用办法:

用法:  sync-kdemod [选项]  命令 <命令选项>
选项:
    -u UserName        Googlecode帐号
    -w Passwd      Googlecode密码,访问http://code.google.com/hosting/settings获取密码
    -f               即使googlecode上已经有的文件也上传
    -h               本帮助信息.
命令:
     download <ARCH> <REPO> <COPYDIR>        将KDEMOD里面的i686或者x86_64对应软件仓下载到<COPYDIR>目录下
     upload <COPYDIR> <googlecode项目名>   将<REPO_DIR>下的文件提交到<roject_Name>项目
     sync <ARCH> <REPO> <COPYDIR> <googlecode项目名> 将KDEMOD的i686或者x86_64的软件仓本地的<COPYDIR>和googlecode上的项目同步
ARCH可以是 i686 或者 x86_64; REPO可以是core, testing, extra, unstable,legacy

#### 最新脚本从 http://archlive.googlecode.com/hg/repo-tools/sync-kdemod 获取

脚本:

  1. #!/bin/bash
  2. # 该脚本从http协议的Arch软件仓下载repo,并上传到googlecode指定项目  作者 Carbon Jiao
  3. # 本脚本给予GPL v3发布,使用者须遵循GPL v3相应规定
  4. # 本脚本调用的脚本版权归原作者
  5. #
  6. # 该脚本主要实现:
  7. # 1、从指定的软件仓同步到本地repo;
  8. # 2、将本地的软件仓批量上传到googlecode的制定项目空间;
  9. #    调用googlecode官方的一个python上传脚本
  10. #    在使用upload或者all命令的时候,会在该命令目录下产生两个文件
  11. #        old.list   上传前googlecode上对应项目的文件清单
  12. #        new.list  上传后googlecode上对应项目的文件清单
  13. #    脚本会自动检测预上传的文件夹下的软件是否已经存在于googlecode项目上
  14. # 3、将软件仓的相关设置加到指定的 pacman.conf
  15. #    (一般用户/etc/pacman.conf, 制作archlive的就还有另外的软件仓配置文件了)
  16. #    脚本会自动检测软件仓配置文件中是否已经存在预添加的软件仓
  17. #

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

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

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

  36. # 如果googlecode上已经存在预提交的文件,则不覆盖
  37. FORCE="n"
  38. # 即使googlecode上已经存在预提交的文件也提交
  39. #FORCE="y"

  40. usage ()
  41. {
  42.     echo " 用法:  ${APPNAME} [选项]  命令 <命令选项>"
  43.     echo " 选项:"
  44.     echo "    -u UserName        Googlecode帐号"
  45.     echo "    -w Passwd      Googlecode密码,访问http://code.google.com/hosting/settings获取密码"
  46.     echo "    -f               即使googlecode上已经有的文件也上传"
  47.     echo "    -h               本帮助信息."
  48.     echo " 命令:"
  49.     echo "     download <ARCH> <REPO> <COPYDIR>        将KDEMOD里面的i686或者x86_64对应软件仓下载到<COPYDIR>目录下"
  50.     echo "     upload <COPYDIR> <googlecode项目名>   将<REPO_DIR>下的文件提交到<Project_Name>项目"
  51.     echo "     sync <ARCH> <REPO> <COPYDIR> <googlecode项目名> 将KDEMOD的i686或者x86_64的软件仓本地的<COPYDIR>和googlecode上的项目同步"
  52.     echo " ARCH可以是 i686 或者 x86_64; REPO可以是core, testing, extra, unstable,legacy"
  53.     exit $1
  54. }

  55. error () { echo "XXX $@";}
  56. warn () { echo "!!! $@";}
  57. info () { echo "*** $@";}

  58. # 检测、配置输入的命令
  59. while getopts 'u:w:c:e:fh' arg; do
  60.     case "${arg}" in
  61.         u) UserName="${OPTARG}" ;;
  62.         w) Passwd="${OPTARG}" ;;
  63.         f) FORCE="y" ;;
  64.     h|?) usage 0 ;;
  65.     *) echo "无效参数 '${arg}'"; usage 1 ;;
  66.     esac
  67. done

  68. echo "参数及命令: $@"
  69. shift $(($OPTIND - 1))
  70. echo "命令: $@"
  71. #[ $# -le 1 ] && usage 1

  72. command_name="${1}"

  73. case "${command_name}" in
  74.     download) ARCH="${2}"; REPO="${3}"; COPYDIR="${4}";
  75.                 remark="将KDEMOD $ARCH的$REPO下载到$COPYDIR"
  76.                 ;;
  77.     upload) COPYDIR="${2}"; Project_Name="${3}";
  78.                 remark="将本地$COPYDIR提交到Googlecode项目${Project_Name}"
  79.                 ;;
  80.     sync) REPO="${2}"; COPYDIR="${3}"; Project_Name="${4}";
  81.                 remark="将KDEMOD的$REPO通过$COPYDIR再同步到Googlecode项目${Project_Name}"
  82.                 ;;
  83.     *) warn "未知命令'${command_name}'"; usage 1 ;;
  84. esac

  85. [ "$ARCH" != "i686" -a "$ARCH" != "x86_64" ] && (echo "无效的ARCH名,只能是i686 或者x86_64"; usage 1)

  86. case "$REPO" in
  87.         core) REPODIR="core" ;;
  88.         testing) REPODIR="testing" ;;
  89.         extra) REPODIR="extragear" ;;
  90.         unstable) REPODIR="unstable" ;;
  91.         legacy) REPODIR="legacy" ;;
  92.         *) echo "无效REPO名,KDEMod只提供core testing extra unstable legacy这几个repo"; usage 1 ;;
  93. esac

  94. if [ "x${COPYDIR}" = "x" ]; then COPYDIR="${REPODIR}-${ARCH}"; fi
  95. [ "x${COPYDIR}" = "x" ] && (warn "必须指定预上传的文件夹"; usage 1)
  96. [ "${command_name}" = "upload" -o "${command_name}" = "sync" ] && [ "x${Project_Name}" = "x" ] &&  (warn "必须指定上传的目的googlecode项目名,请确保存在." && usage 1)

  97. info " ${APPNAME}程序设置:"
  98. echo " 命令: ${command_name} —— ${remark} $COPYDIR"
  99. sleep 1

  100. do_download ()
  101. {
  102.         rsync -av chakra-project.org::kdemod/$REPODIR/$ARCH/ $COPYDIR
  103. }

  104. # 维护googlecode人员用户信息
  105. checkuser ()
  106. {
  107.         if [ "x$UserName" = "x" -o "x$Passwd" = "x" ]; then
  108.                 if [ -f ~/.googlecode ]; then
  109.                         . ~/.googlecode
  110.                 else
  111.                         warn "无googlecode用户信息"
  112.                         info "请使用-u 用户名 -w 密码来指定"
  113.                         usage 1
  114.                 fi
  115.         else
  116.                 if [ -f ~/.googlecode ]; then
  117.                         sed -i "s/UserName=.*/UserName="$UserName"/g" ~/.googlecode
  118.                         sed -i "s/Passwd=.*/Passwd="$Passwd"/g" ~/.googlecode
  119.                 else
  120.                         echo "UserName=$UserName" >~/.googlecode
  121.                         echo "Passwd=$Passwd" >>~/.googlecode
  122.                 fi               
  123.         fi
  124. }

  125. # 列出googlecode项目的文件
  126. list_in_project ()
  127. {
  128.     links -no-g -dump http://code.google.com/p/$1/downloads/list | grep "gz" >$2
  129.     if [ $? -ne 0 ]; then error "无法访问http://code.google.com/p/${Project_Name}/downloads/list,请检查网络连接"; fi
  130. }

  131. do_upload ()
  132. {
  133.     checkuser
  134.     # 上传到googlecode的python脚本
  135.     START=$(pwd)
  136.     if [ ! -f $START/googlecode_upload.py ]; then
  137.         wget -q http://support.googlecode.com/svn/trunk/scripts/googlecode_upload.py
  138.         mv googlecode_upload.py $START/
  139.         chmod +x $START/googlecode_upload.py
  140.     fi
  141.     UPLOADPROG="$START/googlecode_upload.py"

  142.     list_in_project ${Project_Name} $START/old.list

  143.     for target in $(ls $COPYDIR); do
  144.         if [ "x$(file ${target} | grep "directory")" != "x" ] ; then
  145.                 echo "现在开始将$target目录下的文件上传到googlecode"
  146.                     for file in $(ls $target); do
  147.                         exist=""
  148.                         exclude=""
  149.                         info "查看$file是否需要上传"

  150.                         size=$(ls -l $target/$file | cut -d " " -f 5)
  151.                         if [ $size -ge 99999999 ]; then
  152.                                 # googlecode最大允许100MB
  153.                                 echo "$file 大小为$size,超过googlecode上传上限"
  154.                                 exclude="y"
  155.                         fi

  156.                         if [ "x$(cat $START/old.list | egrep "^$file")" != "x" ]; then
  157.                                 exist="y"
  158.                                 # 如果googlecode上已经存在,如果有 -f 参数,则须要上传,否则不上传
  159.                                 if [ "${FORCE}" != "y" ]; then exclude="y"; else exclude="n"; fi
  160.                         fi

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

  163.                         if [ "${exclude}" != "y" ]; then
  164.                                 if [ "${exist}" = "y" ]; then
  165.                                         warn "$file已经存在于http://${Project_Name}.googlecode.com, 现在重新上传覆盖"
  166.                                 else
  167.                                         info "正将$target/$file上传到 http://${Project_Name}.googlecode.com"
  168.                                 fi
  169.                                 python ${UPLOADPROG} -s $file -p ${Project_Name} -u ${UserName} -w ${Passwd} -l $file $target/$file
  170.                                 if [ $? -ne 0 ]; then
  171.                                          error "上传$file失败,请检查网络或者googlecode,网络不通或者该文件已经上传?"
  172.                                 fi
  173.                         fi
  174.                     done
  175.             else
  176.                 exist=""
  177.                 exclude=""
  178.                 size=$(ls -l $target | cut -d " " -f 5)
  179.                 if [ $size -ge 99999999 ]; then
  180.                         # googlecode最大允许100MB
  181.                         echo "$target大小为$size,超过googlecode上传上限"
  182.                         exclude="y"
  183.                 fi
  184.                 if [ "x$(cat $START/old.list | egrep "^$target")" != "x" ]; then
  185.                         exist="y"
  186.                         # 如果googlecode上已经存在,如果有 -f 参数,则须要上传,否则不上传
  187.                         if [ "${FORCE}" != "y" ]; then exclude="y"; else exclude="n"; fi
  188.                 fi
  189.                 if [ "x$exist" = "x" -o "$exclude" = n ]; then
  190.                         echo "现在将$target上传到googlecode"
  191.                         python ${UPLOADPROG} -s $target -p ${Project_Name} -u ${UserName} -w ${Passwd} -l $target $target
  192.                 fi
  193.             fi
  194.     done

  195.     list_in_project ${Project_Name} $START/new.list
  196.     rm -f $START/{old.list,new.list}
  197. }

  198. [ "${command_name}" = "download" -o "${command_name}" = "sync" ] && (do_download)
  199. [ "${command_name}" = "sync" ] && (do_upload)
复制代码
发表于 2009-7-8 18:06:01 | 显示全部楼层
kdemod的i686和x86_64加起来有多大呢?
回复 支持 反对

使用道具 举报

发表于 2009-7-8 18:55:10 | 显示全部楼层
楼主好。我这里到google的网速上限是100Mbps...
除非google限速
并且我本地就有kdemod镜像。。
回复 支持 反对

使用道具 举报

发表于 2009-7-8 18:57:18 | 显示全部楼层
Post by gsli52;2004564
kdemod的i686和x86_64加起来有多大呢?


一共27G。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-8 19:28:08 | 显示全部楼层
Post by yangzhe1990;2004576
一共27G。


可以将core、extra等的分开。。。

你速度快就帮忙贡献下啦,先谢谢了!
回复 支持 反对

使用道具 举报

发表于 2009-7-9 11:39:19 | 显示全部楼层
Post by carbonjiao;2004587
可以将core、extra等的分开。。。

你速度快就帮忙贡献下啦,先谢谢了!

///////刚才当我没说

project要到11日才可写
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-9 13:33:35 | 显示全部楼层
sync-kdemod -u googlecode用户名 -w googlecode密码 sync i686 core ~/i686-core kdemod-i686-core 则将kdemod的i686分支的core软件仓同步到kdemod-i686-core.googlecode.com,本地缓存目录为~/i686-core

i686相对应的还有一个x86_64分支

软件仓有core, testing, extra, unstable,legacy可选,所以可以申请10个googlecode项目,10个人分别维护就可以了!

每个项目2G空间,总共20G空间,放些kdemod常用的还是够用的了
回复 支持 反对

使用道具 举报

发表于 2009-7-9 23:33:58 | 显示全部楼层
Post by carbonjiao;2004739
sync-kdemod -u googlecode用户名 -w googlecode密码 sync i686 core ~/i686-core kdemod-i686-core 则将kdemod的i686分支的core软件仓同步到kdemod-i686-core.googlecode.com,本地缓存目录为~/i686-core

i686相对应的还有一个x86_64分支

软件仓有core, testing, extra, unstable,legacy可选,所以可以申请10个googlecode项目,10个人分别维护就可以了!

每个项目2G空间,总共20G空间,放些kdemod常用的还是够用的了


其实我在想.. google有没有proxy的功能.. 搞个relay到原始的源不知道可以么
回复 支持 反对

使用道具 举报

发表于 2009-7-9 23:35:00 | 显示全部楼层
1.4G        core/i686
1.4G        core/x86_64
103M        extragear/i686
251M        extragear-testing/i686
32M        extragear-testing/x86_64
103M        extragear/x86_64
1.4G        kdemod-core/i686
1.4G        kdemod-core/x86_64
103M        kdemod-extragear/i686
103M        kdemod-extragear/x86_64
803M        kdemod-legacy/i686
808M        kdemod-legacy/x86_64
350M        kdemod-playground/i686
286M        kdemod-playground/x86_64
1.9G        kdemod-testing/i686
2.0G        kdemod-testing/x86_64
3.3G        kdemod-unstable/i686
14G        kdemod-unstable/x86_64
803M        legacy/i686
808M        legacy/x86_64
350M        playground/i686
322M        playground-testing/i686
295M        playground-testing/x86_64
286M        playground/x86_64
1.9G        testing/i686
2.0G        testing/x86_64
4.0K        _tools/makepkg.conf.i686
4.0K        _tools/makepkg.conf.x86_64
12K        _tools/repo-add-i686
12K        _tools/repo-add-x86_64
3.3G        unstable/i686
14G        unstable/x86_64
回复 支持 反对

使用道具 举报

发表于 2009-7-10 00:47:36 | 显示全部楼层
googlecode能否自动和远程源同步?不然只能自己下了再上传上去?
回复 支持 反对

使用道具 举报

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

本版积分规则

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