Pārlūkot izejas kodu

支持GIT下载

jianfeng1.wang 2 gadi atpakaļ
vecāks
revīzija
d5b68f05dc
1 mainītis faili ar 331 papildinājumiem un 40 dzēšanām
  1. 331 40
      APK自动编译/download.sh

+ 331 - 40
APK自动编译/download.sh

@@ -1,72 +1,175 @@
 #! /bin/sh
 
+# 源码地址;
 ARG_CODE_URL=''
+# 源码存储方式:SVN、GIT
+ARG_CODE_REPOS='SVN'
+# 源码版本;
 ARG_CODE_REVISION=''
+# 源码本地路径;
 ARG_CODE_WORK_PATH=''
+# 日期;
+CURR_TIME=$(date +"%Y-%m-%d %T")
 #LOG_FILE=/home/data/ApkAutoCompile/shell/log/download_$(date '+%d-%H%M%S').log
 LOG_FILE=/home/data/ApkAutoCompile/shell/log/download.log
 
+StrIsSubstring()
+{
+    local x=1
+    case "$2" in
+        *$1*) x=0;;
+    esac
+    echo $x
+}
+
+SwitchIntranet()
+{
+    echo -e "\r\r---------------切换到内网---------------"
+    route del default gw 10.201.40.1
+    sleep 2s
+    route del default gw 10.201.40.1
+    sleep 1s
+    route add default gw 10.201.40.1
+    sleep 2s
+    route add default gw 10.201.40.1
+}
+
+svn_clean()
+{
+    SVN_PATH=$1
+    if [ -d ${SVN_PATH} ];then
+        cd ${SVN_PATH}
+        # 清空;
+        msg=$(svn cleanup .)
+        # 查找未提交的文件;
+        filelist=$(svn status 2>&1)
+        echo -e "未提交的文件="${filelist}
+        # 以"? "分组字符串;
+        filearray=(${filelist//? /})
+        for File in ${filearray[@]}
+        do
+            # 文件是否存在;
+            if [ -f ${File} ];then
+                rm -f ${File}
+                echo -e "已删除文件=${File}"
+            elif [ -d ${File} ];then
+                rm -rf ${File}
+                echo -e "已删除路径=${File}"
+            fi
+        done
+    else
+        echo -e "svn clean: 路径不存在${SVN_PATH}\n"
+    fi
+}
+
+git_clean()
+{
+    echo ""
+}
+
 svn_download()
 {
-    echo "shell_log===>Download start---------"
+    local Opt=$1
+    echo ${CURR_TIME}
+    echo -e "shell_log===>Download start---------\n"
     echo "AndroidSvnPath=${ARG_CODE_URL}"
     echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
-    echo "AndroidCachePath=${ARG_CODE_WORK_PATH}"
+    echo -e "AndroidCachePath=${ARG_CODE_WORK_PATH}\n"
 
-    if [ -d ${ARG_CODE_WORK_PATH} ] || [ -f ${ARG_CODE_WORK_PATH} ];then
-        echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码"
+    if [ $Opt -eq 1 ];then
+        echo -e "删除重新下载Code"
         rm -rf ${ARG_CODE_WORK_PATH}
-        sleep 5s
     fi
 
-    if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
-        echo "download the specified version!"
-        svn co -r ${ARG_CODE_REVISION} --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH}
-    else 
-        echo "download the latest version!"
-        svn co --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH}
+    # 如果路径名是个文件,删除;
+    if [ -f ${ARG_CODE_WORK_PATH} ];then
+        echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码\n"
+        rm -rf ${ARG_CODE_WORK_PATH}
+        sleep 1s
     fi
 
+    # 如果路径存在,只更新;
+    if [ -d ${ARG_CODE_WORK_PATH} ];then
+        # clean清空;
+        svn_clean ${ARG_CODE_WORK_PATH}
+        cd ${ARG_CODE_WORK_PATH}
+        echo -e "svn cleanup msg="${msg}"\n"
+        if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
+            echo -e "update the specified version!\n"
+            msg=$(svn up -r ${ARG_CODE_REVISION} --force 2>&1)
+        else 
+            echo -e "update the latest version!\n"
+            msg=$(svn up --force 2>&1)
+        fi
+    else #### 如果路径不存在,checkout;
+        if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
+            echo -e "download the specified version!\n"
+            msg=$(svn co -r ${ARG_CODE_REVISION} --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
+        else 
+            echo -e "download the latest version!\n"
+            msg=$(svn co --force ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
+        fi
+    fi
+
+    echo -e "svn msg=${msg}\n"
+
+    # 修改update_modules.sh权限;
     if [ ! -d ${ARG_CODE_WORK_PATH} ];then
         echo -e "下载代码[${ARG_CODE_URL}]失败"
     else
         cd ${ARG_CODE_WORK_PATH}
-        # 判断文件是否存在;
-        if [ -f "update_modules.sh" ];then
-            echo "current dir:"${pwd}
-            echo -e "\n\tupdate_modules.sh 文件存在,更新复用库\n\n"
-            chmod 777 update_modules.sh
-            ./update_modules.sh
-        fi
+        update_modules
     fi
 
-    echo "shell_log===>Download end------------"
+    echo -e "\nshell_log===>Download end------------"
 }
 
 git_download()
 {
+    local Opt=$1
+    echo ${CURR_TIME}
     echo "shell_log===>Download start---------"
     echo "AndroidSvnPath=${ARG_CODE_URL}"
     echo "AndroidSvnRevision=${ARG_CODE_REVISION}"
     echo "AndroidCachePath=${ARG_CODE_WORK_PATH}"
 
-    if [ -d ${ARG_CODE_WORK_PATH} ] || [ -f ${ARG_CODE_WORK_PATH} ];then
-        echo -e "删除已有路径[${ARG_CODE_WORK_PATH}]代码"
+    if [ ${Opt} -eq 1 ]; then
+        echo -e "删除重新下载Code"
         rm -rf ${ARG_CODE_WORK_PATH}
-        sleep 5s
-    fi
 
-    # 下载代码;
-    msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
-    echo "-------------->"$msg
-    if [[ $msg != *"Total "* ]]; then
-        echo -e "1.下载代码[${ARG_CODE_URL}]失败"
-    fi
+        # 重新下载代码;
+        msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
+        echo "git clone msg: $msg\n"
+        if [[ $msg != *"Total "* ]]; then
+            echo -e "1.下载代码[${ARG_CODE_URL}]失败"
+            exit
+        fi
+    else
+        # 更新代码;
+        if [ -d ${ARG_CODE_WORK_PATH} ];then
+            cd ${ARG_CODE_WORK_PATH}
+            msg=$(git pull origin master 2>&1)
+            echo -e "git pull msg=${msg}\n"
+            if [[ $msg != *"Already up to date."* ]]; then
+                echo -e "1.更新代码[${ARG_CODE_URL}]失败"
+                exit
+            fi
+        else
+            # 重新下载代码;
+            msg=$(git clone ${ARG_CODE_URL} ${ARG_CODE_WORK_PATH} 2>&1)
+            echo "git clone msg: $msg\n"
+            if [[ $msg != *"Total "* ]]; then
+                echo -e "2.下载代码[${ARG_CODE_URL}]失败"
+                exit
+            fi
+        fi        
+    fi  
 
     if [ ${ARG_CODE_REVISION} != "" -a ${ARG_CODE_REVISION} != "0" ];then
         echo "download the specified version!"
         # 切换到指定commit id;
-        git checkout -b master ${ARG_CODE_REVISION}
+        msg=$(git checkout -b master ${ARG_CODE_REVISION} 2>&1)
+        echo "git checkout msg: $msg\n"
     else 
         echo "download the latest version!"
     fi
@@ -75,26 +178,214 @@ git_download()
         echo -e "2.下载代码[${ARG_CODE_URL}]失败"
     else
         cd ${ARG_CODE_WORK_PATH}
-        # 判断文件是否存在;
-        if [ -f "update_modules.sh" ];then
-            echo "current dir:"${pwd}
-            echo -e "\n\tupdate_modules.sh 文件存在,更新复用库\n\n"
-            chmod 777 update_modules.sh
-            ./update_modules.sh
-        fi
+        update_modules
     fi
 
     echo "shell_log===>Download end------------"
 }
 
+update_svn_modules()
+{
+    local name=$1           # 模块名称;
+    local url=$2            # 模块地址;
+    local revision=$3       # 模块版本;
+    echo -e "on func:update_svn_modules:${name},${url},${revision}\n"
+
+    # 判断模块名文件夹是否存在;
+    if [ -d ${name} ];then
+        echo -e "${name}->存在\n"
+        if [ ${revision} != "" -a ${revision} != "0" ];then
+            echo -e "update the specified version!\n"
+            msg=$(svn up -r ${revision} --force 2>&1)
+        else 
+            echo -e "update the latest version!\n"
+            msg=$(svn up --force 2>&1)
+        fi
+        echo -e "svn up msg=${msg}\n"
+    else
+        echo -e "${name}->不存在\n"
+        if [ ${revision} != "" -a ${revision} != "0" ];then
+            echo -e "download the specified version!\n"
+            msg=$(svn co -r ${revision} --force ${url} ${name} 2>&1)
+        else 
+            echo -e "download the latest version!\n"
+            msg=$(svn co --force ${url} ${name} 2>&1)
+        fi
+        echo -e "svn up msg=${msg}\n"
+    fi
+}
+
+update_git_modules()
+{
+    local name=$1           # 模块名称;
+    local url=$2            # 模块地址;
+    local revision=$3       # 模块版本;
+    local subdir=$4         # 仓库子路径;
+    echo -e "on func:update_git_modules:${name},${url},${revision},${subdir}\n"
+
+    if [ x${subdir} == x"" ];then
+        echo -e "git clone all repo\n"
+        # 判断模块名文件夹是否存在;
+        if [ -d ${name} ];then
+            echo -e "${name}->存在\n"
+            # 先更新;
+            msg=$(git pull origin master 2>&1)
+            echo "git pull msg: $msg\n"
+
+            if [ ${revision} != "" -a ${revision} != "0" ];then
+                msg=$(git checkout -b master ${revision} 2>&1)
+                echo "git checkout msg: $msg\n"
+            else 
+                echo -e "update the latest version!\n"
+            fi
+        else
+            echo -e "${name}->不存在\n"
+            # 先clone;
+            msg=$(git clone ${url} ${name} 2>&1)
+            echo "git clone msg: $msg\n"
+
+            if [ ${revision} != "" -a ${revision} != "0" ];then
+                msg=$(git checkout -b master ${revision} 2>&1)
+                echo "git checkout msg: $msg\n"
+            else 
+                echo -e "download the latest version!\n"
+            fi
+        fi
+    else
+        echo -e "git clone sub dir\n"
+        if [ ! -d ${name} ];then
+            mkdir ${name}
+        fi
+        cd ${name}
+        # 初始化空仓库;
+        git init
+        # 拉取远程仓库;
+        git remote add -f origin ${url}
+        # 开启sparse clone;
+        git config core.sparsecheckout true
+        # 设置要pull的目录;
+        echo ${subdir} >> .git/info/sparse-checkout
+        more .git/info/sparse-checkout
+        # 更新;
+        git pull origin master
+    fi
+}
+
+update_modules()
+{
+    echo -e "### on func:update_modules ###\n"
+    # 进入源码路径;
+    cd ${ARG_CODE_WORK_PATH}
+    # 判断modules_svn.cfg是否存在;
+    if [ -f "modules_svn.cfg" ];then
+        local git_user=$(git config --global --list |grep user.name|cut -d'=' -f2)
+        local git_email=$(git config --global --list |grep user.email|cut -d'=' -f2)
+        echo "user.name=${git_user}, user.email=${git_email}"
+
+        local module_name= module_url= module_ver= module_subdir=
+        # 读取git config --global --list内容; 从中获取到用户名、邮箱;
+        # git clone ssh://邮箱名@10.126.16.60:29418/TIF_ATSCInput.git
+        ###################################################################################################################
+        # SVN的cfg文件如下;
+        # modules_svn.cfg: [MODULE],UDP,https://odm-design-center-hz.tclking.com/svn/scbc_apps/trunk/app/src/UDP/udp,6265
+        ###################################################################################################################
+        # GIT的cfg文件如下:比SVN多出的一项是该仓库下的子目录;
+        # modules_svn.cfg: [MODULE],UDP,ssh://apk@10.126.16.60:29418/UDP,6265,udp
+        # modules_svn.cfg: [MODULE],firebaseanalytisc,ssh://apk@10.126.16.60:29418/firebaseanalytisc,6255,firebaseanalytisc
+        
+        # 按行读取;
+        while read line
+        do
+            val=`echo $line|sed 's/[\r\n]*$//g'`
+            echo "行内容:$val"
+            if [ `StrIsSubstring "[MODULE]" $val` -ne 0 ]; then
+                echo "Warning: No Module Format in - " + $val
+                continue
+            fi
+
+            # 获取模块名称;
+            val=${val#*,}
+            module_name=${val%%,*}
+
+            # 获取模块地址;
+            val=${val#*,}
+            module_url=${val%%,*}
+
+            # 判断模块存储仓库类型;
+            if [[ $module_url = *"https://odm-design-center-hz.tclking.com"* ]];then
+                echo "源码为svn"
+                # 获取版本;
+                if [ `StrIsSubstring "," $val` -eq 0 ]; then
+                    module_ver=${val#*,}
+                else
+                    module_ver=""
+                fi
+
+                echo -e "module_name=${module_name}\nmodule_url=${module_url}\nmodule_ver=${module_ver}"
+                update_svn_modules ${module_name} ${module_url} ${module_ver}
+            elif [[ $module_url = *"10.126.16.60"* ]];then
+                echo "源码为git"
+                # 获取版本;
+                val=${val#*,}
+                module_ver=${val%%,*}
+                # 获取子路径;
+                if [ `StrIsSubstring "," $val` -eq 0 ]; then
+                    module_subdir=${val#*,}
+                else
+                    module_subdir=""
+                fi
+
+                echo -e "module_name=${module_name}\nmodule_url=${module_url}\nmodule_ver=${module_ver}\n${module_subdir}"
+                update_git_modules ${module_name} ${module_url} ${module_ver} ${module_subdir}
+            fi
+        done < "modules_svn.cfg"
+    else
+        echo -e "modules_svn.cfg 模块文件不存在\n"
+    fi
+}
+
 main()
 {
     ARG_CODE_URL=$1
     ARG_CODE_REVISION=$2
     ARG_CODE_WORK_PATH=$3
 
-    svn_download 2>&1 | tee ${LOG_FILE}
-    #git_download 2>&1 | tee ${LOG_FILE}
+    ############################## 获取APK名称 #############################################
+    APK_NAME=$ARG_CODE_URL
+    # 取右边第一个字符,判断是否为斜杠;
+    if [ "${APK_NAME:0-1:1}" = "/" ];then
+        # 若为斜杠,%号截取,删除右边第一个'/'及右边字符,保存左边字符;
+        echo "最后为斜杠,删除斜杠"
+        APK_NAME=${APK_NAME%/*}
+    fi
+
+    # 获取APK名称;
+    APK_NAME=${APK_NAME##*/}
+    # 重新定义log文件;
+    if [ ! -d /home/data/ApkAutoCompile/shell/log/download/ ];then
+        msg=$(mkdir /home/data/ApkAutoCompile/shell/log/download/last)
+    fi
+    LOG_FILE="/home/data/ApkAutoCompile/shell/log/download/${APK_NAME}.log"
+    ############################## 获取APK名称 #############################################
+
+    if [ ! -d /home/data/ApkAutoCompile/cacheAndroidSrc ];then
+        # 递归创建目录;
+        mkdir -p /home/data/ApkAutoCompile/cacheAndroidSrc
+    fi
+
+    SwitchIntranet
+    if [[ $ARG_CODE_URL = *"https://odm-design-center-hz.tclking.com"* ]];then
+        echo "源码为svn"
+        ARG_CODE_REPOS='SVN'
+        svn_download 1 2>&1 | tee ${LOG_FILE}
+        # 导出svn提交账号;
+        cd ${ARG_CODE_WORK_PATH}
+        svn log --xml | grep "^<author" | sort -u | \awk -F '<author>' '{print $2}' | awk -F '</author>' '{print $1}' > userinfo.txt
+    elif [[ $ARG_CODE_URL = *"10.126.16.60"* ]];then
+        echo "源码为git"
+        ARG_CODE_REPOS='GIT'
+        git_download 1 2>&1 | tee ${LOG_FILE}
+    fi
 }   
 
-main $@
+main $@