| #!/bin/bash |
| |
| DEBUG_PRINT=0 |
| |
| |
| declare GIT_OPERATE_INFO="" |
| |
| function dbg() { |
| if [ 0 != ${DEBUG_PRINT} ]; then |
| echo "$1" |
| fi |
| } |
| |
| declare str_use="" |
| # filter means get useful information |
| function string_filter() { |
| # #1 origin str, #2 filter str, #3 split char, #4 which section |
| local str_origin=$1 |
| local str_filter=$2 |
| local str_split=$3 |
| str_origin=${str_origin#*${str_filter}} # filter |
| IFS=${str_split} read -ra DATA <<< "$str_origin" |
| str_use=${DATA[$4]} |
| } |
| |
| function get_versions() { |
| echo "Get version info" |
| declare -a SRC_REV |
| declare -a BIN_REV |
| # read manifest, get each blx information |
| if [ -f $MANIFEST ]; then |
| while read -r line || [[ -n $line ]]; do |
| string_filter "${line}" "dest-branch=" '"' 1 |
| GIT_INFO[0]=${str_use} |
| string_filter "${line}" "path=" '"' 1 |
| GIT_INFO[1]=${str_use} |
| string_filter "${line}" "revision=" '"' 1 |
| GIT_INFO[2]=${str_use} |
| string_filter "${line}" "name=" '"' 1 |
| GIT_INFO[3]=${str_use} |
| string_filter "${line}" "remote=" '"' 1 |
| GIT_INFO[4]=${str_use} |
| # if this line doesn't contain any info, skip it |
| if [ "${GIT_INFO[2]}" == "" ]; then |
| continue |
| fi |
| #echo "${GIT_INFO[0]} ${GIT_INFO[1]} ${GIT_INFO[2]} ${GIT_INFO[3]} ${GIT_INFO[4]}" |
| #echo ${BLX_NAME[@]} |
| #echo ${BLX_SRC_FOLDER[@]} |
| for loop in ${!BLX_NAME[@]}; do |
| if [ "${GIT_INFO[1]}" == "${BLX_SRC_FOLDER[$loop]}" ]; then |
| SRC_REV[$loop]=${GIT_INFO[2]} |
| #CUR_BIN_BRANCH[$loop]=${GIT_INFO[0]} |
| echo -n "name:${BLX_NAME[$loop]}, path:${BLX_SRC_FOLDER[$loop]}, " |
| if [ "${SRC_REV[$loop]}" == "${GIT_INFO[0]}" ]; then |
| # if only specify branch name, not version, use latest binaries under bin/ folders |
| # use bin.git revision, in case src code have local commits |
| if [ -d ${BLX_BIN_FOLDER[loop]} ]; then |
| git_operate ${BLX_BIN_FOLDER[loop]} log --pretty=oneline -1 |
| git_msg=${GIT_OPERATE_INFO} |
| else |
| git_msg="" |
| fi |
| IFS=' ' read -ra DATA <<< "$git_msg" |
| SRC_REV[$loop]=${DATA[2]} |
| echo -n "revL:${SRC_REV[$loop]} " |
| else |
| SRC_REV[$loop]=${GIT_INFO[2]} |
| echo -n "rev:${SRC_REV[$loop]} " |
| fi |
| echo "@ ${GIT_INFO[0]}" |
| fi |
| if [ "${GIT_INFO[1]}" == "${BLX_BIN_FOLDER[$loop]}" ]; then |
| BIN_REV[$loop]=${GIT_INFO[2]} |
| #CUR_BIN_BRANCH[$loop]=${GIT_INFO[0]} |
| echo -n "name:${BLX_NAME[$loop]}, path:${BLX_BIN_FOLDER[$loop]}, " |
| if [ "${BIN_REV[$loop]}" == "${GIT_INFO[0]}" ]; then |
| # if only specify branch name, not version, use latest binaries under bin/ folders |
| git_operate ${BLX_BIN_FOLDER[loop]} log --pretty=oneline -1 |
| else |
| # else get bin->src version |
| git_operate ${BLX_BIN_FOLDER[loop]} log ${BIN_REV[$loop]} --pretty=oneline -1 |
| fi |
| git_msg=${GIT_OPERATE_INFO} |
| IFS=' ' read -ra DATA <<< "$git_msg" |
| BIN_REV[$loop]=${DATA[2]} |
| echo -n "revL:${BIN_REV[$loop]} " |
| echo "@ ${GIT_INFO[0]}" |
| fi |
| done |
| done < "$MANIFEST" |
| # SRC_REV="" means this is a no-src repo, use bin.git |
| if [ "" == "${SRC_REV[0]}" ]; then |
| dbg "src_rev NULL" |
| for loop in ${!BIN_REV[@]}; do |
| echo "Manifest: Use bin.git version. ${BLX_BIN_FOLDER[$loop]} - ${BIN_REV[$loop]}" |
| CUR_REV[$loop]=${BIN_REV[$loop]} |
| done |
| else |
| dbg "src_rev not NULL" |
| for loop in ${!SRC_REV[@]}; do |
| dbg "Manifest: src.git version. ${BLX_SRC_FOLDER[$loop]} - ${SRC_REV[$loop]}" |
| CUR_REV[$loop]=${SRC_REV[$loop]} |
| done |
| fi |
| |
| # BIN_REV="" means this is a no-bin repo, use src.git |
| if [ "" == "${BIN_REV[0]}" ]; then |
| for loop in ${!SRC_REV[@]}; do |
| echo "Manifest: Src code only. build with --update-${BLX_NAME[$loop]}" |
| #CUR_REV[$loop]=${SRC_REV[$loop]} |
| update_bin_path $loop "source" |
| done |
| fi |
| else |
| for loop in ${!BLX_NAME[@]}; do |
| # merge into android/buildroot, can not get manifest.xml, get version by folder |
| # loop src folder |
| if [ -d ${BLX_SRC_FOLDER[$loop]} ]; then |
| echo "No-Manifest: Src code only. build with --update-${BLX_NAME[$loop]}" |
| update_bin_path $loop "source" |
| fi |
| done |
| # loop bin folder. (this will overwrite src version if both exist) |
| for loop in ${!BLX_NAME[@]}; do |
| if [ -d ${BLX_BIN_FOLDER[$loop]} ]; then |
| git_operate ${BLX_BIN_FOLDER[loop]} log --pretty=oneline -1 |
| git_msg=${GIT_OPERATE_INFO} |
| IFS=' ' read -ra DATA <<< "$git_msg" |
| CUR_REV[$loop]=${DATA[2]} |
| echo -n "revL:${CUR_REV[$loop]} " |
| echo "@ ${BLX_BIN_FOLDER[$loop]}" |
| fi |
| done |
| fi |
| } |
| |
| function git_operate() { |
| # $1: path, $2: other parameters |
| GIT_OPERATE_INFO=`git --git-dir $1/.git --work-tree=$1 ${@:2}` |
| dbg "${GIT_OPERATE_INFO}" |
| } |
| |
| function git_operate2() { |
| # use -C. for pull use. don't know why [git_operate pull] doesn't work, server git update? |
| # $1: path, $2: other parameters |
| GIT_OPERATE_INFO="`git -C \"$1\" ${@:2}`" |
| #echo "${GIT_OPERATE_INFO}" |
| } |
| |
| function get_blx_bin() { |
| # $1: current blx index |
| index=$1 |
| git_operate ${BLX_BIN_FOLDER[index]} log --pretty=oneline |
| |
| git_msg=${GIT_OPERATE_INFO} |
| BLX_READY[${index}]="false" |
| mkdir -p ${FIP_BUILD_FOLDER} |
| |
| # get version log line by line, compare with target version |
| line_num=0 |
| while read line; |
| do |
| IFS=' ' read -ra DATA <<< "$line" |
| # v1-fix support short-id |
| dbg "${CUR_REV[$index]:0:7} - ${DATA[2]:0:7}" |
| if [ "${CUR_REV[$index]:0:7}" == "${DATA[2]:0:7}" ]; then |
| BLX_READY[${index}]="true" |
| dbg "blxbin:${DATA[0]} blxsrc: ${DATA[2]}" |
| dbg "blxbin:${DATA[0]} blxsrc-s:${DATA[2]:0:7}" |
| # reset to history version |
| #git --git-dir ${BLX_BIN_FOLDER[index]}/.git --work-tree=${BLX_BIN_FOLDER[index]} reset ${DATA[0]} --hard |
| git_operate2 ${BLX_BIN_FOLDER[index]} reset ${DATA[0]} --hard |
| # copy binary file |
| if [ "bl32" == "${BLX_NAME[$index]}" ]; then |
| # bl32 is optional |
| if [ "y" == "${CONFIG_NEED_BL32}" ]; then |
| cp ${BLX_BIN_FOLDER[index]}/${CUR_SOC}/${BLX_BIN_NAME[index]} ${FIP_BUILD_FOLDER} -f |
| if [ "y" == "${CONFIG_FIP_IMG_SUPPORT}" ]; then |
| cp ${BLX_BIN_FOLDER[index]}/${CUR_SOC}/${BLX_IMG_NAME[index]} ${FIP_BUILD_FOLDER} 2>/dev/null |
| fi |
| fi |
| else |
| cp ${BLX_BIN_FOLDER[index]}/${CUR_SOC}/${BLX_BIN_NAME[index]} ${FIP_BUILD_FOLDER} -f |
| if [ "y" == "${CONFIG_FIP_IMG_SUPPORT}" ]; then |
| cp ${BLX_BIN_FOLDER[index]}/${CUR_SOC}/${BLX_IMG_NAME[index]} ${FIP_BUILD_FOLDER} 2>/dev/null |
| fi |
| fi |
| # undo reset |
| if [ 0 -ne ${line_num} ]; then |
| # this is not latest version, can do reset. latest version doesn't have 'git reflog' |
| #git --git-dir ${BLX_BIN_FOLDER[index]}/.git --work-tree=${BLX_BIN_FOLDER[index]} reset 'HEAD@{1}' --hard |
| git_operate2 ${BLX_BIN_FOLDER[index]} reset 'HEAD@{1}' --hard |
| fi |
| break |
| fi |
| line_num=$((line_num+1)) |
| done <<< "${git_msg}" |
| if [ "true" == ${BLX_READY[${index}]} ]; then |
| echo "Get ${BLX_NAME[$index]} from ${BLX_BIN_FOLDER[$index]}... done" |
| else |
| echo -n "Get ${BLX_NAME[$index]} from ${BLX_BIN_FOLDER[$index]}... failed" |
| if [ "true" == ${BLX_NEEDFUL[$index]} ]; then |
| echo "... abort" |
| exit -1 |
| else |
| echo "" |
| fi |
| fi |
| return 0; |
| } |